|
11 | 11 | #include "rtsan_test_utilities.h"
|
12 | 12 |
|
13 | 13 | #include "rtsan/rtsan.h"
|
14 |
| -#include "rtsan/rtsan_assertions.h" |
15 | 14 | #include "rtsan/rtsan_context.h"
|
16 | 15 |
|
17 | 16 | #include <gtest/gtest.h>
|
18 | 17 |
|
19 |
| -class TestRtsanContext : public ::testing::Test { |
| 18 | +using namespace ::testing; |
| 19 | + |
| 20 | +class TestRtsanContext : public Test { |
20 | 21 | protected:
|
21 | 22 | void SetUp() override { __rtsan_ensure_initialized(); }
|
22 | 23 | };
|
23 | 24 |
|
24 |
| -TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieBeforeRealtimePush) { |
| 25 | +TEST_F(TestRtsanContext, IsNotRealtimeAfterDefaultConstruction) { |
25 | 26 | __rtsan::Context context{};
|
26 |
| - ExpectNotRealtime(context, "do_some_stuff"); |
| 27 | + EXPECT_THAT(context.InRealtimeContext(), Eq(false)); |
27 | 28 | }
|
28 | 29 |
|
29 |
| -TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieAfterPushAndPop) { |
| 30 | +TEST_F(TestRtsanContext, IsRealtimeAfterRealtimePush) { |
30 | 31 | __rtsan::Context context{};
|
31 | 32 | context.RealtimePush();
|
32 |
| - context.RealtimePop(); |
33 |
| - ExpectNotRealtime(context, "do_some_stuff"); |
| 33 | + EXPECT_THAT(context.InRealtimeContext(), Eq(true)); |
34 | 34 | }
|
35 | 35 |
|
36 |
| -TEST_F(TestRtsanContext, ExpectNotRealtimeDiesAfterRealtimePush) { |
| 36 | +TEST_F(TestRtsanContext, IsNotRealtimeAfterRealtimePushAndPop) { |
37 | 37 | __rtsan::Context context{};
|
38 |
| - |
39 | 38 | 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)); |
41 | 42 | }
|
42 | 43 |
|
43 |
| -TEST_F(TestRtsanContext, |
44 |
| - ExpectNotRealtimeDiesAfterRealtimeAfterMorePushesThanPops) { |
| 44 | +TEST_F(TestRtsanContext, RealtimeContextStateIsStatefullyTracked) { |
45 | 45 | __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); |
53 | 64 | }
|
54 | 65 |
|
55 |
| -TEST_F(TestRtsanContext, ExpectNotRealtimeDoesNotDieAfterBypassPush) { |
| 66 | +TEST_F(TestRtsanContext, IsNotBypassedAfterDefaultConstruction) { |
56 | 67 | __rtsan::Context context{};
|
| 68 | + EXPECT_THAT(context.IsBypassed(), Eq(false)); |
| 69 | +} |
57 | 70 |
|
58 |
| - context.RealtimePush(); |
| 71 | +TEST_F(TestRtsanContext, IsBypassedAfterBypassPush) { |
| 72 | + __rtsan::Context context{}; |
59 | 73 | context.BypassPush();
|
60 |
| - ExpectNotRealtime(context, "do_some_stuff"); |
| 74 | + EXPECT_THAT(context.IsBypassed(), Eq(true)); |
61 | 75 | }
|
62 | 76 |
|
63 |
| -TEST_F(TestRtsanContext, |
64 |
| - ExpectNotRealtimeDoesNotDieIfBypassDepthIsGreaterThanZero) { |
| 77 | +TEST_F(TestRtsanContext, BypassedStateIsStatefullyTracked) { |
65 | 78 | __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); |
76 | 97 | }
|
0 commit comments