diff --git a/tests/ExtraTests/CMakeLists.txt b/tests/ExtraTests/CMakeLists.txt index fbcc3465..281a04fa 100644 --- a/tests/ExtraTests/CMakeLists.txt +++ b/tests/ExtraTests/CMakeLists.txt @@ -553,3 +553,16 @@ set_tests_properties(AmalgamatedFileTest PROPERTIES PASS_REGULAR_EXPRESSION "All tests passed \\(14 assertions in 3 test cases\\)" ) + +add_executable(ThreadSafetyTests + ${TESTS_DIR}/X94-ThreadSafetyTests.cpp +) +target_link_libraries(ThreadSafetyTests Catch2_buildall_interface) +target_compile_definitions(ThreadSafetyTests PUBLIC CATCH_CONFIG_EXPERIMENTAL_THREAD_SAFE_ASSERTIONS) +add_test(NAME ThreadSafetyTests + COMMAND ThreadSafetyTests -r compact +) +set_tests_properties(ThreadSafetyTests + PROPERTIES + PASS_REGULAR_EXPRESSION "assertions: 8001 | 4000 passed | 4001 failed" +) diff --git a/tests/ExtraTests/X94-ThreadSafetyTests.cpp b/tests/ExtraTests/X94-ThreadSafetyTests.cpp new file mode 100644 index 00000000..b0ad38d9 --- /dev/null +++ b/tests/ExtraTests/X94-ThreadSafetyTests.cpp @@ -0,0 +1,44 @@ + +// Copyright Catch2 Authors +// Distributed under the Boost Software License, Version 1.0. +// (See accompanying file LICENSE.txt or copy at +// https://www.boost.org/LICENSE_1_0.txt) + +// SPDX-License-Identifier: BSL-1.0 + +/**\file + * Test that assertions and messages are thread-safe. + * + * This is done by spamming assertions and messages on multiple subthreads. + * In manual, this reliably causes segfaults if the test is linked against + * a non-thread-safe version of Catch2. + * + * The CTest test definition should also verify that the final assertion + * count is correct. + */ + +#include + +#include +#include +#include + +TEST_CASE( "Failed REQUIRE in the main thread is fine" ) { + std::vector threads; + for ( size_t t = 0; t < 4; ++t) { + threads.emplace_back( [t]() { + CAPTURE(t); + for (size_t i = 0; i < 1'000; ++i) { + CAPTURE(i); + CHECK( false ); + CHECK( true ); + } + } ); + } + + for (auto& t : threads) { + t.join(); + } + + REQUIRE( false ); +}