static bool run_matching(struct torture_context *torture, const char *prefix, const char *expr, struct torture_suite *suite, bool *matched) { bool ret = true; if (suite == NULL) { struct torture_suite *o; 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); ret &= torture_run_suite(torture, o); continue; } ret &= run_matching(torture, o->name, expr, o, matched); } } else { char *name; struct torture_suite *c; struct torture_tcase *t; for (c = suite->children; c; c = c->next) { asprintf(&name, "%s-%s", prefix, c->name); if (gen_fnmatch(expr, name) == 0) { *matched = true; reload_charcnv(torture->lp_ctx); torture->active_testname = talloc_strdup(torture, prefix); ret &= torture_run_suite(torture, c); free(name); continue; } ret &= run_matching(torture, name, expr, c, matched); free(name); } for (t = suite->testcases; t; t = t->next) { asprintf(&name, "%s-%s", prefix, t->name); if (gen_fnmatch(expr, name) == 0) { *matched = true; reload_charcnv(torture->lp_ctx); torture->active_testname = talloc_strdup(torture, prefix); ret &= torture_run_tcase(torture, t); talloc_free(torture->active_testname); } free(name); } } return ret; }
/** * Run a torture test suite. */ bool torture_run_suite(struct torture_context *context, struct torture_suite *suite) { bool ret = true; struct torture_tcase *tcase; struct torture_suite *tsuite; char *old_testname; if (context->results->ui_ops->suite_start) context->results->ui_ops->suite_start(context, suite); old_testname = context->active_testname; if (old_testname != NULL) context->active_testname = talloc_asprintf(context, "%s-%s", old_testname, suite->name); else context->active_testname = talloc_strdup(context, suite->name); for (tcase = suite->testcases; tcase; tcase = tcase->next) { ret &= torture_run_tcase(context, tcase); } for (tsuite = suite->children; tsuite; tsuite = tsuite->next) { ret &= torture_run_suite(context, tsuite); } talloc_free(context->active_testname); context->active_testname = old_testname; if (context->results->ui_ops->suite_finish) context->results->ui_ops->suite_finish(context, suite); return ret; }
/**************************************************************************** run a specified test or "ALL" ****************************************************************************/ static bool run_test(struct torture_context *torture, const char *name) { bool ret = true; bool matched = false; struct torture_suite *o; if (strequal(name, "ALL")) { for (o = torture_root->children; o; o = o->next) { ret &= torture_run_suite(torture, o); } return ret; } ret = run_matching(torture, NULL, name, NULL, &matched); if (!matched) { printf("Unknown torture operation '%s'\n", name); return false; } return ret; }