brbzull0 commented on code in PR #13861:
URL: https://github.com/apache/trafficserver/pull/13861#discussion_r4314314492


##########
src/tscore/ArgParser.cc:
##########
@@ -39,11 +44,23 @@ std::string default_command;
 // by default return EX_USAGE(64) when usage is called.
 // if -h or --help is called specifically, return 0
 int usage_return_code = EX_USAGE;
+} // namespace
 
 namespace ts
 {
 bool ArgParser::_test_mode = false;
 
+// protected method for testing

Review Comment:
   No change: `reset_global_state()` is declared in the protected section of 
`ArgParser` in `include/tscore/ArgParser.h`, next to `do_exit()` and 
`set_test_mode()`, so the comment is accurate; the tests reach it through a 
derived `Access` struct.



##########
src/tscore/unit_tests/test_ArgParser.cc:
##########
@@ -719,3 +723,250 @@ TEST_CASE("The variable only applies when every 
occurrence of a repeated option
     REQUIRE(parsed.get("directive").size() == 0);
   }
 }
+
+namespace
+{
+// Parser-wide state lives at file scope in ArgParser.cc and outlives any one 
parser: a test
+// that reaches the help path leaves usage_return_code at 0 for every test 
after it, and a test
+// that sets a default command leaves that too. Clear it on the way in and on 
the way out.
+class ArgParserStateGuard
+{
+public:
+  ArgParserStateGuard() { reset(); }
+  ~ArgParserStateGuard() { reset(); }
+  static void
+  reset()
+  {
+    Access::reset_global_state();
+  }
+
+private:
+  struct Access : ts::ArgParser {
+    using ts::ArgParser::reset_global_state;
+  };
+};
+} // namespace
+
+// Link-time check that the parser-wide state stays internal to ArgParser.cc: 
were any of these
+// names exported from libtscore again, this binary would fail to link with 
duplicate symbols.
+std::string global_usage;
+std::string description;
+std::string parser_program_name;
+std::string default_command;
+int         usage_return_code = 0;

Review Comment:
   No change: the check has to define exactly these names with external linkage 
in the same link as libtscore, so a separate translation unit in test_tscore 
would reserve the same names; a clash would show as a duplicate-symbol link 
error at these definitions, next to the comment explaining them.



##########
include/tscore/ArgParser.h:
##########
@@ -364,6 +364,14 @@ class ArgParser
   // Enable test mode - makes do_exit() throw instead of calling exit() for 
unit testing
   static void set_test_mode(bool test = true);
 
+  /** Clear the parser-wide state held at file scope in ArgParser.cc.
+
+      Test-only. A program builds one parser and never reuses the state, but a 
unit test binary
+      runs many parsers in sequence, and set_default() would otherwise leak 
default_command into
+      every later test.

Review Comment:
   Both setters exist and both write `default_command` 
(`Command::set_default()` and `ArgParser::set_default_command()`); the comment 
now names both, in 41bdeee3ad.



##########
src/traffic_ctl/traffic_ctl.cc:
##########
@@ -173,8 +173,9 @@ main([[maybe_unused]] int argc, const char **argv)
     .add_option("--data", "-d", "Inline config data (@file, @- for stdin, or 
yaml string)", "", MORE_THAN_ZERO_ARG_N, "")
     .add_option("--directive", "-D", "Pass a reload directive to a config 
handler (format: config_key.directive_key=value)", "",
                 MORE_THAN_ZERO_ARG_N, "")
+    // No short form: -w is the global --watch.
     .add_option(
-      "--initial-wait", "-w",
+      "--initial-wait", "",
       "Initial wait before first poll, giving the server time to schedule all 
handlers (seconds). Accepts fractional values", "", 1,
       "2")

Review Comment:
   No change: `add_option` takes the short form as `std::string const &`, so 
passing `nullptr` would be undefined behaviour; an empty string is never added 
to the short-option map, and it is how the other long-only options in this file 
are declared (`--run-root`, `--read-timeout-ms`, `--error-level`).



-- 
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

To unsubscribe, e-mail: [email protected]

For queries about this service, please contact Infrastructure at:
[email protected]

Reply via email to