github.com/ncw/rclone@v1.48.1-0.20190724201158-a35aa1360e3e/fs/cache/cache_test.go (about) 1 package cache 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/ncw/rclone/fs" 10 "github.com/ncw/rclone/fstest/mockfs" 11 "github.com/stretchr/testify/assert" 12 "github.com/stretchr/testify/require" 13 ) 14 15 var ( 16 called = 0 17 errSentinel = errors.New("an error") 18 ) 19 20 func mockNewFs(t *testing.T) func() { 21 called = 0 22 oldFsNewFs := fsNewFs 23 fsNewFs = func(path string) (fs.Fs, error) { 24 assert.Equal(t, 0, called) 25 called++ 26 switch path { 27 case "/": 28 return mockfs.NewFs("mock", "mock"), nil 29 case "/file.txt": 30 return mockfs.NewFs("mock", "mock"), fs.ErrorIsFile 31 case "/error": 32 return nil, errSentinel 33 } 34 panic(fmt.Sprintf("Unknown path %q", path)) 35 } 36 return func() { 37 fsNewFs = oldFsNewFs 38 fsCacheMu.Lock() 39 fsCache = map[string]*cacheEntry{} 40 expireRunning = false 41 fsCacheMu.Unlock() 42 } 43 } 44 45 func TestGet(t *testing.T) { 46 defer mockNewFs(t)() 47 48 assert.Equal(t, 0, len(fsCache)) 49 50 f, err := Get("/") 51 require.NoError(t, err) 52 53 assert.Equal(t, 1, len(fsCache)) 54 55 f2, err := Get("/") 56 require.NoError(t, err) 57 58 assert.Equal(t, f, f2) 59 } 60 61 func TestGetFile(t *testing.T) { 62 defer mockNewFs(t)() 63 64 assert.Equal(t, 0, len(fsCache)) 65 66 f, err := Get("/file.txt") 67 require.Equal(t, fs.ErrorIsFile, err) 68 69 assert.Equal(t, 1, len(fsCache)) 70 71 f2, err := Get("/file.txt") 72 require.Equal(t, fs.ErrorIsFile, err) 73 74 assert.Equal(t, f, f2) 75 } 76 77 func TestGetError(t *testing.T) { 78 defer mockNewFs(t)() 79 80 assert.Equal(t, 0, len(fsCache)) 81 82 f, err := Get("/error") 83 require.Equal(t, errSentinel, err) 84 require.Equal(t, nil, f) 85 86 assert.Equal(t, 0, len(fsCache)) 87 } 88 89 func TestPut(t *testing.T) { 90 defer mockNewFs(t)() 91 92 f := mockfs.NewFs("mock", "mock") 93 94 assert.Equal(t, 0, len(fsCache)) 95 96 Put("/alien", f) 97 98 assert.Equal(t, 1, len(fsCache)) 99 100 fNew, err := Get("/alien") 101 require.NoError(t, err) 102 require.Equal(t, f, fNew) 103 104 assert.Equal(t, 1, len(fsCache)) 105 } 106 107 func TestCacheExpire(t *testing.T) { 108 defer mockNewFs(t)() 109 110 cacheExpireInterval = time.Millisecond 111 assert.Equal(t, false, expireRunning) 112 113 _, err := Get("/") 114 require.NoError(t, err) 115 116 fsCacheMu.Lock() 117 entry := fsCache["/"] 118 119 assert.Equal(t, 1, len(fsCache)) 120 fsCacheMu.Unlock() 121 cacheExpire() 122 fsCacheMu.Lock() 123 assert.Equal(t, 1, len(fsCache)) 124 entry.lastUsed = time.Now().Add(-cacheExpireDuration - 60*time.Second) 125 assert.Equal(t, true, expireRunning) 126 fsCacheMu.Unlock() 127 time.Sleep(10 * time.Millisecond) 128 fsCacheMu.Lock() 129 assert.Equal(t, false, expireRunning) 130 assert.Equal(t, 0, len(fsCache)) 131 fsCacheMu.Unlock() 132 } 133 134 func TestClear(t *testing.T) { 135 defer mockNewFs(t)() 136 137 assert.Equal(t, 0, len(fsCache)) 138 139 _, err := Get("/") 140 require.NoError(t, err) 141 142 assert.Equal(t, 1, len(fsCache)) 143 144 Clear() 145 146 assert.Equal(t, 0, len(fsCache)) 147 }