gopkg.in/dedis/onet.v2@v2.0.0-20181115163211-c8f3724038a7/cache_test.go (about) 1 package onet 2 3 import ( 4 "sync" 5 "testing" 6 "time" 7 8 "github.com/satori/go.uuid" 9 "github.com/stretchr/testify/require" 10 ) 11 12 const nbrOfItems = 20 13 const size = 20 14 15 func initTrees(tt []*Tree) { 16 for i := range tt { 17 tt[i] = &Tree{} 18 id, _ := uuid.NewV1() 19 tt[i].ID = TreeID(id) 20 } 21 } 22 23 func TestTreeCache(t *testing.T) { 24 cache := newTreeCache(100*time.Millisecond, size) 25 26 trees := make([]*Tree, nbrOfItems) 27 initTrees(trees) 28 29 var wg sync.WaitGroup 30 wg.Add(2) 31 32 f := func() { 33 for _, tree := range trees { 34 cache.Set(tree) 35 require.NotNil(t, cache.Get(tree.ID)) 36 time.Sleep(10 * time.Millisecond) 37 // test if it persists with the Get request 38 cache.Get(trees[0].ID) 39 } 40 wg.Done() 41 } 42 43 go f() 44 time.Sleep(100 * time.Millisecond) 45 go f() 46 47 wg.Wait() 48 49 token := &Token{} 50 for _, tree := range trees[nbrOfItems-8:] { 51 token.TreeID = tree.ID 52 require.Equal(t, tree, cache.GetFromToken(token)) 53 } 54 55 require.Equal(t, trees[0], cache.Get(trees[0].ID)) 56 require.Nil(t, cache.Get(trees[1].ID)) 57 58 time.Sleep(125 * time.Millisecond) 59 60 for _, tree := range trees { 61 token.TreeID = tree.ID 62 require.Nil(t, cache.GetFromToken(token)) 63 } 64 65 require.Equal(t, 0, len(cache.entries)) 66 } 67 68 func TestRosterCache(t *testing.T) { 69 cache := newRosterCache(50*time.Millisecond, size) 70 71 r := &Roster{} 72 id, _ := uuid.NewV1() 73 r.ID = RosterID(id) 74 75 cache.Set(r) 76 77 token := &Token{} 78 token.RosterID = r.ID 79 require.Equal(t, r, cache.GetFromToken(token)) 80 81 // test that get ignore expired item 82 time.Sleep(100 * time.Millisecond) 83 require.Nil(t, cache.GetFromToken(token)) 84 } 85 86 func generateID() uuid.UUID { 87 id, _ := uuid.NewV1() 88 return id 89 } 90 91 func TestTreeNodeCache(t *testing.T) { 92 cache := newTreeNodeCache(50*time.Millisecond, size) 93 94 tree := &Tree{ID: TreeID(generateID())} 95 tn1 := &TreeNode{ID: TreeNodeID(generateID())} 96 tn2 := &TreeNode{ID: TreeNodeID(generateID())} 97 98 cache.Set(tree, tn1) 99 cache.Set(tree, tn2) 100 101 tok := &Token{TreeID: tree.ID, TreeNodeID: tn1.ID} 102 require.Equal(t, tn1, cache.GetFromToken(tok)) 103 tok.TreeNodeID = tn2.ID 104 require.Equal(t, tn2, cache.GetFromToken(tok)) 105 tok.TreeNodeID = TreeNodeID(generateID()) 106 require.Nil(t, cache.GetFromToken(tok)) 107 108 require.Nil(t, cache.GetFromToken(&Token{})) 109 110 // test that get ignore expired item 111 time.Sleep(100 * time.Millisecond) 112 require.Nil(t, cache.GetFromToken(tok)) 113 } 114 115 func TestExpirationAndCleaning(t *testing.T) { 116 cache := newTreeCache(100*time.Millisecond, size) 117 118 tt := make([]*Tree, 2) 119 initTrees(tt) 120 121 cache.Set(tt[0]) 122 time.Sleep(50 * time.Millisecond) 123 cache.Set(tt[1]) 124 time.Sleep(75 * time.Millisecond) 125 126 token := &Token{} 127 token.TreeID = tt[1].ID 128 require.Equal(t, tt[1], cache.GetFromToken(token)) 129 token.TreeID = tt[0].ID 130 require.Nil(t, cache.GetFromToken(token)) 131 } 132 133 func TestCacheSize(t *testing.T) { 134 size := 5 135 cache := newTreeCache(50*time.Millisecond, size) 136 137 tt := make([]*Tree, 10) 138 initTrees(tt) 139 140 for _, t := range tt { 141 cache.Set(t) 142 cache.Get(tt[1].ID) 143 } 144 145 require.Equal(t, size, len(cache.entries)) 146 require.Nil(t, cache.Get(tt[0].ID)) 147 require.Equal(t, tt[9], cache.Get(tt[9].ID)) 148 require.Equal(t, tt[1], cache.Get(tt[1].ID)) 149 150 time.Sleep(60 * time.Millisecond) 151 require.Nil(t, cache.Get(tt[1].ID)) 152 require.Equal(t, 0, len(cache.entries)) 153 }