Split out torture results from torture context.
[ira/wip.git] / source4 / lib / torture / torture.c
index ba7168f3fe25accd2bb0ca1758889bf94a325a9e..e465529f6b0c3ecc8d63405d357c9b7362ca5ad1 100644 (file)
 #include "param/param.h"
 #include "system/filesys.h"
 
+struct torture_results *torture_results_init(TALLOC_CTX *mem_ctx, const struct torture_ui_ops *ui_ops)
+{
+       struct torture_results *results = talloc_zero(mem_ctx, struct torture_results);
+
+       results->ui_ops = ui_ops;
+       results->returncode = true;
+
+       if (ui_ops->init)
+               ui_ops->init(results);
+
+       return results;
+}
+
+/**
+ * Initialize a torture context
+ */
 struct torture_context *torture_context_init(struct event_context *event_ctx, 
-                                            const struct torture_ui_ops *ui_ops)
+                                                                                        struct torture_results *results)
 {
        struct torture_context *torture = talloc_zero(event_ctx, 
                                                      struct torture_context);
-       torture->ui_ops = ui_ops;
-       torture->returncode = true;
-       torture->ev = event_ctx;
 
-       if (ui_ops->init)
-               ui_ops->init(torture);
+       if (torture == NULL)
+               return NULL;
+
+       torture->ev = event_ctx;
+       torture->results = talloc_reference(torture, results);
 
        return torture;
 }
 
+/**
+ * Create a sub torture context
+ */
+struct torture_context *torture_context_child(struct torture_context *parent)
+{
+       struct torture_context *subtorture = talloc_zero(parent, struct torture_context);
+
+       if (subtorture == NULL)
+               return NULL;
+
+       subtorture->level = parent->level+1;
+       subtorture->ev = talloc_reference(subtorture, parent->ev);
+       subtorture->lp_ctx = talloc_reference(subtorture, parent->lp_ctx);
+       subtorture->outputdir = talloc_reference(subtorture, parent->outputdir);
+       subtorture->results = talloc_reference(subtorture, parent->results);
+
+       return subtorture;
+}      
+
 /**
  create a temporary directory.
 */
@@ -59,38 +94,47 @@ _PUBLIC_ NTSTATUS torture_temp_dir(struct torture_context *tctx,
        return NT_STATUS_OK;
 }
 
+/**
+ * Comment on the status/progress of a test
+ */
 void torture_comment(struct torture_context *context, const char *comment, ...)
 {
        va_list ap;
        char *tmp;
 
-       if (!context->ui_ops->comment)
+       if (!context->results->ui_ops->comment)
                return;
 
        va_start(ap, comment);
        tmp = talloc_vasprintf(context, comment, ap);
                
-       context->ui_ops->comment(context, tmp);
+       context->results->ui_ops->comment(context, tmp);
        
        talloc_free(tmp);
 }
 
+/**
+ * Print a warning about the current test
+ */
 void torture_warning(struct torture_context *context, const char *comment, ...)
 {
        va_list ap;
        char *tmp;
 
-       if (!context->ui_ops->warning)
+       if (!context->results->ui_ops->warning)
                return;
 
        va_start(ap, comment);
        tmp = talloc_vasprintf(context, comment, ap);
 
-       context->ui_ops->warning(context, tmp);
+       context->results->ui_ops->warning(context, tmp);
 
        talloc_free(tmp);
 }
 
+/**
+ * Store the result of a torture test.
+ */
 void torture_result(struct torture_context *context, 
                    enum torture_result result, const char *fmt, ...)
 {
@@ -108,6 +152,9 @@ void torture_result(struct torture_context *context,
        va_end(ap);
 }
 
+/**
+ * Create a new torture suite
+ */
 struct torture_suite *torture_suite_create(TALLOC_CTX *ctx, const char *name)
 {
        struct torture_suite *suite = talloc_zero(ctx, struct torture_suite);
@@ -119,6 +166,9 @@ struct torture_suite *torture_suite_create(TALLOC_CTX *ctx, const char *name)
        return suite;
 }
 
+/**
+ * Set the setup() and teardown() functions for a testcase.
+ */
 void torture_tcase_set_fixture(struct torture_tcase *tcase, 
                bool (*setup) (struct torture_context *, void **),
                bool (*teardown) (struct torture_context *, void *))
@@ -140,6 +190,9 @@ static bool wrap_test_with_testcase_const(struct torture_context *torture_ctx,
        return fn(torture_ctx, tcase->data, test->data);
 }
 
+/**
+ * Add a test that uses const data to a testcase
+ */
 struct torture_test *torture_tcase_add_test_const(struct torture_tcase *tcase,
                const char *name,
                bool (*run) (struct torture_context *, const void *tcase_data,
@@ -160,7 +213,9 @@ struct torture_test *torture_tcase_add_test_const(struct torture_tcase *tcase,
        return test;
 }
 
-
+/**
+ * Add a new testcase
+ */
 bool torture_suite_init_tcase(struct torture_suite *suite, 
                              struct torture_tcase *tcase, 
                              const char *name)
@@ -189,6 +244,9 @@ struct torture_tcase *torture_suite_add_tcase(struct torture_suite *suite,
        return tcase;
 }
 
+/**
+ * Run a torture test suite.
+ */
 bool torture_run_suite(struct torture_context *context, 
                       struct torture_suite *suite)
 {
@@ -198,8 +256,8 @@ bool torture_run_suite(struct torture_context *context,
        char *old_testname;
 
        context->level++;
-       if (context->ui_ops->suite_start)
-               context->ui_ops->suite_start(context, suite);
+       if (context->results->ui_ops->suite_start)
+               context->results->ui_ops->suite_start(context, suite);
 
        old_testname = context->active_testname;
        if (old_testname != NULL)
@@ -219,8 +277,8 @@ bool torture_run_suite(struct torture_context *context,
        talloc_free(context->active_testname);
        context->active_testname = old_testname;
 
-       if (context->ui_ops->suite_finish)
-               context->ui_ops->suite_finish(context, suite);
+       if (context->results->ui_ops->suite_finish)
+               context->results->ui_ops->suite_finish(context, suite);
 
        context->level--;
        
@@ -231,19 +289,19 @@ void torture_ui_test_start(struct torture_context *context,
                           struct torture_tcase *tcase, 
                           struct torture_test *test)
 {
-       if (context->ui_ops->test_start)
-               context->ui_ops->test_start(context, tcase, test);
+       if (context->results->ui_ops->test_start)
+               context->results->ui_ops->test_start(context, tcase, test);
 }
 
 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);
+       if (context->results->ui_ops->test_result)
+               context->results->ui_ops->test_result(context, result, comment);
 
        if (result == TORTURE_ERROR || result == TORTURE_FAIL)
-               context->returncode = false;
+               context->results->returncode = false;
 }
 
 static bool internal_torture_run_test(struct torture_context *context, 
@@ -321,8 +379,8 @@ bool torture_run_tcase(struct torture_context *context,
        context->level++;
 
        context->active_tcase = tcase;
-       if (context->ui_ops->tcase_start) 
-               context->ui_ops->tcase_start(context, tcase);
+       if (context->results->ui_ops->tcase_start) 
+               context->results->ui_ops->tcase_start(context, tcase);
 
        if (tcase->fixture_persistent && tcase->setup 
                && !tcase->setup(context, &tcase->data)) {
@@ -352,8 +410,8 @@ bool torture_run_tcase(struct torture_context *context,
 done:
        context->active_tcase = NULL;
 
-       if (context->ui_ops->tcase_finish)
-               context->ui_ops->tcase_finish(context, tcase);
+       if (context->results->ui_ops->tcase_finish)
+               context->results->ui_ops->tcase_finish(context, tcase);
 
        context->level--;
 
@@ -472,6 +530,9 @@ struct torture_tcase *torture_suite_add_simple_test(
        return tcase;
 }
 
+/**
+ * Add a child testsuite to a testsuite.
+ */
 bool torture_suite_add_suite(struct torture_suite *suite, 
                             struct torture_suite *child)
 {
@@ -486,7 +547,9 @@ bool torture_suite_add_suite(struct torture_suite *suite,
        return true;
 }
 
-
+/**
+ * Find the child testsuite with the specified name.
+ */
 struct torture_suite *torture_find_suite(struct torture_suite *parent, 
                                         const char *name)
 {