p2p: More tests for AddTrustedPeer/RemoveTrustedPeer

This commit is contained in:
Andrey Petrov 2018-06-05 15:45:43 -04:00
parent 773857a524
commit 699794d88d

@ -148,7 +148,8 @@ func TestServerDial(t *testing.T) {
// tell the server to connect // tell the server to connect
tcpAddr := listener.Addr().(*net.TCPAddr) tcpAddr := listener.Addr().(*net.TCPAddr)
srv.AddPeer(&discover.Node{ID: remid, IP: tcpAddr.IP, TCP: uint16(tcpAddr.Port)}) node := &discover.Node{ID: remid, IP: tcpAddr.IP, TCP: uint16(tcpAddr.Port)}
srv.AddPeer(node)
select { select {
case conn := <-accepted: case conn := <-accepted:
@ -170,6 +171,21 @@ func TestServerDial(t *testing.T) {
if !reflect.DeepEqual(peers, []*Peer{peer}) { if !reflect.DeepEqual(peers, []*Peer{peer}) {
t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer}) t.Errorf("Peers mismatch: got %v, want %v", peers, []*Peer{peer})
} }
// Test AddTrustedPeer/RemoveTrustedPeer and changing Trusted flags
// Particularly for race conditions on changing the flag state.
if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
t.Errorf("peer is trusted prematurely: %v", peer)
}
srv.AddTrustedPeer(node)
if peer := srv.Peers()[0]; !peer.Info().Network.Trusted {
t.Errorf("peer is not trusted after AddTrustedPeer: %v", peer)
}
srv.RemoveTrustedPeer(node)
if peer := srv.Peers()[0]; peer.Info().Network.Trusted {
t.Errorf("peer is trusted after RemoveTrustedPeer: %v", peer)
}
case <-time.After(1 * time.Second): case <-time.After(1 * time.Second):
t.Error("server did not launch peer within one second") t.Error("server did not launch peer within one second")
} }
@ -351,7 +367,8 @@ func TestServerAtCap(t *testing.T) {
} }
} }
// Try inserting a non-trusted connection. // Try inserting a non-trusted connection.
c := newconn(randomID()) anotherID := randomID()
c := newconn(anotherID)
if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers { if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers {
t.Error("wrong error for insert:", err) t.Error("wrong error for insert:", err)
} }
@ -363,15 +380,41 @@ func TestServerAtCap(t *testing.T) {
if !c.is(trustedConn) { if !c.is(trustedConn) {
t.Error("Server did not set trusted flag") t.Error("Server did not set trusted flag")
} }
// Remove from trusted set and try again
srv.RemoveTrustedPeer(&discover.Node{ID: trustedID})
c = newconn(trustedID)
if err := srv.checkpoint(c, srv.posthandshake); err != DiscTooManyPeers {
t.Error("wrong error for insert:", err)
}
// Add anotherID to trusted set and try again
srv.AddTrustedPeer(&discover.Node{ID: anotherID})
c = newconn(anotherID)
if err := srv.checkpoint(c, srv.posthandshake); err != nil {
t.Error("unexpected error for trusted conn @posthandshake:", err)
}
if !c.is(trustedConn) {
t.Error("Server did not set trusted flag")
}
} }
func TestServerPeerLimits(t *testing.T) { func TestServerPeerLimits(t *testing.T) {
srvkey := newkey() srvkey := newkey()
srvid := discover.PubkeyID(&srvkey.PublicKey)
var tp *setupTransport = &setupTransport{id: srvid, phs: &protoHandshake{ID: srvid}} clientid := randomID()
clientnode := &discover.Node{ID: clientid}
var tp *setupTransport = &setupTransport{
id: clientid,
phs: &protoHandshake{
ID: clientid,
// Force "DiscUselessPeer" due to unmatching caps
// Caps: []Cap{discard.cap()},
},
}
var flags connFlag = dynDialedConn var flags connFlag = dynDialedConn
var dialDest *discover.Node = &discover.Node{ID: srvid} var dialDest *discover.Node = &discover.Node{ID: clientid}
srv := &Server{ srv := &Server{
Config: Config{ Config: Config{
@ -386,6 +429,7 @@ func TestServerPeerLimits(t *testing.T) {
if err := srv.Start(); err != nil { if err := srv.Start(); err != nil {
t.Fatalf("couldn't start server: %v", err) t.Fatalf("couldn't start server: %v", err)
} }
defer srv.Stop()
// Check that server is full (MaxPeers=0) // Check that server is full (MaxPeers=0)
conn, _ := net.Pipe() conn, _ := net.Pipe()
@ -395,7 +439,7 @@ func TestServerPeerLimits(t *testing.T) {
} }
conn.Close() conn.Close()
srv.AddTrustedPeer(dialDest) srv.AddTrustedPeer(clientnode)
// Check that server allows a trusted peer despite being full. // Check that server allows a trusted peer despite being full.
conn, _ = net.Pipe() conn, _ = net.Pipe()
@ -404,12 +448,12 @@ func TestServerPeerLimits(t *testing.T) {
t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr) t.Errorf("failed to bypass MaxPeers with trusted node: %q", tp.closeErr)
} }
if tp.closeErr != DiscSelf { if tp.closeErr != DiscUselessPeer {
t.Errorf("unexpected close error: %q", tp.closeErr) t.Errorf("unexpected close error: %q", tp.closeErr)
} }
conn.Close() conn.Close()
srv.RemoveTrustedPeer(dialDest) srv.RemoveTrustedPeer(clientnode)
// Check that server is full again. // Check that server is full again.
conn, _ = net.Pipe() conn, _ = net.Pipe()