~iliaplatone/spacedrone.eu/inova-sis-pack

« back to all changes in this revision

Viewing changes to etc/samples/thirdparty/gflags/test/gflags_unittest.cc

  • Committer: Ilia Platone
  • Date: 2022-11-15 16:19:28 UTC
  • Revision ID: git-v1:b9f4c8dff67bb705341db6a18f84a3d5f61c23ce
Initial commit

Show diffs side-by-side

added added

removed removed

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