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  }