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
- the Free Software Foundation; either version 2 of the License, or
+ the Free Software Foundation; either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
- along with this program; if not, write to the Free Software
- Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+ along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "includes.h"
#include "torture/torture.h"
#include "lib/util/dlinklist.h"
-void torture_comment(struct torture_context *context,
- const char *comment, ...)
+void torture_comment(struct torture_context *context, const char *comment, ...)
{
va_list ap;
char *tmp;
talloc_free(tmp);
}
+void torture_warning(struct torture_context *context, const char *comment, ...)
+{
+ va_list ap;
+ char *tmp;
+
+ if (!context->ui_ops->warning)
+ return;
+
+ va_start(ap, comment);
+ tmp = talloc_vasprintf(context, comment, ap);
+
+ context->ui_ops->warning(context, tmp);
+
+ talloc_free(tmp);
+}
+
void torture_result(struct torture_context *context,
- enum torture_result result, const char *fmt, ...)
+ enum torture_result result, const char *fmt, ...)
{
va_list ap;
test->description = NULL;
test->run = wrap_test_with_testcase;
test->fn = run;
- test->dangerous = False;
+ test->dangerous = false;
test->data = data;
DLIST_ADD_END(tcase->tests, test, struct torture_test *);
return test;
}
-struct torture_tcase *torture_suite_add_tcase(struct torture_suite *suite,
- const char *name)
-{
- struct torture_tcase *tcase = talloc(suite, struct torture_tcase);
+bool torture_suite_init_tcase(struct torture_suite *suite,
+ struct torture_tcase *tcase,
+ const char *name)
+{
tcase->name = talloc_strdup(tcase, name);
tcase->description = NULL;
tcase->setup = NULL;
DLIST_ADD_END(suite->testcases, tcase, struct torture_tcase *);
+ return true;
+}
+
+
+struct torture_tcase *torture_suite_add_tcase(struct torture_suite *suite,
+ const char *name)
+{
+ struct torture_tcase *tcase = talloc(suite, struct torture_tcase);
+
+ if (!torture_suite_init_tcase(suite, tcase, name))
+ return NULL;
+
return tcase;
}
BOOL ret = True;
struct torture_tcase *tcase;
struct torture_suite *tsuite;
+ char *old_testname;
context->level++;
if (context->ui_ops->suite_start)
context->ui_ops->suite_start(context, suite);
- if (suite->path)
- torture_subunit_run_suite(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);
ret &= torture_run_suite(context, tsuite);
}
+ talloc_free(context->active_testname);
+ context->active_testname = old_testname;
+
if (context->ui_ops->suite_finish)
context->ui_ops->suite_finish(context, suite);
context->ui_ops->test_start(context, tcase, test);
}
+int str_list_match(const char *name, char **list)
+{
+ int i, ret = 0;
+ if (list == NULL)
+ return 0;
+
+ for (i = 0; list[i]; i++) {
+ if (gen_fnmatch(list[i], name) == 0)
+ ret++;
+ }
+ return ret;
+}
+
void torture_ui_test_result(struct torture_context *context,
enum torture_result result,
const char *comment)
if (context->ui_ops->test_result)
context->ui_ops->test_result(context, result, comment);
- /* FIXME: */
-
- switch (result) {
- case TORTURE_SKIP: context->skipped++; break;
- case TORTURE_FAIL: context->failed++; break;
- case TORTURE_OK: context->success++; break;
- }
+ if (result == TORTURE_ERROR || result == TORTURE_FAIL)
+ context->returncode = false;
}
static BOOL internal_torture_run_test(struct torture_context *context,
BOOL already_setup)
{
BOOL ret;
-
- if (test->dangerous && !torture_setting_bool(context, "dangerous", False)) {
- torture_result(context, TORTURE_SKIP,
- "disabled %s - enable dangerous tests to use", test->name);
- return True;
- }
+ char *old_testname;
if (!already_setup && tcase->setup &&
!tcase->setup(context, &(tcase->data)))
- return False;
+ return false;
+
+ if (tcase == NULL || strcmp(test->name, tcase->name) != 0) {
+ old_testname = context->active_testname;
+ context->active_testname = talloc_asprintf(context, "%s-%s",
+ old_testname, test->name);
+ }
context->active_tcase = tcase;
context->active_test = test;
context->last_reason = NULL;
context->last_result = TORTURE_OK;
- ret = test->run(context, tcase, test);
- if (!ret) {
- if (context->last_reason == NULL)
- context->last_reason = talloc_strdup(context, "...");
- context->last_result = TORTURE_FAIL;
+ if (test->dangerous &&
+ !torture_setting_bool(context, "dangerous", false)) {
+ context->last_result = TORTURE_SKIP;
+ context->last_reason = talloc_asprintf(context,
+ "disabled %s - enable dangerous tests to use", test->name);
+ } else {
+ ret = test->run(context, tcase, test);
+
+ if (!ret && context->last_result == TORTURE_OK) {
+ if (context->last_reason == NULL)
+ context->last_reason = talloc_strdup(context, "Unknown error/failure");
+ context->last_result = TORTURE_ERROR;
+ }
}
- torture_ui_test_result(context, context->last_result, context->last_reason);
+ torture_ui_test_result(context, context->last_result,
+ context->last_reason);
talloc_free(context->last_reason);
+ if (tcase == NULL || strcmp(test->name, tcase->name) != 0) {
+ talloc_free(context->active_testname);
+ context->active_testname = old_testname;
+ }
context->active_test = NULL;
context->active_tcase = NULL;
struct torture_tcase *tcase)
{
BOOL ret = True;
+ char *old_testname;
struct torture_test *test;
context->level++;
goto done;
}
+ old_testname = context->active_testname;
+ context->active_testname = talloc_asprintf(context, "%s-%s",
+ old_testname, tcase->name);
for (test = tcase->tests; test; test = test->next) {
ret &= internal_torture_run_test(context, tcase, test,
tcase->fixture_persistent);
}
+ talloc_free(context->active_testname);
+ context->active_testname = old_testname;
if (tcase->fixture_persistent && tcase->teardown &&
!tcase->teardown(context, tcase->data))
return lp_parm_int(-1, "torture", name, default_value);
}
+double torture_setting_double(struct torture_context *test, const char *name,
+ double default_value)
+{
+ return lp_parm_double(-1, "torture", name, default_value);
+}
+
bool torture_setting_bool(struct torture_context *test, const char *name,
bool default_value)
{
test->run = wrap_test_with_simple_tcase;
test->fn = run;
test->data = data;
- test->dangerous = False;
+ test->dangerous = false;
DLIST_ADD_END(tcase->tests, test, struct torture_test *);
return NULL;
}
+
+static bool wrap_test_with_simple_test(struct torture_context *torture_ctx,
+ struct torture_tcase *tcase,
+ struct torture_test *test)
+{
+ bool (*fn) (struct torture_context *, const void *tcase_data);
+
+ fn = test->fn;
+
+ return fn(torture_ctx, tcase->data);
+}
+
+struct torture_test *torture_tcase_add_simple_test(
+ struct torture_tcase *tcase,
+ const char *name,
+ bool (*run) (struct torture_context *test, const void *tcase_data))
+{
+ struct torture_test *test;
+
+ test = talloc(tcase, struct torture_test);
+
+ test->name = talloc_strdup(test, name);
+ test->description = NULL;
+ test->run = wrap_test_with_simple_test;
+ test->fn = run;
+ test->data = NULL;
+ test->dangerous = false;
+
+ DLIST_ADD_END(tcase->tests, test, struct torture_test *);
+
+ return test;
+}
+
+