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
18using namespace __rtsan;
19using namespace ::testing;
20
21class TestRtsanContext : public Test {
22protected:
23 void SetUp() override { __rtsan_ensure_initialized(); }
24};
25
26TEST_F(TestRtsanContext, IsNotRealtimeAfterDefaultConstruction) {
27 Context context{};
28 EXPECT_THAT(context.InRealtimeContext(), Eq(false));
29}
30
31TEST_F(TestRtsanContext, IsRealtimeAfterRealtimePush) {
32 Context context{};
33 context.RealtimePush();
34 EXPECT_THAT(context.InRealtimeContext(), Eq(true));
35}
36
37TEST_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
45TEST_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
67TEST_F(TestRtsanContext, IsNotBypassedAfterDefaultConstruction) {
68 Context context{};
69 EXPECT_THAT(context.IsBypassed(), Eq(false));
70}
71
72TEST_F(TestRtsanContext, IsBypassedAfterBypassPush) {
73 Context context{};
74 context.BypassPush();
75 EXPECT_THAT(context.IsBypassed(), Eq(true));
76}
77
78TEST_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

source code of compiler-rt/lib/rtsan/tests/rtsan_test_context.cpp