diff --git a/main/manager.c b/main/manager.c index 6adce5fc55..73a5bb50d8 100644 --- a/main/manager.c +++ b/main/manager.c @@ -1375,7 +1375,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 @@ -8360,49 +8361,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 @@ -8478,7 +8436,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) { @@ -8674,7 +8633,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)); diff --git a/main/test.c b/main/test.c index c144d3eb40..1ad7b238cc 100644 --- a/main/test.c +++ b/main/test.c @@ -56,11 +56,6 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$"); */ struct stasis_topic *test_suite_topic; -/*! \since 12 - * \brief The message type for test suite messages - */ -STASIS_MESSAGE_TYPE_DEFN(ast_test_suite_message_type); - /*! This array corresponds to the values defined in the ast_test_state enum */ static const char * const test_result2str[] = { [AST_TEST_NOT_RUN] = "NOT RUN", @@ -1012,6 +1007,51 @@ struct ast_json *ast_test_suite_get_blob(struct ast_test_suite_message_payload * return payload->blob; } +static struct ast_manager_event_blob *test_suite_event_to_ami(struct stasis_message *msg) +{ + RAII_VAR(struct ast_str *, packet_string, ast_str_create(128), ast_free); + struct ast_test_suite_message_payload *payload; + struct ast_json *blob; + const char *type; + + payload = stasis_message_data(msg); + if (!payload) { + return NULL; + } + blob = ast_test_suite_get_blob(payload); + if (!blob) { + return NULL; + } + + type = ast_json_string_get(ast_json_object_get(blob, "type")); + if (ast_strlen_zero(type) || strcmp("testevent", type)) { + return NULL; + } + + ast_str_append(&packet_string, 0, "Type: StateChange\r\n"); + ast_str_append(&packet_string, 0, "State: %s\r\n", + ast_json_string_get(ast_json_object_get(blob, "state"))); + ast_str_append(&packet_string, 0, "AppFile: %s\r\n", + ast_json_string_get(ast_json_object_get(blob, "appfile"))); + ast_str_append(&packet_string, 0, "AppFunction: %s\r\n", + ast_json_string_get(ast_json_object_get(blob, "appfunction"))); + ast_str_append(&packet_string, 0, "AppLine: %ld\r\n", + ast_json_integer_get(ast_json_object_get(blob, "line"))); + ast_str_append(&packet_string, 0, "%s\r\n", + ast_json_string_get(ast_json_object_get(blob, "data"))); + + return ast_manager_event_blob_create(EVENT_FLAG_REPORTING, + "TestEvent", + "%s", + ast_str_buffer(packet_string)); +} + +/*! \since 12 + * \brief The message type for test suite messages + */ +STASIS_MESSAGE_TYPE_DEFN(ast_test_suite_message_type, + .to_ami = test_suite_event_to_ami); + void __ast_test_suite_event_notify(const char *file, const char *func, int line, const char *state, const char *fmt, ...) { RAII_VAR(struct ast_test_suite_message_payload *, payload,