github.com/keybase/client/go@v0.0.0-20240309051027-028f7c731f8b/libkb/link_cache_test.go (about) 1 // Copyright 2015 Keybase, Inc. All rights reserved. Use of 2 // this source code is governed by the included BSD license. 3 4 package libkb 5 6 import ( 7 "sync" 8 "testing" 9 "time" 10 ) 11 12 func randChainLink() ChainLink { 13 id, err := RandBytes(LinkIDLen) 14 if err != nil { 15 panic(err) 16 } 17 return ChainLink{ 18 id: LinkID(id), 19 } 20 } 21 22 func TestLinkCacheBasics(t *testing.T) { 23 c := NewLinkCache(10, time.Hour) 24 defer c.Shutdown() 25 26 link := randChainLink() 27 28 // Dangerous, but as long as it works for now, go with it... 29 var m MetaContext 30 31 c.Put(m, link.id, link) 32 33 if c.Len() != 1 { 34 t.Errorf("c.cache len: %d, expected 1", c.Len()) 35 } 36 37 _, ok := c.Get(link.id) 38 if !ok { 39 t.Errorf("Get failed after Put") 40 } 41 42 for i := 0; i < 50; i++ { 43 nlink := randChainLink() 44 c.Put(m, nlink.id, nlink) 45 } 46 47 if c.Len() != 51 { 48 t.Errorf("c.cache len: %d, expected 51", c.Len()) 49 } 50 51 c.Clean() 52 53 if c.Len() != 10 { 54 t.Errorf("c.cache len: %d, expected 10", c.Len()) 55 } 56 57 // the first inserted link should be gone 58 _, ok = c.Get(link.id) 59 if ok { 60 t.Errorf("expected first link to be gone") 61 } 62 } 63 64 func TestLinkCacheAtime(t *testing.T) { 65 c := NewLinkCache(10, time.Hour) 66 defer c.Shutdown() 67 68 // Dangerous, but as long as it works for now, go with it... 69 var m MetaContext 70 71 link := randChainLink() 72 c.Put(m, link.id, link) 73 74 if c.Len() != 1 { 75 t.Errorf("c.cache len: %d, expected 1", c.Len()) 76 } 77 78 _, ok := c.Get(link.id) 79 if !ok { 80 t.Errorf("Get failed after Put") 81 } 82 83 for i := 0; i < 50; i++ { 84 nlink := randChainLink() 85 c.Put(m, nlink.id, nlink) 86 } 87 88 // get the first inserted one to make it LRU 89 _, ok = c.Get(link.id) 90 if !ok { 91 t.Errorf("Get failed after Put of 50") 92 } 93 94 if c.Len() != 51 { 95 t.Errorf("c.cache len: %d, expected 51", c.Len()) 96 } 97 98 c.Clean() 99 100 if c.Len() != 10 { 101 t.Errorf("c.cache len: %d, expected 10", c.Len()) 102 } 103 104 // the first inserted link should still be there 105 _, ok = c.Get(link.id) 106 if !ok { 107 t.Errorf("expected first link to be cached") 108 } 109 } 110 111 // mainly useful when run with -race flag 112 func TestLinkCacheConcurrent(t *testing.T) { 113 c := NewLinkCache(10, time.Hour) 114 defer c.Shutdown() 115 116 // Dangerous, but as long as it works for now, go with it... 117 var m MetaContext 118 119 var wg sync.WaitGroup 120 for i := 0; i < 10; i++ { 121 wg.Add(1) 122 go func() { 123 for x := 0; x < 100; x++ { 124 link := randChainLink() 125 c.Put(m, link.id, link) 126 _, ok := c.Get(link.id) 127 if !ok { 128 t.Errorf("concurrent Get failed") 129 } 130 } 131 wg.Done() 132 }() 133 } 134 wg.Wait() 135 } 136 137 func TestLinkCacheShutdown(t *testing.T) { 138 c := NewLinkCache(10, time.Hour) 139 c.Shutdown() 140 c.Shutdown() 141 }