status-im/status-go

View on GitHub
peers/cache_test.go

Summary

Maintainability
A
0 mins
Test Coverage
package peers

import (
    "net"
    "testing"

    "github.com/ethereum/go-ethereum/p2p/enode"

    "github.com/stretchr/testify/assert"
    "github.com/stretchr/testify/require"
    "github.com/syndtr/goleveldb/leveldb"
    "github.com/syndtr/goleveldb/leveldb/storage"

    "github.com/ethereum/go-ethereum/crypto"
    "github.com/ethereum/go-ethereum/p2p/discv5"
)

func TestPeersRange(t *testing.T) {
    peersDB, err := newInMemoryCache()
    require.NoError(t, err)
    topic := discv5.Topic("test")

    peerCount := 3
    peers, err := createDiscv5Peers(peerCount)
    require.NoError(t, err)

    addedPeerIDs := make(map[string]struct{})
    for _, peer := range peers {
        assert.NoError(t, peersDB.AddPeer(peer, topic))
        addedPeerIDs[peer.String()] = struct{}{}
    }

    // check if all peers are cached
    cachedNodes := peersDB.GetPeersRange(topic, peerCount)
    require.Len(t, cachedNodes, peerCount)
    // and returned peers are these we just created
    for _, node := range cachedNodes {
        _, ok := addedPeerIDs[node.String()]
        assert.True(t, ok)
    }

    // test removing peers
    pk, err := peers[0].ID.Pubkey()
    require.NoError(t, err)
    require.NoError(t, peersDB.RemovePeer(enode.PubkeyToIDV4(pk), topic))
    cachedNodes = peersDB.GetPeersRange(topic, peerCount)
    require.Len(t, cachedNodes, peerCount-1)
}

func TestMultipleTopics(t *testing.T) {
    peersDB, err := newInMemoryCache()
    require.NoError(t, err)
    topics := []discv5.Topic{discv5.Topic("first"), discv5.Topic("second")}

    peerCount := 3
    peers, err := createDiscv5Peers(peerCount)
    require.NoError(t, err)

    for i := range topics {
        for _, peer := range peers {
            assert.NoError(t, peersDB.AddPeer(peer, topics[i]))
        }
    }

    for i := range topics {
        nodes := peersDB.GetPeersRange(topics[i], peerCount+1)
        assert.Len(t, nodes, peerCount)
    }
}

// newInMemoryCache creates a cache for tests
func newInMemoryCache() (*Cache, error) {
    memdb, err := leveldb.Open(storage.NewMemStorage(), nil)
    if err != nil {
        return nil, err
    }
    return NewCache(memdb), nil
}

func createDiscv5Peers(count int) ([]*discv5.Node, error) {
    nodes := make([]*discv5.Node, count)

    for i := 0; i < count; i++ {
        id, err := crypto.GenerateKey()
        if err != nil {
            return nil, err
        }

        nodes[i] = discv5.NewNode(
            discv5.PubkeyID(&id.PublicKey),
            net.IPv4(10, 10, 0, byte(i)),
            32311,
            32311,
        )
    }

    return nodes, nil
}