Regression test.
This commit is contained in:
parent
5a0d9db4e4
commit
08de001a25
|
@ -249,6 +249,81 @@ BOOST_AUTO_TEST_CASE(nullifier_regression_test)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
BOOST_AUTO_TEST_CASE(anchor_pop_regression_test)
|
||||||
|
{
|
||||||
|
// Correct behavior:
|
||||||
|
{
|
||||||
|
CCoinsViewTest base;
|
||||||
|
CCoinsViewCacheTest cache1(&base);
|
||||||
|
|
||||||
|
// Create dummy anchor/commitment
|
||||||
|
ZCIncrementalMerkleTree tree;
|
||||||
|
uint256 cm = GetRandHash();
|
||||||
|
tree.append(cm);
|
||||||
|
|
||||||
|
// Add the anchor
|
||||||
|
cache1.PushAnchor(tree);
|
||||||
|
cache1.Flush();
|
||||||
|
|
||||||
|
// Remove the anchor
|
||||||
|
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
|
||||||
|
cache1.Flush();
|
||||||
|
|
||||||
|
// Add the anchor back
|
||||||
|
cache1.PushAnchor(tree);
|
||||||
|
cache1.Flush();
|
||||||
|
|
||||||
|
// The base contains the anchor, of course!
|
||||||
|
{
|
||||||
|
ZCIncrementalMerkleTree checktree;
|
||||||
|
BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
|
||||||
|
BOOST_CHECK(checktree.root() == tree.root());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Previously incorrect behavior
|
||||||
|
{
|
||||||
|
CCoinsViewTest base;
|
||||||
|
CCoinsViewCacheTest cache1(&base);
|
||||||
|
|
||||||
|
// Create dummy anchor/commitment
|
||||||
|
ZCIncrementalMerkleTree tree;
|
||||||
|
uint256 cm = GetRandHash();
|
||||||
|
tree.append(cm);
|
||||||
|
|
||||||
|
// Add the anchor and flush to disk
|
||||||
|
cache1.PushAnchor(tree);
|
||||||
|
cache1.Flush();
|
||||||
|
|
||||||
|
// Remove the anchor, but don't flush yet!
|
||||||
|
cache1.PopAnchor(ZCIncrementalMerkleTree::empty_root());
|
||||||
|
|
||||||
|
{
|
||||||
|
CCoinsViewCacheTest cache2(&cache1); // Build cache on top
|
||||||
|
cache2.PushAnchor(tree); // Put the same anchor back!
|
||||||
|
cache2.Flush(); // Flush to cache1
|
||||||
|
}
|
||||||
|
|
||||||
|
// cache2's flush kinda worked, i.e. cache1 thinks the
|
||||||
|
// tree is there, but it didn't bring down the correct
|
||||||
|
// treestate...
|
||||||
|
{
|
||||||
|
ZCIncrementalMerkleTree checktree;
|
||||||
|
BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
|
||||||
|
BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
|
||||||
|
}
|
||||||
|
|
||||||
|
// Flushing cache won't help either, just makes the inconsistency
|
||||||
|
// permanent.
|
||||||
|
cache1.Flush();
|
||||||
|
{
|
||||||
|
ZCIncrementalMerkleTree checktree;
|
||||||
|
BOOST_CHECK(cache1.GetAnchorAt(tree.root(), checktree));
|
||||||
|
BOOST_CHECK(checktree.root() == tree.root()); // Oh, shucks.
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BOOST_AUTO_TEST_CASE(anchor_regression_test)
|
BOOST_AUTO_TEST_CASE(anchor_regression_test)
|
||||||
{
|
{
|
||||||
// Correct behavior:
|
// Correct behavior:
|
||||||
|
|
Loading…
Reference in New Issue