1 //===-- tsan_flags_test.cpp -----------------------------------------------===//
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 // This file is a part of ThreadSanitizer (TSan), a race detector.
10 //
11 //===----------------------------------------------------------------------===//
12 #include "tsan_flags.h"
13 #include "tsan_rtl.h"
14 #include "gtest/gtest.h"
15 #include <string>
16
17 namespace __tsan {
18
TEST(Flags,Basic)19 TEST(Flags, Basic) {
20 // At least should not crash.
21 Flags f;
22 InitializeFlags(&f, 0);
23 InitializeFlags(&f, "");
24 }
25
TEST(Flags,DefaultValues)26 TEST(Flags, DefaultValues) {
27 Flags f;
28
29 f.enable_annotations = false;
30 InitializeFlags(&f, "");
31 EXPECT_EQ(true, f.enable_annotations);
32 }
33
34 static const char *options1 =
35 " enable_annotations=0"
36 " suppress_equal_stacks=0"
37 " suppress_equal_addresses=0"
38 " report_bugs=0"
39 " report_thread_leaks=0"
40 " report_destroy_locked=0"
41 " report_mutex_bugs=0"
42 " report_signal_unsafe=0"
43 " report_atomic_races=0"
44 " force_seq_cst_atomics=0"
45 " print_benign=0"
46 " halt_on_error=0"
47 " atexit_sleep_ms=222"
48 " profile_memory=qqq"
49 " flush_memory_ms=444"
50 " flush_symbolizer_ms=555"
51 " memory_limit_mb=666"
52 " stop_on_start=0"
53 " running_on_valgrind=0"
54 " history_size=5"
55 " io_sync=1"
56 " die_after_fork=true"
57 "";
58
59 static const char *options2 =
60 " enable_annotations=true"
61 " suppress_equal_stacks=true"
62 " suppress_equal_addresses=true"
63 " report_bugs=true"
64 " report_thread_leaks=true"
65 " report_destroy_locked=true"
66 " report_mutex_bugs=true"
67 " report_signal_unsafe=true"
68 " report_atomic_races=true"
69 " force_seq_cst_atomics=true"
70 " print_benign=true"
71 " halt_on_error=true"
72 " atexit_sleep_ms=123"
73 " profile_memory=bbbbb"
74 " flush_memory_ms=234"
75 " flush_symbolizer_ms=345"
76 " memory_limit_mb=456"
77 " stop_on_start=true"
78 " running_on_valgrind=true"
79 " history_size=6"
80 " io_sync=2"
81 " die_after_fork=false"
82 "";
83
VerifyOptions1(Flags * f)84 void VerifyOptions1(Flags *f) {
85 EXPECT_EQ(f->enable_annotations, 0);
86 EXPECT_EQ(f->suppress_equal_stacks, 0);
87 EXPECT_EQ(f->suppress_equal_addresses, 0);
88 EXPECT_EQ(f->report_bugs, 0);
89 EXPECT_EQ(f->report_thread_leaks, 0);
90 EXPECT_EQ(f->report_destroy_locked, 0);
91 EXPECT_EQ(f->report_mutex_bugs, 0);
92 EXPECT_EQ(f->report_signal_unsafe, 0);
93 EXPECT_EQ(f->report_atomic_races, 0);
94 EXPECT_EQ(f->force_seq_cst_atomics, 0);
95 EXPECT_EQ(f->print_benign, 0);
96 EXPECT_EQ(f->halt_on_error, 0);
97 EXPECT_EQ(f->atexit_sleep_ms, 222);
98 EXPECT_EQ(f->profile_memory, std::string("qqq"));
99 EXPECT_EQ(f->flush_memory_ms, 444);
100 EXPECT_EQ(f->flush_symbolizer_ms, 555);
101 EXPECT_EQ(f->memory_limit_mb, 666);
102 EXPECT_EQ(f->stop_on_start, 0);
103 EXPECT_EQ(f->running_on_valgrind, 0);
104 EXPECT_EQ(f->history_size, 5);
105 EXPECT_EQ(f->io_sync, 1);
106 EXPECT_EQ(f->die_after_fork, true);
107 }
108
VerifyOptions2(Flags * f)109 void VerifyOptions2(Flags *f) {
110 EXPECT_EQ(f->enable_annotations, true);
111 EXPECT_EQ(f->suppress_equal_stacks, true);
112 EXPECT_EQ(f->suppress_equal_addresses, true);
113 EXPECT_EQ(f->report_bugs, true);
114 EXPECT_EQ(f->report_thread_leaks, true);
115 EXPECT_EQ(f->report_destroy_locked, true);
116 EXPECT_EQ(f->report_mutex_bugs, true);
117 EXPECT_EQ(f->report_signal_unsafe, true);
118 EXPECT_EQ(f->report_atomic_races, true);
119 EXPECT_EQ(f->force_seq_cst_atomics, true);
120 EXPECT_EQ(f->print_benign, true);
121 EXPECT_EQ(f->halt_on_error, true);
122 EXPECT_EQ(f->atexit_sleep_ms, 123);
123 EXPECT_EQ(f->profile_memory, std::string("bbbbb"));
124 EXPECT_EQ(f->flush_memory_ms, 234);
125 EXPECT_EQ(f->flush_symbolizer_ms, 345);
126 EXPECT_EQ(f->memory_limit_mb, 456);
127 EXPECT_EQ(f->stop_on_start, true);
128 EXPECT_EQ(f->running_on_valgrind, true);
129 EXPECT_EQ(f->history_size, 6);
130 EXPECT_EQ(f->io_sync, 2);
131 EXPECT_EQ(f->die_after_fork, false);
132 }
133
134 static const char *test_default_options;
__tsan_default_options()135 extern "C" const char *__tsan_default_options() {
136 return test_default_options;
137 }
138
TEST(Flags,ParseDefaultOptions)139 TEST(Flags, ParseDefaultOptions) {
140 Flags f;
141
142 test_default_options = options1;
143 InitializeFlags(&f, "");
144 VerifyOptions1(&f);
145
146 test_default_options = options2;
147 InitializeFlags(&f, "");
148 VerifyOptions2(&f);
149 }
150
TEST(Flags,ParseEnvOptions)151 TEST(Flags, ParseEnvOptions) {
152 Flags f;
153
154 InitializeFlags(&f, options1);
155 VerifyOptions1(&f);
156
157 InitializeFlags(&f, options2);
158 VerifyOptions2(&f);
159 }
160
TEST(Flags,ParsePriority)161 TEST(Flags, ParsePriority) {
162 Flags f;
163
164 test_default_options = options2;
165 InitializeFlags(&f, options1);
166 VerifyOptions1(&f);
167
168 test_default_options = options1;
169 InitializeFlags(&f, options2);
170 VerifyOptions2(&f);
171 }
172
173 } // namespace __tsan
174