databricks-cli/cmd/labs/localcache/jsonfile_test.go

133 lines
3.0 KiB
Go
Raw Permalink Normal View History

package localcache
import (
"context"
"errors"
"fmt"
"net/url"
"runtime"
"testing"
"time"
"github.com/stretchr/testify/assert"
)
func TestCreatesDirectoryIfNeeded(t *testing.T) {
ctx := context.Background()
c := NewLocalCache[int64](t.TempDir(), "some/nested/file", 1*time.Minute)
thing := []int64{0}
tick := func() (int64, error) {
thing[0] += 1
return thing[0], nil
}
first, err := c.Load(ctx, tick)
assert.NoError(t, err)
assert.Equal(t, first, int64(1))
}
func TestImpossibleToCreateDir(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("No /dev/null on windows")
}
ctx := context.Background()
c := NewLocalCache[int64]("/dev/null", "some/nested/file", 1*time.Minute)
thing := []int64{0}
tick := func() (int64, error) {
thing[0] += 1
return thing[0], nil
}
_, err := c.Load(ctx, tick)
assert.Error(t, err)
}
func TestRefreshes(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("No /dev/null on windows")
}
ctx := context.Background()
c := NewLocalCache[int64](t.TempDir(), "time", 1*time.Minute)
thing := []int64{0}
tick := func() (int64, error) {
thing[0] += 1
return thing[0], nil
}
first, err := c.Load(ctx, tick)
assert.NoError(t, err)
second, err := c.Load(ctx, tick)
assert.NoError(t, err)
assert.Equal(t, first, second)
c.validity = 0
third, err := c.Load(ctx, tick)
assert.NoError(t, err)
assert.NotEqual(t, first, third)
}
func TestSupportOfflineSystem(t *testing.T) {
c := NewLocalCache[int64](t.TempDir(), "time", 1*time.Minute)
thing := []int64{0}
tick := func() (int64, error) {
thing[0] += 1
return thing[0], nil
}
ctx := context.Background()
first, err := c.Load(ctx, tick)
assert.NoError(t, err)
tick = func() (int64, error) {
return 0, &url.Error{
Op: "X",
URL: "Y",
Err: errors.New("nope"),
}
}
c.validity = 0
// offline during refresh
third, err := c.Load(ctx, tick)
assert.NoError(t, err)
assert.Equal(t, first, third)
// fully offline
c = NewLocalCache[int64](t.TempDir(), "time", 1*time.Minute)
zero, err := c.Load(ctx, tick)
assert.NoError(t, err)
assert.Equal(t, int64(0), zero)
}
func TestFolderDisappears(t *testing.T) {
if runtime.GOOS == "windows" {
t.Skip("No /dev/null on windows")
}
c := NewLocalCache[int64]("/dev/null", "time", 1*time.Minute)
tick := func() (int64, error) {
now := time.Now().UnixNano()
t.Log("TICKS")
return now, nil
}
ctx := context.Background()
_, err := c.Load(ctx, tick)
assert.Error(t, err)
}
func TestRefreshFails(t *testing.T) {
c := NewLocalCache[int64](t.TempDir(), "time", 1*time.Minute)
tick := func() (int64, error) {
return 0, fmt.Errorf("nope")
}
ctx := context.Background()
_, err := c.Load(ctx, tick)
assert.EqualError(t, err, "refresh: nope")
}
func TestWrongType(t *testing.T) {
c := NewLocalCache[chan int](t.TempDir(), "x", 1*time.Minute)
ctx := context.Background()
_, err := c.Load(ctx, func() (chan int, error) {
return make(chan int), nil
})
assert.EqualError(t, err, "json marshal: json: unsupported type: chan int")
}