@ -160,12 +160,6 @@ static void do_sleep(void)
/*! \brief David's Caller ID */
/*! \brief David's Caller ID */
# define DAVID_CALLERID { .id.name.str = "David", .id.name.valid = 1, .id.number.str = "400", .id.number.valid = 1, }
# define DAVID_CALLERID { .id.name.str = "David", .id.name.valid = 1, .id.number.str = "400", .id.number.valid = 1, }
/*! \brief Eve's Caller ID */
# define EVE_CALLERID { .id.name.str = "Eve", .id.name.valid = 1, .id.number.str = "500", .id.number.valid = 1, }
/*! \brief Fred's Caller ID */
# define FRED_CALLERID { .id.name.str = "Fred", .id.name.valid = 1, .id.number.str = "600", .id.number.valid = 1, }
/*! \brief Create a \ref test_cel_chan_tech for Alice. */
/*! \brief Create a \ref test_cel_chan_tech for Alice. */
# define CREATE_ALICE_CHANNEL(channel_var, caller_id) do { \
# define CREATE_ALICE_CHANNEL(channel_var, caller_id) do { \
( channel_var ) = ast_channel_alloc ( 0 , AST_STATE_DOWN , ( caller_id ) - > id . number . str , ( caller_id ) - > id . name . str , " 100 " , " 100 " , " default " , NULL , 0 , CHANNEL_TECH_NAME " /Alice " ) ; \
( channel_var ) = ast_channel_alloc ( 0 , AST_STATE_DOWN , ( caller_id ) - > id . number . str , ( caller_id ) - > id . name . str , " 100 " , " 100 " , " default " , NULL , 0 , CHANNEL_TECH_NAME " /Alice " ) ; \
@ -190,18 +184,6 @@ static void do_sleep(void)
APPEND_EVENT ( channel_var , AST_CEL_CHANNEL_START , NULL , NULL , NULL ) ; \
APPEND_EVENT ( channel_var , AST_CEL_CHANNEL_START , NULL , NULL , NULL ) ; \
} while ( 0 )
} while ( 0 )
/*! \brief Create a \ref test_cel_chan_tech for Eve. */
# define CREATE_EVE_CHANNEL(channel_var, caller_id) do { \
( channel_var ) = ast_channel_alloc ( 0 , AST_STATE_DOWN , ( caller_id ) - > id . number . str , ( caller_id ) - > id . name . str , " 500 " , " 500 " , " default " , NULL , 0 , CHANNEL_TECH_NAME " /Eve " ) ; \
APPEND_EVENT ( channel_var , AST_CEL_CHANNEL_START , NULL , NULL , NULL ) ; \
} while ( 0 )
/*! \brief Create a \ref test_cel_chan_tech for Eve. */
# define CREATE_FRED_CHANNEL(channel_var, caller_id) do { \
( channel_var ) = ast_channel_alloc ( 0 , AST_STATE_DOWN , ( caller_id ) - > id . number . str , ( caller_id ) - > id . name . str , " 600 " , " 600 " , " default " , NULL , 0 , CHANNEL_TECH_NAME " /Fred " ) ; \
APPEND_EVENT ( channel_var , AST_CEL_CHANNEL_START , NULL , NULL , NULL ) ; \
} while ( 0 )
/*! \brief Emulate a channel entering into an application */
/*! \brief Emulate a channel entering into an application */
# define EMULATE_APP_DATA(channel, priority, application, data) do { \
# define EMULATE_APP_DATA(channel, priority, application, data) do { \
if ( ( priority ) > 0 ) { \
if ( ( priority ) > 0 ) { \
@ -609,13 +591,17 @@ AST_TEST_DEFINE(test_cel_single_multiparty_bridge)
ANSWER_CHANNEL ( chan_charlie ) ;
ANSWER_CHANNEL ( chan_charlie ) ;
EMULATE_APP_DATA ( chan_charlie , 2 , " Bridge " , " " ) ;
EMULATE_APP_DATA ( chan_charlie , 2 , " Bridge " , " " ) ;
do_sleep ( ) ;
ast_bridge_impart ( bridge , chan_charlie , NULL , NULL , 0 ) ;
ast_bridge_impart ( bridge , chan_charlie , NULL , NULL , 0 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF ( chan_alice , chan_bob , chan_charlie , bridge ) ;
BRIDGE_TO_CONF ( chan_alice , chan_bob , chan_charlie , bridge ) ;
CONF_EXIT ( chan_alice , bridge ) ;
CONF_EXIT ( chan_alice , bridge ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_bob , bridge ) ;
CONF_EXIT ( chan_bob , bridge ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_charlie , bridge ) ;
CONF_EXIT ( chan_charlie , bridge ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
@ -1043,21 +1029,32 @@ AST_TEST_DEFINE(test_cel_dial_answer_multiparty)
EMULATE_DIAL ( chan_alice , CHANNEL_TECH_NAME " /Bob " ) ;
EMULATE_DIAL ( chan_alice , CHANNEL_TECH_NAME " /Bob " ) ;
START_DIALED ( chan_alice , chan_bob ) ;
START_DIALED ( chan_alice , chan_bob ) ;
do_sleep ( ) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
do_sleep ( ) ;
EMULATE_DIAL ( chan_charlie , CHANNEL_TECH_NAME " /Bob " ) ;
EMULATE_DIAL ( chan_charlie , CHANNEL_TECH_NAME " /Bob " ) ;
do_sleep ( ) ;
START_DIALED_FULL ( chan_charlie , chan_david , " 400 " , " David " ) ;
START_DIALED_FULL ( chan_charlie , chan_david , " 400 " , " David " ) ;
ast_channel_state_set ( chan_alice , AST_STATE_RINGING ) ;
ast_channel_state_set ( chan_alice , AST_STATE_RINGING ) ;
do_sleep ( ) ;
ast_channel_state_set ( chan_charlie , AST_STATE_RINGING ) ;
ast_channel_state_set ( chan_charlie , AST_STATE_RINGING ) ;
do_sleep ( ) ;
ast_channel_publish_dial ( chan_alice , chan_bob , NULL , " ANSWER " ) ;
ast_channel_publish_dial ( chan_alice , chan_bob , NULL , " ANSWER " ) ;
do_sleep ( ) ;
ast_channel_publish_dial ( chan_charlie , chan_david , NULL , " ANSWER " ) ;
ast_channel_publish_dial ( chan_charlie , chan_david , NULL , " ANSWER " ) ;
do_sleep ( ) ;
ANSWER_NO_APP ( chan_alice ) ;
ANSWER_NO_APP ( chan_alice ) ;
do_sleep ( ) ;
ANSWER_NO_APP ( chan_bob ) ;
ANSWER_NO_APP ( chan_bob ) ;
do_sleep ( ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_charlie ) ;
do_sleep ( ) ;
ANSWER_NO_APP ( chan_david ) ;
ANSWER_NO_APP ( chan_david ) ;
do_sleep ( ) ;
do_sleep ( ) ;
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge , chan_charlie , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge , chan_charlie , NULL , NULL , 0 ) ) ;
@ -1075,8 +1072,11 @@ AST_TEST_DEFINE(test_cel_dial_answer_multiparty)
CONF_ENTER_EVENT ( chan_alice , bridge ) ;
CONF_ENTER_EVENT ( chan_alice , bridge ) ;
CONF_EXIT ( chan_alice , bridge ) ;
CONF_EXIT ( chan_alice , bridge ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_bob , bridge ) ;
CONF_EXIT ( chan_bob , bridge ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_charlie , bridge ) ;
CONF_EXIT ( chan_charlie , bridge ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_david , bridge ) ;
CONF_EXIT ( chan_david , bridge ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " ANSWER " ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " ANSWER " ) ;
@ -1147,13 +1147,13 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_swap)
RAII_VAR ( struct ast_channel * , chan_alice , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_alice , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_ fre d, NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_ davi d, NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller fre d_caller = ALICE_CALLERID ;
struct ast_party_caller davi d_caller = ALICE_CALLERID ;
switch ( cmd ) {
switch ( cmd ) {
case TEST_INIT :
case TEST_INIT :
@ -1188,27 +1188,27 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_swap)
bridge2 = ast_bridge_basic_new ( ) ;
bridge2 = ast_bridge_basic_new ( ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
CREATE_ FRED_CHANNEL( chan_fred , & fre d_caller) ;
CREATE_ DAVID_CHANNEL( chan_david , & davi d_caller) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
ANSWER_NO_APP ( chan_ fre d) ;
ANSWER_NO_APP ( chan_ davi d) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_ fre d, NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_ davi d, NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_ fre d) ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_ davi d) ) ;
/* Perform attended transfer */
/* Perform attended transfer */
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_END , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_END , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
ast_bridge_transfer_attended ( chan_alice , chan_ fre d) ;
ast_bridge_transfer_attended ( chan_alice , chan_ davi d) ;
do_sleep ( ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF ( chan_charlie , chan_ fre d, chan_bob , bridge2 ) ;
BRIDGE_TO_CONF ( chan_charlie , chan_ davi d, chan_bob , bridge2 ) ;
CONF_EXIT_EVENT ( chan_ fre d, bridge2 ) ;
CONF_EXIT_EVENT ( chan_ davi d, bridge2 ) ;
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_ fre d, bridge2 ) ;
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_ davi d, bridge2 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_bob , bridge2 ) ;
CONF_EXIT ( chan_bob , bridge2 ) ;
@ -1220,7 +1220,7 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_swap)
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_ fre d, AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_ davi d, AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_charlie , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_charlie , AST_CAUSE_NORMAL , " " ) ;
@ -1233,19 +1233,12 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_merge)
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_david , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_david , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_eve , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_fred , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_channel_snapshot * , eve_tmp_snapshot , NULL , ao2_cleanup ) ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller david_caller = DAVID_CALLERID ;
struct ast_party_caller david_caller = ALICE_CALLERID ;
struct ast_party_caller eve_caller = EVE_CALLERID ;
struct ast_party_caller fred_caller = EVE_CALLERID ;
struct ast_bridge_channel_pair transferee ;
struct ast_bridge_channel_pair target ;
switch ( cmd ) {
switch ( cmd ) {
case TEST_INIT :
case TEST_INIT :
@ -1254,7 +1247,7 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_merge)
info - > summary = " Test attended transfers between two pairs of "
info - > summary = " Test attended transfers between two pairs of "
" bridged parties that results in a bridge merge " ;
" bridged parties that results in a bridge merge " ;
info - > description =
info - > description =
" This test creates six channels, places each triplet "
" This test creates four channels, places each pair "
" in a bridge, and then attended transfers the bridges "
" in a bridge, and then attended transfers the bridges "
" together causing a bridge merge. \n " ;
" together causing a bridge merge. \n " ;
return AST_TEST_NOT_RUN ;
return AST_TEST_NOT_RUN ;
@ -1262,15 +1255,14 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_merge)
break ;
break ;
}
}
/* Create first set of bridged parties */
/* Create first set of bridged parties */
bridge1 = ast_bridge_basic_new ( ) ;
bridge1 = ast_bridge_base_new ( AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_MULTIMIX ,
AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_SMART ) ;
ast_test_validate ( test , bridge1 ! = NULL ) ;
ast_test_validate ( test , bridge1 ! = NULL ) ;
CREATE_ALICE_CHANNEL ( chan_alice , & alice_caller ) ;
CREATE_ALICE_CHANNEL ( chan_alice , & alice_caller ) ;
CREATE_BOB_CHANNEL ( chan_bob , & bob_caller ) ;
CREATE_BOB_CHANNEL ( chan_bob , & bob_caller ) ;
CREATE_DAVID_CHANNEL ( chan_david , & david_caller ) ;
ANSWER_NO_APP ( chan_alice ) ;
ANSWER_NO_APP ( chan_alice ) ;
ANSWER_NO_APP ( chan_bob ) ;
ANSWER_NO_APP ( chan_bob ) ;
ANSWER_NO_APP ( chan_david ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_bob , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_bob , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
@ -1279,82 +1271,46 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_merge)
do_sleep ( ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_david , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF ( chan_bob , chan_alice , chan_david , bridge1 ) ;
/* Create second set of bridged parties */
/* Create second set of bridged parties */
bridge2 = ast_bridge_basic_new ( ) ;
bridge2 = ast_bridge_base_new ( AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_MULTIMIX ,
AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_SMART ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
CREATE_ FRED_CHANNEL( chan_fred , & fre d_caller) ;
CREATE_ DAVID_CHANNEL( chan_david , & davi d_caller) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_EVE_CHANNEL ( chan_eve , & eve_caller ) ;
ANSWER_NO_APP ( chan_david ) ;
ANSWER_NO_APP ( chan_fred ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_eve ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_fred , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_david , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_fred ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_eve , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF ( chan_charlie , chan_fred , chan_eve , bridge2 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_david ) ) ;
/* Perform attended transfer */
/* Perform attended transfer */
CONF_EXIT ( chan_eve , bridge2 ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_END , NULL , NULL , ast_channel_name ( chan_david ) ) ;
do_sleep ( ) ;
CONF_EXIT_EVENT ( chan_charlie , bridge2 ) ;
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_depart ( chan_charlie ) ) ; \
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_charlie , NULL , NULL , 0 ) ) ; \
do_sleep ( ) ;
CONF_ENTER_EVENT ( chan_charlie , bridge1 ) ; \
do_sleep ( ) ;
CONF_EXIT_EVENT ( chan_charlie , bridge1 ) ;
/* Fred goes away */
ast_bridge_transfer_attended ( chan_alice , chan_david ) ;
CONF_EXIT ( chan_fred , bridge2 ) ;
do_sleep ( ) ;
/*CONF_EXIT_EVENT(chan_eve, bridge1);
do_sleep ( ) ;
do_sleep ( ) ;
ast_test_validate( test , 0 = = ast_bridge_depart ( chan_eve ) ) ; \
BRIDGE_TO_CONF ( chan_bob , chan_alice , chan_charlie , bridge1 ) ;
do_sleep( ) ; */
CONF_EXIT_EVENT ( chan_alice , bridge1 ) ;
/* Alice goes away */
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_david , bridge2 ) ;
CONF_EXIT ( chan_alice , bridge1 ) ;
do_sleep ( ) ;
transferee . bridge = bridge1 ;
transferee . channel = chan_alice ;
target . bridge = bridge2 ;
target . channel = chan_fred ;
ast_bridge_publish_attended_transfer_bridge_merge ( 1 , AST_BRIDGE_TRANSFER_SUCCESS ,
& transferee , & target , bridge1 ) ;
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_fred , bridge2 ) ;
CONF_EXIT ( chan_bob , bridge1 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_ david , bridge1 ) ;
CONF_EXIT ( chan_bob , bridge1 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_charlie , bridge1 ) ;
HANGUP_CHANNEL ( chan_fred , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_charlie , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_david , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_david , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_ ev e, AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_ charli e, AST_CAUSE_NORMAL , " " ) ;
return AST_TEST_PASS ;
return AST_TEST_PASS ;
}
}
@ -1365,17 +1321,12 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_link)
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_bob , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_charlie , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_david , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_david , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_eve , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_channel * , chan_fred , NULL , safe_channel_release ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge1 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_bridge * , bridge2 , NULL , ao2_cleanup ) ;
RAII_VAR ( struct ast_channel_snapshot * , eve_tmp_snapshot , NULL , ao2_cleanup ) ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller alice_caller = ALICE_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller bob_caller = BOB_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller charlie_caller = CHARLIE_CALLERID ;
struct ast_party_caller david_caller = DAVID_CALLERID ;
struct ast_party_caller david_caller = ALICE_CALLERID ;
struct ast_party_caller eve_caller = EVE_CALLERID ;
struct ast_party_caller fred_caller = EVE_CALLERID ;
switch ( cmd ) {
switch ( cmd ) {
case TEST_INIT :
case TEST_INIT :
@ -1384,9 +1335,9 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_link)
info - > summary = " Test attended transfers between two pairs of "
info - > summary = " Test attended transfers between two pairs of "
" bridged parties that results in a bridge merge " ;
" bridged parties that results in a bridge merge " ;
info - > description =
info - > description =
" This test creates six channels, places each triplet "
" This test creates four channels, places each pair "
" in a bridge, and then attended transfers the bridges "
" in a bridge, and then attended transfers the bridges "
" together causing a bridge merge .\n " ;
" together causing a bridge link .\n " ;
return AST_TEST_NOT_RUN ;
return AST_TEST_NOT_RUN ;
case TEST_EXECUTE :
case TEST_EXECUTE :
break ;
break ;
@ -1394,15 +1345,14 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_link)
/* Create first set of bridged parties */
/* Create first set of bridged parties */
bridge1 = ast_bridge_base_new ( AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_MULTIMIX ,
bridge1 = ast_bridge_base_new ( AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_MULTIMIX ,
AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM
AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM
| AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM | AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_SMART ) ;
| AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM
| AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_SMART ) ;
ast_test_validate ( test , bridge1 ! = NULL ) ;
ast_test_validate ( test , bridge1 ! = NULL ) ;
CREATE_ALICE_CHANNEL ( chan_alice , & alice_caller ) ;
CREATE_ALICE_CHANNEL ( chan_alice , & alice_caller ) ;
CREATE_BOB_CHANNEL ( chan_bob , & bob_caller ) ;
CREATE_BOB_CHANNEL ( chan_bob , & bob_caller ) ;
CREATE_DAVID_CHANNEL ( chan_david , & david_caller ) ;
ANSWER_NO_APP ( chan_alice ) ;
ANSWER_NO_APP ( chan_alice ) ;
ANSWER_NO_APP ( chan_bob ) ;
ANSWER_NO_APP ( chan_bob ) ;
ANSWER_NO_APP ( chan_david ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_bob , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_bob , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
@ -1411,80 +1361,67 @@ AST_TEST_DEFINE(test_cel_attended_transfer_bridges_link)
do_sleep ( ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
APPEND_EVENT ( chan_bob , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_alice ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge1 , chan_david , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF ( chan_bob , chan_alice , chan_david , bridge1 ) ;
/* Create second set of bridged parties */
/* Create second set of bridged parties */
bridge2 = ast_bridge_basic_new ( ) ;
bridge2 = ast_bridge_base_new ( AST_BRIDGE_CAPABILITY_1TO1MIX | AST_BRIDGE_CAPABILITY_NATIVE | AST_BRIDGE_CAPABILITY_MULTIMIX ,
AST_BRIDGE_FLAG_MERGE_INHIBIT_TO | AST_BRIDGE_FLAG_MERGE_INHIBIT_FROM
| AST_BRIDGE_FLAG_SWAP_INHIBIT_TO | AST_BRIDGE_FLAG_SWAP_INHIBIT_FROM
| AST_BRIDGE_FLAG_TRANSFER_PROHIBITED | AST_BRIDGE_FLAG_SMART ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
ast_test_validate ( test , bridge2 ! = NULL ) ;
CREATE_FRED_CHANNEL ( chan_fred , & fred_caller ) ;
CREATE_ DAVID_CHANNEL( chan_david , & davi d_caller) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_CHARLIE_CHANNEL ( chan_charlie , & charlie_caller ) ;
CREATE_EVE_CHANNEL ( chan_eve , & eve_caller ) ;
ANSWER_NO_APP ( chan_david ) ;
ANSWER_NO_APP ( chan_fred ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_charlie ) ;
ANSWER_NO_APP ( chan_eve ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_charlie , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_fred , NULL , NULL , 0 ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_david , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_fred ) ) ;
ast_test_validate ( test , 0 = = ast_bridge_impart ( bridge2 , chan_eve , NULL , NULL , 0 ) ) ;
do_sleep ( ) ;
do_sleep ( ) ;
BRIDGE_TO_CONF( chan_charlie , chan_fred , chan_eve , bridge2 ) ;
APPEND_EVENT ( chan_charlie , AST_CEL_BRIDGE_START , NULL , NULL , ast_channel_name ( chan_david ) ) ;
/* Perform attended transfer */
/* Perform attended transfer */
ast_bridge_transfer_attended ( chan_alice , chan_fred ) ;
do_sleep ( ) ;
/* Append dummy event for the link channel ;1 start */
/* The following events can not be matched directly since nothing is known
* about the linking local channel .
* local channel ; 1 and ; 2 creation and ; 2 answer */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
/* Append dummy event for the link channel ;2 start */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_david , bridge2 ) ;
/* Append dummy event for the link channel ;2 answer */
/* The two BRIDGE_TO_CONFs and CONF_EXITs are all racing to be first */
/* BRIDGE_TO_CONF with primary charlie, peer david, and trigger channel ;2 */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
ATTENDEDTRANSFER_BRIDGE ( chan_alice , bridge1 , chan_fred , bridge2 ) ;
ast_bridge_transfer_attended ( chan_alice , chan_david ) ;
do_sleep ( ) ;
/* Append dummy event for the link channel ;1 enter */
/* BRIDGE_TO_CONF with primary bob, peer alice, and trigger channel ;1 */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
/* Append dummy events for the link channel ;2 enter and Alice's exit,
/* CONF_EXIT alice and david */
* must both be dummies since they ' re racing */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
/* Append dummy events for the link channel ;1 answer and Fred's exit,
/* ANSWER ;1 */
* must both be dummies since they ' re racing */
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
APPEND_DUMMY_EVENT ( ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_bob , bridge1 ) ;
CONF_EXIT ( chan_bob , bridge1 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_charlie , bridge2 ) ;
CONF_EXIT ( chan_charlie , bridge2 ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_david , bridge1 ) ;
do_sleep ( ) ;
CONF_EXIT ( chan_eve , bridge2 ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_alice , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_bob , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_fred , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_charlie , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_david , AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_david , AST_CAUSE_NORMAL , " " ) ;
do_sleep ( ) ;
do_sleep ( ) ;
HANGUP_CHANNEL ( chan_ ev e, AST_CAUSE_NORMAL , " " ) ;
HANGUP_CHANNEL ( chan_charlie , AST_CAUSE_NORMAL , " " ) ;
return AST_TEST_PASS ;
return AST_TEST_PASS ;
}
}
@ -1775,7 +1712,7 @@ static int match_ie_val(
return 0 ;
return 0 ;
}
}
static int events_are_equal ( struct ast_ event * received , struct ast_event * expected )
static int events_are_equal ( struct ast_ test * test , struct ast_ event * received , struct ast_event * expected )
{
{
struct ast_event_iterator iterator ;
struct ast_event_iterator iterator ;
int res ;
int res ;
@ -1793,7 +1730,7 @@ static int events_are_equal(struct ast_event *received, struct ast_event *expect
& & ie_type ! = AST_EVENT_IE_EID
& & ie_type ! = AST_EVENT_IE_EID
& & ie_type ! = AST_EVENT_IE_CEL_EVENT_TIME
& & ie_type ! = AST_EVENT_IE_CEL_EVENT_TIME
& & ! match_ie_val ( received , expected , ie_type ) ) {
& & ! match_ie_val ( received , expected , ie_type ) ) {
ast_ log( LOG_ERROR , " Failed matching on field %s \n " , ast_event_get_ie_type_name ( ie_type ) ) ;
ast_ test_status_update( test , " Failed matching on field %s \n " , ast_event_get_ie_type_name ( ie_type ) ) ;
return 0 ;
return 0 ;
}
}
}
}
@ -1801,16 +1738,16 @@ static int events_are_equal(struct ast_event *received, struct ast_event *expect
return 1 ;
return 1 ;
}
}
static int dump_event ( struct ast_ event * event )
static int dump_event ( struct ast_ test * test , struct ast_ event * event )
{
{
struct ast_event_iterator i ;
struct ast_event_iterator i ;
if ( ast_event_iterator_init ( & i , event ) ) {
if ( ast_event_iterator_init ( & i , event ) ) {
ast_ log( LOG_ERROR , " Failed to initialize event iterator. :-( \n " ) ;
ast_ test_status_update( test , " Failed to initialize event iterator. :-( \n " ) ;
return 0 ;
return 0 ;
}
}
ast_ log( LOG_ERROR , " Event: %s %s \n " , ast_event_get_type_name ( event ) ,
ast_ test_status_update( test , " Event: %s %s \n " , ast_event_get_type_name ( event ) ,
ast_cel_get_type_name ( ast_event_get_ie_uint ( event , AST_EVENT_IE_CEL_EVENT_TYPE ) ) ) ;
ast_cel_get_type_name ( ast_event_get_ie_uint ( event , AST_EVENT_IE_CEL_EVENT_TYPE ) ) ) ;
do {
do {
@ -1825,37 +1762,37 @@ static int dump_event(struct ast_event *event)
switch ( ie_pltype ) {
switch ( ie_pltype ) {
case AST_EVENT_IE_PLTYPE_UNKNOWN :
case AST_EVENT_IE_PLTYPE_UNKNOWN :
case AST_EVENT_IE_PLTYPE_EXISTS :
case AST_EVENT_IE_PLTYPE_EXISTS :
ast_ log( LOG_ERROR , " %s \n " , ie_type_name ) ;
ast_ test_status_update( test , " %s \n " , ie_type_name ) ;
break ;
break ;
case AST_EVENT_IE_PLTYPE_STR :
case AST_EVENT_IE_PLTYPE_STR :
ast_ log( LOG_ERROR , " %.30s: %s \n " , ie_type_name ,
ast_ test_status_update( test , " %.30s: %s \n " , ie_type_name ,
ast_event_iterator_get_ie_str ( & i ) ) ;
ast_event_iterator_get_ie_str ( & i ) ) ;
break ;
break ;
case AST_EVENT_IE_PLTYPE_UINT :
case AST_EVENT_IE_PLTYPE_UINT :
ast_ log( LOG_ERROR , " %.30s: %u \n " , ie_type_name ,
ast_ test_status_update( test , " %.30s: %u \n " , ie_type_name ,
ast_event_iterator_get_ie_uint ( & i ) ) ;
ast_event_iterator_get_ie_uint ( & i ) ) ;
break ;
break ;
case AST_EVENT_IE_PLTYPE_BITFLAGS :
case AST_EVENT_IE_PLTYPE_BITFLAGS :
ast_ log( LOG_ERROR , " %.30s: %u \n " , ie_type_name ,
ast_ test_status_update( test , " %.30s: %u \n " , ie_type_name ,
ast_event_iterator_get_ie_bitflags ( & i ) ) ;
ast_event_iterator_get_ie_bitflags ( & i ) ) ;
default :
default :
break ;
break ;
}
}
} while ( ! ast_event_iterator_next ( & i ) ) ;
} while ( ! ast_event_iterator_next ( & i ) ) ;
ast_ log( LOG_ERROR , " \n " ) ;
ast_ test_status_update( test , " \n " ) ;
return 0 ;
return 0 ;
}
}
static int check_events ( struct a o2_container * local_expected , struct ao2_container * local_received )
static int check_events ( struct a st_test * test , struct a o2_container * local_expected , struct ao2_container * local_received )
{
{
struct ao2_iterator expected_it , received_it ;
struct ao2_iterator expected_it , received_it ;
struct ast_event * rx_event , * ex_event ;
struct ast_event * rx_event , * ex_event ;
int debug = 0 ;
int debug = 0 ;
if ( ao2_container_count ( local_expected ) ! = ao2_container_count ( local_received ) ) {
if ( ao2_container_count ( local_expected ) ! = ao2_container_count ( local_received ) ) {
ast_ log( LOG_ERROR , " Increasing verbosity since the number of expected events (%d) "
ast_ test_status_update( test , " Increasing verbosity since the number of expected events (%d) "
" did not match number of received events (%d). \n " ,
" did not match number of received events (%d). \n " ,
ao2_container_count ( local_expected ) ,
ao2_container_count ( local_expected ) ,
ao2_container_count ( local_received ) ) ;
ao2_container_count ( local_received ) ) ;
@ -1867,16 +1804,16 @@ static int check_events(struct ao2_container *local_expected, struct ao2_contain
rx_event = ao2_iterator_next ( & received_it ) ;
rx_event = ao2_iterator_next ( & received_it ) ;
ex_event = ao2_iterator_next ( & expected_it ) ;
ex_event = ao2_iterator_next ( & expected_it ) ;
while ( rx_event & & ex_event ) {
while ( rx_event & & ex_event ) {
if ( ! events_are_equal ( rx_event, ex_event ) ) {
if ( ! events_are_equal ( test, rx_event, ex_event ) ) {
ast_ log( LOG_ERROR , " Received event: \n " ) ;
ast_ test_status_update( test , " Received event: \n " ) ;
dump_event ( rx_event) ;
dump_event ( test, rx_event) ;
ast_ log( LOG_ERROR , " Expected event: \n " ) ;
ast_ test_status_update( test , " Expected event: \n " ) ;
dump_event ( ex_event) ;
dump_event ( test, ex_event) ;
return - 1 ;
return - 1 ;
}
}
if ( debug ) {
if ( debug ) {
ast_ log( LOG_ERROR , " Compared events successfully%s \n " , ast_event_get_type ( ex_event ) = = AST_EVENT_CUSTOM ? " (wildcard match) " : " " ) ;
ast_ test_status_update( test , " Compared events successfully%s \n " , ast_event_get_type ( ex_event ) = = AST_EVENT_CUSTOM ? " (wildcard match) " : " " ) ;
dump_event ( rx_event) ;
dump_event ( test, rx_event) ;
}
}
ao2_cleanup ( rx_event ) ;
ao2_cleanup ( rx_event ) ;
ao2_cleanup ( ex_event ) ;
ao2_cleanup ( ex_event ) ;
@ -1885,14 +1822,14 @@ static int check_events(struct ao2_container *local_expected, struct ao2_contain
}
}
if ( rx_event ) {
if ( rx_event ) {
ast_ log( LOG_ERROR , " Received event: \n " ) ;
ast_ test_status_update( test , " Received event: \n " ) ;
dump_event ( rx_event) ;
dump_event ( test, rx_event) ;
ao2_cleanup ( rx_event ) ;
ao2_cleanup ( rx_event ) ;
return - 1 ;
return - 1 ;
}
}
if ( ex_event ) {
if ( ex_event ) {
ast_ log( LOG_ERROR , " Expected event: \n " ) ;
ast_ test_status_update( test , " Expected event: \n " ) ;
dump_event ( ex_event) ;
dump_event ( test, ex_event) ;
ao2_cleanup ( ex_event ) ;
ao2_cleanup ( ex_event ) ;
return - 1 ;
return - 1 ;
}
}
@ -1965,7 +1902,7 @@ static int cel_verify_and_cleanup_cb(struct ast_test_info *info, struct ast_test
cel_received_events = NULL ;
cel_received_events = NULL ;
/* check events */
/* check events */
ast_test_validate ( test , ! check_events ( local_expected, local_received ) ) ;
ast_test_validate ( test , ! check_events ( test, local_expected, local_received ) ) ;
/* Restore the real CEL config */
/* Restore the real CEL config */
ast_cel_set_config ( saved_config ) ;
ast_cel_set_config ( saved_config ) ;