r24872: Use torture API a bit more
[kai/samba.git] / source4 / torture / ui.c
index 24e229e87342941f150bb05dfb4d4e2fa57d0373..f26909bd838a9bb5027cefa53d8a299a5a53acd4 100644 (file)
@@ -6,7 +6,7 @@
    
    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,
@@ -15,8 +15,7 @@
    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"
@@ -24,8 +23,7 @@
 #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;
@@ -41,8 +39,24 @@ void torture_comment(struct torture_context *context,
        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;
 
@@ -98,7 +112,7 @@ struct torture_test *torture_tcase_add_test(struct torture_tcase *tcase,
        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 *);
@@ -106,11 +120,11 @@ struct torture_test *torture_tcase_add_test(struct torture_tcase *tcase,
        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;
@@ -120,6 +134,18 @@ struct torture_tcase *torture_suite_add_tcase(struct torture_suite *suite,
 
        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;
 }
 
@@ -129,13 +155,18 @@ BOOL torture_run_suite(struct torture_context *context,
        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);
@@ -145,6 +176,9 @@ BOOL torture_run_suite(struct torture_context *context,
                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);
 
@@ -161,6 +195,19 @@ void torture_ui_test_start(struct torture_context *context,
                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)
@@ -168,13 +215,8 @@ void torture_ui_test_result(struct torture_context *context,
        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, 
@@ -183,16 +225,17 @@ 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;
@@ -202,17 +245,30 @@ static BOOL internal_torture_run_test(struct torture_context *context,
        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;
 
@@ -226,6 +282,7 @@ BOOL torture_run_tcase(struct torture_context *context,
                                           struct torture_tcase *tcase)
 {
        BOOL ret = True;
+       char *old_testname;
        struct torture_test *test;
 
        context->level++;
@@ -240,10 +297,15 @@ BOOL torture_run_tcase(struct torture_context *context,
                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))
@@ -273,6 +335,12 @@ int torture_setting_int(struct torture_context *test, const char *name,
        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)
 {
@@ -319,7 +387,7 @@ struct torture_tcase *torture_suite_add_simple_tcase(
        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 *);
 
@@ -386,3 +454,37 @@ struct torture_suite *torture_find_suite(struct torture_suite *parent,
 
        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;
+}
+
+