txreconciliation_tests.cpp raw

   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()
  86