summaryrefslogtreecommitdiff
path: root/main/manager.c
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2014-12-04 15:48:08 +0000
committerMatthew Jordan <mjordan@digium.com>2014-12-04 15:48:08 +0000
commit30c34062c312fc3dabc456913d655b4c6970257b (patch)
tree8e2fec1e9666c52604180aa62c1b9acb412edb36 /main/manager.c
parenta83b4ad1dabaa8a0e8f5fba996e18f5b07d8e2a5 (diff)
main/test: Fix race condition between AMI topic and Test Suite topic
This patch fixes a race condition between the raising of test AMI events (which drive many tests in the Asterisk Test Suite) and other AMI events. Prior to this patch, the Stasis messages published to the test topic were not forwarded to the AMI topic. Instead, the code in manager had a dedicated handler for test messages that was independent of the topics forwarded to the AMI topic. This results in no synchronization between the test messages and the rest of the Stasis messages published out over AMI. In some test with very tight timing constraints, this can result in out of order messages and spurious test failures. Properly forwarding the Test Suite topic to the AMI topic ensures that the messages are synchronized properly. This patch does that, and moves the message handling to the Stasis definition of the Test Suite message in test.c as well. Review: https://reviewboard.asterisk.org/r/4221/ ........ Merged revisions 428945 from http://svn.asterisk.org/svn/asterisk/branches/12 git-svn-id: https://origsvn.digium.com/svn/asterisk/branches/13@428946 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/manager.c')
-rw-r--r--main/manager.c51
1 files changed, 5 insertions, 46 deletions
diff --git a/main/manager.c b/main/manager.c
index c2bb62f65..31c541085 100644
--- a/main/manager.c
+++ b/main/manager.c
@@ -1367,7 +1367,8 @@ static struct stasis_forward *rtp_topic_forwarder;
static struct stasis_forward *security_topic_forwarder;
#ifdef TEST_FRAMEWORK
-struct stasis_subscription *test_suite_sub;
+/*! \brief The \ref stasis_subscription for forwarding the Test topic to the AMI topic */
+static struct stasis_forward *test_suite_forwarder;
#endif
#define MGR_SHOW_TERMINAL_WIDTH 80
@@ -8341,49 +8342,6 @@ static void load_channelvars(struct ast_variable *var)
ast_channel_set_manager_vars(args.argc, args.vars);
}
-#ifdef TEST_FRAMEWORK
-
-static void test_suite_event_cb(void *data, struct stasis_subscription *sub,
- struct stasis_message *message)
-{
- struct ast_test_suite_message_payload *payload;
- struct ast_json *blob;
- const char *type;
-
- if (stasis_message_type(message) != ast_test_suite_message_type()) {
- return;
- }
-
- payload = stasis_message_data(message);
- if (!payload) {
- return;
- }
- blob = ast_test_suite_get_blob(payload);
- if (!blob) {
- return;
- }
-
- type = ast_json_string_get(ast_json_object_get(blob, "type"));
- if (ast_strlen_zero(type) || strcmp("testevent", type)) {
- return;
- }
-
- manager_event(EVENT_FLAG_TEST, "TestEvent",
- "Type: StateChange\r\n"
- "State: %s\r\n"
- "AppFile: %s\r\n"
- "AppFunction: %s\r\n"
- "AppLine: %jd\r\n"
- "%s\r\n",
- ast_json_string_get(ast_json_object_get(blob, "state")),
- ast_json_string_get(ast_json_object_get(blob, "appfile")),
- ast_json_string_get(ast_json_object_get(blob, "appfunction")),
- ast_json_integer_get(ast_json_object_get(blob, "line")),
- ast_json_string_get(ast_json_object_get(blob, "data")));
-}
-
-#endif
-
/*!
* \internal
* \brief Free a user record. Should already be removed from the list
@@ -8459,7 +8417,8 @@ static void manager_shutdown(void)
#endif
#ifdef TEST_FRAMEWORK
- stasis_unsubscribe(test_suite_sub);
+ stasis_forward_cancel(test_suite_forwarder);
+ test_suite_forwarder = NULL;
#endif
if (stasis_router) {
@@ -8655,7 +8614,7 @@ static int __init_manager(int reload, int by_external_config)
ast_manager_register_xml_core("BlindTransfer", EVENT_FLAG_CALL, action_blind_transfer);
#ifdef TEST_FRAMEWORK
- test_suite_sub = stasis_subscribe(ast_test_suite_topic(), test_suite_event_cb, NULL);
+ test_suite_forwarder = stasis_forward_all(ast_test_suite_topic(), manager_topic);
#endif
ast_cli_register_multiple(cli_manager, ARRAY_LEN(cli_manager));