txreconciliation_tests.cpp raw

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