Add CEL local optimization record type
authorKinsey Moore <kmoore@digium.com>
Sat, 20 Jul 2013 13:25:05 +0000 (13:25 +0000)
committerKinsey Moore <kmoore@digium.com>
Sat, 20 Jul 2013 13:25:05 +0000 (13:25 +0000)
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

CHANGES
include/asterisk/cel.h
main/asterisk.c
main/cel.c
tests/test_cel.c

diff --git a/CHANGES b/CHANGES
index 3634eca..7acf8b0 100644 (file)
--- a/CHANGES
+++ b/CHANGES
@@ -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
index d175688..394c066 100644 (file)
@@ -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,
 };
 
 /*! 
index c7c67e7..7655529 100644 (file)
@@ -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);
        }
index c212dcd..3d0e8e9 100644 (file)
@@ -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.
         */
index 5b64f21..1f49f7e 100644 (file)
@@ -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);