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