txreconciliation_tests.cpp
1 // Copyright (c) 2021-present The Bitcoin Core developers 2 // Distributed under the MIT software license, see the accompanying 3 // file COPYING or http://www.opensource.org/licenses/mit-license.php. 4 5 #include <node/txreconciliation.h> 6 7 #include <test/util/common.h> 8 #include <test/util/setup_common.h> 9 10 #include <boost/test/unit_test.hpp> 11 12 BOOST_FIXTURE_TEST_SUITE(txreconciliation_tests, BasicTestingSetup) 13 14 BOOST_AUTO_TEST_CASE(RegisterPeerTest) 15 { 16 TxReconciliationTracker tracker(TXRECONCILIATION_VERSION); 17 const uint64_t salt = 0; 18 19 // Prepare a peer for reconciliation. 20 tracker.PreRegisterPeer(0); 21 22 // Invalid version. 23 BOOST_CHECK_EQUAL(tracker.RegisterPeer(/*peer_id=*/0, /*is_peer_inbound=*/true, 24 /*peer_recon_version=*/0, salt), 25 ReconciliationRegisterResult::PROTOCOL_VIOLATION); 26 27 // Valid registration (inbound and outbound peers). 28 BOOST_REQUIRE(!tracker.IsPeerRegistered(0)); 29 BOOST_REQUIRE_EQUAL(tracker.RegisterPeer(0, true, 1, salt), ReconciliationRegisterResult::SUCCESS); 30 BOOST_CHECK(tracker.IsPeerRegistered(0)); 31 BOOST_REQUIRE(!tracker.IsPeerRegistered(1)); 32 tracker.PreRegisterPeer(1); 33 BOOST_REQUIRE(tracker.RegisterPeer(1, false, 1, salt) == ReconciliationRegisterResult::SUCCESS); 34 BOOST_CHECK(tracker.IsPeerRegistered(1)); 35 36 // Reconciliation version is higher than ours, should be able to register. 37 BOOST_REQUIRE(!tracker.IsPeerRegistered(2)); 38 tracker.PreRegisterPeer(2); 39 BOOST_REQUIRE(tracker.RegisterPeer(2, true, 2, salt) == ReconciliationRegisterResult::SUCCESS); 40 BOOST_CHECK(tracker.IsPeerRegistered(2)); 41 42 // Try registering for the second time. 43 BOOST_REQUIRE(tracker.RegisterPeer(1, false, 1, salt) == ReconciliationRegisterResult::ALREADY_REGISTERED); 44 45 // Do not register if there were no pre-registration for the peer. 46 BOOST_REQUIRE_EQUAL(tracker.RegisterPeer(100, true, 1, salt), ReconciliationRegisterResult::NOT_FOUND); 47 BOOST_CHECK(!tracker.IsPeerRegistered(100)); 48 } 49 50 BOOST_AUTO_TEST_CASE(ForgetPeerTest) 51 { 52 TxReconciliationTracker tracker(TXRECONCILIATION_VERSION); 53 NodeId peer_id0 = 0; 54 55 // Removing peer after pre-registering works and does not let to register the peer. 56 tracker.PreRegisterPeer(peer_id0); 57 tracker.ForgetPeer(peer_id0); 58 BOOST_CHECK_EQUAL(tracker.RegisterPeer(peer_id0, true, 1, 1), ReconciliationRegisterResult::NOT_FOUND); 59 60 // Removing peer after it is registered works. 61 tracker.PreRegisterPeer(peer_id0); 62 BOOST_REQUIRE(!tracker.IsPeerRegistered(peer_id0)); 63 BOOST_REQUIRE_EQUAL(tracker.RegisterPeer(peer_id0, true, 1, 1), ReconciliationRegisterResult::SUCCESS); 64 BOOST_CHECK(tracker.IsPeerRegistered(peer_id0)); 65 tracker.ForgetPeer(peer_id0); 66 BOOST_CHECK(!tracker.IsPeerRegistered(peer_id0)); 67 } 68 69 BOOST_AUTO_TEST_CASE(IsPeerRegisteredTest) 70 { 71 TxReconciliationTracker tracker(TXRECONCILIATION_VERSION); 72 NodeId peer_id0 = 0; 73 74 BOOST_REQUIRE(!tracker.IsPeerRegistered(peer_id0)); 75 tracker.PreRegisterPeer(peer_id0); 76 BOOST_REQUIRE(!tracker.IsPeerRegistered(peer_id0)); 77 78 BOOST_REQUIRE_EQUAL(tracker.RegisterPeer(peer_id0, true, 1, 1), ReconciliationRegisterResult::SUCCESS); 79 BOOST_CHECK(tracker.IsPeerRegistered(peer_id0)); 80 81 tracker.ForgetPeer(peer_id0); 82 BOOST_CHECK(!tracker.IsPeerRegistered(peer_id0)); 83 } 84 85 BOOST_AUTO_TEST_SUITE_END()