aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorMarcoFalke <falke.marco@gmail.com>2020-04-23 14:04:02 -0400
committerfanquake <fanquake@gmail.com>2020-05-15 07:42:08 +0800
commit37a620748bd3578eda1c74daad8df8451d13b989 (patch)
tree14424869ce20bf8dd9f013c921ebb12ed273d605 /src
parentff4dc2075031e9a49220cc27a270aeabe8954989 (diff)
downloadbitcoin-37a620748bd3578eda1c74daad8df8451d13b989.tar.xz
test: Add unregister_validation_interface_race test
This commit is (intentionally) adding a broken test. The test is broken because it registering a subscriber object that can go out of scope while events are still being sent. To run the broken test and reproduce the bug: - Remove comment /** and */ - ./configure --with-sanitizers=address - export ASAN_OPTIONS=detect_leaks=0 - make - while ./src/test/test_bitcoin -t validationinterface_tests/unregister_validation_interface_race --catch_system_errors=no ; do true; done Github-Pull: #18742 Rebased-From: fab6d060ce5f580db538070beec1c5518c8c777c
Diffstat (limited to 'src')
-rw-r--r--src/test/validationinterface_tests.cpp36
1 files changed, 36 insertions, 0 deletions
diff --git a/src/test/validationinterface_tests.cpp b/src/test/validationinterface_tests.cpp
index 208be92852..14f09ae905 100644
--- a/src/test/validationinterface_tests.cpp
+++ b/src/test/validationinterface_tests.cpp
@@ -12,6 +12,42 @@
BOOST_FIXTURE_TEST_SUITE(validationinterface_tests, TestingSetup)
+/**
+struct TestSubscriberNoop final : public CValidationInterface {
+ void BlockChecked(const CBlock&, const BlockValidationState&) override {}
+};
+
+BOOST_AUTO_TEST_CASE(unregister_validation_interface_race)
+{
+ std::atomic<bool> generate{true};
+
+ // Start thread to generate notifications
+ std::thread gen{[&] {
+ const CBlock block_dummy;
+ const BlockValidationState state_dummy;
+ while (generate) {
+ GetMainSignals().BlockChecked(block_dummy, state_dummy);
+ }
+ }};
+
+ // Start thread to consume notifications
+ std::thread sub{[&] {
+ // keep going for about 1 sec, which is 250k iterations
+ for (int i = 0; i < 250000; i++) {
+ TestSubscriberNoop sub{};
+ RegisterValidationInterface(&sub);
+ UnregisterValidationInterface(&sub);
+ }
+ // tell the other thread we are done
+ generate = false;
+ }};
+
+ gen.join();
+ sub.join();
+ BOOST_CHECK(!generate);
+}
+*/
+
class TestInterface : public CValidationInterface
{
public: