Skip to content
Snippets Groups Projects
test_cel.c 67.7 KiB
Newer Older
  • Learn to ignore specific revisions
  • 		}
    	} while (!ast_event_iterator_next(&i));
    
    
    	ast_test_status_update(test, "\n");
    
    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)" : "");
    
    			dump_event(test, rx_event);
    
    		}
    		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);
    
    Richard Mudgett's avatar
    Richard Mudgett committed
     * \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);
    
    David M. Lee's avatar
    David M. Lee committed
    	/* cleaned up by RAII_VAR's */
    	cel_expected_events = NULL;
    	cel_received_events = NULL;
    
    
    	/* check events */
    
    	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;
    
    
    David M. Lee's avatar
    David M. Lee committed
    	/* clean up the locks */
    
    	ast_mutex_destroy(&sync_lock);
    
    	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);
    
    	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_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);
    
    	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");