@@ -49,6 +49,9 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
4949 c1.InitCoinsDB (
5050 /* cache_size_bytes=*/ 1 << 23 , /* in_memory=*/ true , /* should_wipe=*/ false );
5151 WITH_LOCK (::cs_main, c1.InitCoinsCache (1 << 23 ));
52+ c1.LoadGenesisBlock ();
53+ BlockValidationState val_state;
54+ BOOST_CHECK (c1.ActivateBestChain (val_state, nullptr ));
5255
5356 BOOST_CHECK (!manager.IsSnapshotActive ());
5457 BOOST_CHECK (WITH_LOCK (::cs_main, return !manager.IsSnapshotValidated ()));
@@ -58,7 +61,7 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
5861 auto & active_chain = WITH_LOCK (manager.GetMutex (), return manager.ActiveChain ());
5962 BOOST_CHECK_EQUAL (&active_chain, &c1.m_chain );
6063
61- BOOST_CHECK_EQUAL (WITH_LOCK (manager.GetMutex (), return manager.ActiveHeight ()), - 1 );
64+ BOOST_CHECK_EQUAL (WITH_LOCK (manager.GetMutex (), return manager.ActiveHeight ()), 0 );
6265
6366 auto active_tip = WITH_LOCK (manager.GetMutex (), return manager.ActiveTip ());
6467 auto exp_tip = c1.m_chain .Tip ();
@@ -68,7 +71,7 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
6871
6972 // Create a snapshot-based chainstate.
7073 //
71- const uint256 snapshot_blockhash = GetRandHash ();
74+ const uint256 snapshot_blockhash = active_tip-> GetBlockHash ();
7275 Chainstate& c2 = WITH_LOCK (::cs_main, return manager.ActivateExistingSnapshot (
7376 &mempool, snapshot_blockhash));
7477 chainstates.push_back (&c2);
@@ -78,8 +81,7 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
7881 c2.InitCoinsDB (
7982 /* cache_size_bytes=*/ 1 << 23 , /* in_memory=*/ true , /* should_wipe=*/ false );
8083 WITH_LOCK (::cs_main, c2.InitCoinsCache (1 << 23 ));
81- // Unlike c1, which doesn't have any blocks. Gets us different tip, height.
82- c2.LoadGenesisBlock ();
84+ c2.m_chain .SetTip (*active_tip);
8385 BlockValidationState _;
8486 BOOST_CHECK (c2.ActivateBestChain (_, nullptr ));
8587
@@ -99,16 +101,14 @@ BOOST_AUTO_TEST_CASE(chainstatemanager)
99101 auto exp_tip2 = c2.m_chain .Tip ();
100102 BOOST_CHECK_EQUAL (active_tip2, exp_tip2);
101103
102- // Ensure that these pointers actually correspond to different
103- // CCoinsViewCache instances.
104- BOOST_CHECK (exp_tip != exp_tip2);
104+ BOOST_CHECK_EQUAL (exp_tip, exp_tip2);
105105
106106 // Let scheduler events finish running to avoid accessing memory that is going to be unloaded
107107 SyncWithValidationInterfaceQueue ();
108108}
109109
110110// ! Test rebalancing the caches associated with each chainstate.
111- BOOST_AUTO_TEST_CASE (chainstatemanager_rebalance_caches)
111+ BOOST_FIXTURE_TEST_CASE (chainstatemanager_rebalance_caches, TestChain100Setup )
112112{
113113 ChainstateManager& manager = *m_node.chainman ;
114114 CTxMemPool& mempool = *m_node.mempool ;
@@ -121,16 +121,14 @@ BOOST_AUTO_TEST_CASE(chainstatemanager_rebalance_caches)
121121
122122 // Create a legacy (IBD) chainstate.
123123 //
124- Chainstate& c1 = WITH_LOCK (::cs_main, return manager.InitializeChainstate (&mempool) );
124+ Chainstate& c1 = manager.ActiveChainstate ( );
125125 chainstates.push_back (&c1);
126126 c1.InitCoinsDB (
127127 /* cache_size_bytes=*/ 1 << 23 , /* in_memory=*/ true , /* should_wipe=*/ false );
128128
129129 {
130130 LOCK (::cs_main);
131131 c1.InitCoinsCache (1 << 23 );
132- BOOST_REQUIRE (c1.LoadGenesisBlock ());
133- c1.CoinsTip ().SetBestBlock (InsecureRand256 ());
134132 manager.MaybeRebalanceCaches ();
135133 }
136134
@@ -139,16 +137,15 @@ BOOST_AUTO_TEST_CASE(chainstatemanager_rebalance_caches)
139137
140138 // Create a snapshot-based chainstate.
141139 //
142- Chainstate& c2 = WITH_LOCK (cs_main, return manager.ActivateExistingSnapshot (&mempool, GetRandHash ()));
140+ CBlockIndex* snapshot_base{WITH_LOCK (manager.GetMutex (), return manager.ActiveChain ()[manager.ActiveChain ().Height () / 2 ])};
141+ Chainstate& c2 = WITH_LOCK (cs_main, return manager.ActivateExistingSnapshot (&mempool, *snapshot_base->phashBlock ));
143142 chainstates.push_back (&c2);
144143 c2.InitCoinsDB (
145144 /* cache_size_bytes=*/ 1 << 23 , /* in_memory=*/ true , /* should_wipe=*/ false );
146145
147146 {
148147 LOCK (::cs_main);
149148 c2.InitCoinsCache (1 << 23 );
150- BOOST_REQUIRE (c2.LoadGenesisBlock ());
151- c2.CoinsTip ().SetBestBlock (InsecureRand256 ());
152149 manager.MaybeRebalanceCaches ();
153150 }
154151
@@ -430,6 +427,7 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_loadblockindex, TestChain100Setup)
430427 const int assumed_valid_start_idx = last_assumed_valid_idx - expected_assumed_valid;
431428
432429 CBlockIndex* validated_tip{nullptr };
430+ CBlockIndex* assumed_base{nullptr };
433431 CBlockIndex* assumed_tip{WITH_LOCK (chainman.GetMutex (), return chainman.ActiveChain ().Tip ())};
434432
435433 auto reload_all_block_indexes = [&]() {
@@ -468,12 +466,20 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_loadblockindex, TestChain100Setup)
468466 validated_tip = index;
469467 BOOST_CHECK (!index->IsAssumedValid ());
470468 }
469+ // Note the block after the last assumed valid block as the snapshot base
470+ if (i == last_assumed_valid_idx) {
471+ assumed_base = index;
472+ BOOST_CHECK (!index->IsAssumedValid ());
473+ }
471474 }
472475
473476 BOOST_CHECK_EQUAL (expected_assumed_valid, num_assumed_valid);
474477
475478 Chainstate& cs2 = WITH_LOCK (::cs_main,
476- return chainman.ActivateExistingSnapshot (&mempool, GetRandHash ()));
479+ return chainman.ActivateExistingSnapshot (&mempool, *assumed_base->phashBlock ));
480+
481+ // Set tip of the fully validated chain to be the validated tip
482+ cs1.m_chain .SetTip (*validated_tip);
477483
478484 reload_all_block_indexes ();
479485
0 commit comments