github.com/insionng/yougam@v0.0.0-20170714101924-2bc18d833463/libraries/karlseguin/ccache/cache_test.go (about) 1 package ccache 2 3 import ( 4 "strconv" 5 "testing" 6 "time" 7 8 . "github.com/karlseguin/expect" 9 ) 10 11 type CacheTests struct{} 12 13 func Test_Cache(t *testing.T) { 14 Expectify(new(CacheTests), t) 15 } 16 17 func (_ CacheTests) DeletesAValue() { 18 cache := New(Configure()) 19 cache.Set("spice", "flow", time.Minute) 20 cache.Set("worm", "sand", time.Minute) 21 cache.Delete("spice") 22 Expect(cache.Get("spice")).To.Equal(nil) 23 Expect(cache.Get("worm").Value()).To.Equal("sand") 24 } 25 26 func (_ CacheTests) FetchesExpiredItems() { 27 cache := New(Configure()) 28 fn := func() (interface{}, error) { return "moo-moo", nil } 29 30 cache.Set("beef", "moo", time.Second*-1) 31 Expect(cache.Get("beef").Value()).To.Equal("moo") 32 33 out, _ := cache.Fetch("beef", time.Second, fn) 34 Expect(out.Value()).To.Equal("moo-moo") 35 } 36 37 func (_ CacheTests) GCsTheOldestItems() { 38 cache := New(Configure().ItemsToPrune(10)) 39 for i := 0; i < 500; i++ { 40 cache.Set(strconv.Itoa(i), i, time.Minute) 41 } 42 //let the items get promoted (and added to our list) 43 time.Sleep(time.Millisecond * 10) 44 cache.gc() 45 Expect(cache.Get("9")).To.Equal(nil) 46 Expect(cache.Get("10").Value()).To.Equal(10) 47 } 48 49 func (_ CacheTests) PromotedItemsDontGetPruned() { 50 cache := New(Configure().ItemsToPrune(10).GetsPerPromote(1)) 51 for i := 0; i < 500; i++ { 52 cache.Set(strconv.Itoa(i), i, time.Minute) 53 } 54 time.Sleep(time.Millisecond * 10) //run the worker once to init the list 55 cache.Get("9") 56 time.Sleep(time.Millisecond * 10) 57 cache.gc() 58 Expect(cache.Get("9").Value()).To.Equal(9) 59 Expect(cache.Get("10")).To.Equal(nil) 60 Expect(cache.Get("11").Value()).To.Equal(11) 61 } 62 63 func (_ CacheTests) TrackerDoesNotCleanupHeldInstance() { 64 cache := New(Configure().ItemsToPrune(10).Track()) 65 for i := 0; i < 10; i++ { 66 cache.Set(strconv.Itoa(i), i, time.Minute) 67 } 68 item := cache.TrackingGet("0") 69 time.Sleep(time.Millisecond * 10) 70 cache.gc() 71 Expect(cache.Get("0").Value()).To.Equal(0) 72 Expect(cache.Get("1")).To.Equal(nil) 73 item.Release() 74 cache.gc() 75 Expect(cache.Get("0")).To.Equal(nil) 76 } 77 78 func (_ CacheTests) RemovesOldestItemWhenFull() { 79 cache := New(Configure().MaxSize(5).ItemsToPrune(1)) 80 for i := 0; i < 7; i++ { 81 cache.Set(strconv.Itoa(i), i, time.Minute) 82 } 83 time.Sleep(time.Millisecond * 10) 84 Expect(cache.Get("0")).To.Equal(nil) 85 Expect(cache.Get("1")).To.Equal(nil) 86 Expect(cache.Get("2").Value()).To.Equal(2) 87 } 88 89 func (_ CacheTests) RemovesOldestItemWhenFullBySizer() { 90 cache := New(Configure().MaxSize(9).ItemsToPrune(2)) 91 for i := 0; i < 7; i++ { 92 cache.Set(strconv.Itoa(i), &SizedItem{i, 2}, time.Minute) 93 } 94 time.Sleep(time.Millisecond * 10) 95 Expect(cache.Get("0")).To.Equal(nil) 96 Expect(cache.Get("1")).To.Equal(nil) 97 Expect(cache.Get("2")).To.Equal(nil) 98 Expect(cache.Get("3")).To.Equal(nil) 99 Expect(cache.Get("4").Value().(*SizedItem).id).To.Equal(4) 100 } 101 102 func (_ CacheTests) SetUpdatesSizeOnDelta() { 103 cache := New(Configure()) 104 cache.Set("a", &SizedItem{0, 2}, time.Minute) 105 cache.Set("b", &SizedItem{0, 3}, time.Minute) 106 time.Sleep(time.Millisecond * 5) 107 Expect(cache.size).To.Equal(int64(5)) 108 cache.Set("b", &SizedItem{0, 3}, time.Minute) 109 time.Sleep(time.Millisecond * 5) 110 Expect(cache.size).To.Equal(int64(5)) 111 cache.Set("b", &SizedItem{0, 4}, time.Minute) 112 time.Sleep(time.Millisecond * 5) 113 Expect(cache.size).To.Equal(int64(6)) 114 cache.Set("b", &SizedItem{0, 2}, time.Minute) 115 time.Sleep(time.Millisecond * 5) 116 Expect(cache.size).To.Equal(int64(4)) 117 cache.Delete("b") 118 time.Sleep(time.Millisecond * 100) 119 Expect(cache.size).To.Equal(int64(2)) 120 } 121 122 func (_ CacheTests) ReplaceDoesNotchangeSizeIfNotSet() { 123 cache := New(Configure()) 124 cache.Set("1", &SizedItem{1, 2}, time.Minute) 125 cache.Set("2", &SizedItem{1, 2}, time.Minute) 126 cache.Set("3", &SizedItem{1, 2}, time.Minute) 127 cache.Replace("4", &SizedItem{1, 2}) 128 time.Sleep(time.Millisecond * 5) 129 Expect(cache.size).To.Equal(int64(6)) 130 } 131 132 func (_ CacheTests) ReplaceChangesSize() { 133 cache := New(Configure()) 134 cache.Set("1", &SizedItem{1, 2}, time.Minute) 135 cache.Set("2", &SizedItem{1, 2}, time.Minute) 136 137 cache.Replace("2", &SizedItem{1, 2}) 138 time.Sleep(time.Millisecond * 5) 139 Expect(cache.size).To.Equal(int64(4)) 140 141 cache.Replace("2", &SizedItem{1, 1}) 142 time.Sleep(time.Millisecond * 5) 143 Expect(cache.size).To.Equal(int64(3)) 144 145 cache.Replace("2", &SizedItem{1, 3}) 146 time.Sleep(time.Millisecond * 5) 147 Expect(cache.size).To.Equal(int64(5)) 148 } 149 150 type SizedItem struct { 151 id int 152 s int64 153 } 154 155 func (s *SizedItem) Size() int64 { 156 return s.s 157 }