// TestSendHeaders tests the MsgSendHeaders API against the latest protocol // version. func TestSendHeaders(t *testing.T) { pver := wire.ProtocolVersion // Ensure the command is expected value. wantCmd := "sendheaders" msg := wire.NewMsgSendHeaders() if cmd := msg.Command(); cmd != wantCmd { t.Errorf("NewMsgSendHeaders: wrong command - got %v want %v", cmd, wantCmd) } // Ensure max payload is expected value. wantPayload := uint32(0) maxPayload := msg.MaxPayloadLength(pver) if maxPayload != wantPayload { t.Errorf("MaxPayloadLength: wrong max payload length for "+ "protocol version %d - got %v, want %v", pver, maxPayload, wantPayload) } // Test encode with latest protocol version. var buf bytes.Buffer err := msg.BtcEncode(&buf, pver) if err != nil { t.Errorf("encode of MsgSendHeaders failed %v err <%v>", msg, err) } // Older protocol versions should fail encode since message didn't // exist yet. oldPver := wire.SendHeadersVersion - 1 err = msg.BtcEncode(&buf, oldPver) if err == nil { s := "encode of MsgSendHeaders passed for old protocol " + "version %v err <%v>" t.Errorf(s, msg, err) } // Test decode with latest protocol version. readmsg := wire.NewMsgSendHeaders() err = readmsg.BtcDecode(&buf, pver) if err != nil { t.Errorf("decode of MsgSendHeaders failed [%v] err <%v>", buf, err) } // Older protocol versions should fail decode since message didn't // exist yet. err = readmsg.BtcDecode(&buf, oldPver) if err == nil { s := "decode of MsgSendHeaders passed for old protocol " + "version %v err <%v>" t.Errorf(s, msg, err) } return }
// TestSendHeadersCrossProtocol tests the MsgSendHeaders API when encoding with // the latest protocol version and decoding with SendHeadersVersion. func TestSendHeadersCrossProtocol(t *testing.T) { msg := wire.NewMsgSendHeaders() // Encode with latest protocol version. var buf bytes.Buffer err := msg.BtcEncode(&buf, wire.ProtocolVersion) if err != nil { t.Errorf("encode of MsgSendHeaders failed %v err <%v>", msg, err) } // Decode with old protocol version. readmsg := wire.NewMsgSendHeaders() err = readmsg.BtcDecode(&buf, wire.SendHeadersVersion) if err != nil { t.Errorf("decode of MsgSendHeaders failed [%v] err <%v>", buf, err) } }
// TestSendHeadersBIP0130 tests the MsgSendHeaders API against the protocol // prior to version SendHeadersVersion. func TestSendHeadersBIP0130(t *testing.T) { // Use the protocol version just prior to SendHeadersVersion changes. pver := wire.SendHeadersVersion - 1 msg := wire.NewMsgSendHeaders() // Test encode with old protocol version. var buf bytes.Buffer err := msg.BtcEncode(&buf, pver) if err == nil { t.Errorf("encode of MsgSendHeaders succeeded when it should " + "have failed") } // Test decode with old protocol version. readmsg := wire.NewMsgSendHeaders() err = readmsg.BtcDecode(&buf, pver) if err == nil { t.Errorf("decode of MsgSendHeaders succeeded when it should " + "have failed") } return }
// TestPeerListeners tests that the peer listeners are called as expected. func TestPeerListeners(t *testing.T) { verack := make(chan struct{}, 1) ok := make(chan wire.Message, 20) peerCfg := &peer.Config{ Listeners: peer.MessageListeners{ OnGetAddr: func(p *peer.Peer, msg *wire.MsgGetAddr) { ok <- msg }, OnAddr: func(p *peer.Peer, msg *wire.MsgAddr) { ok <- msg }, OnPing: func(p *peer.Peer, msg *wire.MsgPing) { ok <- msg }, OnPong: func(p *peer.Peer, msg *wire.MsgPong) { ok <- msg }, OnAlert: func(p *peer.Peer, msg *wire.MsgAlert) { ok <- msg }, OnMemPool: func(p *peer.Peer, msg *wire.MsgMemPool) { ok <- msg }, OnTx: func(p *peer.Peer, msg *wire.MsgTx) { ok <- msg }, OnBlock: func(p *peer.Peer, msg *wire.MsgBlock, buf []byte) { ok <- msg }, OnInv: func(p *peer.Peer, msg *wire.MsgInv) { ok <- msg }, OnHeaders: func(p *peer.Peer, msg *wire.MsgHeaders) { ok <- msg }, OnNotFound: func(p *peer.Peer, msg *wire.MsgNotFound) { ok <- msg }, OnGetData: func(p *peer.Peer, msg *wire.MsgGetData) { ok <- msg }, OnGetBlocks: func(p *peer.Peer, msg *wire.MsgGetBlocks) { ok <- msg }, OnGetHeaders: func(p *peer.Peer, msg *wire.MsgGetHeaders) { ok <- msg }, OnFilterAdd: func(p *peer.Peer, msg *wire.MsgFilterAdd) { ok <- msg }, OnFilterClear: func(p *peer.Peer, msg *wire.MsgFilterClear) { ok <- msg }, OnFilterLoad: func(p *peer.Peer, msg *wire.MsgFilterLoad) { ok <- msg }, OnMerkleBlock: func(p *peer.Peer, msg *wire.MsgMerkleBlock) { ok <- msg }, OnVersion: func(p *peer.Peer, msg *wire.MsgVersion) { ok <- msg }, OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) { verack <- struct{}{} }, OnReject: func(p *peer.Peer, msg *wire.MsgReject) { ok <- msg }, OnSendHeaders: func(p *peer.Peer, msg *wire.MsgSendHeaders) { ok <- msg }, }, UserAgentName: "peer", UserAgentVersion: "1.0", ChainParams: &chaincfg.MainNetParams, Services: wire.SFNodeBloom, } inConn, outConn := pipe( &conn{raddr: "10.0.0.1:8333"}, &conn{raddr: "10.0.0.2:8333"}, ) inPeer := peer.NewInboundPeer(peerCfg) if err := inPeer.Connect(inConn); err != nil { t.Errorf("TestPeerListeners: unexpected err %v\n", err) return } peerCfg.Listeners = peer.MessageListeners{ OnVerAck: func(p *peer.Peer, msg *wire.MsgVerAck) { verack <- struct{}{} }, } outPeer, err := peer.NewOutboundPeer(peerCfg, "10.0.0.1:8333") if err != nil { t.Errorf("NewOutboundPeer: unexpected err %v\n", err) return } if err := outPeer.Connect(outConn); err != nil { t.Errorf("TestPeerListeners: unexpected err %v\n", err) return } for i := 0; i < 2; i++ { select { case <-verack: case <-time.After(time.Second * 1): t.Errorf("TestPeerListeners: verack timeout\n") return } } tests := []struct { listener string msg wire.Message }{ { "OnGetAddr", wire.NewMsgGetAddr(), }, { "OnAddr", wire.NewMsgAddr(), }, { "OnPing", wire.NewMsgPing(42), }, { "OnPong", wire.NewMsgPong(42), }, { "OnAlert", wire.NewMsgAlert([]byte("payload"), []byte("signature")), }, { "OnMemPool", wire.NewMsgMemPool(), }, { "OnTx", wire.NewMsgTx(), }, { "OnBlock", wire.NewMsgBlock(wire.NewBlockHeader(&wire.ShaHash{}, &wire.ShaHash{}, 1, 1)), }, { "OnInv", wire.NewMsgInv(), }, { "OnHeaders", wire.NewMsgHeaders(), }, { "OnNotFound", wire.NewMsgNotFound(), }, { "OnGetData", wire.NewMsgGetData(), }, { "OnGetBlocks", wire.NewMsgGetBlocks(&wire.ShaHash{}), }, { "OnGetHeaders", wire.NewMsgGetHeaders(), }, { "OnFilterAdd", wire.NewMsgFilterAdd([]byte{0x01}), }, { "OnFilterClear", wire.NewMsgFilterClear(), }, { "OnFilterLoad", wire.NewMsgFilterLoad([]byte{0x01}, 10, 0, wire.BloomUpdateNone), }, { "OnMerkleBlock", wire.NewMsgMerkleBlock(wire.NewBlockHeader(&wire.ShaHash{}, &wire.ShaHash{}, 1, 1)), }, // only one version message is allowed // only one verack message is allowed { "OnReject", wire.NewMsgReject("block", wire.RejectDuplicate, "dupe block"), }, { "OnSendHeaders", wire.NewMsgSendHeaders(), }, } t.Logf("Running %d tests", len(tests)) for _, test := range tests { // Queue the test message outPeer.QueueMessage(test.msg, nil) select { case <-ok: case <-time.After(time.Second * 1): t.Errorf("TestPeerListeners: %s timeout", test.listener) return } } inPeer.Disconnect() outPeer.Disconnect() }
// TestSendHeadersWire tests the MsgSendHeaders wire encode and decode for // various protocol versions. func TestSendHeadersWire(t *testing.T) { msgSendHeaders := wire.NewMsgSendHeaders() msgSendHeadersEncoded := []byte{} tests := []struct { in *wire.MsgSendHeaders // Message to encode out *wire.MsgSendHeaders // Expected decoded message buf []byte // Wire encoding pver uint32 // Protocol version for wire encoding }{ // Latest protocol version. { msgSendHeaders, msgSendHeaders, msgSendHeadersEncoded, wire.ProtocolVersion, }, // Protocol version SendHeadersVersion+1 { msgSendHeaders, msgSendHeaders, msgSendHeadersEncoded, wire.SendHeadersVersion + 1, }, // Protocol version SendHeadersVersion { msgSendHeaders, msgSendHeaders, msgSendHeadersEncoded, wire.SendHeadersVersion, }, } t.Logf("Running %d tests", len(tests)) for i, test := range tests { // Encode the message to wire format. var buf bytes.Buffer err := test.in.BtcEncode(&buf, test.pver) if err != nil { t.Errorf("BtcEncode #%d error %v", i, err) continue } if !bytes.Equal(buf.Bytes(), test.buf) { t.Errorf("BtcEncode #%d\n got: %s want: %s", i, spew.Sdump(buf.Bytes()), spew.Sdump(test.buf)) continue } // Decode the message from wire format. var msg wire.MsgSendHeaders rbuf := bytes.NewReader(test.buf) err = msg.BtcDecode(rbuf, test.pver) if err != nil { t.Errorf("BtcDecode #%d error %v", i, err) continue } if !reflect.DeepEqual(&msg, test.out) { t.Errorf("BtcDecode #%d\n got: %s want: %s", i, spew.Sdump(msg), spew.Sdump(test.out)) continue } } }