/ src / test / txreconciliation_tests.cpp
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()