diff --git a/src/seeder/bitcoin.h b/src/seeder/bitcoin.h --- a/src/seeder/bitcoin.h +++ b/src/seeder/bitcoin.h @@ -25,7 +25,13 @@ Finished, }; +namespace { +class CSeederNodeTest; +} + class CSeederNode { + friend class ::CSeederNodeTest; + private: SOCKET sock; CDataStream vSend; diff --git a/src/seeder/test/p2p_messaging_tests.cpp b/src/seeder/test/p2p_messaging_tests.cpp --- a/src/seeder/test/p2p_messaging_tests.cpp +++ b/src/seeder/test/p2p_messaging_tests.cpp @@ -24,34 +24,36 @@ return os; } -class TestCSeederNode : public CSeederNode { +namespace { +class CSeederNodeTest : public CSeederNode { public: - TestCSeederNode(const CService &service, std::vector *vAddrIn) - : CSeederNode(service, vAddrIn) { - SelectParams(CBaseChainParams::REGTEST); - } + CSeederNodeTest(const CService &service, std::vector *vAddrIn) + : CSeederNode(service, vAddrIn) {} void TestProcessMessage(const std::string &strCommand, CDataStream &message, PeerMessagingState expectedState) { - PeerMessagingState ret = - CSeederNode::ProcessMessage(strCommand, message); + PeerMessagingState ret = ProcessMessage(strCommand, message); BOOST_CHECK_EQUAL(ret, expectedState); } + + CDataStream getSendBuffer() { return vSend; } }; +} // namespace static const unsigned short SERVICE_PORT = 18444; struct SeederTestingSetup { SeederTestingSetup() { + SelectParams(CBaseChainParams::REGTEST); CNetAddr ip; ip.SetInternal("bitcoin.test"); CService service = {ip, SERVICE_PORT}; vAddr.emplace_back(service, ServiceFlags()); - testNode = std::make_unique(service, &vAddr); + testNode = std::make_unique(service, &vAddr); } std::vector vAddr; - std::unique_ptr testNode; + std::unique_ptr testNode; }; BOOST_FIXTURE_TEST_SUITE(p2p_messaging_tests, SeederTestingSetup) @@ -71,7 +73,7 @@ static const int SEEDER_INIT_VERSION = 0; -BOOST_AUTO_TEST_CASE(seeder_node_version_test) { +BOOST_AUTO_TEST_CASE(process_version_msg) { CService serviceFrom; CAddress addrFrom(serviceFrom, ServiceFlags(NODE_NETWORK)); @@ -89,6 +91,20 @@ versionMessage.GetVersion()); } +BOOST_AUTO_TEST_CASE(process_verack_msg) { + CDataStream verackMessage(SER_NETWORK, 0); + verackMessage.SetVersion(INIT_PROTO_VERSION); + testNode->TestProcessMessage(NetMsgType::VERACK, verackMessage, + PeerMessagingState::AwaitingMessages); + + // Seeder should respond with an ADDR message + const CMessageHeader::MessageMagic netMagic = Params().NetMagic(); + CMessageHeader header(netMagic); + testNode->getSendBuffer() >> header; + BOOST_CHECK(header.IsValidWithoutConfig(netMagic)); + BOOST_CHECK_EQUAL(header.GetCommand(), NetMsgType::GETADDR); +} + static CDataStream CreateAddrMessage(std::vector sendAddrs, uint32_t nVersion = INIT_PROTO_VERSION) { CDataStream payload(SER_NETWORK, 0); @@ -97,7 +113,7 @@ return payload; } -BOOST_AUTO_TEST_CASE(seeder_node_addr_test) { +BOOST_AUTO_TEST_CASE(process_addr_msg) { // vAddrs starts with 1 entry. std::vector sendAddrs(ADDR_SOFT_CAP - 1, vAddr[0]);