blob: d15e44847ffb136945478a2e389fa0b8a0955252 [file] [log] [blame]
Austin Schuh36244a12019-09-21 17:52:38 -07001//
2// Copyright 2019 The Abseil Authors.
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// https://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15
16#include "absl/flags/internal/usage.h"
17
18#include <sstream>
19
20#include "gtest/gtest.h"
21#include "absl/flags/flag.h"
22#include "absl/flags/internal/path_util.h"
23#include "absl/flags/internal/program_name.h"
24#include "absl/flags/parse.h"
25#include "absl/flags/usage.h"
26#include "absl/flags/usage_config.h"
27#include "absl/memory/memory.h"
28#include "absl/strings/match.h"
29
30ABSL_FLAG(int, usage_reporting_test_flag_01, 101,
31 "usage_reporting_test_flag_01 help message");
32ABSL_FLAG(bool, usage_reporting_test_flag_02, false,
33 "usage_reporting_test_flag_02 help message");
34ABSL_FLAG(double, usage_reporting_test_flag_03, 1.03,
35 "usage_reporting_test_flag_03 help message");
36ABSL_FLAG(int64_t, usage_reporting_test_flag_04, 1000000000000004L,
37 "usage_reporting_test_flag_04 help message");
38
39static const char kTestUsageMessage[] = "Custom usage message";
40
41struct UDT {
42 UDT() = default;
43 UDT(const UDT&) = default;
44};
45bool AbslParseFlag(absl::string_view, UDT*, std::string*) { return true; }
46std::string AbslUnparseFlag(const UDT&) { return "UDT{}"; }
47
48ABSL_FLAG(UDT, usage_reporting_test_flag_05, {},
49 "usage_reporting_test_flag_05 help message");
50
51ABSL_FLAG(
52 std::string, usage_reporting_test_flag_06, {},
53 "usage_reporting_test_flag_06 help message.\n"
54 "\n"
55 "Some more help.\n"
56 "Even more long long long long long long long long long long long long "
57 "help message.");
58
59namespace {
60
61namespace flags = absl::flags_internal;
62
63static std::string NormalizeFileName(absl::string_view fname) {
64#ifdef _WIN32
65 std::string normalized(fname);
66 std::replace(normalized.begin(), normalized.end(), '\\', '/');
67 fname = normalized;
68#endif
69
70 auto absl_pos = fname.rfind("absl/");
71 if (absl_pos != absl::string_view::npos) {
72 fname = fname.substr(absl_pos);
73 }
74 return std::string(fname);
75}
76
77class UsageReportingTest : public testing::Test {
78 protected:
79 UsageReportingTest() {
80 // Install default config for the use on this unit test.
81 // Binary may install a custom config before tests are run.
82 absl::FlagsUsageConfig default_config;
83 default_config.normalize_filename = &NormalizeFileName;
84 absl::SetFlagsUsageConfig(default_config);
85 }
86
87 private:
88 flags::FlagSaver flag_saver_;
89};
90
91// --------------------------------------------------------------------
92
93using UsageReportingDeathTest = UsageReportingTest;
94
95TEST_F(UsageReportingDeathTest, TestSetProgramUsageMessage) {
96 EXPECT_EQ(absl::ProgramUsageMessage(), kTestUsageMessage);
97
98#ifndef _WIN32
99 // TODO(rogeeff): figure out why this does not work on Windows.
100 EXPECT_DEATH(absl::SetProgramUsageMessage("custom usage message"),
101 ".*SetProgramUsageMessage\\(\\) called twice.*");
102#endif
103}
104
105// --------------------------------------------------------------------
106
107TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_01) {
108 const auto* flag = flags::FindCommandLineFlag("usage_reporting_test_flag_01");
109 std::stringstream test_buf;
110
111 flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable);
112 EXPECT_EQ(
113 test_buf.str(),
114 R"( -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
115 default: 101;
116)");
117}
118
119TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_02) {
120 const auto* flag = flags::FindCommandLineFlag("usage_reporting_test_flag_02");
121 std::stringstream test_buf;
122
123 flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable);
124 EXPECT_EQ(
125 test_buf.str(),
126 R"( -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
127 default: false;
128)");
129}
130
131TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_03) {
132 const auto* flag = flags::FindCommandLineFlag("usage_reporting_test_flag_03");
133 std::stringstream test_buf;
134
135 flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable);
136 EXPECT_EQ(
137 test_buf.str(),
138 R"( -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
139 default: 1.03;
140)");
141}
142
143TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_04) {
144 const auto* flag = flags::FindCommandLineFlag("usage_reporting_test_flag_04");
145 std::stringstream test_buf;
146
147 flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable);
148 EXPECT_EQ(
149 test_buf.str(),
150 R"( -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
151 default: 1000000000000004;
152)");
153}
154
155TEST_F(UsageReportingTest, TestFlagHelpHRF_on_flag_05) {
156 const auto* flag = flags::FindCommandLineFlag("usage_reporting_test_flag_05");
157 std::stringstream test_buf;
158
159 flags::FlagHelp(test_buf, *flag, flags::HelpFormat::kHumanReadable);
160 EXPECT_EQ(
161 test_buf.str(),
162 R"( -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
163 default: UDT{};
164)");
165}
166
167// --------------------------------------------------------------------
168
169TEST_F(UsageReportingTest, TestFlagsHelpHRF) {
170 std::string usage_test_flags_out =
171 R"(usage_test: Custom usage message
172
173 Flags from absl/flags/internal/usage_test.cc:
174 -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
175 default: 101;
176 -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
177 default: false;
178 -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
179 default: 1.03;
180 -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
181 default: 1000000000000004;
182 -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
183 default: UDT{};
184 -usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
185
186 Some more help.
187 Even more long long long long long long long long long long long long help
188 message.); default: "";
189)";
190
191 std::stringstream test_buf_01;
192 flags::FlagsHelp(test_buf_01, "usage_test.cc",
193 flags::HelpFormat::kHumanReadable, kTestUsageMessage);
194 EXPECT_EQ(test_buf_01.str(), usage_test_flags_out);
195
196 std::stringstream test_buf_02;
197 flags::FlagsHelp(test_buf_02, "flags/internal/usage_test.cc",
198 flags::HelpFormat::kHumanReadable, kTestUsageMessage);
199 EXPECT_EQ(test_buf_02.str(), usage_test_flags_out);
200
201 std::stringstream test_buf_03;
202 flags::FlagsHelp(test_buf_03, "usage_test", flags::HelpFormat::kHumanReadable,
203 kTestUsageMessage);
204 EXPECT_EQ(test_buf_03.str(), usage_test_flags_out);
205
206 std::stringstream test_buf_04;
207 flags::FlagsHelp(test_buf_04, "flags/invalid_file_name.cc",
208 flags::HelpFormat::kHumanReadable, kTestUsageMessage);
209 EXPECT_EQ(test_buf_04.str(),
210 R"(usage_test: Custom usage message
211
212 No modules matched: use -helpfull
213)");
214
215 std::stringstream test_buf_05;
216 flags::FlagsHelp(test_buf_05, "", flags::HelpFormat::kHumanReadable,
217 kTestUsageMessage);
218 std::string test_out = test_buf_05.str();
219 absl::string_view test_out_str(test_out);
220 EXPECT_TRUE(
221 absl::StartsWith(test_out_str, "usage_test: Custom usage message"));
222 EXPECT_TRUE(absl::StrContains(
223 test_out_str, "Flags from absl/flags/internal/usage_test.cc:"));
224 EXPECT_TRUE(absl::StrContains(test_out_str,
225 "Flags from absl/flags/internal/usage.cc:"));
226 EXPECT_TRUE(
227 absl::StrContains(test_out_str, "-usage_reporting_test_flag_01 "));
228 EXPECT_TRUE(absl::StrContains(test_out_str, "-help (show help"))
229 << test_out_str;
230}
231
232// --------------------------------------------------------------------
233
234TEST_F(UsageReportingTest, TestNoUsageFlags) {
235 std::stringstream test_buf;
236 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), -1);
237}
238
239// --------------------------------------------------------------------
240
241TEST_F(UsageReportingTest, TestUsageFlag_helpshort) {
242 absl::SetFlag(&FLAGS_helpshort, true);
243
244 std::stringstream test_buf;
245 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
246 EXPECT_EQ(test_buf.str(),
247 R"(usage_test: Custom usage message
248
249 Flags from absl/flags/internal/usage_test.cc:
250 -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
251 default: 101;
252 -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
253 default: false;
254 -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
255 default: 1.03;
256 -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
257 default: 1000000000000004;
258 -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
259 default: UDT{};
260 -usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
261
262 Some more help.
263 Even more long long long long long long long long long long long long help
264 message.); default: "";
265)");
266}
267
268// --------------------------------------------------------------------
269
270TEST_F(UsageReportingTest, TestUsageFlag_help) {
271 absl::SetFlag(&FLAGS_help, true);
272
273 std::stringstream test_buf;
274 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
275 EXPECT_EQ(test_buf.str(),
276 R"(usage_test: Custom usage message
277
278 Flags from absl/flags/internal/usage_test.cc:
279 -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
280 default: 101;
281 -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
282 default: false;
283 -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
284 default: 1.03;
285 -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
286 default: 1000000000000004;
287 -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
288 default: UDT{};
289 -usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
290
291 Some more help.
292 Even more long long long long long long long long long long long long help
293 message.); default: "";
294
295Try --helpfull to get a list of all flags.
296)");
297}
298
299// --------------------------------------------------------------------
300
301TEST_F(UsageReportingTest, TestUsageFlag_helppackage) {
302 absl::SetFlag(&FLAGS_helppackage, true);
303
304 std::stringstream test_buf;
305 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 1);
306 EXPECT_EQ(test_buf.str(),
307 R"(usage_test: Custom usage message
308
309 Flags from absl/flags/internal/usage_test.cc:
310 -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
311 default: 101;
312 -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
313 default: false;
314 -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
315 default: 1.03;
316 -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
317 default: 1000000000000004;
318 -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
319 default: UDT{};
320 -usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
321
322 Some more help.
323 Even more long long long long long long long long long long long long help
324 message.); default: "";
325
326Try --helpfull to get a list of all flags.
327)");
328}
329
330// --------------------------------------------------------------------
331
332TEST_F(UsageReportingTest, TestUsageFlag_version) {
333 absl::SetFlag(&FLAGS_version, true);
334
335 std::stringstream test_buf;
336 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0);
337#ifndef NDEBUG
338 EXPECT_EQ(test_buf.str(), "usage_test\nDebug build (NDEBUG not #defined)\n");
339#else
340 EXPECT_EQ(test_buf.str(), "usage_test\n");
341#endif
342}
343
344// --------------------------------------------------------------------
345
346TEST_F(UsageReportingTest, TestUsageFlag_only_check_args) {
347 absl::SetFlag(&FLAGS_only_check_args, true);
348
349 std::stringstream test_buf;
350 EXPECT_EQ(flags::HandleUsageFlags(test_buf, kTestUsageMessage), 0);
351 EXPECT_EQ(test_buf.str(), "");
352}
353
354// --------------------------------------------------------------------
355
356TEST_F(UsageReportingTest, TestUsageFlag_helpon) {
357 absl::SetFlag(&FLAGS_helpon, "bla-bla");
358
359 std::stringstream test_buf_01;
360 EXPECT_EQ(flags::HandleUsageFlags(test_buf_01, kTestUsageMessage), 1);
361 EXPECT_EQ(test_buf_01.str(),
362 R"(usage_test: Custom usage message
363
364 No modules matched: use -helpfull
365)");
366
367 absl::SetFlag(&FLAGS_helpon, "usage_test");
368
369 std::stringstream test_buf_02;
370 EXPECT_EQ(flags::HandleUsageFlags(test_buf_02, kTestUsageMessage), 1);
371 EXPECT_EQ(test_buf_02.str(),
372 R"(usage_test: Custom usage message
373
374 Flags from absl/flags/internal/usage_test.cc:
375 -usage_reporting_test_flag_01 (usage_reporting_test_flag_01 help message);
376 default: 101;
377 -usage_reporting_test_flag_02 (usage_reporting_test_flag_02 help message);
378 default: false;
379 -usage_reporting_test_flag_03 (usage_reporting_test_flag_03 help message);
380 default: 1.03;
381 -usage_reporting_test_flag_04 (usage_reporting_test_flag_04 help message);
382 default: 1000000000000004;
383 -usage_reporting_test_flag_05 (usage_reporting_test_flag_05 help message);
384 default: UDT{};
385 -usage_reporting_test_flag_06 (usage_reporting_test_flag_06 help message.
386
387 Some more help.
388 Even more long long long long long long long long long long long long help
389 message.); default: "";
390)");
391}
392
393// --------------------------------------------------------------------
394
395} // namespace
396
397int main(int argc, char* argv[]) {
398 (void)absl::GetFlag(FLAGS_undefok); // Force linking of parse.cc
399 flags::SetProgramInvocationName("usage_test");
400 absl::SetProgramUsageMessage(kTestUsageMessage);
401 ::testing::InitGoogleTest(&argc, argv);
402
403 return RUN_ALL_TESTS();
404}