github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/karlseguin/ccache/layeredcache_test.go (about) 1 package ccache 2 3 import ( 4 . "github.com/karlseguin/expect" 5 "strconv" 6 "testing" 7 "time" 8 ) 9 10 type LayeredCacheTests struct{} 11 12 func Test_LayeredCache(t *testing.T) { 13 Expectify(new(LayeredCacheTests), t) 14 } 15 16 func (_ *LayeredCacheTests) GetsANonExistantValue() { 17 cache := newLayered() 18 Expect(cache.Get("spice", "flow")).To.Equal(nil) 19 } 20 21 func (_ *LayeredCacheTests) SetANewValue() { 22 cache := newLayered() 23 cache.Set("spice", "flow", "a value", time.Minute) 24 Expect(cache.Get("spice", "flow").Value()).To.Equal("a value") 25 Expect(cache.Get("spice", "stop")).To.Equal(nil) 26 } 27 28 func (_ *LayeredCacheTests) SetsMultipleValueWithinTheSameLayer() { 29 cache := newLayered() 30 cache.Set("spice", "flow", "value-a", time.Minute) 31 cache.Set("spice", "must", "value-b", time.Minute) 32 cache.Set("leto", "sister", "ghanima", time.Minute) 33 Expect(cache.Get("spice", "flow").Value()).To.Equal("value-a") 34 Expect(cache.Get("spice", "must").Value()).To.Equal("value-b") 35 Expect(cache.Get("spice", "worm")).To.Equal(nil) 36 37 Expect(cache.Get("leto", "sister").Value()).To.Equal("ghanima") 38 Expect(cache.Get("leto", "brother")).To.Equal(nil) 39 Expect(cache.Get("baron", "friend")).To.Equal(nil) 40 } 41 42 func (_ *LayeredCacheTests) ReplaceDoesNothingIfKeyDoesNotExist() { 43 cache := newLayered() 44 Expect(cache.Replace("spice", "flow", "value-a")).To.Equal(false) 45 Expect(cache.Get("spice", "flow")).To.Equal(nil) 46 } 47 48 func (_ *LayeredCacheTests) ReplaceUpdatesTheValue() { 49 cache := newLayered() 50 cache.Set("spice", "flow", "value-a", time.Minute) 51 Expect(cache.Replace("spice", "flow", "value-b")).To.Equal(true) 52 Expect(cache.Get("spice", "flow").Value().(string)).To.Equal("value-b") 53 //not sure how to test that the TTL hasn't changed sort of a sleep.. 54 } 55 56 func (_ *LayeredCacheTests) DeletesAValue() { 57 cache := newLayered() 58 cache.Set("spice", "flow", "value-a", time.Minute) 59 cache.Set("spice", "must", "value-b", time.Minute) 60 cache.Set("leto", "sister", "ghanima", time.Minute) 61 cache.Delete("spice", "flow") 62 Expect(cache.Get("spice", "flow")).To.Equal(nil) 63 Expect(cache.Get("spice", "must").Value()).To.Equal("value-b") 64 Expect(cache.Get("spice", "worm")).To.Equal(nil) 65 Expect(cache.Get("leto", "sister").Value()).To.Equal("ghanima") 66 } 67 68 func (_ *LayeredCacheTests) DeletesALayer() { 69 cache := newLayered() 70 cache.Set("spice", "flow", "value-a", time.Minute) 71 cache.Set("spice", "must", "value-b", time.Minute) 72 cache.Set("leto", "sister", "ghanima", time.Minute) 73 cache.DeleteAll("spice") 74 Expect(cache.Get("spice", "flow")).To.Equal(nil) 75 Expect(cache.Get("spice", "must")).To.Equal(nil) 76 Expect(cache.Get("spice", "worm")).To.Equal(nil) 77 Expect(cache.Get("leto", "sister").Value()).To.Equal("ghanima") 78 } 79 80 func (_ LayeredCacheTests) GCsTheOldestItems() { 81 cache := Layered(Configure().ItemsToPrune(10)) 82 cache.Set("xx", "a", 23, time.Minute) 83 for i := 0; i < 500; i++ { 84 cache.Set(strconv.Itoa(i), "a", i, time.Minute) 85 } 86 cache.Set("xx", "b", 9001, time.Minute) 87 //let the items get promoted (and added to our list) 88 time.Sleep(time.Millisecond * 10) 89 cache.gc() 90 Expect(cache.Get("xx", "a")).To.Equal(nil) 91 Expect(cache.Get("xx", "b").Value()).To.Equal(9001) 92 Expect(cache.Get("8", "a")).To.Equal(nil) 93 Expect(cache.Get("9", "a").Value()).To.Equal(9) 94 Expect(cache.Get("10", "a").Value()).To.Equal(10) 95 } 96 97 func (_ LayeredCacheTests) PromotedItemsDontGetPruned() { 98 cache := Layered(Configure().ItemsToPrune(10).GetsPerPromote(1)) 99 for i := 0; i < 500; i++ { 100 cache.Set(strconv.Itoa(i), "a", i, time.Minute) 101 } 102 time.Sleep(time.Millisecond * 10) //run the worker once to init the list 103 cache.Get("9", "a") 104 time.Sleep(time.Millisecond * 10) 105 cache.gc() 106 Expect(cache.Get("9", "a").Value()).To.Equal(9) 107 Expect(cache.Get("10", "a")).To.Equal(nil) 108 Expect(cache.Get("11", "a").Value()).To.Equal(11) 109 } 110 111 func (_ LayeredCacheTests) TrackerDoesNotCleanupHeldInstance() { 112 cache := Layered(Configure().ItemsToPrune(10).Track()) 113 for i := 0; i < 10; i++ { 114 cache.Set(strconv.Itoa(i), "a", i, time.Minute) 115 } 116 item := cache.TrackingGet("0", "a") 117 time.Sleep(time.Millisecond * 10) 118 cache.gc() 119 Expect(cache.Get("0", "a").Value()).To.Equal(0) 120 Expect(cache.Get("1", "a")).To.Equal(nil) 121 item.Release() 122 cache.gc() 123 Expect(cache.Get("0", "a")).To.Equal(nil) 124 } 125 126 func (_ LayeredCacheTests) RemovesOldestItemWhenFull() { 127 cache := Layered(Configure().MaxSize(5).ItemsToPrune(1)) 128 cache.Set("xx", "a", 23, time.Minute) 129 for i := 0; i < 7; i++ { 130 cache.Set(strconv.Itoa(i), "a", i, time.Minute) 131 } 132 cache.Set("xx", "b", 9001, time.Minute) 133 time.Sleep(time.Millisecond * 10) 134 Expect(cache.Get("xx", "a")).To.Equal(nil) 135 Expect(cache.Get("0", "a")).To.Equal(nil) 136 Expect(cache.Get("1", "a")).To.Equal(nil) 137 Expect(cache.Get("2", "a")).To.Equal(nil) 138 Expect(cache.Get("3", "a").Value()).To.Equal(3) 139 Expect(cache.Get("xx", "b").Value()).To.Equal(9001) 140 } 141 142 func newLayered() *LayeredCache { 143 return Layered(Configure()) 144 } 145 146 func (_ LayeredCacheTests) RemovesOldestItemWhenFullBySizer() { 147 cache := Layered(Configure().MaxSize(9).ItemsToPrune(2)) 148 for i := 0; i < 7; i++ { 149 cache.Set("pri", strconv.Itoa(i), &SizedItem{i, 2}, time.Minute) 150 } 151 time.Sleep(time.Millisecond * 10) 152 Expect(cache.Get("pri", "0")).To.Equal(nil) 153 Expect(cache.Get("pri", "1")).To.Equal(nil) 154 Expect(cache.Get("pri", "2")).To.Equal(nil) 155 Expect(cache.Get("pri", "3")).To.Equal(nil) 156 Expect(cache.Get("pri", "4").Value().(*SizedItem).id).To.Equal(4) 157 } 158 159 func (_ LayeredCacheTests) SetUpdatesSizeOnDelta() { 160 cache := Layered(Configure()) 161 cache.Set("pri", "a", &SizedItem{0, 2}, time.Minute) 162 cache.Set("pri", "b", &SizedItem{0, 3}, time.Minute) 163 time.Sleep(time.Millisecond * 5) 164 Expect(cache.size).To.Equal(int64(5)) 165 cache.Set("pri", "b", &SizedItem{0, 3}, time.Minute) 166 time.Sleep(time.Millisecond * 5) 167 Expect(cache.size).To.Equal(int64(5)) 168 cache.Set("pri", "b", &SizedItem{0, 4}, time.Minute) 169 time.Sleep(time.Millisecond * 5) 170 Expect(cache.size).To.Equal(int64(6)) 171 cache.Set("pri", "b", &SizedItem{0, 2}, time.Minute) 172 cache.Set("sec", "b", &SizedItem{0, 3}, time.Minute) 173 time.Sleep(time.Millisecond * 5) 174 Expect(cache.size).To.Equal(int64(7)) 175 cache.Delete("pri", "b") 176 time.Sleep(time.Millisecond * 10) 177 Expect(cache.size).To.Equal(int64(5)) 178 } 179 180 func (_ LayeredCacheTests) ReplaceDoesNotchangeSizeIfNotSet() { 181 cache := Layered(Configure()) 182 cache.Set("pri", "1", &SizedItem{1, 2}, time.Minute) 183 cache.Set("pri", "2", &SizedItem{1, 2}, time.Minute) 184 cache.Set("pri", "3", &SizedItem{1, 2}, time.Minute) 185 cache.Replace("sec", "3", &SizedItem{1, 2}) 186 time.Sleep(time.Millisecond * 5) 187 Expect(cache.size).To.Equal(int64(6)) 188 } 189 190 func (_ LayeredCacheTests) ReplaceChangesSize() { 191 cache := Layered(Configure()) 192 cache.Set("pri", "1", &SizedItem{1, 2}, time.Minute) 193 cache.Set("pri", "2", &SizedItem{1, 2}, time.Minute) 194 195 cache.Replace("pri", "2", &SizedItem{1, 2}) 196 time.Sleep(time.Millisecond * 5) 197 Expect(cache.size).To.Equal(int64(4)) 198 199 cache.Replace("pri", "2", &SizedItem{1, 1}) 200 time.Sleep(time.Millisecond * 5) 201 Expect(cache.size).To.Equal(int64(3)) 202 203 cache.Replace("pri", "2", &SizedItem{1, 3}) 204 time.Sleep(time.Millisecond * 5) 205 Expect(cache.size).To.Equal(int64(5)) 206 }