blob: 3bde13af8f8433e4fbf890e3f40f59ffe46ce706 [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/usage_config.h"
17
18#include "gtest/gtest.h"
19#include "absl/flags/internal/path_util.h"
20#include "absl/flags/internal/program_name.h"
21#include "absl/strings/match.h"
22
23namespace {
24
25class FlagsUsageConfigTest : public testing::Test {
26 protected:
27 void SetUp() override {
28 // Install Default config for the use on this unit test.
29 // Binary may install a custom config before tests are run.
30 absl::FlagsUsageConfig default_config;
31 absl::SetFlagsUsageConfig(default_config);
32 }
33};
34
35namespace flags = absl::flags_internal;
36
37bool TstContainsHelpshortFlags(absl::string_view f) {
38 return absl::StartsWith(flags::Basename(f), "progname.");
39}
40
41bool TstContainsHelppackageFlags(absl::string_view f) {
42 return absl::EndsWith(flags::Package(f), "aaa/");
43}
44
45bool TstContainsHelpFlags(absl::string_view f) {
46 return absl::EndsWith(flags::Package(f), "zzz/");
47}
48
49std::string TstVersionString() { return "program 1.0.0"; }
50
51std::string TstNormalizeFilename(absl::string_view filename) {
52 return std::string(filename.substr(2));
53}
54
55void TstReportUsageMessage(absl::string_view msg) {}
56
57// --------------------------------------------------------------------
58
59TEST_F(FlagsUsageConfigTest, TestGetSetFlagsUsageConfig) {
60 EXPECT_TRUE(flags::GetUsageConfig().contains_helpshort_flags);
61 EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags);
62 EXPECT_TRUE(flags::GetUsageConfig().contains_helppackage_flags);
63 EXPECT_TRUE(flags::GetUsageConfig().version_string);
64 EXPECT_TRUE(flags::GetUsageConfig().normalize_filename);
65
66 absl::FlagsUsageConfig empty_config;
67 empty_config.contains_helpshort_flags = &TstContainsHelpshortFlags;
68 empty_config.contains_help_flags = &TstContainsHelpFlags;
69 empty_config.contains_helppackage_flags = &TstContainsHelppackageFlags;
70 empty_config.version_string = &TstVersionString;
71 empty_config.normalize_filename = &TstNormalizeFilename;
72 absl::SetFlagsUsageConfig(empty_config);
73
74 EXPECT_TRUE(flags::GetUsageConfig().contains_helpshort_flags);
75 EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags);
76 EXPECT_TRUE(flags::GetUsageConfig().contains_helppackage_flags);
77 EXPECT_TRUE(flags::GetUsageConfig().version_string);
78 EXPECT_TRUE(flags::GetUsageConfig().normalize_filename);
79}
80
81// --------------------------------------------------------------------
82
83TEST_F(FlagsUsageConfigTest, TestContainsHelpshortFlags) {
84 flags::SetProgramInvocationName("usage_config_test");
85
86 auto config = flags::GetUsageConfig();
87 EXPECT_TRUE(config.contains_helpshort_flags("adir/cd/usage_config_test.cc"));
88 EXPECT_TRUE(
89 config.contains_helpshort_flags("aaaa/usage_config_test-main.cc"));
90 EXPECT_TRUE(config.contains_helpshort_flags("abc/usage_config_test_main.cc"));
91 EXPECT_FALSE(config.contains_helpshort_flags("usage_config_main.cc"));
92
93 absl::FlagsUsageConfig empty_config;
94 empty_config.contains_helpshort_flags = &TstContainsHelpshortFlags;
95 absl::SetFlagsUsageConfig(empty_config);
96
97 EXPECT_TRUE(
98 flags::GetUsageConfig().contains_helpshort_flags("aaa/progname.cpp"));
99 EXPECT_FALSE(
100 flags::GetUsageConfig().contains_helpshort_flags("aaa/progmane.cpp"));
101}
102
103// --------------------------------------------------------------------
104
105TEST_F(FlagsUsageConfigTest, TestContainsHelpFlags) {
106 flags::SetProgramInvocationName("usage_config_test");
107
108 auto config = flags::GetUsageConfig();
109 EXPECT_TRUE(config.contains_help_flags("zzz/usage_config_test.cc"));
110 EXPECT_TRUE(
111 config.contains_help_flags("bdir/a/zzz/usage_config_test-main.cc"));
112 EXPECT_TRUE(
113 config.contains_help_flags("//aqse/zzz/usage_config_test_main.cc"));
114 EXPECT_FALSE(config.contains_help_flags("zzz/aa/usage_config_main.cc"));
115
116 absl::FlagsUsageConfig empty_config;
117 empty_config.contains_help_flags = &TstContainsHelpFlags;
118 absl::SetFlagsUsageConfig(empty_config);
119
120 EXPECT_TRUE(flags::GetUsageConfig().contains_help_flags("zzz/main-body.c"));
121 EXPECT_FALSE(
122 flags::GetUsageConfig().contains_help_flags("zzz/dir/main-body.c"));
123}
124
125// --------------------------------------------------------------------
126
127TEST_F(FlagsUsageConfigTest, TestContainsHelppackageFlags) {
128 flags::SetProgramInvocationName("usage_config_test");
129
130 auto config = flags::GetUsageConfig();
131 EXPECT_TRUE(config.contains_helppackage_flags("aaa/usage_config_test.cc"));
132 EXPECT_TRUE(
133 config.contains_helppackage_flags("bbdir/aaa/usage_config_test-main.cc"));
134 EXPECT_TRUE(config.contains_helppackage_flags(
135 "//aqswde/aaa/usage_config_test_main.cc"));
136 EXPECT_FALSE(config.contains_helppackage_flags("aadir/usage_config_main.cc"));
137
138 absl::FlagsUsageConfig empty_config;
139 empty_config.contains_helppackage_flags = &TstContainsHelppackageFlags;
140 absl::SetFlagsUsageConfig(empty_config);
141
142 EXPECT_TRUE(
143 flags::GetUsageConfig().contains_helppackage_flags("aaa/main-body.c"));
144 EXPECT_FALSE(
145 flags::GetUsageConfig().contains_helppackage_flags("aadir/main-body.c"));
146}
147
148// --------------------------------------------------------------------
149
150TEST_F(FlagsUsageConfigTest, TestVersionString) {
151 flags::SetProgramInvocationName("usage_config_test");
152
153#ifdef NDEBUG
154 std::string expected_output = "usage_config_test\n";
155#else
156 std::string expected_output =
157 "usage_config_test\nDebug build (NDEBUG not #defined)\n";
158#endif
159
160 EXPECT_EQ(flags::GetUsageConfig().version_string(), expected_output);
161
162 absl::FlagsUsageConfig empty_config;
163 empty_config.version_string = &TstVersionString;
164 absl::SetFlagsUsageConfig(empty_config);
165
166 EXPECT_EQ(flags::GetUsageConfig().version_string(), "program 1.0.0");
167}
168
169// --------------------------------------------------------------------
170
171TEST_F(FlagsUsageConfigTest, TestNormalizeFilename) {
172 // This tests the default implementation.
173 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a/a.cc");
174 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/a/a.cc"), "a/a.cc");
175 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("///a/a.cc"), "a/a.cc");
176 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/"), "");
177
178 // This tests that the custom implementation is called.
179 absl::FlagsUsageConfig empty_config;
180 empty_config.normalize_filename = &TstNormalizeFilename;
181 absl::SetFlagsUsageConfig(empty_config);
182
183 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a.cc");
184 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("aaa/a.cc"), "a/a.cc");
185
186 // This tests that the default implementation is called.
187 empty_config.normalize_filename = nullptr;
188 absl::SetFlagsUsageConfig(empty_config);
189
190 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("a/a.cc"), "a/a.cc");
191 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("/a/a.cc"), "a/a.cc");
192 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("///a/a.cc"), "a/a.cc");
193 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("\\a\\a.cc"), "a\\a.cc");
194 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("//"), "");
195 EXPECT_EQ(flags::GetUsageConfig().normalize_filename("\\\\"), "");
196}
197
198} // namespace