diff options
Diffstat (limited to 'third_party/abseil-cpp/absl/flags/flag_test.cc')
-rw-r--r-- | third_party/abseil-cpp/absl/flags/flag_test.cc | 737 |
1 files changed, 138 insertions, 599 deletions
diff --git a/third_party/abseil-cpp/absl/flags/flag_test.cc b/third_party/abseil-cpp/absl/flags/flag_test.cc index 6e974a5b5e..4984d28403 100644 --- a/third_party/abseil-cpp/absl/flags/flag_test.cc +++ b/third_party/abseil-cpp/absl/flags/flag_test.cc @@ -15,31 +15,25 @@ #include "absl/flags/flag.h" -#include <stddef.h> #include <stdint.h> -#include <atomic> #include <cmath> -#include <new> #include <string> -#include <thread> // NOLINT #include <vector> #include "gtest/gtest.h" #include "absl/base/attributes.h" -#include "absl/base/macros.h" #include "absl/flags/config.h" #include "absl/flags/declare.h" +#include "absl/flags/internal/commandlineflag.h" #include "absl/flags/internal/flag.h" -#include "absl/flags/marshalling.h" -#include "absl/flags/reflection.h" +#include "absl/flags/internal/registry.h" #include "absl/flags/usage_config.h" #include "absl/strings/match.h" #include "absl/strings/numbers.h" #include "absl/strings/str_cat.h" #include "absl/strings/str_split.h" #include "absl/strings/string_view.h" -#include "absl/time/time.h" ABSL_DECLARE_FLAG(int64_t, mistyped_int_flag); ABSL_DECLARE_FLAG(std::vector<std::string>, mistyped_string_flag); @@ -49,19 +43,37 @@ namespace { namespace flags = absl::flags_internal; std::string TestHelpMsg() { return "dynamic help"; } -#if defined(_MSC_VER) && !defined(__clang__) -std::string TestLiteralHelpMsg() { return "literal help"; } -#endif template <typename T> -void TestMakeDflt(void* dst) { - new (dst) T{}; +void* TestMakeDflt() { + return new T{}; } void TestCallback() {} +template <typename T> +bool TestConstructionFor() { + constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"), + flags::FlagHelpKind::kLiteral}; + constexpr flags::Flag<T> f1("f1", "file", help_arg, &TestMakeDflt<T>); + EXPECT_EQ(f1.Name(), "f1"); + EXPECT_EQ(f1.Help(), "literal help"); + EXPECT_EQ(f1.Filename(), "file"); + + ABSL_CONST_INIT static flags::Flag<T> f2( + "f2", "file", + {flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, + &TestMakeDflt<T>); + flags::FlagRegistrar<T, false>(&f2).OnUpdate(TestCallback); + + EXPECT_EQ(f2.Name(), "f2"); + EXPECT_EQ(f2.Help(), "dynamic help"); + EXPECT_EQ(f2.Filename(), "file"); + + return true; +} + struct UDT { UDT() = default; UDT(const UDT&) = default; - UDT& operator=(const UDT&) = default; }; bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; } std::string AbslUnparseFlag(const UDT&) { return ""; } @@ -84,124 +96,21 @@ class FlagTest : public testing::Test { #endif return std::string(fname); } - absl::FlagSaver flag_saver_; -}; - -struct S1 { - S1() = default; - S1(const S1&) = default; - int32_t f1; - int64_t f2; }; -struct S2 { - S2() = default; - S2(const S2&) = default; - int64_t f1; - double f2; -}; - -TEST_F(FlagTest, Traits) { - EXPECT_EQ(flags::StorageKind<int>(), - flags::FlagValueStorageKind::kValueAndInitBit); - EXPECT_EQ(flags::StorageKind<bool>(), - flags::FlagValueStorageKind::kValueAndInitBit); - EXPECT_EQ(flags::StorageKind<double>(), - flags::FlagValueStorageKind::kOneWordAtomic); - EXPECT_EQ(flags::StorageKind<int64_t>(), - flags::FlagValueStorageKind::kOneWordAtomic); - - EXPECT_EQ(flags::StorageKind<S1>(), - flags::FlagValueStorageKind::kSequenceLocked); - EXPECT_EQ(flags::StorageKind<S2>(), - flags::FlagValueStorageKind::kSequenceLocked); -// Make sure absl::Duration uses the sequence-locked code path. MSVC 2015 -// doesn't consider absl::Duration to be trivially-copyable so we just -// restrict this to clang as it seems to be a well-behaved compiler. -#ifdef __clang__ - EXPECT_EQ(flags::StorageKind<absl::Duration>(), - flags::FlagValueStorageKind::kSequenceLocked); -#endif - - EXPECT_EQ(flags::StorageKind<std::string>(), - flags::FlagValueStorageKind::kAlignedBuffer); - EXPECT_EQ(flags::StorageKind<std::vector<std::string>>(), - flags::FlagValueStorageKind::kAlignedBuffer); -} - -// -------------------------------------------------------------------- - -constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"), - flags::FlagHelpKind::kLiteral}; - -using String = std::string; - -#if !defined(_MSC_VER) || defined(__clang__) -#define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind) \ - constexpr flags::FlagDefaultArg f1default##T{ \ - flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind}; \ - constexpr absl::Flag<T> f1##T{"f1", "file", help_arg, f1default##T}; \ - ABSL_CONST_INIT absl::Flag<T> f2##T { \ - "f2", "file", \ - {flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, \ - flags::FlagDefaultArg { \ - flags::FlagDefaultSrc(&TestMakeDflt<T>), \ - flags::FlagDefaultKind::kGenFunc \ - } \ - } -#else -#define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind) \ - constexpr flags::FlagDefaultArg f1default##T{ \ - flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind}; \ - constexpr absl::Flag<T> f1##T{"f1", "file", &TestLiteralHelpMsg, \ - &TestMakeDflt<T>}; \ - ABSL_CONST_INIT absl::Flag<T> f2##T { \ - "f2", "file", &TestHelpMsg, &TestMakeDflt<T> \ - } -#endif - -DEFINE_CONSTRUCTED_FLAG(bool, true, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int16_t, 1, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint16_t, 2, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int32_t, 3, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint32_t, 4, kOneWord); -DEFINE_CONSTRUCTED_FLAG(int64_t, 5, kOneWord); -DEFINE_CONSTRUCTED_FLAG(uint64_t, 6, kOneWord); -DEFINE_CONSTRUCTED_FLAG(float, 7.8, kOneWord); -DEFINE_CONSTRUCTED_FLAG(double, 9.10, kOneWord); -DEFINE_CONSTRUCTED_FLAG(String, &TestMakeDflt<String>, kGenFunc); -DEFINE_CONSTRUCTED_FLAG(UDT, &TestMakeDflt<UDT>, kGenFunc); - -template <typename T> -bool TestConstructionFor(const absl::Flag<T>& f1, absl::Flag<T>& f2) { - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Name(), "f1"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Help(), "literal help"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Filename(), "file"); - - flags::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(f2), nullptr) - .OnUpdate(TestCallback); - - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Name(), "f2"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Help(), "dynamic help"); - EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Filename(), "file"); - - return true; -} - -#define TEST_CONSTRUCTED_FLAG(T) TestConstructionFor(f1##T, f2##T); - TEST_F(FlagTest, TestConstruction) { - TEST_CONSTRUCTED_FLAG(bool); - TEST_CONSTRUCTED_FLAG(int16_t); - TEST_CONSTRUCTED_FLAG(uint16_t); - TEST_CONSTRUCTED_FLAG(int32_t); - TEST_CONSTRUCTED_FLAG(uint32_t); - TEST_CONSTRUCTED_FLAG(int64_t); - TEST_CONSTRUCTED_FLAG(uint64_t); - TEST_CONSTRUCTED_FLAG(float); - TEST_CONSTRUCTED_FLAG(double); - TEST_CONSTRUCTED_FLAG(String); - TEST_CONSTRUCTED_FLAG(UDT); + TestConstructionFor<bool>(); + TestConstructionFor<int16_t>(); + TestConstructionFor<uint16_t>(); + TestConstructionFor<int32_t>(); + TestConstructionFor<uint32_t>(); + TestConstructionFor<int64_t>(); + TestConstructionFor<uint64_t>(); + TestConstructionFor<double>(); + TestConstructionFor<float>(); + TestConstructionFor<std::string>(); + + TestConstructionFor<UDT>(); } // -------------------------------------------------------------------- @@ -219,7 +128,6 @@ ABSL_DECLARE_FLAG(uint64_t, test_flag_08); ABSL_DECLARE_FLAG(double, test_flag_09); ABSL_DECLARE_FLAG(float, test_flag_10); ABSL_DECLARE_FLAG(std::string, test_flag_11); -ABSL_DECLARE_FLAG(absl::Duration, test_flag_12); namespace { @@ -227,30 +135,17 @@ namespace { TEST_F(FlagTest, TestFlagDeclaration) { // test that we can access flag objects. - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(), - "test_flag_01"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(), - "test_flag_02"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(), - "test_flag_03"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(), - "test_flag_04"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(), - "test_flag_05"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(), - "test_flag_06"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(), - "test_flag_07"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(), - "test_flag_08"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(), - "test_flag_09"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(), - "test_flag_10"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(), - "test_flag_11"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(), - "test_flag_12"); + EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01"); + EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02"); + EXPECT_EQ(FLAGS_test_flag_03.Name(), "test_flag_03"); + EXPECT_EQ(FLAGS_test_flag_04.Name(), "test_flag_04"); + EXPECT_EQ(FLAGS_test_flag_05.Name(), "test_flag_05"); + EXPECT_EQ(FLAGS_test_flag_06.Name(), "test_flag_06"); + EXPECT_EQ(FLAGS_test_flag_07.Name(), "test_flag_07"); + EXPECT_EQ(FLAGS_test_flag_08.Name(), "test_flag_08"); + EXPECT_EQ(FLAGS_test_flag_09.Name(), "test_flag_09"); + EXPECT_EQ(FLAGS_test_flag_10.Name(), "test_flag_10"); + EXPECT_EQ(FLAGS_test_flag_11.Name(), "test_flag_11"); } #endif // !ABSL_FLAGS_STRIP_NAMES @@ -269,7 +164,6 @@ ABSL_FLAG(uint64_t, test_flag_08, 9876543, "test flag 08"); ABSL_FLAG(double, test_flag_09, -9.876e-50, "test flag 09"); ABSL_FLAG(float, test_flag_10, 1.234e12f, "test flag 10"); ABSL_FLAG(std::string, test_flag_11, "", "test flag 11"); -ABSL_FLAG(absl::Duration, test_flag_12, absl::Minutes(10), "test flag 12"); namespace { @@ -277,169 +171,66 @@ namespace { TEST_F(FlagTest, TestFlagDefinition) { absl::string_view expected_file_name = "absl/flags/flag_test.cc"; - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(), - "test_flag_01"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Help(), - "test flag 01"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(), - "test_flag_02"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Help(), - "test flag 02"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(), - "test_flag_03"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Help(), - "test flag 03"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(), - "test_flag_04"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Help(), - "test flag 04"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(), - "test_flag_05"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Help(), - "test flag 05"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(), - "test_flag_06"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Help(), - "test flag 06"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(), - "test_flag_07"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Help(), - "test flag 07"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(), - "test_flag_08"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Help(), - "test flag 08"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(), - "test_flag_09"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Help(), - "test flag 09"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(), - "test_flag_10"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Help(), - "test flag 10"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(), - "test_flag_11"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Help(), - "test flag 11"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename(); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(), - "test_flag_12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Help(), - "test flag 12"); - EXPECT_TRUE(absl::EndsWith( - absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename(), - expected_file_name)) - << absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename(); + EXPECT_EQ(FLAGS_test_flag_01.Name(), "test_flag_01"); + EXPECT_EQ(FLAGS_test_flag_01.Help(), "test flag 01"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_01.Filename(), expected_file_name)) + << FLAGS_test_flag_01.Filename(); + + EXPECT_EQ(FLAGS_test_flag_02.Name(), "test_flag_02"); + EXPECT_EQ(FLAGS_test_flag_02.Help(), "test flag 02"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_02.Filename(), expected_file_name)) + << FLAGS_test_flag_02.Filename(); + + EXPECT_EQ(FLAGS_test_flag_03.Name(), "test_flag_03"); + EXPECT_EQ(FLAGS_test_flag_03.Help(), "test flag 03"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_03.Filename(), expected_file_name)) + << FLAGS_test_flag_03.Filename(); + + EXPECT_EQ(FLAGS_test_flag_04.Name(), "test_flag_04"); + EXPECT_EQ(FLAGS_test_flag_04.Help(), "test flag 04"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_04.Filename(), expected_file_name)) + << FLAGS_test_flag_04.Filename(); + + EXPECT_EQ(FLAGS_test_flag_05.Name(), "test_flag_05"); + EXPECT_EQ(FLAGS_test_flag_05.Help(), "test flag 05"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_05.Filename(), expected_file_name)) + << FLAGS_test_flag_05.Filename(); + + EXPECT_EQ(FLAGS_test_flag_06.Name(), "test_flag_06"); + EXPECT_EQ(FLAGS_test_flag_06.Help(), "test flag 06"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_06.Filename(), expected_file_name)) + << FLAGS_test_flag_06.Filename(); + + EXPECT_EQ(FLAGS_test_flag_07.Name(), "test_flag_07"); + EXPECT_EQ(FLAGS_test_flag_07.Help(), "test flag 07"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_07.Filename(), expected_file_name)) + << FLAGS_test_flag_07.Filename(); + + EXPECT_EQ(FLAGS_test_flag_08.Name(), "test_flag_08"); + EXPECT_EQ(FLAGS_test_flag_08.Help(), "test flag 08"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_08.Filename(), expected_file_name)) + << FLAGS_test_flag_08.Filename(); + + EXPECT_EQ(FLAGS_test_flag_09.Name(), "test_flag_09"); + EXPECT_EQ(FLAGS_test_flag_09.Help(), "test flag 09"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_09.Filename(), expected_file_name)) + << FLAGS_test_flag_09.Filename(); + + EXPECT_EQ(FLAGS_test_flag_10.Name(), "test_flag_10"); + EXPECT_EQ(FLAGS_test_flag_10.Help(), "test flag 10"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_10.Filename(), expected_file_name)) + << FLAGS_test_flag_10.Filename(); + + EXPECT_EQ(FLAGS_test_flag_11.Name(), "test_flag_11"); + EXPECT_EQ(FLAGS_test_flag_11.Help(), "test flag 11"); + EXPECT_TRUE(absl::EndsWith(FLAGS_test_flag_11.Filename(), expected_file_name)) + << FLAGS_test_flag_11.Filename(); } #endif // !ABSL_FLAGS_STRIP_NAMES // -------------------------------------------------------------------- TEST_F(FlagTest, TestDefault) { - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).DefaultValue(), - "true"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).DefaultValue(), - "1234"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).DefaultValue(), - "-34"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).DefaultValue(), - "189"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).DefaultValue(), - "10765"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).DefaultValue(), - "40000"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).DefaultValue(), - "-1234567"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).DefaultValue(), - "9876543"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).DefaultValue(), - "-9.876e-50"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).DefaultValue(), - "1.234e+12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).DefaultValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).DefaultValue(), - "10m"); - - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).CurrentValue(), - "true"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).CurrentValue(), - "1234"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).CurrentValue(), - "-34"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).CurrentValue(), - "189"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).CurrentValue(), - "10765"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).CurrentValue(), - "40000"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).CurrentValue(), - "-1234567"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).CurrentValue(), - "9876543"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).CurrentValue(), - "-9.876e-50"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).CurrentValue(), - "1.234e+12"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).CurrentValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).CurrentValue(), - "10m"); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true); EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234); EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34); @@ -451,68 +242,6 @@ TEST_F(FlagTest, TestDefault) { EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55); EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f); EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10)); -} - -// -------------------------------------------------------------------- - -struct NonTriviallyCopyableAggregate { - NonTriviallyCopyableAggregate() = default; - NonTriviallyCopyableAggregate(const NonTriviallyCopyableAggregate& rhs) - : value(rhs.value) {} - NonTriviallyCopyableAggregate& operator=( - const NonTriviallyCopyableAggregate& rhs) { - value = rhs.value; - return *this; - } - - int value; -}; -bool AbslParseFlag(absl::string_view src, NonTriviallyCopyableAggregate* f, - std::string* e) { - return absl::ParseFlag(src, &f->value, e); -} -std::string AbslUnparseFlag(const NonTriviallyCopyableAggregate& ntc) { - return absl::StrCat(ntc.value); -} - -bool operator==(const NonTriviallyCopyableAggregate& ntc1, - const NonTriviallyCopyableAggregate& ntc2) { - return ntc1.value == ntc2.value; -} - -} // namespace - -ABSL_FLAG(bool, test_flag_eb_01, {}, ""); -ABSL_FLAG(int32_t, test_flag_eb_02, {}, ""); -ABSL_FLAG(int64_t, test_flag_eb_03, {}, ""); -ABSL_FLAG(double, test_flag_eb_04, {}, ""); -ABSL_FLAG(std::string, test_flag_eb_05, {}, ""); -ABSL_FLAG(NonTriviallyCopyableAggregate, test_flag_eb_06, {}, ""); - -namespace { - -TEST_F(FlagTest, TestEmptyBracesDefault) { - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_01).DefaultValue(), - "false"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_02).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_03).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_04).DefaultValue(), - "0"); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_05).DefaultValue(), - ""); - EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_06).DefaultValue(), - "0"); - - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_01), false); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_02), 0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_03), 0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_04), 0.0); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_05), ""); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_06), - NonTriviallyCopyableAggregate{}); } // -------------------------------------------------------------------- @@ -550,75 +279,6 @@ TEST_F(FlagTest, TestGetSet) { absl::SetFlag(&FLAGS_test_flag_11, "asdf"); EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), "asdf"); - - absl::SetFlag(&FLAGS_test_flag_12, absl::Seconds(110)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Seconds(110)); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagTest, TestGetViaReflection) { - auto* handle = absl::FindCommandLineFlag("test_flag_01"); - EXPECT_EQ(*handle->TryGet<bool>(), true); - handle = absl::FindCommandLineFlag("test_flag_02"); - EXPECT_EQ(*handle->TryGet<int>(), 1234); - handle = absl::FindCommandLineFlag("test_flag_03"); - EXPECT_EQ(*handle->TryGet<int16_t>(), -34); - handle = absl::FindCommandLineFlag("test_flag_04"); - EXPECT_EQ(*handle->TryGet<uint16_t>(), 189); - handle = absl::FindCommandLineFlag("test_flag_05"); - EXPECT_EQ(*handle->TryGet<int32_t>(), 10765); - handle = absl::FindCommandLineFlag("test_flag_06"); - EXPECT_EQ(*handle->TryGet<uint32_t>(), 40000); - handle = absl::FindCommandLineFlag("test_flag_07"); - EXPECT_EQ(*handle->TryGet<int64_t>(), -1234567); - handle = absl::FindCommandLineFlag("test_flag_08"); - EXPECT_EQ(*handle->TryGet<uint64_t>(), 9876543); - handle = absl::FindCommandLineFlag("test_flag_09"); - EXPECT_NEAR(*handle->TryGet<double>(), -9.876e-50, 1e-55); - handle = absl::FindCommandLineFlag("test_flag_10"); - EXPECT_NEAR(*handle->TryGet<float>(), 1.234e12f, 1e5f); - handle = absl::FindCommandLineFlag("test_flag_11"); - EXPECT_EQ(*handle->TryGet<std::string>(), ""); - handle = absl::FindCommandLineFlag("test_flag_12"); - EXPECT_EQ(*handle->TryGet<absl::Duration>(), absl::Minutes(10)); -} - -// -------------------------------------------------------------------- - -TEST_F(FlagTest, ConcurrentSetAndGet) { - static constexpr int kNumThreads = 8; - // Two arbitrary durations. One thread will concurrently flip the flag - // between these two values, while the other threads read it and verify - // that no other value is seen. - static const absl::Duration kValidDurations[] = { - absl::Seconds(int64_t{0x6cebf47a9b68c802}) + absl::Nanoseconds(229702057), - absl::Seconds(int64_t{0x23fec0307e4e9d3}) + absl::Nanoseconds(44555374)}; - absl::SetFlag(&FLAGS_test_flag_12, kValidDurations[0]); - - std::atomic<bool> stop{false}; - std::vector<std::thread> threads; - auto* handle = absl::FindCommandLineFlag("test_flag_12"); - for (int i = 0; i < kNumThreads; i++) { - threads.emplace_back([&]() { - while (!stop.load(std::memory_order_relaxed)) { - // Try loading the flag both directly and via a reflection - // handle. - absl::Duration v = absl::GetFlag(FLAGS_test_flag_12); - EXPECT_TRUE(v == kValidDurations[0] || v == kValidDurations[1]); - v = *handle->TryGet<absl::Duration>(); - EXPECT_TRUE(v == kValidDurations[0] || v == kValidDurations[1]); - } - }); - } - absl::Time end_time = absl::Now() + absl::Seconds(1); - int i = 0; - while (absl::Now() < end_time) { - absl::SetFlag(&FLAGS_test_flag_12, - kValidDurations[i++ % ABSL_ARRAYSIZE(kValidDurations)]); - } - stop.store(true, std::memory_order_relaxed); - for (auto& t : threads) t.join(); } // -------------------------------------------------------------------- @@ -627,33 +287,28 @@ int GetDflt1() { return 1; } } // namespace -ABSL_FLAG(int, test_int_flag_with_non_const_default, GetDflt1(), - "test int flag non const default"); -ABSL_FLAG(std::string, test_string_flag_with_non_const_default, - absl::StrCat("AAA", "BBB"), "test string flag non const default"); +ABSL_FLAG(int, test_flag_12, GetDflt1(), "test flag 12"); +ABSL_FLAG(std::string, test_flag_13, absl::StrCat("AAA", "BBB"), + "test flag 13"); namespace { TEST_F(FlagTest, TestNonConstexprDefault) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_int_flag_with_non_const_default), 1); - EXPECT_EQ(absl::GetFlag(FLAGS_test_string_flag_with_non_const_default), - "AAABBB"); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), 1); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), "AAABBB"); } // -------------------------------------------------------------------- } // namespace -ABSL_FLAG(bool, test_flag_with_non_const_help, true, - absl::StrCat("test ", "flag ", "non const help")); +ABSL_FLAG(bool, test_flag_14, true, absl::StrCat("test ", "flag ", "14")); namespace { #if !ABSL_FLAGS_STRIP_HELP TEST_F(FlagTest, TestNonConstexprHelp) { - EXPECT_EQ( - absl::GetFlagReflectionHandle(FLAGS_test_flag_with_non_const_help).Help(), - "test flag non const help"); + EXPECT_EQ(FLAGS_test_flag_14.Help(), "test flag 14"); } #endif //! ABSL_FLAGS_STRIP_HELP @@ -719,16 +374,14 @@ std::string AbslUnparseFlag(const CustomUDT& f) { } // namespace -ABSL_FLAG(CustomUDT, test_flag_custom_udt, CustomUDT(), "test flag custom UDT"); +ABSL_FLAG(CustomUDT, test_flag_15, CustomUDT(), "test flag 15"); namespace { TEST_F(FlagTest, TestCustomUDT) { - EXPECT_EQ(flags::StorageKind<CustomUDT>(), - flags::FlagValueStorageKind::kOneWordAtomic); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(1, 1)); - absl::SetFlag(&FLAGS_test_flag_custom_udt, CustomUDT(2, 3)); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(2, 3)); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(1, 1)); + absl::SetFlag(&FLAGS_test_flag_15, CustomUDT(2, 3)); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_15), CustomUDT(2, 3)); } // MSVC produces link error on the type mismatch. @@ -738,22 +391,18 @@ TEST_F(FlagTest, TestCustomUDT) { using FlagDeathTest = FlagTest; TEST_F(FlagDeathTest, TestTypeMismatchValidations) { -#if !defined(NDEBUG) - EXPECT_DEATH_IF_SUPPORTED( + EXPECT_DEBUG_DEATH( static_cast<void>(absl::GetFlag(FLAGS_mistyped_int_flag)), "Flag 'mistyped_int_flag' is defined as one type and declared " "as another"); - EXPECT_DEATH_IF_SUPPORTED( - static_cast<void>(absl::GetFlag(FLAGS_mistyped_string_flag)), - "Flag 'mistyped_string_flag' is defined as one type and " - "declared as another"); -#endif - - EXPECT_DEATH_IF_SUPPORTED( - absl::SetFlag(&FLAGS_mistyped_int_flag, 1), - "Flag 'mistyped_int_flag' is defined as one type and declared " - "as another"); - EXPECT_DEATH_IF_SUPPORTED( + EXPECT_DEATH(absl::SetFlag(&FLAGS_mistyped_int_flag, 1), + "Flag 'mistyped_int_flag' is defined as one type and declared " + "as another"); + + EXPECT_DEATH(static_cast<void>(absl::GetFlag(FLAGS_mistyped_string_flag)), + "Flag 'mistyped_string_flag' is defined as one type and " + "declared as another"); + EXPECT_DEATH( absl::SetFlag(&FLAGS_mistyped_string_flag, std::vector<std::string>{}), "Flag 'mistyped_string_flag' is defined as one type and declared as " "another"); @@ -791,17 +440,16 @@ std::string AbslUnparseFlag(const ConversionTestVal& val) { // Flag default values can be specified with a value that converts to the flag // value type implicitly. -ABSL_FLAG(ConversionTestVal, test_flag_implicit_conv, - ConversionTestVal::ViaImplicitConv::kTen, - "test flag init via implicit conversion"); +ABSL_FLAG(ConversionTestVal, test_flag_16, + ConversionTestVal::ViaImplicitConv::kTen, "test flag 16"); namespace { TEST_F(FlagTest, CanSetViaImplicitConversion) { - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 10); - absl::SetFlag(&FLAGS_test_flag_implicit_conv, + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_16).a, 10); + absl::SetFlag(&FLAGS_test_flag_16, ConversionTestVal::ViaImplicitConv::kEleven); - EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 11); + EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_16).a, 11); } // -------------------------------------------------------------------- @@ -846,134 +494,25 @@ TEST_F(FlagTest, TestNonDefaultConstructibleType) { EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 25); } -} // namespace - // -------------------------------------------------------------------- +} // namespace + ABSL_RETIRED_FLAG(bool, old_bool_flag, true, "old descr"); ABSL_RETIRED_FLAG(int, old_int_flag, (int)std::sqrt(10), "old descr"); ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr")); -bool initializaion_order_fiasco_test = [] { - // Iterate over all the flags during static initialization. - // This should not trigger ASan's initialization-order-fiasco. - auto* handle1 = absl::FindCommandLineFlag("flag_on_separate_file"); - auto* handle2 = absl::FindCommandLineFlag("retired_flag_on_separate_file"); - if (handle1 != nullptr && handle2 != nullptr) { - return handle1->Name() == handle2->Name(); - } - return true; -}(); - namespace { TEST_F(FlagTest, TestRetiredFlagRegistration) { - auto* handle = absl::FindCommandLineFlag("old_bool_flag"); - EXPECT_TRUE(handle->IsOfType<bool>()); - EXPECT_TRUE(handle->IsRetired()); - handle = absl::FindCommandLineFlag("old_int_flag"); - EXPECT_TRUE(handle->IsOfType<int>()); - EXPECT_TRUE(handle->IsRetired()); - handle = absl::FindCommandLineFlag("old_str_flag"); - EXPECT_TRUE(handle->IsOfType<std::string>()); - EXPECT_TRUE(handle->IsRetired()); + bool is_bool = false; + EXPECT_TRUE(flags::IsRetiredFlag("old_bool_flag", &is_bool)); + EXPECT_TRUE(is_bool); + EXPECT_TRUE(flags::IsRetiredFlag("old_int_flag", &is_bool)); + EXPECT_FALSE(is_bool); + EXPECT_TRUE(flags::IsRetiredFlag("old_str_flag", &is_bool)); + EXPECT_FALSE(is_bool); + EXPECT_FALSE(flags::IsRetiredFlag("some_other_flag", &is_bool)); } } // namespace - -// -------------------------------------------------------------------- - -namespace { - -// User-defined type with small alignment, but size exceeding 16. -struct SmallAlignUDT { - SmallAlignUDT() : c('A'), s(12) {} - char c; - int16_t s; - char bytes[14]; -}; - -bool AbslParseFlag(absl::string_view, SmallAlignUDT*, std::string*) { - return true; -} -std::string AbslUnparseFlag(const SmallAlignUDT&) { return ""; } - -// User-defined type with small size, but not trivially copyable. -struct NonTriviallyCopyableUDT { - NonTriviallyCopyableUDT() : c('A') {} - NonTriviallyCopyableUDT(const NonTriviallyCopyableUDT& rhs) : c(rhs.c) {} - NonTriviallyCopyableUDT& operator=(const NonTriviallyCopyableUDT& rhs) { - c = rhs.c; - return *this; - } - - char c; -}; - -bool AbslParseFlag(absl::string_view, NonTriviallyCopyableUDT*, std::string*) { - return true; -} -std::string AbslUnparseFlag(const NonTriviallyCopyableUDT&) { return ""; } - -} // namespace - -ABSL_FLAG(SmallAlignUDT, test_flag_sa_udt, {}, "help"); -ABSL_FLAG(NonTriviallyCopyableUDT, test_flag_ntc_udt, {}, "help"); - -namespace { - -TEST_F(FlagTest, TestSmallAlignUDT) { - SmallAlignUDT value = absl::GetFlag(FLAGS_test_flag_sa_udt); - EXPECT_EQ(value.c, 'A'); - EXPECT_EQ(value.s, 12); - - value.c = 'B'; - value.s = 45; - absl::SetFlag(&FLAGS_test_flag_sa_udt, value); - value = absl::GetFlag(FLAGS_test_flag_sa_udt); - EXPECT_EQ(value.c, 'B'); - EXPECT_EQ(value.s, 45); -} - -TEST_F(FlagTest, TestNonTriviallyCopyableUDT) { - NonTriviallyCopyableUDT value = absl::GetFlag(FLAGS_test_flag_ntc_udt); - EXPECT_EQ(value.c, 'A'); - - value.c = 'B'; - absl::SetFlag(&FLAGS_test_flag_ntc_udt, value); - value = absl::GetFlag(FLAGS_test_flag_ntc_udt); - EXPECT_EQ(value.c, 'B'); -} - -} // namespace - -// -------------------------------------------------------------------- - -namespace { - -enum TestE { A = 1, B = 2, C = 3 }; - -struct EnumWrapper { - EnumWrapper() : e(A) {} - - TestE e; -}; - -bool AbslParseFlag(absl::string_view, EnumWrapper*, std::string*) { - return true; -} -std::string AbslUnparseFlag(const EnumWrapper&) { return ""; } - -} // namespace - -ABSL_FLAG(EnumWrapper, test_enum_wrapper_flag, {}, "help"); - -TEST_F(FlagTest, TesTypeWrappingEnum) { - EnumWrapper value = absl::GetFlag(FLAGS_test_enum_wrapper_flag); - EXPECT_EQ(value.e, A); - - value.e = B; - absl::SetFlag(&FLAGS_test_enum_wrapper_flag, value); - value = absl::GetFlag(FLAGS_test_enum_wrapper_flag); - EXPECT_EQ(value.e, B); -} |