xref: /aosp_15_r20/external/abseil-cpp/absl/flags/flag_test.cc (revision 9356374a3709195abf420251b3e825997ff56c0f)
1*9356374aSAndroid Build Coastguard Worker //
2*9356374aSAndroid Build Coastguard Worker //  Copyright 2019 The Abseil Authors.
3*9356374aSAndroid Build Coastguard Worker //
4*9356374aSAndroid Build Coastguard Worker // Licensed under the Apache License, Version 2.0 (the "License");
5*9356374aSAndroid Build Coastguard Worker // you may not use this file except in compliance with the License.
6*9356374aSAndroid Build Coastguard Worker // You may obtain a copy of the License at
7*9356374aSAndroid Build Coastguard Worker //
8*9356374aSAndroid Build Coastguard Worker //      https://www.apache.org/licenses/LICENSE-2.0
9*9356374aSAndroid Build Coastguard Worker //
10*9356374aSAndroid Build Coastguard Worker // Unless required by applicable law or agreed to in writing, software
11*9356374aSAndroid Build Coastguard Worker // distributed under the License is distributed on an "AS IS" BASIS,
12*9356374aSAndroid Build Coastguard Worker // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*9356374aSAndroid Build Coastguard Worker // See the License for the specific language governing permissions and
14*9356374aSAndroid Build Coastguard Worker // limitations under the License.
15*9356374aSAndroid Build Coastguard Worker 
16*9356374aSAndroid Build Coastguard Worker #include "absl/flags/flag.h"
17*9356374aSAndroid Build Coastguard Worker 
18*9356374aSAndroid Build Coastguard Worker #include <stddef.h>
19*9356374aSAndroid Build Coastguard Worker #include <stdint.h>
20*9356374aSAndroid Build Coastguard Worker 
21*9356374aSAndroid Build Coastguard Worker #include <atomic>
22*9356374aSAndroid Build Coastguard Worker #include <string>
23*9356374aSAndroid Build Coastguard Worker #include <thread>  // NOLINT
24*9356374aSAndroid Build Coastguard Worker #include <vector>
25*9356374aSAndroid Build Coastguard Worker 
26*9356374aSAndroid Build Coastguard Worker #include "gtest/gtest.h"
27*9356374aSAndroid Build Coastguard Worker #include "absl/base/attributes.h"
28*9356374aSAndroid Build Coastguard Worker #include "absl/base/internal/raw_logging.h"
29*9356374aSAndroid Build Coastguard Worker #include "absl/base/macros.h"
30*9356374aSAndroid Build Coastguard Worker #include "absl/flags/config.h"
31*9356374aSAndroid Build Coastguard Worker #include "absl/flags/declare.h"
32*9356374aSAndroid Build Coastguard Worker #include "absl/flags/internal/flag.h"
33*9356374aSAndroid Build Coastguard Worker #include "absl/flags/marshalling.h"
34*9356374aSAndroid Build Coastguard Worker #include "absl/flags/parse.h"
35*9356374aSAndroid Build Coastguard Worker #include "absl/flags/reflection.h"
36*9356374aSAndroid Build Coastguard Worker #include "absl/flags/usage_config.h"
37*9356374aSAndroid Build Coastguard Worker #include "absl/numeric/int128.h"
38*9356374aSAndroid Build Coastguard Worker #include "absl/strings/match.h"
39*9356374aSAndroid Build Coastguard Worker #include "absl/strings/numbers.h"
40*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_cat.h"
41*9356374aSAndroid Build Coastguard Worker #include "absl/strings/str_split.h"
42*9356374aSAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
43*9356374aSAndroid Build Coastguard Worker #include "absl/time/clock.h"
44*9356374aSAndroid Build Coastguard Worker #include "absl/time/time.h"
45*9356374aSAndroid Build Coastguard Worker #include "absl/types/optional.h"
46*9356374aSAndroid Build Coastguard Worker 
47*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int64_t, mistyped_int_flag);
48*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::vector<std::string>, mistyped_string_flag);
49*9356374aSAndroid Build Coastguard Worker 
50*9356374aSAndroid Build Coastguard Worker namespace {
51*9356374aSAndroid Build Coastguard Worker 
52*9356374aSAndroid Build Coastguard Worker namespace flags = absl::flags_internal;
53*9356374aSAndroid Build Coastguard Worker 
TestHelpMsg()54*9356374aSAndroid Build Coastguard Worker std::string TestHelpMsg() { return "dynamic help"; }
55*9356374aSAndroid Build Coastguard Worker #if defined(_MSC_VER) && !defined(__clang__)
TestLiteralHelpMsg()56*9356374aSAndroid Build Coastguard Worker std::string TestLiteralHelpMsg() { return "literal help"; }
57*9356374aSAndroid Build Coastguard Worker #endif
58*9356374aSAndroid Build Coastguard Worker template <typename T>
TestMakeDflt(void * dst)59*9356374aSAndroid Build Coastguard Worker void TestMakeDflt(void* dst) {
60*9356374aSAndroid Build Coastguard Worker   new (dst) T{};
61*9356374aSAndroid Build Coastguard Worker }
TestCallback()62*9356374aSAndroid Build Coastguard Worker void TestCallback() {}
63*9356374aSAndroid Build Coastguard Worker 
64*9356374aSAndroid Build Coastguard Worker struct UDT {
65*9356374aSAndroid Build Coastguard Worker   UDT() = default;
66*9356374aSAndroid Build Coastguard Worker   UDT(const UDT&) = default;
67*9356374aSAndroid Build Coastguard Worker   UDT& operator=(const UDT&) = default;
68*9356374aSAndroid Build Coastguard Worker };
AbslParseFlag(absl::string_view,UDT *,std::string *)69*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; }
AbslUnparseFlag(const UDT &)70*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const UDT&) { return ""; }
71*9356374aSAndroid Build Coastguard Worker 
72*9356374aSAndroid Build Coastguard Worker class FlagTest : public testing::Test {
73*9356374aSAndroid Build Coastguard Worker  protected:
SetUpTestSuite()74*9356374aSAndroid Build Coastguard Worker   static void SetUpTestSuite() {
75*9356374aSAndroid Build Coastguard Worker     // Install a function to normalize filenames before this test is run.
76*9356374aSAndroid Build Coastguard Worker     absl::FlagsUsageConfig default_config;
77*9356374aSAndroid Build Coastguard Worker     default_config.normalize_filename = &FlagTest::NormalizeFileName;
78*9356374aSAndroid Build Coastguard Worker     absl::SetFlagsUsageConfig(default_config);
79*9356374aSAndroid Build Coastguard Worker   }
80*9356374aSAndroid Build Coastguard Worker 
81*9356374aSAndroid Build Coastguard Worker  private:
NormalizeFileName(absl::string_view fname)82*9356374aSAndroid Build Coastguard Worker   static std::string NormalizeFileName(absl::string_view fname) {
83*9356374aSAndroid Build Coastguard Worker #ifdef _WIN32
84*9356374aSAndroid Build Coastguard Worker     std::string normalized(fname);
85*9356374aSAndroid Build Coastguard Worker     std::replace(normalized.begin(), normalized.end(), '\\', '/');
86*9356374aSAndroid Build Coastguard Worker     fname = normalized;
87*9356374aSAndroid Build Coastguard Worker #endif
88*9356374aSAndroid Build Coastguard Worker     return std::string(fname);
89*9356374aSAndroid Build Coastguard Worker   }
90*9356374aSAndroid Build Coastguard Worker   absl::FlagSaver flag_saver_;
91*9356374aSAndroid Build Coastguard Worker };
92*9356374aSAndroid Build Coastguard Worker 
93*9356374aSAndroid Build Coastguard Worker struct S1 {
94*9356374aSAndroid Build Coastguard Worker   S1() = default;
95*9356374aSAndroid Build Coastguard Worker   S1(const S1&) = default;
96*9356374aSAndroid Build Coastguard Worker   int32_t f1;
97*9356374aSAndroid Build Coastguard Worker   int64_t f2;
98*9356374aSAndroid Build Coastguard Worker };
99*9356374aSAndroid Build Coastguard Worker 
100*9356374aSAndroid Build Coastguard Worker struct S2 {
101*9356374aSAndroid Build Coastguard Worker   S2() = default;
102*9356374aSAndroid Build Coastguard Worker   S2(const S2&) = default;
103*9356374aSAndroid Build Coastguard Worker   int64_t f1;
104*9356374aSAndroid Build Coastguard Worker   double f2;
105*9356374aSAndroid Build Coastguard Worker };
106*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,Traits)107*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, Traits) {
108*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<int>(),
109*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kValueAndInitBit);
110*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<bool>(),
111*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kValueAndInitBit);
112*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<double>(),
113*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kOneWordAtomic);
114*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<int64_t>(),
115*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kOneWordAtomic);
116*9356374aSAndroid Build Coastguard Worker 
117*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<S1>(),
118*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
119*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<S2>(),
120*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
121*9356374aSAndroid Build Coastguard Worker // Make sure absl::Duration uses the sequence-locked code path. MSVC 2015
122*9356374aSAndroid Build Coastguard Worker // doesn't consider absl::Duration to be trivially-copyable so we just
123*9356374aSAndroid Build Coastguard Worker // restrict this to clang as it seems to be a well-behaved compiler.
124*9356374aSAndroid Build Coastguard Worker #ifdef __clang__
125*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<absl::Duration>(),
126*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
127*9356374aSAndroid Build Coastguard Worker #endif
128*9356374aSAndroid Build Coastguard Worker 
129*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<std::string>(),
130*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kHeapAllocated);
131*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<std::vector<std::string>>(),
132*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kHeapAllocated);
133*9356374aSAndroid Build Coastguard Worker 
134*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<absl::int128>(),
135*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
136*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<absl::uint128>(),
137*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
138*9356374aSAndroid Build Coastguard Worker }
139*9356374aSAndroid Build Coastguard Worker 
140*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
141*9356374aSAndroid Build Coastguard Worker 
142*9356374aSAndroid Build Coastguard Worker constexpr flags::FlagHelpArg help_arg{flags::FlagHelpMsg("literal help"),
143*9356374aSAndroid Build Coastguard Worker                                       flags::FlagHelpKind::kLiteral};
144*9356374aSAndroid Build Coastguard Worker 
145*9356374aSAndroid Build Coastguard Worker using String = std::string;
146*9356374aSAndroid Build Coastguard Worker using int128 = absl::int128;
147*9356374aSAndroid Build Coastguard Worker using uint128 = absl::uint128;
148*9356374aSAndroid Build Coastguard Worker 
149*9356374aSAndroid Build Coastguard Worker #define DEFINE_CONSTRUCTED_FLAG(T, dflt, dflt_kind)                        \
150*9356374aSAndroid Build Coastguard Worker   constexpr flags::FlagDefaultArg f1default##T{                            \
151*9356374aSAndroid Build Coastguard Worker       flags::FlagDefaultSrc{dflt}, flags::FlagDefaultKind::dflt_kind};     \
152*9356374aSAndroid Build Coastguard Worker   constexpr absl::Flag<T> f1##T{"f1", "file", help_arg, f1default##T};     \
153*9356374aSAndroid Build Coastguard Worker   ABSL_CONST_INIT absl::Flag<T> f2##T {                                    \
154*9356374aSAndroid Build Coastguard Worker     "f2", "file",                                                          \
155*9356374aSAndroid Build Coastguard Worker         {flags::FlagHelpMsg(&TestHelpMsg), flags::FlagHelpKind::kGenFunc}, \
156*9356374aSAndroid Build Coastguard Worker         flags::FlagDefaultArg {                                            \
157*9356374aSAndroid Build Coastguard Worker       flags::FlagDefaultSrc(&TestMakeDflt<T>),                             \
158*9356374aSAndroid Build Coastguard Worker           flags::FlagDefaultKind::kGenFunc                                 \
159*9356374aSAndroid Build Coastguard Worker     }                                                                      \
160*9356374aSAndroid Build Coastguard Worker   }
161*9356374aSAndroid Build Coastguard Worker 
162*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(bool, true, kOneWord);
163*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(int16_t, 1, kOneWord);
164*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(uint16_t, 2, kOneWord);
165*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(int32_t, 3, kOneWord);
166*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(uint32_t, 4, kOneWord);
167*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(int64_t, 5, kOneWord);
168*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(uint64_t, 6, kOneWord);
169*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(float, 7.8, kOneWord);
170*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(double, 9.10, kOneWord);
171*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(String, &TestMakeDflt<String>, kGenFunc);
172*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(UDT, &TestMakeDflt<UDT>, kGenFunc);
173*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(int128, 13, kGenFunc);
174*9356374aSAndroid Build Coastguard Worker DEFINE_CONSTRUCTED_FLAG(uint128, 14, kGenFunc);
175*9356374aSAndroid Build Coastguard Worker 
176*9356374aSAndroid Build Coastguard Worker template <typename T>
TestConstructionFor(const absl::Flag<T> & f1,absl::Flag<T> & f2)177*9356374aSAndroid Build Coastguard Worker bool TestConstructionFor(const absl::Flag<T>& f1, absl::Flag<T>& f2) {
178*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Name(), "f1");
179*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Help(), "literal help");
180*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f1).Filename(), "file");
181*9356374aSAndroid Build Coastguard Worker 
182*9356374aSAndroid Build Coastguard Worker   flags::FlagRegistrar<T, false>(ABSL_FLAG_IMPL_FLAG_PTR(f2), nullptr)
183*9356374aSAndroid Build Coastguard Worker       .OnUpdate(TestCallback);
184*9356374aSAndroid Build Coastguard Worker 
185*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Name(), "f2");
186*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Help(), "dynamic help");
187*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(f2).Filename(), "file");
188*9356374aSAndroid Build Coastguard Worker 
189*9356374aSAndroid Build Coastguard Worker   return true;
190*9356374aSAndroid Build Coastguard Worker }
191*9356374aSAndroid Build Coastguard Worker 
192*9356374aSAndroid Build Coastguard Worker #define TEST_CONSTRUCTED_FLAG(T) TestConstructionFor(f1##T, f2##T);
193*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestConstruction)194*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestConstruction) {
195*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(bool);
196*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(int16_t);
197*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(uint16_t);
198*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(int32_t);
199*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(uint32_t);
200*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(int64_t);
201*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(uint64_t);
202*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(float);
203*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(double);
204*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(String);
205*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(UDT);
206*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(int128);
207*9356374aSAndroid Build Coastguard Worker   TEST_CONSTRUCTED_FLAG(uint128);
208*9356374aSAndroid Build Coastguard Worker }
209*9356374aSAndroid Build Coastguard Worker 
210*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
211*9356374aSAndroid Build Coastguard Worker 
212*9356374aSAndroid Build Coastguard Worker }  // namespace
213*9356374aSAndroid Build Coastguard Worker 
214*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(bool, test_flag_01);
215*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int, test_flag_02);
216*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int16_t, test_flag_03);
217*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(uint16_t, test_flag_04);
218*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int32_t, test_flag_05);
219*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(uint32_t, test_flag_06);
220*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int64_t, test_flag_07);
221*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(uint64_t, test_flag_08);
222*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(double, test_flag_09);
223*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(float, test_flag_10);
224*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(std::string, test_flag_11);
225*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(absl::Duration, test_flag_12);
226*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(absl::int128, test_flag_13);
227*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(absl::uint128, test_flag_14);
228*9356374aSAndroid Build Coastguard Worker 
229*9356374aSAndroid Build Coastguard Worker namespace {
230*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestFlagDeclaration)231*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestFlagDeclaration) {
232*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
233*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "This test requires flag names to be present";
234*9356374aSAndroid Build Coastguard Worker #endif
235*9356374aSAndroid Build Coastguard Worker   // test that we can access flag objects.
236*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(),
237*9356374aSAndroid Build Coastguard Worker             "test_flag_01");
238*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(),
239*9356374aSAndroid Build Coastguard Worker             "test_flag_02");
240*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(),
241*9356374aSAndroid Build Coastguard Worker             "test_flag_03");
242*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(),
243*9356374aSAndroid Build Coastguard Worker             "test_flag_04");
244*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(),
245*9356374aSAndroid Build Coastguard Worker             "test_flag_05");
246*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(),
247*9356374aSAndroid Build Coastguard Worker             "test_flag_06");
248*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(),
249*9356374aSAndroid Build Coastguard Worker             "test_flag_07");
250*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(),
251*9356374aSAndroid Build Coastguard Worker             "test_flag_08");
252*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(),
253*9356374aSAndroid Build Coastguard Worker             "test_flag_09");
254*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(),
255*9356374aSAndroid Build Coastguard Worker             "test_flag_10");
256*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(),
257*9356374aSAndroid Build Coastguard Worker             "test_flag_11");
258*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(),
259*9356374aSAndroid Build Coastguard Worker             "test_flag_12");
260*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_13).Name(),
261*9356374aSAndroid Build Coastguard Worker             "test_flag_13");
262*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_14).Name(),
263*9356374aSAndroid Build Coastguard Worker             "test_flag_14");
264*9356374aSAndroid Build Coastguard Worker }
265*9356374aSAndroid Build Coastguard Worker 
266*9356374aSAndroid Build Coastguard Worker }  // namespace
267*9356374aSAndroid Build Coastguard Worker 
268*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
269*9356374aSAndroid Build Coastguard Worker // The intent of this helper struct and an expression below is to make sure that
270*9356374aSAndroid Build Coastguard Worker // in the configuration where ABSL_FLAGS_STRIP_NAMES=1 registrar construction
271*9356374aSAndroid Build Coastguard Worker // (in cases of no Tail calls like OnUpdate) is constexpr and thus can and
272*9356374aSAndroid Build Coastguard Worker // should be completely optimized away, thus avoiding the cost/overhead of
273*9356374aSAndroid Build Coastguard Worker // static initializers.
274*9356374aSAndroid Build Coastguard Worker struct VerifyConsteval {
operator +(flags::FlagRegistrarEmpty,VerifyConsteval)275*9356374aSAndroid Build Coastguard Worker   friend consteval flags::FlagRegistrarEmpty operator+(
276*9356374aSAndroid Build Coastguard Worker       flags::FlagRegistrarEmpty, VerifyConsteval) {
277*9356374aSAndroid Build Coastguard Worker     return {};
278*9356374aSAndroid Build Coastguard Worker   }
279*9356374aSAndroid Build Coastguard Worker };
280*9356374aSAndroid Build Coastguard Worker 
281*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, test_registrar_const_init, 0, "") + VerifyConsteval();
282*9356374aSAndroid Build Coastguard Worker #endif
283*9356374aSAndroid Build Coastguard Worker 
284*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
285*9356374aSAndroid Build Coastguard Worker 
286*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(bool, test_flag_01, true, "test flag 01");
287*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, test_flag_02, 1234, "test flag 02");
288*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int16_t, test_flag_03, -34, "test flag 03");
289*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(uint16_t, test_flag_04, 189, "test flag 04");
290*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int32_t, test_flag_05, 10765, "test flag 05");
291*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(uint32_t, test_flag_06, 40000, "test flag 06");
292*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int64_t, test_flag_07, -1234567, "test flag 07");
293*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(uint64_t, test_flag_08, 9876543, "test flag 08");
294*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(double, test_flag_09, -9.876e-50, "test flag 09");
295*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(float, test_flag_10, 1.234e12f, "test flag 10");
296*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(std::string, test_flag_11, "", "test flag 11");
297*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::Duration, test_flag_12, absl::Minutes(10), "test flag 12");
298*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::int128, test_flag_13, absl::MakeInt128(-1, 0), "test flag 13");
299*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::uint128, test_flag_14, absl::MakeUint128(0, 0xFFFAAABBBCCCDDD),
300*9356374aSAndroid Build Coastguard Worker           "test flag 14");
301*9356374aSAndroid Build Coastguard Worker 
302*9356374aSAndroid Build Coastguard Worker namespace {
303*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestFlagDefinition)304*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestFlagDefinition) {
305*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
306*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "This test requires flag names to be present";
307*9356374aSAndroid Build Coastguard Worker #endif
308*9356374aSAndroid Build Coastguard Worker   absl::string_view expected_file_name = "absl/flags/flag_test.cc";
309*9356374aSAndroid Build Coastguard Worker 
310*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Name(),
311*9356374aSAndroid Build Coastguard Worker             "test_flag_01");
312*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Help(),
313*9356374aSAndroid Build Coastguard Worker             "test flag 01");
314*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
315*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename(),
316*9356374aSAndroid Build Coastguard Worker       expected_file_name))
317*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_01).Filename();
318*9356374aSAndroid Build Coastguard Worker 
319*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Name(),
320*9356374aSAndroid Build Coastguard Worker             "test_flag_02");
321*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Help(),
322*9356374aSAndroid Build Coastguard Worker             "test flag 02");
323*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
324*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename(),
325*9356374aSAndroid Build Coastguard Worker       expected_file_name))
326*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_02).Filename();
327*9356374aSAndroid Build Coastguard Worker 
328*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Name(),
329*9356374aSAndroid Build Coastguard Worker             "test_flag_03");
330*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Help(),
331*9356374aSAndroid Build Coastguard Worker             "test flag 03");
332*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
333*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename(),
334*9356374aSAndroid Build Coastguard Worker       expected_file_name))
335*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_03).Filename();
336*9356374aSAndroid Build Coastguard Worker 
337*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Name(),
338*9356374aSAndroid Build Coastguard Worker             "test_flag_04");
339*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Help(),
340*9356374aSAndroid Build Coastguard Worker             "test flag 04");
341*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
342*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename(),
343*9356374aSAndroid Build Coastguard Worker       expected_file_name))
344*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_04).Filename();
345*9356374aSAndroid Build Coastguard Worker 
346*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Name(),
347*9356374aSAndroid Build Coastguard Worker             "test_flag_05");
348*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Help(),
349*9356374aSAndroid Build Coastguard Worker             "test flag 05");
350*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
351*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename(),
352*9356374aSAndroid Build Coastguard Worker       expected_file_name))
353*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_05).Filename();
354*9356374aSAndroid Build Coastguard Worker 
355*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Name(),
356*9356374aSAndroid Build Coastguard Worker             "test_flag_06");
357*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Help(),
358*9356374aSAndroid Build Coastguard Worker             "test flag 06");
359*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
360*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename(),
361*9356374aSAndroid Build Coastguard Worker       expected_file_name))
362*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_06).Filename();
363*9356374aSAndroid Build Coastguard Worker 
364*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Name(),
365*9356374aSAndroid Build Coastguard Worker             "test_flag_07");
366*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Help(),
367*9356374aSAndroid Build Coastguard Worker             "test flag 07");
368*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
369*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename(),
370*9356374aSAndroid Build Coastguard Worker       expected_file_name))
371*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_07).Filename();
372*9356374aSAndroid Build Coastguard Worker 
373*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Name(),
374*9356374aSAndroid Build Coastguard Worker             "test_flag_08");
375*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Help(),
376*9356374aSAndroid Build Coastguard Worker             "test flag 08");
377*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
378*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename(),
379*9356374aSAndroid Build Coastguard Worker       expected_file_name))
380*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_08).Filename();
381*9356374aSAndroid Build Coastguard Worker 
382*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Name(),
383*9356374aSAndroid Build Coastguard Worker             "test_flag_09");
384*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Help(),
385*9356374aSAndroid Build Coastguard Worker             "test flag 09");
386*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
387*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename(),
388*9356374aSAndroid Build Coastguard Worker       expected_file_name))
389*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_09).Filename();
390*9356374aSAndroid Build Coastguard Worker 
391*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Name(),
392*9356374aSAndroid Build Coastguard Worker             "test_flag_10");
393*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Help(),
394*9356374aSAndroid Build Coastguard Worker             "test flag 10");
395*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
396*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename(),
397*9356374aSAndroid Build Coastguard Worker       expected_file_name))
398*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_10).Filename();
399*9356374aSAndroid Build Coastguard Worker 
400*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Name(),
401*9356374aSAndroid Build Coastguard Worker             "test_flag_11");
402*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Help(),
403*9356374aSAndroid Build Coastguard Worker             "test flag 11");
404*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
405*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename(),
406*9356374aSAndroid Build Coastguard Worker       expected_file_name))
407*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_11).Filename();
408*9356374aSAndroid Build Coastguard Worker 
409*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Name(),
410*9356374aSAndroid Build Coastguard Worker             "test_flag_12");
411*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Help(),
412*9356374aSAndroid Build Coastguard Worker             "test flag 12");
413*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
414*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename(),
415*9356374aSAndroid Build Coastguard Worker       expected_file_name))
416*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_12).Filename();
417*9356374aSAndroid Build Coastguard Worker 
418*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_13).Name(),
419*9356374aSAndroid Build Coastguard Worker             "test_flag_13");
420*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_13).Help(),
421*9356374aSAndroid Build Coastguard Worker             "test flag 13");
422*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
423*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_13).Filename(),
424*9356374aSAndroid Build Coastguard Worker       expected_file_name))
425*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_13).Filename();
426*9356374aSAndroid Build Coastguard Worker 
427*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_14).Name(),
428*9356374aSAndroid Build Coastguard Worker             "test_flag_14");
429*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_14).Help(),
430*9356374aSAndroid Build Coastguard Worker             "test flag 14");
431*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::EndsWith(
432*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_14).Filename(),
433*9356374aSAndroid Build Coastguard Worker       expected_file_name))
434*9356374aSAndroid Build Coastguard Worker       << absl::GetFlagReflectionHandle(FLAGS_test_flag_14).Filename();
435*9356374aSAndroid Build Coastguard Worker }
436*9356374aSAndroid Build Coastguard Worker 
437*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
438*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestDefault)439*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestDefault) {
440*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).DefaultValue(),
441*9356374aSAndroid Build Coastguard Worker             "true");
442*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).DefaultValue(),
443*9356374aSAndroid Build Coastguard Worker             "1234");
444*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).DefaultValue(),
445*9356374aSAndroid Build Coastguard Worker             "-34");
446*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).DefaultValue(),
447*9356374aSAndroid Build Coastguard Worker             "189");
448*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).DefaultValue(),
449*9356374aSAndroid Build Coastguard Worker             "10765");
450*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).DefaultValue(),
451*9356374aSAndroid Build Coastguard Worker             "40000");
452*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).DefaultValue(),
453*9356374aSAndroid Build Coastguard Worker             "-1234567");
454*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).DefaultValue(),
455*9356374aSAndroid Build Coastguard Worker             "9876543");
456*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).DefaultValue(),
457*9356374aSAndroid Build Coastguard Worker             "-9.876e-50");
458*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).DefaultValue(),
459*9356374aSAndroid Build Coastguard Worker             "1.234e+12");
460*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).DefaultValue(),
461*9356374aSAndroid Build Coastguard Worker             "");
462*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).DefaultValue(),
463*9356374aSAndroid Build Coastguard Worker             "10m");
464*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_13).DefaultValue(),
465*9356374aSAndroid Build Coastguard Worker             "-18446744073709551616");
466*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_14).DefaultValue(),
467*9356374aSAndroid Build Coastguard Worker             "1152827684197027293");
468*9356374aSAndroid Build Coastguard Worker 
469*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_01).CurrentValue(),
470*9356374aSAndroid Build Coastguard Worker             "true");
471*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_02).CurrentValue(),
472*9356374aSAndroid Build Coastguard Worker             "1234");
473*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_03).CurrentValue(),
474*9356374aSAndroid Build Coastguard Worker             "-34");
475*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_04).CurrentValue(),
476*9356374aSAndroid Build Coastguard Worker             "189");
477*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_05).CurrentValue(),
478*9356374aSAndroid Build Coastguard Worker             "10765");
479*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_06).CurrentValue(),
480*9356374aSAndroid Build Coastguard Worker             "40000");
481*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_07).CurrentValue(),
482*9356374aSAndroid Build Coastguard Worker             "-1234567");
483*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_08).CurrentValue(),
484*9356374aSAndroid Build Coastguard Worker             "9876543");
485*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_09).CurrentValue(),
486*9356374aSAndroid Build Coastguard Worker             "-9.876e-50");
487*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_10).CurrentValue(),
488*9356374aSAndroid Build Coastguard Worker             "1.234e+12");
489*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_11).CurrentValue(),
490*9356374aSAndroid Build Coastguard Worker             "");
491*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_12).CurrentValue(),
492*9356374aSAndroid Build Coastguard Worker             "10m");
493*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_13).CurrentValue(),
494*9356374aSAndroid Build Coastguard Worker             "-18446744073709551616");
495*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_14).CurrentValue(),
496*9356374aSAndroid Build Coastguard Worker             "1152827684197027293");
497*9356374aSAndroid Build Coastguard Worker 
498*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), true);
499*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 1234);
500*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), -34);
501*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 189);
502*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), 10765);
503*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 40000);
504*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -1234567);
505*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 9876543);
506*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), -9.876e-50, 1e-55);
507*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), 1.234e12f, 1e5f);
508*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), "");
509*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Minutes(10));
510*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), absl::MakeInt128(-1, 0));
511*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14),
512*9356374aSAndroid Build Coastguard Worker             absl::MakeUint128(0, 0xFFFAAABBBCCCDDD));
513*9356374aSAndroid Build Coastguard Worker }
514*9356374aSAndroid Build Coastguard Worker 
515*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
516*9356374aSAndroid Build Coastguard Worker 
517*9356374aSAndroid Build Coastguard Worker struct NonTriviallyCopyableAggregate {
518*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableAggregate() = default;
519*9356374aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE
NonTriviallyCopyableAggregate__anon002204b00311::NonTriviallyCopyableAggregate520*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableAggregate(const NonTriviallyCopyableAggregate& rhs)
521*9356374aSAndroid Build Coastguard Worker       : value(rhs.value) {}
522*9356374aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE
operator =__anon002204b00311::NonTriviallyCopyableAggregate523*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableAggregate& operator=(
524*9356374aSAndroid Build Coastguard Worker       const NonTriviallyCopyableAggregate& rhs) {
525*9356374aSAndroid Build Coastguard Worker     value = rhs.value;
526*9356374aSAndroid Build Coastguard Worker     return *this;
527*9356374aSAndroid Build Coastguard Worker   }
528*9356374aSAndroid Build Coastguard Worker 
529*9356374aSAndroid Build Coastguard Worker   int value;
530*9356374aSAndroid Build Coastguard Worker };
AbslParseFlag(absl::string_view src,NonTriviallyCopyableAggregate * f,std::string * e)531*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view src, NonTriviallyCopyableAggregate* f,
532*9356374aSAndroid Build Coastguard Worker                    std::string* e) {
533*9356374aSAndroid Build Coastguard Worker   return absl::ParseFlag(src, &f->value, e);
534*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const NonTriviallyCopyableAggregate & ntc)535*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const NonTriviallyCopyableAggregate& ntc) {
536*9356374aSAndroid Build Coastguard Worker   return absl::StrCat(ntc.value);
537*9356374aSAndroid Build Coastguard Worker }
538*9356374aSAndroid Build Coastguard Worker 
operator ==(const NonTriviallyCopyableAggregate & ntc1,const NonTriviallyCopyableAggregate & ntc2)539*9356374aSAndroid Build Coastguard Worker bool operator==(const NonTriviallyCopyableAggregate& ntc1,
540*9356374aSAndroid Build Coastguard Worker                 const NonTriviallyCopyableAggregate& ntc2) {
541*9356374aSAndroid Build Coastguard Worker   return ntc1.value == ntc2.value;
542*9356374aSAndroid Build Coastguard Worker }
543*9356374aSAndroid Build Coastguard Worker 
544*9356374aSAndroid Build Coastguard Worker }  // namespace
545*9356374aSAndroid Build Coastguard Worker 
546*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(bool, test_flag_eb_01, {}, "");
547*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int32_t, test_flag_eb_02, {}, "");
548*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int64_t, test_flag_eb_03, {}, "");
549*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(double, test_flag_eb_04, {}, "");
550*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(std::string, test_flag_eb_05, {}, "");
551*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableAggregate, test_flag_eb_06, {}, "");
552*9356374aSAndroid Build Coastguard Worker 
553*9356374aSAndroid Build Coastguard Worker namespace {
554*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestEmptyBracesDefault)555*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestEmptyBracesDefault) {
556*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_01).DefaultValue(),
557*9356374aSAndroid Build Coastguard Worker             "false");
558*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_02).DefaultValue(),
559*9356374aSAndroid Build Coastguard Worker             "0");
560*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_03).DefaultValue(),
561*9356374aSAndroid Build Coastguard Worker             "0");
562*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_04).DefaultValue(),
563*9356374aSAndroid Build Coastguard Worker             "0");
564*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_05).DefaultValue(),
565*9356374aSAndroid Build Coastguard Worker             "");
566*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlagReflectionHandle(FLAGS_test_flag_eb_06).DefaultValue(),
567*9356374aSAndroid Build Coastguard Worker             "0");
568*9356374aSAndroid Build Coastguard Worker 
569*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_01), false);
570*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_02), 0);
571*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_03), 0);
572*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_04), 0.0);
573*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_05), "");
574*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_eb_06),
575*9356374aSAndroid Build Coastguard Worker             NonTriviallyCopyableAggregate{});
576*9356374aSAndroid Build Coastguard Worker }
577*9356374aSAndroid Build Coastguard Worker 
578*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
579*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestGetSet)580*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestGetSet) {
581*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_01, false);
582*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_01), false);
583*9356374aSAndroid Build Coastguard Worker 
584*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_02, 321);
585*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_02), 321);
586*9356374aSAndroid Build Coastguard Worker 
587*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_03, 67);
588*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_03), 67);
589*9356374aSAndroid Build Coastguard Worker 
590*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_04, 1);
591*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_04), 1);
592*9356374aSAndroid Build Coastguard Worker 
593*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_05, -908);
594*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_05), -908);
595*9356374aSAndroid Build Coastguard Worker 
596*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_06, 4001);
597*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_06), 4001);
598*9356374aSAndroid Build Coastguard Worker 
599*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_07, -23456);
600*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_07), -23456);
601*9356374aSAndroid Build Coastguard Worker 
602*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_08, 975310);
603*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_08), 975310);
604*9356374aSAndroid Build Coastguard Worker 
605*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_09, 1.00001);
606*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_09), 1.00001, 1e-10);
607*9356374aSAndroid Build Coastguard Worker 
608*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_10, -3.54f);
609*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(absl::GetFlag(FLAGS_test_flag_10), -3.54f, 1e-6f);
610*9356374aSAndroid Build Coastguard Worker 
611*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_11, "asdf");
612*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_11), "asdf");
613*9356374aSAndroid Build Coastguard Worker 
614*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_12, absl::Seconds(110));
615*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_12), absl::Seconds(110));
616*9356374aSAndroid Build Coastguard Worker 
617*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_13, absl::MakeInt128(-1, 0));
618*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_13), absl::MakeInt128(-1, 0));
619*9356374aSAndroid Build Coastguard Worker 
620*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_14, absl::MakeUint128(0, 0xFFFAAABBBCCCDDD));
621*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_14),
622*9356374aSAndroid Build Coastguard Worker             absl::MakeUint128(0, 0xFFFAAABBBCCCDDD));
623*9356374aSAndroid Build Coastguard Worker }
624*9356374aSAndroid Build Coastguard Worker 
625*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
626*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestGetViaReflection)627*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestGetViaReflection) {
628*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
629*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "This test requires flag names to be present";
630*9356374aSAndroid Build Coastguard Worker #endif
631*9356374aSAndroid Build Coastguard Worker   auto* handle = absl::FindCommandLineFlag("test_flag_01");
632*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<bool>(), true);
633*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_02");
634*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<int>(), 1234);
635*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_03");
636*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<int16_t>(), -34);
637*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_04");
638*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<uint16_t>(), 189);
639*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_05");
640*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<int32_t>(), 10765);
641*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_06");
642*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<uint32_t>(), 40000);
643*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_07");
644*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<int64_t>(), -1234567);
645*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_08");
646*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<uint64_t>(), 9876543);
647*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_09");
648*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(*handle->TryGet<double>(), -9.876e-50, 1e-55);
649*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_10");
650*9356374aSAndroid Build Coastguard Worker   EXPECT_NEAR(*handle->TryGet<float>(), 1.234e12f, 1e5f);
651*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_11");
652*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<std::string>(), "");
653*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_12");
654*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<absl::Duration>(), absl::Minutes(10));
655*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_13");
656*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<absl::int128>(), absl::MakeInt128(-1, 0));
657*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("test_flag_14");
658*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(*handle->TryGet<absl::uint128>(),
659*9356374aSAndroid Build Coastguard Worker             absl::MakeUint128(0, 0xFFFAAABBBCCCDDD));
660*9356374aSAndroid Build Coastguard Worker }
661*9356374aSAndroid Build Coastguard Worker 
662*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
663*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,ConcurrentSetAndGet)664*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, ConcurrentSetAndGet) {
665*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
666*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "This test requires flag names to be present";
667*9356374aSAndroid Build Coastguard Worker #endif
668*9356374aSAndroid Build Coastguard Worker   static constexpr int kNumThreads = 8;
669*9356374aSAndroid Build Coastguard Worker   // Two arbitrary durations. One thread will concurrently flip the flag
670*9356374aSAndroid Build Coastguard Worker   // between these two values, while the other threads read it and verify
671*9356374aSAndroid Build Coastguard Worker   // that no other value is seen.
672*9356374aSAndroid Build Coastguard Worker   static const absl::Duration kValidDurations[] = {
673*9356374aSAndroid Build Coastguard Worker       absl::Seconds(int64_t{0x6cebf47a9b68c802}) + absl::Nanoseconds(229702057),
674*9356374aSAndroid Build Coastguard Worker       absl::Seconds(int64_t{0x23fec0307e4e9d3}) + absl::Nanoseconds(44555374)};
675*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_12, kValidDurations[0]);
676*9356374aSAndroid Build Coastguard Worker 
677*9356374aSAndroid Build Coastguard Worker   std::atomic<bool> stop{false};
678*9356374aSAndroid Build Coastguard Worker   std::vector<std::thread> threads;
679*9356374aSAndroid Build Coastguard Worker   auto* handle = absl::FindCommandLineFlag("test_flag_12");
680*9356374aSAndroid Build Coastguard Worker   for (int i = 0; i < kNumThreads; i++) {
681*9356374aSAndroid Build Coastguard Worker     threads.emplace_back([&]() {
682*9356374aSAndroid Build Coastguard Worker       while (!stop.load(std::memory_order_relaxed)) {
683*9356374aSAndroid Build Coastguard Worker         // Try loading the flag both directly and via a reflection
684*9356374aSAndroid Build Coastguard Worker         // handle.
685*9356374aSAndroid Build Coastguard Worker         absl::Duration v = absl::GetFlag(FLAGS_test_flag_12);
686*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(v == kValidDurations[0] || v == kValidDurations[1]);
687*9356374aSAndroid Build Coastguard Worker         v = *handle->TryGet<absl::Duration>();
688*9356374aSAndroid Build Coastguard Worker         EXPECT_TRUE(v == kValidDurations[0] || v == kValidDurations[1]);
689*9356374aSAndroid Build Coastguard Worker       }
690*9356374aSAndroid Build Coastguard Worker     });
691*9356374aSAndroid Build Coastguard Worker   }
692*9356374aSAndroid Build Coastguard Worker   absl::Time end_time = absl::Now() + absl::Seconds(1);
693*9356374aSAndroid Build Coastguard Worker   int i = 0;
694*9356374aSAndroid Build Coastguard Worker   while (absl::Now() < end_time) {
695*9356374aSAndroid Build Coastguard Worker     absl::SetFlag(&FLAGS_test_flag_12,
696*9356374aSAndroid Build Coastguard Worker                   kValidDurations[i++ % ABSL_ARRAYSIZE(kValidDurations)]);
697*9356374aSAndroid Build Coastguard Worker   }
698*9356374aSAndroid Build Coastguard Worker   stop.store(true, std::memory_order_relaxed);
699*9356374aSAndroid Build Coastguard Worker   for (auto& t : threads) t.join();
700*9356374aSAndroid Build Coastguard Worker }
701*9356374aSAndroid Build Coastguard Worker 
702*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
703*9356374aSAndroid Build Coastguard Worker 
GetDflt1()704*9356374aSAndroid Build Coastguard Worker int GetDflt1() { return 1; }
705*9356374aSAndroid Build Coastguard Worker 
706*9356374aSAndroid Build Coastguard Worker }  // namespace
707*9356374aSAndroid Build Coastguard Worker 
708*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, test_int_flag_with_non_const_default, GetDflt1(),
709*9356374aSAndroid Build Coastguard Worker           "test int flag non const default");
710*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(std::string, test_string_flag_with_non_const_default,
711*9356374aSAndroid Build Coastguard Worker           absl::StrCat("AAA", "BBB"), "test string flag non const default");
712*9356374aSAndroid Build Coastguard Worker 
713*9356374aSAndroid Build Coastguard Worker namespace {
714*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonConstexprDefault)715*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonConstexprDefault) {
716*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_int_flag_with_non_const_default), 1);
717*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_string_flag_with_non_const_default),
718*9356374aSAndroid Build Coastguard Worker             "AAABBB");
719*9356374aSAndroid Build Coastguard Worker }
720*9356374aSAndroid Build Coastguard Worker 
721*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
722*9356374aSAndroid Build Coastguard Worker 
723*9356374aSAndroid Build Coastguard Worker }  // namespace
724*9356374aSAndroid Build Coastguard Worker 
725*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(bool, test_flag_with_non_const_help, true,
726*9356374aSAndroid Build Coastguard Worker           absl::StrCat("test ", "flag ", "non const help"));
727*9356374aSAndroid Build Coastguard Worker 
728*9356374aSAndroid Build Coastguard Worker namespace {
729*9356374aSAndroid Build Coastguard Worker 
730*9356374aSAndroid Build Coastguard Worker #if !ABSL_FLAGS_STRIP_HELP
TEST_F(FlagTest,TestNonConstexprHelp)731*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonConstexprHelp) {
732*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(
733*9356374aSAndroid Build Coastguard Worker       absl::GetFlagReflectionHandle(FLAGS_test_flag_with_non_const_help).Help(),
734*9356374aSAndroid Build Coastguard Worker       "test flag non const help");
735*9356374aSAndroid Build Coastguard Worker }
736*9356374aSAndroid Build Coastguard Worker #endif  //! ABSL_FLAGS_STRIP_HELP
737*9356374aSAndroid Build Coastguard Worker 
738*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
739*9356374aSAndroid Build Coastguard Worker 
740*9356374aSAndroid Build Coastguard Worker int cb_test_value = -1;
741*9356374aSAndroid Build Coastguard Worker void TestFlagCB();
742*9356374aSAndroid Build Coastguard Worker 
743*9356374aSAndroid Build Coastguard Worker }  // namespace
744*9356374aSAndroid Build Coastguard Worker 
745*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, test_flag_with_cb, 100, "").OnUpdate(TestFlagCB);
746*9356374aSAndroid Build Coastguard Worker 
__anon002204b00802() 747*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, test_flag_with_lambda_cb, 200, "").OnUpdate([]() {
748*9356374aSAndroid Build Coastguard Worker   cb_test_value = absl::GetFlag(FLAGS_test_flag_with_lambda_cb) +
749*9356374aSAndroid Build Coastguard Worker                   absl::GetFlag(FLAGS_test_flag_with_cb);
750*9356374aSAndroid Build Coastguard Worker });
751*9356374aSAndroid Build Coastguard Worker 
752*9356374aSAndroid Build Coastguard Worker namespace {
753*9356374aSAndroid Build Coastguard Worker 
TestFlagCB()754*9356374aSAndroid Build Coastguard Worker void TestFlagCB() { cb_test_value = absl::GetFlag(FLAGS_test_flag_with_cb); }
755*9356374aSAndroid Build Coastguard Worker 
756*9356374aSAndroid Build Coastguard Worker // Tests side-effects of callback invocation.
TEST_F(FlagTest,CallbackInvocation)757*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, CallbackInvocation) {
758*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_cb), 100);
759*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_with_lambda_cb), 200);
760*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(cb_test_value, 300);
761*9356374aSAndroid Build Coastguard Worker 
762*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_with_cb, 1);
763*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(cb_test_value, 1);
764*9356374aSAndroid Build Coastguard Worker 
765*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_with_lambda_cb, 3);
766*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(cb_test_value, 4);
767*9356374aSAndroid Build Coastguard Worker }
768*9356374aSAndroid Build Coastguard Worker 
769*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
770*9356374aSAndroid Build Coastguard Worker 
771*9356374aSAndroid Build Coastguard Worker struct CustomUDT {
CustomUDT__anon002204b00911::CustomUDT772*9356374aSAndroid Build Coastguard Worker   CustomUDT() : a(1), b(1) {}
CustomUDT__anon002204b00911::CustomUDT773*9356374aSAndroid Build Coastguard Worker   CustomUDT(int a_, int b_) : a(a_), b(b_) {}
774*9356374aSAndroid Build Coastguard Worker 
operator ==(const CustomUDT & f1,const CustomUDT & f2)775*9356374aSAndroid Build Coastguard Worker   friend bool operator==(const CustomUDT& f1, const CustomUDT& f2) {
776*9356374aSAndroid Build Coastguard Worker     return f1.a == f2.a && f1.b == f2.b;
777*9356374aSAndroid Build Coastguard Worker   }
778*9356374aSAndroid Build Coastguard Worker 
779*9356374aSAndroid Build Coastguard Worker   int a;
780*9356374aSAndroid Build Coastguard Worker   int b;
781*9356374aSAndroid Build Coastguard Worker };
AbslParseFlag(absl::string_view in,CustomUDT * f,std::string *)782*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view in, CustomUDT* f, std::string*) {
783*9356374aSAndroid Build Coastguard Worker   std::vector<absl::string_view> parts =
784*9356374aSAndroid Build Coastguard Worker       absl::StrSplit(in, ':', absl::SkipWhitespace());
785*9356374aSAndroid Build Coastguard Worker 
786*9356374aSAndroid Build Coastguard Worker   if (parts.size() != 2) return false;
787*9356374aSAndroid Build Coastguard Worker 
788*9356374aSAndroid Build Coastguard Worker   if (!absl::SimpleAtoi(parts[0], &f->a)) return false;
789*9356374aSAndroid Build Coastguard Worker 
790*9356374aSAndroid Build Coastguard Worker   if (!absl::SimpleAtoi(parts[1], &f->b)) return false;
791*9356374aSAndroid Build Coastguard Worker 
792*9356374aSAndroid Build Coastguard Worker   return true;
793*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const CustomUDT & f)794*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const CustomUDT& f) {
795*9356374aSAndroid Build Coastguard Worker   return absl::StrCat(f.a, ":", f.b);
796*9356374aSAndroid Build Coastguard Worker }
797*9356374aSAndroid Build Coastguard Worker 
798*9356374aSAndroid Build Coastguard Worker }  // namespace
799*9356374aSAndroid Build Coastguard Worker 
800*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(CustomUDT, test_flag_custom_udt, CustomUDT(), "test flag custom UDT");
801*9356374aSAndroid Build Coastguard Worker 
802*9356374aSAndroid Build Coastguard Worker namespace {
803*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestCustomUDT)804*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestCustomUDT) {
805*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<CustomUDT>(),
806*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kOneWordAtomic);
807*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(1, 1));
808*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_custom_udt, CustomUDT(2, 3));
809*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_custom_udt), CustomUDT(2, 3));
810*9356374aSAndroid Build Coastguard Worker }
811*9356374aSAndroid Build Coastguard Worker 
812*9356374aSAndroid Build Coastguard Worker // MSVC produces link error on the type mismatch.
813*9356374aSAndroid Build Coastguard Worker // Linux does not have build errors and validations work as expected.
814*9356374aSAndroid Build Coastguard Worker #if !defined(_WIN32) && GTEST_HAS_DEATH_TEST
815*9356374aSAndroid Build Coastguard Worker using FlagDeathTest = FlagTest;
816*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagDeathTest,TestTypeMismatchValidations)817*9356374aSAndroid Build Coastguard Worker TEST_F(FlagDeathTest, TestTypeMismatchValidations) {
818*9356374aSAndroid Build Coastguard Worker #if ABSL_FLAGS_STRIP_NAMES
819*9356374aSAndroid Build Coastguard Worker   GTEST_SKIP() << "This test requires flag names to be present";
820*9356374aSAndroid Build Coastguard Worker #endif
821*9356374aSAndroid Build Coastguard Worker #if !defined(NDEBUG)
822*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
823*9356374aSAndroid Build Coastguard Worker       static_cast<void>(absl::GetFlag(FLAGS_mistyped_int_flag)),
824*9356374aSAndroid Build Coastguard Worker       "Flag 'mistyped_int_flag' is defined as one type and declared "
825*9356374aSAndroid Build Coastguard Worker       "as another");
826*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
827*9356374aSAndroid Build Coastguard Worker       static_cast<void>(absl::GetFlag(FLAGS_mistyped_string_flag)),
828*9356374aSAndroid Build Coastguard Worker       "Flag 'mistyped_string_flag' is defined as one type and "
829*9356374aSAndroid Build Coastguard Worker       "declared as another");
830*9356374aSAndroid Build Coastguard Worker #endif
831*9356374aSAndroid Build Coastguard Worker 
832*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
833*9356374aSAndroid Build Coastguard Worker       absl::SetFlag(&FLAGS_mistyped_int_flag, 1),
834*9356374aSAndroid Build Coastguard Worker       "Flag 'mistyped_int_flag' is defined as one type and declared "
835*9356374aSAndroid Build Coastguard Worker       "as another");
836*9356374aSAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
837*9356374aSAndroid Build Coastguard Worker       absl::SetFlag(&FLAGS_mistyped_string_flag, std::vector<std::string>{}),
838*9356374aSAndroid Build Coastguard Worker       "Flag 'mistyped_string_flag' is defined as one type and declared as "
839*9356374aSAndroid Build Coastguard Worker       "another");
840*9356374aSAndroid Build Coastguard Worker }
841*9356374aSAndroid Build Coastguard Worker 
842*9356374aSAndroid Build Coastguard Worker #endif
843*9356374aSAndroid Build Coastguard Worker 
844*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
845*9356374aSAndroid Build Coastguard Worker 
846*9356374aSAndroid Build Coastguard Worker // A contrived type that offers implicit and explicit conversion from specific
847*9356374aSAndroid Build Coastguard Worker // source types.
848*9356374aSAndroid Build Coastguard Worker struct ConversionTestVal {
849*9356374aSAndroid Build Coastguard Worker   ConversionTestVal() = default;
ConversionTestVal__anon002204b00a11::ConversionTestVal850*9356374aSAndroid Build Coastguard Worker   explicit ConversionTestVal(int a_in) : a(a_in) {}
851*9356374aSAndroid Build Coastguard Worker 
852*9356374aSAndroid Build Coastguard Worker   enum class ViaImplicitConv { kTen = 10, kEleven };
853*9356374aSAndroid Build Coastguard Worker   // NOLINTNEXTLINE
ConversionTestVal__anon002204b00a11::ConversionTestVal854*9356374aSAndroid Build Coastguard Worker   ConversionTestVal(ViaImplicitConv from) : a(static_cast<int>(from)) {}
855*9356374aSAndroid Build Coastguard Worker 
856*9356374aSAndroid Build Coastguard Worker   int a;
857*9356374aSAndroid Build Coastguard Worker };
858*9356374aSAndroid Build Coastguard Worker 
AbslParseFlag(absl::string_view in,ConversionTestVal * val_out,std::string *)859*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view in, ConversionTestVal* val_out,
860*9356374aSAndroid Build Coastguard Worker                    std::string*) {
861*9356374aSAndroid Build Coastguard Worker   if (!absl::SimpleAtoi(in, &val_out->a)) {
862*9356374aSAndroid Build Coastguard Worker     return false;
863*9356374aSAndroid Build Coastguard Worker   }
864*9356374aSAndroid Build Coastguard Worker   return true;
865*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const ConversionTestVal & val)866*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const ConversionTestVal& val) {
867*9356374aSAndroid Build Coastguard Worker   return absl::StrCat(val.a);
868*9356374aSAndroid Build Coastguard Worker }
869*9356374aSAndroid Build Coastguard Worker 
870*9356374aSAndroid Build Coastguard Worker }  // namespace
871*9356374aSAndroid Build Coastguard Worker 
872*9356374aSAndroid Build Coastguard Worker // Flag default values can be specified with a value that converts to the flag
873*9356374aSAndroid Build Coastguard Worker // value type implicitly.
874*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(ConversionTestVal, test_flag_implicit_conv,
875*9356374aSAndroid Build Coastguard Worker           ConversionTestVal::ViaImplicitConv::kTen,
876*9356374aSAndroid Build Coastguard Worker           "test flag init via implicit conversion");
877*9356374aSAndroid Build Coastguard Worker 
878*9356374aSAndroid Build Coastguard Worker namespace {
879*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,CanSetViaImplicitConversion)880*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, CanSetViaImplicitConversion) {
881*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 10);
882*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_implicit_conv,
883*9356374aSAndroid Build Coastguard Worker                 ConversionTestVal::ViaImplicitConv::kEleven);
884*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_test_flag_implicit_conv).a, 11);
885*9356374aSAndroid Build Coastguard Worker }
886*9356374aSAndroid Build Coastguard Worker 
887*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
888*9356374aSAndroid Build Coastguard Worker 
889*9356374aSAndroid Build Coastguard Worker struct NonDfltConstructible {
890*9356374aSAndroid Build Coastguard Worker  public:
891*9356374aSAndroid Build Coastguard Worker   // This constructor tests that we can initialize the flag with int value
NonDfltConstructible__anon002204b00b11::NonDfltConstructible892*9356374aSAndroid Build Coastguard Worker   NonDfltConstructible(int i) : value(i) {}  // NOLINT
893*9356374aSAndroid Build Coastguard Worker 
894*9356374aSAndroid Build Coastguard Worker   // This constructor tests that we can't initialize the flag with char value
895*9356374aSAndroid Build Coastguard Worker   // but can with explicitly constructed NonDfltConstructible.
NonDfltConstructible__anon002204b00b11::NonDfltConstructible896*9356374aSAndroid Build Coastguard Worker   explicit NonDfltConstructible(char c) : value(100 + static_cast<int>(c)) {}
897*9356374aSAndroid Build Coastguard Worker 
898*9356374aSAndroid Build Coastguard Worker   int value;
899*9356374aSAndroid Build Coastguard Worker };
900*9356374aSAndroid Build Coastguard Worker 
AbslParseFlag(absl::string_view in,NonDfltConstructible * ndc_out,std::string *)901*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view in, NonDfltConstructible* ndc_out,
902*9356374aSAndroid Build Coastguard Worker                    std::string*) {
903*9356374aSAndroid Build Coastguard Worker   return absl::SimpleAtoi(in, &ndc_out->value);
904*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const NonDfltConstructible & ndc)905*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const NonDfltConstructible& ndc) {
906*9356374aSAndroid Build Coastguard Worker   return absl::StrCat(ndc.value);
907*9356374aSAndroid Build Coastguard Worker }
908*9356374aSAndroid Build Coastguard Worker 
909*9356374aSAndroid Build Coastguard Worker }  // namespace
910*9356374aSAndroid Build Coastguard Worker 
911*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonDfltConstructible, ndc_flag1, NonDfltConstructible('1'),
912*9356374aSAndroid Build Coastguard Worker           "Flag with non default constructible type");
913*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonDfltConstructible, ndc_flag2, 0,
914*9356374aSAndroid Build Coastguard Worker           "Flag with non default constructible type");
915*9356374aSAndroid Build Coastguard Worker 
916*9356374aSAndroid Build Coastguard Worker namespace {
917*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonDefaultConstructibleType)918*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonDefaultConstructibleType) {
919*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, '1' + 100);
920*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 0);
921*9356374aSAndroid Build Coastguard Worker 
922*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_ndc_flag1, NonDfltConstructible('A'));
923*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_ndc_flag2, 25);
924*9356374aSAndroid Build Coastguard Worker 
925*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag1).value, 'A' + 100);
926*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_ndc_flag2).value, 25);
927*9356374aSAndroid Build Coastguard Worker }
928*9356374aSAndroid Build Coastguard Worker 
929*9356374aSAndroid Build Coastguard Worker }  // namespace
930*9356374aSAndroid Build Coastguard Worker 
931*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
932*9356374aSAndroid Build Coastguard Worker 
933*9356374aSAndroid Build Coastguard Worker ABSL_RETIRED_FLAG(bool, old_bool_flag, true, "old descr");
934*9356374aSAndroid Build Coastguard Worker ABSL_RETIRED_FLAG(int, old_int_flag, (int)std::sqrt(10), "old descr");
935*9356374aSAndroid Build Coastguard Worker ABSL_RETIRED_FLAG(std::string, old_str_flag, "", absl::StrCat("old ", "descr"));
936*9356374aSAndroid Build Coastguard Worker 
937*9356374aSAndroid Build Coastguard Worker namespace {
938*9356374aSAndroid Build Coastguard Worker 
__anon002204b00e02null939*9356374aSAndroid Build Coastguard Worker bool initialization_order_fiasco_test ABSL_ATTRIBUTE_UNUSED = [] {
940*9356374aSAndroid Build Coastguard Worker   // Iterate over all the flags during static initialization.
941*9356374aSAndroid Build Coastguard Worker   // This should not trigger ASan's initialization-order-fiasco.
942*9356374aSAndroid Build Coastguard Worker   auto* handle1 = absl::FindCommandLineFlag("flag_on_separate_file");
943*9356374aSAndroid Build Coastguard Worker   auto* handle2 = absl::FindCommandLineFlag("retired_flag_on_separate_file");
944*9356374aSAndroid Build Coastguard Worker   if (handle1 != nullptr && handle2 != nullptr) {
945*9356374aSAndroid Build Coastguard Worker     return handle1->Name() == handle2->Name();
946*9356374aSAndroid Build Coastguard Worker   }
947*9356374aSAndroid Build Coastguard Worker   return true;
948*9356374aSAndroid Build Coastguard Worker }();
949*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestRetiredFlagRegistration)950*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestRetiredFlagRegistration) {
951*9356374aSAndroid Build Coastguard Worker   auto* handle = absl::FindCommandLineFlag("old_bool_flag");
952*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsOfType<bool>());
953*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsRetired());
954*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("old_int_flag");
955*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsOfType<int>());
956*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsRetired());
957*9356374aSAndroid Build Coastguard Worker   handle = absl::FindCommandLineFlag("old_str_flag");
958*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsOfType<std::string>());
959*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(handle->IsRetired());
960*9356374aSAndroid Build Coastguard Worker }
961*9356374aSAndroid Build Coastguard Worker 
962*9356374aSAndroid Build Coastguard Worker }  // namespace
963*9356374aSAndroid Build Coastguard Worker 
964*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
965*9356374aSAndroid Build Coastguard Worker 
966*9356374aSAndroid Build Coastguard Worker namespace {
967*9356374aSAndroid Build Coastguard Worker 
968*9356374aSAndroid Build Coastguard Worker // User-defined type with small alignment, but size exceeding 16.
969*9356374aSAndroid Build Coastguard Worker struct SmallAlignUDT {
SmallAlignUDT__anon002204b00f11::SmallAlignUDT970*9356374aSAndroid Build Coastguard Worker   SmallAlignUDT() : c('A'), s(12) {}
971*9356374aSAndroid Build Coastguard Worker   char c;
972*9356374aSAndroid Build Coastguard Worker   int16_t s;
973*9356374aSAndroid Build Coastguard Worker   char bytes[14];
974*9356374aSAndroid Build Coastguard Worker };
975*9356374aSAndroid Build Coastguard Worker 
AbslParseFlag(absl::string_view,SmallAlignUDT *,std::string *)976*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view, SmallAlignUDT*, std::string*) {
977*9356374aSAndroid Build Coastguard Worker   return true;
978*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const SmallAlignUDT &)979*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const SmallAlignUDT&) { return ""; }
980*9356374aSAndroid Build Coastguard Worker 
981*9356374aSAndroid Build Coastguard Worker }  // namespace
982*9356374aSAndroid Build Coastguard Worker 
983*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(SmallAlignUDT, test_flag_sa_udt, {}, "help");
984*9356374aSAndroid Build Coastguard Worker 
985*9356374aSAndroid Build Coastguard Worker namespace {
986*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestSmallAlignUDT)987*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestSmallAlignUDT) {
988*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<SmallAlignUDT>(),
989*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kSequenceLocked);
990*9356374aSAndroid Build Coastguard Worker   SmallAlignUDT value = absl::GetFlag(FLAGS_test_flag_sa_udt);
991*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.c, 'A');
992*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.s, 12);
993*9356374aSAndroid Build Coastguard Worker 
994*9356374aSAndroid Build Coastguard Worker   value.c = 'B';
995*9356374aSAndroid Build Coastguard Worker   value.s = 45;
996*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_flag_sa_udt, value);
997*9356374aSAndroid Build Coastguard Worker   value = absl::GetFlag(FLAGS_test_flag_sa_udt);
998*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.c, 'B');
999*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.s, 45);
1000*9356374aSAndroid Build Coastguard Worker }
1001*9356374aSAndroid Build Coastguard Worker }  // namespace
1002*9356374aSAndroid Build Coastguard Worker 
1003*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1004*9356374aSAndroid Build Coastguard Worker 
1005*9356374aSAndroid Build Coastguard Worker namespace {
1006*9356374aSAndroid Build Coastguard Worker 
1007*9356374aSAndroid Build Coastguard Worker // User-defined not trivially copyable type.
1008*9356374aSAndroid Build Coastguard Worker template <int id>
1009*9356374aSAndroid Build Coastguard Worker struct NonTriviallyCopyableUDT {
NonTriviallyCopyableUDT__anon002204b01111::NonTriviallyCopyableUDT1010*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableUDT() : c('A') { s_num_instance++; }
NonTriviallyCopyableUDT__anon002204b01111::NonTriviallyCopyableUDT1011*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableUDT(const NonTriviallyCopyableUDT& rhs) : c(rhs.c) {
1012*9356374aSAndroid Build Coastguard Worker     s_num_instance++;
1013*9356374aSAndroid Build Coastguard Worker   }
operator =__anon002204b01111::NonTriviallyCopyableUDT1014*9356374aSAndroid Build Coastguard Worker   NonTriviallyCopyableUDT& operator=(const NonTriviallyCopyableUDT& rhs) {
1015*9356374aSAndroid Build Coastguard Worker     c = rhs.c;
1016*9356374aSAndroid Build Coastguard Worker     return *this;
1017*9356374aSAndroid Build Coastguard Worker   }
~NonTriviallyCopyableUDT__anon002204b01111::NonTriviallyCopyableUDT1018*9356374aSAndroid Build Coastguard Worker   ~NonTriviallyCopyableUDT() { s_num_instance--; }
1019*9356374aSAndroid Build Coastguard Worker 
1020*9356374aSAndroid Build Coastguard Worker   static uint64_t s_num_instance;
1021*9356374aSAndroid Build Coastguard Worker   char c;
1022*9356374aSAndroid Build Coastguard Worker };
1023*9356374aSAndroid Build Coastguard Worker 
1024*9356374aSAndroid Build Coastguard Worker template <int id>
1025*9356374aSAndroid Build Coastguard Worker uint64_t NonTriviallyCopyableUDT<id>::s_num_instance = 0;
1026*9356374aSAndroid Build Coastguard Worker 
1027*9356374aSAndroid Build Coastguard Worker template <int id>
AbslParseFlag(absl::string_view txt,NonTriviallyCopyableUDT<id> * f,std::string *)1028*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view txt, NonTriviallyCopyableUDT<id>* f,
1029*9356374aSAndroid Build Coastguard Worker                    std::string*) {
1030*9356374aSAndroid Build Coastguard Worker   f->c = txt.empty() ? '\0' : txt[0];
1031*9356374aSAndroid Build Coastguard Worker   return true;
1032*9356374aSAndroid Build Coastguard Worker }
1033*9356374aSAndroid Build Coastguard Worker template <int id>
AbslUnparseFlag(const NonTriviallyCopyableUDT<id> &)1034*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const NonTriviallyCopyableUDT<id>&) {
1035*9356374aSAndroid Build Coastguard Worker   return "";
1036*9356374aSAndroid Build Coastguard Worker }
1037*9356374aSAndroid Build Coastguard Worker 
1038*9356374aSAndroid Build Coastguard Worker template <int id, typename F>
TestExpectedLeaks(F && f,uint64_t num_leaks,absl::optional<uint64_t> num_new_instances=absl::nullopt)1039*9356374aSAndroid Build Coastguard Worker void TestExpectedLeaks(
1040*9356374aSAndroid Build Coastguard Worker     F&& f, uint64_t num_leaks,
1041*9356374aSAndroid Build Coastguard Worker     absl::optional<uint64_t> num_new_instances = absl::nullopt) {
1042*9356374aSAndroid Build Coastguard Worker   if (!num_new_instances.has_value()) num_new_instances = num_leaks;
1043*9356374aSAndroid Build Coastguard Worker 
1044*9356374aSAndroid Build Coastguard Worker   auto num_leaked_before = flags::NumLeakedFlagValues();
1045*9356374aSAndroid Build Coastguard Worker   auto num_instances_before = NonTriviallyCopyableUDT<id>::s_num_instance;
1046*9356374aSAndroid Build Coastguard Worker   f();
1047*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(num_leaked_before + num_leaks, flags::NumLeakedFlagValues());
1048*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(num_instances_before + num_new_instances.value(),
1049*9356374aSAndroid Build Coastguard Worker             NonTriviallyCopyableUDT<id>::s_num_instance);
1050*9356374aSAndroid Build Coastguard Worker }
1051*9356374aSAndroid Build Coastguard Worker }  // namespace
1052*9356374aSAndroid Build Coastguard Worker 
1053*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableUDT<1>, test_flag_ntc_udt1, {}, "help");
1054*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableUDT<2>, test_flag_ntc_udt2, {}, "help");
1055*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableUDT<3>, test_flag_ntc_udt3, {}, "help");
1056*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableUDT<4>, test_flag_ntc_udt4, {}, "help");
1057*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(NonTriviallyCopyableUDT<5>, test_flag_ntc_udt5, {}, "help");
1058*9356374aSAndroid Build Coastguard Worker 
1059*9356374aSAndroid Build Coastguard Worker namespace {
1060*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonTriviallyCopyableGetSetSet)1061*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonTriviallyCopyableGetSetSet) {
1062*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(flags::StorageKind<NonTriviallyCopyableUDT<1>>(),
1063*9356374aSAndroid Build Coastguard Worker             flags::FlagValueStorageKind::kHeapAllocated);
1064*9356374aSAndroid Build Coastguard Worker 
1065*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<1>(
1066*9356374aSAndroid Build Coastguard Worker       [&] {
1067*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<1> value =
1068*9356374aSAndroid Build Coastguard Worker             absl::GetFlag(FLAGS_test_flag_ntc_udt1);
1069*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'A');
1070*9356374aSAndroid Build Coastguard Worker       },
1071*9356374aSAndroid Build Coastguard Worker       0);
1072*9356374aSAndroid Build Coastguard Worker 
1073*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<1>(
1074*9356374aSAndroid Build Coastguard Worker       [&] {
1075*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<1> value;
1076*9356374aSAndroid Build Coastguard Worker         value.c = 'B';
1077*9356374aSAndroid Build Coastguard Worker         absl::SetFlag(&FLAGS_test_flag_ntc_udt1, value);
1078*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'B');
1079*9356374aSAndroid Build Coastguard Worker       },
1080*9356374aSAndroid Build Coastguard Worker       1);
1081*9356374aSAndroid Build Coastguard Worker 
1082*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<1>(
1083*9356374aSAndroid Build Coastguard Worker       [&] {
1084*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<1> value;
1085*9356374aSAndroid Build Coastguard Worker         value.c = 'C';
1086*9356374aSAndroid Build Coastguard Worker         absl::SetFlag(&FLAGS_test_flag_ntc_udt1, value);
1087*9356374aSAndroid Build Coastguard Worker       },
1088*9356374aSAndroid Build Coastguard Worker       0);
1089*9356374aSAndroid Build Coastguard Worker }
1090*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonTriviallyCopyableParseSet)1091*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonTriviallyCopyableParseSet) {
1092*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<2>(
1093*9356374aSAndroid Build Coastguard Worker       [&] {
1094*9356374aSAndroid Build Coastguard Worker         const char* in_argv[] = {"testbin", "--test_flag_ntc_udt2=A"};
1095*9356374aSAndroid Build Coastguard Worker         absl::ParseCommandLine(2, const_cast<char**>(in_argv));
1096*9356374aSAndroid Build Coastguard Worker       },
1097*9356374aSAndroid Build Coastguard Worker       0);
1098*9356374aSAndroid Build Coastguard Worker 
1099*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<2>(
1100*9356374aSAndroid Build Coastguard Worker       [&] {
1101*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<2> value;
1102*9356374aSAndroid Build Coastguard Worker         value.c = 'B';
1103*9356374aSAndroid Build Coastguard Worker         absl::SetFlag(&FLAGS_test_flag_ntc_udt2, value);
1104*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'B');
1105*9356374aSAndroid Build Coastguard Worker       },
1106*9356374aSAndroid Build Coastguard Worker       0);
1107*9356374aSAndroid Build Coastguard Worker }
1108*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonTriviallyCopyableSet)1109*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonTriviallyCopyableSet) {
1110*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<3>(
1111*9356374aSAndroid Build Coastguard Worker       [&] {
1112*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<3> value;
1113*9356374aSAndroid Build Coastguard Worker         value.c = 'B';
1114*9356374aSAndroid Build Coastguard Worker         absl::SetFlag(&FLAGS_test_flag_ntc_udt3, value);
1115*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'B');
1116*9356374aSAndroid Build Coastguard Worker       },
1117*9356374aSAndroid Build Coastguard Worker       0);
1118*9356374aSAndroid Build Coastguard Worker }
1119*9356374aSAndroid Build Coastguard Worker 
1120*9356374aSAndroid Build Coastguard Worker // One new instance created during initialization and stored in the flag.
1121*9356374aSAndroid Build Coastguard Worker auto premain_utd4_get =
__anon002204b01902null1122*9356374aSAndroid Build Coastguard Worker     (TestExpectedLeaks<4>([] { (void)absl::GetFlag(FLAGS_test_flag_ntc_udt4); },
1123*9356374aSAndroid Build Coastguard Worker                           0, 1),
1124*9356374aSAndroid Build Coastguard Worker      false);
1125*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonTriviallyCopyableGetBeforeMainParseGet)1126*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonTriviallyCopyableGetBeforeMainParseGet) {
1127*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<4>(
1128*9356374aSAndroid Build Coastguard Worker       [&] {
1129*9356374aSAndroid Build Coastguard Worker         const char* in_argv[] = {"testbin", "--test_flag_ntc_udt4=C"};
1130*9356374aSAndroid Build Coastguard Worker         absl::ParseCommandLine(2, const_cast<char**>(in_argv));
1131*9356374aSAndroid Build Coastguard Worker       },
1132*9356374aSAndroid Build Coastguard Worker       1);
1133*9356374aSAndroid Build Coastguard Worker 
1134*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<4>(
1135*9356374aSAndroid Build Coastguard Worker       [&] {
1136*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<4> value =
1137*9356374aSAndroid Build Coastguard Worker             absl::GetFlag(FLAGS_test_flag_ntc_udt4);
1138*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'C');
1139*9356374aSAndroid Build Coastguard Worker       },
1140*9356374aSAndroid Build Coastguard Worker       0);
1141*9356374aSAndroid Build Coastguard Worker }
1142*9356374aSAndroid Build Coastguard Worker 
1143*9356374aSAndroid Build Coastguard Worker // One new instance created during initialization, which is reused since it was
1144*9356374aSAndroid Build Coastguard Worker // never read.
1145*9356374aSAndroid Build Coastguard Worker auto premain_utd5_set = (TestExpectedLeaks<5>(
__anon002204b01c02null1146*9356374aSAndroid Build Coastguard Worker                              [] {
1147*9356374aSAndroid Build Coastguard Worker                                NonTriviallyCopyableUDT<5> value;
1148*9356374aSAndroid Build Coastguard Worker                                value.c = 'B';
1149*9356374aSAndroid Build Coastguard Worker                                absl::SetFlag(&FLAGS_test_flag_ntc_udt5, value);
1150*9356374aSAndroid Build Coastguard Worker                              },
1151*9356374aSAndroid Build Coastguard Worker                              0, 1),
1152*9356374aSAndroid Build Coastguard Worker                          false);
1153*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestNonTriviallyCopyableSetParseGet)1154*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestNonTriviallyCopyableSetParseGet) {
1155*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<5>(
1156*9356374aSAndroid Build Coastguard Worker       [&] {
1157*9356374aSAndroid Build Coastguard Worker         const char* in_argv[] = {"testbin", "--test_flag_ntc_udt5=C"};
1158*9356374aSAndroid Build Coastguard Worker         absl::ParseCommandLine(2, const_cast<char**>(in_argv));
1159*9356374aSAndroid Build Coastguard Worker       },
1160*9356374aSAndroid Build Coastguard Worker       0);
1161*9356374aSAndroid Build Coastguard Worker 
1162*9356374aSAndroid Build Coastguard Worker   TestExpectedLeaks<5>(
1163*9356374aSAndroid Build Coastguard Worker       [&] {
1164*9356374aSAndroid Build Coastguard Worker         NonTriviallyCopyableUDT<5> value =
1165*9356374aSAndroid Build Coastguard Worker             absl::GetFlag(FLAGS_test_flag_ntc_udt5);
1166*9356374aSAndroid Build Coastguard Worker         EXPECT_EQ(value.c, 'C');
1167*9356374aSAndroid Build Coastguard Worker       },
1168*9356374aSAndroid Build Coastguard Worker       0);
1169*9356374aSAndroid Build Coastguard Worker }
1170*9356374aSAndroid Build Coastguard Worker 
1171*9356374aSAndroid Build Coastguard Worker }  // namespace
1172*9356374aSAndroid Build Coastguard Worker 
1173*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1174*9356374aSAndroid Build Coastguard Worker 
1175*9356374aSAndroid Build Coastguard Worker namespace {
1176*9356374aSAndroid Build Coastguard Worker 
1177*9356374aSAndroid Build Coastguard Worker enum TestE { A = 1, B = 2, C = 3 };
1178*9356374aSAndroid Build Coastguard Worker 
1179*9356374aSAndroid Build Coastguard Worker struct EnumWrapper {
EnumWrapper__anon002204b01f11::EnumWrapper1180*9356374aSAndroid Build Coastguard Worker   EnumWrapper() : e(A) {}
1181*9356374aSAndroid Build Coastguard Worker 
1182*9356374aSAndroid Build Coastguard Worker   TestE e;
1183*9356374aSAndroid Build Coastguard Worker };
1184*9356374aSAndroid Build Coastguard Worker 
AbslParseFlag(absl::string_view,EnumWrapper *,std::string *)1185*9356374aSAndroid Build Coastguard Worker bool AbslParseFlag(absl::string_view, EnumWrapper*, std::string*) {
1186*9356374aSAndroid Build Coastguard Worker   return true;
1187*9356374aSAndroid Build Coastguard Worker }
AbslUnparseFlag(const EnumWrapper &)1188*9356374aSAndroid Build Coastguard Worker std::string AbslUnparseFlag(const EnumWrapper&) { return ""; }
1189*9356374aSAndroid Build Coastguard Worker 
1190*9356374aSAndroid Build Coastguard Worker }  // namespace
1191*9356374aSAndroid Build Coastguard Worker 
1192*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(EnumWrapper, test_enum_wrapper_flag, {}, "help");
1193*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TesTypeWrappingEnum)1194*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TesTypeWrappingEnum) {
1195*9356374aSAndroid Build Coastguard Worker   EnumWrapper value = absl::GetFlag(FLAGS_test_enum_wrapper_flag);
1196*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.e, A);
1197*9356374aSAndroid Build Coastguard Worker 
1198*9356374aSAndroid Build Coastguard Worker   value.e = B;
1199*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_test_enum_wrapper_flag, value);
1200*9356374aSAndroid Build Coastguard Worker   value = absl::GetFlag(FLAGS_test_enum_wrapper_flag);
1201*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(value.e, B);
1202*9356374aSAndroid Build Coastguard Worker }
1203*9356374aSAndroid Build Coastguard Worker 
1204*9356374aSAndroid Build Coastguard Worker // This is a compile test to ensure macros are expanded within ABSL_FLAG and
1205*9356374aSAndroid Build Coastguard Worker // ABSL_DECLARE_FLAG.
1206*9356374aSAndroid Build Coastguard Worker #define FLAG_NAME_MACRO(name) prefix_##name
1207*9356374aSAndroid Build Coastguard Worker ABSL_DECLARE_FLAG(int, FLAG_NAME_MACRO(test_macro_named_flag));
1208*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(int, FLAG_NAME_MACRO(test_macro_named_flag), 0,
1209*9356374aSAndroid Build Coastguard Worker           "Testing macro expansion within ABSL_FLAG");
1210*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,MacroWithinAbslFlag)1211*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, MacroWithinAbslFlag) {
1212*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_prefix_test_macro_named_flag), 0);
1213*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_prefix_test_macro_named_flag, 1);
1214*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_prefix_test_macro_named_flag), 1);
1215*9356374aSAndroid Build Coastguard Worker }
1216*9356374aSAndroid Build Coastguard Worker 
1217*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1218*9356374aSAndroid Build Coastguard Worker 
1219*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<bool>, optional_bool, absl::nullopt, "help");
1220*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<int>, optional_int, {}, "help");
1221*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<double>, optional_double, 9.3, "help");
1222*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<std::string>, optional_string, absl::nullopt, "help");
1223*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<absl::Duration>, optional_duration, absl::nullopt,
1224*9356374aSAndroid Build Coastguard Worker           "help");
1225*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(absl::optional<absl::optional<int>>, optional_optional_int,
1226*9356374aSAndroid Build Coastguard Worker           absl::nullopt, "help");
1227*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_HAVE_STD_OPTIONAL) && !defined(ABSL_USES_STD_OPTIONAL)
1228*9356374aSAndroid Build Coastguard Worker ABSL_FLAG(std::optional<int64_t>, std_optional_int64, std::nullopt, "help");
1229*9356374aSAndroid Build Coastguard Worker #endif
1230*9356374aSAndroid Build Coastguard Worker 
1231*9356374aSAndroid Build Coastguard Worker namespace {
1232*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalBool)1233*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalBool) {
1234*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_bool).has_value());
1235*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_bool), absl::nullopt);
1236*9356374aSAndroid Build Coastguard Worker 
1237*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_bool, false);
1238*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_bool).has_value());
1239*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_bool), false);
1240*9356374aSAndroid Build Coastguard Worker 
1241*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_bool, true);
1242*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_bool).has_value());
1243*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_bool), true);
1244*9356374aSAndroid Build Coastguard Worker 
1245*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_bool, absl::nullopt);
1246*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_bool).has_value());
1247*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_bool), absl::nullopt);
1248*9356374aSAndroid Build Coastguard Worker }
1249*9356374aSAndroid Build Coastguard Worker 
1250*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1251*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalInt)1252*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalInt) {
1253*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_int).has_value());
1254*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_int), absl::nullopt);
1255*9356374aSAndroid Build Coastguard Worker 
1256*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_int, 0);
1257*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_int).has_value());
1258*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_int), 0);
1259*9356374aSAndroid Build Coastguard Worker 
1260*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_int, 10);
1261*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_int).has_value());
1262*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_int), 10);
1263*9356374aSAndroid Build Coastguard Worker 
1264*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_int, absl::nullopt);
1265*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_int).has_value());
1266*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_int), absl::nullopt);
1267*9356374aSAndroid Build Coastguard Worker }
1268*9356374aSAndroid Build Coastguard Worker 
1269*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1270*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalDouble)1271*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalDouble) {
1272*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_double).has_value());
1273*9356374aSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(*absl::GetFlag(FLAGS_optional_double), 9.3);
1274*9356374aSAndroid Build Coastguard Worker 
1275*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_double, 0.0);
1276*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_double).has_value());
1277*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_double), 0.0);
1278*9356374aSAndroid Build Coastguard Worker 
1279*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_double, 1.234);
1280*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_double).has_value());
1281*9356374aSAndroid Build Coastguard Worker   EXPECT_DOUBLE_EQ(*absl::GetFlag(FLAGS_optional_double), 1.234);
1282*9356374aSAndroid Build Coastguard Worker 
1283*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_double, absl::nullopt);
1284*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_double).has_value());
1285*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_double), absl::nullopt);
1286*9356374aSAndroid Build Coastguard Worker }
1287*9356374aSAndroid Build Coastguard Worker 
1288*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1289*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalString)1290*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalString) {
1291*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_string).has_value());
1292*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_string), absl::nullopt);
1293*9356374aSAndroid Build Coastguard Worker 
1294*9356374aSAndroid Build Coastguard Worker   // Setting optional string to "" leads to undefined behavior.
1295*9356374aSAndroid Build Coastguard Worker 
1296*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_string, " ");
1297*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_string).has_value());
1298*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_string), " ");
1299*9356374aSAndroid Build Coastguard Worker 
1300*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_string, "QWERTY");
1301*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_string).has_value());
1302*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_string), "QWERTY");
1303*9356374aSAndroid Build Coastguard Worker 
1304*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_string, absl::nullopt);
1305*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_string).has_value());
1306*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_string), absl::nullopt);
1307*9356374aSAndroid Build Coastguard Worker }
1308*9356374aSAndroid Build Coastguard Worker 
1309*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1310*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalDuration)1311*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalDuration) {
1312*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_duration).has_value());
1313*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_duration), absl::nullopt);
1314*9356374aSAndroid Build Coastguard Worker 
1315*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_duration, absl::ZeroDuration());
1316*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_duration).has_value());
1317*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_duration), absl::Seconds(0));
1318*9356374aSAndroid Build Coastguard Worker 
1319*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_duration, absl::Hours(3));
1320*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_duration).has_value());
1321*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_duration), absl::Hours(3));
1322*9356374aSAndroid Build Coastguard Worker 
1323*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_duration, absl::nullopt);
1324*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_duration).has_value());
1325*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_duration), absl::nullopt);
1326*9356374aSAndroid Build Coastguard Worker }
1327*9356374aSAndroid Build Coastguard Worker 
1328*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1329*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestOptionalOptional)1330*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestOptionalOptional) {
1331*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_optional_int).has_value());
1332*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int), absl::nullopt);
1333*9356374aSAndroid Build Coastguard Worker 
1334*9356374aSAndroid Build Coastguard Worker   absl::optional<int> nullint{absl::nullopt};
1335*9356374aSAndroid Build Coastguard Worker 
1336*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_optional_int, nullint);
1337*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_optional_int).has_value());
1338*9356374aSAndroid Build Coastguard Worker   EXPECT_NE(absl::GetFlag(FLAGS_optional_optional_int), nullint);
1339*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int),
1340*9356374aSAndroid Build Coastguard Worker             absl::optional<absl::optional<int>>{nullint});
1341*9356374aSAndroid Build Coastguard Worker 
1342*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_optional_int, 0);
1343*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_optional_int).has_value());
1344*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int), 0);
1345*9356374aSAndroid Build Coastguard Worker 
1346*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_optional_int, absl::optional<int>{0});
1347*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_optional_optional_int).has_value());
1348*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int), 0);
1349*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int), absl::optional<int>{0});
1350*9356374aSAndroid Build Coastguard Worker 
1351*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_optional_optional_int, absl::nullopt);
1352*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_optional_optional_int).has_value());
1353*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_optional_optional_int), absl::nullopt);
1354*9356374aSAndroid Build Coastguard Worker }
1355*9356374aSAndroid Build Coastguard Worker 
1356*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1357*9356374aSAndroid Build Coastguard Worker 
1358*9356374aSAndroid Build Coastguard Worker #if defined(ABSL_HAVE_STD_OPTIONAL) && !defined(ABSL_USES_STD_OPTIONAL)
1359*9356374aSAndroid Build Coastguard Worker 
TEST_F(FlagTest,TestStdOptional)1360*9356374aSAndroid Build Coastguard Worker TEST_F(FlagTest, TestStdOptional) {
1361*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_std_optional_int64).has_value());
1362*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_std_optional_int64), std::nullopt);
1363*9356374aSAndroid Build Coastguard Worker 
1364*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_std_optional_int64, 0);
1365*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_std_optional_int64).has_value());
1366*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_std_optional_int64), 0);
1367*9356374aSAndroid Build Coastguard Worker 
1368*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_std_optional_int64, 0xFFFFFFFFFF16);
1369*9356374aSAndroid Build Coastguard Worker   EXPECT_TRUE(absl::GetFlag(FLAGS_std_optional_int64).has_value());
1370*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_std_optional_int64), 0xFFFFFFFFFF16);
1371*9356374aSAndroid Build Coastguard Worker 
1372*9356374aSAndroid Build Coastguard Worker   absl::SetFlag(&FLAGS_std_optional_int64, std::nullopt);
1373*9356374aSAndroid Build Coastguard Worker   EXPECT_FALSE(absl::GetFlag(FLAGS_std_optional_int64).has_value());
1374*9356374aSAndroid Build Coastguard Worker   EXPECT_EQ(absl::GetFlag(FLAGS_std_optional_int64), std::nullopt);
1375*9356374aSAndroid Build Coastguard Worker }
1376*9356374aSAndroid Build Coastguard Worker 
1377*9356374aSAndroid Build Coastguard Worker // --------------------------------------------------------------------
1378*9356374aSAndroid Build Coastguard Worker 
1379*9356374aSAndroid Build Coastguard Worker #endif
1380*9356374aSAndroid Build Coastguard Worker 
1381*9356374aSAndroid Build Coastguard Worker }  // namespace
1382