16#include <boost/test/unit_test.hpp>
35constexpr std::chrono::microseconds
MIN_TIME = std::chrono::microseconds::min();
36constexpr std::chrono::microseconds
MAX_TIME = std::chrono::microseconds::max();
37constexpr std::chrono::microseconds
MICROSECOND = std::chrono::microseconds{1};
38constexpr std::chrono::microseconds
NO_TIME = std::chrono::microseconds{0};
41using Action = std::pair<std::chrono::microseconds, std::function<
void()>>;
53 std::vector<Action> actions;
56 std::set<NodeId> peerset;
59 std::set<uint256> txhashset;
64 std::multiset<std::pair<NodeId, GenTxid>> expired;
67std::chrono::microseconds TxRequestTest::RandomTime8s() {
return std::chrono::microseconds{1 + m_rng.randbits(23)}; }
68std::chrono::microseconds TxRequestTest::RandomTime1y() {
return std::chrono::microseconds{1 + m_rng.randbits(45)}; }
83 std::chrono::microseconds m_now;
84 std::string m_testname;
98 assert(amount.count() >= 0);
108 runner.txrequest.SanityCheck();
118 runner.txrequest.SanityCheck();
123 void DisconnectedPeer(
NodeId peer)
127 runner.txrequest.DisconnectedPeer(peer);
128 runner.txrequest.SanityCheck();
138 runner.txrequest.SanityCheck();
148 runner.txrequest.SanityCheck();
165 std::chrono::microseconds offset = std::chrono::microseconds{0})
167 const auto comment = m_testname +
" " +
checkname;
169 const auto now = m_now;
170 assert(offset.count() <= 0);
172 std::vector<std::pair<NodeId, GenTxid>>
expired_now;
175 runner.expired.insert(entry);
177 runner.txrequest.SanityCheck();
178 runner.txrequest.PostGetRequestableSanityCheck(now + offset);
199 auto it =
runner.expired.find(std::pair<NodeId, GenTxid>{peer,
gtxid});
201 if (it !=
runner.expired.end())
runner.expired.erase(it);
220 for (
const auto& order :
orders) {
221 for (
size_t pos = 1; pos < order.size(); ++pos) {
232 ok = m_runner.txhashset.insert(
ret).second;
253 ok = m_runner.peerset.insert(
ret).second;
258 std::chrono::microseconds
Now()
const {
return m_now; }
265void TxRequestTest::BuildSingleTest(Scenario&
scenario,
int config)
280 scenario.Check(peer, {}, 1, 0, 0,
"s2");
282 scenario.Check(peer, {}, 1, 0, 0,
"s3");
292 scenario.Check(peer, {}, 0, 1, 0,
"s6");
294 if ((config >> 3) == 1) {
296 scenario.Check(peer, {}, 0, 1, 0,
"s7");
298 scenario.Check(peer, {}, 0, 0, 0,
"s8");
302 scenario.AdvanceTime(std::chrono::microseconds{m_rng.
randrange(expiry.count())});
303 scenario.Check(peer, {}, 0, 1, 0,
"s9");
304 if ((config >> 3) == 3) {
306 scenario.Check(peer, {}, 0, 0, 0,
"s10");
317 scenario.Check(peer, {}, 0, 0, 0,
"s11");
325void TxRequestTest::BuildPriorityTest(Scenario&
scenario,
int config)
333 bool prio1 = config & 1;
387void TxRequestTest::BuildBigPriorityTest(Scenario&
scenario,
int peers)
396 for (
int i = 0; i <
num_pref; ++i) {
420 std::map<NodeId, std::chrono::microseconds>
reqtimes;
422 for (
int i = peers - 1; i >= 0; --i) {
432 scenario.Check(peer, {}, 1, 0, 0,
"b1");
437 for (
int i = peers - 1; i >= 0; --i) {
446 for (
int i = 0; i < peers; ++i) {
453 scenario.Check(peer, {}, 0, 0, 0,
"b4");
465 scenario.Check(peer, {}, 0, 0, 0,
"b7");
474void TxRequestTest::BuildRequestOrderTest(Scenario&
scenario,
int config)
490 scenario.Check(peer, {}, 2, 0, 0,
"o1");
501 scenario.Check(peer, {}, 0, 0, 0,
"o5");
509void TxRequestTest::BuildWtxidTest(Scenario&
scenario,
int config)
579void TxRequestTest::BuildTimeBackwardsTest(Scenario&
scenario)
625void TxRequestTest::BuildWeirdRequestsTest(Scenario&
scenario)
702void TxRequestTest::TestInterleavedScenarios()
707 for (
int n = 0; n < 64; ++n) {
735 std::stable_sort(
runner.actions.begin(),
runner.actions.end(), [](
const Action&
a1,
const Action&
a2) {
736 return a1.first < a2.first;
754 for (
int i = 0; i < 5; ++i) {
I randrange(I range) noexcept
Generate a random integer in the range [0..range), with range > 0.
uint256 rand256() noexcept
generate a random uint256.
bool randbool() noexcept
Generate a random boolean.
uint64_t randbits(int bits) noexcept
Generate a random (bits)-bit integer.
Data structure to keep track of, and schedule, transaction downloads from peers.
uint64_t ComputePriority(const uint256 &txhash, NodeId peer, bool preferred) const
Access to the internal priority computation (testing only)
static transaction_identifier FromUint256(const uint256 &id)
BOOST_FIXTURE_TEST_SUITE(cuckoocache_tests, BasicTestingSetup)
Test Suite for CuckooCache.
BOOST_AUTO_TEST_SUITE_END()
BOOST_AUTO_TEST_CASE(ipc_tests)
#define BOOST_CHECK_EQUAL(v1, v2)
#define BOOST_CHECK(expr)
T Now()
Return the current time point cast to the given precision.
constexpr auto Ticks(Dur2 d)
Helper to count the seconds of a duration/time_point.