[asterisk-commits] kmoore: trunk r394870 - in /trunk: ./ include/asterisk/ main/ tests/

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Sat Jul 20 08:25:11 CDT 2013


Author: kmoore
Date: Sat Jul 20 08:25:05 2013
New Revision: 394870

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=394870
Log:
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/

Modified:
    trunk/CHANGES
    trunk/include/asterisk/cel.h
    trunk/main/asterisk.c
    trunk/main/cel.c
    trunk/tests/test_cel.c

Modified: trunk/CHANGES
URL: http://svnview.digium.com/svn/asterisk/trunk/CHANGES?view=diff&rev=394870&r1=394869&r2=394870
==============================================================================
--- trunk/CHANGES (original)
+++ trunk/CHANGES Sat Jul 20 08:25:05 2013
@@ -336,6 +336,10 @@
    bridge unique identifier. For transfers that occur between a bridged channel
    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
 -------------------

Modified: trunk/include/asterisk/cel.h
URL: http://svnview.digium.com/svn/asterisk/trunk/include/asterisk/cel.h?view=diff&rev=394870&r1=394869&r2=394870
==============================================================================
--- trunk/include/asterisk/cel.h (original)
+++ trunk/include/asterisk/cel.h Sat Jul 20 08:25:05 2013
@@ -87,6 +87,8 @@
 	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,
 };
 
 /*! 

Modified: trunk/main/asterisk.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/asterisk.c?view=diff&rev=394870&r1=394869&r2=394870
==============================================================================
--- trunk/main/asterisk.c (original)
+++ trunk/main/asterisk.c Sat Jul 20 08:25:05 2013
@@ -4341,12 +4341,12 @@
 		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);
 	}

Modified: trunk/main/cel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/main/cel.c?view=diff&rev=394870&r1=394869&r2=394870
==============================================================================
--- trunk/main/cel.c (original)
+++ trunk/main/cel.c Sat Jul 20 08:25:05 2013
@@ -62,6 +62,7 @@
 #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 @@
 						<enum name="3WAY_END"/>
 						<enum name="HOOKFLASH"/>
 						<enum name="LINKEDID_END"/>
-
+						<enum name="LOCAL_OPTIMIZE"/>
 					</enumlist>
 					</description>
 				</configOption>
@@ -319,6 +320,7 @@
 	[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 @@
 	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 @@
 		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.
 	 */

Modified: trunk/tests/test_cel.c
URL: http://svnview.digium.com/svn/asterisk/trunk/tests/test_cel.c?view=diff&rev=394870&r1=394869&r2=394870
==============================================================================
--- trunk/tests/test_cel.c (original)
+++ trunk/tests/test_cel.c Sat Jul 20 08:25:05 2013
@@ -49,6 +49,7 @@
 #include "asterisk/stasis_bridging.h"
 #include "asterisk/json.h"
 #include "asterisk/features.h"
+#include "asterisk/core_local.h"
 
 #define TEST_CATEGORY "/main/cel/"
 
@@ -1492,6 +1493,63 @@
 
 	HANGUP_CHANNEL(chan_caller, AST_CAUSE_NORMAL, "ANSWER");
 	HANGUP_CHANNEL(chan_callee, AST_CAUSE_NORMAL, "");
+
+	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;
 }
@@ -1909,6 +1967,8 @@
 
 	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 @@
 	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 @@
 
 	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);




More information about the asterisk-commits mailing list