ovn: Remove top ovn directory from PATHs.
[cascardo/ovs.git] / tests / ovstest.c
index b8f5bfa..3f3430d 100644 (file)
 /* The mother of all test programs that links with libopevswitch.la */
 
 #include <config.h>
+#undef NDEBUG
 #include <inttypes.h>
 #include <limits.h>
 #include <stdlib.h>
 #include "command-line.h"
+#include "dynamic-string.h"
 #include "ovstest.h"
 #include "util.h"
 
-static struct command *commands = NULL;
+static struct ovs_cmdl_command *commands = NULL;
 static size_t n_commands = 0;
 static size_t allocated_commands = 0;
 
 static void
-add_command(struct command *cmd)
+add_command(struct ovs_cmdl_command *cmd)
 {
-    const struct command nil = {NULL, 0, 0, NULL};
+    const struct ovs_cmdl_command nil = {NULL, NULL, 0, 0, NULL};
 
     while (n_commands + 1 >= allocated_commands) {
         commands = x2nrealloc(commands, &allocated_commands,
@@ -43,45 +45,61 @@ add_command(struct command *cmd)
     n_commands++;
 }
 
+#define OVSTEST_USAGE \
+"TEST [TESTARGS] where 'TEST' is a string, 'TESTARGS' are optional \n"\
+"arguments of the TEST"
+
+static void
+flush_help_string(struct ds *ds)
+{
+    if (ds->length > 2 ) {
+        ds->length -= 2;
+        printf ("%s\n", ds_cstr(ds));
+        ds_clear(ds);
+    }
+}
+
 static void
-list(int argc OVS_UNUSED, char *argv[] OVS_UNUSED)
+help(struct ovs_cmdl_context *ctx OVS_UNUSED)
 {
-    const struct command *p;
+    const struct ovs_cmdl_command *p;
+    struct ds test_names = DS_EMPTY_INITIALIZER;
+    const int linesize = 70;
+
+    printf("%s: the big test executable\n"
+           "usage: %s TEST [TESTARGS]\n"
+           "where TEST is one of the following. \n\n",
+           program_name, program_name);
 
     for(p = commands; p->name != NULL; p++) {
-        printf("%s, %d, %d\n", p->name,p->min_args, p->max_args);
+        if (*p->name != '-') { /* Skip internal commands */
+            ds_put_format(&test_names, "%s, ", p->name);
+            if ((test_names.length) >= linesize) {
+                flush_help_string(&test_names);
+            }
+        }
     }
+    flush_help_string(&test_names);
+    ds_destroy(&test_names);
 }
 
 static void
 add_top_level_commands(void)
 {
-    struct command help_cmd = {"--help", 0, 0, list};
+    struct ovs_cmdl_command help_cmd = {"--help", NULL, 0, 0, help};
 
     add_command(&help_cmd);
 }
 
 void
-ovstest_register(const char *test_name, ovstest_func f,
-                  const struct command *sub_commands)
+ovstest_register(const char *test_name, ovs_cmdl_handler f)
 {
-    struct command test_cmd;
-    int max_args = 0;
-
-    if (sub_commands) {
-        const struct command *p;
-
-        for(p = sub_commands; p->name != NULL; p++) {
-            if (p->max_args > max_args) {
-                max_args = p->max_args;
-            }
-        }
-    }
-    max_args++;  /* adding in the sub program */
+    struct ovs_cmdl_command test_cmd;
 
     test_cmd.name = test_name;
-    test_cmd.min_args = 1;
-    test_cmd.max_args = max_args;
+    test_cmd.usage = NULL;
+    test_cmd.min_args = 0;
+    test_cmd.max_args = INT_MAX;
     test_cmd.handler = f;
 
     add_command(&test_cmd);
@@ -100,9 +118,18 @@ main(int argc, char *argv[])
 {
     set_program_name(argv[0]);
 
+    if (argc < 2) {
+        ovs_fatal(0, "expect test program to be specified; "
+                  "use --help for usage");
+    }
+
     add_top_level_commands();
     if (argc > 1) {
-        run_command(argc - 1, argv + 1, commands);
+        struct ovs_cmdl_context ctx = {
+            .argc = argc - 1,
+            .argv = argv + 1,
+        };
+        ovs_cmdl_run_command(&ctx, commands);
     }
     cleanup();