aboutsummaryrefslogtreecommitdiff
path: root/third_party/abseil-cpp/absl/flags/flag_test.cc
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/abseil-cpp/absl/flags/flag_test.cc')
-rw-r--r--third_party/abseil-cpp/absl/flags/flag_test.cc737
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);
-}