19 #include <boost/test/unit_test.hpp>
27 std::vector<bool> asmap = std::vector<bool>())
29 if (makeDeterministic) {
66 int nId = mapAddr[addr];
69 if (nId == vvNew[bucket][entry]) {
70 return std::pair<int, int>(bucket, entry);
74 return std::pair<int, int>(-1, -1);
81 int64_t nLastSuccess = 1;
82 Good_(addr,
true, nLastSuccess);
84 bool count_failure =
false;
86 Attempt(addr, count_failure, nLastTry);
100 static CNetAddr ResolveIP(
const std::string&
ip)
107 static CService ResolveService(
const std::string&
ip,
const int port = 0)
110 BOOST_CHECK_MESSAGE(
Lookup(
ip, serv, port,
false),
strprintf(
"failed to resolve: %s:%i",
ip, port));
115 static std::vector<bool> FromBytes(
const unsigned char*
source,
int vector_size) {
116 std::vector<bool> result(vector_size);
117 for (
int byte_i = 0; byte_i < vector_size / 8; ++byte_i) {
118 unsigned char cur_byte =
source[byte_i];
119 for (
int bit_i = 0; bit_i < 8; ++bit_i) {
120 result[byte_i * 8 + bit_i] = (cur_byte >> bit_i) & 1;
141 CService addr1 = ResolveService(
"250.1.1.1", 8333);
149 CService addr1_dup = ResolveService(
"250.1.1.1", 8333);
159 CService addr2 = ResolveService(
"250.1.1.2", 8333);
179 CService addr1 = ResolveService(
"250.1.1.1", 8333);
183 CService addr1_port = ResolveService(
"250.1.1.1", 8334);
206 CService addr1 = ResolveService(
"250.1.1.1", 8333);
227 CService addr2 = ResolveService(
"250.3.1.1", 8333);
228 CService addr3 = ResolveService(
"250.3.2.2", 9999);
229 CService addr4 = ResolveService(
"250.3.3.3", 9999);
236 CService addr5 = ResolveService(
"250.4.4.4", 8333);
237 CService addr6 = ResolveService(
"250.4.5.5", 7777);
238 CService addr7 = ResolveService(
"250.4.6.6", 8333);
251 std::set<uint16_t> ports;
252 for (
int i = 0; i < 20; ++i) {
266 for (
unsigned int i = 1; i < 18; i++) {
267 CService addr = ResolveService(
"250.1.1." + std::to_string(i));
275 CService addr1 = ResolveService(
"250.1.1.18");
279 CService addr2 = ResolveService(
"250.1.1.19");
292 for (
unsigned int i = 1; i < 80; i++) {
293 CService addr = ResolveService(
"250.1.1." + std::to_string(i));
298 BOOST_TEST_MESSAGE(addrman.
size());
303 CService addr1 = ResolveService(
"250.1.1.80");
307 CService addr2 = ResolveService(
"250.1.1.81");
322 CNetAddr source1 = ResolveIP(
"250.1.2.1");
323 CNetAddr source2 = ResolveIP(
"250.1.2.2");
325 addrman.
Add(addr1, source1);
326 addrman.
Add(addr2, source2);
327 addrman.
Add(addr3, source1);
355 CNetAddr source1 = ResolveIP(
"250.1.2.1");
375 CNetAddr source1 = ResolveIP(
"250.1.2.1");
378 addrman.
Create(addr1, source1, &nId);
395 std::vector<CAddress> vAddr1 = addrman.
GetAddr( 0, 0, nullopt);
408 CNetAddr source1 = ResolveIP(
"250.1.2.1");
409 CNetAddr source2 = ResolveIP(
"250.2.3.3");
412 addrman.
Add(addr1, source1);
413 addrman.
Add(addr2, source2);
414 addrman.
Add(addr3, source1);
415 addrman.
Add(addr4, source2);
416 addrman.
Add(addr5, source1);
429 for (
unsigned int i = 1; i < (8 * 256); i++) {
430 int octet1 = i % 256;
431 int octet2 = (i / 256) % 256;
432 int octet3 = (i / (256 * 2)) % 256;
433 std::string strAddr = std::to_string(octet1) +
"." + std::to_string(octet2) +
"." + std::to_string(octet3) +
".23";
438 addrman.
Add(addr, ResolveIP(strAddr));
442 std::vector<CAddress> vAddr = addrman.
GetAddr( 2500, 23, nullopt);
444 size_t percent23 = (addrman.
size() * 23) / 100;
459 CNetAddr source1 = ResolveIP(
"250.1.1.1");
467 std::vector<bool> asmap;
482 std::set<int> buckets;
483 for (
int i = 0; i < 255; i++) {
486 ResolveIP(
"250.1.1." + std::to_string(i)));
488 buckets.insert(bucket);
495 for (
int j = 0; j < 255; j++) {
498 ResolveIP(
"250." + std::to_string(j) +
".1.1"));
500 buckets.insert(bucket);
514 CNetAddr source1 = ResolveIP(
"250.1.2.1");
521 std::vector<bool> asmap;
536 std::set<int> buckets;
537 for (
int i = 0; i < 255; i++) {
540 ResolveIP(
"250.1.1." + std::to_string(i)));
542 buckets.insert(bucket);
549 for (
int j = 0; j < 4 * 255; j++) {
552 std::to_string(250 + (j / 255)) +
"." + std::to_string(j % 256) +
".1.1"),
NODE_NONE),
553 ResolveIP(
"251.4.1.1"));
555 buckets.insert(bucket);
562 for (
int p = 0; p < 255; p++) {
565 ResolveIP(
"250." + std::to_string(p) +
".1.1"));
567 buckets.insert(bucket);
592 CNetAddr source1 = ResolveIP(
"250.1.1.1");
600 std::vector<bool> asmap = FromBytes(asmap_raw,
sizeof(asmap_raw) * 8);
615 std::set<int> buckets;
616 for (
int j = 0; j < 255; j++) {
619 ResolveIP(
"101." + std::to_string(j) +
".1.1"));
621 buckets.insert(bucket);
628 for (
int j = 0; j < 255; j++) {
631 ResolveIP(
"250." + std::to_string(j) +
".1.1"));
633 buckets.insert(bucket);
647 CNetAddr source1 = ResolveIP(
"250.1.2.1");
654 std::vector<bool> asmap = FromBytes(asmap_raw,
sizeof(asmap_raw) * 8);
669 std::set<int> buckets;
670 for (
int i = 0; i < 255; i++) {
673 ResolveIP(
"250.1.1." + std::to_string(i)));
675 buckets.insert(bucket);
682 for (
int j = 0; j < 4 * 255; j++) {
685 std::to_string(250 + (j / 255)) +
"." + std::to_string(j % 256) +
".1.1"),
NODE_NONE),
686 ResolveIP(
"251.4.1.1"));
688 buckets.insert(bucket);
695 for (
int p = 0; p < 255; p++) {
698 ResolveIP(
"101." + std::to_string(p) +
".1.1"));
700 buckets.insert(bucket);
707 for (
int p = 0; p < 255; p++) {
710 ResolveIP(
"250." + std::to_string(p) +
".1.1"));
712 buckets.insert(bucket);
722 std::vector<bool> asmap1 = FromBytes(asmap_raw,
sizeof(asmap_raw) * 8);
733 addrman_asmap1.
Add(addr, default_source);
735 stream << addrman_asmap1;
737 stream >> addrman_asmap1_dup;
739 std::pair<int, int> bucketAndEntry_asmap1 = addrman_asmap1.
GetBucketAndEntry(addr);
740 std::pair<int, int> bucketAndEntry_asmap1_dup = addrman_asmap1_dup.
GetBucketAndEntry(addr);
742 BOOST_CHECK(bucketAndEntry_asmap1_dup.second != -1);
744 BOOST_CHECK(bucketAndEntry_asmap1.first == bucketAndEntry_asmap1_dup.first);
745 BOOST_CHECK(bucketAndEntry_asmap1.second == bucketAndEntry_asmap1_dup.second);
748 stream << addrman_asmap1;
749 stream >> addrman_noasmap;
750 std::pair<int, int> bucketAndEntry_noasmap = addrman_noasmap.
GetBucketAndEntry(addr);
752 BOOST_CHECK(bucketAndEntry_asmap1.first != bucketAndEntry_noasmap.first);
753 BOOST_CHECK(bucketAndEntry_asmap1.second != bucketAndEntry_noasmap.second);
756 addrman_asmap1.
Clear();
757 addrman_noasmap.
Clear();
758 addrman_noasmap.
Add(addr, default_source);
759 stream << addrman_noasmap;
760 stream >> addrman_asmap1;
761 std::pair<int, int> bucketAndEntry_asmap1_deser = addrman_asmap1.
GetBucketAndEntry(addr);
762 BOOST_CHECK(bucketAndEntry_asmap1_deser.second != -1);
763 BOOST_CHECK(bucketAndEntry_asmap1_deser.first != bucketAndEntry_noasmap.first);
764 BOOST_CHECK(bucketAndEntry_asmap1_deser.first == bucketAndEntry_asmap1_dup.first);
765 BOOST_CHECK(bucketAndEntry_asmap1_deser.second == bucketAndEntry_asmap1_dup.second);
768 addrman_asmap1.
Clear();
769 addrman_noasmap.
Clear();
772 addrman_noasmap.
Add(addr, default_source);
773 addrman_noasmap.
Add(addr2, default_source);
774 std::pair<int, int> bucketAndEntry_noasmap_addr1 = addrman_noasmap.
GetBucketAndEntry(addr1);
775 std::pair<int, int> bucketAndEntry_noasmap_addr2 = addrman_noasmap.
GetBucketAndEntry(addr2);
776 BOOST_CHECK(bucketAndEntry_noasmap_addr1.first != bucketAndEntry_noasmap_addr2.first);
777 BOOST_CHECK(bucketAndEntry_noasmap_addr1.second != bucketAndEntry_noasmap_addr2.second);
778 stream << addrman_noasmap;
779 stream >> addrman_asmap1;
780 std::pair<int, int> bucketAndEntry_asmap1_deser_addr1 = addrman_asmap1.
GetBucketAndEntry(addr1);
781 std::pair<int, int> bucketAndEntry_asmap1_deser_addr2 = addrman_asmap1.
GetBucketAndEntry(addr2);
782 BOOST_CHECK(bucketAndEntry_asmap1_deser_addr1.first == bucketAndEntry_asmap1_deser_addr2.first);
783 BOOST_CHECK(bucketAndEntry_asmap1_deser_addr1.second != bucketAndEntry_asmap1_deser_addr2.second);
798 for (
unsigned int i = 1; i < 23; i++) {
799 CService addr = ResolveService(
"250.1.1."+std::to_string(i));
809 for (
unsigned int i = 1; i < 23; i++) {
810 CService addr = ResolveService(
"250.1.1."+std::to_string(i));
825 for (
unsigned int i = 1; i < 23; i++) {
826 CService addr = ResolveService(
"250.1.1."+std::to_string(i));
836 CService addr23 = ResolveService(
"250.1.1.23");
838 addrman.
Good(addr23);
848 for (
unsigned int i = 24; i < 33; i++) {
849 CService addr = ResolveService(
"250.1.1."+std::to_string(i));
858 CService addr33 = ResolveService(
"250.1.1.33");
860 addrman.
Good(addr33);
867 addrman.
Good(addr23);
886 for (
unsigned int i = 1; i < 23; i++) {
887 CService addr = ResolveService(
"250.1.1."+std::to_string(i));
897 CService addr = ResolveService(
"250.1.1.23");
919 CService addr19 = ResolveService(
"250.1.1.19");
921 addrman.
Good(addr19);
#define ADDRMAN_BUCKET_SIZE
#define ADDRMAN_NEW_BUCKET_COUNT
BOOST_AUTO_TEST_CASE(addrman_simple)
Extended statistics about a CAddress.
int GetTriedBucket(const uint256 &nKey, const std::vector< bool > &asmap) const
Calculate in which "tried" bucket this entry belongs.
int GetNewBucket(const uint256 &nKey, const CNetAddr &src, const std::vector< bool > &asmap) const
Calculate in which "new" bucket this entry belongs, given a certain source.
Stochastical (IP) address manager.
bool Add(const CAddress &addr, const CNetAddr &source, int64_t nTimePenalty=0)
Add a single address.
void Delete(int nId) EXCLUSIVE_LOCKS_REQUIRED(cs)
Delete an entry. It must not be in tried, and have refcount 0.
FastRandomContext insecure_rand
Source of random numbers for randomization in inner loops.
CAddrInfo * Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs)
find an entry, creating it if necessary.
size_t size() const
Return the number of (unique) addresses in all tables.
void Attempt(const CService &addr, bool fCountFailure, int64_t nTime=GetAdjustedTime())
Mark an entry as connection attempted to.
CAddrInfo Select(bool newOnly=false)
Choose an address to connect to.
RecursiveMutex cs
critical section to protect the inner data structures
void ResolveCollisions()
See if any to-be-evicted tried table entries have been tested and if so resolve the collisions.
CAddrInfo SelectTriedCollision()
Randomly select an address in tried that another address is attempting to evict.
CAddrInfo * Find(const CNetAddr &addr, int *pnId=nullptr) EXCLUSIVE_LOCKS_REQUIRED(cs)
Find an entry.
std::vector< bool > m_asmap
void Good_(const CService &addr, bool test_before_evict, int64_t time) EXCLUSIVE_LOCKS_REQUIRED(cs)
Mark an entry "good", possibly moving it from "new" to "tried".
void Good(const CService &addr, bool test_before_evict=true, int64_t nTime=GetAdjustedTime())
Mark an entry as accessible.
uint256 nKey
secret key to randomize bucket select with
std::vector< CAddress > GetAddr(size_t max_addresses, size_t max_pct, Optional< Network > network)
Return all or many randomly selected addresses, optionally by network.
void SimConnFail(CService &addr)
void MakeDeterministic()
Ensure that bucket placement is always the same for testing purposes.
std::pair< int, int > GetBucketAndEntry(const CAddress &addr)
CAddrInfo * Create(const CAddress &addr, const CNetAddr &addrSource, int *pnId=nullptr)
CAddrInfo * Find(const CNetAddr &addr, int *pnId=nullptr)
CAddrManTest(bool makeDeterministic=true, std::vector< bool > asmap=std::vector< bool >())
A CService with information about it as peer.
uint32_t nTime
Always included in serialization, except in the network format on INIT_PROTO_VERSION.
A writer stream (for serialization) that computes a 256-bit hash.
A combination of a network address (CNetAddr) and a (TCP) port.
std::string ToString() const
std::vector< unsigned char > GetKey() const
BOOST_AUTO_TEST_SUITE_END()
bool Lookup(const std::string &name, std::vector< CService > &vAddr, int portDefault, bool fAllowLookup, unsigned int nMaxSolutions)
bool LookupHost(const std::string &name, std::vector< CNetAddr > &vIP, unsigned int nMaxSolutions, bool fAllowLookup)
#define BOOST_FIXTURE_TEST_SUITE(a, b)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
int64_t GetAdjustedTime()