1cf85b33eSdavidtrevelyan //===--- rtsan_test_assertions.cpp - Realtime Sanitizer ---------*- C++ -*-===// 2cf85b33eSdavidtrevelyan // 3cf85b33eSdavidtrevelyan // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4cf85b33eSdavidtrevelyan // See https://llvm.org/LICENSE.txt for license information. 5cf85b33eSdavidtrevelyan // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6cf85b33eSdavidtrevelyan // 7cf85b33eSdavidtrevelyan //===----------------------------------------------------------------------===// 8cf85b33eSdavidtrevelyan // 9cf85b33eSdavidtrevelyan // Part of the RealtimeSanitizer runtime library test suite 10cf85b33eSdavidtrevelyan // 11cf85b33eSdavidtrevelyan //===----------------------------------------------------------------------===// 12cf85b33eSdavidtrevelyan 13cf85b33eSdavidtrevelyan #include "rtsan_test_utilities.h" 14cf85b33eSdavidtrevelyan 15cf85b33eSdavidtrevelyan #include "rtsan/rtsan_assertions.h" 16cf85b33eSdavidtrevelyan 17*3423a5e3SChris Apple #include "sanitizer_common/sanitizer_stacktrace.h" 18*3423a5e3SChris Apple 19a04db2c7Sdavidtrevelyan #include <gmock/gmock.h> 20cf85b33eSdavidtrevelyan 21*3423a5e3SChris Apple using namespace __sanitizer; 221b601938SChris Apple using namespace __rtsan; 231b601938SChris Apple 24cf85b33eSdavidtrevelyan class TestRtsanAssertions : public ::testing::Test { 25cf85b33eSdavidtrevelyan protected: 26cf85b33eSdavidtrevelyan void SetUp() override { __rtsan_ensure_initialized(); } 27cf85b33eSdavidtrevelyan }; 28cf85b33eSdavidtrevelyan 29e069434aSChris Apple static void ExpectViolationAction(Context &context, 30a04db2c7Sdavidtrevelyan bool expect_violation_callback) { 31*3423a5e3SChris Apple ::testing::MockFunction<void(const BufferedStackTrace &stack, 32*3423a5e3SChris Apple const DiagnosticsInfo &info)> 33*3423a5e3SChris Apple mock_on_violation; 34a04db2c7Sdavidtrevelyan EXPECT_CALL(mock_on_violation, Call).Times(expect_violation_callback ? 1 : 0); 35*3423a5e3SChris Apple DiagnosticsInfo info{}; 36*3423a5e3SChris Apple ExpectNotRealtime(context, info, mock_on_violation.AsStdFunction()); 371b601938SChris Apple } 381b601938SChris Apple 39a04db2c7Sdavidtrevelyan TEST_F(TestRtsanAssertions, 40a04db2c7Sdavidtrevelyan ExpectNotRealtimeDoesNotCallViolationActionIfNotInRealtimeContext) { 41e069434aSChris Apple Context context{}; 42cf85b33eSdavidtrevelyan ASSERT_FALSE(context.InRealtimeContext()); 43a04db2c7Sdavidtrevelyan ExpectViolationAction(context, false); 44cf85b33eSdavidtrevelyan } 45cf85b33eSdavidtrevelyan 46a04db2c7Sdavidtrevelyan TEST_F(TestRtsanAssertions, 47a04db2c7Sdavidtrevelyan ExpectNotRealtimeCallsViolationActionIfInRealtimeContext) { 48e069434aSChris Apple Context context{}; 49cf85b33eSdavidtrevelyan context.RealtimePush(); 50cf85b33eSdavidtrevelyan ASSERT_TRUE(context.InRealtimeContext()); 51a04db2c7Sdavidtrevelyan ExpectViolationAction(context, true); 52cf85b33eSdavidtrevelyan } 53cf85b33eSdavidtrevelyan 54a04db2c7Sdavidtrevelyan TEST_F(TestRtsanAssertions, 55a04db2c7Sdavidtrevelyan ExpectNotRealtimeDoesNotCallViolationActionIfRealtimeButBypassed) { 56e069434aSChris Apple Context context{}; 57cf85b33eSdavidtrevelyan context.RealtimePush(); 58cf85b33eSdavidtrevelyan context.BypassPush(); 59a04db2c7Sdavidtrevelyan ASSERT_TRUE(context.IsBypassed()); 60a04db2c7Sdavidtrevelyan ExpectViolationAction(context, false); 61cf85b33eSdavidtrevelyan } 62