18 #include <boost/test/unit_test.hpp> 31 return std::clamp<int32_t>(node_ctx.
args->
GetIntArg(
"-checkaddrman", 100), 0, 1000000);
44 BOOST_CHECK_MESSAGE(
Lookup(
ip, serv, port,
false),
strprintf(
"failed to resolve: %s:%i",
ip, port));
51 std::vector<bool> result(vector_size);
52 for (
int byte_i = 0; byte_i < vector_size / 8; ++byte_i) {
53 unsigned char cur_byte =
source[byte_i];
54 for (
int bit_i = 0; bit_i < 8; ++bit_i) {
55 result[byte_i * 8 + bit_i] = (cur_byte >> bit_i) & 1;
71 auto addr_null = addrman->Select().first;
78 auto addr_ret1 = addrman->Select().first;
100 std::vector<CAddress> vAddr;
123 auto addr_ret2 = addrman->Select().first;
124 BOOST_CHECK(addr_ret2.ToString() ==
"250.1.1.1:8333" || addr_ret2.ToString() ==
"250.1.1.1:8334");
131 auto addr_ret3 = addrman->Select(newOnly).first;
148 auto addr_ret1 = addrman->Select(newOnly).first;
154 auto addr_ret2 = addrman->Select(newOnly).first;
157 auto addr_ret3 = addrman->Select().first;
188 std::set<uint16_t> ports;
189 for (
int i = 0; i < 20; ++i) {
190 ports.insert(addrman->Select().first.GetPort());
201 uint32_t num_addrs{0};
205 while (num_addrs < 22) {
215 uint32_t collisions{1};
228 const auto start_time{Now<NodeSeconds>()};
229 addr.
nTime = start_time;
232 for (
unsigned int i = 1; i < 20; ++i) {
233 std::string addr_ip{
ToString(i % 256) +
"." +
ToString(i >> 8 % 256) +
".1.1"};
235 addrman->Add({addr},
source);
244 for (
unsigned int i = 1; i < 400; ++i) {
245 std::string addr_ip{
ToString(i % 256) +
"." +
ToString(i >> 8 % 256) +
".1.1"};
247 addr.nTime = start_time + std::chrono::seconds{i};
248 addrman->Add({addr},
source);
250 AddressPosition addr_pos_multi = addrman->FindAddressEntry(addr).value();
262 uint32_t num_addrs{0};
266 while (num_addrs < 35) {
294 std::vector<CAddress> vAddr1 = addrman->GetAddr(0, 0, std::nullopt);
298 addr1.nTime = Now<NodeSeconds>();
300 addr2.nTime = Now<NodeSeconds>();
302 addr3.nTime = Now<NodeSeconds>();
304 addr4.nTime = Now<NodeSeconds>();
306 addr5.nTime = Now<NodeSeconds>();
311 BOOST_CHECK(addrman->Add({addr1, addr3, addr5}, source1));
312 BOOST_CHECK(addrman->Add({addr2, addr4}, source2));
325 for (
unsigned int i = 1; i < (8 * 256); i++) {
326 int octet1 = i % 256;
327 int octet2 = i >> 8 % 256;
332 addr.
nTime = Now<NodeSeconds>();
333 addrman->Add({addr},
ResolveIP(strAddr));
337 std::vector<CAddress> vAddr = addrman->GetAddr(2500, 23, std::nullopt);
339 size_t percent23 = (addrman->size() * 23) / 100;
373 std::set<int> buckets;
374 for (
int i = 0; i < 255; i++) {
379 buckets.insert(bucket);
386 for (
int j = 0; j < 255; j++) {
391 buckets.insert(bucket);
423 std::set<int> buckets;
424 for (
int i = 0; i < 255; i++) {
429 buckets.insert(bucket);
436 for (
int j = 0; j < 4 * 255; j++) {
442 buckets.insert(bucket);
449 for (
int p = 0; p < 255; p++) {
454 buckets.insert(bucket);
501 std::set<int> buckets;
502 for (
int j = 0; j < 255; j++) {
507 buckets.insert(bucket);
514 for (
int j = 0; j < 255; j++) {
519 buckets.insert(bucket);
554 std::set<int> buckets;
555 for (
int i = 0; i < 255; i++) {
560 buckets.insert(bucket);
567 for (
int j = 0; j < 4 * 255; j++) {
573 buckets.insert(bucket);
580 for (
int p = 0; p < 255; p++) {
585 buckets.insert(bucket);
592 for (
int p = 0; p < 255; p++) {
597 buckets.insert(bucket);
610 auto addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
611 auto addrman_asmap1_dup = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
619 addrman_asmap1->Add({addr}, default_source);
621 stream << *addrman_asmap1;
623 stream >> *addrman_asmap1_dup;
625 AddressPosition addr_pos1 = addrman_asmap1->FindAddressEntry(addr).value();
626 AddressPosition addr_pos2 = addrman_asmap1_dup->FindAddressEntry(addr).value();
633 stream << *addrman_asmap1;
634 stream >> *addrman_noasmap;
635 AddressPosition addr_pos3 = addrman_noasmap->FindAddressEntry(addr).value();
641 addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
643 addrman_noasmap->Add({addr}, default_source);
644 stream << *addrman_noasmap;
645 stream >> *addrman_asmap1;
647 AddressPosition addr_pos4 = addrman_asmap1->FindAddressEntry(addr).value();
653 addrman_asmap1 = std::make_unique<AddrMan>(netgroupman,
DETERMINISTIC, ratio);
657 addrman_noasmap->Add({addr,
addr2}, default_source);
661 stream << *addrman_noasmap;
662 stream >> *addrman_asmap1;
681 addrman->Add({new1, tried1, new2, tried2},
CNetAddr{});
682 addrman->Good(tried1);
683 addrman->Good(tried2);
684 BOOST_REQUIRE_EQUAL(addrman->size(), 4);
688 const std::string str{stream.str()};
691 const char new2_raw[]{6, 6, 6, 6};
692 const uint8_t new2_raw_replacement[]{0, 0, 0, 0};
693 pos = str.find(new2_raw, 0,
sizeof(new2_raw));
694 BOOST_REQUIRE(pos != std::string::npos);
695 BOOST_REQUIRE(pos +
sizeof(new2_raw_replacement) <= stream.size());
696 memcpy(stream.data() + pos, new2_raw_replacement,
sizeof(new2_raw_replacement));
698 const char tried2_raw[]{8, 8, 8, 8};
699 const uint8_t tried2_raw_replacement[]{255, 255, 255, 255};
700 pos = str.find(tried2_raw, 0,
sizeof(tried2_raw));
701 BOOST_REQUIRE(pos != std::string::npos);
702 BOOST_REQUIRE(pos +
sizeof(tried2_raw_replacement) <= stream.size());
703 memcpy(stream.data() + pos, tried2_raw_replacement,
sizeof(tried2_raw_replacement));
717 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
721 for (
unsigned int i = 1; i < 23; i++) {
727 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
732 for (
unsigned int i = 1; i < 23; i++) {
739 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
749 for (
unsigned int i = 1; i < 36; i++) {
761 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToString(),
"250.1.1.19:0");
766 addrman->ResolveCollisions();
767 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
770 for (
unsigned int i = 37; i < 59; i++) {
781 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToString(),
"250.1.1.10:0");
788 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() !=
"[::]:0");
791 addrman->ResolveCollisions();
792 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
802 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
806 for (
unsigned int i = 1; i < 36; i++) {
819 auto info = addrman->SelectTriedCollision().first;
825 addrman->Attempt(info,
false, Now<NodeSeconds>() - 61s);
828 addrman->ResolveCollisions();
829 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
838 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
844 BOOST_CHECK_EQUAL(addrman->SelectTriedCollision().first.ToString(),
"250.1.1.36:0");
848 addrman->ResolveCollisions();
849 BOOST_CHECK(addrman->SelectTriedCollision().first.ToString() ==
"[::]:0");
861 ssPeersIn << addrman;
885 bool exceptionThrown =
false;
890 unsigned char pchMsgTmp[4];
891 ssPeers1 >> pchMsgTmp;
892 ssPeers1 >> addrman1;
893 }
catch (
const std::exception&) {
894 exceptionThrown =
true;
915 unsigned char nVersion = 1;
917 s << ((
unsigned char)32);
940 bool exceptionThrown =
false;
944 unsigned char pchMsgTmp[4];
945 ssPeers1 >> pchMsgTmp;
946 ssPeers1 >> addrman1;
947 }
catch (
const std::exception&) {
948 exceptionThrown =
true;
969 const auto start_time{Now<NodeSeconds>() - 10000s};
970 addr.
nTime = start_time;
976 addr_diff_port.
nTime = start_time;
977 addrman->Connected(addr_diff_port);
979 std::vector<CAddress> vAddr1{addrman->GetAddr(0, 0, std::nullopt)};
985 addrman->Connected(addr);
987 std::vector<CAddress> vAddr2 = addrman->GetAddr(0, 0, std::nullopt);
989 BOOST_CHECK(vAddr2.at(0).nTime >= start_time + 10000s);
void ReadFromStream(AddrMan &addr, CDataStream &ssPeers)
Only used by tests.
#define BOOST_CHECK_THROW(stmt, excMatch)
bool LookupHost(const std::string &name, std::vector< CNetAddr > &vIP, unsigned int nMaxSolutions, bool fAllowLookup, DNSLookupFn dns_lookup_function)
Resolve a host string to its corresponding network addresses.
static const bool DETERMINISTIC
static CDataStream MakeCorruptPeersDat()
Double ended buffer combining vector and stream-like interfaces.
bool Lookup(const std::string &name, std::vector< CService > &vAddr, uint16_t portDefault, bool fAllowLookup, unsigned int nMaxSolutions, DNSLookupFn dns_lookup_function)
Resolve a service string to its corresponding service.
static CService ResolveService(const std::string &ip, uint16_t port=0)
BOOST_AUTO_TEST_CASE(addrman_simple)
Stochastic address manager.
std::chrono::time_point< NodeClock, std::chrono::seconds > NodeSeconds
void SetMockTime(int64_t nMockTimeIn)
DEPRECATED Use SetMockTime with chrono type.
std::string ToString(const T &t)
Locale-independent version of std::to_string.
NodeContext struct containing references to chain state and connection state.
static const std::string addr2
static unsigned const char asmap_raw[]
static const std::string addr1
static NetGroupManager EMPTY_NETGROUPMAN
A combination of a network address (CNetAddr) and a (TCP) port.
BOOST_AUTO_TEST_SUITE_END()
Extended statistics about a CAddress.
A CService with information about it as peer.
std::vector< unsigned char > GetKey() const
static CService ip(uint32_t i)
const CMessageHeader::MessageStartChars & MessageStart() const
int GetNewBucket(const uint256 &nKey, const CNetAddr &src, const NetGroupManager &netgroupman) const
Calculate in which "new" bucket this entry belongs, given a certain source.
NodeSeconds nTime
Always included in serialization. The behavior is unspecified if the value is not representable as ui...
static constexpr int ADDRMAN_NEW_BUCKET_COUNT
#define BOOST_CHECK_EQUAL(v1, v2)
const CChainParams & Params()
Return the currently selected parameters.
static const int PROTOCOL_VERSION
network protocol versioning
int64_t GetIntArg(const std::string &strArg, int64_t nDefault) const
Return integer argument or default value.
static CDataStream AddrmanToStream(const AddrMan &addrman)
static int32_t GetCheckRatio(const NodeContext &node_ctx)
Test-only struct, capturing info about an address in AddrMan.
static std::vector< bool > FromBytes(const unsigned char *source, int vector_size)
int64_t GetTime()
DEPRECATED, see GetTime.
int GetTriedBucket(const uint256 &nKey, const NetGroupManager &netgroupman) const
Calculate in which "tried" bucket this entry belongs.
static const int CLIENT_VERSION
bitcoind-res.rc includes this file, but it cannot cope with real c++ code.
static CNetAddr ResolveIP(const std::string &ip)
#define BOOST_CHECK(expr)