|
2 | 2 | // Distributed under the MIT software license, see the accompanying
|
3 | 3 | // file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
4 | 4 | #include <addrman.h>
|
| 5 | +#include <i2p.h> |
5 | 6 | #include <test/data/asmap.raw.h>
|
6 | 7 | #include <test/util/setup_common.h>
|
7 | 8 | #include <util/asmap.h>
|
@@ -966,5 +967,121 @@ BOOST_AUTO_TEST_CASE(addrman_evictionworks)
|
966 | 967 | BOOST_CHECK(addrman.SelectTriedCollision().ToString() == "[::]:0");
|
967 | 968 | }
|
968 | 969 |
|
| 970 | +BOOST_AUTO_TEST_CASE(reset_i2p_ports) |
| 971 | +{ |
| 972 | + CAddrManTest addrman1; |
| 973 | + CAddrManTest addrman2; |
| 974 | + const uint32_t good_time{static_cast<uint32_t>(GetAdjustedTime())}; |
| 975 | + constexpr uint16_t port = 8333; |
| 976 | + |
| 977 | + // Has its port changed, will be re-positioned within the same bucket in vvNew. |
| 978 | + const CAddress i2p_new1{ |
| 979 | + ResolveService("72l3ucjkuscrbiiepoehuwqgknyzgo7zuix5ty4puwrkyhtmnsga.b32.i2p", port), |
| 980 | + NODE_NONE, |
| 981 | + good_time}; |
| 982 | + |
| 983 | + // Has its port changed, will not be re-positioned in vvNew because ports 0 and 10075 result in |
| 984 | + // the same bucket position. |
| 985 | + const CAddress i2p_new2{ |
| 986 | + ResolveService("gehtac45oaghz54ypyopim64mql7oad2bqclla74l6tfeolzmodq.b32.i2p", 10075), |
| 987 | + NODE_NONE, |
| 988 | + good_time}; |
| 989 | + |
| 990 | + // Remains unchanged, port is already as it should be. |
| 991 | + const CAddress i2p_new3{ |
| 992 | + ResolveService("c4gfnttsuwqomiygupdqqqyy5y5emnk5c73hrfvatri67prd7vyq.b32.i2p", |
| 993 | + I2P_SAM31_PORT), |
| 994 | + NODE_NONE, |
| 995 | + good_time}; |
| 996 | + |
| 997 | + // Has its port changed, re-positioning in vvNew will cause i2p_new3 to be evicted. |
| 998 | + const CAddress i2p_new4{ |
| 999 | + ResolveService("c4cbbkn46qxftwja53pxiykntegfyfjqtnzbm6iv6r5mungmqgmq.b32.i2p", port), |
| 1000 | + NODE_NONE, |
| 1001 | + good_time}; |
| 1002 | + |
| 1003 | + // Remains unchanged. |
| 1004 | + const CAddress ipv4_new{ResolveService("1.2.3.4", port), NODE_NONE, good_time}; |
| 1005 | + |
| 1006 | + // Has its port changed, will be re-positioned in vvTried. |
| 1007 | + const CAddress i2p_tried1{ |
| 1008 | + ResolveService("h3r6bkn46qxftwja53pxiykntegfyfjqtnzbm6iv6r5mungmqgmq.b32.i2p", port), |
| 1009 | + NODE_NONE, |
| 1010 | + good_time}; |
| 1011 | + |
| 1012 | + // Has its port changed, will not be re-positioned in vvTried because ports 0 and 10537 |
| 1013 | + // result in the same position (bucket, i). |
| 1014 | + const CAddress i2p_tried2{ |
| 1015 | + ResolveService("pjs7or2ctvteeo5tu4bwyrtydeuhqhvdprtujn4daxr75jpebjxa.b32.i2p", 10537), |
| 1016 | + NODE_NONE, |
| 1017 | + good_time}; |
| 1018 | + |
| 1019 | + // Remains unchanged, port is already as it should be. |
| 1020 | + const CAddress i2p_tried3{ |
| 1021 | + ResolveService("hnbbyjpxx54623l555sta7pocy3se4sdgmuebi5k6reesz5rjp6q.b32.i2p", |
| 1022 | + I2P_SAM31_PORT), |
| 1023 | + NODE_NONE, |
| 1024 | + good_time}; |
| 1025 | + |
| 1026 | + // Has its port changed, re-positioning in vvTried will cause i2p_tried3 to be moved to vvNew. |
| 1027 | + const CAddress i2p_tried4{ |
| 1028 | + ResolveService("hna37nqr3ahkqv62cuqfwgtneekvvpnuc4i4f6yo7tpoqjswvcwa.b32.i2p", port), |
| 1029 | + NODE_NONE, |
| 1030 | + good_time}; |
| 1031 | + |
| 1032 | + // Remains unchanged. |
| 1033 | + const CAddress ipv4_tried{ResolveService("2.3.4.5", port), NODE_NONE, good_time}; |
| 1034 | + |
| 1035 | + const CNetAddr source; |
| 1036 | + |
| 1037 | + CDataStream stream(SER_NETWORK, PROTOCOL_VERSION); |
| 1038 | + |
| 1039 | + addrman1.Add(i2p_new1, source); |
| 1040 | + addrman1.Add(i2p_new2, source); |
| 1041 | + addrman1.Add(i2p_new3, source); |
| 1042 | + addrman1.Add(i2p_new4, source); |
| 1043 | + addrman1.Add(ipv4_new, source); |
| 1044 | + |
| 1045 | + addrman1.Add(i2p_tried1, source); |
| 1046 | + addrman1.Good(i2p_tried1); |
| 1047 | + addrman1.Add(i2p_tried2, source); |
| 1048 | + addrman1.Good(i2p_tried2); |
| 1049 | + addrman1.Add(i2p_tried3, source); |
| 1050 | + addrman1.Good(i2p_tried3); |
| 1051 | + addrman1.Add(i2p_tried4, source); |
| 1052 | + addrman1.Good(i2p_tried4); |
| 1053 | + addrman1.Add(ipv4_tried, source); |
| 1054 | + addrman1.Good(ipv4_tried); |
| 1055 | + |
| 1056 | + stream << addrman1; |
| 1057 | + stream >> addrman2; |
| 1058 | + |
| 1059 | + const size_t max_addresses{0}; |
| 1060 | + const size_t max_pct{0}; |
| 1061 | + |
| 1062 | + auto addresses = addrman2.GetAddr(max_addresses, max_pct, NET_I2P); |
| 1063 | + BOOST_REQUIRE_EQUAL(addresses.size(), 7UL); |
| 1064 | + std::sort(addresses.begin(), addresses.end()); // Just some deterministic order. |
| 1065 | + BOOST_CHECK_EQUAL(addresses[0].ToStringIP(), i2p_new4.ToStringIP()); |
| 1066 | + BOOST_CHECK_EQUAL(addresses[0].GetPort(), I2P_SAM31_PORT); |
| 1067 | + BOOST_CHECK_EQUAL(addresses[1].ToStringIP(), i2p_new2.ToStringIP()); |
| 1068 | + BOOST_CHECK_EQUAL(addresses[1].GetPort(), I2P_SAM31_PORT); |
| 1069 | + BOOST_CHECK_EQUAL(addresses[2].ToStringIP(), i2p_tried4.ToStringIP()); |
| 1070 | + BOOST_CHECK_EQUAL(addresses[2].GetPort(), I2P_SAM31_PORT); |
| 1071 | + BOOST_CHECK_EQUAL(addresses[3].ToStringIP(), i2p_tried3.ToStringIP()); |
| 1072 | + BOOST_CHECK_EQUAL(addresses[3].GetPort(), I2P_SAM31_PORT); |
| 1073 | + BOOST_CHECK_EQUAL(addresses[4].ToStringIP(), i2p_tried1.ToStringIP()); |
| 1074 | + BOOST_CHECK_EQUAL(addresses[4].GetPort(), I2P_SAM31_PORT); |
| 1075 | + BOOST_CHECK_EQUAL(addresses[5].ToStringIP(), i2p_tried2.ToStringIP()); |
| 1076 | + BOOST_CHECK_EQUAL(addresses[5].GetPort(), I2P_SAM31_PORT); |
| 1077 | + BOOST_CHECK_EQUAL(addresses[6].ToStringIP(), i2p_new1.ToStringIP()); |
| 1078 | + BOOST_CHECK_EQUAL(addresses[6].GetPort(), I2P_SAM31_PORT); |
| 1079 | + |
| 1080 | + addresses = addrman2.GetAddr(max_addresses, max_pct, NET_IPV4); |
| 1081 | + BOOST_REQUIRE_EQUAL(addresses.size(), 2UL); |
| 1082 | + std::sort(addresses.begin(), addresses.end()); // Just some deterministic order. |
| 1083 | + BOOST_CHECK_EQUAL(addresses[0].ToStringIPPort(), ipv4_new.ToStringIPPort()); |
| 1084 | + BOOST_CHECK_EQUAL(addresses[1].ToStringIPPort(), ipv4_tried.ToStringIPPort()); |
| 1085 | +} |
969 | 1086 |
|
970 | 1087 | BOOST_AUTO_TEST_SUITE_END()
|
0 commit comments