mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-02-02 09:46:52 -05:00
test: refactor: Pass rng parameters to test functions
Add FastRandomContext parameter to the utility function AddTestCoin(), and a few local test functions and classes.
This commit is contained in:
parent
fa19af555d
commit
68f77dd21e
12 changed files with 58 additions and 40 deletions
|
@ -35,10 +35,13 @@ bool operator==(const Coin &a, const Coin &b) {
|
||||||
|
|
||||||
class CCoinsViewTest : public CCoinsView
|
class CCoinsViewTest : public CCoinsView
|
||||||
{
|
{
|
||||||
|
FastRandomContext& m_rng;
|
||||||
uint256 hashBestBlock_;
|
uint256 hashBestBlock_;
|
||||||
std::map<COutPoint, Coin> map_;
|
std::map<COutPoint, Coin> map_;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
CCoinsViewTest(FastRandomContext& rng) : m_rng{rng} {}
|
||||||
|
|
||||||
[[nodiscard]] bool GetCoin(const COutPoint& outpoint, Coin& coin) const override
|
[[nodiscard]] bool GetCoin(const COutPoint& outpoint, Coin& coin) const override
|
||||||
{
|
{
|
||||||
std::map<COutPoint, Coin>::const_iterator it = map_.find(outpoint);
|
std::map<COutPoint, Coin>::const_iterator it = map_.find(outpoint);
|
||||||
|
@ -283,7 +286,7 @@ void SimulationTest(CCoinsView* base, bool fake_best_block)
|
||||||
// Run the above simulation for multiple base types.
|
// Run the above simulation for multiple base types.
|
||||||
BOOST_FIXTURE_TEST_CASE(coins_cache_simulation_test, CacheTest)
|
BOOST_FIXTURE_TEST_CASE(coins_cache_simulation_test, CacheTest)
|
||||||
{
|
{
|
||||||
CCoinsViewTest base;
|
CCoinsViewTest base{m_rng};
|
||||||
SimulationTest(&base, false);
|
SimulationTest(&base, false);
|
||||||
|
|
||||||
CCoinsViewDB db_base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
|
CCoinsViewDB db_base{{.path = "test", .cache_bytes = 1 << 23, .memory_only = true}, {}};
|
||||||
|
@ -322,7 +325,7 @@ BOOST_FIXTURE_TEST_CASE(updatecoins_simulation_test, UpdateTest)
|
||||||
std::map<COutPoint, Coin> result;
|
std::map<COutPoint, Coin> result;
|
||||||
|
|
||||||
// The cache stack.
|
// The cache stack.
|
||||||
CCoinsViewTest base; // A CCoinsViewTest at the bottom.
|
CCoinsViewTest base{m_rng}; // A CCoinsViewTest at the bottom.
|
||||||
std::vector<std::unique_ptr<CCoinsViewCacheTest>> stack; // A stack of CCoinsViewCaches on top.
|
std::vector<std::unique_ptr<CCoinsViewCacheTest>> stack; // A stack of CCoinsViewCaches on top.
|
||||||
stack.push_back(std::make_unique<CCoinsViewCacheTest>(&base)); // Start with one cache.
|
stack.push_back(std::make_unique<CCoinsViewCacheTest>(&base)); // Start with one cache.
|
||||||
|
|
||||||
|
|
|
@ -309,7 +309,7 @@ void test_cache_generations()
|
||||||
// immediately and never uses the other half.
|
// immediately and never uses the other half.
|
||||||
struct block_activity {
|
struct block_activity {
|
||||||
std::vector<uint256> reads;
|
std::vector<uint256> reads;
|
||||||
block_activity(uint32_t n_insert, Cache& c) : reads()
|
block_activity(uint32_t n_insert, FastRandomContext& rng, Cache& c)
|
||||||
{
|
{
|
||||||
std::vector<uint256> inserts;
|
std::vector<uint256> inserts;
|
||||||
inserts.resize(n_insert);
|
inserts.resize(n_insert);
|
||||||
|
@ -317,7 +317,7 @@ void test_cache_generations()
|
||||||
for (uint32_t i = 0; i < n_insert; ++i) {
|
for (uint32_t i = 0; i < n_insert; ++i) {
|
||||||
uint32_t* ptr = (uint32_t*)inserts[i].begin();
|
uint32_t* ptr = (uint32_t*)inserts[i].begin();
|
||||||
for (uint8_t j = 0; j < 8; ++j)
|
for (uint8_t j = 0; j < 8; ++j)
|
||||||
*(ptr++) = InsecureRand32();
|
*(ptr++) = rng.rand32();
|
||||||
}
|
}
|
||||||
for (uint32_t i = 0; i < n_insert / 4; ++i)
|
for (uint32_t i = 0; i < n_insert / 4; ++i)
|
||||||
reads.push_back(inserts[i]);
|
reads.push_back(inserts[i]);
|
||||||
|
@ -351,7 +351,7 @@ void test_cache_generations()
|
||||||
for (uint32_t i = 0; i < total; ++i) {
|
for (uint32_t i = 0; i < total; ++i) {
|
||||||
if (last_few.size() == WINDOW_SIZE)
|
if (last_few.size() == WINDOW_SIZE)
|
||||||
last_few.pop_front();
|
last_few.pop_front();
|
||||||
last_few.emplace_back(BLOCK_SIZE, set);
|
last_few.emplace_back(BLOCK_SIZE, m_rng, set);
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
for (auto& act : last_few)
|
for (auto& act : last_few)
|
||||||
for (uint32_t k = 0; k < POP_AMOUNT; ++k) {
|
for (uint32_t k = 0; k < POP_AMOUNT; ++k) {
|
||||||
|
|
|
@ -1011,10 +1011,10 @@ BOOST_AUTO_TEST_CASE(advertise_local_address)
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
CKey GenerateRandomTestKey() noexcept
|
CKey GenerateRandomTestKey(FastRandomContext& rng) noexcept
|
||||||
{
|
{
|
||||||
CKey key;
|
CKey key;
|
||||||
uint256 key_data = InsecureRand256();
|
uint256 key_data = rng.rand256();
|
||||||
key.Set(key_data.begin(), key_data.end(), true);
|
key.Set(key_data.begin(), key_data.end(), true);
|
||||||
return key;
|
return key;
|
||||||
}
|
}
|
||||||
|
@ -1029,6 +1029,7 @@ CKey GenerateRandomTestKey() noexcept
|
||||||
*/
|
*/
|
||||||
class V2TransportTester
|
class V2TransportTester
|
||||||
{
|
{
|
||||||
|
FastRandomContext& m_rng;
|
||||||
V2Transport m_transport; //!< V2Transport being tested
|
V2Transport m_transport; //!< V2Transport being tested
|
||||||
BIP324Cipher m_cipher; //!< Cipher to help with the other side
|
BIP324Cipher m_cipher; //!< Cipher to help with the other side
|
||||||
bool m_test_initiator; //!< Whether m_transport is the initiator (true) or responder (false)
|
bool m_test_initiator; //!< Whether m_transport is the initiator (true) or responder (false)
|
||||||
|
@ -1042,9 +1043,10 @@ class V2TransportTester
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/** Construct a tester object. test_initiator: whether the tested transport is initiator. */
|
/** Construct a tester object. test_initiator: whether the tested transport is initiator. */
|
||||||
explicit V2TransportTester(bool test_initiator)
|
explicit V2TransportTester(FastRandomContext& rng, bool test_initiator)
|
||||||
: m_transport{0, test_initiator},
|
: m_rng{rng},
|
||||||
m_cipher{GenerateRandomTestKey(), MakeByteSpan(InsecureRand256())},
|
m_transport{0, test_initiator},
|
||||||
|
m_cipher{GenerateRandomTestKey(m_rng), MakeByteSpan(m_rng.rand256())},
|
||||||
m_test_initiator(test_initiator) {}
|
m_test_initiator(test_initiator) {}
|
||||||
|
|
||||||
/** Data type returned by Interact:
|
/** Data type returned by Interact:
|
||||||
|
@ -1345,7 +1347,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
{
|
{
|
||||||
// A mostly normal scenario, testing a transport in initiator mode.
|
// A mostly normal scenario, testing a transport in initiator mode.
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
V2TransportTester tester(true);
|
V2TransportTester tester(m_rng, true);
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
BOOST_REQUIRE(ret && ret->empty());
|
BOOST_REQUIRE(ret && ret->empty());
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
|
@ -1386,7 +1388,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Normal scenario, with a transport in responder node.
|
// Normal scenario, with a transport in responder node.
|
||||||
for (int i = 0; i < 10; ++i) {
|
for (int i = 0; i < 10; ++i) {
|
||||||
V2TransportTester tester(false);
|
V2TransportTester tester(m_rng, false);
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
tester.SendGarbage();
|
tester.SendGarbage();
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
|
@ -1429,7 +1431,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
bool send_immediately = !initiator || InsecureRandBool();
|
bool send_immediately = !initiator || InsecureRandBool();
|
||||||
/** How many decoy packets to send before the first and second real message. */
|
/** How many decoy packets to send before the first and second real message. */
|
||||||
unsigned num_decoys_1 = InsecureRandRange(1000), num_decoys_2 = InsecureRandRange(1000);
|
unsigned num_decoys_1 = InsecureRandRange(1000), num_decoys_2 = InsecureRandRange(1000);
|
||||||
V2TransportTester tester(initiator);
|
V2TransportTester tester(m_rng, initiator);
|
||||||
if (send_immediately) {
|
if (send_immediately) {
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
tester.SendGarbage(garb_len);
|
tester.SendGarbage(garb_len);
|
||||||
|
@ -1480,7 +1482,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Too long garbage (initiator).
|
// Too long garbage (initiator).
|
||||||
{
|
{
|
||||||
V2TransportTester tester(true);
|
V2TransportTester tester(m_rng, true);
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
BOOST_REQUIRE(ret && ret->empty());
|
BOOST_REQUIRE(ret && ret->empty());
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
|
@ -1493,7 +1495,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Too long garbage (responder).
|
// Too long garbage (responder).
|
||||||
{
|
{
|
||||||
V2TransportTester tester(false);
|
V2TransportTester tester(m_rng, false);
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
tester.SendGarbage(V2Transport::MAX_GARBAGE_LEN + 1);
|
tester.SendGarbage(V2Transport::MAX_GARBAGE_LEN + 1);
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
|
@ -1506,7 +1508,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Send garbage that includes the first 15 garbage terminator bytes somewhere.
|
// Send garbage that includes the first 15 garbage terminator bytes somewhere.
|
||||||
{
|
{
|
||||||
V2TransportTester tester(true);
|
V2TransportTester tester(m_rng, true);
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
BOOST_REQUIRE(ret && ret->empty());
|
BOOST_REQUIRE(ret && ret->empty());
|
||||||
tester.SendKey();
|
tester.SendKey();
|
||||||
|
@ -1545,7 +1547,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Send correct network's V1 header
|
// Send correct network's V1 header
|
||||||
{
|
{
|
||||||
V2TransportTester tester(false);
|
V2TransportTester tester(m_rng, false);
|
||||||
tester.SendV1Version(Params().MessageStart());
|
tester.SendV1Version(Params().MessageStart());
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
BOOST_CHECK(ret);
|
BOOST_CHECK(ret);
|
||||||
|
@ -1553,7 +1555,7 @@ BOOST_AUTO_TEST_CASE(v2transport_test)
|
||||||
|
|
||||||
// Send wrong network's V1 header
|
// Send wrong network's V1 header
|
||||||
{
|
{
|
||||||
V2TransportTester tester(false);
|
V2TransportTester tester(m_rng, false);
|
||||||
tester.SendV1Version(CChainParams::Main()->MessageStart());
|
tester.SendV1Version(CChainParams::Main()->MessageStart());
|
||||||
auto ret = tester.Interact();
|
auto ret = tester.Interact();
|
||||||
BOOST_CHECK(!ret);
|
BOOST_CHECK(!ret);
|
||||||
|
|
|
@ -21,6 +21,8 @@ BOOST_FIXTURE_TEST_SUITE(orphanage_tests, TestingSetup)
|
||||||
class TxOrphanageTest : public TxOrphanage
|
class TxOrphanageTest : public TxOrphanage
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
TxOrphanageTest(FastRandomContext& rng) : m_rng{rng} {}
|
||||||
|
|
||||||
inline size_t CountOrphans() const
|
inline size_t CountOrphans() const
|
||||||
{
|
{
|
||||||
return m_orphans.size();
|
return m_orphans.size();
|
||||||
|
@ -34,9 +36,11 @@ public:
|
||||||
it = m_orphans.begin();
|
it = m_orphans.begin();
|
||||||
return it->second.tx;
|
return it->second.tx;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FastRandomContext& m_rng;
|
||||||
};
|
};
|
||||||
|
|
||||||
static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx = g_insecure_rand_ctx)
|
static void MakeNewKeyWithFastRandomContext(CKey& key, FastRandomContext& rand_ctx)
|
||||||
{
|
{
|
||||||
std::vector<unsigned char> keydata;
|
std::vector<unsigned char> keydata;
|
||||||
keydata = rand_ctx.randbytes(32);
|
keydata = rand_ctx.randbytes(32);
|
||||||
|
@ -106,9 +110,9 @@ BOOST_AUTO_TEST_CASE(DoS_mapOrphans)
|
||||||
// signature's R and S values have leading zeros.
|
// signature's R and S values have leading zeros.
|
||||||
g_insecure_rand_ctx.Reseed(uint256{33});
|
g_insecure_rand_ctx.Reseed(uint256{33});
|
||||||
|
|
||||||
TxOrphanageTest orphanage;
|
TxOrphanageTest orphanage{m_rng};
|
||||||
CKey key;
|
CKey key;
|
||||||
MakeNewKeyWithFastRandomContext(key);
|
MakeNewKeyWithFastRandomContext(key, m_rng);
|
||||||
FillableSigningProvider keystore;
|
FillableSigningProvider keystore;
|
||||||
BOOST_CHECK(keystore.AddKey(key));
|
BOOST_CHECK(keystore.AddKey(key));
|
||||||
|
|
||||||
|
|
|
@ -17,12 +17,16 @@
|
||||||
class CPartialMerkleTreeTester : public CPartialMerkleTree
|
class CPartialMerkleTreeTester : public CPartialMerkleTree
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
CPartialMerkleTreeTester(FastRandomContext& rng) : m_rng{rng} {}
|
||||||
|
|
||||||
// flip one bit in one of the hashes - this should break the authentication
|
// flip one bit in one of the hashes - this should break the authentication
|
||||||
void Damage() {
|
void Damage() {
|
||||||
unsigned int n = InsecureRandRange(vHash.size());
|
unsigned int n = InsecureRandRange(vHash.size());
|
||||||
int bit = InsecureRandBits(8);
|
int bit = InsecureRandBits(8);
|
||||||
*(vHash[n].begin() + (bit>>3)) ^= 1<<(bit&7);
|
*(vHash[n].begin() + (bit>>3)) ^= 1<<(bit&7);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FastRandomContext& m_rng;
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOST_FIXTURE_TEST_SUITE(pmt_tests, BasicTestingSetup)
|
BOOST_FIXTURE_TEST_SUITE(pmt_tests, BasicTestingSetup)
|
||||||
|
@ -77,7 +81,7 @@ BOOST_AUTO_TEST_CASE(pmt_test1)
|
||||||
BOOST_CHECK(ss.size() <= 10 + (258*n+7)/8);
|
BOOST_CHECK(ss.size() <= 10 + (258*n+7)/8);
|
||||||
|
|
||||||
// deserialize into a tester copy
|
// deserialize into a tester copy
|
||||||
CPartialMerkleTreeTester pmt2;
|
CPartialMerkleTreeTester pmt2{m_rng};
|
||||||
ss >> pmt2;
|
ss >> pmt2;
|
||||||
|
|
||||||
// extract merkle root and matched txids from copy
|
// extract merkle root and matched txids from copy
|
||||||
|
|
|
@ -207,16 +207,16 @@ public:
|
||||||
BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());
|
BOOST_CHECK_MESSAGE(passed, "insecure_rand: " + rand_seed.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
prevector_tester() {
|
prevector_tester(FastRandomContext& rng) {
|
||||||
rand_seed = InsecureRand256();
|
rand_seed = rng.rand256();
|
||||||
g_insecure_rand_ctx.Reseed(rand_seed);
|
rng.Reseed(rand_seed);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(PrevectorTestInt)
|
BOOST_AUTO_TEST_CASE(PrevectorTestInt)
|
||||||
{
|
{
|
||||||
for (int j = 0; j < 64; j++) {
|
for (int j = 0; j < 64; j++) {
|
||||||
prevector_tester<8, int> test;
|
prevector_tester<8, int> test{m_rng};
|
||||||
for (int i = 0; i < 2048; i++) {
|
for (int i = 0; i < 2048; i++) {
|
||||||
if (InsecureRandBits(2) == 0) {
|
if (InsecureRandBits(2) == 0) {
|
||||||
test.insert(InsecureRandRange(test.size() + 1), int(InsecureRand32()));
|
test.insert(InsecureRandRange(test.size() + 1), int(InsecureRand32()));
|
||||||
|
|
|
@ -78,12 +78,13 @@ std::chrono::microseconds TxRequestTest::RandomTime1y() { return std::chrono::mi
|
||||||
*/
|
*/
|
||||||
class Scenario
|
class Scenario
|
||||||
{
|
{
|
||||||
|
FastRandomContext& m_rng;
|
||||||
Runner& m_runner;
|
Runner& m_runner;
|
||||||
std::chrono::microseconds m_now;
|
std::chrono::microseconds m_now;
|
||||||
std::string m_testname;
|
std::string m_testname;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
Scenario(Runner& runner, std::chrono::microseconds starttime) : m_runner(runner), m_now(starttime) {}
|
Scenario(FastRandomContext& rng, Runner& runner, std::chrono::microseconds starttime) : m_rng(rng), m_runner(runner), m_now(starttime) {}
|
||||||
|
|
||||||
/** Set a name for the current test, to give more clear error messages. */
|
/** Set a name for the current test, to give more clear error messages. */
|
||||||
void SetTestName(std::string testname)
|
void SetTestName(std::string testname)
|
||||||
|
@ -719,7 +720,7 @@ void TxRequestTest::TestInterleavedScenarios()
|
||||||
// Introduce some variation in the start time of each scenario, so they don't all start off
|
// Introduce some variation in the start time of each scenario, so they don't all start off
|
||||||
// concurrently, but get a more random interleaving.
|
// concurrently, but get a more random interleaving.
|
||||||
auto scenario_start = starttime + RandomTime8s() + RandomTime8s() + RandomTime8s();
|
auto scenario_start = starttime + RandomTime8s() + RandomTime8s() + RandomTime8s();
|
||||||
Scenario scenario(runner, scenario_start);
|
Scenario scenario(m_rng, runner, scenario_start);
|
||||||
for (int j = 0; builders.size() && j < 10; ++j) {
|
for (int j = 0; builders.size() && j < 10; ++j) {
|
||||||
builders.back()(scenario);
|
builders.back()(scenario);
|
||||||
builders.pop_back();
|
builders.pop_back();
|
||||||
|
|
|
@ -13,10 +13,10 @@
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
|
|
||||||
COutPoint AddTestCoin(CCoinsViewCache& coins_view)
|
COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view)
|
||||||
{
|
{
|
||||||
Coin new_coin;
|
Coin new_coin;
|
||||||
COutPoint outpoint{Txid::FromUint256(InsecureRand256()), /*nIn=*/0};
|
COutPoint outpoint{Txid::FromUint256(rng.rand256()), /*nIn=*/0};
|
||||||
new_coin.nHeight = 1;
|
new_coin.nHeight = 1;
|
||||||
new_coin.out.nValue = InsecureRandMoneyAmount();
|
new_coin.out.nValue = InsecureRandMoneyAmount();
|
||||||
new_coin.out.scriptPubKey.assign(uint32_t{56}, 1);
|
new_coin.out.scriptPubKey.assign(uint32_t{56}, 1);
|
||||||
|
|
|
@ -8,12 +8,13 @@
|
||||||
#include <primitives/transaction.h>
|
#include <primitives/transaction.h>
|
||||||
|
|
||||||
class CCoinsViewCache;
|
class CCoinsViewCache;
|
||||||
|
class FastRandomContext;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Create a Coin with DynamicMemoryUsage of 80 bytes and add it to the given view.
|
* Create a Coin with DynamicMemoryUsage of 80 bytes and add it to the given view.
|
||||||
* @param[in,out] coins_view The coins view cache to add the new coin to.
|
* @param[in,out] coins_view The coins view cache to add the new coin to.
|
||||||
* @returns the COutPoint of the created coin.
|
* @returns the COutPoint of the created coin.
|
||||||
*/
|
*/
|
||||||
COutPoint AddTestCoin(CCoinsViewCache& coins_view);
|
COutPoint AddTestCoin(FastRandomContext& rng, CCoinsViewCache& coins_view);
|
||||||
|
|
||||||
#endif // BITCOIN_TEST_UTIL_COINS_H
|
#endif // BITCOIN_TEST_UTIL_COINS_H
|
||||||
|
|
|
@ -36,7 +36,7 @@ BOOST_AUTO_TEST_CASE(validation_chainstate_resize_caches)
|
||||||
// Add a coin to the in-memory cache, upsize once, then downsize.
|
// Add a coin to the in-memory cache, upsize once, then downsize.
|
||||||
{
|
{
|
||||||
LOCK(::cs_main);
|
LOCK(::cs_main);
|
||||||
const auto outpoint = AddTestCoin(c1.CoinsTip());
|
const auto outpoint = AddTestCoin(m_rng, c1.CoinsTip());
|
||||||
|
|
||||||
// Set a meaningless bestblock value in the coinsview cache - otherwise we won't
|
// Set a meaningless bestblock value in the coinsview cache - otherwise we won't
|
||||||
// flush during ResizecoinsCaches() and will subsequently hit an assertion.
|
// flush during ResizecoinsCaches() and will subsequently hit an assertion.
|
||||||
|
|
|
@ -50,7 +50,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
// Add a bunch of coins to see that we at least flip over to CRITICAL.
|
// Add a bunch of coins to see that we at least flip over to CRITICAL.
|
||||||
|
|
||||||
for (int i{0}; i < 1000; ++i) {
|
for (int i{0}; i < 1000; ++i) {
|
||||||
const COutPoint res = AddTestCoin(view);
|
const COutPoint res = AddTestCoin(m_rng, view);
|
||||||
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
|
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -77,7 +77,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
CoinsCacheSizeState::OK);
|
CoinsCacheSizeState::OK);
|
||||||
|
|
||||||
for (int i{0}; i < COINS_UNTIL_CRITICAL; ++i) {
|
for (int i{0}; i < COINS_UNTIL_CRITICAL; ++i) {
|
||||||
const COutPoint res = AddTestCoin(view);
|
const COutPoint res = AddTestCoin(m_rng, view);
|
||||||
print_view_mem_usage(view);
|
print_view_mem_usage(view);
|
||||||
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
|
BOOST_CHECK_EQUAL(view.AccessCoin(res).DynamicMemoryUsage(), COIN_SIZE);
|
||||||
|
|
||||||
|
@ -90,7 +90,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
|
|
||||||
// Adding some additional coins will push us over the edge to CRITICAL.
|
// Adding some additional coins will push us over the edge to CRITICAL.
|
||||||
for (int i{0}; i < 4; ++i) {
|
for (int i{0}; i < 4; ++i) {
|
||||||
AddTestCoin(view);
|
AddTestCoin(m_rng, view);
|
||||||
print_view_mem_usage(view);
|
print_view_mem_usage(view);
|
||||||
if (chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/0) ==
|
if (chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/0) ==
|
||||||
CoinsCacheSizeState::CRITICAL) {
|
CoinsCacheSizeState::CRITICAL) {
|
||||||
|
@ -108,7 +108,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
CoinsCacheSizeState::OK);
|
CoinsCacheSizeState::OK);
|
||||||
|
|
||||||
for (int i{0}; i < 3; ++i) {
|
for (int i{0}; i < 3; ++i) {
|
||||||
AddTestCoin(view);
|
AddTestCoin(m_rng, view);
|
||||||
print_view_mem_usage(view);
|
print_view_mem_usage(view);
|
||||||
BOOST_CHECK_EQUAL(
|
BOOST_CHECK_EQUAL(
|
||||||
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/ 1 << 19),
|
chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/ 1 << 19),
|
||||||
|
@ -117,7 +117,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
|
|
||||||
// Adding another coin with the additional mempool room will put us >90%
|
// Adding another coin with the additional mempool room will put us >90%
|
||||||
// but not yet critical.
|
// but not yet critical.
|
||||||
AddTestCoin(view);
|
AddTestCoin(m_rng, view);
|
||||||
print_view_mem_usage(view);
|
print_view_mem_usage(view);
|
||||||
|
|
||||||
// Only perform these checks on 64 bit hosts; I haven't done the math for 32.
|
// Only perform these checks on 64 bit hosts; I haven't done the math for 32.
|
||||||
|
@ -133,7 +133,7 @@ BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
|
||||||
|
|
||||||
// Using the default max_* values permits way more coins to be added.
|
// Using the default max_* values permits way more coins to be added.
|
||||||
for (int i{0}; i < 1000; ++i) {
|
for (int i{0}; i < 1000; ++i) {
|
||||||
AddTestCoin(view);
|
AddTestCoin(m_rng, view);
|
||||||
BOOST_CHECK_EQUAL(
|
BOOST_CHECK_EQUAL(
|
||||||
chainstate.GetCoinsCacheSizeState(),
|
chainstate.GetCoinsCacheSizeState(),
|
||||||
CoinsCacheSizeState::OK);
|
CoinsCacheSizeState::OK);
|
||||||
|
|
|
@ -67,6 +67,7 @@ public:
|
||||||
|
|
||||||
class VersionBitsTester
|
class VersionBitsTester
|
||||||
{
|
{
|
||||||
|
FastRandomContext& m_rng;
|
||||||
// A fake blockchain
|
// A fake blockchain
|
||||||
std::vector<CBlockIndex*> vpblock;
|
std::vector<CBlockIndex*> vpblock;
|
||||||
|
|
||||||
|
@ -85,6 +86,8 @@ class VersionBitsTester
|
||||||
int num{1000};
|
int num{1000};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
VersionBitsTester(FastRandomContext& rng) : m_rng{rng} {}
|
||||||
|
|
||||||
VersionBitsTester& Reset() {
|
VersionBitsTester& Reset() {
|
||||||
// Have each group of tests be counted by the 1000s part, starting at 1000
|
// Have each group of tests be counted by the 1000s part, starting at 1000
|
||||||
num = num - (num % 1000) + 1000;
|
num = num - (num % 1000) + 1000;
|
||||||
|
@ -190,7 +193,7 @@ BOOST_AUTO_TEST_CASE(versionbits_test)
|
||||||
{
|
{
|
||||||
for (int i = 0; i < 64; i++) {
|
for (int i = 0; i < 64; i++) {
|
||||||
// DEFINED -> STARTED after timeout reached -> FAILED
|
// DEFINED -> STARTED after timeout reached -> FAILED
|
||||||
VersionBitsTester().TestDefined().TestStateSinceHeight(0)
|
VersionBitsTester(m_rng).TestDefined().TestStateSinceHeight(0)
|
||||||
.Mine(1, TestTime(1), 0x100).TestDefined().TestStateSinceHeight(0)
|
.Mine(1, TestTime(1), 0x100).TestDefined().TestStateSinceHeight(0)
|
||||||
.Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
|
.Mine(11, TestTime(11), 0x100).TestDefined().TestStateSinceHeight(0)
|
||||||
.Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
|
.Mine(989, TestTime(989), 0x100).TestDefined().TestStateSinceHeight(0)
|
||||||
|
@ -296,7 +299,7 @@ void check_computeblockversion(VersionBitsCache& versionbitscache, const Consens
|
||||||
// In the first chain, test that the bit is set by CBV until it has failed.
|
// In the first chain, test that the bit is set by CBV until it has failed.
|
||||||
// In the second chain, test the bit is set by CBV while STARTED and
|
// In the second chain, test the bit is set by CBV while STARTED and
|
||||||
// LOCKED-IN, and then no longer set while ACTIVE.
|
// LOCKED-IN, and then no longer set while ACTIVE.
|
||||||
VersionBitsTester firstChain, secondChain;
|
VersionBitsTester firstChain{m_rng}, secondChain{m_rng};
|
||||||
|
|
||||||
int64_t nTime = nStartTime;
|
int64_t nTime = nStartTime;
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue