99 lines · cpp
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-exception6//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 152 ExpectRealtime(true);53 context.RealtimePush(); // depth 254 ExpectRealtime(true);55 context.RealtimePop(); // depth 156 ExpectRealtime(true);57 context.RealtimePush(); // depth 258 ExpectRealtime(true);59 context.RealtimePop(); // depth 160 ExpectRealtime(true);61 context.RealtimePop(); // depth 062 ExpectRealtime(false);63 context.RealtimePush(); // depth 164 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 185 ExpectBypassed(true);86 context.BypassPush(); // depth 287 ExpectBypassed(true);88 context.BypassPop(); // depth 189 ExpectBypassed(true);90 context.BypassPush(); // depth 291 ExpectBypassed(true);92 context.BypassPop(); // depth 193 ExpectBypassed(true);94 context.BypassPop(); // depth 095 ExpectBypassed(false);96 context.BypassPush(); // depth 197 ExpectBypassed(true);98}99