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  }