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  }