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 19 TEST(Flags, Basic) { 20 // At least should not crash. 21 Flags f; 22 InitializeFlags(&f, 0); 23 InitializeFlags(&f, ""); 24 } 25 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 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 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; 135 extern "C" const char *__tsan_default_options() { 136 return test_default_options; 137 } 138 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 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 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