Skip to content
Snippets Groups Projects
peerdb_test.go 2.24 KiB
Newer Older
package peer

import (
	"crypto/ed25519"
	"fmt"
	"testing"
	"time"

	"github.com/iotaledger/goshimmer/packages/database/mapdb"
	"github.com/stretchr/testify/assert"
	"github.com/stretchr/testify/require"
)

func TestPeerDB(t *testing.T) {
	db, err := NewDB(mapdb.NewMapDB())
	require.NoError(t, err)
	p := newTestPeer("test")

	t.Run("LocalPrivateKey", func(t *testing.T) {
		key, err := db.LocalPrivateKey()
		require.NoError(t, err)

		assert.EqualValues(t, ed25519.PrivateKeySize, len(key))
		assert.EqualValues(t, ed25519.PublicKeySize, len(key.Public()))

		err = db.UpdateLocalPrivateKey(key)
		require.NoError(t, err)

		key2, err := db.LocalPrivateKey()
		require.NoError(t, err)

		assert.Equal(t, key, key2)
	})

	t.Run("Peer", func(t *testing.T) {
		err := db.UpdatePeer(p)
		require.NoError(t, err)

		assert.Equal(t, p, db.Peer(p.ID()))
	})

	t.Run("LastPing", func(t *testing.T) {
		now := time.Now()
		err := db.UpdateLastPing(p.ID(), p.Address(), now)
		require.NoError(t, err)

		assert.Equal(t, now.Unix(), db.LastPing(p.ID(), p.Address()).Unix())
	})

	t.Run("LastPong", func(t *testing.T) {
		now := time.Now()
		err := db.UpdateLastPong(p.ID(), p.Address(), now)
		require.NoError(t, err)

		assert.Equal(t, now.Unix(), db.LastPong(p.ID(), p.Address()).Unix())
	})

	t.Run("getPeers", func(t *testing.T) {
		time.Sleep(time.Second) // let the old peers expire

		newPeer := newTestPeer("new")
		assert.NoError(t, db.UpdatePeer(newPeer))
		assert.NoError(t, db.UpdateLastPong(newPeer.ID(), newPeer.Address(), time.Now()))

		peers := db.getPeers(time.Second)
		assert.ElementsMatch(t, []*Peer{newPeer}, peers)
	})

	t.Run("SeedPeers", func(t *testing.T) {
		for i := 0; i < seedCount+1; i++ {
			p := newTestPeer(fmt.Sprintf("SeedPeers%0d", i))
			assert.NoError(t, db.UpdatePeer(p))
			assert.NoError(t, db.UpdateLastPong(p.ID(), p.Address(), time.Now()))
		}

		peers := db.SeedPeers()
		assert.EqualValues(t, seedCount, len(peers))
	})

	t.Run("PersistSeeds", func(t *testing.T) {
		for i := 0; i < seedCount+1; i++ {
			p := newTestPeer(fmt.Sprintf("PersistSeeds%0d", i))
			assert.NoError(t, db.UpdatePeer(p))
			assert.NoError(t, db.UpdateLastPong(p.ID(), p.Address(), time.Now()))
		}

		count := db.PersistSeeds()
		assert.EqualValues(t, seedCount, count)
	})
}