@@ -169,8 +169,11 @@ BOOST_AUTO_TEST_CASE(chainstatemanager_rebalance_caches)
169
169
BOOST_CHECK_CLOSE (c2.m_coinsdb_cache_size_bytes , max_cache * 0.95 , 1 );
170
170
}
171
171
172
+ auto NoMalleation = [](CAutoFile& file, SnapshotMetadata& meta){};
173
+
174
+ template <typename F = decltype (NoMalleation)>
172
175
static bool
173
- CreateAndActivateUTXOSnapshot (NodeContext& node, const fs::path root)
176
+ CreateAndActivateUTXOSnapshot (NodeContext& node, const fs::path root, F malleation = NoMalleation )
174
177
{
175
178
// Write out a snapshot to the test's tempdir.
176
179
//
@@ -191,6 +194,8 @@ CreateAndActivateUTXOSnapshot(NodeContext& node, const fs::path root)
191
194
SnapshotMetadata metadata;
192
195
auto_infile >> metadata;
193
196
197
+ malleation (auto_infile, metadata);
198
+
194
199
return node.chainman ->ActivateSnapshot (auto_infile, metadata, /* in_memory*/ true );
195
200
}
196
201
@@ -232,6 +237,29 @@ BOOST_FIXTURE_TEST_CASE(chainstatemanager_activate_snapshot, TestChain100Determi
232
237
initial_size += 10 ;
233
238
initial_total_coins += 10 ;
234
239
240
+ // Should not load malleated snapshots
241
+ BOOST_REQUIRE (!CreateAndActivateUTXOSnapshot (
242
+ m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
243
+ // A UTXO is missing but count is correct
244
+ metadata.m_coins_count -= 1 ;
245
+
246
+ COutPoint outpoint;
247
+ Coin coin;
248
+
249
+ auto_infile >> outpoint;
250
+ auto_infile >> coin;
251
+ }));
252
+ BOOST_REQUIRE (!CreateAndActivateUTXOSnapshot (
253
+ m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
254
+ // Coins count is larger than coins in file
255
+ metadata.m_coins_count += 1 ;
256
+ }));
257
+ BOOST_REQUIRE (!CreateAndActivateUTXOSnapshot (
258
+ m_node, m_path_root, [](CAutoFile& auto_infile, SnapshotMetadata& metadata) {
259
+ // Coins count is smaller than coins in file
260
+ metadata.m_coins_count -= 1 ;
261
+ }));
262
+
235
263
BOOST_REQUIRE (CreateAndActivateUTXOSnapshot (m_node, m_path_root));
236
264
237
265
// Ensure our active chain is the snapshot chainstate.
0 commit comments