2 * Copyright 2017 - Philippe Proulx <pproulx@efficios.com>
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; under version 2 of the License.
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
24 #include <babeltrace/ctf-ir/event-class.h>
25 #include <babeltrace/ctf-ir/event.h>
26 #include <babeltrace/ctf-ir/field-types.h>
27 #include <babeltrace/ctf-ir/fields.h>
28 #include <babeltrace/ctf-ir/packet.h>
29 #include <babeltrace/ctf-ir/stream-class.h>
30 #include <babeltrace/ctf-ir/stream.h>
31 #include <babeltrace/ctf-ir/trace.h>
32 #include <babeltrace/graph/clock-class-priority-map.h>
33 #include <babeltrace/graph/component-class-filter.h>
34 #include <babeltrace/graph/component-class-sink.h>
35 #include <babeltrace/graph/component-class-source.h>
36 #include <babeltrace/graph/component-class.h>
37 #include <babeltrace/graph/component-filter.h>
38 #include <babeltrace/graph/component-sink.h>
39 #include <babeltrace/graph/component-source.h>
40 #include <babeltrace/graph/component.h>
41 #include <babeltrace/graph/graph.h>
42 #include <babeltrace/graph/notification-event.h>
43 #include <babeltrace/graph/notification-inactivity.h>
44 #include <babeltrace/graph/notification-iterator.h>
45 #include <babeltrace/graph/notification-packet.h>
46 #include <babeltrace/graph/port.h>
47 #include <babeltrace/graph/private-component-source.h>
48 #include <babeltrace/graph/private-component.h>
49 #include <babeltrace/graph/private-connection.h>
50 #include <babeltrace/graph/private-notification-iterator.h>
51 #include <babeltrace/graph/private-port.h>
52 #include <babeltrace/plugin/plugin.h>
53 #include <babeltrace/ref.h>
62 TEST_NO_UPSTREAM_CONNECTION
,
64 TEST_4_PORTS_WITH_RETRIES
,
65 TEST_SINGLE_END_THEN_MULTIPLE_FULL
,
66 TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL
,
69 enum test_event_type
{
70 TEST_EV_TYPE_NOTIF_UNEXPECTED
,
71 TEST_EV_TYPE_NOTIF_EVENT
,
72 TEST_EV_TYPE_NOTIF_INACTIVITY
,
73 TEST_EV_TYPE_NOTIF_PACKET_BEGIN
,
74 TEST_EV_TYPE_NOTIF_PACKET_END
,
75 TEST_EV_TYPE_NOTIF_STREAM_BEGIN
,
76 TEST_EV_TYPE_NOTIF_STREAM_END
,
79 TEST_EV_TYPE_SENTINEL
,
83 enum test_event_type type
;
87 struct source_muxer_sink
{
88 struct bt_component
*source
;
89 struct bt_component
*muxer
;
90 struct bt_component
*sink
;
93 struct graph_listener_data
{
94 struct bt_graph
*graph
;
95 struct bt_component
*source
;
96 struct bt_component
*muxer
;
97 struct bt_component
*sink
;
100 static bool debug
= false;
101 static enum test current_test
;
102 static GArray
*test_events
;
103 static struct bt_clock_class_priority_map
*src_cc_prio_map
;
104 static struct bt_clock_class_priority_map
*src_empty_cc_prio_map
;
105 static struct bt_ctf_clock_class
*src_clock_class
;
106 static struct bt_ctf_stream_class
*src_stream_class
;
107 static struct bt_ctf_event_class
*src_event_class
;
108 static struct bt_ctf_packet
*src_packet0
;
109 static struct bt_ctf_packet
*src_packet1
;
110 static struct bt_ctf_packet
*src_packet2
;
111 static struct bt_ctf_packet
*src_packet3
;
116 SEQ_PACKET_BEGIN
= -3,
120 struct src_iter_user_data
{
124 struct bt_ctf_packet
*packet
;
127 struct sink_user_data
{
128 struct bt_notification_iterator
*notif_iter
;
131 static int64_t seq1
[] = {
132 24, 53, 97, 105, 119, 210, 222, 240, 292, 317, 353, 407, 433,
133 473, 487, 504, 572, 615, 708, 766, 850, 852, 931, 951, 956, 996,
137 static int64_t seq2
[] = {
138 51, 59, 68, 77, 91, 121, 139, 170, 179, 266, 352, 454, 478, 631,
139 644, 668, 714, 744, 750, 778, 790, 836, SEQ_END
,
142 static int64_t seq3
[] = {
143 8, 71, 209, 254, 298, 320, 350, 393, 419, 624, 651, 678, 717,
144 731, 733, 788, 819, 820, 857, 892, 903, 944, 998, SEQ_END
,
147 static int64_t seq4
[] = {
148 41, 56, 120, 138, 154, 228, 471, 479, 481, 525, 591, 605, 612,
149 618, 632, 670, 696, 825, 863, 867, 871, 884, 953, 985, 999,
153 static int64_t seq1_with_again
[] = {
154 24, 53, 97, 105, 119, 210, SEQ_AGAIN
, SEQ_AGAIN
, 222, 240, 292,
155 317, 353, 407, 433, 473, 487, 504, 572, 615, 708, 766, 850, 852,
156 931, 951, 956, 996, SEQ_END
,
159 static int64_t seq2_with_again
[] = {
160 51, 59, 68, 77, 91, 121, 139, 170, 179, 266, 352, 454, 478, 631,
161 644, 668, 714, 744, 750, 778, 790, 836, SEQ_AGAIN
, SEQ_AGAIN
,
165 static int64_t seq3_with_again
[] = {
166 8, 71, 209, 254, 298, 320, 350, 393, 419, 624, 651, SEQ_AGAIN
,
167 SEQ_AGAIN
, 678, 717, 731, 733, 788, 819, 820, 857, 892, 903,
171 static int64_t seq4_with_again
[] = {
172 SEQ_AGAIN
, 41, 56, 120, 138, 154, 228, 471, 479, 481, 525, 591,
173 605, 612, 618, 632, 670, 696, 825, 863, 867, 871, 884, 953, 985,
177 static int64_t seq5
[] = {
178 1, 4, 189, 1001, SEQ_END
,
182 void clear_test_events(void)
184 g_array_set_size(test_events
, 0);
188 void print_test_event(FILE *fp
, const struct test_event
*event
)
190 fprintf(fp
, "{ type = ");
192 switch (event
->type
) {
193 case TEST_EV_TYPE_NOTIF_UNEXPECTED
:
194 fprintf(fp
, "TEST_EV_TYPE_NOTIF_UNEXPECTED");
196 case TEST_EV_TYPE_NOTIF_EVENT
:
197 fprintf(fp
, "TEST_EV_TYPE_NOTIF_EVENT");
199 case TEST_EV_TYPE_NOTIF_INACTIVITY
:
200 fprintf(fp
, "TEST_EV_TYPE_NOTIF_INACTIVITY");
202 case TEST_EV_TYPE_NOTIF_PACKET_BEGIN
:
203 fprintf(fp
, "TEST_EV_TYPE_NOTIF_PACKET_BEGIN");
205 case TEST_EV_TYPE_NOTIF_PACKET_END
:
206 fprintf(fp
, "TEST_EV_TYPE_NOTIF_PACKET_END");
208 case TEST_EV_TYPE_NOTIF_STREAM_BEGIN
:
209 fprintf(fp
, "TEST_EV_TYPE_NOTIF_STREAM_BEGIN");
211 case TEST_EV_TYPE_NOTIF_STREAM_END
:
212 fprintf(fp
, "TEST_EV_TYPE_NOTIF_STREAM_END");
214 case TEST_EV_TYPE_AGAIN
:
215 fprintf(fp
, "TEST_EV_TYPE_AGAIN");
217 case TEST_EV_TYPE_END
:
218 fprintf(fp
, "TEST_EV_TYPE_END");
220 case TEST_EV_TYPE_SENTINEL
:
221 fprintf(fp
, "TEST_EV_TYPE_SENTINEL");
224 fprintf(fp
, "(UNKNOWN)");
228 switch (event
->type
) {
229 case TEST_EV_TYPE_NOTIF_EVENT
:
230 case TEST_EV_TYPE_NOTIF_INACTIVITY
:
231 fprintf(fp
, ", ts-ns = %" PRId64
, event
->ts_ns
);
240 void append_test_event(struct test_event
*event
)
242 g_array_append_val(test_events
, *event
);
246 bool compare_single_test_events(const struct test_event
*ev_a
,
247 const struct test_event
*ev_b
)
250 fprintf(stderr
, ":: Comparing test events: ");
251 print_test_event(stderr
, ev_a
);
252 fprintf(stderr
, " vs. ");
253 print_test_event(stderr
, ev_b
);
254 fprintf(stderr
, "\n");
257 if (ev_a
->type
!= ev_b
->type
) {
261 switch (ev_a
->type
) {
262 case TEST_EV_TYPE_NOTIF_EVENT
:
263 case TEST_EV_TYPE_NOTIF_INACTIVITY
:
264 if (ev_a
->ts_ns
!= ev_b
->ts_ns
) {
276 bool compare_test_events(const struct test_event
*expected_events
)
278 const struct test_event
*expected_event
= expected_events
;
281 assert(expected_events
);
284 const struct test_event
*event
;
286 if (expected_event
->type
== TEST_EV_TYPE_SENTINEL
) {
290 if (i
>= test_events
->len
) {
294 event
= &g_array_index(test_events
, struct test_event
, i
);
296 if (!compare_single_test_events(event
, expected_event
)) {
304 if (i
!= test_events
->len
) {
312 void init_static_data(void)
315 struct bt_ctf_trace
*trace
;
316 struct bt_ctf_stream
*stream
;
317 struct bt_ctf_field_type
*empty_struct_ft
;
320 test_events
= g_array_new(FALSE
, TRUE
, sizeof(struct test_event
));
324 empty_struct_ft
= bt_ctf_field_type_structure_create();
325 assert(empty_struct_ft
);
326 trace
= bt_ctf_trace_create();
328 ret
= bt_ctf_trace_set_native_byte_order(trace
,
329 BT_CTF_BYTE_ORDER_LITTLE_ENDIAN
);
331 ret
= bt_ctf_trace_set_packet_header_type(trace
, empty_struct_ft
);
333 src_clock_class
= bt_ctf_clock_class_create("my-clock");
334 assert(src_clock_class
);
335 ret
= bt_ctf_clock_class_set_is_absolute(src_clock_class
, 1);
337 ret
= bt_ctf_trace_add_clock_class(trace
, src_clock_class
);
339 src_empty_cc_prio_map
= bt_clock_class_priority_map_create();
340 assert(src_empty_cc_prio_map
);
341 src_cc_prio_map
= bt_clock_class_priority_map_create();
342 assert(src_cc_prio_map
);
343 ret
= bt_clock_class_priority_map_add_clock_class(src_cc_prio_map
,
346 src_stream_class
= bt_ctf_stream_class_create("my-stream-class");
347 assert(src_stream_class
);
348 ret
= bt_ctf_stream_class_set_packet_context_type(src_stream_class
,
351 ret
= bt_ctf_stream_class_set_event_header_type(src_stream_class
,
354 ret
= bt_ctf_stream_class_set_event_context_type(src_stream_class
,
357 src_event_class
= bt_ctf_event_class_create("my-event-class");
358 ret
= bt_ctf_event_class_set_context_type(src_event_class
,
361 ret
= bt_ctf_event_class_set_context_type(src_event_class
,
364 ret
= bt_ctf_stream_class_add_event_class(src_stream_class
,
367 ret
= bt_ctf_trace_add_stream_class(trace
, src_stream_class
);
369 stream
= bt_ctf_stream_create(src_stream_class
, "stream0");
371 src_packet0
= bt_ctf_packet_create(stream
);
374 stream
= bt_ctf_stream_create(src_stream_class
, "stream1");
376 src_packet1
= bt_ctf_packet_create(stream
);
379 stream
= bt_ctf_stream_create(src_stream_class
, "stream2");
381 src_packet2
= bt_ctf_packet_create(stream
);
384 stream
= bt_ctf_stream_create(src_stream_class
, "stream3");
386 src_packet3
= bt_ctf_packet_create(stream
);
391 bt_put(empty_struct_ft
);
395 void fini_static_data(void)
398 g_array_free(test_events
, TRUE
);
401 bt_put(src_empty_cc_prio_map
);
402 bt_put(src_cc_prio_map
);
403 bt_put(src_clock_class
);
404 bt_put(src_stream_class
);
405 bt_put(src_event_class
);
413 void src_iter_finalize(
414 struct bt_private_notification_iterator
*private_notification_iterator
)
416 struct src_iter_user_data
*user_data
=
417 bt_private_notification_iterator_get_user_data(
418 private_notification_iterator
);
426 enum bt_notification_iterator_status
src_iter_init(
427 struct bt_private_notification_iterator
*priv_notif_iter
,
428 struct bt_private_port
*private_port
)
430 struct src_iter_user_data
*user_data
=
431 g_new0(struct src_iter_user_data
, 1);
432 struct bt_port
*port
= bt_port_from_private_port(private_port
);
433 const char *port_name
;
438 ret
= bt_private_notification_iterator_set_user_data(priv_notif_iter
,
441 port_name
= bt_port_get_name(port
);
443 user_data
->iter_index
= port_name
[3] - '0';
446 switch (user_data
->iter_index
) {
448 user_data
->packet
= src_packet0
;
451 user_data
->packet
= src_packet1
;
454 user_data
->packet
= src_packet2
;
457 user_data
->packet
= src_packet3
;
463 switch (current_test
) {
465 if (user_data
->iter_index
== 1) {
466 user_data
->seq
= seq5
;
469 case TEST_SIMPLE_4_PORTS
:
470 if (user_data
->iter_index
== 0) {
471 user_data
->seq
= seq1
;
472 } else if (user_data
->iter_index
== 1) {
473 user_data
->seq
= seq2
;
474 } else if (user_data
->iter_index
== 2) {
475 user_data
->seq
= seq3
;
477 user_data
->seq
= seq4
;
480 case TEST_4_PORTS_WITH_RETRIES
:
481 if (user_data
->iter_index
== 0) {
482 user_data
->seq
= seq1_with_again
;
483 } else if (user_data
->iter_index
== 1) {
484 user_data
->seq
= seq2_with_again
;
485 } else if (user_data
->iter_index
== 2) {
486 user_data
->seq
= seq3_with_again
;
488 user_data
->seq
= seq4_with_again
;
491 case TEST_SINGLE_END_THEN_MULTIPLE_FULL
:
492 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL
:
493 if (user_data
->iter_index
== 0) {
494 /* Ignore: this iterator only returns END */
495 } else if (user_data
->iter_index
== 1) {
496 user_data
->seq
= seq2
;
498 user_data
->seq
= seq3
;
505 return BT_NOTIFICATION_ITERATOR_STATUS_OK
;
509 struct bt_ctf_event
*src_create_event(struct bt_ctf_packet
*packet
,
512 struct bt_ctf_event
*event
= bt_ctf_event_create(src_event_class
);
516 ret
= bt_ctf_event_set_packet(event
, packet
);
520 struct bt_ctf_clock_value
*clock_value
;
522 clock_value
= bt_ctf_clock_value_create(src_clock_class
,
525 ret
= bt_ctf_event_set_clock_value(event
, clock_value
);
533 struct bt_notification_iterator_next_return
src_iter_next_seq(
534 struct src_iter_user_data
*user_data
)
536 struct bt_notification_iterator_next_return next_return
= {
537 .status
= BT_NOTIFICATION_ITERATOR_STATUS_OK
,
541 assert(user_data
->seq
);
542 cur_ts_ns
= user_data
->seq
[user_data
->at
];
547 BT_NOTIFICATION_ITERATOR_STATUS_END
;
551 BT_NOTIFICATION_ITERATOR_STATUS_AGAIN
;
553 case SEQ_PACKET_BEGIN
:
554 next_return
.notification
=
555 bt_notification_packet_begin_create(user_data
->packet
);
556 assert(next_return
.notification
);
559 next_return
.notification
=
560 bt_notification_packet_end_create(user_data
->packet
);
561 assert(next_return
.notification
);
565 struct bt_ctf_event
*event
= src_create_event(
566 user_data
->packet
, cur_ts_ns
);
569 next_return
.notification
= bt_notification_event_create(event
,
572 assert(next_return
.notification
);
577 if (next_return
.status
!= BT_NOTIFICATION_ITERATOR_STATUS_END
) {
585 struct bt_notification_iterator_next_return
src_iter_next(
586 struct bt_private_notification_iterator
*priv_iterator
)
588 struct bt_notification_iterator_next_return next_return
= {
589 .status
= BT_NOTIFICATION_ITERATOR_STATUS_OK
,
590 .notification
= NULL
,
592 struct src_iter_user_data
*user_data
=
593 bt_private_notification_iterator_get_user_data(priv_iterator
);
594 struct bt_private_component
*private_component
=
595 bt_private_notification_iterator_get_private_component(priv_iterator
);
598 assert(private_component
);
600 switch (current_test
) {
602 if (user_data
->iter_index
== 0) {
603 if (user_data
->at
== 0) {
604 next_return
.notification
=
605 bt_notification_packet_begin_create(
607 assert(next_return
.notification
);
608 } else if (user_data
->at
< 6) {
609 struct bt_ctf_event
*event
= src_create_event(
610 user_data
->packet
, -1);
613 next_return
.notification
=
614 bt_notification_event_create(event
,
615 src_empty_cc_prio_map
);
616 assert(next_return
.notification
);
620 BT_NOTIFICATION_ITERATOR_STATUS_END
;
625 next_return
= src_iter_next_seq(user_data
);
628 case TEST_SIMPLE_4_PORTS
:
629 case TEST_4_PORTS_WITH_RETRIES
:
630 next_return
= src_iter_next_seq(user_data
);
632 case TEST_SINGLE_END_THEN_MULTIPLE_FULL
:
633 if (user_data
->iter_index
== 0) {
634 struct bt_private_port
*priv_port
;
636 priv_port
= bt_private_component_source_add_output_private_port(
637 private_component
, "out1");
640 priv_port
= bt_private_component_source_add_output_private_port(
641 private_component
, "out2");
644 next_return
.status
= BT_NOTIFICATION_ITERATOR_STATUS_END
;
646 next_return
= src_iter_next_seq(user_data
);
649 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL
:
650 if (user_data
->iter_index
== 0) {
651 if (user_data
->at
== 0) {
652 next_return
.status
= BT_NOTIFICATION_ITERATOR_STATUS_AGAIN
;
655 struct bt_private_port
*priv_port
;
657 priv_port
= bt_private_component_source_add_output_private_port(
658 private_component
, "out1");
661 priv_port
= bt_private_component_source_add_output_private_port(
662 private_component
, "out2");
665 next_return
.status
= BT_NOTIFICATION_ITERATOR_STATUS_END
;
668 next_return
= src_iter_next_seq(user_data
);
675 bt_put(private_component
);
680 enum bt_component_status
src_init(
681 struct bt_private_component
*private_component
,
682 struct bt_value
*params
, void *init_method_data
)
684 struct bt_private_port
*priv_port
;
688 priv_port
= bt_private_component_source_get_default_output_private_port(
691 ret
= bt_private_port_remove_from_component(priv_port
);
696 switch (current_test
) {
700 case TEST_SINGLE_END_THEN_MULTIPLE_FULL
:
701 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL
:
710 priv_port
= bt_private_component_source_add_output_private_port(
711 private_component
, "out0");
717 priv_port
= bt_private_component_source_add_output_private_port(
718 private_component
, "out1");
724 priv_port
= bt_private_component_source_add_output_private_port(
725 private_component
, "out2");
731 priv_port
= bt_private_component_source_add_output_private_port(
732 private_component
, "out3");
737 return BT_COMPONENT_STATUS_OK
;
741 void src_finalize(struct bt_private_component
*private_component
)
746 enum bt_component_status
sink_consume(
747 struct bt_private_component
*priv_component
)
749 enum bt_component_status ret
= BT_COMPONENT_STATUS_OK
;
750 struct bt_notification
*notification
= NULL
;
751 struct sink_user_data
*user_data
=
752 bt_private_component_get_user_data(priv_component
);
753 enum bt_notification_iterator_status it_ret
;
754 struct test_event test_event
;
755 bool do_append_test_event
= true;
757 assert(user_data
&& user_data
->notif_iter
);
758 it_ret
= bt_notification_iterator_next(user_data
->notif_iter
);
761 ret
= BT_COMPONENT_STATUS_ERROR
;
762 do_append_test_event
= false;
767 case BT_NOTIFICATION_ITERATOR_STATUS_END
:
768 test_event
.type
= TEST_EV_TYPE_END
;
769 ret
= BT_COMPONENT_STATUS_END
;
770 BT_PUT(user_data
->notif_iter
);
772 case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN
:
773 test_event
.type
= TEST_EV_TYPE_AGAIN
;
774 ret
= BT_COMPONENT_STATUS_AGAIN
;
780 notification
= bt_notification_iterator_get_notification(
781 user_data
->notif_iter
);
782 assert(notification
);
784 switch (bt_notification_get_type(notification
)) {
785 case BT_NOTIFICATION_TYPE_EVENT
:
787 struct bt_ctf_event
*event
;
788 struct bt_clock_class_priority_map
*cc_prio_map
;
790 test_event
.type
= TEST_EV_TYPE_NOTIF_EVENT
;
792 bt_notification_event_get_clock_class_priority_map(
795 event
= bt_notification_event_get_event(notification
);
798 if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map
) > 0) {
799 struct bt_ctf_clock_value
*clock_value
;
800 struct bt_ctf_clock_class
*clock_class
=
801 bt_clock_class_priority_map_get_highest_priority_clock_class(
805 clock_value
= bt_ctf_event_get_clock_value(event
,
808 ret
= bt_ctf_clock_value_get_value_ns_from_epoch(
809 clock_value
, &test_event
.ts_ns
);
814 test_event
.ts_ns
= -1;
821 case BT_NOTIFICATION_TYPE_INACTIVITY
:
823 struct bt_clock_class_priority_map
*cc_prio_map
;
825 test_event
.type
= TEST_EV_TYPE_NOTIF_INACTIVITY
;
826 cc_prio_map
= bt_notification_event_get_clock_class_priority_map(
830 if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map
) > 0) {
831 struct bt_ctf_clock_value
*clock_value
;
832 struct bt_ctf_clock_class
*clock_class
=
833 bt_clock_class_priority_map_get_highest_priority_clock_class(
838 bt_notification_inactivity_get_clock_value(
839 notification
, clock_class
);
841 ret
= bt_ctf_clock_value_get_value_ns_from_epoch(
842 clock_value
, &test_event
.ts_ns
);
847 test_event
.ts_ns
= -1;
853 case BT_NOTIFICATION_TYPE_PACKET_BEGIN
:
854 test_event
.type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
;
856 case BT_NOTIFICATION_TYPE_PACKET_END
:
857 test_event
.type
= TEST_EV_TYPE_NOTIF_PACKET_END
;
859 case BT_NOTIFICATION_TYPE_STREAM_BEGIN
:
860 test_event
.type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
;
862 case BT_NOTIFICATION_TYPE_STREAM_END
:
863 test_event
.type
= TEST_EV_TYPE_NOTIF_STREAM_END
;
866 test_event
.type
= TEST_EV_TYPE_NOTIF_UNEXPECTED
;
871 if (do_append_test_event
) {
872 append_test_event(&test_event
);
875 bt_put(notification
);
880 void sink_port_connected(struct bt_private_component
*private_component
,
881 struct bt_private_port
*self_private_port
,
882 struct bt_port
*other_port
)
884 struct bt_private_connection
*priv_conn
=
885 bt_private_port_get_private_connection(self_private_port
);
886 struct sink_user_data
*user_data
= bt_private_component_get_user_data(
891 user_data
->notif_iter
=
892 bt_private_connection_create_notification_iterator(priv_conn
);
893 assert(user_data
->notif_iter
);
898 enum bt_component_status
sink_init(
899 struct bt_private_component
*private_component
,
900 struct bt_value
*params
, void *init_method_data
)
902 struct sink_user_data
*user_data
= g_new0(struct sink_user_data
, 1);
906 ret
= bt_private_component_set_user_data(private_component
,
909 return BT_COMPONENT_STATUS_OK
;
913 void sink_finalize(struct bt_private_component
*private_component
)
915 struct sink_user_data
*user_data
= bt_private_component_get_user_data(
919 bt_put(user_data
->notif_iter
);
925 void create_source_muxer_sink(struct bt_component
**source
,
926 struct bt_component
**muxer
,
927 struct bt_component
**sink
)
929 struct bt_component_class
*src_comp_class
;
930 struct bt_component_class
*muxer_comp_class
;
931 struct bt_component_class
*sink_comp_class
;
934 /* Create source component */
935 src_comp_class
= bt_component_class_source_create("src", src_iter_next
);
936 assert(src_comp_class
);
937 ret
= bt_component_class_set_init_method(src_comp_class
, src_init
);
939 ret
= bt_component_class_set_finalize_method(src_comp_class
,
942 ret
= bt_component_class_source_set_notification_iterator_init_method(
943 src_comp_class
, src_iter_init
);
945 ret
= bt_component_class_source_set_notification_iterator_finalize_method(
946 src_comp_class
, src_iter_finalize
);
948 *source
= bt_component_create(src_comp_class
, "source", NULL
);
951 /* Create muxer component */
952 muxer_comp_class
= bt_plugin_find_component_class("utils", "muxer",
953 BT_COMPONENT_CLASS_TYPE_FILTER
);
954 assert(muxer_comp_class
);
955 *muxer
= bt_component_create(muxer_comp_class
, "muxer", NULL
);
958 /* Create sink component */
959 sink_comp_class
= bt_component_class_sink_create("sink", sink_consume
);
960 assert(sink_comp_class
);
961 ret
= bt_component_class_set_init_method(sink_comp_class
, sink_init
);
963 ret
= bt_component_class_set_finalize_method(sink_comp_class
,
965 ret
= bt_component_class_set_port_connected_method(sink_comp_class
,
966 sink_port_connected
);
968 *sink
= bt_component_create(sink_comp_class
, "sink", NULL
);
970 bt_put(src_comp_class
);
971 bt_put(muxer_comp_class
);
972 bt_put(sink_comp_class
);
976 void do_std_test(enum test test
, const char *name
,
977 const struct test_event
*expected_test_events
,
980 struct bt_component
*src_comp
;
981 struct bt_component
*muxer_comp
;
982 struct bt_component
*sink_comp
;
983 struct bt_port
*upstream_port
;
984 struct bt_port
*downstream_port
;
985 struct bt_graph
*graph
;
990 enum bt_graph_status graph_status
= BT_GRAPH_STATUS_OK
;
994 diag("test: %s", name
);
995 create_source_muxer_sink(&src_comp
, &muxer_comp
, &sink_comp
);
996 graph
= bt_graph_create();
999 /* Connect source output ports to muxer input ports */
1000 if (with_upstream
) {
1001 ret
= bt_component_source_get_output_port_count(src_comp
, &count
);
1004 for (i
= 0; i
< count
; i
++) {
1005 upstream_port
= bt_component_source_get_output_port_at_index(
1007 assert(upstream_port
);
1008 downstream_port
= bt_component_filter_get_input_port_at_index(
1010 assert(downstream_port
);
1011 conn
= bt_graph_connect_ports(graph
,
1012 upstream_port
, downstream_port
);
1015 bt_put(upstream_port
);
1016 bt_put(downstream_port
);
1020 /* Connect muxer output port to sink input port */
1021 upstream_port
= bt_component_filter_get_output_port(muxer_comp
,
1023 assert(upstream_port
);
1024 downstream_port
= bt_component_sink_get_default_input_port(sink_comp
);
1025 assert(downstream_port
);
1026 conn
= bt_graph_connect_ports(graph
, upstream_port
, downstream_port
);
1029 bt_put(upstream_port
);
1030 bt_put(downstream_port
);
1032 while (graph_status
== BT_GRAPH_STATUS_OK
||
1033 graph_status
== BT_GRAPH_STATUS_AGAIN
) {
1034 graph_status
= bt_graph_run(graph
);
1037 ok(graph_status
== BT_GRAPH_STATUS_END
, "graph finishes without any error");
1038 ok(compare_test_events(expected_test_events
),
1039 "the produced sequence of test events is the expected one");
1048 void test_no_ts(void)
1050 const struct test_event expected_test_events
[] = {
1051 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1052 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1053 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1054 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1055 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= -1, },
1056 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= -1, },
1057 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= -1, },
1058 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= -1, },
1059 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= -1, },
1060 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1061 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1062 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 1, },
1063 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 4, },
1064 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 189, },
1065 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 1001, },
1066 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1067 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1068 { .type
= TEST_EV_TYPE_END
, },
1069 { .type
= TEST_EV_TYPE_SENTINEL
, },
1072 do_std_test(TEST_NO_TS
, "event notifications with no time",
1073 expected_test_events
, true);
1077 void test_no_upstream_connection(void)
1079 const struct test_event expected_test_events
[] = {
1080 { .type
= TEST_EV_TYPE_END
, },
1081 { .type
= TEST_EV_TYPE_SENTINEL
, },
1084 do_std_test(TEST_NO_UPSTREAM_CONNECTION
, "no upstream connection",
1085 expected_test_events
, false);
1089 void test_simple_4_ports(void)
1091 const struct test_event expected_test_events
[] = {
1092 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1093 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1094 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1095 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1096 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1097 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1098 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1099 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1100 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 8 },
1101 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 24 },
1102 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 41 },
1103 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 51 },
1104 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 53 },
1105 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 56 },
1106 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 59 },
1107 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 68 },
1108 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 71 },
1109 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 77 },
1110 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 91 },
1111 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 97 },
1112 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 105 },
1113 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 119 },
1114 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 120 },
1115 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 121 },
1116 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 138 },
1117 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 139 },
1118 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 154 },
1119 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 170 },
1120 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 179 },
1121 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 209 },
1122 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 210 },
1123 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 222 },
1124 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 228 },
1125 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 240 },
1126 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 254 },
1127 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 266 },
1128 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 292 },
1129 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 298 },
1130 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 317 },
1131 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 320 },
1132 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 350 },
1133 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 352 },
1134 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 353 },
1135 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 393 },
1136 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 407 },
1137 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 419 },
1138 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 433 },
1139 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 454 },
1140 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 471 },
1141 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 473 },
1142 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 478 },
1143 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 479 },
1144 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 481 },
1145 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 487 },
1146 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 504 },
1147 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 525 },
1148 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 572 },
1149 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 591 },
1150 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 605 },
1151 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 612 },
1152 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 615 },
1153 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 618 },
1154 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 624 },
1155 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 631 },
1156 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 632 },
1157 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 644 },
1158 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 651 },
1159 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 668 },
1160 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 670 },
1161 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 678 },
1162 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 696 },
1163 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 708 },
1164 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 714 },
1165 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 717 },
1166 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 731 },
1167 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 733 },
1168 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 744 },
1169 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 750 },
1170 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 766 },
1171 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 778 },
1172 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 788 },
1173 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 790 },
1174 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 819 },
1175 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 820 },
1176 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 825 },
1177 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 836 },
1178 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1179 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1180 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 850 },
1181 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 852 },
1182 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 857 },
1183 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 863 },
1184 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 867 },
1185 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 871 },
1186 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 884 },
1187 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 892 },
1188 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 903 },
1189 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 931 },
1190 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 944 },
1191 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 951 },
1192 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 953 },
1193 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 956 },
1194 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 985 },
1195 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 996 },
1196 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1197 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1198 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 998 },
1199 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1200 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1201 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 999 },
1202 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1203 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1204 { .type
= TEST_EV_TYPE_END
, },
1205 { .type
= TEST_EV_TYPE_SENTINEL
, },
1208 do_std_test(TEST_SIMPLE_4_PORTS
, "simple: 4 ports without retries",
1209 expected_test_events
, true);
1213 void test_4_ports_with_retries(void)
1215 const struct test_event expected_test_events
[] = {
1216 { .type
= TEST_EV_TYPE_AGAIN
, },
1217 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1218 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1219 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1220 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1221 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1222 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1223 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1224 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1225 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 8 },
1226 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 24 },
1227 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 41 },
1228 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 51 },
1229 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 53 },
1230 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 56 },
1231 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 59 },
1232 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 68 },
1233 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 71 },
1234 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 77 },
1235 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 91 },
1236 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 97 },
1237 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 105 },
1238 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 119 },
1239 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 120 },
1240 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 121 },
1241 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 138 },
1242 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 139 },
1243 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 154 },
1244 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 170 },
1245 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 179 },
1246 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 209 },
1247 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 210 },
1248 { .type
= TEST_EV_TYPE_AGAIN
, },
1249 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 222 },
1250 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 228 },
1251 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 240 },
1252 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 254 },
1253 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 266 },
1254 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 292 },
1255 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 298 },
1256 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 317 },
1257 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 320 },
1258 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 350 },
1259 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 352 },
1260 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 353 },
1261 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 393 },
1262 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 407 },
1263 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 419 },
1264 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 433 },
1265 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 454 },
1266 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 471 },
1267 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 473 },
1268 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 478 },
1269 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 479 },
1270 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 481 },
1271 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 487 },
1272 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 504 },
1273 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 525 },
1274 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 572 },
1275 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 591 },
1276 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 605 },
1277 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 612 },
1278 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 615 },
1279 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 618 },
1280 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 624 },
1281 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 631 },
1282 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 632 },
1283 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 644 },
1284 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 651 },
1285 { .type
= TEST_EV_TYPE_AGAIN
, },
1286 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 668 },
1287 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 670 },
1288 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 678 },
1289 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 696 },
1290 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 708 },
1291 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 714 },
1292 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 717 },
1293 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 731 },
1294 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 733 },
1295 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 744 },
1296 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 750 },
1297 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 766 },
1298 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 778 },
1299 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 788 },
1300 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 790 },
1301 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 819 },
1302 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 820 },
1303 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 825 },
1304 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 836 },
1305 { .type
= TEST_EV_TYPE_AGAIN
, },
1306 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1307 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1308 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 850 },
1309 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 852 },
1310 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 857 },
1311 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 863 },
1312 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 867 },
1313 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 871 },
1314 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 884 },
1315 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 892 },
1316 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 903 },
1317 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 931 },
1318 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 944 },
1319 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 951 },
1320 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 953 },
1321 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 956 },
1322 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 985 },
1323 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 996 },
1324 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1325 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1326 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 998 },
1327 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1328 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1329 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 999 },
1330 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1331 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1332 { .type
= TEST_EV_TYPE_END
, },
1333 { .type
= TEST_EV_TYPE_SENTINEL
, },
1336 do_std_test(TEST_4_PORTS_WITH_RETRIES
, "4 ports with retries",
1337 expected_test_events
, true);
1341 void connect_port_to_first_avail_muxer_port(struct bt_graph
*graph
,
1342 struct bt_port
*source_port
,
1343 struct bt_component
*muxer_comp
)
1345 struct bt_port
*avail_muxer_port
= NULL
;
1351 ret
= bt_component_filter_get_input_port_count(muxer_comp
, &count
);
1354 for (i
= 0; i
< count
; i
++) {
1355 struct bt_port
*muxer_port
=
1356 bt_component_filter_get_input_port_at_index(
1361 if (!bt_port_is_connected(muxer_port
)) {
1362 BT_MOVE(avail_muxer_port
, muxer_port
);
1369 conn
= bt_graph_connect_ports(graph
, source_port
, avail_muxer_port
);
1372 bt_put(avail_muxer_port
);
1376 void graph_port_added_listener_connect_to_avail_muxer_port(struct bt_port
*port
,
1379 struct graph_listener_data
*graph_listener_data
= data
;
1380 struct bt_component
*comp
;
1382 comp
= bt_port_get_component(port
);
1385 if (comp
!= graph_listener_data
->source
) {
1389 connect_port_to_first_avail_muxer_port(graph_listener_data
->graph
,
1390 port
, graph_listener_data
->muxer
);
1397 void test_single_end_then_multiple_full(void)
1399 struct bt_component
*src_comp
;
1400 struct bt_component
*muxer_comp
;
1401 struct bt_component
*sink_comp
;
1402 struct bt_port
*upstream_port
;
1403 struct bt_port
*downstream_port
;
1404 struct bt_graph
*graph
;
1409 enum bt_graph_status graph_status
= BT_GRAPH_STATUS_OK
;
1410 struct graph_listener_data graph_listener_data
;
1411 const struct test_event expected_test_events
[] = {
1412 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1413 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1414 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1415 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1416 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 8 },
1417 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 51 },
1418 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 59 },
1419 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 68 },
1420 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 71 },
1421 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 77 },
1422 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 91 },
1423 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 121 },
1424 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 139 },
1425 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 170 },
1426 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 179 },
1427 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 209 },
1428 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 254 },
1429 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 266 },
1430 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 298 },
1431 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 320 },
1432 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 350 },
1433 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 352 },
1434 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 393 },
1435 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 419 },
1436 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 454 },
1437 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 478 },
1438 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 624 },
1439 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 631 },
1440 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 644 },
1441 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 651 },
1442 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 668 },
1443 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 678 },
1444 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 714 },
1445 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 717 },
1446 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 731 },
1447 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 733 },
1448 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 744 },
1449 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 750 },
1450 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 778 },
1451 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 788 },
1452 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 790 },
1453 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 819 },
1454 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 820 },
1455 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 836 },
1456 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1457 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1458 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 857 },
1459 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 892 },
1460 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 903 },
1461 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 944 },
1462 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 998 },
1463 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1464 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1465 { .type
= TEST_EV_TYPE_END
, },
1466 { .type
= TEST_EV_TYPE_SENTINEL
, },
1469 clear_test_events();
1470 current_test
= TEST_SINGLE_END_THEN_MULTIPLE_FULL
;
1471 diag("test: single end then multiple full");
1472 create_source_muxer_sink(&src_comp
, &muxer_comp
, &sink_comp
);
1473 graph
= bt_graph_create();
1475 graph_listener_data
.graph
= graph
;
1476 graph_listener_data
.source
= src_comp
;
1477 graph_listener_data
.muxer
= muxer_comp
;
1478 graph_listener_data
.sink
= sink_comp
;
1479 ret
= bt_graph_add_port_added_listener(graph
,
1480 graph_port_added_listener_connect_to_avail_muxer_port
,
1481 &graph_listener_data
);
1484 /* Connect source output ports to muxer input ports */
1485 ret
= bt_component_source_get_output_port_count(src_comp
, &count
);
1488 for (i
= 0; i
< count
; i
++) {
1489 upstream_port
= bt_component_source_get_output_port_at_index(
1491 assert(upstream_port
);
1492 connect_port_to_first_avail_muxer_port(graph
,
1493 upstream_port
, muxer_comp
);
1494 bt_put(upstream_port
);
1497 /* Connect muxer output port to sink input port */
1498 upstream_port
= bt_component_filter_get_output_port(muxer_comp
,
1500 assert(upstream_port
);
1501 downstream_port
= bt_component_sink_get_default_input_port(sink_comp
);
1502 assert(downstream_port
);
1503 conn
= bt_graph_connect_ports(graph
, upstream_port
, downstream_port
);
1506 bt_put(upstream_port
);
1507 bt_put(downstream_port
);
1509 while (graph_status
== BT_GRAPH_STATUS_OK
||
1510 graph_status
== BT_GRAPH_STATUS_AGAIN
) {
1511 graph_status
= bt_graph_run(graph
);
1514 ok(graph_status
== BT_GRAPH_STATUS_END
, "graph finishes without any error");
1515 ok(compare_test_events(expected_test_events
),
1516 "the produced sequence of test events is the expected one");
1525 void test_single_again_end_then_multiple_full(void)
1527 struct bt_component
*src_comp
;
1528 struct bt_component
*muxer_comp
;
1529 struct bt_component
*sink_comp
;
1530 struct bt_port
*upstream_port
;
1531 struct bt_port
*downstream_port
;
1532 struct bt_graph
*graph
;
1537 enum bt_graph_status graph_status
= BT_GRAPH_STATUS_OK
;
1538 struct graph_listener_data graph_listener_data
;
1539 const struct test_event expected_test_events
[] = {
1540 { .type
= TEST_EV_TYPE_AGAIN
, },
1541 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1542 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1543 { .type
= TEST_EV_TYPE_NOTIF_STREAM_BEGIN
, },
1544 { .type
= TEST_EV_TYPE_NOTIF_PACKET_BEGIN
, },
1545 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 8 },
1546 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 51 },
1547 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 59 },
1548 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 68 },
1549 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 71 },
1550 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 77 },
1551 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 91 },
1552 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 121 },
1553 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 139 },
1554 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 170 },
1555 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 179 },
1556 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 209 },
1557 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 254 },
1558 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 266 },
1559 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 298 },
1560 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 320 },
1561 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 350 },
1562 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 352 },
1563 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 393 },
1564 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 419 },
1565 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 454 },
1566 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 478 },
1567 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 624 },
1568 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 631 },
1569 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 644 },
1570 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 651 },
1571 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 668 },
1572 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 678 },
1573 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 714 },
1574 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 717 },
1575 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 731 },
1576 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 733 },
1577 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 744 },
1578 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 750 },
1579 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 778 },
1580 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 788 },
1581 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 790 },
1582 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 819 },
1583 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 820 },
1584 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 836 },
1585 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1586 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1587 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 857 },
1588 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 892 },
1589 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 903 },
1590 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 944 },
1591 { .type
= TEST_EV_TYPE_NOTIF_EVENT
, .ts_ns
= 998 },
1592 { .type
= TEST_EV_TYPE_NOTIF_PACKET_END
, },
1593 { .type
= TEST_EV_TYPE_NOTIF_STREAM_END
, },
1594 { .type
= TEST_EV_TYPE_END
, },
1595 { .type
= TEST_EV_TYPE_SENTINEL
, },
1598 clear_test_events();
1599 current_test
= TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL
;
1600 diag("test: single again then end then multiple full");
1601 create_source_muxer_sink(&src_comp
, &muxer_comp
, &sink_comp
);
1602 graph
= bt_graph_create();
1604 graph_listener_data
.graph
= graph
;
1605 graph_listener_data
.source
= src_comp
;
1606 graph_listener_data
.muxer
= muxer_comp
;
1607 graph_listener_data
.sink
= sink_comp
;
1608 ret
= bt_graph_add_port_added_listener(graph
,
1609 graph_port_added_listener_connect_to_avail_muxer_port
,
1610 &graph_listener_data
);
1613 /* Connect source output ports to muxer input ports */
1614 ret
= bt_component_source_get_output_port_count(src_comp
, &count
);
1617 for (i
= 0; i
< count
; i
++) {
1618 upstream_port
= bt_component_source_get_output_port_at_index(
1620 assert(upstream_port
);
1621 connect_port_to_first_avail_muxer_port(graph
,
1622 upstream_port
, muxer_comp
);
1623 bt_put(upstream_port
);
1626 /* Connect muxer output port to sink input port */
1627 upstream_port
= bt_component_filter_get_output_port(muxer_comp
,
1629 assert(upstream_port
);
1630 downstream_port
= bt_component_sink_get_default_input_port(sink_comp
);
1631 assert(downstream_port
);
1632 conn
= bt_graph_connect_ports(graph
, upstream_port
, downstream_port
);
1635 bt_put(upstream_port
);
1636 bt_put(downstream_port
);
1638 while (graph_status
== BT_GRAPH_STATUS_OK
||
1639 graph_status
== BT_GRAPH_STATUS_AGAIN
) {
1640 graph_status
= bt_graph_run(graph
);
1643 ok(graph_status
== BT_GRAPH_STATUS_END
, "graph finishes without any error");
1644 ok(compare_test_events(expected_test_events
),
1645 "the produced sequence of test events is the expected one");
1653 #define DEBUG_ENV_VAR "TEST_UTILS_MUXER_DEBUG"
1655 int main(int argc
, char **argv
)
1657 if (getenv(DEBUG_ENV_VAR
) && strcmp(getenv(DEBUG_ENV_VAR
), "1") == 0) {
1661 plan_tests(NR_TESTS
);
1664 test_no_upstream_connection();
1665 test_simple_4_ports();
1666 test_4_ports_with_retries();
1667 test_single_end_then_multiple_full();
1668 test_single_again_end_then_multiple_full();
1670 return exit_status();