15de29a4bSNico Weber //===-- tsan_flags_test.cpp -----------------------------------------------===//
25de29a4bSNico Weber //
35de29a4bSNico Weber // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45de29a4bSNico Weber // See https://llvm.org/LICENSE.txt for license information.
55de29a4bSNico Weber // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65de29a4bSNico Weber //
75de29a4bSNico Weber //===----------------------------------------------------------------------===//
85de29a4bSNico Weber //
95de29a4bSNico Weber // This file is a part of ThreadSanitizer (TSan), a race detector.
105de29a4bSNico Weber //
115de29a4bSNico Weber //===----------------------------------------------------------------------===//
125de29a4bSNico Weber #include "tsan_flags.h"
135de29a4bSNico Weber #include "tsan_rtl.h"
145de29a4bSNico Weber #include "gtest/gtest.h"
155de29a4bSNico Weber #include <string>
165de29a4bSNico Weber
175de29a4bSNico Weber namespace __tsan {
185de29a4bSNico Weber
TEST(Flags,Basic)195de29a4bSNico Weber TEST(Flags, Basic) {
205de29a4bSNico Weber // At least should not crash.
215de29a4bSNico Weber Flags f;
225de29a4bSNico Weber InitializeFlags(&f, 0);
235de29a4bSNico Weber InitializeFlags(&f, "");
245de29a4bSNico Weber }
255de29a4bSNico Weber
TEST(Flags,DefaultValues)265de29a4bSNico Weber TEST(Flags, DefaultValues) {
275de29a4bSNico Weber Flags f;
285de29a4bSNico Weber
295de29a4bSNico Weber f.enable_annotations = false;
305de29a4bSNico Weber InitializeFlags(&f, "");
315de29a4bSNico Weber EXPECT_EQ(true, f.enable_annotations);
325de29a4bSNico Weber }
335de29a4bSNico Weber
345de29a4bSNico Weber static const char *options1 =
355de29a4bSNico Weber " enable_annotations=0"
365de29a4bSNico Weber " suppress_equal_stacks=0"
375de29a4bSNico Weber " report_bugs=0"
385de29a4bSNico Weber " report_thread_leaks=0"
395de29a4bSNico Weber " report_destroy_locked=0"
405de29a4bSNico Weber " report_mutex_bugs=0"
415de29a4bSNico Weber " report_signal_unsafe=0"
425de29a4bSNico Weber " report_atomic_races=0"
435de29a4bSNico Weber " force_seq_cst_atomics=0"
445de29a4bSNico Weber " halt_on_error=0"
455de29a4bSNico Weber " atexit_sleep_ms=222"
465de29a4bSNico Weber " profile_memory=qqq"
475de29a4bSNico Weber " flush_memory_ms=444"
485de29a4bSNico Weber " flush_symbolizer_ms=555"
495de29a4bSNico Weber " memory_limit_mb=666"
505de29a4bSNico Weber " stop_on_start=0"
515de29a4bSNico Weber " running_on_valgrind=0"
525de29a4bSNico Weber " history_size=5"
535de29a4bSNico Weber " io_sync=1"
545de29a4bSNico Weber " die_after_fork=true"
555de29a4bSNico Weber "";
565de29a4bSNico Weber
575de29a4bSNico Weber static const char *options2 =
585de29a4bSNico Weber " enable_annotations=true"
595de29a4bSNico Weber " suppress_equal_stacks=true"
605de29a4bSNico Weber " report_bugs=true"
615de29a4bSNico Weber " report_thread_leaks=true"
625de29a4bSNico Weber " report_destroy_locked=true"
635de29a4bSNico Weber " report_mutex_bugs=true"
645de29a4bSNico Weber " report_signal_unsafe=true"
655de29a4bSNico Weber " report_atomic_races=true"
665de29a4bSNico Weber " force_seq_cst_atomics=true"
675de29a4bSNico Weber " halt_on_error=true"
685de29a4bSNico Weber " atexit_sleep_ms=123"
695de29a4bSNico Weber " profile_memory=bbbbb"
705de29a4bSNico Weber " flush_memory_ms=234"
715de29a4bSNico Weber " flush_symbolizer_ms=345"
725de29a4bSNico Weber " memory_limit_mb=456"
735de29a4bSNico Weber " stop_on_start=true"
745de29a4bSNico Weber " running_on_valgrind=true"
755de29a4bSNico Weber " history_size=6"
765de29a4bSNico Weber " io_sync=2"
775de29a4bSNico Weber " die_after_fork=false"
785de29a4bSNico Weber "";
795de29a4bSNico Weber
VerifyOptions1(Flags * f)805de29a4bSNico Weber void VerifyOptions1(Flags *f) {
815de29a4bSNico Weber EXPECT_EQ(f->enable_annotations, 0);
825de29a4bSNico Weber EXPECT_EQ(f->suppress_equal_stacks, 0);
835de29a4bSNico Weber EXPECT_EQ(f->report_bugs, 0);
845de29a4bSNico Weber EXPECT_EQ(f->report_thread_leaks, 0);
855de29a4bSNico Weber EXPECT_EQ(f->report_destroy_locked, 0);
865de29a4bSNico Weber EXPECT_EQ(f->report_mutex_bugs, 0);
875de29a4bSNico Weber EXPECT_EQ(f->report_signal_unsafe, 0);
885de29a4bSNico Weber EXPECT_EQ(f->report_atomic_races, 0);
895de29a4bSNico Weber EXPECT_EQ(f->force_seq_cst_atomics, 0);
905de29a4bSNico Weber EXPECT_EQ(f->halt_on_error, 0);
915de29a4bSNico Weber EXPECT_EQ(f->atexit_sleep_ms, 222);
925de29a4bSNico Weber EXPECT_EQ(f->profile_memory, std::string("qqq"));
935de29a4bSNico Weber EXPECT_EQ(f->flush_memory_ms, 444);
945de29a4bSNico Weber EXPECT_EQ(f->flush_symbolizer_ms, 555);
955de29a4bSNico Weber EXPECT_EQ(f->memory_limit_mb, 666);
965de29a4bSNico Weber EXPECT_EQ(f->stop_on_start, 0);
975de29a4bSNico Weber EXPECT_EQ(f->running_on_valgrind, 0);
98*b3321349SDmitry Vyukov EXPECT_EQ(f->history_size, (uptr)5);
995de29a4bSNico Weber EXPECT_EQ(f->io_sync, 1);
1005de29a4bSNico Weber EXPECT_EQ(f->die_after_fork, true);
1015de29a4bSNico Weber }
1025de29a4bSNico Weber
VerifyOptions2(Flags * f)1035de29a4bSNico Weber void VerifyOptions2(Flags *f) {
1045de29a4bSNico Weber EXPECT_EQ(f->enable_annotations, true);
1055de29a4bSNico Weber EXPECT_EQ(f->suppress_equal_stacks, true);
1065de29a4bSNico Weber EXPECT_EQ(f->report_bugs, true);
1075de29a4bSNico Weber EXPECT_EQ(f->report_thread_leaks, true);
1085de29a4bSNico Weber EXPECT_EQ(f->report_destroy_locked, true);
1095de29a4bSNico Weber EXPECT_EQ(f->report_mutex_bugs, true);
1105de29a4bSNico Weber EXPECT_EQ(f->report_signal_unsafe, true);
1115de29a4bSNico Weber EXPECT_EQ(f->report_atomic_races, true);
1125de29a4bSNico Weber EXPECT_EQ(f->force_seq_cst_atomics, true);
1135de29a4bSNico Weber EXPECT_EQ(f->halt_on_error, true);
1145de29a4bSNico Weber EXPECT_EQ(f->atexit_sleep_ms, 123);
1155de29a4bSNico Weber EXPECT_EQ(f->profile_memory, std::string("bbbbb"));
1165de29a4bSNico Weber EXPECT_EQ(f->flush_memory_ms, 234);
1175de29a4bSNico Weber EXPECT_EQ(f->flush_symbolizer_ms, 345);
1185de29a4bSNico Weber EXPECT_EQ(f->memory_limit_mb, 456);
1195de29a4bSNico Weber EXPECT_EQ(f->stop_on_start, true);
1205de29a4bSNico Weber EXPECT_EQ(f->running_on_valgrind, true);
121*b3321349SDmitry Vyukov EXPECT_EQ(f->history_size, 6ul);
1225de29a4bSNico Weber EXPECT_EQ(f->io_sync, 2);
1235de29a4bSNico Weber EXPECT_EQ(f->die_after_fork, false);
1245de29a4bSNico Weber }
1255de29a4bSNico Weber
1265de29a4bSNico Weber static const char *test_default_options;
__tsan_default_options()1275de29a4bSNico Weber extern "C" const char *__tsan_default_options() {
1285de29a4bSNico Weber return test_default_options;
1295de29a4bSNico Weber }
1305de29a4bSNico Weber
TEST(Flags,ParseDefaultOptions)1315de29a4bSNico Weber TEST(Flags, ParseDefaultOptions) {
1325de29a4bSNico Weber Flags f;
1335de29a4bSNico Weber
1345de29a4bSNico Weber test_default_options = options1;
1355de29a4bSNico Weber InitializeFlags(&f, "");
1365de29a4bSNico Weber VerifyOptions1(&f);
1375de29a4bSNico Weber
1385de29a4bSNico Weber test_default_options = options2;
1395de29a4bSNico Weber InitializeFlags(&f, "");
1405de29a4bSNico Weber VerifyOptions2(&f);
1415de29a4bSNico Weber }
1425de29a4bSNico Weber
TEST(Flags,ParseEnvOptions)1435de29a4bSNico Weber TEST(Flags, ParseEnvOptions) {
1445de29a4bSNico Weber Flags f;
1455de29a4bSNico Weber
1465de29a4bSNico Weber InitializeFlags(&f, options1);
1475de29a4bSNico Weber VerifyOptions1(&f);
1485de29a4bSNico Weber
1495de29a4bSNico Weber InitializeFlags(&f, options2);
1505de29a4bSNico Weber VerifyOptions2(&f);
1515de29a4bSNico Weber }
1525de29a4bSNico Weber
TEST(Flags,ParsePriority)1535de29a4bSNico Weber TEST(Flags, ParsePriority) {
1545de29a4bSNico Weber Flags f;
1555de29a4bSNico Weber
1565de29a4bSNico Weber test_default_options = options2;
1575de29a4bSNico Weber InitializeFlags(&f, options1);
1585de29a4bSNico Weber VerifyOptions1(&f);
1595de29a4bSNico Weber
1605de29a4bSNico Weber test_default_options = options1;
1615de29a4bSNico Weber InitializeFlags(&f, options2);
1625de29a4bSNico Weber VerifyOptions2(&f);
1635de29a4bSNico Weber }
1645de29a4bSNico Weber
1655de29a4bSNico Weber } // namespace __tsan
166