github.com/xhghs/rclone@v1.51.1-0.20200430155106-e186a28cced8/lib/cache/cache_test.go (about) 1 package cache 2 3 import ( 4 "errors" 5 "fmt" 6 "testing" 7 "time" 8 9 "github.com/stretchr/testify/assert" 10 "github.com/stretchr/testify/require" 11 ) 12 13 var ( 14 called = 0 15 errSentinel = errors.New("an error") 16 errCached = errors.New("a cached error") 17 ) 18 19 func setup(t *testing.T) (*Cache, CreateFunc) { 20 called = 0 21 create := func(path string) (interface{}, bool, error) { 22 assert.Equal(t, 0, called) 23 called++ 24 switch path { 25 case "/": 26 return "/", true, nil 27 case "/file.txt": 28 return "/file.txt", true, errCached 29 case "/error": 30 return nil, false, errSentinel 31 } 32 panic(fmt.Sprintf("Unknown path %q", path)) 33 } 34 c := New() 35 return c, create 36 } 37 38 func TestGet(t *testing.T) { 39 c, create := setup(t) 40 41 assert.Equal(t, 0, len(c.cache)) 42 43 f, err := c.Get("/", create) 44 require.NoError(t, err) 45 46 assert.Equal(t, 1, len(c.cache)) 47 48 f2, err := c.Get("/", create) 49 require.NoError(t, err) 50 51 assert.Equal(t, f, f2) 52 } 53 54 func TestGetFile(t *testing.T) { 55 c, create := setup(t) 56 57 assert.Equal(t, 0, len(c.cache)) 58 59 f, err := c.Get("/file.txt", create) 60 require.Equal(t, errCached, err) 61 62 assert.Equal(t, 1, len(c.cache)) 63 64 f2, err := c.Get("/file.txt", create) 65 require.Equal(t, errCached, err) 66 67 assert.Equal(t, f, f2) 68 } 69 70 func TestGetError(t *testing.T) { 71 c, create := setup(t) 72 73 assert.Equal(t, 0, len(c.cache)) 74 75 f, err := c.Get("/error", create) 76 require.Equal(t, errSentinel, err) 77 require.Equal(t, nil, f) 78 79 assert.Equal(t, 0, len(c.cache)) 80 } 81 82 func TestPut(t *testing.T) { 83 c, create := setup(t) 84 85 assert.Equal(t, 0, len(c.cache)) 86 87 c.Put("/alien", "slime") 88 89 assert.Equal(t, 1, len(c.cache)) 90 91 fNew, err := c.Get("/alien", create) 92 require.NoError(t, err) 93 require.Equal(t, "slime", fNew) 94 95 assert.Equal(t, 1, len(c.cache)) 96 } 97 98 func TestCacheExpire(t *testing.T) { 99 c, create := setup(t) 100 101 c.expireInterval = time.Millisecond 102 assert.Equal(t, false, c.expireRunning) 103 104 _, err := c.Get("/", create) 105 require.NoError(t, err) 106 107 c.mu.Lock() 108 entry := c.cache["/"] 109 110 assert.Equal(t, 1, len(c.cache)) 111 c.mu.Unlock() 112 c.cacheExpire() 113 c.mu.Lock() 114 assert.Equal(t, 1, len(c.cache)) 115 entry.lastUsed = time.Now().Add(-c.expireDuration - 60*time.Second) 116 assert.Equal(t, true, c.expireRunning) 117 c.mu.Unlock() 118 time.Sleep(250 * time.Millisecond) 119 c.mu.Lock() 120 assert.Equal(t, false, c.expireRunning) 121 assert.Equal(t, 0, len(c.cache)) 122 c.mu.Unlock() 123 } 124 125 func TestClear(t *testing.T) { 126 c, create := setup(t) 127 128 assert.Equal(t, 0, len(c.cache)) 129 130 _, err := c.Get("/", create) 131 require.NoError(t, err) 132 133 assert.Equal(t, 1, len(c.cache)) 134 135 c.Clear() 136 137 assert.Equal(t, 0, len(c.cache)) 138 } 139 140 func TestEntries(t *testing.T) { 141 c, create := setup(t) 142 143 assert.Equal(t, 0, c.Entries()) 144 145 _, err := c.Get("/", create) 146 require.NoError(t, err) 147 148 assert.Equal(t, 1, c.Entries()) 149 150 c.Clear() 151 152 assert.Equal(t, 0, c.Entries()) 153 } 154 155 func TestGetMaybe(t *testing.T) { 156 c, create := setup(t) 157 158 value, found := c.GetMaybe("/") 159 assert.Equal(t, false, found) 160 assert.Nil(t, value) 161 162 f, err := c.Get("/", create) 163 require.NoError(t, err) 164 165 value, found = c.GetMaybe("/") 166 assert.Equal(t, true, found) 167 assert.Equal(t, f, value) 168 169 c.Clear() 170 171 value, found = c.GetMaybe("/") 172 assert.Equal(t, false, found) 173 assert.Nil(t, value) 174 }