xref: /aosp_15_r20/external/gflags/test/gflags_unittest.cc (revision 08ab5237c114d5c0eac1090c56f941d3f639d7d3)
1*08ab5237SOystein Eftevaag // Copyright (c) 2005, Google Inc.
2*08ab5237SOystein Eftevaag // All rights reserved.
3*08ab5237SOystein Eftevaag //
4*08ab5237SOystein Eftevaag // Redistribution and use in source and binary forms, with or without
5*08ab5237SOystein Eftevaag // modification, are permitted provided that the following conditions are
6*08ab5237SOystein Eftevaag // met:
7*08ab5237SOystein Eftevaag //
8*08ab5237SOystein Eftevaag //     * Redistributions of source code must retain the above copyright
9*08ab5237SOystein Eftevaag // notice, this list of conditions and the following disclaimer.
10*08ab5237SOystein Eftevaag //     * Redistributions in binary form must reproduce the above
11*08ab5237SOystein Eftevaag // copyright notice, this list of conditions and the following disclaimer
12*08ab5237SOystein Eftevaag // in the documentation and/or other materials provided with the
13*08ab5237SOystein Eftevaag // distribution.
14*08ab5237SOystein Eftevaag //     * Neither the name of Google Inc. nor the names of its
15*08ab5237SOystein Eftevaag // contributors may be used to endorse or promote products derived from
16*08ab5237SOystein Eftevaag // this software without specific prior written permission.
17*08ab5237SOystein Eftevaag //
18*08ab5237SOystein Eftevaag // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*08ab5237SOystein Eftevaag // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*08ab5237SOystein Eftevaag // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*08ab5237SOystein Eftevaag // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*08ab5237SOystein Eftevaag // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*08ab5237SOystein Eftevaag // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*08ab5237SOystein Eftevaag // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*08ab5237SOystein Eftevaag // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*08ab5237SOystein Eftevaag // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*08ab5237SOystein Eftevaag // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*08ab5237SOystein Eftevaag // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*08ab5237SOystein Eftevaag 
30*08ab5237SOystein Eftevaag // ---
31*08ab5237SOystein Eftevaag //
32*08ab5237SOystein Eftevaag // For now, this unit test does not cover all features of
33*08ab5237SOystein Eftevaag // gflags.cc
34*08ab5237SOystein Eftevaag 
35*08ab5237SOystein Eftevaag #include <gflags/gflags.h>
36*08ab5237SOystein Eftevaag 
37*08ab5237SOystein Eftevaag #include "config.h"
38*08ab5237SOystein Eftevaag #include "util.h"
39*08ab5237SOystein Eftevaag 
40*08ab5237SOystein Eftevaag #include <math.h>       // for isinf() and isnan()
41*08ab5237SOystein Eftevaag #include <stdio.h>
42*08ab5237SOystein Eftevaag #include <stdlib.h>
43*08ab5237SOystein Eftevaag #include <string.h>
44*08ab5237SOystein Eftevaag #ifdef HAVE_UNISTD_H
45*08ab5237SOystein Eftevaag #  include <unistd.h>   // for unlink()
46*08ab5237SOystein Eftevaag #endif
47*08ab5237SOystein Eftevaag #include <vector>
48*08ab5237SOystein Eftevaag #include <string>
49*08ab5237SOystein Eftevaag TEST_INIT
50*08ab5237SOystein Eftevaag EXPECT_DEATH_INIT
51*08ab5237SOystein Eftevaag 
52*08ab5237SOystein Eftevaag // I don't actually use this header file, but #include it under the
53*08ab5237SOystein Eftevaag // old location to make sure that the include-header-forwarding
54*08ab5237SOystein Eftevaag // works.  But don't bother on windows; the windows port is so new
55*08ab5237SOystein Eftevaag // it never had the old location-names.
56*08ab5237SOystein Eftevaag #ifndef _MSC_VER
57*08ab5237SOystein Eftevaag #include <gflags/gflags_completions.h>
58*08ab5237SOystein Eftevaag void (*unused_fn)() = &GFLAGS_NAMESPACE::HandleCommandLineCompletions;
59*08ab5237SOystein Eftevaag #endif
60*08ab5237SOystein Eftevaag 
61*08ab5237SOystein Eftevaag using std::string;
62*08ab5237SOystein Eftevaag using std::vector;
63*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::int32;
64*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::FlagRegisterer;
65*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::StringFromEnv;
66*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::RegisterFlagValidator;
67*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::CommandLineFlagInfo;
68*08ab5237SOystein Eftevaag using GFLAGS_NAMESPACE::GetAllFlags;
69*08ab5237SOystein Eftevaag 
70*08ab5237SOystein Eftevaag DEFINE_string(test_tmpdir, "", "Dir we use for temp files");
71*08ab5237SOystein Eftevaag DEFINE_string(srcdir, StringFromEnv("SRCDIR", "."), "Source-dir root, needed to find gflags_unittest_flagfile");
72*08ab5237SOystein Eftevaag 
73*08ab5237SOystein Eftevaag DECLARE_string(tryfromenv);   // in gflags.cc
74*08ab5237SOystein Eftevaag 
75*08ab5237SOystein Eftevaag DEFINE_bool(test_bool, false, "tests bool-ness");
76*08ab5237SOystein Eftevaag DEFINE_int32(test_int32, -1, "");
77*08ab5237SOystein Eftevaag DEFINE_int64(test_int64, -2, "");
78*08ab5237SOystein Eftevaag DEFINE_uint32(test_uint32, 1, "");
79*08ab5237SOystein Eftevaag DEFINE_uint64(test_uint64, 2, "");
80*08ab5237SOystein Eftevaag DEFINE_double(test_double, -1.0, "");
81*08ab5237SOystein Eftevaag DEFINE_string(test_string, "initial", "");
82*08ab5237SOystein Eftevaag 
83*08ab5237SOystein Eftevaag //
84*08ab5237SOystein Eftevaag // The below ugliness gets some additional code coverage in the -helpxml
85*08ab5237SOystein Eftevaag // and -helpmatch test cases having to do with string lengths and formatting
86*08ab5237SOystein Eftevaag //
87*08ab5237SOystein Eftevaag DEFINE_bool(test_bool_with_quite_quite_quite_quite_quite_quite_quite_quite_quite_quite_quite_quite_quite_quite_long_name,
88*08ab5237SOystein Eftevaag             false,
89*08ab5237SOystein Eftevaag             "extremely_extremely_extremely_extremely_extremely_extremely_extremely_extremely_long_meaning");
90*08ab5237SOystein Eftevaag 
91*08ab5237SOystein Eftevaag DEFINE_string(test_str1, "initial", "");
92*08ab5237SOystein Eftevaag DEFINE_string(test_str2, "initial", "");
93*08ab5237SOystein Eftevaag DEFINE_string(test_str3, "initial", "");
94*08ab5237SOystein Eftevaag 
95*08ab5237SOystein Eftevaag // This is used to test setting tryfromenv manually
96*08ab5237SOystein Eftevaag DEFINE_string(test_tryfromenv, "initial", "");
97*08ab5237SOystein Eftevaag 
98*08ab5237SOystein Eftevaag // Don't try this at home!
99*08ab5237SOystein Eftevaag static int changeable_var = 12;
100*08ab5237SOystein Eftevaag DEFINE_int32(changeable_var, ++changeable_var, "");
101*08ab5237SOystein Eftevaag 
102*08ab5237SOystein Eftevaag static int changeable_bool_var = 8008;
103*08ab5237SOystein Eftevaag DEFINE_bool(changeable_bool_var, ++changeable_bool_var == 8009, "");
104*08ab5237SOystein Eftevaag 
105*08ab5237SOystein Eftevaag static int changeable_string_var = 0;
ChangeableString()106*08ab5237SOystein Eftevaag static string ChangeableString() {
107*08ab5237SOystein Eftevaag   char r[] = {static_cast<char>('0' + ++changeable_string_var), '\0'};
108*08ab5237SOystein Eftevaag   return r;
109*08ab5237SOystein Eftevaag }
110*08ab5237SOystein Eftevaag DEFINE_string(changeable_string_var, ChangeableString(), "");
111*08ab5237SOystein Eftevaag 
112*08ab5237SOystein Eftevaag // These are never used in this unittest, but can be used by
113*08ab5237SOystein Eftevaag // gflags_unittest.sh when it needs to specify flags
114*08ab5237SOystein Eftevaag // that are legal for gflags_unittest but don't need to
115*08ab5237SOystein Eftevaag // be a particular value.
116*08ab5237SOystein Eftevaag DEFINE_bool(unused_bool, true, "unused bool-ness");
117*08ab5237SOystein Eftevaag DEFINE_int32(unused_int32, -1001, "");
118*08ab5237SOystein Eftevaag DEFINE_int64(unused_int64, -2001, "");
119*08ab5237SOystein Eftevaag DEFINE_uint32(unused_uint32, 1000, "");
120*08ab5237SOystein Eftevaag DEFINE_uint64(unused_uint64, 2000, "");
121*08ab5237SOystein Eftevaag DEFINE_double(unused_double, -1000.0, "");
122*08ab5237SOystein Eftevaag DEFINE_string(unused_string, "unused", "");
123*08ab5237SOystein Eftevaag 
124*08ab5237SOystein Eftevaag // These flags are used by gflags_unittest.sh
125*08ab5237SOystein Eftevaag DEFINE_bool(changed_bool1, false, "changed");
126*08ab5237SOystein Eftevaag DEFINE_bool(changed_bool2, false, "changed");
127*08ab5237SOystein Eftevaag DEFINE_bool(long_helpstring, false,
128*08ab5237SOystein Eftevaag             "This helpstring goes on forever and ever and ever and ever and "
129*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
130*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
131*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
132*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
133*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
134*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
135*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
136*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
137*08ab5237SOystein Eftevaag             "ever and ever and ever and ever and ever and ever and ever and "
138*08ab5237SOystein Eftevaag             "ever.  This is the end of a long helpstring");
139*08ab5237SOystein Eftevaag 
140*08ab5237SOystein Eftevaag 
AlwaysFail(const char * flag,bool value)141*08ab5237SOystein Eftevaag static bool AlwaysFail(const char* flag, bool value) { return value == false; }
142*08ab5237SOystein Eftevaag DEFINE_bool(always_fail, false, "will fail to validate when you set it");
143*08ab5237SOystein Eftevaag DEFINE_validator(always_fail, AlwaysFail);
144*08ab5237SOystein Eftevaag 
145*08ab5237SOystein Eftevaag // See the comment by GetAllFlags in gflags.h
DeadlockIfCantLockInValidators(const char * flag,bool value)146*08ab5237SOystein Eftevaag static bool DeadlockIfCantLockInValidators(const char* flag, bool value) {
147*08ab5237SOystein Eftevaag   if (!value) {
148*08ab5237SOystein Eftevaag     return true;
149*08ab5237SOystein Eftevaag   }
150*08ab5237SOystein Eftevaag   vector<CommandLineFlagInfo> dummy;
151*08ab5237SOystein Eftevaag   GetAllFlags(&dummy);
152*08ab5237SOystein Eftevaag   return true;
153*08ab5237SOystein Eftevaag }
154*08ab5237SOystein Eftevaag DEFINE_bool(deadlock_if_cant_lock,
155*08ab5237SOystein Eftevaag             false,
156*08ab5237SOystein Eftevaag             "will deadlock if set to true and "
157*08ab5237SOystein Eftevaag             "if locking of registry in validators fails.");
158*08ab5237SOystein Eftevaag DEFINE_validator(deadlock_if_cant_lock, DeadlockIfCantLockInValidators);
159*08ab5237SOystein Eftevaag 
160*08ab5237SOystein Eftevaag #define MAKEFLAG(x) DEFINE_int32(test_flag_num##x, x, "Test flag")
161*08ab5237SOystein Eftevaag 
162*08ab5237SOystein Eftevaag // Define 10 flags
163*08ab5237SOystein Eftevaag #define MAKEFLAG10(x)                           \
164*08ab5237SOystein Eftevaag   MAKEFLAG(x##0);                               \
165*08ab5237SOystein Eftevaag   MAKEFLAG(x##1);                               \
166*08ab5237SOystein Eftevaag   MAKEFLAG(x##2);                               \
167*08ab5237SOystein Eftevaag   MAKEFLAG(x##3);                               \
168*08ab5237SOystein Eftevaag   MAKEFLAG(x##4);                               \
169*08ab5237SOystein Eftevaag   MAKEFLAG(x##5);                               \
170*08ab5237SOystein Eftevaag   MAKEFLAG(x##6);                               \
171*08ab5237SOystein Eftevaag   MAKEFLAG(x##7);                               \
172*08ab5237SOystein Eftevaag   MAKEFLAG(x##8);                               \
173*08ab5237SOystein Eftevaag   MAKEFLAG(x##9)
174*08ab5237SOystein Eftevaag 
175*08ab5237SOystein Eftevaag // Define 100 flags
176*08ab5237SOystein Eftevaag #define MAKEFLAG100(x)                          \
177*08ab5237SOystein Eftevaag   MAKEFLAG10(x##0);                             \
178*08ab5237SOystein Eftevaag   MAKEFLAG10(x##1);                             \
179*08ab5237SOystein Eftevaag   MAKEFLAG10(x##2);                             \
180*08ab5237SOystein Eftevaag   MAKEFLAG10(x##3);                             \
181*08ab5237SOystein Eftevaag   MAKEFLAG10(x##4);                             \
182*08ab5237SOystein Eftevaag   MAKEFLAG10(x##5);                             \
183*08ab5237SOystein Eftevaag   MAKEFLAG10(x##6);                             \
184*08ab5237SOystein Eftevaag   MAKEFLAG10(x##7);                             \
185*08ab5237SOystein Eftevaag   MAKEFLAG10(x##8);                             \
186*08ab5237SOystein Eftevaag   MAKEFLAG10(x##9)
187*08ab5237SOystein Eftevaag 
188*08ab5237SOystein Eftevaag // Define a bunch of command-line flags.  Each occurrence of the MAKEFLAG100
189*08ab5237SOystein Eftevaag // macro defines 100 integer flags.  This lets us test the effect of having
190*08ab5237SOystein Eftevaag // many flags on startup time.
191*08ab5237SOystein Eftevaag MAKEFLAG100(1);
192*08ab5237SOystein Eftevaag MAKEFLAG100(2);
193*08ab5237SOystein Eftevaag MAKEFLAG100(3);
194*08ab5237SOystein Eftevaag MAKEFLAG100(4);
195*08ab5237SOystein Eftevaag MAKEFLAG100(5);
196*08ab5237SOystein Eftevaag MAKEFLAG100(6);
197*08ab5237SOystein Eftevaag MAKEFLAG100(7);
198*08ab5237SOystein Eftevaag MAKEFLAG100(8);
199*08ab5237SOystein Eftevaag MAKEFLAG100(9);
200*08ab5237SOystein Eftevaag MAKEFLAG100(10);
201*08ab5237SOystein Eftevaag MAKEFLAG100(11);
202*08ab5237SOystein Eftevaag MAKEFLAG100(12);
203*08ab5237SOystein Eftevaag MAKEFLAG100(13);
204*08ab5237SOystein Eftevaag MAKEFLAG100(14);
205*08ab5237SOystein Eftevaag MAKEFLAG100(15);
206*08ab5237SOystein Eftevaag 
207*08ab5237SOystein Eftevaag #undef MAKEFLAG100
208*08ab5237SOystein Eftevaag #undef MAKEFLAG10
209*08ab5237SOystein Eftevaag #undef MAKEFLAG
210*08ab5237SOystein Eftevaag 
211*08ab5237SOystein Eftevaag // This is a pseudo-flag -- we want to register a flag with a filename
212*08ab5237SOystein Eftevaag // at the top level, but there is no way to do this except by faking
213*08ab5237SOystein Eftevaag // the filename.
214*08ab5237SOystein Eftevaag namespace fLI {
215*08ab5237SOystein Eftevaag   static const int32 FLAGS_nonotldflag1 = 12;
216*08ab5237SOystein Eftevaag   int32 FLAGS_tldflag1 = FLAGS_nonotldflag1;
217*08ab5237SOystein Eftevaag   int32 FLAGS_notldflag1 = FLAGS_nonotldflag1;
218*08ab5237SOystein Eftevaag   static FlagRegisterer o_tldflag1(
219*08ab5237SOystein Eftevaag     "tldflag1",
220*08ab5237SOystein Eftevaag     "should show up in --helpshort", "gflags_unittest.cc",
221*08ab5237SOystein Eftevaag     &FLAGS_tldflag1, &FLAGS_notldflag1);
222*08ab5237SOystein Eftevaag }
223*08ab5237SOystein Eftevaag using fLI::FLAGS_tldflag1;
224*08ab5237SOystein Eftevaag 
225*08ab5237SOystein Eftevaag namespace fLI {
226*08ab5237SOystein Eftevaag   static const int32 FLAGS_nonotldflag2 = 23;
227*08ab5237SOystein Eftevaag   int32 FLAGS_tldflag2 = FLAGS_nonotldflag2;
228*08ab5237SOystein Eftevaag   int32 FLAGS_notldflag2 = FLAGS_nonotldflag2;
229*08ab5237SOystein Eftevaag   static FlagRegisterer o_tldflag2(
230*08ab5237SOystein Eftevaag     "tldflag2",
231*08ab5237SOystein Eftevaag     "should show up in --helpshort", "gflags_unittest.",
232*08ab5237SOystein Eftevaag     &FLAGS_tldflag2, &FLAGS_notldflag2);
233*08ab5237SOystein Eftevaag }
234*08ab5237SOystein Eftevaag using fLI::FLAGS_tldflag2;
235*08ab5237SOystein Eftevaag 
236*08ab5237SOystein Eftevaag namespace GFLAGS_NAMESPACE {
237*08ab5237SOystein Eftevaag 
238*08ab5237SOystein Eftevaag namespace {
239*08ab5237SOystein Eftevaag 
240*08ab5237SOystein Eftevaag 
TmpFile(const string & basename)241*08ab5237SOystein Eftevaag static string TmpFile(const string& basename) {
242*08ab5237SOystein Eftevaag #ifdef _MSC_VER
243*08ab5237SOystein Eftevaag   return FLAGS_test_tmpdir + "\\" + basename;
244*08ab5237SOystein Eftevaag #else
245*08ab5237SOystein Eftevaag   return FLAGS_test_tmpdir + "/" + basename;
246*08ab5237SOystein Eftevaag #endif
247*08ab5237SOystein Eftevaag }
248*08ab5237SOystein Eftevaag 
249*08ab5237SOystein Eftevaag // Returns the definition of the --flagfile flag to be used in the tests.
250*08ab5237SOystein Eftevaag // Must be called after ParseCommandLineFlags().
GetFlagFileFlag()251*08ab5237SOystein Eftevaag static const char* GetFlagFileFlag() {
252*08ab5237SOystein Eftevaag #ifdef _MSC_VER
253*08ab5237SOystein Eftevaag   static const string flagfile = FLAGS_srcdir + "\\gflags_unittest_flagfile";
254*08ab5237SOystein Eftevaag #else
255*08ab5237SOystein Eftevaag   static const string flagfile = FLAGS_srcdir + "/gflags_unittest_flagfile";
256*08ab5237SOystein Eftevaag #endif
257*08ab5237SOystein Eftevaag   static const string flagfile_flag = string("--flagfile=") + flagfile;
258*08ab5237SOystein Eftevaag   return flagfile_flag.c_str();
259*08ab5237SOystein Eftevaag }
260*08ab5237SOystein Eftevaag 
261*08ab5237SOystein Eftevaag 
262*08ab5237SOystein Eftevaag // Defining a variable of type CompileAssertTypesEqual<T1, T2> will cause a
263*08ab5237SOystein Eftevaag // compiler error iff T1 and T2 are different types.
264*08ab5237SOystein Eftevaag template <typename T1, typename T2>
265*08ab5237SOystein Eftevaag struct CompileAssertTypesEqual;
266*08ab5237SOystein Eftevaag 
267*08ab5237SOystein Eftevaag template <typename T>
268*08ab5237SOystein Eftevaag struct CompileAssertTypesEqual<T, T> {
269*08ab5237SOystein Eftevaag };
270*08ab5237SOystein Eftevaag 
271*08ab5237SOystein Eftevaag 
272*08ab5237SOystein Eftevaag template <typename Expected, typename Actual>
AssertIsType(Actual & x)273*08ab5237SOystein Eftevaag void AssertIsType(Actual& x) {
274*08ab5237SOystein Eftevaag   CompileAssertTypesEqual<Expected, Actual>();
275*08ab5237SOystein Eftevaag }
276*08ab5237SOystein Eftevaag 
277*08ab5237SOystein Eftevaag // Verify all the flags are the right type.
TEST(FlagTypes,FlagTypes)278*08ab5237SOystein Eftevaag TEST(FlagTypes, FlagTypes) {
279*08ab5237SOystein Eftevaag   AssertIsType<bool>(FLAGS_test_bool);
280*08ab5237SOystein Eftevaag   AssertIsType<int32>(FLAGS_test_int32);
281*08ab5237SOystein Eftevaag   AssertIsType<int64>(FLAGS_test_int64);
282*08ab5237SOystein Eftevaag   AssertIsType<uint32>(FLAGS_test_uint32);
283*08ab5237SOystein Eftevaag   AssertIsType<uint64>(FLAGS_test_uint64);
284*08ab5237SOystein Eftevaag   AssertIsType<double>(FLAGS_test_double);
285*08ab5237SOystein Eftevaag   AssertIsType<string>(FLAGS_test_string);
286*08ab5237SOystein Eftevaag }
287*08ab5237SOystein Eftevaag 
288*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
289*08ab5237SOystein Eftevaag // Death tests for "help" options.
290*08ab5237SOystein Eftevaag //
291*08ab5237SOystein Eftevaag // The help system automatically calls gflags_exitfunc(1) when you specify any of
292*08ab5237SOystein Eftevaag // the help-related flags ("-helpmatch", "-helpxml") so we can't test
293*08ab5237SOystein Eftevaag // those mainline.
294*08ab5237SOystein Eftevaag 
295*08ab5237SOystein Eftevaag // Tests that "-helpmatch" causes the process to die.
TEST(ReadFlagsFromStringDeathTest,HelpMatch)296*08ab5237SOystein Eftevaag TEST(ReadFlagsFromStringDeathTest, HelpMatch) {
297*08ab5237SOystein Eftevaag   EXPECT_DEATH(ReadFlagsFromString("-helpmatch=base", GetArgv0(), true),
298*08ab5237SOystein Eftevaag                "");
299*08ab5237SOystein Eftevaag }
300*08ab5237SOystein Eftevaag 
301*08ab5237SOystein Eftevaag 
302*08ab5237SOystein Eftevaag // Tests that "-helpxml" causes the process to die.
TEST(ReadFlagsFromStringDeathTest,HelpXml)303*08ab5237SOystein Eftevaag TEST(ReadFlagsFromStringDeathTest, HelpXml) {
304*08ab5237SOystein Eftevaag   EXPECT_DEATH(ReadFlagsFromString("-helpxml", GetArgv0(), true),
305*08ab5237SOystein Eftevaag                "");
306*08ab5237SOystein Eftevaag }
307*08ab5237SOystein Eftevaag #endif
308*08ab5237SOystein Eftevaag 
309*08ab5237SOystein Eftevaag 
310*08ab5237SOystein Eftevaag // A subroutine needed for testing reading flags from a string.
TestFlagString(const string & flags,const string & expected_string,bool expected_bool,int32 expected_int32,double expected_double)311*08ab5237SOystein Eftevaag void TestFlagString(const string& flags,
312*08ab5237SOystein Eftevaag                     const string& expected_string,
313*08ab5237SOystein Eftevaag                     bool expected_bool,
314*08ab5237SOystein Eftevaag                     int32 expected_int32,
315*08ab5237SOystein Eftevaag                     double expected_double) {
316*08ab5237SOystein Eftevaag   EXPECT_TRUE(ReadFlagsFromString(flags,
317*08ab5237SOystein Eftevaag                                   GetArgv0(),
318*08ab5237SOystein Eftevaag                                   // errors are fatal
319*08ab5237SOystein Eftevaag                                   true));
320*08ab5237SOystein Eftevaag 
321*08ab5237SOystein Eftevaag   EXPECT_EQ(expected_string, FLAGS_test_string);
322*08ab5237SOystein Eftevaag   EXPECT_EQ(expected_bool, FLAGS_test_bool);
323*08ab5237SOystein Eftevaag   EXPECT_EQ(expected_int32, FLAGS_test_int32);
324*08ab5237SOystein Eftevaag   EXPECT_DOUBLE_EQ(expected_double, FLAGS_test_double);
325*08ab5237SOystein Eftevaag }
326*08ab5237SOystein Eftevaag 
327*08ab5237SOystein Eftevaag 
328*08ab5237SOystein Eftevaag // Tests reading flags from a string.
TEST(FlagFileTest,ReadFlagsFromString)329*08ab5237SOystein Eftevaag TEST(FlagFileTest, ReadFlagsFromString) {
330*08ab5237SOystein Eftevaag   TestFlagString(
331*08ab5237SOystein Eftevaag       // Flag string
332*08ab5237SOystein Eftevaag       "-test_string=continued\n"
333*08ab5237SOystein Eftevaag       "# some comments are in order\n"
334*08ab5237SOystein Eftevaag       "# some\n"
335*08ab5237SOystein Eftevaag       "  # comments\n"
336*08ab5237SOystein Eftevaag       "#are\n"
337*08ab5237SOystein Eftevaag       "                  #trickier\n"
338*08ab5237SOystein Eftevaag       "# than others\n"
339*08ab5237SOystein Eftevaag       "-test_bool=true\n"
340*08ab5237SOystein Eftevaag       "     -test_int32=1\n"
341*08ab5237SOystein Eftevaag       "-test_double=0.0\n",
342*08ab5237SOystein Eftevaag       // Expected values
343*08ab5237SOystein Eftevaag       "continued",
344*08ab5237SOystein Eftevaag       true,
345*08ab5237SOystein Eftevaag       1,
346*08ab5237SOystein Eftevaag       0.0);
347*08ab5237SOystein Eftevaag 
348*08ab5237SOystein Eftevaag   TestFlagString(
349*08ab5237SOystein Eftevaag       // Flag string
350*08ab5237SOystein Eftevaag       "# let's make sure it can update values\n"
351*08ab5237SOystein Eftevaag       "-test_string=initial\n"
352*08ab5237SOystein Eftevaag       "-test_bool=false\n"
353*08ab5237SOystein Eftevaag       "-test_int32=123\n"
354*08ab5237SOystein Eftevaag       "-test_double=123.0\n",
355*08ab5237SOystein Eftevaag       // Expected values
356*08ab5237SOystein Eftevaag       "initial",
357*08ab5237SOystein Eftevaag       false,
358*08ab5237SOystein Eftevaag       123,
359*08ab5237SOystein Eftevaag       123.0);
360*08ab5237SOystein Eftevaag 
361*08ab5237SOystein Eftevaag   // Test that flags can use dashes instead of underscores.
362*08ab5237SOystein Eftevaag   TestFlagString(
363*08ab5237SOystein Eftevaag       // Flag string
364*08ab5237SOystein Eftevaag       "-test-string=initial\n"
365*08ab5237SOystein Eftevaag       "--test-bool=false\n"
366*08ab5237SOystein Eftevaag       "--test-int32=123\n"
367*08ab5237SOystein Eftevaag       "--test-double=123.0\n",
368*08ab5237SOystein Eftevaag       // Expected values
369*08ab5237SOystein Eftevaag       "initial",
370*08ab5237SOystein Eftevaag       false,
371*08ab5237SOystein Eftevaag       123,
372*08ab5237SOystein Eftevaag       123.0);
373*08ab5237SOystein Eftevaag }
374*08ab5237SOystein Eftevaag 
375*08ab5237SOystein Eftevaag // Tests the filename part of the flagfile
TEST(FlagFileTest,FilenamesOurfileLast)376*08ab5237SOystein Eftevaag TEST(FlagFileTest, FilenamesOurfileLast) {
377*08ab5237SOystein Eftevaag   FLAGS_test_string = "initial";
378*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
379*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -1;
380*08ab5237SOystein Eftevaag   FLAGS_test_double = -1.0;
381*08ab5237SOystein Eftevaag   TestFlagString(
382*08ab5237SOystein Eftevaag       // Flag string
383*08ab5237SOystein Eftevaag       "-test_string=continued\n"
384*08ab5237SOystein Eftevaag       "# some comments are in order\n"
385*08ab5237SOystein Eftevaag       "# some\n"
386*08ab5237SOystein Eftevaag       "  # comments\n"
387*08ab5237SOystein Eftevaag       "#are\n"
388*08ab5237SOystein Eftevaag       "                  #trickier\n"
389*08ab5237SOystein Eftevaag       "# than others\n"
390*08ab5237SOystein Eftevaag       "not_our_filename\n"
391*08ab5237SOystein Eftevaag       "-test_bool=true\n"
392*08ab5237SOystein Eftevaag       "     -test_int32=1\n"
393*08ab5237SOystein Eftevaag       "gflags_unittest\n"
394*08ab5237SOystein Eftevaag       "-test_double=1000.0\n",
395*08ab5237SOystein Eftevaag       // Expected values
396*08ab5237SOystein Eftevaag       "continued",
397*08ab5237SOystein Eftevaag       false,
398*08ab5237SOystein Eftevaag       -1,
399*08ab5237SOystein Eftevaag       1000.0);
400*08ab5237SOystein Eftevaag }
401*08ab5237SOystein Eftevaag 
TEST(FlagFileTest,FilenamesOurfileFirst)402*08ab5237SOystein Eftevaag TEST(FlagFileTest, FilenamesOurfileFirst) {
403*08ab5237SOystein Eftevaag   FLAGS_test_string = "initial";
404*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
405*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -1;
406*08ab5237SOystein Eftevaag   FLAGS_test_double = -1.0;
407*08ab5237SOystein Eftevaag   TestFlagString(
408*08ab5237SOystein Eftevaag       // Flag string
409*08ab5237SOystein Eftevaag       "-test_string=continued\n"
410*08ab5237SOystein Eftevaag       "# some comments are in order\n"
411*08ab5237SOystein Eftevaag       "# some\n"
412*08ab5237SOystein Eftevaag       "  # comments\n"
413*08ab5237SOystein Eftevaag       "#are\n"
414*08ab5237SOystein Eftevaag       "                  #trickier\n"
415*08ab5237SOystein Eftevaag       "# than others\n"
416*08ab5237SOystein Eftevaag       "gflags_unittest\n"
417*08ab5237SOystein Eftevaag       "-test_bool=true\n"
418*08ab5237SOystein Eftevaag       "     -test_int32=1\n"
419*08ab5237SOystein Eftevaag       "not_our_filename\n"
420*08ab5237SOystein Eftevaag       "-test_double=1000.0\n",
421*08ab5237SOystein Eftevaag       // Expected values
422*08ab5237SOystein Eftevaag       "continued",
423*08ab5237SOystein Eftevaag       true,
424*08ab5237SOystein Eftevaag       1,
425*08ab5237SOystein Eftevaag       -1.0);
426*08ab5237SOystein Eftevaag }
427*08ab5237SOystein Eftevaag 
428*08ab5237SOystein Eftevaag #if defined(HAVE_FNMATCH_H) || defined(HAVE_SHLWAPI_H)  // otherwise glob isn't supported
TEST(FlagFileTest,FilenamesOurfileGlob)429*08ab5237SOystein Eftevaag TEST(FlagFileTest, FilenamesOurfileGlob) {
430*08ab5237SOystein Eftevaag   FLAGS_test_string = "initial";
431*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
432*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -1;
433*08ab5237SOystein Eftevaag   FLAGS_test_double = -1.0;
434*08ab5237SOystein Eftevaag   TestFlagString(
435*08ab5237SOystein Eftevaag       // Flag string
436*08ab5237SOystein Eftevaag       "-test_string=continued\n"
437*08ab5237SOystein Eftevaag       "# some comments are in order\n"
438*08ab5237SOystein Eftevaag       "# some\n"
439*08ab5237SOystein Eftevaag       "  # comments\n"
440*08ab5237SOystein Eftevaag       "#are\n"
441*08ab5237SOystein Eftevaag       "                  #trickier\n"
442*08ab5237SOystein Eftevaag       "# than others\n"
443*08ab5237SOystein Eftevaag       "*flags*\n"
444*08ab5237SOystein Eftevaag       "-test_bool=true\n"
445*08ab5237SOystein Eftevaag       "     -test_int32=1\n"
446*08ab5237SOystein Eftevaag       "flags\n"
447*08ab5237SOystein Eftevaag       "-test_double=1000.0\n",
448*08ab5237SOystein Eftevaag       // Expected values
449*08ab5237SOystein Eftevaag       "continued",
450*08ab5237SOystein Eftevaag       true,
451*08ab5237SOystein Eftevaag       1,
452*08ab5237SOystein Eftevaag       -1.0);
453*08ab5237SOystein Eftevaag }
454*08ab5237SOystein Eftevaag 
TEST(FlagFileTest,FilenamesOurfileInBigList)455*08ab5237SOystein Eftevaag TEST(FlagFileTest, FilenamesOurfileInBigList) {
456*08ab5237SOystein Eftevaag   FLAGS_test_string = "initial";
457*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
458*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -1;
459*08ab5237SOystein Eftevaag   FLAGS_test_double = -1.0;
460*08ab5237SOystein Eftevaag   TestFlagString(
461*08ab5237SOystein Eftevaag       // Flag string
462*08ab5237SOystein Eftevaag       "-test_string=continued\n"
463*08ab5237SOystein Eftevaag       "# some comments are in order\n"
464*08ab5237SOystein Eftevaag       "# some\n"
465*08ab5237SOystein Eftevaag       "  # comments\n"
466*08ab5237SOystein Eftevaag       "#are\n"
467*08ab5237SOystein Eftevaag       "                  #trickier\n"
468*08ab5237SOystein Eftevaag       "# than others\n"
469*08ab5237SOystein Eftevaag       "*first* *flags* *third*\n"
470*08ab5237SOystein Eftevaag       "-test_bool=true\n"
471*08ab5237SOystein Eftevaag       "     -test_int32=1\n"
472*08ab5237SOystein Eftevaag       "flags\n"
473*08ab5237SOystein Eftevaag       "-test_double=1000.0\n",
474*08ab5237SOystein Eftevaag       // Expected values
475*08ab5237SOystein Eftevaag       "continued",
476*08ab5237SOystein Eftevaag       true,
477*08ab5237SOystein Eftevaag       1,
478*08ab5237SOystein Eftevaag       -1.0);
479*08ab5237SOystein Eftevaag }
480*08ab5237SOystein Eftevaag #endif  // defined(HAVE_FNMATCH_H) || defined(HAVE_SHLWAPI_H)
481*08ab5237SOystein Eftevaag 
482*08ab5237SOystein Eftevaag // Tests that a failed flag-from-string read keeps flags at default values
TEST(FlagFileTest,FailReadFlagsFromString)483*08ab5237SOystein Eftevaag TEST(FlagFileTest, FailReadFlagsFromString) {
484*08ab5237SOystein Eftevaag   FLAGS_test_int32 = 119;
485*08ab5237SOystein Eftevaag   string flags("# let's make sure it can update values\n"
486*08ab5237SOystein Eftevaag                "-test_string=non_initial\n"
487*08ab5237SOystein Eftevaag                "-test_bool=false\n"
488*08ab5237SOystein Eftevaag                "-test_int32=123\n"
489*08ab5237SOystein Eftevaag                "-test_double=illegal\n");
490*08ab5237SOystein Eftevaag 
491*08ab5237SOystein Eftevaag   EXPECT_FALSE(ReadFlagsFromString(flags,
492*08ab5237SOystein Eftevaag                                    GetArgv0(),
493*08ab5237SOystein Eftevaag                                    // errors are fatal
494*08ab5237SOystein Eftevaag                                    false));
495*08ab5237SOystein Eftevaag 
496*08ab5237SOystein Eftevaag   EXPECT_EQ(119, FLAGS_test_int32);
497*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_string);
498*08ab5237SOystein Eftevaag }
499*08ab5237SOystein Eftevaag 
500*08ab5237SOystein Eftevaag // Tests that flags can be set to ordinary values.
TEST(SetFlagValueTest,OrdinaryValues)501*08ab5237SOystein Eftevaag TEST(SetFlagValueTest, OrdinaryValues) {
502*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_str1);
503*08ab5237SOystein Eftevaag 
504*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "second", SET_FLAG_IF_DEFAULT);
505*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str1);  // set; was default
506*08ab5237SOystein Eftevaag 
507*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "third", SET_FLAG_IF_DEFAULT);
508*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str1);  // already set once
509*08ab5237SOystein Eftevaag 
510*08ab5237SOystein Eftevaag   FLAGS_test_str1 = "initial";
511*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "third", SET_FLAG_IF_DEFAULT);
512*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_str1);  // still already set before
513*08ab5237SOystein Eftevaag 
514*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "third", SET_FLAGS_VALUE);
515*08ab5237SOystein Eftevaag   EXPECT_EQ("third", FLAGS_test_str1);  // changed value
516*08ab5237SOystein Eftevaag 
517*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "fourth", SET_FLAGS_DEFAULT);
518*08ab5237SOystein Eftevaag   EXPECT_EQ("third", FLAGS_test_str1);
519*08ab5237SOystein Eftevaag   // value not changed (already set before)
520*08ab5237SOystein Eftevaag 
521*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_str2);
522*08ab5237SOystein Eftevaag 
523*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str2", "second", SET_FLAGS_DEFAULT);
524*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str2);  // changed (was default)
525*08ab5237SOystein Eftevaag 
526*08ab5237SOystein Eftevaag   FLAGS_test_str2 = "extra";
527*08ab5237SOystein Eftevaag   EXPECT_EQ("extra", FLAGS_test_str2);
528*08ab5237SOystein Eftevaag 
529*08ab5237SOystein Eftevaag   FLAGS_test_str2 = "second";
530*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str2", "third", SET_FLAGS_DEFAULT);
531*08ab5237SOystein Eftevaag   EXPECT_EQ("third", FLAGS_test_str2);  // still changed (was equal to default)
532*08ab5237SOystein Eftevaag 
533*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str2", "fourth", SET_FLAG_IF_DEFAULT);
534*08ab5237SOystein Eftevaag   EXPECT_EQ("fourth", FLAGS_test_str2);  // changed (was default)
535*08ab5237SOystein Eftevaag 
536*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_str3);
537*08ab5237SOystein Eftevaag 
538*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "second", SET_FLAGS_DEFAULT);
539*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str3);  // changed
540*08ab5237SOystein Eftevaag 
541*08ab5237SOystein Eftevaag   FLAGS_test_str3 = "third";
542*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "fourth", SET_FLAGS_DEFAULT);
543*08ab5237SOystein Eftevaag   EXPECT_EQ("third", FLAGS_test_str3);  // not changed (was set)
544*08ab5237SOystein Eftevaag 
545*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "fourth", SET_FLAG_IF_DEFAULT);
546*08ab5237SOystein Eftevaag   EXPECT_EQ("third", FLAGS_test_str3);  // not changed (was set)
547*08ab5237SOystein Eftevaag 
548*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "fourth", SET_FLAGS_VALUE);
549*08ab5237SOystein Eftevaag   EXPECT_EQ("fourth", FLAGS_test_str3);  // changed value
550*08ab5237SOystein Eftevaag }
551*08ab5237SOystein Eftevaag 
552*08ab5237SOystein Eftevaag 
553*08ab5237SOystein Eftevaag // Tests that flags can be set to exceptional values.
554*08ab5237SOystein Eftevaag // Note: apparently MINGW doesn't parse inf and nan correctly:
555*08ab5237SOystein Eftevaag //    http://www.mail-archive.com/[email protected]/msg09573.html
556*08ab5237SOystein Eftevaag // This url says FreeBSD also has a problem, but I didn't see that.
TEST(SetFlagValueTest,ExceptionalValues)557*08ab5237SOystein Eftevaag TEST(SetFlagValueTest, ExceptionalValues) {
558*08ab5237SOystein Eftevaag #if defined(isinf) && !defined(__MINGW32__)
559*08ab5237SOystein Eftevaag   EXPECT_EQ("test_double set to inf\n",
560*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", "inf"));
561*08ab5237SOystein Eftevaag   EXPECT_INF(FLAGS_test_double);
562*08ab5237SOystein Eftevaag 
563*08ab5237SOystein Eftevaag   EXPECT_EQ("test_double set to inf\n",
564*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", "INF"));
565*08ab5237SOystein Eftevaag   EXPECT_INF(FLAGS_test_double);
566*08ab5237SOystein Eftevaag #endif
567*08ab5237SOystein Eftevaag 
568*08ab5237SOystein Eftevaag   // set some bad values
569*08ab5237SOystein Eftevaag   EXPECT_EQ("",
570*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", "0.1xxx"));
571*08ab5237SOystein Eftevaag   EXPECT_EQ("",
572*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", " "));
573*08ab5237SOystein Eftevaag   EXPECT_EQ("",
574*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", ""));
575*08ab5237SOystein Eftevaag #if defined(isinf) && !defined(__MINGW32__)
576*08ab5237SOystein Eftevaag   EXPECT_EQ("test_double set to -inf\n",
577*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", "-inf"));
578*08ab5237SOystein Eftevaag   EXPECT_INF(FLAGS_test_double);
579*08ab5237SOystein Eftevaag   EXPECT_GT(0, FLAGS_test_double);
580*08ab5237SOystein Eftevaag #endif
581*08ab5237SOystein Eftevaag 
582*08ab5237SOystein Eftevaag #if defined(isnan) && !defined(__MINGW32__)
583*08ab5237SOystein Eftevaag   EXPECT_EQ("test_double set to nan\n",
584*08ab5237SOystein Eftevaag             SetCommandLineOption("test_double", "NaN"));
585*08ab5237SOystein Eftevaag   EXPECT_NAN(FLAGS_test_double);
586*08ab5237SOystein Eftevaag #endif
587*08ab5237SOystein Eftevaag }
588*08ab5237SOystein Eftevaag 
589*08ab5237SOystein Eftevaag // Tests that integer flags can be specified in many ways
TEST(SetFlagValueTest,DifferentRadices)590*08ab5237SOystein Eftevaag TEST(SetFlagValueTest, DifferentRadices) {
591*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32 set to 12\n",
592*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int32", "12"));
593*08ab5237SOystein Eftevaag 
594*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32 set to 16\n",
595*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int32", "0x10"));
596*08ab5237SOystein Eftevaag 
597*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32 set to 34\n",
598*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int32", "0X22"));
599*08ab5237SOystein Eftevaag 
600*08ab5237SOystein Eftevaag   // Leading 0 is *not* octal; it's still decimal
601*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32 set to 10\n",
602*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int32", "010"));
603*08ab5237SOystein Eftevaag }
604*08ab5237SOystein Eftevaag 
605*08ab5237SOystein Eftevaag // Tests what happens when you try to set a flag to an illegal value
TEST(SetFlagValueTest,IllegalValues)606*08ab5237SOystein Eftevaag TEST(SetFlagValueTest, IllegalValues) {
607*08ab5237SOystein Eftevaag   FLAGS_test_bool = true;
608*08ab5237SOystein Eftevaag   FLAGS_test_int32 = 119;
609*08ab5237SOystein Eftevaag   FLAGS_test_int64 = 1191;
610*08ab5237SOystein Eftevaag   FLAGS_test_uint32 = 11911;
611*08ab5237SOystein Eftevaag   FLAGS_test_uint64 = 119111;
612*08ab5237SOystein Eftevaag 
613*08ab5237SOystein Eftevaag   EXPECT_EQ("",
614*08ab5237SOystein Eftevaag             SetCommandLineOption("test_bool", "12"));
615*08ab5237SOystein Eftevaag 
616*08ab5237SOystein Eftevaag   EXPECT_EQ("",
617*08ab5237SOystein Eftevaag             SetCommandLineOption("test_uint32", "-1970"));
618*08ab5237SOystein Eftevaag 
619*08ab5237SOystein Eftevaag   EXPECT_EQ("",
620*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int32", "7000000000000"));
621*08ab5237SOystein Eftevaag 
622*08ab5237SOystein Eftevaag   EXPECT_EQ("",
623*08ab5237SOystein Eftevaag             SetCommandLineOption("test_uint64", "-1"));
624*08ab5237SOystein Eftevaag 
625*08ab5237SOystein Eftevaag   EXPECT_EQ("",
626*08ab5237SOystein Eftevaag             SetCommandLineOption("test_int64", "not a number!"));
627*08ab5237SOystein Eftevaag 
628*08ab5237SOystein Eftevaag   // Test the empty string with each type of input
629*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_bool", ""));
630*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_int32", ""));
631*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_int64", ""));
632*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_uint32", ""));
633*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_uint64", ""));
634*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_double", ""));
635*08ab5237SOystein Eftevaag   EXPECT_EQ("test_string set to \n", SetCommandLineOption("test_string", ""));
636*08ab5237SOystein Eftevaag 
637*08ab5237SOystein Eftevaag   EXPECT_TRUE(FLAGS_test_bool);
638*08ab5237SOystein Eftevaag   EXPECT_EQ(119, FLAGS_test_int32);
639*08ab5237SOystein Eftevaag   EXPECT_EQ(1191, FLAGS_test_int64);
640*08ab5237SOystein Eftevaag   EXPECT_EQ(11911, FLAGS_test_uint32);
641*08ab5237SOystein Eftevaag   EXPECT_EQ(119111, FLAGS_test_uint64);
642*08ab5237SOystein Eftevaag }
643*08ab5237SOystein Eftevaag 
644*08ab5237SOystein Eftevaag 
645*08ab5237SOystein Eftevaag // Tests that we only evaluate macro args once
TEST(MacroArgs,EvaluateOnce)646*08ab5237SOystein Eftevaag TEST(MacroArgs, EvaluateOnce) {
647*08ab5237SOystein Eftevaag   EXPECT_EQ(13, FLAGS_changeable_var);
648*08ab5237SOystein Eftevaag   // Make sure we don't ++ the value somehow, when evaluating the flag.
649*08ab5237SOystein Eftevaag   EXPECT_EQ(13, FLAGS_changeable_var);
650*08ab5237SOystein Eftevaag   // Make sure the macro only evaluated this var once.
651*08ab5237SOystein Eftevaag   EXPECT_EQ(13, changeable_var);
652*08ab5237SOystein Eftevaag   // Make sure the actual value and default value are the same
653*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("changeable_var", "21", SET_FLAG_IF_DEFAULT);
654*08ab5237SOystein Eftevaag   EXPECT_EQ(21, FLAGS_changeable_var);
655*08ab5237SOystein Eftevaag }
656*08ab5237SOystein Eftevaag 
TEST(MacroArgs,EvaluateOnceBool)657*08ab5237SOystein Eftevaag TEST(MacroArgs, EvaluateOnceBool) {
658*08ab5237SOystein Eftevaag   EXPECT_TRUE(FLAGS_changeable_bool_var);
659*08ab5237SOystein Eftevaag   EXPECT_TRUE(FLAGS_changeable_bool_var);
660*08ab5237SOystein Eftevaag   EXPECT_EQ(8009, changeable_bool_var);
661*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("changeable_bool_var", "false",
662*08ab5237SOystein Eftevaag                                SET_FLAG_IF_DEFAULT);
663*08ab5237SOystein Eftevaag   EXPECT_FALSE(FLAGS_changeable_bool_var);
664*08ab5237SOystein Eftevaag }
665*08ab5237SOystein Eftevaag 
TEST(MacroArgs,EvaluateOnceStrings)666*08ab5237SOystein Eftevaag TEST(MacroArgs, EvaluateOnceStrings) {
667*08ab5237SOystein Eftevaag   EXPECT_EQ("1", FLAGS_changeable_string_var);
668*08ab5237SOystein Eftevaag   EXPECT_EQ("1", FLAGS_changeable_string_var);
669*08ab5237SOystein Eftevaag   EXPECT_EQ(1, changeable_string_var);
670*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("changeable_string_var", "different",
671*08ab5237SOystein Eftevaag                                SET_FLAG_IF_DEFAULT);
672*08ab5237SOystein Eftevaag   EXPECT_EQ("different", FLAGS_changeable_string_var);
673*08ab5237SOystein Eftevaag }
674*08ab5237SOystein Eftevaag 
675*08ab5237SOystein Eftevaag // Tests that the FooFromEnv does the right thing
TEST(FromEnvTest,LegalValues)676*08ab5237SOystein Eftevaag TEST(FromEnvTest, LegalValues) {
677*08ab5237SOystein Eftevaag   setenv("BOOL_VAL1", "true", 1);
678*08ab5237SOystein Eftevaag   setenv("BOOL_VAL2", "false", 1);
679*08ab5237SOystein Eftevaag   setenv("BOOL_VAL3", "1", 1);
680*08ab5237SOystein Eftevaag   setenv("BOOL_VAL4", "F", 1);
681*08ab5237SOystein Eftevaag   EXPECT_TRUE(BoolFromEnv("BOOL_VAL1", false));
682*08ab5237SOystein Eftevaag   EXPECT_FALSE(BoolFromEnv("BOOL_VAL2", true));
683*08ab5237SOystein Eftevaag   EXPECT_TRUE(BoolFromEnv("BOOL_VAL3", false));
684*08ab5237SOystein Eftevaag   EXPECT_FALSE(BoolFromEnv("BOOL_VAL4", true));
685*08ab5237SOystein Eftevaag   EXPECT_TRUE(BoolFromEnv("BOOL_VAL_UNKNOWN", true));
686*08ab5237SOystein Eftevaag   EXPECT_FALSE(BoolFromEnv("BOOL_VAL_UNKNOWN", false));
687*08ab5237SOystein Eftevaag 
688*08ab5237SOystein Eftevaag   setenv("INT_VAL1", "1", 1);
689*08ab5237SOystein Eftevaag   setenv("INT_VAL2", "-1", 1);
690*08ab5237SOystein Eftevaag   EXPECT_EQ(1, Int32FromEnv("INT_VAL1", 10));
691*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, Int32FromEnv("INT_VAL2", 10));
692*08ab5237SOystein Eftevaag   EXPECT_EQ(10, Int32FromEnv("INT_VAL_UNKNOWN", 10));
693*08ab5237SOystein Eftevaag 
694*08ab5237SOystein Eftevaag   setenv("INT_VAL3", "4294967295", 1);
695*08ab5237SOystein Eftevaag   EXPECT_EQ(1, Uint32FromEnv("INT_VAL1", 10));
696*08ab5237SOystein Eftevaag   EXPECT_EQ(4294967295L, Uint32FromEnv("INT_VAL3", 30));
697*08ab5237SOystein Eftevaag   EXPECT_EQ(10, Uint32FromEnv("INT_VAL_UNKNOWN", 10));
698*08ab5237SOystein Eftevaag 
699*08ab5237SOystein Eftevaag   setenv("INT_VAL4", "1099511627776", 1);
700*08ab5237SOystein Eftevaag   EXPECT_EQ(1, Int64FromEnv("INT_VAL1", 20));
701*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, Int64FromEnv("INT_VAL2", 20));
702*08ab5237SOystein Eftevaag   EXPECT_EQ(1099511627776LL, Int64FromEnv("INT_VAL4", 20));
703*08ab5237SOystein Eftevaag   EXPECT_EQ(20, Int64FromEnv("INT_VAL_UNKNOWN", 20));
704*08ab5237SOystein Eftevaag 
705*08ab5237SOystein Eftevaag   EXPECT_EQ(1, Uint64FromEnv("INT_VAL1", 30));
706*08ab5237SOystein Eftevaag   EXPECT_EQ(1099511627776ULL, Uint64FromEnv("INT_VAL4", 30));
707*08ab5237SOystein Eftevaag   EXPECT_EQ(30, Uint64FromEnv("INT_VAL_UNKNOWN", 30));
708*08ab5237SOystein Eftevaag 
709*08ab5237SOystein Eftevaag   // I pick values here that can be easily represented exactly in floating-point
710*08ab5237SOystein Eftevaag   setenv("DOUBLE_VAL1", "0.0", 1);
711*08ab5237SOystein Eftevaag   setenv("DOUBLE_VAL2", "1.0", 1);
712*08ab5237SOystein Eftevaag   setenv("DOUBLE_VAL3", "-1.0", 1);
713*08ab5237SOystein Eftevaag   EXPECT_EQ(0.0, DoubleFromEnv("DOUBLE_VAL1", 40.0));
714*08ab5237SOystein Eftevaag   EXPECT_EQ(1.0, DoubleFromEnv("DOUBLE_VAL2", 40.0));
715*08ab5237SOystein Eftevaag   EXPECT_EQ(-1.0, DoubleFromEnv("DOUBLE_VAL3", 40.0));
716*08ab5237SOystein Eftevaag   EXPECT_EQ(40.0, DoubleFromEnv("DOUBLE_VAL_UNKNOWN", 40.0));
717*08ab5237SOystein Eftevaag 
718*08ab5237SOystein Eftevaag   setenv("STRING_VAL1", "", 1);
719*08ab5237SOystein Eftevaag   setenv("STRING_VAL2", "my happy string!", 1);
720*08ab5237SOystein Eftevaag   EXPECT_STREQ("", StringFromEnv("STRING_VAL1", "unknown"));
721*08ab5237SOystein Eftevaag   EXPECT_STREQ("my happy string!", StringFromEnv("STRING_VAL2", "unknown"));
722*08ab5237SOystein Eftevaag   EXPECT_STREQ("unknown", StringFromEnv("STRING_VAL_UNKNOWN", "unknown"));
723*08ab5237SOystein Eftevaag }
724*08ab5237SOystein Eftevaag 
725*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
726*08ab5237SOystein Eftevaag // Tests that the FooFromEnv dies on parse-error
TEST(FromEnvDeathTest,IllegalValues)727*08ab5237SOystein Eftevaag TEST(FromEnvDeathTest, IllegalValues) {
728*08ab5237SOystein Eftevaag   setenv("BOOL_BAD1", "so true!", 1);
729*08ab5237SOystein Eftevaag   setenv("BOOL_BAD2", "", 1);
730*08ab5237SOystein Eftevaag   EXPECT_DEATH(BoolFromEnv("BOOL_BAD1", false), "error parsing env variable");
731*08ab5237SOystein Eftevaag   EXPECT_DEATH(BoolFromEnv("BOOL_BAD2", true), "error parsing env variable");
732*08ab5237SOystein Eftevaag 
733*08ab5237SOystein Eftevaag   setenv("INT_BAD1", "one", 1);
734*08ab5237SOystein Eftevaag   setenv("INT_BAD2", "100000000000000000", 1);
735*08ab5237SOystein Eftevaag   setenv("INT_BAD3", "0xx10", 1);
736*08ab5237SOystein Eftevaag   setenv("INT_BAD4", "", 1);
737*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int32FromEnv("INT_BAD1", 10), "error parsing env variable");
738*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int32FromEnv("INT_BAD2", 10), "error parsing env variable");
739*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int32FromEnv("INT_BAD3", 10), "error parsing env variable");
740*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int32FromEnv("INT_BAD4", 10), "error parsing env variable");
741*08ab5237SOystein Eftevaag 
742*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint32FromEnv("INT_BAD1", 10), "error parsing env variable");
743*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint32FromEnv("INT_BAD2", 10), "error parsing env variable");
744*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint32FromEnv("INT_BAD3", 10), "error parsing env variable");
745*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint32FromEnv("INT_BAD4", 10), "error parsing env variable");
746*08ab5237SOystein Eftevaag 
747*08ab5237SOystein Eftevaag   setenv("BIGINT_BAD1", "18446744073709551616000", 1);
748*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int64FromEnv("INT_BAD1", 20), "error parsing env variable");
749*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int64FromEnv("INT_BAD3", 20), "error parsing env variable");
750*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int64FromEnv("INT_BAD4", 20), "error parsing env variable");
751*08ab5237SOystein Eftevaag   EXPECT_DEATH(Int64FromEnv("BIGINT_BAD1", 200), "error parsing env variable");
752*08ab5237SOystein Eftevaag 
753*08ab5237SOystein Eftevaag   setenv("BIGINT_BAD2", "-1", 1);
754*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint64FromEnv("INT_BAD1", 30), "error parsing env variable");
755*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint64FromEnv("INT_BAD3", 30), "error parsing env variable");
756*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint64FromEnv("INT_BAD4", 30), "error parsing env variable");
757*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint64FromEnv("BIGINT_BAD1", 30), "error parsing env variable");
758*08ab5237SOystein Eftevaag   // TODO(csilvers): uncomment this when we disallow negative numbers for uint64
759*08ab5237SOystein Eftevaag #if 0
760*08ab5237SOystein Eftevaag   EXPECT_DEATH(Uint64FromEnv("BIGINT_BAD2", 30), "error parsing env variable");
761*08ab5237SOystein Eftevaag #endif
762*08ab5237SOystein Eftevaag 
763*08ab5237SOystein Eftevaag   setenv("DOUBLE_BAD1", "0.0.0", 1);
764*08ab5237SOystein Eftevaag   setenv("DOUBLE_BAD2", "", 1);
765*08ab5237SOystein Eftevaag   EXPECT_DEATH(DoubleFromEnv("DOUBLE_BAD1", 40.0), "error parsing env variable");
766*08ab5237SOystein Eftevaag   EXPECT_DEATH(DoubleFromEnv("DOUBLE_BAD2", 40.0), "error parsing env variable");
767*08ab5237SOystein Eftevaag }
768*08ab5237SOystein Eftevaag #endif
769*08ab5237SOystein Eftevaag 
770*08ab5237SOystein Eftevaag 
771*08ab5237SOystein Eftevaag // Tests that FlagSaver can save the states of string flags.
TEST(FlagSaverTest,CanSaveStringFlagStates)772*08ab5237SOystein Eftevaag TEST(FlagSaverTest, CanSaveStringFlagStates) {
773*08ab5237SOystein Eftevaag   // 1. Initializes the flags.
774*08ab5237SOystein Eftevaag 
775*08ab5237SOystein Eftevaag   // State of flag test_str1:
776*08ab5237SOystein Eftevaag   //   default value - "initial"
777*08ab5237SOystein Eftevaag   //   current value - "initial"
778*08ab5237SOystein Eftevaag   //   not set       - true
779*08ab5237SOystein Eftevaag 
780*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str2", "second", SET_FLAGS_VALUE);
781*08ab5237SOystein Eftevaag   // State of flag test_str2:
782*08ab5237SOystein Eftevaag   //   default value - "initial"
783*08ab5237SOystein Eftevaag   //   current value - "second"
784*08ab5237SOystein Eftevaag   //   not set       - false
785*08ab5237SOystein Eftevaag 
786*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "second", SET_FLAGS_DEFAULT);
787*08ab5237SOystein Eftevaag   // State of flag test_str3:
788*08ab5237SOystein Eftevaag   //   default value - "second"
789*08ab5237SOystein Eftevaag   //   current value - "second"
790*08ab5237SOystein Eftevaag   //   not set       - true
791*08ab5237SOystein Eftevaag 
792*08ab5237SOystein Eftevaag   // 2. Saves the flag states.
793*08ab5237SOystein Eftevaag 
794*08ab5237SOystein Eftevaag   {
795*08ab5237SOystein Eftevaag     FlagSaver fs;
796*08ab5237SOystein Eftevaag 
797*08ab5237SOystein Eftevaag     // 3. Modifies the flag states.
798*08ab5237SOystein Eftevaag 
799*08ab5237SOystein Eftevaag     SetCommandLineOptionWithMode("test_str1", "second", SET_FLAGS_VALUE);
800*08ab5237SOystein Eftevaag     EXPECT_EQ("second", FLAGS_test_str1);
801*08ab5237SOystein Eftevaag     // State of flag test_str1:
802*08ab5237SOystein Eftevaag     //   default value - "second"
803*08ab5237SOystein Eftevaag     //   current value - "second"
804*08ab5237SOystein Eftevaag     //   not set       - true
805*08ab5237SOystein Eftevaag 
806*08ab5237SOystein Eftevaag     SetCommandLineOptionWithMode("test_str2", "third", SET_FLAGS_DEFAULT);
807*08ab5237SOystein Eftevaag     EXPECT_EQ("second", FLAGS_test_str2);
808*08ab5237SOystein Eftevaag     // State of flag test_str2:
809*08ab5237SOystein Eftevaag     //   default value - "third"
810*08ab5237SOystein Eftevaag     //   current value - "second"
811*08ab5237SOystein Eftevaag     //   not set       - false
812*08ab5237SOystein Eftevaag 
813*08ab5237SOystein Eftevaag     SetCommandLineOptionWithMode("test_str3", "third", SET_FLAGS_VALUE);
814*08ab5237SOystein Eftevaag     EXPECT_EQ("third", FLAGS_test_str3);
815*08ab5237SOystein Eftevaag     // State of flag test_str1:
816*08ab5237SOystein Eftevaag     //   default value - "second"
817*08ab5237SOystein Eftevaag     //   current value - "third"
818*08ab5237SOystein Eftevaag     //   not set       - false
819*08ab5237SOystein Eftevaag 
820*08ab5237SOystein Eftevaag     // 4. Restores the flag states.
821*08ab5237SOystein Eftevaag   }
822*08ab5237SOystein Eftevaag 
823*08ab5237SOystein Eftevaag   // 5. Verifies that the states were restored.
824*08ab5237SOystein Eftevaag 
825*08ab5237SOystein Eftevaag   // Verifies that the value of test_str1 was restored.
826*08ab5237SOystein Eftevaag   EXPECT_EQ("initial", FLAGS_test_str1);
827*08ab5237SOystein Eftevaag   // Verifies that the "not set" attribute of test_str1 was restored to true.
828*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str1", "second", SET_FLAG_IF_DEFAULT);
829*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str1);
830*08ab5237SOystein Eftevaag 
831*08ab5237SOystein Eftevaag   // Verifies that the value of test_str2 was restored.
832*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str2);
833*08ab5237SOystein Eftevaag   // Verifies that the "not set" attribute of test_str2 was restored to false.
834*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str2", "fourth", SET_FLAG_IF_DEFAULT);
835*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str2);
836*08ab5237SOystein Eftevaag 
837*08ab5237SOystein Eftevaag   // Verifies that the value of test_str3 was restored.
838*08ab5237SOystein Eftevaag   EXPECT_EQ("second", FLAGS_test_str3);
839*08ab5237SOystein Eftevaag   // Verifies that the "not set" attribute of test_str3 was restored to true.
840*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_str3", "fourth", SET_FLAG_IF_DEFAULT);
841*08ab5237SOystein Eftevaag   EXPECT_EQ("fourth", FLAGS_test_str3);
842*08ab5237SOystein Eftevaag }
843*08ab5237SOystein Eftevaag 
844*08ab5237SOystein Eftevaag 
845*08ab5237SOystein Eftevaag // Tests that FlagSaver can save the values of various-typed flags.
TEST(FlagSaverTest,CanSaveVariousTypedFlagValues)846*08ab5237SOystein Eftevaag TEST(FlagSaverTest, CanSaveVariousTypedFlagValues) {
847*08ab5237SOystein Eftevaag   // Initializes the flags.
848*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
849*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -1;
850*08ab5237SOystein Eftevaag   FLAGS_test_uint32 = 2;
851*08ab5237SOystein Eftevaag   FLAGS_test_int64 = -3;
852*08ab5237SOystein Eftevaag   FLAGS_test_uint64 = 4;
853*08ab5237SOystein Eftevaag   FLAGS_test_double = 5.0;
854*08ab5237SOystein Eftevaag   FLAGS_test_string = "good";
855*08ab5237SOystein Eftevaag 
856*08ab5237SOystein Eftevaag   // Saves the flag states.
857*08ab5237SOystein Eftevaag   {
858*08ab5237SOystein Eftevaag     FlagSaver fs;
859*08ab5237SOystein Eftevaag 
860*08ab5237SOystein Eftevaag     // Modifies the flags.
861*08ab5237SOystein Eftevaag     FLAGS_test_bool = true;
862*08ab5237SOystein Eftevaag     FLAGS_test_int32 = -5;
863*08ab5237SOystein Eftevaag     FLAGS_test_uint32 = 6;
864*08ab5237SOystein Eftevaag     FLAGS_test_int64 = -7;
865*08ab5237SOystein Eftevaag     FLAGS_test_uint64 = 8;
866*08ab5237SOystein Eftevaag     FLAGS_test_double = 8.0;
867*08ab5237SOystein Eftevaag     FLAGS_test_string = "bad";
868*08ab5237SOystein Eftevaag 
869*08ab5237SOystein Eftevaag     // Restores the flag states.
870*08ab5237SOystein Eftevaag   }
871*08ab5237SOystein Eftevaag 
872*08ab5237SOystein Eftevaag   // Verifies the flag values were restored.
873*08ab5237SOystein Eftevaag   EXPECT_FALSE(FLAGS_test_bool);
874*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, FLAGS_test_int32);
875*08ab5237SOystein Eftevaag   EXPECT_EQ(2, FLAGS_test_uint32);
876*08ab5237SOystein Eftevaag   EXPECT_EQ(-3, FLAGS_test_int64);
877*08ab5237SOystein Eftevaag   EXPECT_EQ(4, FLAGS_test_uint64);
878*08ab5237SOystein Eftevaag   EXPECT_DOUBLE_EQ(5.0, FLAGS_test_double);
879*08ab5237SOystein Eftevaag   EXPECT_EQ("good", FLAGS_test_string);
880*08ab5237SOystein Eftevaag }
881*08ab5237SOystein Eftevaag 
TEST(GetAllFlagsTest,BaseTest)882*08ab5237SOystein Eftevaag TEST(GetAllFlagsTest, BaseTest) {
883*08ab5237SOystein Eftevaag   vector<CommandLineFlagInfo> flags;
884*08ab5237SOystein Eftevaag   GetAllFlags(&flags);
885*08ab5237SOystein Eftevaag   bool found_test_bool = false;
886*08ab5237SOystein Eftevaag   vector<CommandLineFlagInfo>::const_iterator i;
887*08ab5237SOystein Eftevaag   for (i = flags.begin(); i != flags.end(); ++i) {
888*08ab5237SOystein Eftevaag     if (i->name == "test_bool") {
889*08ab5237SOystein Eftevaag       found_test_bool = true;
890*08ab5237SOystein Eftevaag       EXPECT_EQ(i->type, "bool");
891*08ab5237SOystein Eftevaag       EXPECT_EQ(i->default_value, "false");
892*08ab5237SOystein Eftevaag       EXPECT_EQ(i->flag_ptr, &FLAGS_test_bool);
893*08ab5237SOystein Eftevaag       break;
894*08ab5237SOystein Eftevaag     }
895*08ab5237SOystein Eftevaag   }
896*08ab5237SOystein Eftevaag   EXPECT_TRUE(found_test_bool);
897*08ab5237SOystein Eftevaag }
898*08ab5237SOystein Eftevaag 
TEST(ShowUsageWithFlagsTest,BaseTest)899*08ab5237SOystein Eftevaag TEST(ShowUsageWithFlagsTest, BaseTest) {
900*08ab5237SOystein Eftevaag   // TODO(csilvers): test this by allowing output other than to stdout.
901*08ab5237SOystein Eftevaag   // Not urgent since this functionality is tested via
902*08ab5237SOystein Eftevaag   // gflags_unittest.sh, though only through use of --help.
903*08ab5237SOystein Eftevaag }
904*08ab5237SOystein Eftevaag 
TEST(ShowUsageWithFlagsRestrictTest,BaseTest)905*08ab5237SOystein Eftevaag TEST(ShowUsageWithFlagsRestrictTest, BaseTest) {
906*08ab5237SOystein Eftevaag   // TODO(csilvers): test this by allowing output other than to stdout.
907*08ab5237SOystein Eftevaag   // Not urgent since this functionality is tested via
908*08ab5237SOystein Eftevaag   // gflags_unittest.sh, though only through use of --helpmatch.
909*08ab5237SOystein Eftevaag }
910*08ab5237SOystein Eftevaag 
911*08ab5237SOystein Eftevaag // Note: all these argv-based tests depend on SetArgv being called
912*08ab5237SOystein Eftevaag // before ParseCommandLineFlags() in main(), below.
TEST(GetArgvsTest,BaseTest)913*08ab5237SOystein Eftevaag TEST(GetArgvsTest, BaseTest) {
914*08ab5237SOystein Eftevaag   vector<string> argvs = GetArgvs();
915*08ab5237SOystein Eftevaag   EXPECT_EQ(4, argvs.size());
916*08ab5237SOystein Eftevaag   EXPECT_EQ("/test/argv/for/gflags_unittest", argvs[0]);
917*08ab5237SOystein Eftevaag   EXPECT_EQ("argv 2", argvs[1]);
918*08ab5237SOystein Eftevaag   EXPECT_EQ("3rd argv", argvs[2]);
919*08ab5237SOystein Eftevaag   EXPECT_EQ("argv #4", argvs[3]);
920*08ab5237SOystein Eftevaag }
921*08ab5237SOystein Eftevaag 
TEST(GetArgvTest,BaseTest)922*08ab5237SOystein Eftevaag TEST(GetArgvTest, BaseTest) {
923*08ab5237SOystein Eftevaag   EXPECT_STREQ("/test/argv/for/gflags_unittest "
924*08ab5237SOystein Eftevaag                "argv 2 3rd argv argv #4", GetArgv());
925*08ab5237SOystein Eftevaag }
926*08ab5237SOystein Eftevaag 
TEST(GetArgv0Test,BaseTest)927*08ab5237SOystein Eftevaag TEST(GetArgv0Test, BaseTest) {
928*08ab5237SOystein Eftevaag   EXPECT_STREQ("/test/argv/for/gflags_unittest", GetArgv0());
929*08ab5237SOystein Eftevaag }
930*08ab5237SOystein Eftevaag 
TEST(GetArgvSumTest,BaseTest)931*08ab5237SOystein Eftevaag TEST(GetArgvSumTest, BaseTest) {
932*08ab5237SOystein Eftevaag   // This number is just the sum of the ASCII values of all the chars
933*08ab5237SOystein Eftevaag   // in GetArgv().
934*08ab5237SOystein Eftevaag   EXPECT_EQ(4904, GetArgvSum());
935*08ab5237SOystein Eftevaag }
936*08ab5237SOystein Eftevaag 
TEST(ProgramInvocationNameTest,BaseTest)937*08ab5237SOystein Eftevaag TEST(ProgramInvocationNameTest, BaseTest) {
938*08ab5237SOystein Eftevaag   EXPECT_STREQ("/test/argv/for/gflags_unittest",
939*08ab5237SOystein Eftevaag                ProgramInvocationName());
940*08ab5237SOystein Eftevaag }
941*08ab5237SOystein Eftevaag 
TEST(ProgramInvocationShortNameTest,BaseTest)942*08ab5237SOystein Eftevaag TEST(ProgramInvocationShortNameTest, BaseTest) {
943*08ab5237SOystein Eftevaag   EXPECT_STREQ("gflags_unittest", ProgramInvocationShortName());
944*08ab5237SOystein Eftevaag }
945*08ab5237SOystein Eftevaag 
TEST(ProgramUsageTest,BaseTest)946*08ab5237SOystein Eftevaag TEST(ProgramUsageTest, BaseTest) {  // Depends on 1st arg to ParseCommandLineFlags()
947*08ab5237SOystein Eftevaag   EXPECT_STREQ("/test/argv/for/gflags_unittest: "
948*08ab5237SOystein Eftevaag                "<useless flag> [...]\nDoes something useless.\n",
949*08ab5237SOystein Eftevaag                ProgramUsage());
950*08ab5237SOystein Eftevaag }
951*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameExistsAndIsDefault)952*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameExistsAndIsDefault) {
953*08ab5237SOystein Eftevaag   string value("will be changed");
954*08ab5237SOystein Eftevaag   bool r = GetCommandLineOption("test_bool", &value);
955*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
956*08ab5237SOystein Eftevaag   EXPECT_EQ("false", value);
957*08ab5237SOystein Eftevaag 
958*08ab5237SOystein Eftevaag   r = GetCommandLineOption("test_int32", &value);
959*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
960*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", value);
961*08ab5237SOystein Eftevaag }
962*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameExistsAndWasAssigned)963*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameExistsAndWasAssigned) {
964*08ab5237SOystein Eftevaag   FLAGS_test_int32 = 400;
965*08ab5237SOystein Eftevaag   string value("will be changed");
966*08ab5237SOystein Eftevaag   const bool r = GetCommandLineOption("test_int32", &value);
967*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
968*08ab5237SOystein Eftevaag   EXPECT_EQ("400", value);
969*08ab5237SOystein Eftevaag }
970*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameExistsAndWasSet)971*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameExistsAndWasSet) {
972*08ab5237SOystein Eftevaag   SetCommandLineOption("test_int32", "700");
973*08ab5237SOystein Eftevaag   string value("will be changed");
974*08ab5237SOystein Eftevaag   const bool r = GetCommandLineOption("test_int32", &value);
975*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
976*08ab5237SOystein Eftevaag   EXPECT_EQ("700", value);
977*08ab5237SOystein Eftevaag }
978*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameExistsAndWasNotSet)979*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameExistsAndWasNotSet) {
980*08ab5237SOystein Eftevaag   // This doesn't set the flag's value, but rather its default value.
981*08ab5237SOystein Eftevaag   // is_default is still true, but the 'default' value returned has changed!
982*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_int32", "800", SET_FLAGS_DEFAULT);
983*08ab5237SOystein Eftevaag   string value("will be changed");
984*08ab5237SOystein Eftevaag   const bool r = GetCommandLineOption("test_int32", &value);
985*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
986*08ab5237SOystein Eftevaag   EXPECT_EQ("800", value);
987*08ab5237SOystein Eftevaag   EXPECT_TRUE(GetCommandLineFlagInfoOrDie("test_int32").is_default);
988*08ab5237SOystein Eftevaag }
989*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameExistsAndWasConditionallySet)990*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameExistsAndWasConditionallySet) {
991*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("test_int32", "900", SET_FLAG_IF_DEFAULT);
992*08ab5237SOystein Eftevaag   string value("will be changed");
993*08ab5237SOystein Eftevaag   const bool r = GetCommandLineOption("test_int32", &value);
994*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
995*08ab5237SOystein Eftevaag   EXPECT_EQ("900", value);
996*08ab5237SOystein Eftevaag }
997*08ab5237SOystein Eftevaag 
TEST(GetCommandLineOptionTest,NameDoesNotExist)998*08ab5237SOystein Eftevaag TEST(GetCommandLineOptionTest, NameDoesNotExist) {
999*08ab5237SOystein Eftevaag   string value("will not be changed");
1000*08ab5237SOystein Eftevaag   const bool r = GetCommandLineOption("test_int3210", &value);
1001*08ab5237SOystein Eftevaag   EXPECT_FALSE(r);
1002*08ab5237SOystein Eftevaag   EXPECT_EQ("will not be changed", value);
1003*08ab5237SOystein Eftevaag }
1004*08ab5237SOystein Eftevaag 
TEST(GetCommandLineFlagInfoTest,FlagExists)1005*08ab5237SOystein Eftevaag TEST(GetCommandLineFlagInfoTest, FlagExists) {
1006*08ab5237SOystein Eftevaag   CommandLineFlagInfo info;
1007*08ab5237SOystein Eftevaag   bool r = GetCommandLineFlagInfo("test_int32", &info);
1008*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1009*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32", info.name);
1010*08ab5237SOystein Eftevaag   EXPECT_EQ("int32", info.type);
1011*08ab5237SOystein Eftevaag   EXPECT_EQ("", info.description);
1012*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", info.current_value);
1013*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", info.default_value);
1014*08ab5237SOystein Eftevaag   EXPECT_TRUE(info.is_default);
1015*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1016*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_int32, info.flag_ptr);
1017*08ab5237SOystein Eftevaag 
1018*08ab5237SOystein Eftevaag   FLAGS_test_bool = true;
1019*08ab5237SOystein Eftevaag   r = GetCommandLineFlagInfo("test_bool", &info);
1020*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1021*08ab5237SOystein Eftevaag   EXPECT_EQ("test_bool", info.name);
1022*08ab5237SOystein Eftevaag   EXPECT_EQ("bool", info.type);
1023*08ab5237SOystein Eftevaag   EXPECT_EQ("tests bool-ness", info.description);
1024*08ab5237SOystein Eftevaag   EXPECT_EQ("true", info.current_value);
1025*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.default_value);
1026*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.is_default);
1027*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1028*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_bool, info.flag_ptr);
1029*08ab5237SOystein Eftevaag 
1030*08ab5237SOystein Eftevaag   FLAGS_test_bool = false;
1031*08ab5237SOystein Eftevaag   r = GetCommandLineFlagInfo("test_bool", &info);
1032*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1033*08ab5237SOystein Eftevaag   EXPECT_EQ("test_bool", info.name);
1034*08ab5237SOystein Eftevaag   EXPECT_EQ("bool", info.type);
1035*08ab5237SOystein Eftevaag   EXPECT_EQ("tests bool-ness", info.description);
1036*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.current_value);
1037*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.default_value);
1038*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.is_default);  // value is same, but flag *was* modified
1039*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1040*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_bool, info.flag_ptr);
1041*08ab5237SOystein Eftevaag }
1042*08ab5237SOystein Eftevaag 
TEST(GetCommandLineFlagInfoTest,FlagDoesNotExist)1043*08ab5237SOystein Eftevaag TEST(GetCommandLineFlagInfoTest, FlagDoesNotExist) {
1044*08ab5237SOystein Eftevaag   CommandLineFlagInfo info;
1045*08ab5237SOystein Eftevaag   // Set to some random values that GetCommandLineFlagInfo should not change
1046*08ab5237SOystein Eftevaag   info.name = "name";
1047*08ab5237SOystein Eftevaag   info.type = "type";
1048*08ab5237SOystein Eftevaag   info.current_value = "curr";
1049*08ab5237SOystein Eftevaag   info.default_value = "def";
1050*08ab5237SOystein Eftevaag   info.filename = "/";
1051*08ab5237SOystein Eftevaag   info.is_default = false;
1052*08ab5237SOystein Eftevaag   info.has_validator_fn = true;
1053*08ab5237SOystein Eftevaag   info.flag_ptr = NULL;
1054*08ab5237SOystein Eftevaag   bool r = GetCommandLineFlagInfo("test_int3210", &info);
1055*08ab5237SOystein Eftevaag   EXPECT_FALSE(r);
1056*08ab5237SOystein Eftevaag   EXPECT_EQ("name", info.name);
1057*08ab5237SOystein Eftevaag   EXPECT_EQ("type", info.type);
1058*08ab5237SOystein Eftevaag   EXPECT_EQ("", info.description);
1059*08ab5237SOystein Eftevaag   EXPECT_EQ("curr", info.current_value);
1060*08ab5237SOystein Eftevaag   EXPECT_EQ("def", info.default_value);
1061*08ab5237SOystein Eftevaag   EXPECT_EQ("/", info.filename);
1062*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.is_default);
1063*08ab5237SOystein Eftevaag   EXPECT_TRUE(info.has_validator_fn);
1064*08ab5237SOystein Eftevaag   EXPECT_EQ(NULL, info.flag_ptr);
1065*08ab5237SOystein Eftevaag }
1066*08ab5237SOystein Eftevaag 
TEST(GetCommandLineFlagInfoOrDieTest,FlagExistsAndIsDefault)1067*08ab5237SOystein Eftevaag TEST(GetCommandLineFlagInfoOrDieTest, FlagExistsAndIsDefault) {
1068*08ab5237SOystein Eftevaag   CommandLineFlagInfo info;
1069*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_int32");
1070*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32", info.name);
1071*08ab5237SOystein Eftevaag   EXPECT_EQ("int32", info.type);
1072*08ab5237SOystein Eftevaag   EXPECT_EQ("", info.description);
1073*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", info.current_value);
1074*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", info.default_value);
1075*08ab5237SOystein Eftevaag   EXPECT_TRUE(info.is_default);
1076*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_int32, info.flag_ptr);
1077*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_bool");
1078*08ab5237SOystein Eftevaag   EXPECT_EQ("test_bool", info.name);
1079*08ab5237SOystein Eftevaag   EXPECT_EQ("bool", info.type);
1080*08ab5237SOystein Eftevaag   EXPECT_EQ("tests bool-ness", info.description);
1081*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.current_value);
1082*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.default_value);
1083*08ab5237SOystein Eftevaag   EXPECT_TRUE(info.is_default);
1084*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1085*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_bool, info.flag_ptr);
1086*08ab5237SOystein Eftevaag }
1087*08ab5237SOystein Eftevaag 
TEST(GetCommandLineFlagInfoOrDieTest,FlagExistsAndWasAssigned)1088*08ab5237SOystein Eftevaag TEST(GetCommandLineFlagInfoOrDieTest, FlagExistsAndWasAssigned) {
1089*08ab5237SOystein Eftevaag   FLAGS_test_int32 = 400;
1090*08ab5237SOystein Eftevaag   CommandLineFlagInfo info;
1091*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_int32");
1092*08ab5237SOystein Eftevaag   EXPECT_EQ("test_int32", info.name);
1093*08ab5237SOystein Eftevaag   EXPECT_EQ("int32", info.type);
1094*08ab5237SOystein Eftevaag   EXPECT_EQ("", info.description);
1095*08ab5237SOystein Eftevaag   EXPECT_EQ("400", info.current_value);
1096*08ab5237SOystein Eftevaag   EXPECT_EQ("-1", info.default_value);
1097*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.is_default);
1098*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_int32, info.flag_ptr);
1099*08ab5237SOystein Eftevaag   FLAGS_test_bool = true;
1100*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_bool");
1101*08ab5237SOystein Eftevaag   EXPECT_EQ("test_bool", info.name);
1102*08ab5237SOystein Eftevaag   EXPECT_EQ("bool", info.type);
1103*08ab5237SOystein Eftevaag   EXPECT_EQ("tests bool-ness", info.description);
1104*08ab5237SOystein Eftevaag   EXPECT_EQ("true", info.current_value);
1105*08ab5237SOystein Eftevaag   EXPECT_EQ("false", info.default_value);
1106*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.is_default);
1107*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1108*08ab5237SOystein Eftevaag   EXPECT_EQ(&FLAGS_test_bool, info.flag_ptr);
1109*08ab5237SOystein Eftevaag }
1110*08ab5237SOystein Eftevaag 
1111*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
TEST(GetCommandLineFlagInfoOrDieDeathTest,FlagDoesNotExist)1112*08ab5237SOystein Eftevaag TEST(GetCommandLineFlagInfoOrDieDeathTest, FlagDoesNotExist) {
1113*08ab5237SOystein Eftevaag   EXPECT_DEATH(GetCommandLineFlagInfoOrDie("test_int3210"),
1114*08ab5237SOystein Eftevaag                ".*: flag test_int3210 does not exist");
1115*08ab5237SOystein Eftevaag }
1116*08ab5237SOystein Eftevaag #endif
1117*08ab5237SOystein Eftevaag 
1118*08ab5237SOystein Eftevaag 
1119*08ab5237SOystein Eftevaag // These are lightly tested because they're deprecated.  Basically,
1120*08ab5237SOystein Eftevaag // the tests are meant to cover how existing users use these functions,
1121*08ab5237SOystein Eftevaag // but not necessarily how new users could use them.
TEST(DeprecatedFunctionsTest,CommandlineFlagsIntoString)1122*08ab5237SOystein Eftevaag TEST(DeprecatedFunctionsTest, CommandlineFlagsIntoString) {
1123*08ab5237SOystein Eftevaag   string s = CommandlineFlagsIntoString();
1124*08ab5237SOystein Eftevaag   EXPECT_NE(string::npos, s.find("--test_bool="));
1125*08ab5237SOystein Eftevaag }
1126*08ab5237SOystein Eftevaag 
TEST(DeprecatedFunctionsTest,AppendFlagsIntoFile)1127*08ab5237SOystein Eftevaag TEST(DeprecatedFunctionsTest, AppendFlagsIntoFile) {
1128*08ab5237SOystein Eftevaag   FLAGS_test_int32 = 10;     // just to make the test more interesting
1129*08ab5237SOystein Eftevaag   string filename(TmpFile("flagfile"));
1130*08ab5237SOystein Eftevaag   unlink(filename.c_str());  // just to be safe
1131*08ab5237SOystein Eftevaag   const bool r = AppendFlagsIntoFile(filename, "not the real argv0");
1132*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1133*08ab5237SOystein Eftevaag 
1134*08ab5237SOystein Eftevaag   FILE* fp;
1135*08ab5237SOystein Eftevaag   EXPECT_EQ(0, SafeFOpen(&fp, filename.c_str(), "r"));
1136*08ab5237SOystein Eftevaag   EXPECT_TRUE(fp != NULL);
1137*08ab5237SOystein Eftevaag   char line[8192];
1138*08ab5237SOystein Eftevaag   EXPECT_TRUE(fgets(line, sizeof(line)-1, fp) != NULL);  // get the first line
1139*08ab5237SOystein Eftevaag   // First line should be progname.
1140*08ab5237SOystein Eftevaag   EXPECT_STREQ("not the real argv0\n", line);
1141*08ab5237SOystein Eftevaag 
1142*08ab5237SOystein Eftevaag   bool found_bool = false, found_int32 = false;
1143*08ab5237SOystein Eftevaag   while (fgets(line, sizeof(line)-1, fp)) {
1144*08ab5237SOystein Eftevaag     line[sizeof(line)-1] = '\0';    // just to be safe
1145*08ab5237SOystein Eftevaag     if (strcmp(line, "--test_bool=false\n") == 0)
1146*08ab5237SOystein Eftevaag       found_bool = true;
1147*08ab5237SOystein Eftevaag     if (strcmp(line, "--test_int32=10\n") == 0)
1148*08ab5237SOystein Eftevaag       found_int32 = true;
1149*08ab5237SOystein Eftevaag   }
1150*08ab5237SOystein Eftevaag   EXPECT_TRUE(found_int32);
1151*08ab5237SOystein Eftevaag   EXPECT_TRUE(found_bool);
1152*08ab5237SOystein Eftevaag   fclose(fp);
1153*08ab5237SOystein Eftevaag }
1154*08ab5237SOystein Eftevaag 
TEST(DeprecatedFunctionsTest,ReadFromFlagsFile)1155*08ab5237SOystein Eftevaag TEST(DeprecatedFunctionsTest, ReadFromFlagsFile) {
1156*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -10;    // just to make the test more interesting
1157*08ab5237SOystein Eftevaag   string filename(TmpFile("flagfile2"));
1158*08ab5237SOystein Eftevaag   unlink(filename.c_str());  // just to be safe
1159*08ab5237SOystein Eftevaag   bool r = AppendFlagsIntoFile(filename, GetArgv0());
1160*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1161*08ab5237SOystein Eftevaag 
1162*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -11;
1163*08ab5237SOystein Eftevaag   r = ReadFromFlagsFile(filename, GetArgv0(), true);
1164*08ab5237SOystein Eftevaag   EXPECT_TRUE(r);
1165*08ab5237SOystein Eftevaag   EXPECT_EQ(-10, FLAGS_test_int32);
1166*08ab5237SOystein Eftevaag }  // unnamed namespace
1167*08ab5237SOystein Eftevaag 
TEST(DeprecatedFunctionsTest,ReadFromFlagsFileFailure)1168*08ab5237SOystein Eftevaag TEST(DeprecatedFunctionsTest, ReadFromFlagsFileFailure) {
1169*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -20;
1170*08ab5237SOystein Eftevaag   string filename(TmpFile("flagfile3"));
1171*08ab5237SOystein Eftevaag   FILE* fp;
1172*08ab5237SOystein Eftevaag   EXPECT_EQ(0, SafeFOpen(&fp, filename.c_str(), "w"));
1173*08ab5237SOystein Eftevaag   EXPECT_TRUE(fp != NULL);
1174*08ab5237SOystein Eftevaag   // Note the error in the bool assignment below...
1175*08ab5237SOystein Eftevaag   fprintf(fp, "%s\n--test_int32=-21\n--test_bool=not_a_bool!\n", GetArgv0());
1176*08ab5237SOystein Eftevaag   fclose(fp);
1177*08ab5237SOystein Eftevaag 
1178*08ab5237SOystein Eftevaag   FLAGS_test_int32 = -22;
1179*08ab5237SOystein Eftevaag   const bool r = ReadFromFlagsFile(filename, GetArgv0(), false);
1180*08ab5237SOystein Eftevaag   EXPECT_FALSE(r);
1181*08ab5237SOystein Eftevaag   EXPECT_EQ(-22, FLAGS_test_int32);   // the -21 from the flagsfile didn't take
1182*08ab5237SOystein Eftevaag }
1183*08ab5237SOystein Eftevaag 
TEST(FlagsSetBeforeInitTest,TryFromEnv)1184*08ab5237SOystein Eftevaag TEST(FlagsSetBeforeInitTest, TryFromEnv) {
1185*08ab5237SOystein Eftevaag   EXPECT_EQ("pre-set", FLAGS_test_tryfromenv);
1186*08ab5237SOystein Eftevaag }
1187*08ab5237SOystein Eftevaag 
1188*08ab5237SOystein Eftevaag // The following test case verifies that ParseCommandLineFlags() and
1189*08ab5237SOystein Eftevaag // ParseCommandLineNonHelpFlags() uses the last definition of a flag
1190*08ab5237SOystein Eftevaag // in case it's defined more than once.
1191*08ab5237SOystein Eftevaag 
1192*08ab5237SOystein Eftevaag DEFINE_int32(test_flag, -1, "used for testing gflags.cc");
1193*08ab5237SOystein Eftevaag 
1194*08ab5237SOystein Eftevaag // Parses and returns the --test_flag flag.
1195*08ab5237SOystein Eftevaag // If with_help is true, calls ParseCommandLineFlags; otherwise calls
1196*08ab5237SOystein Eftevaag // ParseCommandLineNonHelpFlags.
ParseTestFlag(bool with_help,int argc,const char ** const_argv)1197*08ab5237SOystein Eftevaag int32 ParseTestFlag(bool with_help, int argc, const char** const_argv) {
1198*08ab5237SOystein Eftevaag   FlagSaver fs;  // Restores the flags before returning.
1199*08ab5237SOystein Eftevaag 
1200*08ab5237SOystein Eftevaag   // Makes a copy of the input array s.t. it can be reused
1201*08ab5237SOystein Eftevaag   // (ParseCommandLineFlags() will alter the array).
1202*08ab5237SOystein Eftevaag   char** const argv_save = new char*[argc + 1];
1203*08ab5237SOystein Eftevaag   char** argv = argv_save;
1204*08ab5237SOystein Eftevaag   memcpy(argv, const_argv, sizeof(*argv)*(argc + 1));
1205*08ab5237SOystein Eftevaag 
1206*08ab5237SOystein Eftevaag   if (with_help) {
1207*08ab5237SOystein Eftevaag     ParseCommandLineFlags(&argc, &argv, true);
1208*08ab5237SOystein Eftevaag   } else {
1209*08ab5237SOystein Eftevaag     ParseCommandLineNonHelpFlags(&argc, &argv, true);
1210*08ab5237SOystein Eftevaag   }
1211*08ab5237SOystein Eftevaag 
1212*08ab5237SOystein Eftevaag   delete[] argv_save;
1213*08ab5237SOystein Eftevaag   return FLAGS_test_flag;
1214*08ab5237SOystein Eftevaag }
1215*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUsesLastDefinitionTest,WhenFlagIsDefinedTwiceOnCommandLine)1216*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUsesLastDefinitionTest,
1217*08ab5237SOystein Eftevaag      WhenFlagIsDefinedTwiceOnCommandLine) {
1218*08ab5237SOystein Eftevaag   const char* argv[] = {
1219*08ab5237SOystein Eftevaag     "my_test",
1220*08ab5237SOystein Eftevaag     "--test_flag=1",
1221*08ab5237SOystein Eftevaag     "--test_flag=2",
1222*08ab5237SOystein Eftevaag     NULL,
1223*08ab5237SOystein Eftevaag   };
1224*08ab5237SOystein Eftevaag 
1225*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(true, arraysize(argv) - 1, argv));
1226*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(false, arraysize(argv) - 1, argv));
1227*08ab5237SOystein Eftevaag }
1228*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUsesLastDefinitionTest,WhenFlagIsDefinedTwiceInFlagFile)1229*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUsesLastDefinitionTest,
1230*08ab5237SOystein Eftevaag      WhenFlagIsDefinedTwiceInFlagFile) {
1231*08ab5237SOystein Eftevaag   const char* argv[] = {
1232*08ab5237SOystein Eftevaag     "my_test",
1233*08ab5237SOystein Eftevaag     GetFlagFileFlag(),
1234*08ab5237SOystein Eftevaag     NULL,
1235*08ab5237SOystein Eftevaag   };
1236*08ab5237SOystein Eftevaag 
1237*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(true, arraysize(argv) - 1, argv));
1238*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(false, arraysize(argv) - 1, argv));
1239*08ab5237SOystein Eftevaag }
1240*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUsesLastDefinitionTest,WhenFlagIsDefinedInCommandLineAndThenFlagFile)1241*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUsesLastDefinitionTest,
1242*08ab5237SOystein Eftevaag      WhenFlagIsDefinedInCommandLineAndThenFlagFile) {
1243*08ab5237SOystein Eftevaag   const char* argv[] = {
1244*08ab5237SOystein Eftevaag     "my_test",
1245*08ab5237SOystein Eftevaag     "--test_flag=0",
1246*08ab5237SOystein Eftevaag     GetFlagFileFlag(),
1247*08ab5237SOystein Eftevaag     NULL,
1248*08ab5237SOystein Eftevaag   };
1249*08ab5237SOystein Eftevaag 
1250*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(true, arraysize(argv) - 1, argv));
1251*08ab5237SOystein Eftevaag   EXPECT_EQ(2, ParseTestFlag(false, arraysize(argv) - 1, argv));
1252*08ab5237SOystein Eftevaag }
1253*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUsesLastDefinitionTest,WhenFlagIsDefinedInFlagFileAndThenCommandLine)1254*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUsesLastDefinitionTest,
1255*08ab5237SOystein Eftevaag      WhenFlagIsDefinedInFlagFileAndThenCommandLine) {
1256*08ab5237SOystein Eftevaag   const char* argv[] = {
1257*08ab5237SOystein Eftevaag     "my_test",
1258*08ab5237SOystein Eftevaag     GetFlagFileFlag(),
1259*08ab5237SOystein Eftevaag     "--test_flag=3",
1260*08ab5237SOystein Eftevaag     NULL,
1261*08ab5237SOystein Eftevaag   };
1262*08ab5237SOystein Eftevaag 
1263*08ab5237SOystein Eftevaag   EXPECT_EQ(3, ParseTestFlag(true, arraysize(argv) - 1, argv));
1264*08ab5237SOystein Eftevaag   EXPECT_EQ(3, ParseTestFlag(false, arraysize(argv) - 1, argv));
1265*08ab5237SOystein Eftevaag }
1266*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUsesLastDefinitionTest,WhenFlagIsDefinedInCommandLineAndFlagFileAndThenCommandLine)1267*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUsesLastDefinitionTest,
1268*08ab5237SOystein Eftevaag      WhenFlagIsDefinedInCommandLineAndFlagFileAndThenCommandLine) {
1269*08ab5237SOystein Eftevaag   const char* argv[] = {
1270*08ab5237SOystein Eftevaag     "my_test",
1271*08ab5237SOystein Eftevaag     "--test_flag=0",
1272*08ab5237SOystein Eftevaag     GetFlagFileFlag(),
1273*08ab5237SOystein Eftevaag     "--test_flag=3",
1274*08ab5237SOystein Eftevaag     NULL,
1275*08ab5237SOystein Eftevaag   };
1276*08ab5237SOystein Eftevaag 
1277*08ab5237SOystein Eftevaag   EXPECT_EQ(3, ParseTestFlag(true, arraysize(argv) - 1, argv));
1278*08ab5237SOystein Eftevaag   EXPECT_EQ(3, ParseTestFlag(false, arraysize(argv) - 1, argv));
1279*08ab5237SOystein Eftevaag }
1280*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsAndDashArgs,TwoDashArgFirst)1281*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsAndDashArgs, TwoDashArgFirst) {
1282*08ab5237SOystein Eftevaag   const char* argv[] = {
1283*08ab5237SOystein Eftevaag     "my_test",
1284*08ab5237SOystein Eftevaag     "--",
1285*08ab5237SOystein Eftevaag     "--test_flag=0",
1286*08ab5237SOystein Eftevaag     NULL,
1287*08ab5237SOystein Eftevaag   };
1288*08ab5237SOystein Eftevaag 
1289*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, ParseTestFlag(true, arraysize(argv) - 1, argv));
1290*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, ParseTestFlag(false, arraysize(argv) - 1, argv));
1291*08ab5237SOystein Eftevaag }
1292*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsAndDashArgs,TwoDashArgMiddle)1293*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsAndDashArgs, TwoDashArgMiddle) {
1294*08ab5237SOystein Eftevaag   const char* argv[] = {
1295*08ab5237SOystein Eftevaag     "my_test",
1296*08ab5237SOystein Eftevaag     "--test_flag=7",
1297*08ab5237SOystein Eftevaag     "--",
1298*08ab5237SOystein Eftevaag     "--test_flag=0",
1299*08ab5237SOystein Eftevaag     NULL,
1300*08ab5237SOystein Eftevaag   };
1301*08ab5237SOystein Eftevaag 
1302*08ab5237SOystein Eftevaag   EXPECT_EQ(7, ParseTestFlag(true, arraysize(argv) - 1, argv));
1303*08ab5237SOystein Eftevaag   EXPECT_EQ(7, ParseTestFlag(false, arraysize(argv) - 1, argv));
1304*08ab5237SOystein Eftevaag }
1305*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsAndDashArgs,OneDashArg)1306*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsAndDashArgs, OneDashArg) {
1307*08ab5237SOystein Eftevaag   const char* argv[] = {
1308*08ab5237SOystein Eftevaag     "my_test",
1309*08ab5237SOystein Eftevaag     "-",
1310*08ab5237SOystein Eftevaag     "--test_flag=0",
1311*08ab5237SOystein Eftevaag     NULL,
1312*08ab5237SOystein Eftevaag   };
1313*08ab5237SOystein Eftevaag 
1314*08ab5237SOystein Eftevaag   EXPECT_EQ(0, ParseTestFlag(true, arraysize(argv) - 1, argv));
1315*08ab5237SOystein Eftevaag   EXPECT_EQ(0, ParseTestFlag(false, arraysize(argv) - 1, argv));
1316*08ab5237SOystein Eftevaag }
1317*08ab5237SOystein Eftevaag 
1318*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
TEST(ParseCommandLineFlagsUnknownFlagDeathTest,FlagIsCompletelyUnknown)1319*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUnknownFlagDeathTest,
1320*08ab5237SOystein Eftevaag      FlagIsCompletelyUnknown) {
1321*08ab5237SOystein Eftevaag   const char* argv[] = {
1322*08ab5237SOystein Eftevaag     "my_test",
1323*08ab5237SOystein Eftevaag     "--this_flag_does_not_exist",
1324*08ab5237SOystein Eftevaag     NULL,
1325*08ab5237SOystein Eftevaag   };
1326*08ab5237SOystein Eftevaag 
1327*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(true, arraysize(argv) - 1, argv),
1328*08ab5237SOystein Eftevaag                "unknown command line flag.*");
1329*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(false, arraysize(argv) - 1, argv),
1330*08ab5237SOystein Eftevaag                "unknown command line flag.*");
1331*08ab5237SOystein Eftevaag }
1332*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUnknownFlagDeathTest,BoolFlagIsCompletelyUnknown)1333*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUnknownFlagDeathTest,
1334*08ab5237SOystein Eftevaag      BoolFlagIsCompletelyUnknown) {
1335*08ab5237SOystein Eftevaag   const char* argv[] = {
1336*08ab5237SOystein Eftevaag     "my_test",
1337*08ab5237SOystein Eftevaag     "--nothis_flag_does_not_exist",
1338*08ab5237SOystein Eftevaag     NULL,
1339*08ab5237SOystein Eftevaag   };
1340*08ab5237SOystein Eftevaag 
1341*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(true, arraysize(argv) - 1, argv),
1342*08ab5237SOystein Eftevaag                "unknown command line flag.*");
1343*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(false, arraysize(argv) - 1, argv),
1344*08ab5237SOystein Eftevaag                "unknown command line flag.*");
1345*08ab5237SOystein Eftevaag }
1346*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsUnknownFlagDeathTest,FlagIsNotABool)1347*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsUnknownFlagDeathTest,
1348*08ab5237SOystein Eftevaag      FlagIsNotABool) {
1349*08ab5237SOystein Eftevaag   const char* argv[] = {
1350*08ab5237SOystein Eftevaag     "my_test",
1351*08ab5237SOystein Eftevaag     "--notest_string",
1352*08ab5237SOystein Eftevaag     NULL,
1353*08ab5237SOystein Eftevaag   };
1354*08ab5237SOystein Eftevaag 
1355*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(true, arraysize(argv) - 1, argv),
1356*08ab5237SOystein Eftevaag                "boolean value .* specified for .* command line flag");
1357*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(false, arraysize(argv) - 1, argv),
1358*08ab5237SOystein Eftevaag                "boolean value .* specified for .* command line flag");
1359*08ab5237SOystein Eftevaag }
1360*08ab5237SOystein Eftevaag #endif
1361*08ab5237SOystein Eftevaag 
TEST(ParseCommandLineFlagsWrongFields,DescriptionIsInvalid)1362*08ab5237SOystein Eftevaag TEST(ParseCommandLineFlagsWrongFields,
1363*08ab5237SOystein Eftevaag      DescriptionIsInvalid) {
1364*08ab5237SOystein Eftevaag   // These must not be automatic variables, since command line flags
1365*08ab5237SOystein Eftevaag   // aren't unregistered and gUnit uses FlagSaver to save and restore
1366*08ab5237SOystein Eftevaag   // command line flags' values.  If these are on the stack, then when
1367*08ab5237SOystein Eftevaag   // later tests attempt to save and restore their values, the stack
1368*08ab5237SOystein Eftevaag   // addresses of these variables will be overwritten...  Stack smash!
1369*08ab5237SOystein Eftevaag   static bool current_storage;
1370*08ab5237SOystein Eftevaag   static bool defvalue_storage;
1371*08ab5237SOystein Eftevaag   FlagRegisterer fr("flag_name", NULL, "filename",
1372*08ab5237SOystein Eftevaag                     &current_storage, &defvalue_storage);
1373*08ab5237SOystein Eftevaag   CommandLineFlagInfo fi;
1374*08ab5237SOystein Eftevaag   EXPECT_TRUE(GetCommandLineFlagInfo("flag_name", &fi));
1375*08ab5237SOystein Eftevaag   EXPECT_EQ("", fi.description);
1376*08ab5237SOystein Eftevaag   EXPECT_EQ(&current_storage, fi.flag_ptr);
1377*08ab5237SOystein Eftevaag }
1378*08ab5237SOystein Eftevaag 
ValidateTestFlagIs5(const char * flagname,int32 flagval)1379*08ab5237SOystein Eftevaag static bool ValidateTestFlagIs5(const char* flagname, int32 flagval) {
1380*08ab5237SOystein Eftevaag   if (flagval == 5)
1381*08ab5237SOystein Eftevaag     return true;
1382*08ab5237SOystein Eftevaag   printf("%s isn't 5!\n", flagname);
1383*08ab5237SOystein Eftevaag   return false;
1384*08ab5237SOystein Eftevaag }
1385*08ab5237SOystein Eftevaag 
ValidateTestFlagIs10(const char * flagname,int32 flagval)1386*08ab5237SOystein Eftevaag static bool ValidateTestFlagIs10(const char* flagname, int32 flagval) {
1387*08ab5237SOystein Eftevaag   return flagval == 10;
1388*08ab5237SOystein Eftevaag }
1389*08ab5237SOystein Eftevaag 
1390*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,ValidFlagViaArgv)1391*08ab5237SOystein Eftevaag TEST(FlagsValidator, ValidFlagViaArgv) {
1392*08ab5237SOystein Eftevaag   const char* argv[] = {
1393*08ab5237SOystein Eftevaag     "my_test",
1394*08ab5237SOystein Eftevaag     "--test_flag=5",
1395*08ab5237SOystein Eftevaag     NULL,
1396*08ab5237SOystein Eftevaag   };
1397*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1398*08ab5237SOystein Eftevaag   EXPECT_EQ(5, ParseTestFlag(true, arraysize(argv) - 1, argv));
1399*08ab5237SOystein Eftevaag   // Undo the flag validator setting
1400*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1401*08ab5237SOystein Eftevaag }
1402*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,ValidFlagViaSetDefault)1403*08ab5237SOystein Eftevaag TEST(FlagsValidator, ValidFlagViaSetDefault) {
1404*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1405*08ab5237SOystein Eftevaag   // SetCommandLineOptionWithMode returns the empty string on error.
1406*08ab5237SOystein Eftevaag   EXPECT_NE("", SetCommandLineOptionWithMode("test_flag", "5",
1407*08ab5237SOystein Eftevaag                                              SET_FLAG_IF_DEFAULT));
1408*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1409*08ab5237SOystein Eftevaag }
1410*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,ValidFlagViaSetValue)1411*08ab5237SOystein Eftevaag TEST(FlagsValidator, ValidFlagViaSetValue) {
1412*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1413*08ab5237SOystein Eftevaag   FLAGS_test_flag = 100;   // doesn't trigger the validator
1414*08ab5237SOystein Eftevaag   // SetCommandLineOptionWithMode returns the empty string on error.
1415*08ab5237SOystein Eftevaag   EXPECT_NE("", SetCommandLineOptionWithMode("test_flag", "5",
1416*08ab5237SOystein Eftevaag                                              SET_FLAGS_VALUE));
1417*08ab5237SOystein Eftevaag   EXPECT_NE("", SetCommandLineOptionWithMode("test_flag", "5",
1418*08ab5237SOystein Eftevaag                                              SET_FLAGS_DEFAULT));
1419*08ab5237SOystein Eftevaag   EXPECT_NE("", SetCommandLineOption("test_flag", "5"));
1420*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1421*08ab5237SOystein Eftevaag }
1422*08ab5237SOystein Eftevaag 
1423*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
TEST(FlagsValidatorDeathTest,InvalidFlagViaArgv)1424*08ab5237SOystein Eftevaag TEST(FlagsValidatorDeathTest, InvalidFlagViaArgv) {
1425*08ab5237SOystein Eftevaag   const char* argv[] = {
1426*08ab5237SOystein Eftevaag     "my_test",
1427*08ab5237SOystein Eftevaag     "--test_flag=50",
1428*08ab5237SOystein Eftevaag     NULL,
1429*08ab5237SOystein Eftevaag   };
1430*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1431*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(true, arraysize(argv) - 1, argv),
1432*08ab5237SOystein Eftevaag                "ERROR: failed validation of new value '50' for flag 'test_flag'");
1433*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1434*08ab5237SOystein Eftevaag }
1435*08ab5237SOystein Eftevaag #endif
1436*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,InvalidFlagViaSetDefault)1437*08ab5237SOystein Eftevaag TEST(FlagsValidator, InvalidFlagViaSetDefault) {
1438*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1439*08ab5237SOystein Eftevaag   // SetCommandLineOptionWithMode returns the empty string on error.
1440*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOptionWithMode("test_flag", "50",
1441*08ab5237SOystein Eftevaag                                              SET_FLAG_IF_DEFAULT));
1442*08ab5237SOystein Eftevaag   EXPECT_EQ(-1, FLAGS_test_flag);   // the setting-to-50 should have failed
1443*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1444*08ab5237SOystein Eftevaag }
1445*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,InvalidFlagViaSetValue)1446*08ab5237SOystein Eftevaag TEST(FlagsValidator, InvalidFlagViaSetValue) {
1447*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1448*08ab5237SOystein Eftevaag   FLAGS_test_flag = 100;   // doesn't trigger the validator
1449*08ab5237SOystein Eftevaag   // SetCommandLineOptionWithMode returns the empty string on error.
1450*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOptionWithMode("test_flag", "50",
1451*08ab5237SOystein Eftevaag                                              SET_FLAGS_VALUE));
1452*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOptionWithMode("test_flag", "50",
1453*08ab5237SOystein Eftevaag                                              SET_FLAGS_DEFAULT));
1454*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_flag", "50"));
1455*08ab5237SOystein Eftevaag   EXPECT_EQ(100, FLAGS_test_flag);   // the setting-to-50 should have failed
1456*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1457*08ab5237SOystein Eftevaag }
1458*08ab5237SOystein Eftevaag 
1459*08ab5237SOystein Eftevaag #ifdef GTEST_HAS_DEATH_TEST
TEST(FlagsValidatorDeathTest,InvalidFlagNeverSet)1460*08ab5237SOystein Eftevaag TEST(FlagsValidatorDeathTest, InvalidFlagNeverSet) {
1461*08ab5237SOystein Eftevaag   // If a flag keeps its default value, and that default value is
1462*08ab5237SOystein Eftevaag   // invalid, we should die at argv-parse time.
1463*08ab5237SOystein Eftevaag   const char* argv[] = {
1464*08ab5237SOystein Eftevaag     "my_test",
1465*08ab5237SOystein Eftevaag     NULL,
1466*08ab5237SOystein Eftevaag   };
1467*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1468*08ab5237SOystein Eftevaag   EXPECT_DEATH(ParseTestFlag(true, arraysize(argv) - 1, argv),
1469*08ab5237SOystein Eftevaag                "ERROR: --test_flag must be set on the commandline");
1470*08ab5237SOystein Eftevaag }
1471*08ab5237SOystein Eftevaag #endif
1472*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,InvalidFlagPtr)1473*08ab5237SOystein Eftevaag TEST(FlagsValidator, InvalidFlagPtr) {
1474*08ab5237SOystein Eftevaag   int32 dummy;
1475*08ab5237SOystein Eftevaag   EXPECT_FALSE(RegisterFlagValidator(NULL, &ValidateTestFlagIs5));
1476*08ab5237SOystein Eftevaag   EXPECT_FALSE(RegisterFlagValidator(&dummy, &ValidateTestFlagIs5));
1477*08ab5237SOystein Eftevaag }
1478*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,RegisterValidatorTwice)1479*08ab5237SOystein Eftevaag TEST(FlagsValidator, RegisterValidatorTwice) {
1480*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1481*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1482*08ab5237SOystein Eftevaag   EXPECT_FALSE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs10));
1483*08ab5237SOystein Eftevaag   EXPECT_FALSE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs10));
1484*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1485*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1486*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs10));
1487*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1488*08ab5237SOystein Eftevaag }
1489*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,CommandLineFlagInfo)1490*08ab5237SOystein Eftevaag TEST(FlagsValidator, CommandLineFlagInfo) {
1491*08ab5237SOystein Eftevaag   CommandLineFlagInfo info;
1492*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_flag");
1493*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1494*08ab5237SOystein Eftevaag 
1495*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1496*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_flag");
1497*08ab5237SOystein Eftevaag   EXPECT_TRUE(info.has_validator_fn);
1498*08ab5237SOystein Eftevaag 
1499*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1500*08ab5237SOystein Eftevaag   info = GetCommandLineFlagInfoOrDie("test_flag");
1501*08ab5237SOystein Eftevaag   EXPECT_FALSE(info.has_validator_fn);
1502*08ab5237SOystein Eftevaag }
1503*08ab5237SOystein Eftevaag 
TEST(FlagsValidator,FlagSaver)1504*08ab5237SOystein Eftevaag TEST(FlagsValidator, FlagSaver) {
1505*08ab5237SOystein Eftevaag   {
1506*08ab5237SOystein Eftevaag     FlagSaver fs;
1507*08ab5237SOystein Eftevaag     EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1508*08ab5237SOystein Eftevaag     EXPECT_EQ("", SetCommandLineOption("test_flag", "50"));  // fails validation
1509*08ab5237SOystein Eftevaag   }
1510*08ab5237SOystein Eftevaag   EXPECT_NE("", SetCommandLineOption("test_flag", "50"));  // validator is gone
1511*08ab5237SOystein Eftevaag 
1512*08ab5237SOystein Eftevaag   EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, &ValidateTestFlagIs5));
1513*08ab5237SOystein Eftevaag   {
1514*08ab5237SOystein Eftevaag     FlagSaver fs;
1515*08ab5237SOystein Eftevaag     EXPECT_TRUE(RegisterFlagValidator(&FLAGS_test_flag, NULL));
1516*08ab5237SOystein Eftevaag     EXPECT_NE("", SetCommandLineOption("test_flag", "50"));  // no validator
1517*08ab5237SOystein Eftevaag   }
1518*08ab5237SOystein Eftevaag   EXPECT_EQ("", SetCommandLineOption("test_flag", "50"));  // validator is back
1519*08ab5237SOystein Eftevaag }
1520*08ab5237SOystein Eftevaag 
1521*08ab5237SOystein Eftevaag 
1522*08ab5237SOystein Eftevaag }  // unnamed namespace
1523*08ab5237SOystein Eftevaag 
main(int argc,char ** argv)1524*08ab5237SOystein Eftevaag static int main(int argc, char **argv) {
1525*08ab5237SOystein Eftevaag 
1526*08ab5237SOystein Eftevaag   // Run unit tests only if called without arguments, otherwise this program
1527*08ab5237SOystein Eftevaag   // is used by an "external" usage test
1528*08ab5237SOystein Eftevaag   const bool run_tests = (argc == 1);
1529*08ab5237SOystein Eftevaag 
1530*08ab5237SOystein Eftevaag   // We need to call SetArgv before parsing flags, so our "test" argv will
1531*08ab5237SOystein Eftevaag   // win out over this executable's real argv.  That makes running this
1532*08ab5237SOystein Eftevaag   // test with a real --help flag kinda annoying, unfortunately.
1533*08ab5237SOystein Eftevaag   const char* test_argv[] = { "/test/argv/for/gflags_unittest",
1534*08ab5237SOystein Eftevaag                               "argv 2", "3rd argv", "argv #4" };
1535*08ab5237SOystein Eftevaag   SetArgv(arraysize(test_argv), test_argv);
1536*08ab5237SOystein Eftevaag 
1537*08ab5237SOystein Eftevaag   // The first arg is the usage message, also important for testing.
1538*08ab5237SOystein Eftevaag   string usage_message = (string(GetArgv0()) +
1539*08ab5237SOystein Eftevaag                           ": <useless flag> [...]\nDoes something useless.\n");
1540*08ab5237SOystein Eftevaag 
1541*08ab5237SOystein Eftevaag   // We test setting tryfromenv manually, and making sure
1542*08ab5237SOystein Eftevaag   // ParseCommandLineFlags still evaluates it.
1543*08ab5237SOystein Eftevaag   FLAGS_tryfromenv = "test_tryfromenv";
1544*08ab5237SOystein Eftevaag   setenv("FLAGS_test_tryfromenv", "pre-set", 1);
1545*08ab5237SOystein Eftevaag 
1546*08ab5237SOystein Eftevaag   // Modify flag values from declared default value in two ways.
1547*08ab5237SOystein Eftevaag   // The recommended way:
1548*08ab5237SOystein Eftevaag   SetCommandLineOptionWithMode("changed_bool1", "true", SET_FLAGS_DEFAULT);
1549*08ab5237SOystein Eftevaag 
1550*08ab5237SOystein Eftevaag   // The non-recommended way:
1551*08ab5237SOystein Eftevaag   FLAGS_changed_bool2 = true;
1552*08ab5237SOystein Eftevaag 
1553*08ab5237SOystein Eftevaag   SetUsageMessage(usage_message);
1554*08ab5237SOystein Eftevaag   SetVersionString("test_version");
1555*08ab5237SOystein Eftevaag   ParseCommandLineFlags(&argc, &argv, true);
1556*08ab5237SOystein Eftevaag   MakeTmpdir(&FLAGS_test_tmpdir);
1557*08ab5237SOystein Eftevaag 
1558*08ab5237SOystein Eftevaag   int exit_status = 0;
1559*08ab5237SOystein Eftevaag   if (run_tests) {
1560*08ab5237SOystein Eftevaag 	  fprintf(stdout, "Running the unit tests now...\n\n"); fflush(stdout);
1561*08ab5237SOystein Eftevaag 	  exit_status = RUN_ALL_TESTS();
1562*08ab5237SOystein Eftevaag   } else fprintf(stderr, "\n\nPASS\n");
1563*08ab5237SOystein Eftevaag   ShutDownCommandLineFlags();
1564*08ab5237SOystein Eftevaag   return exit_status;
1565*08ab5237SOystein Eftevaag }
1566*08ab5237SOystein Eftevaag 
1567*08ab5237SOystein Eftevaag } // GFLAGS_NAMESPACE
1568*08ab5237SOystein Eftevaag 
main(int argc,char ** argv)1569*08ab5237SOystein Eftevaag int main(int argc, char** argv) {
1570*08ab5237SOystein Eftevaag   return GFLAGS_NAMESPACE::main(argc, argv);
1571*08ab5237SOystein Eftevaag }
1572*08ab5237SOystein Eftevaag 
1573