diff options
author | Kinsey Moore <kmoore@digium.com> | 2013-07-20 13:25:05 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2013-07-20 13:25:05 +0000 |
commit | c3b8939be8af2d297104e9afae7e81517d34c1d5 (patch) | |
tree | 1569c9afe53dc79d89d37dc701ac3b87d7fa5d5a | |
parent | 684c83b29b88d219aa406d0aa1673ee338c9159d (diff) |
Add CEL local optimization record type
This adds a new CEL event type, AST_CEL_LOCAL_OPTIMIZE, to represent
local channel optimizations. Local channel optimizations were one of
several things conveyed by the now defunct BRIDGE_UPDATE event type.
This also adds a unit test to test generation of this new CEL event.
Review: https://reviewboard.asterisk.org/r/2676/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@394870 65c4cc65-6c06-0410-ace0-fbb531ad65f3
-rw-r--r-- | CHANGES | 4 | ||||
-rw-r--r-- | include/asterisk/cel.h | 2 | ||||
-rw-r--r-- | main/asterisk.c | 4 | ||||
-rw-r--r-- | main/cel.c | 25 | ||||
-rw-r--r-- | tests/test_cel.c | 63 |
5 files changed, 95 insertions, 3 deletions
@@ -337,6 +337,10 @@ CEL (Channel Event Logging) and a channel running an app, the 'extra' JSON blob contains the primary bridge unique identifier, the secondary channel name, and the app name. + * AST_CEL_LOCAL_OPTIMIZE events have been added to convey local channel + optimizations with the record occurring for the semi-one channel and + the semi-two channel name in the peer field. + Features ------------------- * The BRIDGE_FEATURES channel variable would previously only set features for diff --git a/include/asterisk/cel.h b/include/asterisk/cel.h index d17568824..394c0667d 100644 --- a/include/asterisk/cel.h +++ b/include/asterisk/cel.h @@ -87,6 +87,8 @@ enum ast_cel_event_type { AST_CEL_FORWARD = 25, /*! \brief a bridge turned into a conference and will be treated as such until it is torn down */ AST_CEL_BRIDGE_TO_CONF = 26, + /*! \brief A local channel optimization occurred */ + AST_CEL_LOCAL_OPTIMIZE = 27, }; /*! diff --git a/main/asterisk.c b/main/asterisk.c index c7c67e795..76555293e 100644 --- a/main/asterisk.c +++ b/main/asterisk.c @@ -4341,12 +4341,12 @@ int main(int argc, char *argv[]) exit(1); } - if (ast_cel_engine_init()) { + if (ast_local_init()) { printf("%s", term_quit()); exit(1); } - if (ast_local_init()) { + if (ast_cel_engine_init()) { printf("%s", term_quit()); exit(1); } diff --git a/main/cel.c b/main/cel.c index c212dcd7b..3d0e8e991 100644 --- a/main/cel.c +++ b/main/cel.c @@ -62,6 +62,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/bridging.h" #include "asterisk/parking.h" #include "asterisk/features.h" +#include "asterisk/core_local.h" /*** DOCUMENTATION <configInfo name="cel" language="en_US"> @@ -113,7 +114,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") <enum name="3WAY_END"/> <enum name="HOOKFLASH"/> <enum name="LINKEDID_END"/> - + <enum name="LOCAL_OPTIMIZE"/> </enumlist> </description> </configOption> @@ -319,6 +320,7 @@ static const char * const cel_event_types[CEL_MAX_EVENT_IDS] = { [AST_CEL_3WAY_END] = "3WAY_END", [AST_CEL_HOOKFLASH] = "HOOKFLASH", [AST_CEL_LINKEDID_END] = "LINKEDID_END", + [AST_CEL_LOCAL_OPTIMIZE] = "LOCAL_OPTIMIZE", }; struct bridge_assoc { @@ -1473,6 +1475,22 @@ static void cel_pickup_cb( cel_report_event(target, AST_CEL_PICKUP, NULL, NULL, channel->name); } +static void cel_local_cb( + void *data, struct stasis_subscription *sub, + struct stasis_topic *topic, + struct stasis_message *message) +{ + struct ast_multi_channel_blob *obj = stasis_message_data(message); + struct ast_channel_snapshot *localone = ast_multi_channel_blob_get_channel(obj, "1"); + struct ast_channel_snapshot *localtwo = ast_multi_channel_blob_get_channel(obj, "2"); + + if (!localone || !localtwo) { + return; + } + + cel_report_event(localone, AST_CEL_LOCAL_OPTIMIZE, NULL, NULL, localtwo->name); +} + static void ast_cel_engine_term(void) { aco_info_destroy(&cel_cfg_info); @@ -1609,6 +1627,11 @@ int ast_cel_engine_init(void) cel_pickup_cb, NULL); + ret |= stasis_message_router_add(cel_state_router, + ast_local_optimization_end_type(), + cel_local_cb, + NULL); + /* If somehow we failed to add any routes, just shut down the whole * thing and fail it. */ diff --git a/tests/test_cel.c b/tests/test_cel.c index 5b64f21cb..1f49f7e89 100644 --- a/tests/test_cel.c +++ b/tests/test_cel.c @@ -49,6 +49,7 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") #include "asterisk/stasis_bridging.h" #include "asterisk/json.h" #include "asterisk/features.h" +#include "asterisk/core_local.h" #define TEST_CATEGORY "/main/cel/" @@ -1496,6 +1497,63 @@ AST_TEST_DEFINE(test_cel_dial_pickup) return AST_TEST_PASS; } +AST_TEST_DEFINE(test_cel_local_optimize) +{ + RAII_VAR(struct ast_channel *, chan_alice, NULL, safe_channel_release); + RAII_VAR(struct ast_channel *, chan_bob, NULL, safe_channel_release); + struct ast_party_caller alice_caller = ALICE_CALLERID; + struct ast_party_caller bob_caller = BOB_CALLERID; + RAII_VAR(struct ast_multi_channel_blob *, mc_blob, NULL, ao2_cleanup); + RAII_VAR(struct ast_channel_snapshot *, alice_snapshot, NULL, ao2_cleanup); + RAII_VAR(struct ast_channel_snapshot *, bob_snapshot, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, local_opt_begin, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, local_opt_end, NULL, ao2_cleanup); + + switch (cmd) { + case TEST_INIT: + info->name = __func__; + info->category = TEST_CATEGORY; + info->summary = "Test local channel optimization record generation"; + info->description = + "Test CEL records for two local channels being optimized\n" + "out by sending a messages indicating local optimization\n" + "begin and end\n"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + mc_blob = ast_multi_channel_blob_create(ast_json_null()); + ast_test_validate(test, mc_blob != NULL); + + CREATE_ALICE_CHANNEL(chan_alice, &alice_caller); + CREATE_BOB_CHANNEL(chan_bob, &bob_caller); + + alice_snapshot = ast_channel_snapshot_create(chan_alice); + ast_test_validate(test, alice_snapshot != NULL); + + bob_snapshot = ast_channel_snapshot_create(chan_bob); + ast_test_validate(test, bob_snapshot != NULL); + + ast_multi_channel_blob_add_channel(mc_blob, "1", alice_snapshot); + ast_multi_channel_blob_add_channel(mc_blob, "2", bob_snapshot); + + local_opt_begin = stasis_message_create(ast_local_optimization_begin_type(), mc_blob); + ast_test_validate(test, local_opt_begin != NULL); + + local_opt_end = stasis_message_create(ast_local_optimization_end_type(), mc_blob); + ast_test_validate(test, local_opt_end != NULL); + + stasis_publish(ast_channel_topic(chan_alice), local_opt_begin); + stasis_publish(ast_channel_topic(chan_alice), local_opt_end); + APPEND_EVENT_SNAPSHOT(alice_snapshot, AST_CEL_LOCAL_OPTIMIZE, NULL, NULL, bob_snapshot->name); + + HANGUP_CHANNEL(chan_alice, AST_CAUSE_NORMAL, ""); + HANGUP_CHANNEL(chan_bob, AST_CAUSE_NORMAL, ""); + + return AST_TEST_PASS; +} + /*! Subscription for CEL events */ static struct ast_event_sub *event_sub = NULL; @@ -1909,6 +1967,8 @@ static int unload_module(void) AST_TEST_UNREGISTER(test_cel_dial_pickup); + AST_TEST_UNREGISTER(test_cel_local_optimize); + ast_channel_unregister(&test_cel_chan_tech); ao2_cleanup(cel_test_config); @@ -1947,6 +2007,7 @@ static int load_module(void) cel_test_config->events |= 1<<AST_CEL_BLINDTRANSFER; cel_test_config->events |= 1<<AST_CEL_ATTENDEDTRANSFER; cel_test_config->events |= 1<<AST_CEL_PICKUP; + cel_test_config->events |= 1<<AST_CEL_LOCAL_OPTIMIZE; ast_channel_register(&test_cel_chan_tech); @@ -1979,6 +2040,8 @@ static int load_module(void) AST_TEST_REGISTER(test_cel_dial_pickup); + AST_TEST_REGISTER(test_cel_local_optimize); + /* ast_test_register_* has to happen after AST_TEST_REGISTER */ /* Verify received vs expected events and clean things up after every test */ ast_test_register_init(TEST_CATEGORY, test_cel_init_cb); |