xref: /llvm-project/compiler-rt/lib/rtsan/tests/rtsan_test_context.cpp (revision e069434afcd21911ad36c55971bb8f754854c09f)
1 //===--- rtsan_test_context.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 //===----------------------------------------------------------------------===//
10 
11 #include "rtsan_test_utilities.h"
12 
13 #include "rtsan/rtsan.h"
14 #include "rtsan/rtsan_context.h"
15 
16 #include <gtest/gtest.h>
17 
18 using namespace __rtsan;
19 using namespace ::testing;
20 
21 class TestRtsanContext : public Test {
22 protected:
23   void SetUp() override { __rtsan_ensure_initialized(); }
24 };
25 
26 TEST_F(TestRtsanContext, IsNotRealtimeAfterDefaultConstruction) {
27   Context context{};
28   EXPECT_THAT(context.InRealtimeContext(), Eq(false));
29 }
30 
31 TEST_F(TestRtsanContext, IsRealtimeAfterRealtimePush) {
32   Context context{};
33   context.RealtimePush();
34   EXPECT_THAT(context.InRealtimeContext(), Eq(true));
35 }
36 
37 TEST_F(TestRtsanContext, IsNotRealtimeAfterRealtimePushAndPop) {
38   Context context{};
39   context.RealtimePush();
40   ASSERT_THAT(context.InRealtimeContext(), Eq(true));
41   context.RealtimePop();
42   EXPECT_THAT(context.InRealtimeContext(), Eq(false));
43 }
44 
45 TEST_F(TestRtsanContext, RealtimeContextStateIsStatefullyTracked) {
46   Context context{};
47   auto const ExpectRealtime = [&context](bool is_rt) {
48     EXPECT_THAT(context.InRealtimeContext(), Eq(is_rt));
49   };
50   ExpectRealtime(false);
51   context.RealtimePush(); // depth 1
52   ExpectRealtime(true);
53   context.RealtimePush(); // depth 2
54   ExpectRealtime(true);
55   context.RealtimePop(); // depth 1
56   ExpectRealtime(true);
57   context.RealtimePush(); // depth 2
58   ExpectRealtime(true);
59   context.RealtimePop(); // depth 1
60   ExpectRealtime(true);
61   context.RealtimePop(); // depth 0
62   ExpectRealtime(false);
63   context.RealtimePush(); // depth 1
64   ExpectRealtime(true);
65 }
66 
67 TEST_F(TestRtsanContext, IsNotBypassedAfterDefaultConstruction) {
68   Context context{};
69   EXPECT_THAT(context.IsBypassed(), Eq(false));
70 }
71 
72 TEST_F(TestRtsanContext, IsBypassedAfterBypassPush) {
73   Context context{};
74   context.BypassPush();
75   EXPECT_THAT(context.IsBypassed(), Eq(true));
76 }
77 
78 TEST_F(TestRtsanContext, BypassedStateIsStatefullyTracked) {
79   Context context{};
80   auto const ExpectBypassed = [&context](bool is_bypassed) {
81     EXPECT_THAT(context.IsBypassed(), Eq(is_bypassed));
82   };
83   ExpectBypassed(false);
84   context.BypassPush(); // depth 1
85   ExpectBypassed(true);
86   context.BypassPush(); // depth 2
87   ExpectBypassed(true);
88   context.BypassPop(); // depth 1
89   ExpectBypassed(true);
90   context.BypassPush(); // depth 2
91   ExpectBypassed(true);
92   context.BypassPop(); // depth 1
93   ExpectBypassed(true);
94   context.BypassPop(); // depth 0
95   ExpectBypassed(false);
96   context.BypassPush(); // depth 1
97   ExpectBypassed(true);
98 }
99