@@ -1068,7 +1068,7 @@ BOOST_AUTO_TEST_CASE(load_addrman_corrupted)
1068
1068
1069
1069
BOOST_AUTO_TEST_CASE (addrman_update_address)
1070
1070
{
1071
- // Tests updating nTime via Connected() and nServices via SetServices()
1071
+ // Tests updating nTime via Connected() and nServices via SetServices() and Add()
1072
1072
auto addrman = std::make_unique<AddrMan>(EMPTY_NETGROUPMAN, DETERMINISTIC, GetCheckRatio (m_node));
1073
1073
CNetAddr source{ResolveIP (" 252.2.2.2" )};
1074
1074
CAddress addr{CAddress (ResolveService (" 250.1.1.1" , 8333 ), NODE_NONE)};
@@ -1095,6 +1095,32 @@ BOOST_AUTO_TEST_CASE(addrman_update_address)
1095
1095
BOOST_CHECK_EQUAL (vAddr2.size (), 1U );
1096
1096
BOOST_CHECK (vAddr2.at (0 ).nTime >= start_time + 10000s);
1097
1097
BOOST_CHECK_EQUAL (vAddr2.at (0 ).nServices , NODE_NETWORK_LIMITED);
1098
+
1099
+ // Updating an existing addr through Add() (used in gossip relay) can add additional services but can't remove existing ones.
1100
+ CAddress addr_v2{CAddress (ResolveService (" 250.1.1.1" , 8333 ), NODE_P2P_V2)};
1101
+ addr_v2.nTime = start_time;
1102
+ BOOST_CHECK (!addrman->Add ({addr_v2}, source));
1103
+ std::vector<CAddress> vAddr3{addrman->GetAddr (/* max_addresses=*/ 0 , /* max_pct=*/ 0 , /* network=*/ std::nullopt)};
1104
+ BOOST_CHECK_EQUAL (vAddr3.size (), 1U );
1105
+ BOOST_CHECK_EQUAL (vAddr3.at (0 ).nServices , NODE_P2P_V2 | NODE_NETWORK_LIMITED);
1106
+
1107
+ // SetServices() (used when we connected to them) overwrites existing service flags
1108
+ addrman->SetServices (addr, NODE_NETWORK);
1109
+ std::vector<CAddress> vAddr4{addrman->GetAddr (/* max_addresses=*/ 0 , /* max_pct=*/ 0 , /* network=*/ std::nullopt)};
1110
+ BOOST_CHECK_EQUAL (vAddr4.size (), 1U );
1111
+ BOOST_CHECK_EQUAL (vAddr4.at (0 ).nServices , NODE_NETWORK);
1112
+
1113
+ // Promoting to Tried does not affect the service flags
1114
+ BOOST_CHECK (addrman->Good (addr)); // addr has NODE_NONE
1115
+ std::vector<CAddress> vAddr5{addrman->GetAddr (/* max_addresses=*/ 0 , /* max_pct=*/ 0 , /* network=*/ std::nullopt)};
1116
+ BOOST_CHECK_EQUAL (vAddr5.size (), 1U );
1117
+ BOOST_CHECK_EQUAL (vAddr5.at (0 ).nServices , NODE_NETWORK);
1118
+
1119
+ // Adding service flags even works when the addr is in Tried
1120
+ BOOST_CHECK (!addrman->Add ({addr_v2}, source));
1121
+ std::vector<CAddress> vAddr6{addrman->GetAddr (/* max_addresses=*/ 0 , /* max_pct=*/ 0 , /* network=*/ std::nullopt)};
1122
+ BOOST_CHECK_EQUAL (vAddr6.size (), 1U );
1123
+ BOOST_CHECK_EQUAL (vAddr6.at (0 ).nServices , NODE_NETWORK | NODE_P2P_V2);
1098
1124
}
1099
1125
1100
1126
BOOST_AUTO_TEST_CASE (addrman_size)
0 commit comments