unittests: Add a unit test that causes a SEGV and...
authorGeorge Joseph <gjoseph@digium.com>
Wed, 24 May 2017 20:50:56 +0000 (14:50 -0600)
committerGeorge Joseph <gjoseph@digium.com>
Wed, 24 May 2017 20:58:18 +0000 (15:58 -0500)
...that can only be run by explicitly calling it with
'test execute category /DO_NOT_RUN/ name RAISE_SEGV'

This allows us to more easily test CI and debugging tools that
should do certain things when asterisk coredumps.

To allow this a new member was added to the ast_test_info
structure named 'explicit_only'.  If set by a test, the test
will be skipped during a 'test execute all' or
'test execute category ...'.

Change-Id: Ia3a11856aae4887df9a02b6b081cc777b36eb6ed

include/asterisk/test.h
main/test.c
tests/test_pbx.c

index 49731fe..90e772c 100644 (file)
@@ -241,6 +241,14 @@ struct ast_test_info {
         * \note The description must not end with a newline.
         */
        const char *description;
+       /*!
+        * \brief Only run if explicitly named
+        *
+        * \details
+        * Run this test only if it's explicitly named on the command line.
+        * Do NOT run it as part of an execute category or execute all command.
+        */
+       unsigned int explicit_only;
 };
 
 #ifdef TEST_FRAMEWORK
index 062451f..f45ad9b 100644 (file)
@@ -344,7 +344,7 @@ static int test_execute_multiple(const char *name, const char *category, struct
                execute = 0;
                switch (mode) {
                case TEST_CATEGORY:
-                       if (!test_cat_cmp(test->info.category, category)) {
+                       if (!test_cat_cmp(test->info.category, category) && !test->info.explicit_only) {
                                execute = 1;
                        }
                        break;
@@ -354,7 +354,7 @@ static int test_execute_multiple(const char *name, const char *category, struct
                        }
                        break;
                case TEST_ALL:
-                       execute = 1;
+                       execute = !test->info.explicit_only;
                }
 
                if (execute) {
index 576fe1f..00fa411 100644 (file)
@@ -321,8 +321,29 @@ cleanup:
        return res;
 }
 
+AST_TEST_DEFINE(segv)
+{
+       switch (cmd) {
+       case TEST_INIT:
+               info->name = "RAISE_SEGV";
+               info->category = "/DO_NOT_RUN/";
+               info->summary = "RAISES SEGV!!! (will only be run if explicitly called)";
+               info->description = "RAISES SEGV!!! (will only be run if explicitly called). "
+                       "This test is mainly used for testing CI and tool failure scenarios.";
+               info->explicit_only = 1;
+               return AST_TEST_NOT_RUN;
+       case TEST_EXECUTE:
+               break;
+       }
+
+       raise(SIGSEGV);
+
+       return AST_TEST_FAIL;
+}
+
 static int unload_module(void)
 {
+       AST_TEST_UNREGISTER(segv);
        AST_TEST_UNREGISTER(pattern_match_test);
        return 0;
 }
@@ -330,6 +351,7 @@ static int unload_module(void)
 static int load_module(void)
 {
        AST_TEST_REGISTER(pattern_match_test);
+       AST_TEST_REGISTER(segv);
        return AST_MODULE_LOAD_SUCCESS;
 }