lib/util Split samba-modules library into public and private parts
[mat/samba.git] / source4 / torture / smbtorture.c
index dec97d22f6245d948e94cb5b29b7418fd8428164..9620605174344b293f9c47f57c783082e7ccee80 100644 (file)
 #include "librpc/rpc/dcerpc.h"
 #include "auth/gensec/gensec.h"
 #include "param/param.h"
+#include "lib/util/internal_module.h"
 
 #if HAVE_READLINE_HISTORY_H
 #include <readline/history.h>
 #endif
 
+static char *prefix_name(TALLOC_CTX *mem_ctx, const char *prefix, const char *name)
+{
+       if (prefix == NULL)
+               return talloc_strdup(mem_ctx, name);
+       else
+               return talloc_asprintf(mem_ctx, "%s.%s", prefix, name);
+}
+
+static void print_test_list(const struct torture_suite *suite, const char *prefix, const char *expr)
+{
+       struct torture_suite *o;
+       struct torture_tcase *t;
+       struct torture_test *p;
+
+       for (o = suite->children; o; o = o->next) {
+               char *name = prefix_name(NULL, prefix, o->name);
+               print_test_list(o, name, expr);
+               talloc_free(name);
+       }
+
+       for (t = suite->testcases; t; t = t->next) {
+               for (p = t->tests; p; p = p->next) {
+                       char *name = talloc_asprintf(NULL, "%s.%s.%s", prefix, t->name, p->name);
+                       if (strncmp(name, expr, strlen(expr)) == 0) {
+                               printf("%s\n", name);
+                       }
+                       talloc_free(name);
+               }
+       }
+}
+
 static bool run_matching(struct torture_context *torture,
                                                 const char *prefix, 
                                                 const char *expr,
@@ -51,10 +83,7 @@ static bool run_matching(struct torture_context *torture,
 
        for (o = suite->children; o; o = o->next) {
                char *name = NULL;
-               if (prefix == NULL)
-                       name = talloc_strdup(torture, o->name);
-               else
-                       name = talloc_asprintf(torture, "%s-%s", prefix, o->name);
+               name = prefix_name(torture, prefix, o->name);
                if (gen_fnmatch(expr, name) == 0) {
                        *matched = true;
                        reload_charcnv(torture->lp_ctx);
@@ -67,14 +96,14 @@ static bool run_matching(struct torture_context *torture,
        }
 
        for (t = suite->testcases; t; t = t->next) {
-               char *name = talloc_asprintf(torture, "%s-%s", prefix, t->name);
+               char *name = talloc_asprintf(torture, "%s.%s", prefix, t->name);
                if (gen_fnmatch(expr, name) == 0) {
                        *matched = true;
                        reload_charcnv(torture->lp_ctx);
                        ret &= torture_run_tcase_restricted(torture, t, restricted);
                }
                for (p = t->tests; p; p = p->next) {
-                       name = talloc_asprintf(torture, "%s-%s-%s", prefix, t->name, p->name);
+                       name = talloc_asprintf(torture, "%s.%s.%s", prefix, t->name, p->name);
                        if (gen_fnmatch(expr, name) == 0) {
                                *matched = true;
                                reload_charcnv(torture->lp_ctx);
@@ -211,7 +240,7 @@ static void print_structured_testsuite_list(void)
                                printf("\n  ");
                                i = 0;
                        }
-                       i+=printf("%s-%s ", o->name, s->name);
+                       i+=printf("%s.%s ", o->name, s->name);
                }
 
                for (t = o->testcases; t; t = t->next) {
@@ -219,7 +248,7 @@ static void print_structured_testsuite_list(void)
                                printf("\n  ");
                                i = 0;
                        }
-                       i+=printf("%s-%s ", o->name, t->name);
+                       i+=printf("%s.%s ", o->name, t->name);
                }
 
                if (i) printf("\n");
@@ -239,11 +268,11 @@ static void print_testsuite_list(void)
 
        for (o = torture_root->children; o; o = o->next) {
                for (s = o->children; s; s = s->next) {
-                       printf("%s-%s\n", o->name, s->name);
+                       printf("%s.%s\n", o->name, s->name);
                }
 
                for (t = o->testcases; t; t = t->next) {
-                       printf("%s-%s\n", o->name, t->name);
+                       printf("%s.%s\n", o->name, t->name);
                }
        }
 }
@@ -257,7 +286,7 @@ void torture_print_testsuites(bool structured)
        }
 }
 
-_NORETURN_ static void usage(poptContext pc)
+static void usage(poptContext pc)
 {
        poptPrintUsage(pc, stdout, 0);
        printf("\n");
@@ -313,7 +342,6 @@ _NORETURN_ static void usage(poptContext pc)
 
        print_structured_testsuite_list();
 
-       exit(1);
 }
 
 _NORETURN_ static void max_runtime_handler(int sig)
@@ -574,7 +602,7 @@ int main(int argc,char *argv[])
        }
 
        if (extra_module != NULL) {
-           init_module_fn fn = load_module(talloc_autofree_context(), poptGetOptArg(pc));
+               samba_init_module_fn fn = load_module(poptGetOptArg(pc), false, NULL);
 
                if (fn == NULL) 
                        d_printf("Unable to load module from %s\n", poptGetOptArg(pc));
@@ -594,12 +622,6 @@ int main(int argc,char *argv[])
                return 0;
        }
 
-       if (torture_seed == 0) {
-               torture_seed = time(NULL);
-       } 
-       printf("Using seed %d\n", torture_seed);
-       srandom(torture_seed);
-
        argv_new = discard_const_p(char *, poptGetArgs(pc));
 
        argc_new = argc;
@@ -610,6 +632,23 @@ int main(int argc,char *argv[])
                }
        }
 
+       if (list_tests) {
+               if (argc_new == 1) {
+                       print_test_list(torture_root, NULL, "");
+               } else {
+                       for (i=1;i<argc_new;i++) {
+                               print_test_list(torture_root, NULL, argv_new[i]);
+                       }
+               }
+               return 0;
+       }
+
+       if (torture_seed == 0) {
+               torture_seed = time(NULL);
+       } 
+       printf("Using seed %d\n", torture_seed);
+       srandom(torture_seed);
+
        if (!strcmp(ui_ops_name, "simple")) {
                ui_ops = &std_ui_ops;
        } else if (!strcmp(ui_ops_name, "subunit")) {
@@ -648,7 +687,7 @@ int main(int argc,char *argv[])
 
        torture->lp_ctx = cmdline_lp_ctx;
 
-       gensec_init(cmdline_lp_ctx);
+       gensec_init();
 
        if (shell) {
                /* In shell mode, just ignore any remaining test names. */
@@ -663,19 +702,17 @@ int main(int argc,char *argv[])
                if (argc_new < 3) {
                        printf("You must specify a test to run, or 'ALL'\n");
                        usage(pc);
-                       exit(1);
-               }
-
+                       torture->results->returncode = 1;
+               } else if (!torture_parse_target(cmdline_lp_ctx, argv_new[1])) {
                /* Take the target name or binding. */
-               if (!torture_parse_target(cmdline_lp_ctx, argv_new[1])) {
                        usage(pc);
-                       exit(1);
-               }
-
-               for (i=2;i<argc_new;i++) {
-                       if (!torture_run_named_tests(torture, argv_new[i],
-                                   (const char **)restricted)) {
-                               correct = false;
+                       torture->results->returncode = 1;
+               } else {
+                       for (i=2;i<argc_new;i++) {
+                               if (!torture_run_named_tests(torture, argv_new[i],
+                                           (const char **)restricted)) {
+                                       correct = false;
+                               }
                        }
                }
        }