Changeset View
Changeset View
Standalone View
Standalone View
src/test/addrman_tests.cpp
| Show First 20 Lines • Show All 719 Lines • ▼ Show 20 Lines | |||||
| } | } | ||||
| BOOST_AUTO_TEST_CASE(addrman_serialization) { | BOOST_AUTO_TEST_CASE(addrman_serialization) { | ||||
| std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8); | std::vector<bool> asmap1 = FromBytes(asmap_raw, sizeof(asmap_raw) * 8); | ||||
| auto addrman_asmap1 = std::make_unique<AddrManTest>(asmap1); | auto addrman_asmap1 = std::make_unique<AddrManTest>(asmap1); | ||||
| auto addrman_asmap1_dup = std::make_unique<AddrManTest>(asmap1); | auto addrman_asmap1_dup = std::make_unique<AddrManTest>(asmap1); | ||||
| auto addrman_noasmap = std::make_unique<AddrManTest>(); | auto addrman_noasmap = std::make_unique<AddrManTest>(); | ||||
| CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); | DataStream stream{}; | ||||
| CAddress addr = CAddress(ResolveService("250.1.1.1"), NODE_NONE); | CAddress addr = CAddress(ResolveService("250.1.1.1"), NODE_NONE); | ||||
| CNetAddr default_source; | CNetAddr default_source; | ||||
| addrman_asmap1->Add({addr}, default_source); | addrman_asmap1->Add({addr}, default_source); | ||||
| stream << *addrman_asmap1; | stream << *addrman_asmap1; | ||||
| // serizalizing/deserializing addrman with the same asmap | // serizalizing/deserializing addrman with the same asmap | ||||
| ▲ Show 20 Lines • Show All 202 Lines • ▼ Show 20 Lines | BOOST_AUTO_TEST_CASE(addrman_evictionworks) { | ||||
| BOOST_CHECK_EQUAL(addrman.SelectTriedCollision().first.ToString(), | BOOST_CHECK_EQUAL(addrman.SelectTriedCollision().first.ToString(), | ||||
| "250.1.1.36:0"); | "250.1.1.36:0"); | ||||
| addrman.ResolveCollisions(); | addrman.ResolveCollisions(); | ||||
| BOOST_CHECK(addrman.SelectTriedCollision().first.ToString() == "[::]:0"); | BOOST_CHECK(addrman.SelectTriedCollision().first.ToString() == "[::]:0"); | ||||
| } | } | ||||
| static CDataStream AddrmanToStream(const AddrMan &addrman) { | static auto AddrmanToStream(const AddrMan &addrman) { | ||||
| CDataStream ssPeersIn(SER_DISK, CLIENT_VERSION); | DataStream ssPeersIn{}; | ||||
| ssPeersIn << Params().DiskMagic(); | ssPeersIn << Params().DiskMagic(); | ||||
| ssPeersIn << addrman; | ssPeersIn << addrman; | ||||
| return ssPeersIn; | return ssPeersIn; | ||||
| } | } | ||||
| BOOST_AUTO_TEST_CASE(load_addrman) { | BOOST_AUTO_TEST_CASE(load_addrman) { | ||||
| AddrMan addrman{/*asmap=*/std::vector<bool>(), /*deterministic=*/true, | AddrMan addrman{/*asmap=*/std::vector<bool>(), /*deterministic=*/true, | ||||
| /*consistency_check_ratio=*/100}; | /*consistency_check_ratio=*/100}; | ||||
| CService addr1, addr2, addr3; | CService addr1, addr2, addr3; | ||||
| BOOST_CHECK(Lookup("250.7.1.1", addr1, 8333, false)); | BOOST_CHECK(Lookup("250.7.1.1", addr1, 8333, false)); | ||||
| BOOST_CHECK(Lookup("250.7.2.2", addr2, 9999, false)); | BOOST_CHECK(Lookup("250.7.2.2", addr2, 9999, false)); | ||||
| BOOST_CHECK(Lookup("250.7.3.3", addr3, 9999, false)); | BOOST_CHECK(Lookup("250.7.3.3", addr3, 9999, false)); | ||||
| BOOST_CHECK(Lookup("250.7.3.3"s, addr3, 9999, false)); | BOOST_CHECK(Lookup("250.7.3.3"s, addr3, 9999, false)); | ||||
| BOOST_CHECK(!Lookup("250.7.3.3\0example.com"s, addr3, 9999, false)); | BOOST_CHECK(!Lookup("250.7.3.3\0example.com"s, addr3, 9999, false)); | ||||
| // Add three addresses to new table. | // Add three addresses to new table. | ||||
| CService source; | CService source; | ||||
| BOOST_CHECK(Lookup("252.5.1.1", source, 8333, false)); | BOOST_CHECK(Lookup("252.5.1.1", source, 8333, false)); | ||||
| BOOST_CHECK(addrman.Add({CAddress(addr1, NODE_NONE)}, source)); | BOOST_CHECK(addrman.Add({CAddress(addr1, NODE_NONE)}, source)); | ||||
| BOOST_CHECK(addrman.Add({CAddress(addr2, NODE_NONE)}, source)); | BOOST_CHECK(addrman.Add({CAddress(addr2, NODE_NONE)}, source)); | ||||
| BOOST_CHECK(addrman.Add({CAddress(addr3, NODE_NONE)}, source)); | BOOST_CHECK(addrman.Add({CAddress(addr3, NODE_NONE)}, source)); | ||||
| // Test that the de-serialization does not throw an exception. | // Test that the de-serialization does not throw an exception. | ||||
| CDataStream ssPeers1 = AddrmanToStream(addrman); | auto ssPeers1{AddrmanToStream(addrman)}; | ||||
| bool exceptionThrown = false; | bool exceptionThrown = false; | ||||
| AddrMan addrman1(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | AddrMan addrman1(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | ||||
| /*consistency_check_ratio=*/100); | /*consistency_check_ratio=*/100); | ||||
| BOOST_CHECK(addrman1.size() == 0); | BOOST_CHECK(addrman1.size() == 0); | ||||
| try { | try { | ||||
| uint8_t pchMsgTmp[4]; | uint8_t pchMsgTmp[4]; | ||||
| ssPeers1 >> pchMsgTmp; | ssPeers1 >> pchMsgTmp; | ||||
| ssPeers1 >> addrman1; | ssPeers1 >> addrman1; | ||||
| } catch (const std::exception &) { | } catch (const std::exception &) { | ||||
| exceptionThrown = true; | exceptionThrown = true; | ||||
| } | } | ||||
| BOOST_CHECK(addrman1.size() == 3); | BOOST_CHECK(addrman1.size() == 3); | ||||
| BOOST_CHECK(exceptionThrown == false); | BOOST_CHECK(exceptionThrown == false); | ||||
| // Test that ReadFromStream creates an addrman with the correct number of | // Test that ReadFromStream creates an addrman with the correct number of | ||||
| // addrs. | // addrs. | ||||
| CDataStream ssPeers2 = AddrmanToStream(addrman); | DataStream ssPeers2 = AddrmanToStream(addrman); | ||||
| AddrMan addrman2(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | AddrMan addrman2(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | ||||
| /*consistency_check_ratio=*/100); | /*consistency_check_ratio=*/100); | ||||
| BOOST_CHECK(addrman2.size() == 0); | BOOST_CHECK(addrman2.size() == 0); | ||||
| ReadFromStream(Params(), addrman2, ssPeers2); | ReadFromStream(Params(), addrman2, ssPeers2); | ||||
| BOOST_CHECK(addrman2.size() == 3); | BOOST_CHECK(addrman2.size() == 3); | ||||
| } | } | ||||
| // Produce a corrupt peers.dat that claims 20 addrs when it only has one addr. | // Produce a corrupt peers.dat that claims 20 addrs when it only has one addr. | ||||
| static CDataStream MakeCorruptPeersDat() { | static auto MakeCorruptPeersDat() { | ||||
| CDataStream s(SER_DISK, CLIENT_VERSION); | DataStream s{}; | ||||
| s << ::Params().DiskMagic(); | s << ::Params().DiskMagic(); | ||||
| uint8_t nVersion = 1; | uint8_t nVersion = 1; | ||||
| s << nVersion; | s << nVersion; | ||||
| s << uint8_t(32); | s << uint8_t(32); | ||||
| s << uint256::ONE; | s << uint256::ONE; | ||||
| s << 10; // nNew | s << 10; // nNew | ||||
| s << 10; // nTried | s << 10; // nTried | ||||
| int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30); | int nUBuckets = ADDRMAN_NEW_BUCKET_COUNT ^ (1 << 30); | ||||
| s << nUBuckets; | s << nUBuckets; | ||||
| CService serv; | CService serv; | ||||
| BOOST_CHECK(Lookup("252.1.1.1", serv, 7777, false)); | BOOST_CHECK(Lookup("252.1.1.1", serv, 7777, false)); | ||||
| CAddress addr = CAddress(serv, NODE_NONE); | CAddress addr = CAddress(serv, NODE_NONE); | ||||
| CNetAddr resolved; | CNetAddr resolved; | ||||
| BOOST_CHECK(LookupHost("252.2.2.2", resolved, false)); | BOOST_CHECK(LookupHost("252.2.2.2", resolved, false)); | ||||
| AddrInfo info = AddrInfo(addr, resolved); | AddrInfo info = AddrInfo(addr, resolved); | ||||
| s << info; | s << WithParams(CAddress::V1_DISK, info); | ||||
| return s; | return s; | ||||
| } | } | ||||
| BOOST_AUTO_TEST_CASE(load_addrman_corrupted) { | BOOST_AUTO_TEST_CASE(load_addrman_corrupted) { | ||||
| // Test that the de-serialization of corrupted peers.dat throws an | // Test that the de-serialization of corrupted peers.dat throws an | ||||
| // exception. | // exception. | ||||
| CDataStream ssPeers1 = MakeCorruptPeersDat(); | auto ssPeers1{MakeCorruptPeersDat()}; | ||||
| bool exceptionThrown = false; | bool exceptionThrown = false; | ||||
| AddrMan addrman1(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | AddrMan addrman1(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | ||||
| /*consistency_check_ratio=*/100); | /*consistency_check_ratio=*/100); | ||||
| BOOST_CHECK(addrman1.size() == 0); | BOOST_CHECK(addrman1.size() == 0); | ||||
| try { | try { | ||||
| uint8_t pchMsgTmp[4]; | uint8_t pchMsgTmp[4]; | ||||
| ssPeers1 >> pchMsgTmp; | ssPeers1 >> pchMsgTmp; | ||||
| ssPeers1 >> addrman1; | ssPeers1 >> addrman1; | ||||
| } catch (const std::exception &) { | } catch (const std::exception &) { | ||||
| exceptionThrown = true; | exceptionThrown = true; | ||||
| } | } | ||||
| // Even though de-serialization failed addrman is not left in a clean state. | // Even though de-serialization failed addrman is not left in a clean state. | ||||
| BOOST_CHECK(addrman1.size() == 1); | BOOST_CHECK(addrman1.size() == 1); | ||||
| BOOST_CHECK(exceptionThrown); | BOOST_CHECK(exceptionThrown); | ||||
| // Test that ReadFromStream fails if peers.dat is corrupt | // Test that ReadFromStream fails if peers.dat is corrupt | ||||
| CDataStream ssPeers2 = MakeCorruptPeersDat(); | auto ssPeers2{MakeCorruptPeersDat()}; | ||||
| AddrMan addrman2(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | AddrMan addrman2(/*asmap=*/std::vector<bool>(), /*deterministic=*/false, | ||||
| /*consistency_check_ratio=*/100); | /*consistency_check_ratio=*/100); | ||||
| BOOST_CHECK(addrman2.size() == 0); | BOOST_CHECK(addrman2.size() == 0); | ||||
| BOOST_CHECK_THROW(ReadFromStream(Params(), addrman2, ssPeers2), | BOOST_CHECK_THROW(ReadFromStream(Params(), addrman2, ssPeers2), | ||||
| std::ios_base::failure); | std::ios_base::failure); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 89 Lines • Show Last 20 Lines | |||||