mirror of
https://github.com/asterisk/asterisk.git
synced 2025-10-22 04:43:50 +00:00
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
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user