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