2 * Asterisk -- An open source telephony toolkit.
4 * Copyright (C) 2013, Digium, Inc.
6 * David M. Lee, II <dlee@digium.com>
8 * See http://www.asterisk.org for more information about
9 * the Asterisk project. Please do not directly contact
10 * any of the maintainers of this project for assistance;
11 * the project provides a web site, mailing lists and IRC
12 * channels for your use.
14 * This program is free software, distributed under the terms of
15 * the GNU General Public License Version 2. See the LICENSE file
16 * at the top of the source tree.
20 * \file \brief Test Stasis message bus.
22 * \author\verbatim David M. Lee, II <dlee@digium.com> \endverbatim
28 <depend>TEST_FRAMEWORK</depend>
29 <support_level>core</support_level>
34 ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
36 #include "asterisk/astobj2.h"
37 #include "asterisk/module.h"
38 #include "asterisk/stasis.h"
39 #include "asterisk/stasis_message_router.h"
40 #include "asterisk/test.h"
42 static const char *test_category = "/stasis/core/";
44 static struct ast_json *fake_json(struct stasis_message *message)
46 const char *text = stasis_message_data(message);
48 return ast_json_string_create(text);
51 static struct ast_manager_event_blob *fake_ami(struct stasis_message *message)
53 RAII_VAR(struct ast_manager_event_blob *, res, NULL, ao2_cleanup);
54 const char *text = stasis_message_data(message);
56 res = ast_manager_event_blob_create(EVENT_FLAG_TEST, "FakeMI",
57 "Message: %s\r\n", text);
67 static struct stasis_message_vtable fake_vtable = {
72 AST_TEST_DEFINE(message_type)
74 RAII_VAR(struct stasis_message_type *, uut, NULL, ao2_cleanup);
78 info->name = __func__;
79 info->category = test_category;
80 info->summary = "Test basic message_type functions";
81 info->description = "Test basic message_type functions";
82 return AST_TEST_NOT_RUN;
87 ast_test_validate(test, NULL == stasis_message_type_create(NULL, NULL));
88 uut = stasis_message_type_create("SomeMessage", NULL);
89 ast_test_validate(test, 0 == strcmp(stasis_message_type_name(uut), "SomeMessage"));
94 AST_TEST_DEFINE(message)
96 RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
97 RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup);
98 RAII_VAR(char *, data, NULL, ao2_cleanup);
99 char *expected = "SomeData";
100 struct timeval expected_timestamp;
101 struct timeval time_diff;
105 info->name = __func__;
106 info->category = test_category;
107 info->summary = "Test basic message functions";
108 info->description = "Test basic message functions";
109 return AST_TEST_NOT_RUN;
115 type = stasis_message_type_create("SomeMessage", NULL);
117 ast_test_validate(test, NULL == stasis_message_create(NULL, NULL));
118 ast_test_validate(test, NULL == stasis_message_create(type, NULL));
120 data = ao2_alloc(strlen(expected) + 1, NULL);
121 strcpy(data, expected);
122 expected_timestamp = ast_tvnow();
123 uut = stasis_message_create(type, data);
125 ast_test_validate(test, NULL != uut);
126 ast_test_validate(test, type == stasis_message_type(uut));
127 ast_test_validate(test, 0 == strcmp(expected, stasis_message_data(uut)));
128 ast_test_validate(test, 2 == ao2_ref(data, 0)); /* uut has ref to data */
130 time_diff = ast_tvsub(*stasis_message_timestamp(uut), expected_timestamp);
131 /* 10ms is certainly long enough for the two calls to complete */
132 ast_test_validate(test, time_diff.tv_sec == 0);
133 ast_test_validate(test, time_diff.tv_usec < 10000);
137 ast_test_validate(test, 1 == ao2_ref(data, 0)); /* uut unreffed data */
139 return AST_TEST_PASS;
145 struct stasis_message **messages_rxed;
146 size_t messages_rxed_len;
147 int ignore_subscriptions;
151 static void consumer_dtor(void *obj) {
152 struct consumer *consumer = obj;
154 ast_mutex_destroy(&consumer->lock);
155 ast_cond_destroy(&consumer->out);
157 while (consumer->messages_rxed_len > 0) {
158 ao2_cleanup(consumer->messages_rxed[--consumer->messages_rxed_len]);
160 ast_free(consumer->messages_rxed);
161 consumer->messages_rxed = NULL;
164 static struct consumer *consumer_create(int ignore_subscriptions) {
165 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
167 consumer = ao2_alloc(sizeof(*consumer), consumer_dtor);
173 consumer->ignore_subscriptions = ignore_subscriptions;
174 consumer->messages_rxed = ast_malloc(0);
175 if (!consumer->messages_rxed) {
179 ast_mutex_init(&consumer->lock);
180 ast_cond_init(&consumer->out, NULL);
182 ao2_ref(consumer, +1);
186 static void consumer_exec(void *data, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *message)
188 struct consumer *consumer = data;
189 RAII_VAR(struct consumer *, consumer_needs_cleanup, NULL, ao2_cleanup);
190 SCOPED_MUTEX(lock, &consumer->lock);
192 if (!consumer->ignore_subscriptions || stasis_message_type(message) != stasis_subscription_change_type()) {
194 ++consumer->messages_rxed_len;
195 consumer->messages_rxed = ast_realloc(consumer->messages_rxed, sizeof(*consumer->messages_rxed) * consumer->messages_rxed_len);
196 ast_assert(consumer->messages_rxed != NULL);
197 consumer->messages_rxed[consumer->messages_rxed_len - 1] = message;
198 ao2_ref(message, +1);
201 if (stasis_subscription_final_message(sub, message)) {
202 consumer->complete = 1;
203 consumer_needs_cleanup = consumer;
206 ast_cond_signal(&consumer->out);
209 static int consumer_wait_for(struct consumer *consumer, size_t expected_len)
211 struct timeval start = ast_tvnow();
212 struct timespec end = {
213 .tv_sec = start.tv_sec + 30,
214 .tv_nsec = start.tv_usec * 1000
217 SCOPED_MUTEX(lock, &consumer->lock);
219 while (consumer->messages_rxed_len < expected_len) {
220 int r = ast_cond_timedwait(&consumer->out, &consumer->lock, &end);
221 if (r == ETIMEDOUT) {
224 ast_assert(r == 0); /* Not expecting any othet types of errors */
226 return consumer->messages_rxed_len;
229 static int consumer_wait_for_completion(struct consumer *consumer)
231 struct timeval start = ast_tvnow();
232 struct timespec end = {
233 .tv_sec = start.tv_sec + 3,
234 .tv_nsec = start.tv_usec * 1000
237 SCOPED_MUTEX(lock, &consumer->lock);
239 while (!consumer->complete) {
240 int r = ast_cond_timedwait(&consumer->out, &consumer->lock, &end);
241 if (r == ETIMEDOUT) {
244 ast_assert(r == 0); /* Not expecting any othet types of errors */
246 return consumer->complete;
249 static int consumer_should_stay(struct consumer *consumer, size_t expected_len)
251 struct timeval start = ast_tvnow();
252 struct timeval diff = {
254 .tv_usec = 100000 /* wait for 100ms */
256 struct timeval end_tv = ast_tvadd(start, diff);
257 struct timespec end = {
258 .tv_sec = end_tv.tv_sec,
259 .tv_nsec = end_tv.tv_usec * 1000
262 SCOPED_MUTEX(lock, &consumer->lock);
264 while (consumer->messages_rxed_len == expected_len) {
265 int r = ast_cond_timedwait(&consumer->out, &consumer->lock, &end);
266 if (r == ETIMEDOUT) {
269 ast_assert(r == 0); /* Not expecting any othet types of errors */
271 return consumer->messages_rxed_len;
274 AST_TEST_DEFINE(subscription_messages)
276 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
277 RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);
278 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
279 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
280 RAII_VAR(struct stasis_message *, test_message, NULL, ao2_cleanup);
281 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
282 RAII_VAR(char *, expected_uniqueid, NULL, ast_free);
284 struct stasis_subscription_change *change;
288 info->name = __func__;
289 info->category = test_category;
290 info->summary = "Test subscribe/unsubscribe messages";
291 info->description = "Test subscribe/unsubscribe messages";
292 return AST_TEST_NOT_RUN;
297 topic = stasis_topic_create("TestTopic");
298 ast_test_validate(test, NULL != topic);
300 consumer = consumer_create(0);
301 ast_test_validate(test, NULL != consumer);
303 uut = stasis_subscribe(topic, consumer_exec, consumer);
304 ast_test_validate(test, NULL != uut);
305 ao2_ref(consumer, +1);
306 expected_uniqueid = ast_strdup(stasis_subscription_uniqueid(uut));
308 uut = stasis_unsubscribe(uut);
309 complete = consumer_wait_for_completion(consumer);
310 ast_test_validate(test, 1 == complete);
312 ast_test_validate(test, 2 == consumer->messages_rxed_len);
313 ast_test_validate(test, stasis_subscription_change_type() == stasis_message_type(consumer->messages_rxed[0]));
314 ast_test_validate(test, stasis_subscription_change_type() == stasis_message_type(consumer->messages_rxed[1]));
316 change = stasis_message_data(consumer->messages_rxed[0]);
317 ast_test_validate(test, topic == change->topic);
318 ast_test_validate(test, 0 == strcmp("Subscribe", change->description));
319 ast_test_validate(test, 0 == strcmp(expected_uniqueid, change->uniqueid));
321 change = stasis_message_data(consumer->messages_rxed[1]);
322 ast_test_validate(test, topic == change->topic);
323 ast_test_validate(test, 0 == strcmp("Unsubscribe", change->description));
324 ast_test_validate(test, 0 == strcmp(expected_uniqueid, change->uniqueid));
326 return AST_TEST_PASS;
329 AST_TEST_DEFINE(publish)
331 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
332 RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);
333 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
334 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
335 RAII_VAR(struct stasis_message *, test_message, NULL, ao2_cleanup);
336 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
342 info->name = __func__;
343 info->category = test_category;
344 info->summary = "Test simple subscriptions";
345 info->description = "Test simple subscriptions";
346 return AST_TEST_NOT_RUN;
351 topic = stasis_topic_create("TestTopic");
352 ast_test_validate(test, NULL != topic);
354 consumer = consumer_create(1);
355 ast_test_validate(test, NULL != consumer);
357 uut = stasis_subscribe(topic, consumer_exec, consumer);
358 ast_test_validate(test, NULL != uut);
359 ao2_ref(consumer, +1);
361 test_data = ao2_alloc(1, NULL);
362 ast_test_validate(test, NULL != test_data);
363 test_message_type = stasis_message_type_create("TestMessage", NULL);
364 test_message = stasis_message_create(test_message_type, test_data);
366 stasis_publish(topic, test_message);
368 actual_len = consumer_wait_for(consumer, 1);
369 ast_test_validate(test, 1 == actual_len);
370 actual = stasis_message_data(consumer->messages_rxed[0]);
371 ast_test_validate(test, test_data == actual);
373 return AST_TEST_PASS;
376 AST_TEST_DEFINE(unsubscribe_stops_messages)
378 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
379 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
380 RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);
381 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
382 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
383 RAII_VAR(struct stasis_message *, test_message, NULL, ao2_cleanup);
388 info->name = __func__;
389 info->category = test_category;
390 info->summary = "Test simple subscriptions";
391 info->description = "Test simple subscriptions";
392 return AST_TEST_NOT_RUN;
397 topic = stasis_topic_create("TestTopic");
398 ast_test_validate(test, NULL != topic);
400 consumer = consumer_create(1);
401 ast_test_validate(test, NULL != consumer);
403 uut = stasis_subscribe(topic, consumer_exec, consumer);
404 ast_test_validate(test, NULL != uut);
405 ao2_ref(consumer, +1);
407 uut = stasis_unsubscribe(uut);
409 test_data = ao2_alloc(1, NULL);
410 ast_test_validate(test, NULL != test_data);
411 test_message_type = stasis_message_type_create("TestMessage", NULL);
412 test_message = stasis_message_create(test_message_type, test_data);
414 stasis_publish(topic, test_message);
416 actual_len = consumer_should_stay(consumer, 0);
417 ast_test_validate(test, 0 == actual_len);
419 return AST_TEST_PASS;
422 AST_TEST_DEFINE(forward)
424 RAII_VAR(struct stasis_topic *, parent_topic, NULL, ao2_cleanup);
425 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
427 RAII_VAR(struct consumer *, parent_consumer, NULL, ao2_cleanup);
428 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
430 RAII_VAR(struct stasis_subscription *, forward_sub, NULL, stasis_unsubscribe);
431 RAII_VAR(struct stasis_subscription *, parent_sub, NULL, stasis_unsubscribe);
432 RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);
434 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
435 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
436 RAII_VAR(struct stasis_message *, test_message, NULL, ao2_cleanup);
441 info->name = __func__;
442 info->category = test_category;
443 info->summary = "Test sending events to a parent topic";
444 info->description = "Test sending events to a parent topic.\n"
445 "This test creates three topics (one parent, two children)\n"
446 "and publishes a message to one child, and verifies it's\n"
447 "only seen by that child and the parent";
448 return AST_TEST_NOT_RUN;
453 parent_topic = stasis_topic_create("ParentTestTopic");
454 ast_test_validate(test, NULL != parent_topic);
455 topic = stasis_topic_create("TestTopic");
456 ast_test_validate(test, NULL != topic);
458 forward_sub = stasis_forward_all(topic, parent_topic);
459 ast_test_validate(test, NULL != forward_sub);
461 parent_consumer = consumer_create(1);
462 ast_test_validate(test, NULL != parent_consumer);
463 consumer = consumer_create(1);
464 ast_test_validate(test, NULL != consumer);
466 parent_sub = stasis_subscribe(parent_topic, consumer_exec, parent_consumer);
467 ast_test_validate(test, NULL != parent_sub);
468 ao2_ref(parent_consumer, +1);
469 sub = stasis_subscribe(topic, consumer_exec, consumer);
470 ast_test_validate(test, NULL != sub);
471 ao2_ref(consumer, +1);
473 test_data = ao2_alloc(1, NULL);
474 ast_test_validate(test, NULL != test_data);
475 test_message_type = stasis_message_type_create("TestMessage", NULL);
476 test_message = stasis_message_create(test_message_type, test_data);
478 stasis_publish(topic, test_message);
480 actual_len = consumer_wait_for(consumer, 1);
481 ast_test_validate(test, 1 == actual_len);
482 actual_len = consumer_wait_for(parent_consumer, 1);
483 ast_test_validate(test, 1 == actual_len);
485 return AST_TEST_PASS;
488 AST_TEST_DEFINE(interleaving)
490 RAII_VAR(struct stasis_topic *, parent_topic, NULL, ao2_cleanup);
491 RAII_VAR(struct stasis_topic *, topic1, NULL, ao2_cleanup);
492 RAII_VAR(struct stasis_topic *, topic2, NULL, ao2_cleanup);
494 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
496 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
498 RAII_VAR(struct stasis_message *, test_message1, NULL, ao2_cleanup);
499 RAII_VAR(struct stasis_message *, test_message2, NULL, ao2_cleanup);
500 RAII_VAR(struct stasis_message *, test_message3, NULL, ao2_cleanup);
502 RAII_VAR(struct stasis_subscription *, forward_sub1, NULL, stasis_unsubscribe);
503 RAII_VAR(struct stasis_subscription *, forward_sub2, NULL, stasis_unsubscribe);
504 RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);
506 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
512 info->name = __func__;
513 info->category = test_category;
514 info->summary = "Test sending interleaved events to a parent topic";
515 info->description = "Test sending events to a parent topic.\n"
516 "This test creates three topics (one parent, two children)\n"
517 "and publishes messages alternately between the children.\n"
518 "It verifies that the messages are received in the expected\n"
520 return AST_TEST_NOT_RUN;
525 test_message_type = stasis_message_type_create("test", NULL);
526 ast_test_validate(test, NULL != test_message_type);
528 test_data = ao2_alloc(1, NULL);
529 ast_test_validate(test, NULL != test_data);
531 test_message1 = stasis_message_create(test_message_type, test_data);
532 ast_test_validate(test, NULL != test_message1);
533 test_message2 = stasis_message_create(test_message_type, test_data);
534 ast_test_validate(test, NULL != test_message2);
535 test_message3 = stasis_message_create(test_message_type, test_data);
536 ast_test_validate(test, NULL != test_message3);
538 parent_topic = stasis_topic_create("ParentTestTopic");
539 ast_test_validate(test, NULL != parent_topic);
540 topic1 = stasis_topic_create("Topic1");
541 ast_test_validate(test, NULL != topic1);
542 topic2 = stasis_topic_create("Topic2");
543 ast_test_validate(test, NULL != topic2);
545 forward_sub1 = stasis_forward_all(topic1, parent_topic);
546 ast_test_validate(test, NULL != forward_sub1);
547 forward_sub2 = stasis_forward_all(topic2, parent_topic);
548 ast_test_validate(test, NULL != forward_sub2);
550 consumer = consumer_create(1);
551 ast_test_validate(test, NULL != consumer);
553 sub = stasis_subscribe(parent_topic, consumer_exec, consumer);
554 ast_test_validate(test, NULL != sub);
555 ao2_ref(consumer, +1);
557 stasis_publish(topic1, test_message1);
558 stasis_publish(topic2, test_message2);
559 stasis_publish(topic1, test_message3);
561 actual_len = consumer_wait_for(consumer, 3);
562 ast_test_validate(test, 3 == actual_len);
564 ast_test_validate(test, test_message1 == consumer->messages_rxed[0]);
565 ast_test_validate(test, test_message2 == consumer->messages_rxed[1]);
566 ast_test_validate(test, test_message3 == consumer->messages_rxed[2]);
568 return AST_TEST_PASS;
571 struct cache_test_data {
576 static void cache_test_data_dtor(void *obj)
578 struct cache_test_data *data = obj;
580 ast_free(data->value);
583 static struct stasis_message *cache_test_message_create(struct stasis_message_type *type, const char *name, const char *value)
585 RAII_VAR(struct cache_test_data *, data, NULL, ao2_cleanup);
587 data = ao2_alloc(sizeof(*data), cache_test_data_dtor);
592 ast_assert(name != NULL);
593 ast_assert(value != NULL);
595 data->id = ast_strdup(name);
596 data->value = ast_strdup(value);
597 if (!data->id || !data->value) {
601 return stasis_message_create(type, data);
604 static const char *cache_test_data_id(struct stasis_message *message) {
605 struct cache_test_data *cachable = stasis_message_data(message);
607 if (0 != strcmp("Cacheable", stasis_message_type_name(stasis_message_type(message)))) {
613 AST_TEST_DEFINE(cache_filter)
615 RAII_VAR(struct stasis_message_type *, non_cache_type, NULL, ao2_cleanup);
616 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
617 RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
618 RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);
619 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
620 RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);
621 RAII_VAR(struct stasis_message *, test_message, NULL, ao2_cleanup);
626 info->name = __func__;
627 info->category = test_category;
628 info->summary = "Test caching topics only forward cache_update messages.";
629 info->description = "Test caching topics only forward cache_update messages.";
630 return AST_TEST_NOT_RUN;
635 non_cache_type = stasis_message_type_create("NonCacheable", NULL);
636 ast_test_validate(test, NULL != non_cache_type);
637 topic = stasis_topic_create("SomeTopic");
638 ast_test_validate(test, NULL != topic);
639 cache = stasis_cache_create(cache_test_data_id);
640 ast_test_validate(test, NULL != cache);
641 caching_topic = stasis_caching_topic_create(topic, cache);
642 ast_test_validate(test, NULL != caching_topic);
643 consumer = consumer_create(1);
644 ast_test_validate(test, NULL != consumer);
645 sub = stasis_subscribe(stasis_caching_get_topic(caching_topic), consumer_exec, consumer);
646 ast_test_validate(test, NULL != sub);
647 ao2_ref(consumer, +1);
649 test_message = cache_test_message_create(non_cache_type, "1", "1");
650 ast_test_validate(test, NULL != test_message);
652 stasis_publish(topic, test_message);
654 actual_len = consumer_should_stay(consumer, 0);
655 ast_test_validate(test, 0 == actual_len);
657 return AST_TEST_PASS;
660 AST_TEST_DEFINE(cache)
662 RAII_VAR(struct stasis_message_type *, cache_type, NULL, ao2_cleanup);
663 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
664 RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
665 RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);
666 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
667 RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);
668 RAII_VAR(struct stasis_message *, test_message1_1, NULL, ao2_cleanup);
669 RAII_VAR(struct stasis_message *, test_message2_1, NULL, ao2_cleanup);
670 RAII_VAR(struct stasis_message *, test_message2_2, NULL, ao2_cleanup);
671 RAII_VAR(struct stasis_message *, test_message1_clear, NULL, ao2_cleanup);
673 struct stasis_cache_update *actual_update;
677 info->name = __func__;
678 info->category = test_category;
679 info->summary = "Test passing messages through cache topic unscathed.";
680 info->description = "Test passing messages through cache topic unscathed.";
681 return AST_TEST_NOT_RUN;
686 cache_type = stasis_message_type_create("Cacheable", NULL);
687 ast_test_validate(test, NULL != cache_type);
688 topic = stasis_topic_create("SomeTopic");
689 ast_test_validate(test, NULL != topic);
690 cache = stasis_cache_create(cache_test_data_id);
691 ast_test_validate(test, NULL != cache);
692 caching_topic = stasis_caching_topic_create(topic, cache);
693 ast_test_validate(test, NULL != caching_topic);
694 consumer = consumer_create(1);
695 ast_test_validate(test, NULL != consumer);
696 sub = stasis_subscribe(stasis_caching_get_topic(caching_topic), consumer_exec, consumer);
697 ast_test_validate(test, NULL != sub);
698 ao2_ref(consumer, +1);
700 test_message1_1 = cache_test_message_create(cache_type, "1", "1");
701 ast_test_validate(test, NULL != test_message1_1);
702 test_message2_1 = cache_test_message_create(cache_type, "2", "1");
703 ast_test_validate(test, NULL != test_message2_1);
705 /* Post a couple of snapshots */
706 stasis_publish(topic, test_message1_1);
707 stasis_publish(topic, test_message2_1);
708 actual_len = consumer_wait_for(consumer, 2);
709 ast_test_validate(test, 2 == actual_len);
711 /* Check for new snapshot messages */
712 ast_test_validate(test, stasis_cache_update_type() == stasis_message_type(consumer->messages_rxed[0]));
713 actual_update = stasis_message_data(consumer->messages_rxed[0]);
714 ast_test_validate(test, topic == actual_update->topic);
715 ast_test_validate(test, NULL == actual_update->old_snapshot);
716 ast_test_validate(test, test_message1_1 == actual_update->new_snapshot);
717 ast_test_validate(test, test_message1_1 == stasis_cache_get(cache, cache_type, "1"));
718 /* stasis_cache_get returned a ref, so unref test_message1_1 */
719 ao2_ref(test_message1_1, -1);
721 ast_test_validate(test, stasis_cache_update_type() == stasis_message_type(consumer->messages_rxed[1]));
722 actual_update = stasis_message_data(consumer->messages_rxed[1]);
723 ast_test_validate(test, topic == actual_update->topic);
724 ast_test_validate(test, NULL == actual_update->old_snapshot);
725 ast_test_validate(test, test_message2_1 == actual_update->new_snapshot);
726 ast_test_validate(test, test_message2_1 == stasis_cache_get(cache, cache_type, "2"));
727 /* stasis_cache_get returned a ref, so unref test_message2_1 */
728 ao2_ref(test_message2_1, -1);
730 /* Update snapshot 2 */
731 test_message2_2 = cache_test_message_create(cache_type, "2", "2");
732 ast_test_validate(test, NULL != test_message2_2);
733 stasis_publish(topic, test_message2_2);
735 actual_len = consumer_wait_for(consumer, 3);
736 ast_test_validate(test, 3 == actual_len);
738 actual_update = stasis_message_data(consumer->messages_rxed[2]);
739 ast_test_validate(test, topic == actual_update->topic);
740 ast_test_validate(test, test_message2_1 == actual_update->old_snapshot);
741 ast_test_validate(test, test_message2_2 == actual_update->new_snapshot);
742 ast_test_validate(test, test_message2_2 == stasis_cache_get(cache, cache_type, "2"));
743 /* stasis_cache_get returned a ref, so unref test_message2_2 */
744 ao2_ref(test_message2_2, -1);
746 /* Clear snapshot 1 */
747 test_message1_clear = stasis_cache_clear_create(test_message1_1);
748 ast_test_validate(test, NULL != test_message1_clear);
749 stasis_publish(topic, test_message1_clear);
751 actual_len = consumer_wait_for(consumer, 4);
752 ast_test_validate(test, 4 == actual_len);
754 actual_update = stasis_message_data(consumer->messages_rxed[3]);
755 ast_test_validate(test, topic == actual_update->topic);
756 ast_test_validate(test, test_message1_1 == actual_update->old_snapshot);
757 ast_test_validate(test, NULL == actual_update->new_snapshot);
758 ast_test_validate(test, NULL == stasis_cache_get(cache, cache_type, "1"));
760 return AST_TEST_PASS;
763 AST_TEST_DEFINE(cache_dump)
765 RAII_VAR(struct stasis_message_type *, cache_type, NULL, ao2_cleanup);
766 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
767 RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
768 RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);
769 RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);
770 RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);
771 RAII_VAR(struct stasis_message *, test_message1_1, NULL, ao2_cleanup);
772 RAII_VAR(struct stasis_message *, test_message2_1, NULL, ao2_cleanup);
773 RAII_VAR(struct stasis_message *, test_message2_2, NULL, ao2_cleanup);
774 RAII_VAR(struct stasis_message *, test_message1_clear, NULL, ao2_cleanup);
775 RAII_VAR(struct ao2_container *, cache_dump, NULL, ao2_cleanup);
777 struct ao2_iterator i;
782 info->name = __func__;
783 info->category = test_category;
784 info->summary = "Test passing messages through cache topic unscathed.";
785 info->description = "Test passing messages through cache topic unscathed.";
786 return AST_TEST_NOT_RUN;
791 cache_type = stasis_message_type_create("Cacheable", NULL);
792 ast_test_validate(test, NULL != cache_type);
793 topic = stasis_topic_create("SomeTopic");
794 ast_test_validate(test, NULL != topic);
795 cache = stasis_cache_create(cache_test_data_id);
796 ast_test_validate(test, NULL != cache);
797 caching_topic = stasis_caching_topic_create(topic, cache);
798 ast_test_validate(test, NULL != caching_topic);
799 consumer = consumer_create(1);
800 ast_test_validate(test, NULL != consumer);
801 sub = stasis_subscribe(stasis_caching_get_topic(caching_topic), consumer_exec, consumer);
802 ast_test_validate(test, NULL != sub);
803 ao2_ref(consumer, +1);
805 test_message1_1 = cache_test_message_create(cache_type, "1", "1");
806 ast_test_validate(test, NULL != test_message1_1);
807 test_message2_1 = cache_test_message_create(cache_type, "2", "1");
808 ast_test_validate(test, NULL != test_message2_1);
810 /* Post a couple of snapshots */
811 stasis_publish(topic, test_message1_1);
812 stasis_publish(topic, test_message2_1);
813 actual_len = consumer_wait_for(consumer, 2);
814 ast_test_validate(test, 2 == actual_len);
816 /* Check the cache */
817 cache_dump = stasis_cache_dump(cache, NULL);
818 ast_test_validate(test, NULL != cache_dump);
819 ast_test_validate(test, 2 == ao2_container_count(cache_dump));
820 i = ao2_iterator_init(cache_dump, 0);
821 while ((obj = ao2_iterator_next(&i))) {
822 RAII_VAR(struct stasis_message *, actual_cache_entry, obj, ao2_cleanup);
823 ast_test_validate(test, actual_cache_entry == test_message1_1 || actual_cache_entry == test_message2_1);
826 /* Update snapshot 2 */
827 test_message2_2 = cache_test_message_create(cache_type, "2", "2");
828 ast_test_validate(test, NULL != test_message2_2);
829 stasis_publish(topic, test_message2_2);
831 actual_len = consumer_wait_for(consumer, 3);
832 ast_test_validate(test, 3 == actual_len);
834 /* Check the cache */
835 cache_dump = stasis_cache_dump(cache, NULL);
836 ast_test_validate(test, NULL != cache_dump);
837 ast_test_validate(test, 2 == ao2_container_count(cache_dump));
838 i = ao2_iterator_init(cache_dump, 0);
839 while ((obj = ao2_iterator_next(&i))) {
840 RAII_VAR(struct stasis_message *, actual_cache_entry, obj, ao2_cleanup);
841 ast_test_validate(test, actual_cache_entry == test_message1_1 || actual_cache_entry == test_message2_2);
844 /* Clear snapshot 1 */
845 test_message1_clear = stasis_cache_clear_create(test_message1_1);
846 ast_test_validate(test, NULL != test_message1_clear);
847 stasis_publish(topic, test_message1_clear);
849 actual_len = consumer_wait_for(consumer, 4);
850 ast_test_validate(test, 4 == actual_len);
852 /* Check the cache */
853 cache_dump = stasis_cache_dump(cache, NULL);
854 ast_test_validate(test, NULL != cache_dump);
855 ast_test_validate(test, 1 == ao2_container_count(cache_dump));
856 i = ao2_iterator_init(cache_dump, 0);
857 while ((obj = ao2_iterator_next(&i))) {
858 RAII_VAR(struct stasis_message *, actual_cache_entry, obj, ao2_cleanup);
859 ast_test_validate(test, actual_cache_entry == test_message2_2);
862 /* Dump the cache to ensure that it has no subscription change items in it since those aren't cached */
863 ao2_cleanup(cache_dump);
864 cache_dump = stasis_cache_dump(cache, stasis_subscription_change_type());
865 ast_test_validate(test, 0 == ao2_container_count(cache_dump));
867 return AST_TEST_PASS;
870 AST_TEST_DEFINE(route_conflicts)
872 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
873 RAII_VAR(struct stasis_message_router *, uut, NULL, stasis_message_router_unsubscribe_and_join);
874 RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);
875 RAII_VAR(struct consumer *, consumer1, NULL, ao2_cleanup);
876 RAII_VAR(struct consumer *, consumer2, NULL, ao2_cleanup);
881 info->name = __func__;
882 info->category = test_category;
884 "Multiple routes to the same message_type should fail";
886 "Multiple routes to the same message_type should fail";
887 return AST_TEST_NOT_RUN;
892 topic = stasis_topic_create("TestTopic");
893 ast_test_validate(test, NULL != topic);
895 consumer1 = consumer_create(1);
896 ast_test_validate(test, NULL != consumer1);
897 consumer2 = consumer_create(1);
898 ast_test_validate(test, NULL != consumer2);
900 test_message_type = stasis_message_type_create("TestMessage", NULL);
901 ast_test_validate(test, NULL != test_message_type);
903 uut = stasis_message_router_create(topic);
904 ast_test_validate(test, NULL != uut);
906 ret = stasis_message_router_add(
907 uut, test_message_type, consumer_exec, consumer1);
908 ast_test_validate(test, 0 == ret);
909 ret = stasis_message_router_add(
910 uut, test_message_type, consumer_exec, consumer2);
911 ast_test_validate(test, 0 != ret);
913 return AST_TEST_PASS;
916 AST_TEST_DEFINE(router)
918 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
919 RAII_VAR(struct stasis_message_router *, uut, NULL, stasis_message_router_unsubscribe_and_join);
920 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
921 RAII_VAR(struct stasis_message_type *, test_message_type1, NULL, ao2_cleanup);
922 RAII_VAR(struct stasis_message_type *, test_message_type2, NULL, ao2_cleanup);
923 RAII_VAR(struct stasis_message_type *, test_message_type3, NULL, ao2_cleanup);
924 RAII_VAR(struct consumer *, consumer1, NULL, ao2_cleanup);
925 RAII_VAR(struct consumer *, consumer2, NULL, ao2_cleanup);
926 RAII_VAR(struct consumer *, consumer3, NULL, ao2_cleanup);
927 RAII_VAR(struct stasis_message *, test_message1, NULL, ao2_cleanup);
928 RAII_VAR(struct stasis_message *, test_message2, NULL, ao2_cleanup);
929 RAII_VAR(struct stasis_message *, test_message3, NULL, ao2_cleanup);
931 struct stasis_message *actual;
935 info->name = __func__;
936 info->category = test_category;
937 info->summary = "Test simple message routing";
938 info->description = "Test simple message routing";
939 return AST_TEST_NOT_RUN;
944 topic = stasis_topic_create("TestTopic");
945 ast_test_validate(test, NULL != topic);
947 consumer1 = consumer_create(1);
948 ast_test_validate(test, NULL != consumer1);
949 consumer2 = consumer_create(1);
950 ast_test_validate(test, NULL != consumer2);
951 consumer3 = consumer_create(1);
952 ast_test_validate(test, NULL != consumer3);
954 test_message_type1 = stasis_message_type_create("TestMessage1", NULL);
955 ast_test_validate(test, NULL != test_message_type1);
956 test_message_type2 = stasis_message_type_create("TestMessage2", NULL);
957 ast_test_validate(test, NULL != test_message_type2);
958 test_message_type3 = stasis_message_type_create("TestMessage3", NULL);
959 ast_test_validate(test, NULL != test_message_type3);
961 uut = stasis_message_router_create(topic);
962 ast_test_validate(test, NULL != uut);
964 ret = stasis_message_router_add(
965 uut, test_message_type1, consumer_exec, consumer1);
966 ast_test_validate(test, 0 == ret);
967 ao2_ref(consumer1, +1);
968 ret = stasis_message_router_add(
969 uut, test_message_type2, consumer_exec, consumer2);
970 ast_test_validate(test, 0 == ret);
971 ao2_ref(consumer2, +1);
972 ret = stasis_message_router_set_default(uut, consumer_exec, consumer3);
973 ast_test_validate(test, 0 == ret);
974 ao2_ref(consumer3, +1);
976 test_data = ao2_alloc(1, NULL);
977 ast_test_validate(test, NULL != test_data);
978 test_message1 = stasis_message_create(test_message_type1, test_data);
979 ast_test_validate(test, NULL != test_message1);
980 test_message2 = stasis_message_create(test_message_type2, test_data);
981 ast_test_validate(test, NULL != test_message2);
982 test_message3 = stasis_message_create(test_message_type3, test_data);
983 ast_test_validate(test, NULL != test_message3);
985 stasis_publish(topic, test_message1);
986 stasis_publish(topic, test_message2);
987 stasis_publish(topic, test_message3);
989 actual_len = consumer_wait_for(consumer1, 1);
990 ast_test_validate(test, 1 == actual_len);
991 actual_len = consumer_wait_for(consumer2, 1);
992 ast_test_validate(test, 1 == actual_len);
993 actual_len = consumer_wait_for(consumer3, 1);
994 ast_test_validate(test, 1 == actual_len);
996 actual = consumer1->messages_rxed[0];
997 ast_test_validate(test, test_message1 == actual);
999 actual = consumer2->messages_rxed[0];
1000 ast_test_validate(test, test_message2 == actual);
1002 actual = consumer3->messages_rxed[0];
1003 ast_test_validate(test, test_message3 == actual);
1005 /* consumer1 and consumer2 do not get the final message. */
1006 ao2_cleanup(consumer1);
1007 ao2_cleanup(consumer2);
1009 return AST_TEST_PASS;
1012 static const char *cache_simple(struct stasis_message *message) {
1013 const char *type_name =
1014 stasis_message_type_name(stasis_message_type(message));
1015 if (!ast_begins_with(type_name, "Cache")) {
1022 AST_TEST_DEFINE(router_cache_updates)
1024 RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);
1025 RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
1026 RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe_and_join);
1027 RAII_VAR(struct stasis_message_type *, test_message_type1, NULL, ao2_cleanup);
1028 RAII_VAR(struct stasis_message_type *, test_message_type2, NULL, ao2_cleanup);
1029 RAII_VAR(struct stasis_message_type *, test_message_type3, NULL, ao2_cleanup);
1030 RAII_VAR(struct stasis_message_router *, uut, NULL, stasis_message_router_unsubscribe_and_join);
1031 RAII_VAR(char *, test_data, NULL, ao2_cleanup);
1032 RAII_VAR(struct stasis_message *, test_message1, NULL, ao2_cleanup);
1033 RAII_VAR(struct stasis_message *, test_message2, NULL, ao2_cleanup);
1034 RAII_VAR(struct stasis_message *, test_message3, NULL, ao2_cleanup);
1035 RAII_VAR(struct consumer *, consumer1, NULL, ao2_cleanup);
1036 RAII_VAR(struct consumer *, consumer2, NULL, ao2_cleanup);
1037 RAII_VAR(struct consumer *, consumer3, NULL, ao2_cleanup);
1038 RAII_VAR(struct stasis_message *, message1, NULL, ao2_cleanup);
1039 RAII_VAR(struct stasis_message *, message2, NULL, ao2_cleanup);
1040 struct stasis_cache_update *update;
1041 int actual_len, ret;
1042 struct stasis_message *actual;
1046 info->name = __func__;
1047 info->category = test_category;
1048 info->summary = "Test special handling cache_update messages";
1049 info->description = "Test special handling cache_update messages";
1050 return AST_TEST_NOT_RUN;
1055 topic = stasis_topic_create("TestTopic");
1056 ast_test_validate(test, NULL != topic);
1058 cache = stasis_cache_create(cache_simple);
1059 ast_test_validate(test, NULL != cache);
1060 caching_topic = stasis_caching_topic_create(topic, cache);
1061 ast_test_validate(test, NULL != caching_topic);
1063 consumer1 = consumer_create(1);
1064 ast_test_validate(test, NULL != consumer1);
1065 consumer2 = consumer_create(1);
1066 ast_test_validate(test, NULL != consumer2);
1067 consumer3 = consumer_create(1);
1068 ast_test_validate(test, NULL != consumer3);
1070 test_message_type1 = stasis_message_type_create("Cache1", NULL);
1071 ast_test_validate(test, NULL != test_message_type1);
1072 test_message_type2 = stasis_message_type_create("Cache2", NULL);
1073 ast_test_validate(test, NULL != test_message_type2);
1074 test_message_type3 = stasis_message_type_create("NonCache", NULL);
1075 ast_test_validate(test, NULL != test_message_type3);
1077 uut = stasis_message_router_create(
1078 stasis_caching_get_topic(caching_topic));
1079 ast_test_validate(test, NULL != uut);
1081 ret = stasis_message_router_add_cache_update(
1082 uut, test_message_type1, consumer_exec, consumer1);
1083 ast_test_validate(test, 0 == ret);
1084 ao2_ref(consumer1, +1);
1085 ret = stasis_message_router_add(
1086 uut, stasis_cache_update_type(), consumer_exec, consumer2);
1087 ast_test_validate(test, 0 == ret);
1088 ao2_ref(consumer2, +1);
1089 ret = stasis_message_router_set_default(uut, consumer_exec, consumer3);
1090 ast_test_validate(test, 0 == ret);
1091 ao2_ref(consumer3, +1);
1093 test_data = ao2_alloc(1, NULL);
1094 ast_test_validate(test, NULL != test_data);
1095 test_message1 = stasis_message_create(test_message_type1, test_data);
1096 ast_test_validate(test, NULL != test_message1);
1097 test_message2 = stasis_message_create(test_message_type2, test_data);
1098 ast_test_validate(test, NULL != test_message2);
1099 test_message3 = stasis_message_create(test_message_type3, test_data);
1100 ast_test_validate(test, NULL != test_message3);
1102 stasis_publish(topic, test_message1);
1103 stasis_publish(topic, test_message2);
1104 stasis_publish(topic, test_message3);
1106 actual_len = consumer_wait_for(consumer1, 1);
1107 ast_test_validate(test, 1 == actual_len);
1108 actual_len = consumer_wait_for(consumer2, 1);
1109 ast_test_validate(test, 1 == actual_len);
1110 /* Uncacheable message should not be passed through */
1111 actual_len = consumer_should_stay(consumer3, 0);
1112 ast_test_validate(test, 0 == actual_len);
1114 actual = consumer1->messages_rxed[0];
1115 ast_test_validate(test, stasis_cache_update_type() == stasis_message_type(actual));
1116 update = stasis_message_data(actual);
1117 ast_test_validate(test, test_message_type1 == update->type);
1118 ast_test_validate(test, test_message1 == update->new_snapshot);
1120 actual = consumer2->messages_rxed[0];
1121 ast_test_validate(test, stasis_cache_update_type() == stasis_message_type(actual));
1122 update = stasis_message_data(actual);
1123 ast_test_validate(test, test_message_type2 == update->type);
1124 ast_test_validate(test, test_message2 == update->new_snapshot);
1126 /* consumer1 and consumer2 do not get the final message. */
1127 ao2_cleanup(consumer1);
1128 ao2_cleanup(consumer2);
1130 return AST_TEST_PASS;
1133 AST_TEST_DEFINE(no_to_json)
1135 RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
1136 RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup);
1137 RAII_VAR(char *, data, NULL, ao2_cleanup);
1138 RAII_VAR(struct ast_json *, actual, NULL, ast_json_unref);
1139 char *expected = "SomeData";
1143 info->name = __func__;
1144 info->category = test_category;
1145 info->summary = "Test message to_json function";
1146 info->description = "Test message to_json function";
1147 return AST_TEST_NOT_RUN;
1153 actual = stasis_message_to_json(NULL);
1154 ast_test_validate(test, NULL == actual);
1156 /* Test message with NULL to_json function */
1157 type = stasis_message_type_create("SomeMessage", NULL);
1159 data = ao2_alloc(strlen(expected) + 1, NULL);
1160 strcpy(data, expected);
1161 uut = stasis_message_create(type, data);
1162 ast_test_validate(test, NULL != uut);
1164 actual = stasis_message_to_json(uut);
1165 ast_test_validate(test, NULL == actual);
1167 return AST_TEST_PASS;
1170 AST_TEST_DEFINE(to_json)
1172 RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
1173 RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup);
1174 RAII_VAR(char *, data, NULL, ao2_cleanup);
1175 RAII_VAR(struct ast_json *, actual, NULL, ast_json_unref);
1176 const char *expected_text = "SomeData";
1177 RAII_VAR(struct ast_json *, expected, NULL, ast_json_unref);
1181 info->name = __func__;
1182 info->category = test_category;
1183 info->summary = "Test message to_json function when NULL";
1184 info->description = "Test message to_json function when NULL";
1185 return AST_TEST_NOT_RUN;
1190 type = stasis_message_type_create("SomeMessage", &fake_vtable);
1192 data = ao2_alloc(strlen(expected_text) + 1, NULL);
1193 strcpy(data, expected_text);
1194 uut = stasis_message_create(type, data);
1195 ast_test_validate(test, NULL != uut);
1197 expected = ast_json_string_create(expected_text);
1198 actual = stasis_message_to_json(uut);
1199 ast_test_validate(test, ast_json_equal(expected, actual));
1201 return AST_TEST_PASS;
1204 AST_TEST_DEFINE(no_to_ami)
1206 RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
1207 RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup);
1208 RAII_VAR(char *, data, NULL, ao2_cleanup);
1209 RAII_VAR(struct ast_manager_event_blob *, actual, NULL, ao2_cleanup);
1210 char *expected = "SomeData";
1214 info->name = __func__;
1215 info->category = test_category;
1216 info->summary = "Test message to_ami function when NULL";
1217 info->description = "Test message to_ami function when NULL";
1218 return AST_TEST_NOT_RUN;
1224 actual = stasis_message_to_ami(NULL);
1225 ast_test_validate(test, NULL == actual);
1227 /* Test message with NULL to_ami function */
1228 type = stasis_message_type_create("SomeMessage", NULL);
1230 data = ao2_alloc(strlen(expected) + 1, NULL);
1231 strcpy(data, expected);
1232 uut = stasis_message_create(type, data);
1233 ast_test_validate(test, NULL != uut);
1235 actual = stasis_message_to_ami(uut);
1236 ast_test_validate(test, NULL == actual);
1238 return AST_TEST_PASS;
1241 AST_TEST_DEFINE(to_ami)
1243 RAII_VAR(struct stasis_message_type *, type, NULL, ao2_cleanup);
1244 RAII_VAR(struct stasis_message *, uut, NULL, ao2_cleanup);
1245 RAII_VAR(char *, data, NULL, ao2_cleanup);
1246 RAII_VAR(struct ast_manager_event_blob *, actual, NULL, ao2_cleanup);
1247 const char *expected_text = "SomeData";
1248 const char *expected = "Message: SomeData";
1252 info->name = __func__;
1253 info->category = test_category;
1254 info->summary = "Test message to_ami function";
1255 info->description = "Test message to_ami function";
1256 return AST_TEST_NOT_RUN;
1261 type = stasis_message_type_create("SomeMessage", &fake_vtable);
1263 data = ao2_alloc(strlen(expected_text) + 1, NULL);
1264 strcpy(data, expected_text);
1265 uut = stasis_message_create(type, data);
1266 ast_test_validate(test, NULL != uut);
1268 actual = stasis_message_to_ami(uut);
1269 ast_test_validate(test, strcmp(expected, actual->extra_fields) == 0);
1271 return AST_TEST_PASS;
1274 static int unload_module(void)
1276 AST_TEST_UNREGISTER(message_type);
1277 AST_TEST_UNREGISTER(message);
1278 AST_TEST_UNREGISTER(subscription_messages);
1279 AST_TEST_UNREGISTER(publish);
1280 AST_TEST_UNREGISTER(unsubscribe_stops_messages);
1281 AST_TEST_UNREGISTER(forward);
1282 AST_TEST_UNREGISTER(cache_filter);
1283 AST_TEST_UNREGISTER(cache);
1284 AST_TEST_UNREGISTER(cache_dump);
1285 AST_TEST_UNREGISTER(route_conflicts);
1286 AST_TEST_UNREGISTER(router);
1287 AST_TEST_UNREGISTER(router_cache_updates);
1288 AST_TEST_UNREGISTER(interleaving);
1289 AST_TEST_UNREGISTER(no_to_json);
1290 AST_TEST_UNREGISTER(to_json);
1291 AST_TEST_UNREGISTER(no_to_ami);
1292 AST_TEST_UNREGISTER(to_ami);
1296 static int load_module(void)
1298 AST_TEST_REGISTER(message_type);
1299 AST_TEST_REGISTER(message);
1300 AST_TEST_REGISTER(subscription_messages);
1301 AST_TEST_REGISTER(publish);
1302 AST_TEST_REGISTER(unsubscribe_stops_messages);
1303 AST_TEST_REGISTER(forward);
1304 AST_TEST_REGISTER(cache_filter);
1305 AST_TEST_REGISTER(cache);
1306 AST_TEST_REGISTER(cache_dump);
1307 AST_TEST_REGISTER(route_conflicts);
1308 AST_TEST_REGISTER(router);
1309 AST_TEST_REGISTER(router_cache_updates);
1310 AST_TEST_REGISTER(interleaving);
1311 AST_TEST_REGISTER(no_to_json);
1312 AST_TEST_REGISTER(to_json);
1313 AST_TEST_REGISTER(no_to_ami);
1314 AST_TEST_REGISTER(to_ami);
1315 return AST_MODULE_LOAD_SUCCESS;
1318 AST_MODULE_INFO(ASTERISK_GPL_KEY, 0, "Stasis testing",
1319 .load = load_module,
1320 .unload = unload_module