github.com/xhghs/rclone@v1.51.1-0.20200430155106-e186a28cced8/fs/cache/cache_test.go (about) 1 package cache 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 8 "github.com/rclone/rclone/fs" 9 "github.com/rclone/rclone/fstest/mockfs" 10 "github.com/stretchr/testify/assert" 11 "github.com/stretchr/testify/require" 12 ) 13 14 var ( 15 called = 0 16 errSentinel = errors.New("an error") 17 ) 18 19 func mockNewFs(t *testing.T) (func(), func(path string) (fs.Fs, error)) { 20 called = 0 21 create := func(path string) (fs.Fs, error) { 22 assert.Equal(t, 0, called) 23 called++ 24 switch path { 25 case "/": 26 return mockfs.NewFs("mock", "mock"), nil 27 case "/file.txt": 28 return mockfs.NewFs("mock", "mock"), fs.ErrorIsFile 29 case "/error": 30 return nil, errSentinel 31 } 32 panic(fmt.Sprintf("Unknown path %q", path)) 33 } 34 cleanup := func() { 35 c.Clear() 36 } 37 return cleanup, create 38 } 39 40 func TestGet(t *testing.T) { 41 cleanup, create := mockNewFs(t) 42 defer cleanup() 43 44 assert.Equal(t, 0, c.Entries()) 45 46 f, err := GetFn("/", create) 47 require.NoError(t, err) 48 49 assert.Equal(t, 1, c.Entries()) 50 51 f2, err := GetFn("/", create) 52 require.NoError(t, err) 53 54 assert.Equal(t, f, f2) 55 } 56 57 func TestGetFile(t *testing.T) { 58 cleanup, create := mockNewFs(t) 59 defer cleanup() 60 61 assert.Equal(t, 0, c.Entries()) 62 63 f, err := GetFn("/file.txt", create) 64 require.Equal(t, fs.ErrorIsFile, err) 65 require.NotNil(t, f) 66 67 assert.Equal(t, 1, c.Entries()) 68 69 f2, err := GetFn("/file.txt", create) 70 require.Equal(t, fs.ErrorIsFile, err) 71 require.NotNil(t, f2) 72 73 assert.Equal(t, f, f2) 74 } 75 76 func TestGetError(t *testing.T) { 77 cleanup, create := mockNewFs(t) 78 defer cleanup() 79 80 assert.Equal(t, 0, c.Entries()) 81 82 f, err := GetFn("/error", create) 83 require.Equal(t, errSentinel, err) 84 require.Equal(t, nil, f) 85 86 assert.Equal(t, 0, c.Entries()) 87 } 88 89 func TestPut(t *testing.T) { 90 cleanup, create := mockNewFs(t) 91 defer cleanup() 92 93 f := mockfs.NewFs("mock", "mock") 94 95 assert.Equal(t, 0, c.Entries()) 96 97 Put("/alien", f) 98 99 assert.Equal(t, 1, c.Entries()) 100 101 fNew, err := GetFn("/alien", create) 102 require.NoError(t, err) 103 require.Equal(t, f, fNew) 104 105 assert.Equal(t, 1, c.Entries()) 106 }