Make assertions thread-safe

This commit is contained in:
Jeremy Rifkin
2025-01-17 17:44:20 -06:00
parent 914aeecfe2
commit 83cbfb953a
14 changed files with 172 additions and 29 deletions

View File

@@ -479,6 +479,25 @@ set_tests_properties(
LABELS "uses-signals"
)
add_executable(Multithreading ${TESTS_DIR}/X37-Multithreading.cpp)
target_link_libraries(Multithreading PRIVATE Catch2::Catch2WithMain)
add_test(
NAME Reporters::Multithreading
COMMAND ${CMAKE_COMMAND} -E env $<TARGET_FILE:Multithreading>
)
set_tests_properties(
Reporters::Multithreading
PROPERTIES
PASS_REGULAR_EXPRESSION "passed"
FAIL_REGULAR_EXPRESSION "ThreadSanitizer"
)
if (NOT WIN32)
target_compile_options( Reporters::Multithreading
PUBLIC
$<$<OR:$<CXX_COMPILER_ID:Clang>,$<CXX_COMPILER_ID:GNU>,$<CXX_COMPILER_ID:AppleClang>>:-fsanitize=thread>
)
endif()
add_executable(AssertionStartingEventGoesBeforeAssertionIsEvaluated
X20-AssertionStartingEventGoesBeforeAssertionIsEvaluated.cpp
)

View File

@@ -0,0 +1,34 @@
// 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
#include <catch2/catch_test_macros.hpp>
#include <catch2/internal/catch_textflow.hpp>
#include <catch2/benchmark/catch_benchmark.hpp>
#include <thread>
#include <stop_token>
TEST_CASE( "ThreadAssertionTest",
"[Multithreading]" ) {
SECTION( "Basic" ) {
std::jthread a([] (const std::stop_token& token) {
while (!token.stop_requested()) {
FAIL_CHECK(false);
CHECK(true);
}
});
std::jthread b([] (const std::stop_token& token) {
while (!token.stop_requested()) {
FAIL_CHECK(false);
CHECK(true);
}
});
std::this_thread::sleep_for( std::chrono::milliseconds( 1'000 ) );
a.get_stop_source().request_stop();
b.get_stop_source().request_stop();
}
}