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