You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@trafficserver.apache.org by jp...@apache.org on 2016/04/23 18:25:28 UTC

[trafficserver] 02/02: TS-4370: Add a traffic_server option to list tests.

This is an automated email from the ASF dual-hosted git repository.

jpeach pushed a commit to branch master
in repository https://git-dual.apache.org/repos/asf/trafficserver.git

commit e5dd21f26b653d1fc9cebadb224587c8d88e4f92
Author: James Peach <jp...@apache.org>
AuthorDate: Wed Apr 20 22:28:43 2016 -0700

    TS-4370: Add a traffic_server option to list tests.
    
    Add the -l option to traffic_server option to list the available
    tests. This is helpful when you want to run specific tests but need
    to know what they are.
    
    This closes #597.
---
 doc/appendices/command-line/traffic_server.en.rst |  7 ++++-
 lib/ts/Regression.cc                              | 31 +++++++++++++++++------
 lib/ts/Regression.h                               | 22 ++++++++++------
 proxy/Main.cc                                     | 12 ++++++++-
 4 files changed, 54 insertions(+), 18 deletions(-)

diff --git a/doc/appendices/command-line/traffic_server.en.rst b/doc/appendices/command-line/traffic_server.en.rst
index 4c0c905..43c0c3c 100644
--- a/doc/appendices/command-line/traffic_server.en.rst
+++ b/doc/appendices/command-line/traffic_server.en.rst
@@ -57,7 +57,12 @@ environments or where the working set is highly variable.
 
 .. option:: -R LEVEL, --regression LEVEL
 
-.. option:: -r TEST, --regression_rest TEST
+.. option:: -r TEST, --regression_test TEST
+
+.. option:: -l, --regression_list
+
+If Traffic Server was built with tests enabled, this option lists
+the available tests.
 
 .. option:: -T TAGS, --debug_tags TAGS
 
diff --git a/lib/ts/Regression.cc b/lib/ts/Regression.cc
index 878197c..4639285 100644
--- a/lib/ts/Regression.cc
+++ b/lib/ts/Regression.cc
@@ -50,14 +50,9 @@ regression_status_string(int status)
               (status == REGRESSION_TEST_PASSED ? "PASSED" : (status == REGRESSION_TEST_INPROGRESS ? "INPROGRESS" : "FAILED")));
 }
 
-RegressionTest::RegressionTest(const char *name_arg, TestFunction *function_arg, int aopt)
+RegressionTest::RegressionTest(const char *_n, const SourceLocation &_l, TestFunction *_f, int _o)
+  : name(_n), location(_l), function(_f), next(0), status(REGRESSION_TEST_NOT_RUN), printed(false), opt(_o)
 {
-  name = name_arg;
-  function = function_arg;
-  status = REGRESSION_TEST_NOT_RUN;
-  printed = 0;
-  opt = aopt;
-
   if (opt == REGRESSION_OPT_EXCLUSIVE) {
     if (exclusive_test)
       this->next = exclusive_test;
@@ -80,7 +75,7 @@ start_test(RegressionTest *t)
   if (tresult != REGRESSION_TEST_INPROGRESS) {
     fprintf(stderr, "    REGRESSION_RESULT %s:%*s %s\n", t->name, 40 - (int)strlen(t->name), " ",
             regression_status_string(tresult));
-    t->printed = 1;
+    t->printed = true;
   }
   return tresult;
 }
@@ -105,6 +100,26 @@ RegressionTest::run(const char *atest)
   return run_some();
 }
 
+void
+RegressionTest::list()
+{
+  char buf[128];
+  const char *bold = "\x1b[1m";
+  const char *unbold = "\x1b[0m";
+
+  if (!isatty(fileno(stdout))) {
+    bold = unbold = "";
+  }
+
+  for (RegressionTest *t = test; t; t = t->next) {
+    fprintf(stdout, "%s%s%s %s\n", bold, t->name, unbold, t->location.str(buf, sizeof(buf)));
+  }
+
+  for (RegressionTest *t = exclusive_test; t; t = t->next) {
+    fprintf(stdout, "%s%s%s %s\n", bold, t->name, unbold, t->location.str(buf, sizeof(buf)));
+  }
+}
+
 int
 RegressionTest::run_some()
 {
diff --git a/lib/ts/Regression.h b/lib/ts/Regression.h
index cec9255..d22d9c4 100644
--- a/lib/ts/Regression.h
+++ b/lib/ts/Regression.h
@@ -26,6 +26,7 @@
 
 #include "ts/ink_platform.h"
 #include "ts/Regex.h"
+#include "ts/Diags.h"
 
 //   Each module should provide one or more regression tests
 //
@@ -60,37 +61,42 @@
 // regression options
 #define REGRESSION_OPT_EXCLUSIVE (1 << 0)
 
+#define RegressionMakeLocation(f) SourceLocation(__FILE__, f, __LINE__)
+
 struct RegressionTest;
 
 typedef void TestFunction(RegressionTest *t, int type, int *status);
 
 struct RegressionTest {
   const char *name;
+  const SourceLocation location;
   TestFunction *function;
   RegressionTest *next;
   int status;
-  int printed;
+  bool printed;
   int opt;
 
-  RegressionTest(const char *name_arg, TestFunction *function_arg, int aopt);
+  RegressionTest(const char *name_arg, const SourceLocation &loc, TestFunction *function_arg, int aopt);
 
   static int final_status;
   static int ran_tests;
   static DFA dfa;
   static RegressionTest *current;
   static int run(const char *name = NULL);
+  static void list();
   static int run_some();
   static int check_status();
 };
 
-#define REGRESSION_TEST(_f)                                             \
-  void RegressionTest_##_f(RegressionTest *t, int atype, int *pstatus); \
-  RegressionTest regressionTest_##_f(#_f, &RegressionTest_##_f, 0);     \
+#define REGRESSION_TEST(_f)                                                                                        \
+  void RegressionTest_##_f(RegressionTest *t, int atype, int *pstatus);                                            \
+  RegressionTest regressionTest_##_f(#_f, RegressionMakeLocation("RegressionTest_" #_f), &RegressionTest_##_f, 0); \
   void RegressionTest_##_f
 
-#define EXCLUSIVE_REGRESSION_TEST(_f)                                                      \
-  void RegressionTest_##_f(RegressionTest *t, int atype, int *pstatus);                    \
-  RegressionTest regressionTest_##_f(#_f, &RegressionTest_##_f, REGRESSION_OPT_EXCLUSIVE); \
+#define EXCLUSIVE_REGRESSION_TEST(_f)                                                                          \
+  void RegressionTest_##_f(RegressionTest *t, int atype, int *pstatus);                                        \
+  RegressionTest regressionTest_##_f(#_f, RegressionMakeLocation("RegressionTest_" #_f), &RegressionTest_##_f, \
+                                     REGRESSION_OPT_EXCLUSIVE);                                                \
   void RegressionTest_##_f
 
 int rprintf(RegressionTest *t, const char *format, ...);
diff --git a/proxy/Main.cc b/proxy/Main.cc
index 089e06a..eec06d9 100644
--- a/proxy/Main.cc
+++ b/proxy/Main.cc
@@ -143,6 +143,7 @@ bool command_valid = false;
 static char const *CMD_VERIFY_CONFIG = "verify_config";
 #if TS_HAS_TESTS
 static char regression_test[1024] = "";
+static int regression_list = 0;
 #endif
 int auto_clear_hostdb_flag = 0;
 extern int fds_limit;
@@ -192,6 +193,7 @@ static const ArgumentDescription argument_descriptions[] = {
 #if TS_HAS_TESTS
   {"regression", 'R', "Regression Level (quick:1..long:3)", "I", &regression_level, "PROXY_REGRESSION", NULL},
   {"regression_test", 'r', "Run Specific Regression Test", "S512", regression_test, "PROXY_REGRESSION_TEST", NULL},
+  {"regression_list", 'l', "List Regression Tests", "T", &regression_list, "PROXY_REGRESSION_LIST", NULL},
 #endif // TS_HAS_TESTS
 
 #if TS_USE_DIAGS
@@ -211,7 +213,7 @@ static const ArgumentDescription argument_descriptions[] = {
   {"read_core", 'c', "Read Core file", "S255", &core_file, NULL, NULL},
 #endif
 
-  {"accept_mss", ' ', "MSS for client connections", "I", &accept_mss, NULL, NULL},
+  {"accept_mss", '-', "MSS for client connections", "I", &accept_mss, NULL, NULL},
   {"poll_timeout", 't', "poll timeout in milliseconds", "I", &poll_timeout, NULL, NULL},
   HELP_ARGUMENT_DESCRIPTION(),
   VERSION_ARGUMENT_DESCRIPTION()};
@@ -1495,6 +1497,14 @@ main(int /* argc ATS_UNUSED */, const char **argv)
   if (cmd_disable_freelist) {
     ink_freelist_init_ops(ink_freelist_malloc_ops());
   }
+
+#if TS_HAS_TESTS
+  if (regression_list) {
+    RegressionTest::list();
+    ::exit(0);
+  }
+#endif
+
   // Specific validity checks.
   if (*conf_dir && command_index != find_cmd_index(CMD_VERIFY_CONFIG)) {
     fprintf(stderr, "-D option can only be used with the %s command\n", CMD_VERIFY_CONFIG);

-- 
To stop receiving notification emails like this one, please contact
"commits@trafficserver.apache.org" <co...@trafficserver.apache.org>.