summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGeorge Joseph <gjoseph@digium.com>2017-05-24 14:50:56 -0600
committerGeorge Joseph <gjoseph@digium.com>2017-05-24 15:58:18 -0500
commit08edd54c1b11ec35bfa988bf9d3115e6ae9a94f3 (patch)
tree1d429d967a3cd0a7a1598a865c484e51fe987348
parent2e7866ebb7773fdd4f67e80f3747e41d84bcb93b (diff)
unittests: Add a unit test that causes a SEGV and...
...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
-rw-r--r--include/asterisk/test.h8
-rw-r--r--main/test.c4
-rw-r--r--tests/test_pbx.c22
3 files changed, 32 insertions, 2 deletions
diff --git a/include/asterisk/test.h b/include/asterisk/test.h
index 49731feb6..90e772cbc 100644
--- a/include/asterisk/test.h
+++ b/include/asterisk/test.h
@@ -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
diff --git a/main/test.c b/main/test.c
index 062451fb6..f45ad9b62 100644
--- a/main/test.c
+++ b/main/test.c
@@ -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) {
diff --git a/tests/test_pbx.c b/tests/test_pbx.c
index 576fe1fb8..00fa41130 100644
--- a/tests/test_pbx.c
+++ b/tests/test_pbx.c
@@ -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;
}