Skip to content

Commit cf85b33

Browse files
[rtsan] Prune rtsan context and assertions tests (#109503)
Disentangles (and simplifies) integration-like tests for `__rtsan::ExpectNotRealtime` and `__rtsan::Context` into simpler unit tests. None of the tests are new, but their assertions have changed to reflect the more direct testing strategy.
1 parent a15f1bf commit cf85b33

File tree

3 files changed

+98
-34
lines changed

3 files changed

+98
-34
lines changed

compiler-rt/lib/rtsan/tests/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ set(RTSAN_INST_TEST_SOURCES
2121

2222
set(RTSAN_NOINST_TEST_SOURCES
2323
../rtsan_preinit.cpp
24+
rtsan_test_assertions.cpp
2425
rtsan_test_context.cpp
2526
rtsan_test_main.cpp)
2627

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
//===--- rtsan_test_assertions.cpp - Realtime Sanitizer ---------*- C++ -*-===//
2+
//
3+
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4+
// See https://llvm.org/LICENSE.txt for license information.
5+
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6+
//
7+
//===----------------------------------------------------------------------===//
8+
//
9+
// Part of the RealtimeSanitizer runtime library test suite
10+
//
11+
//===----------------------------------------------------------------------===//
12+
13+
#include "rtsan_test_utilities.h"
14+
15+
#include "rtsan/rtsan_assertions.h"
16+
17+
#include <gtest/gtest.h>
18+
19+
class TestRtsanAssertions : public ::testing::Test {
20+
protected:
21+
void SetUp() override { __rtsan_ensure_initialized(); }
22+
};
23+
24+
TEST_F(TestRtsanAssertions, ExpectNotRealtimeDoesNotDieIfNotInRealtimeContext) {
25+
__rtsan::Context context{};
26+
ASSERT_FALSE(context.InRealtimeContext());
27+
ExpectNotRealtime(context, "fake_function_name");
28+
}
29+
30+
TEST_F(TestRtsanAssertions, ExpectNotRealtimeDiesIfInRealtimeContext) {
31+
__rtsan::Context context{};
32+
context.RealtimePush();
33+
ASSERT_TRUE(context.InRealtimeContext());
34+
EXPECT_DEATH(ExpectNotRealtime(context, "fake_function_name"), "");
35+
}
36+
37+
TEST_F(TestRtsanAssertions, ExpectNotRealtimeDoesNotDieIfRealtimeButBypassed) {
38+
__rtsan::Context context{};
39+
context.RealtimePush();
40+
context.BypassPush();
41+
ExpectNotRealtime(context, "fake_function_name");
42+
}

compiler-rt/lib/rtsan/tests/rtsan_test_context.cpp

Lines changed: 55 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,66 +11,87 @@
1111
#include "rtsan_test_utilities.h"
1212

1313
#include "rtsan/rtsan.h"
14-
#include "rtsan/rtsan_assertions.h"
1514
#include "rtsan/rtsan_context.h"
1615

1716
#include <gtest/gtest.h>
1817

19-
class TestRtsanContext : public ::testing::Test {
18+
using namespace ::testing;
19+
20+
class TestRtsanContext : public Test {
2021
protected:
2122
void SetUp() override { __rtsan_ensure_initialized(); }
2223
};
2324

24-
TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieBeforeRealtimePush) {
25+
TEST_F(TestRtsanContext, IsNotRealtimeAfterDefaultConstruction) {
2526
__rtsan::Context context{};
26-
ExpectNotRealtime(context, "do_some_stuff");
27+
EXPECT_THAT(context.InRealtimeContext(), Eq(false));
2728
}
2829

29-
TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieAfterPushAndPop) {
30+
TEST_F(TestRtsanContext, IsRealtimeAfterRealtimePush) {
3031
__rtsan::Context context{};
3132
context.RealtimePush();
32-
context.RealtimePop();
33-
ExpectNotRealtime(context, "do_some_stuff");
33+
EXPECT_THAT(context.InRealtimeContext(), Eq(true));
3434
}
3535

36-
TEST_F(TestRtsanContext, ExpectNotRealtimeDiesAfterRealtimePush) {
36+
TEST_F(TestRtsanContext, IsNotRealtimeAfterRealtimePushAndPop) {
3737
__rtsan::Context context{};
38-
3938
context.RealtimePush();
40-
EXPECT_DEATH(ExpectNotRealtime(context, "do_some_stuff"), "");
39+
ASSERT_THAT(context.InRealtimeContext(), Eq(true));
40+
context.RealtimePop();
41+
EXPECT_THAT(context.InRealtimeContext(), Eq(false));
4142
}
4243

43-
TEST_F(TestRtsanContext,
44-
ExpectNotRealtimeDiesAfterRealtimeAfterMorePushesThanPops) {
44+
TEST_F(TestRtsanContext, RealtimeContextStateIsStatefullyTracked) {
4545
__rtsan::Context context{};
46-
47-
context.RealtimePush();
48-
context.RealtimePush();
49-
context.RealtimePush();
50-
context.RealtimePop();
51-
context.RealtimePop();
52-
EXPECT_DEATH(ExpectNotRealtime(context, "do_some_stuff"), "");
46+
auto const expect_rt = [&context](bool is_rt) {
47+
EXPECT_THAT(context.InRealtimeContext(), Eq(is_rt));
48+
};
49+
expect_rt(false);
50+
context.RealtimePush(); // depth 1
51+
expect_rt(true);
52+
context.RealtimePush(); // depth 2
53+
expect_rt(true);
54+
context.RealtimePop(); // depth 1
55+
expect_rt(true);
56+
context.RealtimePush(); // depth 2
57+
expect_rt(true);
58+
context.RealtimePop(); // depth 1
59+
expect_rt(true);
60+
context.RealtimePop(); // depth 0
61+
expect_rt(false);
62+
context.RealtimePush(); // depth 1
63+
expect_rt(true);
5364
}
5465

55-
TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieAfterBypassPush) {
66+
TEST_F(TestRtsanContext, IsNotBypassedAfterDefaultConstruction) {
5667
__rtsan::Context context{};
68+
EXPECT_THAT(context.IsBypassed(), Eq(false));
69+
}
5770

58-
context.RealtimePush();
71+
TEST_F(TestRtsanContext, IsBypassedAfterBypassPush) {
72+
__rtsan::Context context{};
5973
context.BypassPush();
60-
ExpectNotRealtime(context, "do_some_stuff");
74+
EXPECT_THAT(context.IsBypassed(), Eq(true));
6175
}
6276

63-
TEST_F(TestRtsanContext,
64-
ExpectNotRealtimeDoesNotDieIfBypassDepthIsGreaterThanZero) {
77+
TEST_F(TestRtsanContext, BypassedStateIsStatefullyTracked) {
6578
__rtsan::Context context{};
66-
67-
context.RealtimePush();
68-
context.BypassPush();
69-
context.BypassPush();
70-
context.BypassPush();
71-
context.BypassPop();
72-
context.BypassPop();
73-
ExpectNotRealtime(context, "do_some_stuff");
74-
context.BypassPop();
75-
EXPECT_DEATH(ExpectNotRealtime(context, "do_some_stuff"), "");
79+
auto const expect_bypassed = [&context](bool is_bypassed) {
80+
EXPECT_THAT(context.IsBypassed(), Eq(is_bypassed));
81+
};
82+
expect_bypassed(false);
83+
context.BypassPush(); // depth 1
84+
expect_bypassed(true);
85+
context.BypassPush(); // depth 2
86+
expect_bypassed(true);
87+
context.BypassPop(); // depth 1
88+
expect_bypassed(true);
89+
context.BypassPush(); // depth 2
90+
expect_bypassed(true);
91+
context.BypassPop(); // depth 1
92+
expect_bypassed(true);
93+
context.BypassPop(); // depth 0
94+
expect_bypassed(false);
95+
context.BypassPush(); // depth 1
96+
expect_bypassed(true);
7697
}

0 commit comments

Comments
 (0)