usage_config_test.cc 7.6 KB

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