summaryrefslogtreecommitdiff
path: root/tests/test_stasis_channels.c
diff options
context:
space:
mode:
authorMatthew Jordan <mjordan@digium.com>2013-04-08 14:26:37 +0000
committerMatthew Jordan <mjordan@digium.com>2013-04-08 14:26:37 +0000
commitb8d4e573f1292688d07063542d263490536c2bc9 (patch)
tree938b0732a2311aa3c424597283aff95c85f9a98e /tests/test_stasis_channels.c
parenta2a53cc306ea5fec65daf3630716a7c6ee13adad (diff)
Add multi-channel Stasis messages; refactor Dial AMI events to Stasis
This patch does the following: * A new Stasis payload has been defined for multi-channel messages. This payload can store multiple ast_channel_snapshot objects along with a single JSON blob. The payload object itself is opaque; the snapshots are stored in a container keyed by roles. APIs have been provided to query for and retrieve the snapshots from the payload object. * The Dial AMI events have been refactored onto Stasis. This includes dial messages in app_dial, as well as the core dialing framework. The AMI events have been modified to send out a DialBegin/DialEnd events, as opposed to the subevent type that was previously used. * Stasis messages, types, and other objects related to channels have been placed in their own file, stasis_channels. Unit tests for some of these objects/messages have also been written. git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@384910 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'tests/test_stasis_channels.c')
-rw-r--r--tests/test_stasis_channels.c223
1 files changed, 223 insertions, 0 deletions
diff --git a/tests/test_stasis_channels.c b/tests/test_stasis_channels.c
new file mode 100644
index 000000000..fe398379b
--- /dev/null
+++ b/tests/test_stasis_channels.c
@@ -0,0 +1,223 @@
+/*
+ * Asterisk -- An open source telephony toolkit.
+ *
+ * Copyright (C) 2013, Digium, Inc.
+ *
+ * Matt Jordan <mjordan@digium.com>
+ *
+ * See http://www.asterisk.org for more information about
+ * the Asterisk project. Please do not directly contact
+ * any of the maintainers of this project for assistance;
+ * the project provides a web site, mailing lists and IRC
+ * channels for your use.
+ *
+ * This program is free software, distributed under the terms of
+ * the GNU General Public License Version 2. See the LICENSE file
+ * at the top of the source tree.
+ */
+
+/*!
+ * \file \brief Test Stasis Channel messages and objects
+ *
+ * \author\verbatim Matt Jordan <mjordan@digium.com> \endverbatim
+ *
+ * \ingroup tests
+ */
+
+/*** MODULEINFO
+ <depend>TEST_FRAMEWORK</depend>
+ <support_level>core</support_level>
+ ***/
+
+#include "asterisk.h"
+
+ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
+
+#include "asterisk/astobj2.h"
+#include "asterisk/module.h"
+#include "asterisk/stasis.h"
+#include "asterisk/stasis_message_router.h"
+#include "asterisk/test.h"
+#include "asterisk/stasis_channels.h"
+#include "asterisk/channel.h"
+
+static const char *test_category = "/stasis/channels/";
+
+static void safe_channel_release(struct ast_channel *chan)
+{
+ if (!chan) {
+ return;
+ }
+ ast_channel_release(chan);
+}
+
+AST_TEST_DEFINE(channel_blob_create)
+{
+ struct ast_channel_blob *blob;
+ RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_channel *, chan, NULL, safe_channel_release);
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+ RAII_VAR(struct ast_json *, bad_json, NULL, ast_json_unref);
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = __func__;
+ info->category = test_category;
+ info->summary = "Test creation of ast_channel_blob objects";
+ info->description = "Test creation of ast_channel_blob objects";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ chan = ast_channel_alloc(0, AST_STATE_DOWN, "100", "Alice", "100", "100", "default", NULL, 0, "TEST/Alice");
+ json = ast_json_pack("{s: s}",
+ "type", "test");
+ bad_json = ast_json_pack("{s: s}",
+ "bad_key", "test");
+
+ /* Off nominal creation */
+ ast_test_validate(test, NULL == ast_channel_blob_create(NULL, bad_json));
+ ast_test_validate(test, NULL == ast_channel_blob_create(chan, bad_json));
+
+ /* Test for single channel */
+ msg = ast_channel_blob_create(chan, json);
+ ast_test_validate(test, NULL != msg);
+ blob = stasis_message_data(msg);
+ ast_test_validate(test, NULL != blob);
+ ast_test_validate(test, NULL != blob->snapshot);
+ ast_test_validate(test, NULL != blob->blob);
+ ast_test_validate(test, 0 == strcmp(ast_channel_blob_json_type(blob), "test"));
+
+ ast_test_validate(test, 1 == ao2_ref(msg, 0));
+ ao2_cleanup(msg);
+
+ /* Test for global channels */
+ msg = ast_channel_blob_create(NULL, json);
+ ast_test_validate(test, NULL != msg);
+ blob = stasis_message_data(msg);
+ ast_test_validate(test, NULL != blob);
+ ast_test_validate(test, NULL == blob->snapshot);
+ ast_test_validate(test, NULL != blob->blob);
+ ast_test_validate(test, 0 == strcmp(ast_channel_blob_json_type(blob), "test"));
+
+ return AST_TEST_PASS;
+}
+
+AST_TEST_DEFINE(multi_channel_blob_create)
+{
+ RAII_VAR(struct ast_multi_channel_blob *, blob, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+ RAII_VAR(struct ast_json *, bad_json, NULL, ast_json_unref);
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = __func__;
+ info->category = test_category;
+ info->summary = "Test creation of ast_multi_channel_blob objects";
+ info->description = "Test creation of ast_multi_channel_blob objects";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ json = ast_json_pack("{s: s}",
+ "type", "test");
+ bad_json = ast_json_pack("{s: s}",
+ "bad_key", "test");
+
+ /* Off nominal creation */
+ ast_test_validate(test, NULL == ast_multi_channel_blob_create(bad_json));
+
+ /* Test for single channel */
+ blob = ast_multi_channel_blob_create(json);
+ ast_test_validate(test, NULL != blob);
+ ast_test_validate(test, 0 == strcmp(ast_multi_channel_blob_get_type(blob), "test"));
+ ast_test_validate(test, NULL != ast_multi_channel_blob_get_json(blob));
+
+ return AST_TEST_PASS;
+}
+
+AST_TEST_DEFINE(multi_channel_blob_snapshots)
+{
+ RAII_VAR(struct ast_multi_channel_blob *, blob, NULL, ao2_cleanup);
+ RAII_VAR(struct ast_json *, json, NULL, ast_json_unref);
+ 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_charlie, NULL, safe_channel_release);
+ struct ast_channel_snapshot *snapshot;
+ struct ao2_container *matches;
+
+ switch (cmd) {
+ case TEST_INIT:
+ info->name = __func__;
+ info->category = test_category;
+ info->summary = "Test creation of ast_multi_channel_blob objects";
+ info->description = "Test creation of ast_multi_channel_blob objects";
+ return AST_TEST_NOT_RUN;
+ case TEST_EXECUTE:
+ break;
+ }
+
+ json = ast_json_pack("{s: s}",
+ "type", "test");
+ chan_alice = ast_channel_alloc(0, AST_STATE_DOWN, "100", "Alice", "100", "100", "default", NULL, 0, "TEST/Alice");
+ chan_bob = ast_channel_alloc(0, AST_STATE_DOWN, "200", "Bob", "200", "200", "default", NULL, 0, "TEST/Bob");
+ chan_charlie = ast_channel_alloc(0, AST_STATE_DOWN, "300", "Bob", "300", "300", "default", NULL, 0, "TEST/Charlie");
+
+ blob = ast_multi_channel_blob_create(json);
+ ast_multi_channel_blob_add_channel(blob, "Caller", ast_channel_snapshot_create(chan_alice));
+ ast_multi_channel_blob_add_channel(blob, "Peer", ast_channel_snapshot_create(chan_bob));
+ ast_multi_channel_blob_add_channel(blob, "Peer", ast_channel_snapshot_create(chan_charlie));
+
+ /* Test for unknown role */
+ ast_test_validate(test, NULL == ast_multi_channel_blob_get_channel(blob, "Foobar"));
+
+ /* Test for single match */
+ snapshot = ast_multi_channel_blob_get_channel(blob, "Caller");
+ ast_test_validate(test, NULL != snapshot);
+ ast_test_validate(test, 0 == strcmp("TEST/Alice", snapshot->name));
+
+ /* Test for single match, multiple possibilities */
+ snapshot = ast_multi_channel_blob_get_channel(blob, "Peer");
+ ast_test_validate(test, NULL != snapshot);
+ ast_test_validate(test, 0 != strcmp("TEST/Alice", snapshot->name));
+
+ /* Multi-match */
+ matches = ast_multi_channel_blob_get_channels(blob, "Peer");
+ ast_test_validate(test, NULL != matches);
+ ast_test_validate(test, 2 == ao2_container_count(matches));
+ snapshot = ao2_find(matches, "TEST/Bob", OBJ_KEY);
+ ast_test_validate(test, NULL != snapshot);
+ ao2_cleanup(snapshot);
+ snapshot = ao2_find(matches, "TEST/Charlie", OBJ_KEY);
+ ast_test_validate(test, NULL != snapshot);
+ ao2_cleanup(snapshot);
+ ast_test_validate(test, 1 == ao2_ref(matches, 0));
+ ao2_cleanup(matches);
+
+ return AST_TEST_PASS;
+}
+
+static int unload_module(void)
+{
+ AST_TEST_UNREGISTER(channel_blob_create);
+ AST_TEST_UNREGISTER(multi_channel_blob_create);
+ AST_TEST_UNREGISTER(multi_channel_blob_snapshots);
+
+ return 0;
+}
+
+static int load_module(void)
+{
+ AST_TEST_REGISTER(channel_blob_create);
+ AST_TEST_REGISTER(multi_channel_blob_create);
+ AST_TEST_REGISTER(multi_channel_blob_snapshots);
+
+ return AST_MODULE_LOAD_SUCCESS;
+}
+
+AST_MODULE_INFO(ASTERISK_GPL_KEY, 0, "Stasis Channel Testing",
+ .load = load_module,
+ .unload = unload_module
+ );