s4:smbtorture - Add "const" before "value"
[sfrench/samba-autobuild/.git] / source4 / torture / smbtorture.c
index 4eeea73003c329d4cd05c39d7b587c2703de8e53..efb92d28a198a2002e426a61941667a81b566a31 100644 (file)
@@ -2,7 +2,7 @@
    Unix SMB/CIFS implementation.
    SMB torture tester
    Copyright (C) Andrew Tridgell 1997-2003
-   Copyright (C) Jelmer Vernooij 2006
+   Copyright (C) Jelmer Vernooij 2006-2008
    
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
 #include "system/readline.h"
 #include "lib/smbreadline/smbreadline.h"
 #include "libcli/libcli.h"
-#include "lib/ldb/include/ldb.h"
 #include "lib/events/events.h"
-#include "dynconfig.h"
 
-#include "torture/torture.h"
-#include "build.h"
-#include "lib/util/dlinklist.h"
+#include "torture/smbtorture.h"
 #include "librpc/rpc/dcerpc.h"
+#include "auth/gensec/gensec.h"
 #include "param/param.h"
 
+
 static bool run_matching(struct torture_context *torture,
                                                 const char *prefix, 
                                                 const char *expr,
@@ -47,7 +45,7 @@ static bool run_matching(struct torture_context *torture,
        if (suite == NULL) {
                struct torture_suite *o;
 
-               for (o = torture_root->children; o; o = o->next) {
+               for (o = (torture_root == NULL?NULL:torture_root->children); o; o = o->next) {
                        if (gen_fnmatch(expr, o->name) == 0) {
                                *matched = true;
                                reload_charcnv(torture->lp_ctx);
@@ -364,101 +362,8 @@ const static struct torture_ui_ops std_ui_ops = {
        .test_result = simple_test_result
 };
 
-static void subunit_init(struct torture_context *ctx) 
-{
-       /* FIXME: register segv and bus handler */
-}
-
-static void subunit_suite_start(struct torture_context *ctx,
-                               struct torture_suite *suite)
-{
-}
-
-static void subunit_test_start(struct torture_context *ctx, 
-                              struct torture_tcase *tcase,
-                              struct torture_test *test)
-{
-       printf("test: %s\n", test->name);
-}
-
-static void subunit_test_result(struct torture_context *context, 
-                               enum torture_result res, const char *reason)
-{
-       switch (res) {
-       case TORTURE_OK:
-               printf("success: %s", context->active_test->name);
-               break;
-       case TORTURE_FAIL:
-               printf("failure: %s", context->active_test->name);
-               break;
-       case TORTURE_ERROR:
-               printf("error: %s", context->active_test->name);
-               break;
-       case TORTURE_SKIP:
-               printf("skip: %s", context->active_test->name);
-               break;
-       }
-       if (reason)
-               printf(" [\n%s\n]", reason);
-       printf("\n");
-}
-
-static void subunit_comment(struct torture_context *test,
-                           const char *comment)
-{
-       fprintf(stderr, "%s", comment);
-}
 
-static void subunit_warning(struct torture_context *test,
-                           const char *comment)
-{
-       fprintf(stderr, "WARNING!: %s\n", comment);
-}
-
-const static struct torture_ui_ops subunit_ui_ops = {
-       .init = subunit_init,
-       .comment = subunit_comment,
-       .warning = subunit_warning,
-       .test_start = subunit_test_start,
-       .test_result = subunit_test_result,
-       .suite_start = subunit_suite_start
-};
-
-static void quiet_suite_start(struct torture_context *ctx,
-                             struct torture_suite *suite)
-{
-       int i;
-       ctx->quiet = true;
-       for (i = 1; i < ctx->level; i++) putchar('\t');
-       printf("%s: ", suite->name);
-       fflush(stdout);
-}
-
-static void quiet_suite_finish(struct torture_context *ctx,
-                              struct torture_suite *suite)
-{
-       putchar('\n');
-}
-
-static void quiet_test_result(struct torture_context *context, 
-                             enum torture_result res, const char *reason)
-{
-       fflush(stdout);
-       switch (res) {
-       case TORTURE_OK: putchar('.'); break;
-       case TORTURE_FAIL: putchar('F'); break;
-       case TORTURE_ERROR: putchar('E'); break;
-       case TORTURE_SKIP: putchar('I'); break;
-       }
-}
-
-const static struct torture_ui_ops quiet_ui_ops = {
-       .suite_start = quiet_suite_start,
-       .suite_finish = quiet_suite_finish,
-       .test_result = quiet_test_result
-};
-
-void run_shell(struct torture_context *tctx)
+static void run_shell(struct torture_context *tctx)
 {
        char *cline;
        int argc;
@@ -514,19 +419,22 @@ int main(int argc,char *argv[])
        int max_runtime=0;
        int argc_new;
        struct torture_context *torture;
+       struct torture_results *results;
        const struct torture_ui_ops *ui_ops;
        char **argv_new;
        poptContext pc;
        static const char *target = "other";
        NTSTATUS status;
        int shell = false;
-       static const char *ui_ops_name = "simple";
+       static const char *ui_ops_name = "subunit";
        const char *basedir = NULL;
        const char *extra_module = NULL;
        static int list_tests = 0;
+       int num_extra_users = 0;
        enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS, OPT_LIST,
-             OPT_DANGEROUS,OPT_SMB_PORTS,OPT_ASYNC,OPT_NUMPROGS};
-       
+             OPT_DANGEROUS,OPT_SMB_PORTS,OPT_ASYNC,OPT_NUMPROGS,
+             OPT_EXTRA_USER,};
+
        struct poptOption long_options[] = {
                POPT_AUTOHELP
                {"format", 0, POPT_ARG_STRING, &ui_ops_name, 0, "Output format (one of: simple, subunit)", NULL },
@@ -553,6 +461,8 @@ int main(int argc,char *argv[])
                 "number of simultaneous async requests", NULL},
                {"maximum-runtime", 0, POPT_ARG_INT, &max_runtime, 0, 
                 "set maximum time for smbtorture to live", "seconds"},
+               {"extra-user",   0, POPT_ARG_STRING, NULL, OPT_EXTRA_USER,
+                "extra user credentials", NULL},
                POPT_COMMON_SAMBA
                POPT_COMMON_CONNECTION
                POPT_COMMON_CREDENTIALS
@@ -596,6 +506,18 @@ int main(int argc,char *argv[])
                case OPT_SMB_PORTS:
                        lp_set_cmdline(cmdline_lp_ctx, "smb ports", poptGetOptArg(pc));
                        break;
+               case OPT_EXTRA_USER:
+                       {
+                               char *option = talloc_asprintf(NULL, "torture:extra_user%u",
+                                                              ++num_extra_users);
+                               const char *value = poptGetOptArg(pc);
+                               lp_set_cmdline(cmdline_lp_ctx, option, value);
+                               talloc_free(option);
+                       }
+                       break;
+               default:
+                       printf("bad command line option\n");
+                       exit(1);
                }
        }
 
@@ -603,6 +525,12 @@ int main(int argc,char *argv[])
                lp_set_cmdline(cmdline_lp_ctx, "torture:samba3", "true");
        } else if (strcmp(target, "samba4") == 0) {
                lp_set_cmdline(cmdline_lp_ctx, "torture:samba4", "true");
+       } else if (strcmp(target, "w2k8") == 0) {
+               lp_set_cmdline(cmdline_lp_ctx, "torture:w2k8", "true");
+       } else if (strcmp(target, "win7") == 0) {
+               lp_set_cmdline(cmdline_lp_ctx, "torture:win7", "true");
+       } else if (strcmp(target, "onefs") == 0) {
+               lp_set_cmdline(cmdline_lp_ctx, "torture:sacl_support", "false");
        }
 
        if (max_runtime) {
@@ -665,15 +593,15 @@ int main(int argc,char *argv[])
        if (!strcmp(ui_ops_name, "simple")) {
                ui_ops = &std_ui_ops;
        } else if (!strcmp(ui_ops_name, "subunit")) {
-               ui_ops = &subunit_ui_ops;
-       } else if (!strcmp(ui_ops_name, "quiet")) {
-               ui_ops = &quiet_ui_ops;
+               ui_ops = &torture_subunit_ui_ops;
        } else {
                printf("Unknown output format '%s'\n", ui_ops_name);
                exit(1);
        }
 
-       torture = torture_context_init(talloc_autofree_context(), ui_ops);
+       results = torture_results_init(talloc_autofree_context(), ui_ops);
+
+       torture = torture_context_init(s4_event_context_init(NULL), results);
        if (basedir != NULL) {
                if (basedir[0] != '/') {
                        fprintf(stderr, "Please specify an absolute path to --basedir\n");
@@ -691,6 +619,8 @@ int main(int argc,char *argv[])
 
        torture->lp_ctx = cmdline_lp_ctx;
 
+       gensec_init(cmdline_lp_ctx);
+
        if (argc_new == 0) {
                printf("You must specify a test to run, or 'ALL'\n");
        } else if (shell) {
@@ -703,7 +633,7 @@ int main(int argc,char *argv[])
                }
        }
 
-       if (torture->returncode && correct) {
+       if (torture->results->returncode && correct) {
                return(0);
        } else {
                return(1);