mirror of https://github.com/databricks/cli.git
133 lines
3.0 KiB
Go
133 lines
3.0 KiB
Go
|
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")
|
||
|
}
|