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_fail_ext(struct torture_context *context,
- const char *fmt, ...)
+void torture_warning(struct torture_context *context, const char *comment, ...)
{
va_list ap;
+ char *tmp;
- va_start(ap, fmt);
- context->last_reason = talloc_vasprintf(context, fmt, ap);
- /* make sure the reason for the failure is displayed */
- if (context->ui_ops->comment)
- context->ui_ops->comment(context, context->last_reason);
- va_end(ap);
- context->last_result = TORTURE_FAIL;
+ 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_skip_ext(struct torture_context *context,
- const char *fmt, ...)
+void torture_result(struct torture_context *context,
+ enum torture_result result, const char *fmt, ...)
{
va_list ap;
- context->skipped++;
va_start(ap, fmt);
- context->last_result = TORTURE_SKIP;
+
+ context->last_result = result;
context->last_reason = talloc_vasprintf(context, fmt, ap);
va_end(ap);
}
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);
-
- switch (result) {
- case TORTURE_SKIP: context->success++; break;
- case TORTURE_FAIL: context->failed++; break;
- case TORTURE_TODO: context->todo++; 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;
+ char *old_testname;
if (test->dangerous && !torture_setting_bool(context, "dangerous", False)) {
- _torture_skip_ext(context,
+ torture_result(context, TORTURE_SKIP,
"disabled %s - enable dangerous tests to use", test->name);
return True;
}
!tcase->setup(context, &(tcase->data)))
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;
torture_ui_test_start(context, tcase, test);
+
context->last_reason = NULL;
context->last_result = TORTURE_OK;
ret = test->run(context, tcase, test);
- if (!ret) {
+ if (!ret && context->last_result == TORTURE_OK) {
if (context->last_reason == NULL)
- context->last_reason = talloc_strdup(context, "...");
- context->last_result = TORTURE_FAIL;
+ 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);
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 tcase;
}
-BOOL torture_teardown_free(struct torture_context *torture, void *data)
-{
- return talloc_free(data);
-}
-
-
bool torture_suite_add_suite(struct torture_suite *suite,
struct torture_suite *child)
{