func TestPeerHandshakeSuccess(t *testing.T) { tester := startTestPeer() // Wait for and check the handshake if err := p2p.ExpectMsg(tester.stream, statusCode, []uint64{protocolVersion}); err != nil { t.Fatalf("status message mismatch: %v", err) } // Send a valid handshake status and make sure connection stays live if err := p2p.SendItems(tester.stream, statusCode, protocolVersion); err != nil { t.Fatalf("failed to send status: %v", err) } select { case <-tester.termed: t.Fatalf("valid handshake disconnected") case <-time.After(100 * time.Millisecond): } // Clean up the test tester.stream.Close() select { case <-tester.termed: case <-time.After(time.Second): t.Fatalf("local close timed out") } }
// handshake sends the protocol initiation status message to the remote peer and // verifies the remote status too. func (self *peer) handshake() error { // Send the handshake status message asynchronously errc := make(chan error, 1) go func() { errc <- p2p.SendItems(self.ws, statusCode, protocolVersion) }() // Fetch the remote status packet and verify protocol match packet, err := self.ws.ReadMsg() if err != nil { return err } if packet.Code != statusCode { return fmt.Errorf("peer sent %x before status packet", packet.Code) } s := rlp.NewStream(packet.Payload, uint64(packet.Size)) if _, err := s.List(); err != nil { return fmt.Errorf("bad status message: %v", err) } peerVersion, err := s.Uint() if err != nil { return fmt.Errorf("bad status message: %v", err) } if peerVersion != protocolVersion { return fmt.Errorf("protocol version mismatch %d != %d", peerVersion, protocolVersion) } // Wait until out own status is consumed too if err := <-errc; err != nil { return fmt.Errorf("failed to send status packet: %v", err) } return nil }
func startTestPeerInited() (*testPeer, error) { peer := startTestPeer() if err := p2p.ExpectMsg(peer.stream, statusCode, []uint64{protocolVersion}); err != nil { peer.stream.Close() return nil, err } if err := p2p.SendItems(peer.stream, statusCode, protocolVersion); err != nil { peer.stream.Close() return nil, err } return peer, nil }
func TestPeerHandshakeFail(t *testing.T) { tester := startTestPeer() // Wait for and check the handshake if err := p2p.ExpectMsg(tester.stream, statusCode, []uint64{protocolVersion}); err != nil { t.Fatalf("status message mismatch: %v", err) } // Send an invalid handshake status and verify disconnect if err := p2p.SendItems(tester.stream, messagesCode); err != nil { t.Fatalf("failed to send malformed status: %v", err) } select { case <-tester.termed: case <-time.After(time.Second): t.Fatalf("remote close timed out") } }