diff options
Diffstat (limited to 'source4/torture/smbtorture.c')
-rw-r--r-- | source4/torture/smbtorture.c | 148 |
1 files changed, 98 insertions, 50 deletions
diff --git a/source4/torture/smbtorture.c b/source4/torture/smbtorture.c index d461828431..ea563f7d63 100644 --- a/source4/torture/smbtorture.c +++ b/source4/torture/smbtorture.c @@ -34,6 +34,7 @@ #include "build.h" #include "lib/util/dlinklist.h" #include "librpc/rpc/dcerpc.h" +#include "param/param.h" static bool run_matching(struct torture_context *torture, const char *prefix, @@ -130,33 +131,33 @@ static void parse_dns(const char *dns) /* retrievieng the userdn */ p = strchr_m(dns, '#'); if (!p) { - lp_set_cmdline("torture:ldap_userdn", ""); - lp_set_cmdline("torture:ldap_basedn", ""); - lp_set_cmdline("torture:ldap_secret", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_userdn", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_basedn", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_secret", ""); return; } userdn = strndup(dns, p - dns); - lp_set_cmdline("torture:ldap_userdn", userdn); + lp_set_cmdline(global_loadparm, "torture:ldap_userdn", userdn); /* retrieve the basedn */ d = p + 1; p = strchr_m(d, '#'); if (!p) { - lp_set_cmdline("torture:ldap_basedn", ""); - lp_set_cmdline("torture:ldap_secret", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_basedn", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_secret", ""); return; } basedn = strndup(d, p - d); - lp_set_cmdline("torture:ldap_basedn", basedn); + lp_set_cmdline(global_loadparm, "torture:ldap_basedn", basedn); /* retrieve the secret */ p = p + 1; if (!p) { - lp_set_cmdline("torture:ldap_secret", ""); + lp_set_cmdline(global_loadparm, "torture:ldap_secret", ""); return; } secret = strdup(p); - lp_set_cmdline("torture:ldap_secret", secret); + lp_set_cmdline(global_loadparm, "torture:ldap_secret", secret); printf ("%s - %s - %s\n", userdn, basedn, secret); @@ -168,6 +169,9 @@ static void print_test_list(void) struct torture_suite *s; struct torture_tcase *t; + if (torture_root == NULL) + return; + 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); @@ -179,7 +183,7 @@ static void print_test_list(void) } } -static void usage(poptContext pc) +_NORETURN_ static void usage(poptContext pc) { struct torture_suite *o; struct torture_suite *s; @@ -238,6 +242,11 @@ static void usage(poptContext pc) printf("Tests are:"); + if (torture_root == NULL) { + printf("NO TESTS LOADED\n"); + exit(1); + } + for (o = torture_root->children; o; o = o->next) { printf("\n%s (%s):\n ", o->description, o->name); @@ -266,7 +275,7 @@ static void usage(poptContext pc) exit(1); } -static void max_runtime_handler(int sig) +_NORETURN_ static void max_runtime_handler(int sig) { DEBUG(0,("maximum runtime exceeded for smbtorture - terminating\n")); exit(1); @@ -275,22 +284,22 @@ static void max_runtime_handler(int sig) struct timeval last_suite_started; static void simple_suite_start(struct torture_context *ctx, - struct torture_suite *suite) + struct torture_suite *suite) { last_suite_started = timeval_current(); printf("Running %s\n", suite->name); } static void simple_suite_finish(struct torture_context *ctx, - struct torture_suite *suite) + struct torture_suite *suite) { printf("%s took %g secs\n\n", suite->name, timeval_elapsed(&last_suite_started)); } -static void simple_test_result (struct torture_context *context, - enum torture_result res, const char *reason) +static void simple_test_result(struct torture_context *context, + enum torture_result res, const char *reason) { switch (res) { case TORTURE_OK: @@ -309,14 +318,14 @@ static void simple_test_result (struct torture_context *context, } } -static void simple_comment (struct torture_context *test, - const char *comment) +static void simple_comment(struct torture_context *test, + const char *comment) { printf("%s", comment); } static void simple_warning(struct torture_context *test, - const char *comment) + const char *comment) { fprintf(stderr, "WARNING: %s\n", comment); } @@ -335,19 +344,19 @@ static void subunit_init(struct torture_context *ctx) } static void subunit_suite_start(struct torture_context *ctx, - struct torture_suite *suite) + struct torture_suite *suite) { } -static void subunit_test_start (struct torture_context *ctx, - struct torture_tcase *tcase, - struct torture_test *test) +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) +static void subunit_test_result(struct torture_context *context, + enum torture_result res, const char *reason) { switch (res) { case TORTURE_OK: @@ -368,22 +377,29 @@ static void subunit_test_result (struct torture_context *context, printf("\n"); } -static void subunit_comment (struct torture_context *test, - const char *comment) +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) + struct torture_suite *suite) { int i; ctx->quiet = true; @@ -393,13 +409,13 @@ static void quiet_suite_start(struct torture_context *ctx, } static void quiet_suite_finish(struct torture_context *ctx, - struct torture_suite *suite) + struct torture_suite *suite) { putchar('\n'); } -static void quiet_test_result (struct torture_context *context, - enum torture_result res, const char *reason) +static void quiet_test_result(struct torture_context *context, + enum torture_result res, const char *reason) { fflush(stdout); switch (res) { @@ -442,7 +458,7 @@ void run_shell(struct torture_context *tctx) fprintf(stderr, "Usage: set <variable> <value>\n"); } else { char *name = talloc_asprintf(NULL, "torture:%s", argv[1]); - lp_set_cmdline(name, argv[2]); + lp_set_cmdline(global_loadparm, name, argv[2]); talloc_free(name); } } else if (!strcmp(argv[0], "help")) { @@ -477,9 +493,10 @@ int main(int argc,char *argv[]) static const char *target = "other"; struct dcerpc_binding *binding_struct; NTSTATUS status; - int shell = False; + int shell = false; static const char *ui_ops_name = "simple"; const char *basedir = NULL; + const char *extra_module = NULL; static int list_tests = 0; char *host = NULL, *share = NULL; enum {OPT_LOADFILE=1000,OPT_UNCLIST,OPT_TIMELIMIT,OPT_DNS, OPT_LIST, @@ -502,7 +519,8 @@ int main(int argc,char *argv[]) {"parse-dns", 'D', POPT_ARG_STRING, NULL, OPT_DNS, "parse-dns", NULL}, {"dangerous", 'X', POPT_ARG_NONE, NULL, OPT_DANGEROUS, "run dangerous tests (eg. wiping out password database)", NULL}, - {"shell", 0, POPT_ARG_NONE, &shell, True, "Run shell", NULL}, + {"load-module", 0, POPT_ARG_STRING, &extra_module, 0, "load tests from DSO file", "SOFILE"}, + {"shell", 0, POPT_ARG_NONE, &shell, true, "Run shell", NULL}, {"target", 'T', POPT_ARG_STRING, &target, 0, "samba3|samba4|other", NULL}, {"async", 'a', POPT_ARG_NONE, NULL, OPT_ASYNC, "run async tests", NULL}, @@ -530,36 +548,36 @@ int main(int argc,char *argv[]) while((opt = poptGetNextOpt(pc)) != -1) { switch (opt) { case OPT_LOADFILE: - lp_set_cmdline("torture:loadfile", poptGetOptArg(pc)); + lp_set_cmdline(global_loadparm, "torture:loadfile", poptGetOptArg(pc)); break; case OPT_UNCLIST: - lp_set_cmdline("torture:unclist", poptGetOptArg(pc)); + lp_set_cmdline(global_loadparm, "torture:unclist", poptGetOptArg(pc)); break; case OPT_TIMELIMIT: - lp_set_cmdline("torture:timelimit", poptGetOptArg(pc)); + lp_set_cmdline(global_loadparm, "torture:timelimit", poptGetOptArg(pc)); break; case OPT_NUMPROGS: - lp_set_cmdline("torture:nprocs", poptGetOptArg(pc)); + lp_set_cmdline(global_loadparm, "torture:nprocs", poptGetOptArg(pc)); break; case OPT_DNS: parse_dns(poptGetOptArg(pc)); break; case OPT_DANGEROUS: - lp_set_cmdline("torture:dangerous", "Yes"); + lp_set_cmdline(global_loadparm, "torture:dangerous", "Yes"); break; case OPT_ASYNC: - lp_set_cmdline("torture:async", "Yes"); + lp_set_cmdline(global_loadparm, "torture:async", "Yes"); break; case OPT_SMB_PORTS: - lp_set_cmdline("smb ports", poptGetOptArg(pc)); + lp_set_cmdline(global_loadparm, "smb ports", poptGetOptArg(pc)); break; } } if (strcmp(target, "samba3") == 0) { - lp_set_cmdline("torture:samba3", "true"); + lp_set_cmdline(global_loadparm, "torture:samba3", "true"); } else if (strcmp(target, "samba4") == 0) { - lp_set_cmdline("torture:samba4", "true"); + lp_set_cmdline(global_loadparm, "torture:samba4", "true"); } if (max_runtime) { @@ -572,9 +590,24 @@ int main(int argc,char *argv[]) alarm(max_runtime); } - torture_init(); ldb_global_init(); + if (extra_module != NULL) { + init_module_fn fn = load_module(talloc_autofree_context(), poptGetOptArg(pc)); + + if (fn == NULL) + d_printf("Unable to load module from %s\n", poptGetOptArg(pc)); + else { + status = fn(); + if (NT_STATUS_IS_ERR(status)) { + d_printf("Error initializing module %s: %s\n", + poptGetOptArg(pc), nt_errstr(status)); + } + } + } else { + torture_init(); + } + if (list_tests) { print_test_list(); return 0; @@ -609,12 +642,14 @@ int main(int argc,char *argv[]) usage(pc); return false; } - lp_set_cmdline("torture:host", binding_struct->host); - lp_set_cmdline("torture:share", "IPC$"); - lp_set_cmdline("torture:binding", argv_new[1]); + lp_set_cmdline(global_loadparm, "torture:host", binding_struct->host); + if (lp_parm_string(global_loadparm, NULL, "torture", "share") == NULL) + lp_set_cmdline(global_loadparm, "torture:share", "IPC$"); + lp_set_cmdline(global_loadparm, "torture:binding", argv_new[1]); } else { - lp_set_cmdline("torture:host", host); - lp_set_cmdline("torture:share", share); + lp_set_cmdline(global_loadparm, "torture:host", host); + lp_set_cmdline(global_loadparm, "torture:share", share); + lp_set_cmdline(global_loadparm, "torture:binding", host); } if (!strcmp(ui_ops_name, "simple")) { @@ -629,7 +664,20 @@ int main(int argc,char *argv[]) } torture = torture_context_init(talloc_autofree_context(), ui_ops); - torture->outputdir = basedir; + if (basedir != NULL) { + if (basedir[0] != '/') { + fprintf(stderr, "Please specify an absolute path to --basedir\n"); + return 1; + } + torture->outputdir = basedir; + } else { + char *pwd = talloc_size(torture, PATH_MAX); + if (!getcwd(pwd, PATH_MAX)) { + fprintf(stderr, "Unable to determine current working directory\n"); + return 1; + } + torture->outputdir = pwd; + } if (argc_new == 0) { printf("You must specify a test to run, or 'ALL'\n"); @@ -643,7 +691,7 @@ int main(int argc,char *argv[]) } } - if (torture->returncode) { + if (torture->returncode && correct) { return(0); } else { return(1); |