git / moonbite-core / src/libmw/test/tests/mmr/Test_LeafSetCache.cpp · raw

// Copyright (c) 2021 The Litecoin Core developers// Distributed under the MIT software license, see the accompanying// file COPYING or http://www.opensource.org/licenses/mit-license.php.#include <mw/mmr/LeafSet.h>#include <mw/crypto/Hasher.h>#include <test_framework/TestMWEB.h>BOOST_FIXTURE_TEST_SUITE(TestMMRLeafSetCache, MWEBTestingSetup)BOOST_AUTO_TEST_CASE(LeafSetCacheTest){    {        LeafSet::Ptr pLeafset = LeafSet::Open(GetDataDir(), 0);        pLeafset->Add(mmr::LeafIndex::At(0));        pLeafset->Add(mmr::LeafIndex::At(1));        pLeafset->Add(mmr::LeafIndex::At(2));        pLeafset->Add(mmr::LeafIndex::At(4));        // Flush to disk        pLeafset->Flush(1);    }    {        // Reload from disk        LeafSet::Ptr pLeafset = LeafSet::Open(GetDataDir(), 1);        // Create cache and validate        LeafSetCache::Ptr pCache = std::make_shared<LeafSetCache>(pLeafset);        BOOST_REQUIRE(pCache->GetNextLeafIdx().Get() == 5);        BOOST_REQUIRE(pCache->Root() == Hashed({0b11101000}));        // Test with 2 layers of caches to cover all scenarios        LeafSetCache::Ptr pCache2 = std::make_shared<LeafSetCache>(pCache);        pCache2->Add(mmr::LeafIndex::At(5));        pCache2->Remove(mmr::LeafIndex::At(2));        // pCache2 should contain the updates, but pCache and pLeafset should remain unchanged.        BOOST_REQUIRE(pLeafset->GetNextLeafIdx().Get() == 5);        BOOST_REQUIRE(pLeafset->Root() == Hashed({0b11101000}));        BOOST_REQUIRE(pCache->GetNextLeafIdx().Get() == 5);        BOOST_REQUIRE(pCache->Root() == Hashed({0b11101000}));        BOOST_REQUIRE(pCache2->GetNextLeafIdx().Get() == 6);        BOOST_REQUIRE(pCache2->Root() == Hashed({0b11001100}));        // Flush pCache2 to pCache. pCache should be updated, but pLeafset should remain unchanged.        pCache2->Flush(0);        BOOST_REQUIRE(pLeafset->GetNextLeafIdx().Get() == 5);        BOOST_REQUIRE(pLeafset->Root() == Hashed({0b11101000}));        BOOST_REQUIRE(pCache->GetNextLeafIdx().Get() == 6);        BOOST_REQUIRE(pCache->Root() == Hashed({0b11001100}));        BOOST_REQUIRE(pCache2->GetNextLeafIdx().Get() == 6);        BOOST_REQUIRE(pCache2->Root() == Hashed({0b11001100}));    }}BOOST_AUTO_TEST_SUITE_END()