Skip to content
Snippets Groups Projects
Select Git revision
  • 5292e0691fbf272f99ffb8887473317bdbe6fecc
  • without_tipselection default
  • develop protected
  • fix/grafana-local-dashboard
  • wasp
  • fix/dashboard-explorer-freeze
  • master
  • feat/timerqueue
  • test/sync_debug_and_650
  • feat/sync_revamp_inv
  • wip/sync
  • tool/db-recovery
  • portcheck/fix
  • fix/synchronization
  • feat/new-dashboard-analysis
  • feat/refactored-analysis-dashboard
  • feat/new-analysis-dashboard
  • test/demo-prometheus-fpc
  • prometheus_metrics
  • wip/analysis-server
  • merge/fpc-test-value-transfer
  • v0.2.2
  • v0.2.1
  • v0.2.0
  • v0.1.3
  • v0.1.2
  • v0.1.1
  • v0.1.0
28 results

plugin.go

Blame
  • server_test.go 4.26 KiB
    package server
    
    import (
    	"net"
    	"sync"
    	"testing"
    	"time"
    
    	"github.com/iotaledger/hive.go/autopeering/peer"
    	"github.com/iotaledger/hive.go/autopeering/peer/service"
    	"github.com/iotaledger/hive.go/database/mapdb"
    	"github.com/iotaledger/hive.go/logger"
    	"github.com/stretchr/testify/assert"
    	"github.com/stretchr/testify/require"
    )
    
    const graceTime = 5 * time.Millisecond
    
    var log = logger.NewExampleLogger("server")
    
    func getPeer(t *TCP) *peer.Peer {
    	return t.local.Peer
    }
    
    func TestClose(t *testing.T) {
    	_, teardown := newTestServer(t, "A")
    	teardown()
    }
    
    func TestUnansweredAccept(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    
    	_, err := transA.AcceptPeer(getPeer(transA))
    	assert.Error(t, err)
    }
    
    func TestCloseWhileAccepting(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    
    	var wg sync.WaitGroup
    	wg.Add(1)
    	go func() {
    		defer wg.Done()
    		_, err := transA.AcceptPeer(getPeer(transA))
    		assert.Error(t, err)
    	}()
    	time.Sleep(graceTime)
    
    	closeA()
    	wg.Wait()
    }
    
    func TestUnansweredDial(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    
    	// create peer with invalid gossip address
    	services := getPeer(transA).Services().CreateRecord()
    	services.Update(service.GossipKey, "tcp", 0)
    	unreachablePeer := peer.NewPeer(getPeer(transA).PublicKey(), net.ParseIP("127.0.0.1"), services)
    
    	_, err := transA.DialPeer(unreachablePeer)
    	assert.Error(t, err)
    }
    
    func TestNoHandshakeResponse(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    
    	// accept and read incoming connections
    	lis, err := net.Listen("tcp", "localhost:0")
    	require.NoError(t, err)
    	go func() {
    		conn, _ := lis.Accept()
    		n, _ := conn.Read(make([]byte, maxHandshakePacketSize))
    		assert.NotZero(t, n)
    		_ = conn.Close()
    		_ = lis.Close()
    	}()
    
    	// create peer for the listener
    	services := getPeer(transA).Services().CreateRecord()
    	services.Update(service.GossipKey, lis.Addr().Network(), lis.Addr().(*net.TCPAddr).Port)
    	p := peer.NewPeer(getPeer(transA).PublicKey(), lis.Addr().(*net.TCPAddr).IP, services)
    
    	_, err = transA.DialPeer(p)
    	assert.Error(t, err)
    }
    
    func TestNoHandshakeRequest(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    
    	var wg sync.WaitGroup
    	wg.Add(1)
    	go func() {
    		defer wg.Done()
    		_, err := transA.AcceptPeer(getPeer(transA))
    		assert.Error(t, err)
    	}()
    	time.Sleep(graceTime)
    
    	conn, err := net.Dial(transA.LocalAddr().Network(), transA.LocalAddr().String())
    	require.NoError(t, err)
    	time.Sleep(handshakeTimeout)
    	_ = conn.Close()
    
    	wg.Wait()
    }
    
    func TestConnect(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    	transB, closeB := newTestServer(t, "B")
    	defer closeB()
    
    	var wg sync.WaitGroup
    	wg.Add(2)
    
    	go func() {
    		defer wg.Done()
    		c, err := transA.AcceptPeer(getPeer(transB))
    		assert.NoError(t, err)
    		if assert.NotNil(t, c) {
    			_ = c.Close()
    		}
    	}()
    	time.Sleep(graceTime)
    	go func() {
    		defer wg.Done()
    		c, err := transB.DialPeer(getPeer(transA))
    		assert.NoError(t, err)
    		if assert.NotNil(t, c) {
    			_ = c.Close()
    		}
    	}()
    
    	wg.Wait()
    }
    
    func TestWrongConnect(t *testing.T) {
    	transA, closeA := newTestServer(t, "A")
    	defer closeA()
    	transB, closeB := newTestServer(t, "B")
    	defer closeB()
    	transC, closeC := newTestServer(t, "C")
    	defer closeC()
    
    	var wg sync.WaitGroup
    	wg.Add(2)
    
    	// a expects connection from B, but C is connecting
    	go func() {
    		defer wg.Done()
    		_, err := transA.AcceptPeer(getPeer(transB))
    		assert.Error(t, err)
    	}()
    	go func() {
    		defer wg.Done()
    		_, err := transC.DialPeer(getPeer(transA))
    		assert.Error(t, err)
    	}()
    
    	wg.Wait()
    }
    
    func newTestDB(t require.TestingT) *peer.DB {
    	db, err := peer.NewDB(mapdb.NewMapDB())
    	require.NoError(t, err)
    	return db
    }
    
    func newTestServer(t require.TestingT, name string) (*TCP, func()) {
    	l := log.Named(name)
    
    	laddr, err := net.ResolveTCPAddr("tcp", "127.0.0.1:0")
    	require.NoError(t, err)
    	lis, err := net.ListenTCP("tcp", laddr)
    	require.NoError(t, err)
    
    	services := service.New()
    	services.Update(service.PeeringKey, "peering", 0)
    	services.Update(service.GossipKey, lis.Addr().Network(), lis.Addr().(*net.TCPAddr).Port)
    
    	local, err := peer.NewLocal(lis.Addr().(*net.TCPAddr).IP, services, newTestDB(t))
    	require.NoError(t, err)
    
    	srv := ServeTCP(local, lis, l)
    
    	teardown := func() {
    		srv.Close()
    		_ = lis.Close()
    	}
    	return srv, teardown
    }