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  }