mirror of
https://github.com/bitcoin/bitcoin.git
synced 2025-01-14 05:42:36 -03:00
64 lines
2 KiB
C++
64 lines
2 KiB
C++
|
// Copyright (c) 2020 The Bitcoin Core developers
|
||
|
// Distributed under the MIT software license, see the accompanying
|
||
|
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
|
||
|
|
||
|
#include <boost/test/unit_test.hpp>
|
||
|
|
||
|
#include <consensus/validation.h>
|
||
|
#include <primitives/block.h>
|
||
|
#include <scheduler.h>
|
||
|
#include <util/check.h>
|
||
|
#include <validationinterface.h>
|
||
|
|
||
|
BOOST_AUTO_TEST_SUITE(validationinterface_tests)
|
||
|
|
||
|
class TestInterface : public CValidationInterface
|
||
|
{
|
||
|
public:
|
||
|
TestInterface(std::function<void()> on_call = nullptr, std::function<void()> on_destroy = nullptr)
|
||
|
: m_on_call(std::move(on_call)), m_on_destroy(std::move(on_destroy))
|
||
|
{
|
||
|
}
|
||
|
virtual ~TestInterface()
|
||
|
{
|
||
|
if (m_on_destroy) m_on_destroy();
|
||
|
}
|
||
|
void BlockChecked(const CBlock& block, const BlockValidationState& state) override
|
||
|
{
|
||
|
if (m_on_call) m_on_call();
|
||
|
}
|
||
|
static void Call()
|
||
|
{
|
||
|
CBlock block;
|
||
|
BlockValidationState state;
|
||
|
GetMainSignals().BlockChecked(block, state);
|
||
|
}
|
||
|
std::function<void()> m_on_call;
|
||
|
std::function<void()> m_on_destroy;
|
||
|
};
|
||
|
|
||
|
// Regression test to ensure UnregisterAllValidationInterfaces calls don't
|
||
|
// destroy a validation interface while it is being called. Bug:
|
||
|
// https://github.com/bitcoin/bitcoin/pull/18551
|
||
|
BOOST_AUTO_TEST_CASE(unregister_all_during_call)
|
||
|
{
|
||
|
bool destroyed = false;
|
||
|
|
||
|
CScheduler scheduler;
|
||
|
GetMainSignals().RegisterBackgroundSignalScheduler(scheduler);
|
||
|
RegisterSharedValidationInterface(std::make_shared<TestInterface>(
|
||
|
[&] {
|
||
|
// First call should decrements reference count 2 -> 1
|
||
|
UnregisterAllValidationInterfaces();
|
||
|
BOOST_CHECK(!destroyed);
|
||
|
// Second call should not decrement reference count 1 -> 0
|
||
|
UnregisterAllValidationInterfaces();
|
||
|
BOOST_CHECK(!destroyed);
|
||
|
},
|
||
|
[&] { destroyed = true; }));
|
||
|
TestInterface::Call();
|
||
|
BOOST_CHECK(destroyed);
|
||
|
}
|
||
|
|
||
|
BOOST_AUTO_TEST_SUITE_END()
|