xref: /aosp_15_r20/external/libbrillo/brillo/flag_helper_test.cc (revision 1a96fba65179ea7d3f56207137718607415c5953)
1*1a96fba6SXin Li // Copyright 2014 The Chromium OS Authors. All rights reserved.
2*1a96fba6SXin Li // Use of this source code is governed by a BSD-style license that can be
3*1a96fba6SXin Li // found in the LICENSE file.
4*1a96fba6SXin Li 
5*1a96fba6SXin Li #include <cstdint>
6*1a96fba6SXin Li #include <cstdio>
7*1a96fba6SXin Li #include <sysexits.h>
8*1a96fba6SXin Li 
9*1a96fba6SXin Li #include <base/command_line.h>
10*1a96fba6SXin Li #include <base/macros.h>
11*1a96fba6SXin Li #include <base/stl_util.h>
12*1a96fba6SXin Li #include <brillo/flag_helper.h>
13*1a96fba6SXin Li 
14*1a96fba6SXin Li #include <gtest/gtest.h>
15*1a96fba6SXin Li 
16*1a96fba6SXin Li namespace brillo {
17*1a96fba6SXin Li 
18*1a96fba6SXin Li class FlagHelperTest : public ::testing::Test {
19*1a96fba6SXin Li  public:
FlagHelperTest()20*1a96fba6SXin Li   FlagHelperTest() {}
~FlagHelperTest()21*1a96fba6SXin Li   ~FlagHelperTest() override { brillo::FlagHelper::ResetForTesting(); }
SetUpTestCase()22*1a96fba6SXin Li   static void SetUpTestCase() { base::CommandLine::Init(0, nullptr); }
23*1a96fba6SXin Li };
24*1a96fba6SXin Li 
25*1a96fba6SXin Li // Test that the DEFINE_xxxx macros can create the respective variables
26*1a96fba6SXin Li // correctly with the default value.
TEST_F(FlagHelperTest,Defaults)27*1a96fba6SXin Li TEST_F(FlagHelperTest, Defaults) {
28*1a96fba6SXin Li   DEFINE_bool(bool1, true, "Test bool flag");
29*1a96fba6SXin Li   DEFINE_bool(bool2, false, "Test bool flag");
30*1a96fba6SXin Li   DEFINE_int32(int32_1, INT32_MIN, "Test int32 flag");
31*1a96fba6SXin Li   DEFINE_int32(int32_2, 0, "Test int32 flag");
32*1a96fba6SXin Li   DEFINE_int32(int32_3, INT32_MAX, "Test int32 flag");
33*1a96fba6SXin Li   DEFINE_uint32(uint32_1, 0, "Test uint32 flag");
34*1a96fba6SXin Li   DEFINE_uint32(uint32_2, UINT32_MAX, "Test uint32 flag");
35*1a96fba6SXin Li   DEFINE_int64(int64_1, INT64_MIN, "Test int64 flag");
36*1a96fba6SXin Li   DEFINE_int64(int64_2, 0, "Test int64 flag");
37*1a96fba6SXin Li   DEFINE_int64(int64_3, INT64_MAX, "Test int64 flag");
38*1a96fba6SXin Li   DEFINE_uint64(uint64_1, 0, "Test uint64 flag");
39*1a96fba6SXin Li   DEFINE_uint64(uint64_2, UINT_LEAST64_MAX, "Test uint64 flag");
40*1a96fba6SXin Li   DEFINE_double(double_1, -100.5, "Test double flag");
41*1a96fba6SXin Li   DEFINE_double(double_2, 0, "Test double flag");
42*1a96fba6SXin Li   DEFINE_double(double_3, 100.5, "Test double flag");
43*1a96fba6SXin Li   DEFINE_string(string_1, "", "Test string flag");
44*1a96fba6SXin Li   DEFINE_string(string_2, "value", "Test string flag");
45*1a96fba6SXin Li 
46*1a96fba6SXin Li   const char* argv[] = {"test_program"};
47*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
48*1a96fba6SXin Li 
49*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
50*1a96fba6SXin Li       &command_line);
51*1a96fba6SXin Li   brillo::FlagHelper::Init(base::size(argv), argv, "TestDefaultTrue");
52*1a96fba6SXin Li 
53*1a96fba6SXin Li   EXPECT_TRUE(FLAGS_bool1);
54*1a96fba6SXin Li   EXPECT_FALSE(FLAGS_bool2);
55*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_1, INT32_MIN);
56*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_2, 0);
57*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_3, INT32_MAX);
58*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_1, 0);
59*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_2, UINT32_MAX);
60*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_1, INT64_MIN);
61*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_2, 0);
62*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_3, INT64_MAX);
63*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_1, 0);
64*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_2, UINT_LEAST64_MAX);
65*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_1, -100.5);
66*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_2, 0);
67*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_3, 100.5);
68*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_1.c_str(), "");
69*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_2.c_str(), "value");
70*1a96fba6SXin Li }
71*1a96fba6SXin Li 
72*1a96fba6SXin Li // Test that command line flag values are parsed and update the flag
73*1a96fba6SXin Li // variable values correctly when using double '--' flags
TEST_F(FlagHelperTest,SetValueDoubleDash)74*1a96fba6SXin Li TEST_F(FlagHelperTest, SetValueDoubleDash) {
75*1a96fba6SXin Li   DEFINE_bool(bool1, false, "Test bool flag");
76*1a96fba6SXin Li   DEFINE_bool(bool2, true, "Test bool flag");
77*1a96fba6SXin Li   DEFINE_bool(bool3, false, "Test bool flag");
78*1a96fba6SXin Li   DEFINE_bool(bool4, true, "Test bool flag");
79*1a96fba6SXin Li   DEFINE_int32(int32_1, 1, "Test int32 flag");
80*1a96fba6SXin Li   DEFINE_int32(int32_2, 1, "Test int32 flag");
81*1a96fba6SXin Li   DEFINE_int32(int32_3, 1, "Test int32 flag");
82*1a96fba6SXin Li   DEFINE_uint32(uint32_1, 1, "Test uint32 flag");
83*1a96fba6SXin Li   DEFINE_uint32(uint32_2, 1, "Test uint32 flag");
84*1a96fba6SXin Li   DEFINE_int64(int64_1, 1, "Test int64 flag");
85*1a96fba6SXin Li   DEFINE_int64(int64_2, 1, "Test int64 flag");
86*1a96fba6SXin Li   DEFINE_int64(int64_3, 1, "Test int64 flag");
87*1a96fba6SXin Li   DEFINE_uint64(uint64_1, 1, "Test uint64 flag");
88*1a96fba6SXin Li   DEFINE_uint64(uint64_2, 1, "Test uint64 flag");
89*1a96fba6SXin Li   DEFINE_double(double_1, 1, "Test double flag");
90*1a96fba6SXin Li   DEFINE_double(double_2, 1, "Test double flag");
91*1a96fba6SXin Li   DEFINE_double(double_3, 1, "Test double flag");
92*1a96fba6SXin Li   DEFINE_string(string_1, "default", "Test string flag");
93*1a96fba6SXin Li   DEFINE_string(string_2, "default", "Test string flag");
94*1a96fba6SXin Li 
95*1a96fba6SXin Li   const char* argv[] = {"test_program",
96*1a96fba6SXin Li                         "--bool1",
97*1a96fba6SXin Li                         "--nobool2",
98*1a96fba6SXin Li                         "--bool3=true",
99*1a96fba6SXin Li                         "--bool4=false",
100*1a96fba6SXin Li                         "--int32_1=-2147483648",
101*1a96fba6SXin Li                         "--int32_2=0",
102*1a96fba6SXin Li                         "--int32_3=2147483647",
103*1a96fba6SXin Li                         "--uint32_1=0",
104*1a96fba6SXin Li                         "--uint32_2=4294967295",
105*1a96fba6SXin Li                         "--int64_1=-9223372036854775808",
106*1a96fba6SXin Li                         "--int64_2=0",
107*1a96fba6SXin Li                         "--int64_3=9223372036854775807",
108*1a96fba6SXin Li                         "--uint64_1=0",
109*1a96fba6SXin Li                         "--uint64_2=18446744073709551615",
110*1a96fba6SXin Li                         "--double_1=-100.5",
111*1a96fba6SXin Li                         "--double_2=0",
112*1a96fba6SXin Li                         "--double_3=100.5",
113*1a96fba6SXin Li                         "--string_1=",
114*1a96fba6SXin Li                         "--string_2=value"};
115*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
116*1a96fba6SXin Li 
117*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
118*1a96fba6SXin Li       &command_line);
119*1a96fba6SXin Li   brillo::FlagHelper::Init(base::size(argv), argv, "TestDefaultTrue");
120*1a96fba6SXin Li 
121*1a96fba6SXin Li   EXPECT_TRUE(FLAGS_bool1);
122*1a96fba6SXin Li   EXPECT_FALSE(FLAGS_bool2);
123*1a96fba6SXin Li   EXPECT_TRUE(FLAGS_bool3);
124*1a96fba6SXin Li   EXPECT_FALSE(FLAGS_bool4);
125*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_1, INT32_MIN);
126*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_2, 0);
127*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_3, INT32_MAX);
128*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_1, 0);
129*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_2, UINT32_MAX);
130*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_1, INT64_MIN);
131*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_2, 0);
132*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_3, INT64_MAX);
133*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_1, 0);
134*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_2, UINT_LEAST64_MAX);
135*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_1, -100.5);
136*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_2, 0);
137*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_3, 100.5);
138*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_1.c_str(), "");
139*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_2.c_str(), "value");
140*1a96fba6SXin Li }
141*1a96fba6SXin Li 
142*1a96fba6SXin Li // Test that command line flag values are parsed and update the flag
143*1a96fba6SXin Li // variable values correctly when using single '-' flags
TEST_F(FlagHelperTest,SetValueSingleDash)144*1a96fba6SXin Li TEST_F(FlagHelperTest, SetValueSingleDash) {
145*1a96fba6SXin Li   DEFINE_bool(bool1, false, "Test bool flag");
146*1a96fba6SXin Li   DEFINE_bool(bool2, true, "Test bool flag");
147*1a96fba6SXin Li   DEFINE_int32(int32_1, 1, "Test int32 flag");
148*1a96fba6SXin Li   DEFINE_int32(int32_2, 1, "Test int32 flag");
149*1a96fba6SXin Li   DEFINE_int32(int32_3, 1, "Test int32 flag");
150*1a96fba6SXin Li   DEFINE_uint64(uint32_1, 1, "Test uint32 flag");
151*1a96fba6SXin Li   DEFINE_uint64(uint32_2, 1, "Test uint32 flag");
152*1a96fba6SXin Li   DEFINE_int64(int64_1, 1, "Test int64 flag");
153*1a96fba6SXin Li   DEFINE_int64(int64_2, 1, "Test int64 flag");
154*1a96fba6SXin Li   DEFINE_int64(int64_3, 1, "Test int64 flag");
155*1a96fba6SXin Li   DEFINE_uint64(uint64_1, 1, "Test uint64 flag");
156*1a96fba6SXin Li   DEFINE_uint64(uint64_2, 1, "Test uint64 flag");
157*1a96fba6SXin Li   DEFINE_double(double_1, 1, "Test double flag");
158*1a96fba6SXin Li   DEFINE_double(double_2, 1, "Test double flag");
159*1a96fba6SXin Li   DEFINE_double(double_3, 1, "Test double flag");
160*1a96fba6SXin Li   DEFINE_string(string_1, "default", "Test string flag");
161*1a96fba6SXin Li   DEFINE_string(string_2, "default", "Test string flag");
162*1a96fba6SXin Li 
163*1a96fba6SXin Li   const char* argv[] = {"test_program",
164*1a96fba6SXin Li                         "-bool1",
165*1a96fba6SXin Li                         "-nobool2",
166*1a96fba6SXin Li                         "-int32_1=-2147483648",
167*1a96fba6SXin Li                         "-int32_2=0",
168*1a96fba6SXin Li                         "-int32_3=2147483647",
169*1a96fba6SXin Li                         "-uint32_1=0",
170*1a96fba6SXin Li                         "-uint32_2=4294967295",
171*1a96fba6SXin Li                         "-int64_1=-9223372036854775808",
172*1a96fba6SXin Li                         "-int64_2=0",
173*1a96fba6SXin Li                         "-int64_3=9223372036854775807",
174*1a96fba6SXin Li                         "-uint64_1=0",
175*1a96fba6SXin Li                         "-uint64_2=18446744073709551615",
176*1a96fba6SXin Li                         "-double_1=-100.5",
177*1a96fba6SXin Li                         "-double_2=0",
178*1a96fba6SXin Li                         "-double_3=100.5",
179*1a96fba6SXin Li                         "-string_1=",
180*1a96fba6SXin Li                         "-string_2=value"};
181*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
182*1a96fba6SXin Li 
183*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
184*1a96fba6SXin Li       &command_line);
185*1a96fba6SXin Li   brillo::FlagHelper::Init(base::size(argv), argv, "TestDefaultTrue");
186*1a96fba6SXin Li 
187*1a96fba6SXin Li   EXPECT_TRUE(FLAGS_bool1);
188*1a96fba6SXin Li   EXPECT_FALSE(FLAGS_bool2);
189*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_1, INT32_MIN);
190*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_2, 0);
191*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_3, INT32_MAX);
192*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_1, 0);
193*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint32_2, UINT32_MAX);
194*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_1, INT64_MIN);
195*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_2, 0);
196*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int64_3, INT64_MAX);
197*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_1, 0);
198*1a96fba6SXin Li   EXPECT_EQ(FLAGS_uint64_2, UINT_LEAST64_MAX);
199*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_1, -100.5);
200*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_2, 0);
201*1a96fba6SXin Li   EXPECT_DOUBLE_EQ(FLAGS_double_3, 100.5);
202*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_1.c_str(), "");
203*1a96fba6SXin Li   EXPECT_STREQ(FLAGS_string_2.c_str(), "value");
204*1a96fba6SXin Li }
205*1a96fba6SXin Li 
206*1a96fba6SXin Li // Test that a duplicated flag on the command line picks up the last
207*1a96fba6SXin Li // value set.
TEST_F(FlagHelperTest,DuplicateSetValue)208*1a96fba6SXin Li TEST_F(FlagHelperTest, DuplicateSetValue) {
209*1a96fba6SXin Li   DEFINE_int32(int32_1, 0, "Test in32 flag");
210*1a96fba6SXin Li 
211*1a96fba6SXin Li   const char* argv[] = {"test_program", "--int32_1=5", "--int32_1=10"};
212*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
213*1a96fba6SXin Li 
214*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
215*1a96fba6SXin Li       &command_line);
216*1a96fba6SXin Li   brillo::FlagHelper::Init(base::size(argv), argv, "TestDuplicateSetvalue");
217*1a96fba6SXin Li 
218*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_1, 10);
219*1a96fba6SXin Li }
220*1a96fba6SXin Li 
221*1a96fba6SXin Li // Test that flags set after the -- marker are not parsed as command line flags
TEST_F(FlagHelperTest,FlagTerminator)222*1a96fba6SXin Li TEST_F(FlagHelperTest, FlagTerminator) {
223*1a96fba6SXin Li   DEFINE_int32(int32_1, 0, "Test int32 flag");
224*1a96fba6SXin Li 
225*1a96fba6SXin Li   const char* argv[] = {"test_program", "--int32_1=5", "--", "--int32_1=10"};
226*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
227*1a96fba6SXin Li 
228*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
229*1a96fba6SXin Li       &command_line);
230*1a96fba6SXin Li   brillo::FlagHelper::Init(base::size(argv), argv, "TestFlagTerminator");
231*1a96fba6SXin Li 
232*1a96fba6SXin Li   EXPECT_EQ(FLAGS_int32_1, 5);
233*1a96fba6SXin Li }
234*1a96fba6SXin Li 
235*1a96fba6SXin Li // Test that help messages are generated correctly when the --help flag
236*1a96fba6SXin Li // is passed to the program.
TEST_F(FlagHelperTest,HelpMessage)237*1a96fba6SXin Li TEST_F(FlagHelperTest, HelpMessage) {
238*1a96fba6SXin Li   DEFINE_bool(bool_1, true, "Test bool flag");
239*1a96fba6SXin Li   DEFINE_int32(int_1, 0, "Test int flag");
240*1a96fba6SXin Li   DEFINE_uint32(uint32_1, 0, "Test uint32 flag");
241*1a96fba6SXin Li   DEFINE_int64(int64_1, 0, "Test int64 flag");
242*1a96fba6SXin Li   DEFINE_uint64(uint64_1, 0, "Test uint64 flag");
243*1a96fba6SXin Li   DEFINE_double(double_1, 0, "Test double flag");
244*1a96fba6SXin Li   DEFINE_string(string_1, "", "Test string flag");
245*1a96fba6SXin Li 
246*1a96fba6SXin Li   const char* argv[] = {"test_program", "--int_1=value", "--help"};
247*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
248*1a96fba6SXin Li 
249*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
250*1a96fba6SXin Li       &command_line);
251*1a96fba6SXin Li 
252*1a96fba6SXin Li   FILE* orig = stdout;
253*1a96fba6SXin Li   stdout = stderr;
254*1a96fba6SXin Li 
255*1a96fba6SXin Li   ASSERT_EXIT(
256*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestHelpMessage"),
257*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_OK),
258*1a96fba6SXin Li       "TestHelpMessage\n\n"
259*1a96fba6SXin Li       "  --bool_1  \\(Test bool flag\\)  type: bool  default: true\n"
260*1a96fba6SXin Li       "  --double_1  \\(Test double flag\\)  type: double  default: 0\n"
261*1a96fba6SXin Li       "  --help  \\(Show this help message\\)  type: bool  default: false\n"
262*1a96fba6SXin Li       "  --int64_1  \\(Test int64 flag\\)  type: int64  default: 0\n"
263*1a96fba6SXin Li       "  --int_1  \\(Test int flag\\)  type: int  default: 0\n"
264*1a96fba6SXin Li       "  --string_1  \\(Test string flag\\)  type: string  default: \"\"\n"
265*1a96fba6SXin Li       "  --uint32_1  \\(Test uint32 flag\\)  type: uint32  default: 0\n"
266*1a96fba6SXin Li       "  --uint64_1  \\(Test uint64 flag\\)  type: uint64  default: 0\n");
267*1a96fba6SXin Li 
268*1a96fba6SXin Li   stdout = orig;
269*1a96fba6SXin Li }
270*1a96fba6SXin Li 
271*1a96fba6SXin Li // Test that passing in unknown command line flags causes the program
272*1a96fba6SXin Li // to exit with EX_USAGE error code and corresponding error message.
TEST_F(FlagHelperTest,UnknownFlag)273*1a96fba6SXin Li TEST_F(FlagHelperTest, UnknownFlag) {
274*1a96fba6SXin Li   const char* argv[] = {"test_program", "--flag=value"};
275*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
276*1a96fba6SXin Li 
277*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
278*1a96fba6SXin Li       &command_line);
279*1a96fba6SXin Li 
280*1a96fba6SXin Li   FILE* orig = stdout;
281*1a96fba6SXin Li   stdout = stderr;
282*1a96fba6SXin Li 
283*1a96fba6SXin Li   ASSERT_EXIT(brillo::FlagHelper::Init(base::size(argv), argv, "TestIntExit"),
284*1a96fba6SXin Li               ::testing::ExitedWithCode(EX_USAGE),
285*1a96fba6SXin Li               "ERROR: unknown command line flag 'flag'");
286*1a96fba6SXin Li 
287*1a96fba6SXin Li   stdout = orig;
288*1a96fba6SXin Li }
289*1a96fba6SXin Li 
290*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
291*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,BoolParseError)292*1a96fba6SXin Li TEST_F(FlagHelperTest, BoolParseError) {
293*1a96fba6SXin Li   DEFINE_bool(bool_1, 0, "Test bool flag");
294*1a96fba6SXin Li 
295*1a96fba6SXin Li   const char* argv[] = {"test_program", "--bool_1=value"};
296*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
297*1a96fba6SXin Li 
298*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
299*1a96fba6SXin Li       &command_line);
300*1a96fba6SXin Li 
301*1a96fba6SXin Li   FILE* orig = stdout;
302*1a96fba6SXin Li   stdout = stderr;
303*1a96fba6SXin Li 
304*1a96fba6SXin Li   ASSERT_EXIT(
305*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestBoolParseError"),
306*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
307*1a96fba6SXin Li       "ERROR: illegal value 'value' specified for bool flag 'bool_1'");
308*1a96fba6SXin Li 
309*1a96fba6SXin Li   stdout = orig;
310*1a96fba6SXin Li }
311*1a96fba6SXin Li 
312*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
313*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,Int32ParseError)314*1a96fba6SXin Li TEST_F(FlagHelperTest, Int32ParseError) {
315*1a96fba6SXin Li   DEFINE_int32(int_1, 0, "Test int flag");
316*1a96fba6SXin Li 
317*1a96fba6SXin Li   const char* argv[] = {"test_program", "--int_1=value"};
318*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
319*1a96fba6SXin Li 
320*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
321*1a96fba6SXin Li       &command_line);
322*1a96fba6SXin Li 
323*1a96fba6SXin Li   FILE* orig = stdout;
324*1a96fba6SXin Li   stdout = stderr;
325*1a96fba6SXin Li 
326*1a96fba6SXin Li   ASSERT_EXIT(
327*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestInt32ParseError"),
328*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
329*1a96fba6SXin Li       "ERROR: illegal value 'value' specified for int flag 'int_1'");
330*1a96fba6SXin Li 
331*1a96fba6SXin Li   stdout = orig;
332*1a96fba6SXin Li }
333*1a96fba6SXin Li 
334*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
335*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,Uint32ParseErrorUppperBound)336*1a96fba6SXin Li TEST_F(FlagHelperTest, Uint32ParseErrorUppperBound) {
337*1a96fba6SXin Li   DEFINE_uint32(uint32_1, 0, "Test uint32 flag");
338*1a96fba6SXin Li 
339*1a96fba6SXin Li   // test with UINT32_MAX + 1
340*1a96fba6SXin Li   const char* argv[] = {"test_program", "--uint32_1=4294967296"};
341*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
342*1a96fba6SXin Li 
343*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
344*1a96fba6SXin Li       &command_line);
345*1a96fba6SXin Li 
346*1a96fba6SXin Li   FILE* orig = stdout;
347*1a96fba6SXin Li   stdout = stderr;
348*1a96fba6SXin Li 
349*1a96fba6SXin Li   ASSERT_EXIT(
350*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestUint32ParseError"),
351*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
352*1a96fba6SXin Li       "ERROR: illegal value '4294967296' specified for uint32 flag "
353*1a96fba6SXin Li       "'uint32_1'");
354*1a96fba6SXin Li 
355*1a96fba6SXin Li   stdout = orig;
356*1a96fba6SXin Li }
357*1a96fba6SXin Li 
358*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
359*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,Uint32ParseErrorNegativeValue)360*1a96fba6SXin Li TEST_F(FlagHelperTest, Uint32ParseErrorNegativeValue) {
361*1a96fba6SXin Li   DEFINE_uint32(uint32_1, 0, "Test uint32 flag");
362*1a96fba6SXin Li 
363*1a96fba6SXin Li   const char* argv[] = {"test_program", "--uint32_1=-1"};
364*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
365*1a96fba6SXin Li 
366*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
367*1a96fba6SXin Li       &command_line);
368*1a96fba6SXin Li 
369*1a96fba6SXin Li   FILE* orig = stdout;
370*1a96fba6SXin Li   stdout = stderr;
371*1a96fba6SXin Li 
372*1a96fba6SXin Li   ASSERT_EXIT(
373*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestUint32ParseError"),
374*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
375*1a96fba6SXin Li       "ERROR: illegal value '-1' specified for uint32 flag "
376*1a96fba6SXin Li       "'uint32_1'");
377*1a96fba6SXin Li 
378*1a96fba6SXin Li   stdout = orig;
379*1a96fba6SXin Li }
380*1a96fba6SXin Li 
381*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
382*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,Int64ParseError)383*1a96fba6SXin Li TEST_F(FlagHelperTest, Int64ParseError) {
384*1a96fba6SXin Li   DEFINE_int64(int64_1, 0, "Test int64 flag");
385*1a96fba6SXin Li 
386*1a96fba6SXin Li   const char* argv[] = {"test_program", "--int64_1=value"};
387*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
388*1a96fba6SXin Li 
389*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
390*1a96fba6SXin Li       &command_line);
391*1a96fba6SXin Li 
392*1a96fba6SXin Li   FILE* orig = stdout;
393*1a96fba6SXin Li   stdout = stderr;
394*1a96fba6SXin Li 
395*1a96fba6SXin Li   ASSERT_EXIT(
396*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestInt64ParseError"),
397*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
398*1a96fba6SXin Li       "ERROR: illegal value 'value' specified for int64 flag "
399*1a96fba6SXin Li       "'int64_1'");
400*1a96fba6SXin Li 
401*1a96fba6SXin Li   stdout = orig;
402*1a96fba6SXin Li }
403*1a96fba6SXin Li 
404*1a96fba6SXin Li // Test that when passing an incorrect/unparsable type to a command line flag,
405*1a96fba6SXin Li // the program exits with code EX_DATAERR and outputs a corresponding message.
TEST_F(FlagHelperTest,UInt64ParseError)406*1a96fba6SXin Li TEST_F(FlagHelperTest, UInt64ParseError) {
407*1a96fba6SXin Li   DEFINE_uint64(uint64_1, 0, "Test uint64 flag");
408*1a96fba6SXin Li 
409*1a96fba6SXin Li   const char* argv[] = {"test_program", "--uint64_1=value"};
410*1a96fba6SXin Li   base::CommandLine command_line(base::size(argv), argv);
411*1a96fba6SXin Li 
412*1a96fba6SXin Li   brillo::FlagHelper::GetInstance()->set_command_line_for_testing(
413*1a96fba6SXin Li       &command_line);
414*1a96fba6SXin Li 
415*1a96fba6SXin Li   FILE* orig = stdout;
416*1a96fba6SXin Li   stdout = stderr;
417*1a96fba6SXin Li 
418*1a96fba6SXin Li   ASSERT_EXIT(
419*1a96fba6SXin Li       brillo::FlagHelper::Init(base::size(argv), argv, "TestUInt64ParseError"),
420*1a96fba6SXin Li       ::testing::ExitedWithCode(EX_DATAERR),
421*1a96fba6SXin Li       "ERROR: illegal value 'value' specified for uint64 flag "
422*1a96fba6SXin Li       "'uint64_1'");
423*1a96fba6SXin Li 
424*1a96fba6SXin Li   stdout = orig;
425*1a96fba6SXin Li }
426*1a96fba6SXin Li 
427*1a96fba6SXin Li }  // namespace brillo
428