MCPcopy Create free account
hub / github.com/ElementsProject/elements / BOOST_AUTO_TEST_CASE

Function BOOST_AUTO_TEST_CASE

src/test/validation_flush_tests.cpp:21–176  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

19//! @sa CChainState::GetCoinsCacheSizeState()
20//!
21BOOST_AUTO_TEST_CASE(getcoinscachesizestate)
22{
23 CTxMemPool mempool;
24 BlockManager blockman{};
25 CChainState chainstate{&mempool, blockman, *Assert(m_node.chainman)};
26 chainstate.InitCoinsDB(/*cache_size_bytes=*/1 << 10, /*in_memory=*/true, /*should_wipe=*/false);
27 WITH_LOCK(::cs_main, chainstate.InitCoinsCache(1 << 10));
28
29 constexpr bool is_64_bit = sizeof(void*) == 8;
30
31 LOCK(::cs_main);
32 auto& view = chainstate.CoinsTip();
33
34 //! Create and add a Coin with DynamicMemoryUsage of 80 bytes to the given view.
35 auto add_coin = [](CCoinsViewCache& coins_view) -> COutPoint {
36 Coin newcoin;
37 uint256 txid = InsecureRand256();
38 COutPoint outp{txid, 0};
39 newcoin.nHeight = 1;
40 newcoin.out.nValue = InsecureRand32();
41 newcoin.out.scriptPubKey.assign((uint32_t)56, 1);
42 coins_view.AddCoin(outp, std::move(newcoin), false);
43
44 return outp;
45 };
46
47 // The number of bytes consumed by coin's heap data, i.e. CScript
48 // (prevector<28, unsigned char>) when assigned 56 bytes of data per above.
49 //
50 // See also: Coin::DynamicMemoryUsage().
51 constexpr unsigned int COIN_SIZE = is_64_bit ? 80 : 64;
52
53 auto print_view_mem_usage = [](CCoinsViewCache& view) {
54 BOOST_TEST_MESSAGE("CCoinsViewCache memory usage: " << view.DynamicMemoryUsage());
55 };
56
57 constexpr size_t MAX_COINS_CACHE_BYTES = 1024;
58
59 // Without any coins in the cache, we shouldn't need to flush.
60 BOOST_CHECK_EQUAL(
61 chainstate.GetCoinsCacheSizeState(MAX_COINS_CACHE_BYTES, /*max_mempool_size_bytes=*/0),
62 CoinsCacheSizeState::OK);
63
64 // If the initial memory allocations of cacheCoins don't match these common
65 // cases, we can't really continue to make assertions about memory usage.
66 // End the test early.
67 // ELEMENTS: These tests are fragile even on Bitcoin, as evidenced by
68 // the wide numeric ranges which are set ad-hoc all over the place.
69 // I tried probably 30 times to change the values so that they'd work
70 // on Cirrus for Elements, but there are just too many of values and it
71 // is impossible to guess the exact memory usage of libstd collections
72 // on CI boxes, and they change whenever I tweak other memory-related
73 // parameters. So instead I'm just forcing (in a way the compiler won't
74 // recognize as an `if (true) { ... return }` block) the "unknown arch"
75 // path, which does a simple/crude check and returns.
76 //if (view.DynamicMemoryUsage() != 32 && view.DynamicMemoryUsage() != 16) {
77 if (view.DynamicMemoryUsage() < 1000) {
78 // Add a bunch of coins to see that we at least flip over to CRITICAL.

Callers

nothing calls this directly

Calls 11

InsecureRand256Function · 0.85
InsecureRand32Function · 0.85
InitCoinsDBMethod · 0.80
InitCoinsCacheMethod · 0.80
AddCoinMethod · 0.80
SetBestBlockMethod · 0.80
add_coinFunction · 0.50
assignMethod · 0.45
DynamicMemoryUsageMethod · 0.45
FlushMethod · 0.45

Tested by

no test coverage detected