Newer
Older
break;
}
} while (!ast_event_iterator_next(&i));
static int check_events(struct ast_test *test, struct ao2_container *local_expected, struct ao2_container *local_received)
struct ao2_iterator received_it;
struct ao2_iterator expected_it;
RAII_VAR(struct ast_event *, rx_event, NULL, ao2_cleanup);
RAII_VAR(struct ast_event *, ex_event, NULL, ao2_cleanup);
int debug = 0;
if (ao2_container_count(local_expected) != ao2_container_count(local_received)) {
ast_test_status_update(test, "Increasing verbosity since the number of expected events (%d)"
" did not match number of received events (%d).\n",
ao2_container_count(local_expected),
ao2_container_count(local_received));
debug = 1;
}
received_it = ao2_iterator_init(local_received, 0);
expected_it = ao2_iterator_init(local_expected, 0);
rx_event = ao2_iterator_next(&received_it);
ex_event = ao2_iterator_next(&expected_it);
while (rx_event && ex_event) {
if (!events_are_equal(test, rx_event, ex_event)) {
ao2_iterator_destroy(&received_it);
ao2_iterator_destroy(&expected_it);
ast_test_status_update(test, "Received event:\n");
dump_event(test, rx_event);
ast_test_status_update(test, "Expected event:\n");
dump_event(test, ex_event);
return -1;
}
if (debug) {
ast_test_status_update(test, "Compared events successfully%s\n",
ast_event_get_type(ex_event) == AST_EVENT_CUSTOM
? " (wildcard match)" : "");
}
ao2_cleanup(rx_event);
ao2_cleanup(ex_event);
rx_event = ao2_iterator_next(&received_it);
ex_event = ao2_iterator_next(&expected_it);
}
ao2_iterator_destroy(&received_it);
ao2_iterator_destroy(&expected_it);
ast_test_status_update(test, "Received event:\n");
dump_event(test, rx_event);
return -1;
}
if (ex_event) {
ast_test_status_update(test, "Expected event:\n");
dump_event(test, ex_event);
return -1;
}
return 0;
}
/*!
* \internal
* \brief Callback function called after each test executes.
*
* \details
* In addition to cleanup, this function also performs verification
* that the events received during a test match the events that were
* expected to have been generated during the test.
*/
static int cel_verify_and_cleanup_cb(struct ast_test_info *info, struct ast_test *test)
{
RAII_VAR(struct ao2_container *, local_expected, cel_expected_events, ao2_cleanup);
RAII_VAR(struct ao2_container *, local_received, cel_received_events, ao2_cleanup);
ast_assert(cel_received_events != NULL);
ast_assert(cel_expected_events != NULL);
do_sleep();
/* stop the CEL event callback and clean up storage structures*/
ast_cel_backend_unregister(TEST_BACKEND_NAME);
/* cleaned up by RAII_VAR's */
cel_expected_events = NULL;
cel_received_events = NULL;
ast_test_validate(test, !check_events(test, local_expected, local_received));
/* Restore the real CEL config */
ast_cel_set_config(saved_config);
ao2_cleanup(saved_config);
saved_config = NULL;
ast_mutex_destroy(&mid_test_sync_lock);
ast_cond_destroy(&sync_out);
return 0;
}
static int unload_module(void)
{
AST_TEST_UNREGISTER(test_cel_channel_creation);
AST_TEST_UNREGISTER(test_cel_unanswered_inbound_call);
AST_TEST_UNREGISTER(test_cel_unanswered_outbound_call);
AST_TEST_UNREGISTER(test_cel_single_party);
AST_TEST_UNREGISTER(test_cel_single_bridge);
AST_TEST_UNREGISTER(test_cel_single_bridge_continue);
AST_TEST_UNREGISTER(test_cel_single_twoparty_bridge_a);
AST_TEST_UNREGISTER(test_cel_single_twoparty_bridge_b);
#ifdef RACEY_TESTS
AST_TEST_UNREGISTER(test_cel_single_multiparty_bridge);
#endif
AST_TEST_UNREGISTER(test_cel_dial_unanswered);
AST_TEST_UNREGISTER(test_cel_dial_unanswered_filter);
AST_TEST_UNREGISTER(test_cel_dial_congestion);
AST_TEST_UNREGISTER(test_cel_dial_busy);
AST_TEST_UNREGISTER(test_cel_dial_unavailable);
AST_TEST_UNREGISTER(test_cel_dial_caller_cancel);
AST_TEST_UNREGISTER(test_cel_dial_parallel_failed);
AST_TEST_UNREGISTER(test_cel_dial_answer_no_bridge);
AST_TEST_UNREGISTER(test_cel_dial_answer_twoparty_bridge_a);
AST_TEST_UNREGISTER(test_cel_dial_answer_twoparty_bridge_b);
#ifdef RACEY_TESTS
AST_TEST_UNREGISTER(test_cel_dial_answer_multiparty);
Matthew Jordan
committed
AST_TEST_UNREGISTER(test_cel_attended_transfer_bridges_swap);
AST_TEST_UNREGISTER(test_cel_attended_transfer_bridges_link);
AST_TEST_UNREGISTER(test_cel_blind_transfer);
AST_TEST_UNREGISTER(test_cel_attended_transfer_bridges_merge);
AST_TEST_UNREGISTER(test_cel_dial_pickup);
AST_TEST_UNREGISTER(test_cel_local_optimize);
ast_channel_unregister(&test_cel_chan_tech);
ao2_cleanup(cel_expected_events);
cel_expected_events = NULL;
ao2_cleanup(cel_received_events);
cel_received_events = NULL;
2150
2151
2152
2153
2154
2155
2156
2157
2158
2159
2160
2161
2162
2163
2164
2165
2166
2167
2168
2169
2170
2171
2172
2173
2174
2175
2176
2177
ao2_cleanup(cel_test_config);
cel_test_config = NULL;
return 0;
}
static int load_module(void)
{
/* build the test config */
cel_test_config = ast_cel_general_config_alloc();
if (!cel_test_config) {
return -1;
}
cel_test_config->enable = 1;
if (ast_str_container_add(cel_test_config->apps, "dial")) {
return -1;
}
if (ast_str_container_add(cel_test_config->apps, "park")) {
return -1;
}
if (ast_str_container_add(cel_test_config->apps, "queue")) {
return -1;
}
cel_test_config->events |= 1<<AST_CEL_APP_START;
cel_test_config->events |= 1<<AST_CEL_CHANNEL_START;
cel_test_config->events |= 1<<AST_CEL_CHANNEL_END;
cel_test_config->events |= 1<<AST_CEL_ANSWER;
cel_test_config->events |= 1<<AST_CEL_HANGUP;
cel_test_config->events |= 1<<AST_CEL_BRIDGE_ENTER;
cel_test_config->events |= 1<<AST_CEL_BRIDGE_EXIT;
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);
AST_TEST_REGISTER(test_cel_channel_creation);
AST_TEST_REGISTER(test_cel_unanswered_inbound_call);
AST_TEST_REGISTER(test_cel_unanswered_outbound_call);
AST_TEST_REGISTER(test_cel_single_party);
AST_TEST_REGISTER(test_cel_single_bridge);
AST_TEST_REGISTER(test_cel_single_bridge_continue);
AST_TEST_REGISTER(test_cel_single_twoparty_bridge_a);
AST_TEST_REGISTER(test_cel_single_twoparty_bridge_b);
#ifdef RACEY_TESTS
AST_TEST_REGISTER(test_cel_single_multiparty_bridge);
#endif
AST_TEST_REGISTER(test_cel_dial_unanswered);
AST_TEST_REGISTER(test_cel_dial_unanswered_filter);
AST_TEST_REGISTER(test_cel_dial_congestion);
AST_TEST_REGISTER(test_cel_dial_busy);
AST_TEST_REGISTER(test_cel_dial_unavailable);
AST_TEST_REGISTER(test_cel_dial_caller_cancel);
AST_TEST_REGISTER(test_cel_dial_parallel_failed);
AST_TEST_REGISTER(test_cel_dial_answer_no_bridge);
AST_TEST_REGISTER(test_cel_dial_answer_twoparty_bridge_a);
AST_TEST_REGISTER(test_cel_dial_answer_twoparty_bridge_b);
#ifdef RACEY_TESTS
AST_TEST_REGISTER(test_cel_dial_answer_multiparty);
Matthew Jordan
committed
AST_TEST_REGISTER(test_cel_attended_transfer_bridges_swap);
AST_TEST_REGISTER(test_cel_attended_transfer_bridges_link);
AST_TEST_REGISTER(test_cel_blind_transfer);
AST_TEST_REGISTER(test_cel_attended_transfer_bridges_merge);
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);
ast_test_register_cleanup(TEST_CATEGORY, cel_verify_and_cleanup_cb);
return AST_MODULE_LOAD_SUCCESS;
}
AST_MODULE_INFO_STANDARD(ASTERISK_GPL_KEY, "CEL unit tests");