diff options
author | MarcoFalke <falke.marco@gmail.com> | 2020-04-23 14:04:02 -0400 |
---|---|---|
committer | MarcoFalke <falke.marco@gmail.com> | 2020-05-13 19:57:50 -0400 |
commit | fab6d060ce5f580db538070beec1c5518c8c777c (patch) | |
tree | 4afbbf3f6247f21339086523bdad735d20338cc4 /src | |
parent | 64139803f1225dab26197a20314109d37fa87d5f (diff) | |
download | bitcoin-fab6d060ce5f580db538070beec1c5518c8c777c.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
Diffstat (limited to 'src')
-rw-r--r-- | src/test/validationinterface_tests.cpp | 36 |
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: |