Changeset View
Changeset View
Standalone View
Standalone View
src/seeder/test/seeder_tests.cpp
Show All 21 Lines | |||||
const std::function<std::string(const char *)> G_TRANSLATION_FUN = nullptr; | const std::function<std::string(const char *)> G_TRANSLATION_FUN = nullptr; | ||||
#include <boost/test/unit_test.hpp> | #include <boost/test/unit_test.hpp> | ||||
BOOST_AUTO_TEST_SUITE(seeder_tests) | BOOST_AUTO_TEST_SUITE(seeder_tests) | ||||
static const unsigned short SERVICE_PORT = 18444; | static const unsigned short SERVICE_PORT = 18444; | ||||
static const uint8_t SEND_WRONG_CHAIN_HEADER = 0; | |||||
static const uint8_t SEND_GOOD_HEADER = 1; | |||||
static const uint8_t SEND_NO_HEADERS = 2; | |||||
static const uint8_t HEADERS_TXN_COUNT = 0; | |||||
static const uint32_t VERACK_PAYLOAD = 0; | static const uint32_t VERACK_PAYLOAD = 0; | ||||
// After the 1000th addr, the seeder will only add one more address from an addr | // After the 1000th addr, the seeder will only add one more address from an addr | ||||
// message. | // message. | ||||
static const int VADDR_SOFT_CAP = 1000; | static const int VADDR_SOFT_CAP = 1000; | ||||
class TestCSeederNode : public CSeederNode { | class TestCSeederNode : public CSeederNode { | ||||
public: | public: | ||||
TestCSeederNode(const CService &service, std::vector<CAddress> *vAddrIn) | TestCSeederNode(const CService &service, std::vector<CAddress> *vAddrIn) | ||||
Show All 32 Lines | |||||
static CDataStream CreateAddrMessage(std::vector<CAddress> sendAddrs, | static CDataStream CreateAddrMessage(std::vector<CAddress> sendAddrs, | ||||
uint32_t nVersion = INIT_PROTO_VERSION) { | uint32_t nVersion = INIT_PROTO_VERSION) { | ||||
CDataStream payload(SER_NETWORK, 0); | CDataStream payload(SER_NETWORK, 0); | ||||
payload.SetVersion(nVersion); | payload.SetVersion(nVersion); | ||||
payload << sendAddrs; | payload << sendAddrs; | ||||
return payload; | return payload; | ||||
} | } | ||||
static CDataStream CreateHeadersMessage(uint8_t headersMessageContent, | |||||
int32_t nVersion = INIT_PROTO_VERSION, | |||||
uint32_t timeStamp = 0, | |||||
uint32_t bits = 0, uint32_t nonce = 0) { | |||||
CDataStream payload(SER_NETWORK, 0); | |||||
payload.SetVersion(nVersion); | |||||
uint8_t numberOfHeaders = headersMessageContent == SEND_NO_HEADERS ? 0 : 1; | |||||
payload << numberOfHeaders; | |||||
if (headersMessageContent == SEND_NO_HEADERS) { | |||||
return payload; | |||||
} | |||||
// The actual header can be garbage data, Seeder only cares that it got | |||||
// a specific type of message, the size, and the hash of the previous block. | |||||
uint256 merkleRoot = Hash(payload.begin(), payload.end()); | |||||
uint256 previousBlockHash; | |||||
if (headersMessageContent == SEND_WRONG_CHAIN_HEADER) { | |||||
previousBlockHash = merkleRoot; | |||||
} else { | |||||
previousBlockHash = | |||||
Params().Checkpoints().mapCheckpoints.rbegin()->second; | |||||
} | |||||
payload << nVersion; | |||||
// prev_block | |||||
payload << previousBlockHash; | |||||
// merkle_root | |||||
payload << merkleRoot; | |||||
// timestamp | |||||
payload << timeStamp; | |||||
// bits | |||||
payload << bits; | |||||
// nonce | |||||
payload << nonce; | |||||
// txn_count | |||||
payload << HEADERS_TXN_COUNT; | |||||
return payload; | |||||
} | |||||
BOOST_AUTO_TEST_CASE(seeder_node_version_test) { | BOOST_AUTO_TEST_CASE(seeder_node_version_test) { | ||||
CNetAddr ip; | CNetAddr ip; | ||||
ip.SetInternal("foo.com"); | ip.SetInternal("foo.com"); | ||||
const CService service(ip, SERVICE_PORT); | const CService service(ip, SERVICE_PORT); | ||||
CAddress addr(service, ServiceFlags()); | CAddress addr(service, ServiceFlags()); | ||||
std::vector<CAddress> vAddr(1, addr); | std::vector<CAddress> vAddr(1, addr); | ||||
TestCSeederNode testNode(service, &vAddr); | TestCSeederNode testNode(service, &vAddr); | ||||
▲ Show 20 Lines • Show All 75 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(seeder_node_addr_test_fill_past_soft_cap) { | ||||
// vAddr starts with 1 entry and trys to add 1001 more. Only 1000 are | // vAddr starts with 1 entry and trys to add 1001 more. Only 1000 are | ||||
// actually added. | // actually added. | ||||
BOOST_CHECK_EQUAL(1, vAddr.size()); | BOOST_CHECK_EQUAL(1, vAddr.size()); | ||||
bool ret = testNode.TestProcessMessage(NetMsgType::ADDR, addrMessage); | bool ret = testNode.TestProcessMessage(NetMsgType::ADDR, addrMessage); | ||||
BOOST_CHECK_EQUAL(ret, true); | BOOST_CHECK_EQUAL(ret, true); | ||||
BOOST_CHECK_EQUAL(VADDR_SOFT_CAP + 1, vAddr.size()); | BOOST_CHECK_EQUAL(VADDR_SOFT_CAP + 1, vAddr.size()); | ||||
} | } | ||||
BOOST_AUTO_TEST_CASE(seeder_node_headers_test_correct_chain) { | |||||
CNetAddr ip; | |||||
ip.SetInternal("foo.com"); | |||||
const CService service(ip, SERVICE_PORT); | |||||
CAddress addr(service, ServiceFlags()); | |||||
std::vector<CAddress> vAddr(1, addr); | |||||
TestCSeederNode testNode(service, &vAddr); | |||||
CDataStream headersMessage = CreateHeadersMessage(SEND_GOOD_HEADER); | |||||
bool ret = testNode.TestProcessMessage(NetMsgType::HEADERS, headersMessage); | |||||
BOOST_CHECK_EQUAL(ret, false); | |||||
BOOST_CHECK_EQUAL(testNode.GetBan(), 0); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(seeder_node_headers_test_wrong_chain) { | |||||
CNetAddr ip; | |||||
ip.SetInternal("foo.com"); | |||||
const CService service(ip, SERVICE_PORT); | |||||
CAddress addr(service, ServiceFlags()); | |||||
std::vector<CAddress> vAddr(1, addr); | |||||
TestCSeederNode testNode(service, &vAddr); | |||||
CDataStream headersMessage = CreateHeadersMessage(SEND_WRONG_CHAIN_HEADER); | |||||
bool ret = testNode.TestProcessMessage(NetMsgType::HEADERS, headersMessage); | |||||
BOOST_CHECK_EQUAL(ret, true); | |||||
BOOST_CHECK_EQUAL(testNode.GetBan(), 100000); | |||||
} | |||||
BOOST_AUTO_TEST_CASE(seeder_node_empty_headers_test) { | |||||
CNetAddr ip; | |||||
ip.SetInternal("foo.com"); | |||||
const CService service(ip, SERVICE_PORT); | |||||
CAddress addr(service, ServiceFlags()); | |||||
std::vector<CAddress> vAddr(1, addr); | |||||
TestCSeederNode testNode(service, &vAddr); | |||||
CDataStream headersMessage = CreateHeadersMessage(SEND_NO_HEADERS); | |||||
bool ret = testNode.TestProcessMessage(NetMsgType::HEADERS, headersMessage); | |||||
BOOST_CHECK_EQUAL(ret, true); | |||||
BOOST_CHECK_EQUAL(testNode.GetBan(), 100000); | |||||
} | |||||
BOOST_AUTO_TEST_SUITE_END() | BOOST_AUTO_TEST_SUITE_END() |