diff options
author | David M. Lee <dlee@digium.com> | 2013-06-11 15:46:35 +0000 |
---|---|---|
committer | David M. Lee <dlee@digium.com> | 2013-06-11 15:46:35 +0000 |
commit | dbdb2b1b3a618a79b3e42c77c05cb2688b4da08d (patch) | |
tree | 6d7174c03a0388cf81bee13403cf4c118184d1d9 /tests | |
parent | 2053fc31594d4069cb178e591ab2b4e0df08b268 (diff) |
Add vtable and methods for to_json and to_ami for Stasis messages
When a Stasis message type is defined in a loadable module, handling
those messages for AMI and res_stasis events can be cumbersome.
This patch adds a vtable to stasis_message_type, with to_ami and
to_json virtual functions. These allow messages to be handled
abstractly without putting module-specific code in core.
As an example, the VarSet AMI event was refactored to use the to_ami
virtual function.
(closes issue ASTERISK-21817)
Review: https://reviewboard.asterisk.org/r/2579/
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@391403 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'tests')
-rw-r--r-- | tests/test_stasis.c | 205 | ||||
-rw-r--r-- | tests/test_stasis_channels.c | 4 |
2 files changed, 193 insertions, 16 deletions
diff --git a/tests/test_stasis.c b/tests/test_stasis.c index 915226d29..0dc9182a3 100644 --- a/tests/test_stasis.c +++ b/tests/test_stasis.c @@ -41,6 +41,34 @@ ASTERISK_FILE_VERSION(__FILE__, "$Revision$") static const char *test_category = "/stasis/core/"; +static struct ast_json *fake_json(struct stasis_message *message) +{ + const char *text = stasis_message_data(message); + + return ast_json_string_create(text); +} + +static struct ast_manager_event_blob *fake_ami(struct stasis_message *message) +{ + RAII_VAR(struct ast_manager_event_blob *, res, NULL, ao2_cleanup); + const char *text = stasis_message_data(message); + + res = ast_manager_event_blob_create(EVENT_FLAG_TEST, "FakeMI", + "Message: %s", text); + + if (res == NULL) { + return NULL; + } + + ao2_ref(res, +1); + return res; +} + +static struct stasis_message_vtable fake_vtable = { + .to_json = fake_json, + .to_ami = fake_ami +}; + AST_TEST_DEFINE(message_type) { RAII_VAR(struct stasis_message_type *, uut, NULL, ao2_cleanup); @@ -56,8 +84,8 @@ AST_TEST_DEFINE(message_type) break; } - ast_test_validate(test, NULL == stasis_message_type_create(NULL)); - uut = stasis_message_type_create("SomeMessage"); + ast_test_validate(test, NULL == stasis_message_type_create(NULL, NULL)); + uut = stasis_message_type_create("SomeMessage", NULL); ast_test_validate(test, 0 == strcmp(stasis_message_type_name(uut), "SomeMessage")); return AST_TEST_PASS; @@ -84,7 +112,7 @@ AST_TEST_DEFINE(message) } - type = stasis_message_type_create("SomeMessage"); + type = stasis_message_type_create("SomeMessage", NULL); ast_test_validate(test, NULL == stasis_message_create(NULL, NULL)); ast_test_validate(test, NULL == stasis_message_create(type, NULL)); @@ -332,7 +360,7 @@ AST_TEST_DEFINE(publish) test_data = ao2_alloc(1, NULL); ast_test_validate(test, NULL != test_data); - test_message_type = stasis_message_type_create("TestMessage"); + test_message_type = stasis_message_type_create("TestMessage", NULL); test_message = stasis_message_create(test_message_type, test_data); stasis_publish(topic, test_message); @@ -380,7 +408,7 @@ AST_TEST_DEFINE(unsubscribe_stops_messages) test_data = ao2_alloc(1, NULL); ast_test_validate(test, NULL != test_data); - test_message_type = stasis_message_type_create("TestMessage"); + test_message_type = stasis_message_type_create("TestMessage", NULL); test_message = stasis_message_create(test_message_type, test_data); stasis_publish(topic, test_message); @@ -444,7 +472,7 @@ AST_TEST_DEFINE(forward) test_data = ao2_alloc(1, NULL); ast_test_validate(test, NULL != test_data); - test_message_type = stasis_message_type_create("TestMessage"); + test_message_type = stasis_message_type_create("TestMessage", NULL); test_message = stasis_message_create(test_message_type, test_data); stasis_publish(topic, test_message); @@ -494,7 +522,7 @@ AST_TEST_DEFINE(interleaving) break; } - test_message_type = stasis_message_type_create("test"); + test_message_type = stasis_message_type_create("test", NULL); ast_test_validate(test, NULL != test_message_type); test_data = ao2_alloc(1, NULL); @@ -604,7 +632,7 @@ AST_TEST_DEFINE(cache_passthrough) break; } - non_cache_type = stasis_message_type_create("NonCacheable"); + non_cache_type = stasis_message_type_create("NonCacheable", NULL); ast_test_validate(test, NULL != non_cache_type); topic = stasis_topic_create("SomeTopic"); ast_test_validate(test, NULL != topic); @@ -657,7 +685,7 @@ AST_TEST_DEFINE(cache) break; } - cache_type = stasis_message_type_create("Cacheable"); + cache_type = stasis_message_type_create("Cacheable", NULL); ast_test_validate(test, NULL != cache_type); topic = stasis_topic_create("SomeTopic"); ast_test_validate(test, NULL != topic); @@ -759,7 +787,7 @@ AST_TEST_DEFINE(cache_dump) break; } - cache_type = stasis_message_type_create("Cacheable"); + cache_type = stasis_message_type_create("Cacheable", NULL); ast_test_validate(test, NULL != cache_type); topic = stasis_topic_create("SomeTopic"); ast_test_validate(test, NULL != topic); @@ -866,7 +894,7 @@ AST_TEST_DEFINE(route_conflicts) consumer2 = consumer_create(1); ast_test_validate(test, NULL != consumer2); - test_message_type = stasis_message_type_create("TestMessage"); + test_message_type = stasis_message_type_create("TestMessage", NULL); ast_test_validate(test, NULL != test_message_type); uut = stasis_message_router_create(topic); @@ -920,11 +948,11 @@ AST_TEST_DEFINE(router) consumer3 = consumer_create(1); ast_test_validate(test, NULL != consumer3); - test_message_type1 = stasis_message_type_create("TestMessage1"); + test_message_type1 = stasis_message_type_create("TestMessage1", NULL); ast_test_validate(test, NULL != test_message_type1); - test_message_type2 = stasis_message_type_create("TestMessage2"); + test_message_type2 = stasis_message_type_create("TestMessage2", NULL); ast_test_validate(test, NULL != test_message_type2); - test_message_type3 = stasis_message_type_create("TestMessage3"); + test_message_type3 = stasis_message_type_create("TestMessage3", NULL); ast_test_validate(test, NULL != test_message_type3); uut = stasis_message_router_create(topic); @@ -978,6 +1006,147 @@ AST_TEST_DEFINE(router) return AST_TEST_PASS; } +AST_TEST_DEFINE(no_to_json) +{ + RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup); + RAII_VAR(char *, data, NULL, ao2_cleanup); + RAII_VAR(struct ast_json *, actual, NULL, ast_json_unref); + char *expected = "SomeData"; + + switch (cmd) { + case TEST_INIT: + info->name = __func__; + info->category = test_category; + info->summary = "Test message to_json function"; + info->description = "Test message to_json function"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + /* Test NULL */ + actual = stasis_message_to_json(NULL); + ast_test_validate(test, NULL == actual); + + /* Test message with NULL to_json function */ + type = stasis_message_type_create("SomeMessage", NULL); + + data = ao2_alloc(strlen(expected) + 1, NULL); + strcpy(data, expected); + uut = stasis_message_create(type, data); + ast_test_validate(test, NULL != uut); + + actual = stasis_message_to_json(uut); + ast_test_validate(test, NULL == actual); + + return AST_TEST_PASS; +} + +AST_TEST_DEFINE(to_json) +{ + RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup); + RAII_VAR(char *, data, NULL, ao2_cleanup); + RAII_VAR(struct ast_json *, actual, NULL, ast_json_unref); + const char *expected_text = "SomeData"; + RAII_VAR(struct ast_json *, expected, NULL, ast_json_unref); + + switch (cmd) { + case TEST_INIT: + info->name = __func__; + info->category = test_category; + info->summary = "Test message to_json function when NULL"; + info->description = "Test message to_json function when NULL"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + type = stasis_message_type_create("SomeMessage", &fake_vtable); + + data = ao2_alloc(strlen(expected_text) + 1, NULL); + strcpy(data, expected_text); + uut = stasis_message_create(type, data); + ast_test_validate(test, NULL != uut); + + expected = ast_json_string_create(expected_text); + actual = stasis_message_to_json(uut); + ast_test_validate(test, ast_json_equal(expected, actual)); + + return AST_TEST_PASS; +} + +AST_TEST_DEFINE(no_to_ami) +{ + RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup); + RAII_VAR(char *, data, NULL, ao2_cleanup); + RAII_VAR(struct ast_manager_event_blob *, actual, NULL, ao2_cleanup); + char *expected = "SomeData"; + + switch (cmd) { + case TEST_INIT: + info->name = __func__; + info->category = test_category; + info->summary = "Test message to_ami function when NULL"; + info->description = "Test message to_ami function when NULL"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + /* Test NULL */ + actual = stasis_message_to_ami(NULL); + ast_test_validate(test, NULL == actual); + + /* Test message with NULL to_ami function */ + type = stasis_message_type_create("SomeMessage", NULL); + + data = ao2_alloc(strlen(expected) + 1, NULL); + strcpy(data, expected); + uut = stasis_message_create(type, data); + ast_test_validate(test, NULL != uut); + + actual = stasis_message_to_ami(uut); + ast_test_validate(test, NULL == actual); + + return AST_TEST_PASS; +} + +AST_TEST_DEFINE(to_ami) +{ + RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup); + RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup); + RAII_VAR(char *, data, NULL, ao2_cleanup); + RAII_VAR(struct ast_manager_event_blob *, actual, NULL, ao2_cleanup); + const char *expected_text = "SomeData"; + const char *expected = "Message: SomeData"; + + switch (cmd) { + case TEST_INIT: + info->name = __func__; + info->category = test_category; + info->summary = "Test message to_ami function"; + info->description = "Test message to_ami function"; + return AST_TEST_NOT_RUN; + case TEST_EXECUTE: + break; + } + + type = stasis_message_type_create("SomeMessage", &fake_vtable); + + data = ao2_alloc(strlen(expected_text) + 1, NULL); + strcpy(data, expected_text); + uut = stasis_message_create(type, data); + ast_test_validate(test, NULL != uut); + + actual = stasis_message_to_ami(uut); + ast_test_validate(test, strcmp(expected, actual->extra_fields) == 0); + + return AST_TEST_PASS; +} + static int unload_module(void) { AST_TEST_UNREGISTER(message_type); @@ -992,6 +1161,10 @@ static int unload_module(void) AST_TEST_UNREGISTER(route_conflicts); AST_TEST_UNREGISTER(router); AST_TEST_UNREGISTER(interleaving); + AST_TEST_UNREGISTER(no_to_json); + AST_TEST_UNREGISTER(to_json); + AST_TEST_UNREGISTER(no_to_ami); + AST_TEST_UNREGISTER(to_ami); return 0; } @@ -1009,6 +1182,10 @@ static int load_module(void) AST_TEST_REGISTER(route_conflicts); AST_TEST_REGISTER(router); AST_TEST_REGISTER(interleaving); + AST_TEST_REGISTER(no_to_json); + AST_TEST_REGISTER(to_json); + AST_TEST_REGISTER(no_to_ami); + AST_TEST_REGISTER(to_ami); return AST_MODULE_LOAD_SUCCESS; } diff --git a/tests/test_stasis_channels.c b/tests/test_stasis_channels.c index 512df4351..214d77396 100644 --- a/tests/test_stasis_channels.c +++ b/tests/test_stasis_channels.c @@ -71,7 +71,7 @@ AST_TEST_DEFINE(channel_blob_create) break; } - type = stasis_message_type_create("test-type"); + type = stasis_message_type_create("test-type", NULL); chan = ast_channel_alloc(0, AST_STATE_DOWN, "100", "Alice", "100", "100", "default", NULL, 0, "TEST/Alice"); json = ast_json_pack("{s: s}", "foo", "bar"); @@ -123,7 +123,7 @@ AST_TEST_DEFINE(null_blob) break; } - type = stasis_message_type_create("test-type"); + type = stasis_message_type_create("test-type", NULL); chan = ast_channel_alloc(0, AST_STATE_DOWN, "100", "Alice", "100", "100", "default", NULL, 0, "TEST/Alice"); json = ast_json_pack("{s: s}", "foo", "bar"); |