github.com/status-im/status-go@v1.1.0/services/ext/mailservers/cache_test.go (about) 1 package mailservers 2 3 import ( 4 "fmt" 5 "testing" 6 "time" 7 8 "github.com/stretchr/testify/require" 9 "github.com/syndtr/goleveldb/leveldb" 10 "github.com/syndtr/goleveldb/leveldb/storage" 11 12 "github.com/ethereum/go-ethereum/p2p/enode" 13 ) 14 15 func newInMemCache(t *testing.T) *Cache { 16 db, err := leveldb.Open(storage.NewMemStorage(), nil) 17 require.NoError(t, err) 18 return NewCache(db) 19 } 20 21 func containsNode(nodes []*enode.Node, node *enode.Node) error { 22 for _, n := range nodes { 23 if n.ID() == node.ID() { 24 return nil 25 } 26 } 27 return fmt.Errorf("nodes %+s do not contain %s", nodes, node) 28 } 29 30 func TestReplaceRecords(t *testing.T) { 31 nodesNumber := 3 32 cache := newInMemCache(t) 33 nodes := make([]*enode.Node, nodesNumber) 34 // First round is a sanity check that records were written. 35 fillWithRandomNodes(t, nodes) 36 require.NoError(t, cache.Replace(nodes)) 37 records, err := cache.LoadAll() 38 require.NoError(t, err) 39 require.Len(t, records, nodesNumber) 40 for i := range records { 41 require.NoError(t, containsNode(nodes, records[i].Node())) 42 } 43 // Replace all nodes and verify that length is the same and loaded records are found. 44 fillWithRandomNodes(t, nodes) 45 require.NoError(t, cache.Replace(nodes)) 46 records, err = cache.LoadAll() 47 require.NoError(t, err) 48 require.Len(t, records, nodesNumber) 49 for i := range records { 50 require.NoError(t, containsNode(nodes, records[i].Node())) 51 } 52 } 53 54 func TestUsedRecord(t *testing.T) { 55 cache := newInMemCache(t) 56 node, err := RandomNode() 57 require.NoError(t, err) 58 record := PeerRecord{node: node} 59 require.NoError(t, cache.UpdateRecord(record)) 60 record.LastUsed = time.Now() 61 require.NoError(t, cache.UpdateRecord(record)) 62 records, err := cache.LoadAll() 63 require.NoError(t, err) 64 require.Len(t, records, 1) 65 require.True(t, record.LastUsed.Equal(records[0].LastUsed)) 66 } 67 68 func TestTimestampPreservedOnReplace(t *testing.T) { 69 cache := newInMemCache(t) 70 node, err := RandomNode() 71 require.NoError(t, err) 72 record := PeerRecord{node: node, LastUsed: time.Now()} 73 require.NoError(t, cache.UpdateRecord(record)) 74 require.NoError(t, cache.Replace([]*enode.Node{node})) 75 records, err := cache.LoadAll() 76 require.NoError(t, err) 77 require.Len(t, records, 1) 78 require.Equal(t, node.ID(), records[0].Node().ID()) 79 require.False(t, records[0].LastUsed.IsZero(), "timestamp should be preserved and not equal to zero") 80 81 }