4 * Copyright 2017 - Philippe Proulx <pproulx@efficios.com>
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; under version 2 of the License.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License along
16 * with this program; if not, write to the Free Software Foundation, Inc.,
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
20 #include <babeltrace/babeltrace.h>
21 #include <babeltrace/assert-internal.h>
32 SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
,
33 SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
,
34 SRC_COMP_OUTPUT_PORT_CONNECTED
,
35 SINK_COMP_INPUT_PORT_CONNECTED
,
36 GRAPH_SRC_OUTPUT_PORT_ADDED
,
37 GRAPH_SINK_INPUT_PORT_ADDED
,
38 GRAPH_SRC_SINK_PORTS_CONNECTED
,
44 TEST_SRC_PORT_CONNECTED_ERROR
,
45 TEST_SINK_PORT_CONNECTED_ERROR
,
46 TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED
,
54 const bt_component
*comp
;
55 const bt_port
*self_port
;
56 const bt_port
*other_port
;
57 } src_comp_accept_output_port_connection
;
60 const bt_component
*comp
;
61 const bt_port
*self_port
;
62 const bt_port
*other_port
;
63 } sink_comp_accept_input_port_connection
;
66 const bt_component
*comp
;
67 const bt_port
*self_port
;
68 const bt_port
*other_port
;
69 } src_comp_output_port_connected
;
72 const bt_component
*comp
;
73 const bt_port
*self_port
;
74 const bt_port
*other_port
;
75 } sink_comp_input_port_connected
;
78 const bt_component
*comp
;
80 } graph_src_output_port_added
;
83 const bt_component
*comp
;
85 } graph_sink_input_port_added
;
88 const bt_component
*upstream_comp
;
89 const bt_component
*downstream_comp
;
90 const bt_port
*upstream_port
;
91 const bt_port
*downstream_port
;
92 } graph_src_sink_ports_connected
;
96 static GArray
*events
;
97 static bt_component_class_source
*src_comp_class
;
98 static bt_component_class_sink
*sink_comp_class
;
99 static enum test current_test
;
102 void clear_events(void)
104 g_array_set_size(events
, 0);
108 void append_event(struct event
*event
)
110 g_array_append_val(events
, *event
);
114 bool compare_events(struct event
*ev_a
, struct event
*ev_b
)
116 if (ev_a
->type
!= ev_b
->type
) {
120 switch (ev_a
->type
) {
121 case SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
:
122 if (ev_a
->data
.src_comp_accept_output_port_connection
.comp
!=
123 ev_b
->data
.src_comp_accept_output_port_connection
.comp
) {
127 if (ev_a
->data
.src_comp_accept_output_port_connection
.self_port
!=
128 ev_b
->data
.src_comp_accept_output_port_connection
.self_port
) {
132 if (ev_a
->data
.src_comp_accept_output_port_connection
.other_port
!=
133 ev_b
->data
.src_comp_accept_output_port_connection
.other_port
) {
137 case SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
:
138 if (ev_a
->data
.sink_comp_accept_input_port_connection
.comp
!=
139 ev_b
->data
.sink_comp_accept_input_port_connection
.comp
) {
143 if (ev_a
->data
.sink_comp_accept_input_port_connection
.self_port
!=
144 ev_b
->data
.sink_comp_accept_input_port_connection
.self_port
) {
148 if (ev_a
->data
.sink_comp_accept_input_port_connection
.other_port
!=
149 ev_b
->data
.sink_comp_accept_input_port_connection
.other_port
) {
153 case SRC_COMP_OUTPUT_PORT_CONNECTED
:
154 if (ev_a
->data
.src_comp_output_port_connected
.comp
!=
155 ev_b
->data
.src_comp_output_port_connected
.comp
) {
159 if (ev_a
->data
.src_comp_output_port_connected
.self_port
!=
160 ev_b
->data
.src_comp_output_port_connected
.self_port
) {
164 if (ev_a
->data
.src_comp_output_port_connected
.other_port
!=
165 ev_b
->data
.src_comp_output_port_connected
.other_port
) {
169 case SINK_COMP_INPUT_PORT_CONNECTED
:
170 if (ev_a
->data
.sink_comp_input_port_connected
.comp
!=
171 ev_b
->data
.sink_comp_input_port_connected
.comp
) {
175 if (ev_a
->data
.sink_comp_input_port_connected
.self_port
!=
176 ev_b
->data
.sink_comp_input_port_connected
.self_port
) {
180 if (ev_a
->data
.sink_comp_input_port_connected
.other_port
!=
181 ev_b
->data
.sink_comp_input_port_connected
.other_port
) {
185 case GRAPH_SRC_OUTPUT_PORT_ADDED
:
186 if (ev_a
->data
.graph_src_output_port_added
.comp
!=
187 ev_b
->data
.graph_src_output_port_added
.comp
) {
191 if (ev_a
->data
.graph_src_output_port_added
.port
!=
192 ev_b
->data
.graph_src_output_port_added
.port
) {
196 case GRAPH_SINK_INPUT_PORT_ADDED
:
197 if (ev_a
->data
.graph_sink_input_port_added
.comp
!=
198 ev_b
->data
.graph_sink_input_port_added
.comp
) {
202 if (ev_a
->data
.graph_sink_input_port_added
.port
!=
203 ev_b
->data
.graph_sink_input_port_added
.port
) {
207 case GRAPH_SRC_SINK_PORTS_CONNECTED
:
208 if (ev_a
->data
.graph_src_sink_ports_connected
.upstream_comp
!=
209 ev_b
->data
.graph_src_sink_ports_connected
.upstream_comp
) {
213 if (ev_a
->data
.graph_src_sink_ports_connected
.downstream_comp
!=
214 ev_b
->data
.graph_src_sink_ports_connected
.downstream_comp
) {
218 if (ev_a
->data
.graph_src_sink_ports_connected
.upstream_port
!=
219 ev_b
->data
.graph_src_sink_ports_connected
.upstream_port
) {
223 if (ev_a
->data
.graph_src_sink_ports_connected
.downstream_port
!=
224 ev_b
->data
.graph_src_sink_ports_connected
.downstream_port
) {
236 bool has_event(struct event
*event
)
240 for (i
= 0; i
< events
->len
; i
++) {
241 struct event
*ev
= &g_array_index(events
, struct event
, i
);
243 if (compare_events(event
, ev
)) {
252 size_t event_pos(struct event
*event
)
256 for (i
= 0; i
< events
->len
; i
++) {
257 struct event
*ev
= &g_array_index(events
, struct event
, i
);
259 if (compare_events(event
, ev
)) {
268 bt_self_message_iterator_status
src_iter_next(
269 bt_self_message_iterator
*self_iterator
,
270 bt_message_array_const msgs
, uint64_t capacity
,
273 return BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR
;
277 bt_self_component_status
src_accept_output_port_connection(
278 bt_self_component_source
*self_comp
,
279 bt_self_component_port_output
*self_comp_port
,
280 const bt_port_input
*other_port
)
282 struct event event
= {
283 .type
= SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
,
284 .data
.src_comp_accept_output_port_connection
= {
285 .comp
= bt_self_component_as_component(
286 bt_self_component_source_as_self_component(
288 .self_port
= bt_self_component_port_as_port(
289 bt_self_component_port_output_as_self_component_port(
291 .other_port
= bt_port_input_as_port_const(other_port
),
295 append_event(&event
);
296 return BT_SELF_COMPONENT_STATUS_OK
;
300 bt_self_component_status
sink_accept_input_port_connection(
301 bt_self_component_sink
*self_comp
,
302 bt_self_component_port_input
*self_comp_port
,
303 const bt_port_output
*other_port
)
305 struct event event
= {
306 .type
= SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
,
307 .data
.sink_comp_accept_input_port_connection
= {
308 .comp
= bt_self_component_as_component(
309 bt_self_component_sink_as_self_component(
311 .self_port
= bt_self_component_port_as_port(
312 bt_self_component_port_input_as_self_component_port(
314 .other_port
= bt_port_output_as_port_const(other_port
),
318 append_event(&event
);
319 return BT_SELF_COMPONENT_STATUS_OK
;
323 bt_self_component_status
src_output_port_connected(
324 bt_self_component_source
*self_comp
,
325 bt_self_component_port_output
*self_comp_port
,
326 const bt_port_input
*other_port
)
329 struct event event
= {
330 .type
= SRC_COMP_OUTPUT_PORT_CONNECTED
,
331 .data
.src_comp_output_port_connected
= {
332 .comp
= bt_self_component_as_component(
333 bt_self_component_source_as_self_component(
335 .self_port
= bt_self_component_port_as_port(
336 bt_self_component_port_output_as_self_component_port(
338 .other_port
= bt_port_input_as_port_const(other_port
),
342 append_event(&event
);
344 switch (current_test
) {
345 case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED
:
346 ret
= bt_self_component_source_add_output_port(
347 self_comp
, "hello", NULL
, NULL
);
350 case TEST_SRC_PORT_CONNECTED_ERROR
:
351 return BT_SELF_COMPONENT_STATUS_ERROR
;
356 return BT_SELF_COMPONENT_STATUS_OK
;
360 bt_self_component_status
sink_input_port_connected(
361 bt_self_component_sink
*self_comp
,
362 bt_self_component_port_input
*self_comp_port
,
363 const bt_port_output
*other_port
)
365 struct event event
= {
366 .type
= SINK_COMP_INPUT_PORT_CONNECTED
,
367 .data
.sink_comp_input_port_connected
= {
368 .comp
= bt_self_component_as_component(
369 bt_self_component_sink_as_self_component(
371 .self_port
= bt_self_component_port_as_port(
372 bt_self_component_port_input_as_self_component_port(
374 .other_port
= bt_port_output_as_port_const(other_port
),
378 append_event(&event
);
380 if (current_test
== TEST_SINK_PORT_CONNECTED_ERROR
) {
381 return BT_SELF_COMPONENT_STATUS_ERROR
;
383 return BT_SELF_COMPONENT_STATUS_OK
;
388 bt_self_component_status
src_init(
389 bt_self_component_source
*self_comp
,
390 const bt_value
*params
, void *init_method_data
)
394 ret
= bt_self_component_source_add_output_port(
395 self_comp
, "out", NULL
, NULL
);
397 return BT_SELF_COMPONENT_STATUS_OK
;
401 bt_self_component_status
sink_init(
402 bt_self_component_sink
*self_comp
,
403 const bt_value
*params
, void *init_method_data
)
407 ret
= bt_self_component_sink_add_input_port(self_comp
,
410 return BT_SELF_COMPONENT_STATUS_OK
;
414 bt_self_component_status
sink_consume(
415 bt_self_component_sink
*self_comp
)
417 return BT_SELF_COMPONENT_STATUS_OK
;
421 void graph_src_output_port_added(const bt_component_source
*comp
,
422 const bt_port_output
*port
, void *data
)
424 struct event event
= {
425 .type
= GRAPH_SRC_OUTPUT_PORT_ADDED
,
426 .data
.graph_src_output_port_added
= {
427 .comp
= bt_component_source_as_component_const(comp
),
428 .port
= bt_port_output_as_port_const(port
),
432 append_event(&event
);
436 void graph_sink_input_port_added(const bt_component_sink
*comp
,
437 const bt_port_input
*port
, void *data
)
439 struct event event
= {
440 .type
= GRAPH_SINK_INPUT_PORT_ADDED
,
441 .data
.graph_sink_input_port_added
= {
442 .comp
= bt_component_sink_as_component_const(comp
),
443 .port
= bt_port_input_as_port_const(port
),
447 append_event(&event
);
451 void graph_src_sink_ports_connected(const bt_component_source
*upstream_comp
,
452 const bt_component_sink
*downstream_comp
,
453 const bt_port_output
*upstream_port
,
454 const bt_port_input
*downstream_port
, void *data
)
456 struct event event
= {
457 .type
= GRAPH_SRC_SINK_PORTS_CONNECTED
,
458 .data
.graph_src_sink_ports_connected
= {
460 bt_component_source_as_component_const(upstream_comp
),
462 bt_component_sink_as_component_const(downstream_comp
),
464 bt_port_output_as_port_const(upstream_port
),
466 bt_port_input_as_port_const(downstream_port
),
470 append_event(&event
);
478 src_comp_class
= bt_component_class_source_create(
479 "src", src_iter_next
);
480 BT_ASSERT(src_comp_class
);
481 ret
= bt_component_class_source_set_init_method(
482 src_comp_class
, src_init
);
484 ret
= bt_component_class_source_set_accept_output_port_connection_method(
485 src_comp_class
, src_accept_output_port_connection
);
487 ret
= bt_component_class_source_set_output_port_connected_method(
488 src_comp_class
, src_output_port_connected
);
490 sink_comp_class
= bt_component_class_sink_create("sink",
492 BT_ASSERT(sink_comp_class
);
493 ret
= bt_component_class_sink_set_init_method(sink_comp_class
,
496 ret
= bt_component_class_sink_set_accept_input_port_connection_method(
497 sink_comp_class
, sink_accept_input_port_connection
);
499 ret
= bt_component_class_sink_set_input_port_connected_method(
500 sink_comp_class
, sink_input_port_connected
);
502 events
= g_array_new(FALSE
, TRUE
, sizeof(struct event
));
509 bt_component_class_source_put_ref(src_comp_class
);
510 bt_component_class_sink_put_ref(sink_comp_class
);
511 g_array_free(events
, TRUE
);
515 const bt_component_source
*create_src(bt_graph
*graph
)
517 const bt_component_source
*comp
;
520 ret
= bt_graph_add_source_component(graph
, src_comp_class
,
521 "src-comp", NULL
, &comp
);
527 const bt_component_sink
*create_sink(bt_graph
*graph
)
529 const bt_component_sink
*comp
;
532 ret
= bt_graph_add_sink_component(graph
, sink_comp_class
,
533 "sink-comp", NULL
, &comp
);
539 bt_graph
*create_graph(void)
541 bt_graph
*graph
= bt_graph_create();
545 ret
= bt_graph_add_source_component_output_port_added_listener(
546 graph
, graph_src_output_port_added
, NULL
, NULL
, NULL
);
548 ret
= bt_graph_add_sink_component_input_port_added_listener(
549 graph
, graph_sink_input_port_added
, NULL
, NULL
, NULL
);
551 ret
= bt_graph_add_source_sink_component_ports_connected_listener(
552 graph
, graph_src_sink_ports_connected
, NULL
, NULL
, NULL
);
558 void prepare_test(enum test test
, const char *name
)
562 diag("test: %s", name
);
566 void test_src_adds_port_in_port_connected(void)
568 const bt_component_source
*src
;
569 const bt_component_sink
*sink
;
570 const bt_component
*gsrc
;
571 const bt_component
*gsink
;
573 const bt_port_output
*src_def_port
;
574 const bt_port_output
*src_hello_port
;
575 const bt_port_input
*sink_def_port
;
576 const bt_port
*gsrc_def_port
;
577 const bt_port
*gsrc_hello_port
;
578 const bt_port
*gsink_def_port
;
580 bt_graph_status status
;
581 size_t src_accept_port_connection_pos
;
582 size_t sink_accept_port_connection_pos
;
583 size_t src_port_connected_pos
;
584 size_t sink_port_connected_pos
;
585 size_t graph_ports_connected_pos
;
586 size_t graph_port_added_src_pos
;
588 prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED
,
589 "source adds port in port connected");
590 graph
= create_graph();
592 src
= create_src(graph
);
593 sink
= create_sink(graph
);
594 src_def_port
= bt_component_source_borrow_output_port_by_name_const(src
,
596 BT_ASSERT(src_def_port
);
597 sink_def_port
= bt_component_sink_borrow_input_port_by_name_const(sink
,
599 BT_ASSERT(sink_def_port
);
600 status
= bt_graph_connect_ports(graph
, src_def_port
,
601 sink_def_port
, NULL
);
602 BT_ASSERT(status
== 0);
603 src_hello_port
= bt_component_source_borrow_output_port_by_name_const(src
,
605 BT_ASSERT(src_hello_port
);
606 gsrc
= bt_component_source_as_component_const(src
);
607 gsink
= bt_component_sink_as_component_const(sink
);
608 gsrc_def_port
= bt_port_output_as_port_const(src_def_port
);
609 gsrc_hello_port
= bt_port_output_as_port_const(src_hello_port
);
610 gsink_def_port
= bt_port_input_as_port_const(sink_def_port
);
612 /* We're supposed to have 8 events */
613 ok(events
->len
== 8, "we have the expected number of events");
615 /* Source's port added */
616 event
.type
= GRAPH_SRC_OUTPUT_PORT_ADDED
;
617 event
.data
.graph_src_output_port_added
.comp
= gsrc
;
618 event
.data
.graph_src_output_port_added
.port
= gsrc_def_port
;
619 ok(has_event(&event
), "got the expected graph's port added event (for source, initial)");
621 /* Sink's port added */
622 event
.type
= GRAPH_SINK_INPUT_PORT_ADDED
;
623 event
.data
.graph_sink_input_port_added
.comp
= gsink
;
624 event
.data
.graph_sink_input_port_added
.port
= gsink_def_port
;
625 ok(has_event(&event
), "got the expected graph's port added event (for sink, initial)");
627 /* Source's accept port connection */
628 event
.type
= SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
;
629 event
.data
.src_comp_accept_output_port_connection
.comp
= gsrc
;
630 event
.data
.src_comp_accept_output_port_connection
.self_port
= gsrc_def_port
;
631 event
.data
.src_comp_accept_output_port_connection
.other_port
= gsink_def_port
;
632 ok(has_event(&event
), "got the expected source's accept port connection event");
633 src_accept_port_connection_pos
= event_pos(&event
);
635 /* Sink's accept port connection */
636 event
.type
= SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
;
637 event
.data
.sink_comp_accept_input_port_connection
.comp
= gsink
;
638 event
.data
.sink_comp_accept_input_port_connection
.self_port
= gsink_def_port
;
639 event
.data
.sink_comp_accept_input_port_connection
.other_port
= gsrc_def_port
;
640 ok(has_event(&event
), "got the expected sink's accept port connection event");
641 sink_accept_port_connection_pos
= event_pos(&event
);
643 /* Source's port connected */
644 event
.type
= SRC_COMP_OUTPUT_PORT_CONNECTED
;
645 event
.data
.src_comp_output_port_connected
.comp
= gsrc
;
646 event
.data
.src_comp_output_port_connected
.self_port
= gsrc_def_port
;
647 event
.data
.src_comp_output_port_connected
.other_port
= gsink_def_port
;
648 ok(has_event(&event
), "got the expected source's port connected event");
649 src_port_connected_pos
= event_pos(&event
);
651 /* Graph's port added (source) */
652 event
.type
= GRAPH_SRC_OUTPUT_PORT_ADDED
;
653 event
.data
.graph_src_output_port_added
.comp
= gsrc
;
654 event
.data
.graph_src_output_port_added
.port
= gsrc_hello_port
;
655 ok(has_event(&event
), "got the expected graph's port added event (for source)");
656 graph_port_added_src_pos
= event_pos(&event
);
658 /* Sink's port connected */
659 event
.type
= SINK_COMP_INPUT_PORT_CONNECTED
;
660 event
.data
.sink_comp_input_port_connected
.comp
= gsink
;
661 event
.data
.sink_comp_input_port_connected
.self_port
= gsink_def_port
;
662 event
.data
.sink_comp_input_port_connected
.other_port
= gsrc_def_port
;
663 ok(has_event(&event
), "got the expected sink's port connected event");
664 sink_port_connected_pos
= event_pos(&event
);
666 /* Graph's ports connected */
667 event
.type
= GRAPH_SRC_SINK_PORTS_CONNECTED
;
668 event
.data
.graph_src_sink_ports_connected
.upstream_comp
= gsrc
;
669 event
.data
.graph_src_sink_ports_connected
.downstream_comp
= gsink
;
670 event
.data
.graph_src_sink_ports_connected
.upstream_port
= gsrc_def_port
;
671 event
.data
.graph_src_sink_ports_connected
.downstream_port
= gsink_def_port
;
672 ok(has_event(&event
), "got the expected graph's ports connected event");
673 graph_ports_connected_pos
= event_pos(&event
);
675 /* Order of events */
676 ok(src_port_connected_pos
< graph_ports_connected_pos
,
677 "event order is good (1)");
678 ok(sink_port_connected_pos
< graph_ports_connected_pos
,
679 "event order is good (2)");
680 ok(src_accept_port_connection_pos
< src_port_connected_pos
,
681 "event order is good (3)");
682 ok(sink_accept_port_connection_pos
< sink_port_connected_pos
,
683 "event order is good (4)");
684 ok(src_port_connected_pos
< graph_port_added_src_pos
,
685 "event order is good (5)");
686 ok(graph_port_added_src_pos
< graph_ports_connected_pos
,
687 "event order is good (6)");
689 bt_component_source_put_ref(src
);
690 bt_component_sink_put_ref(sink
);
691 bt_graph_put_ref(graph
);
695 void test_simple(void)
697 const bt_component_source
*src
;
698 const bt_component_sink
*sink
;
699 const bt_component
*gsrc
;
700 const bt_component
*gsink
;
702 const bt_port_output
*src_def_port
;
703 const bt_port_input
*sink_def_port
;
704 const bt_port
*gsrc_def_port
;
705 const bt_port
*gsink_def_port
;
707 bt_graph_status status
;
708 size_t src_accept_port_connection_pos
;
709 size_t sink_accept_port_connection_pos
;
710 size_t src_port_connected_pos
;
711 size_t sink_port_connected_pos
;
712 size_t graph_ports_connected_pos
;
714 prepare_test(TEST_SIMPLE
, "simple");
715 graph
= create_graph();
717 src
= create_src(graph
);
718 sink
= create_sink(graph
);
719 src_def_port
= bt_component_source_borrow_output_port_by_name_const(src
,
721 BT_ASSERT(src_def_port
);
722 sink_def_port
= bt_component_sink_borrow_input_port_by_name_const(sink
,
724 BT_ASSERT(sink_def_port
);
725 status
= bt_graph_connect_ports(graph
, src_def_port
,
726 sink_def_port
, NULL
);
727 BT_ASSERT(status
== 0);
728 gsrc
= bt_component_source_as_component_const(src
);
729 gsink
= bt_component_sink_as_component_const(sink
);
730 gsrc_def_port
= bt_port_output_as_port_const(src_def_port
);
731 gsink_def_port
= bt_port_input_as_port_const(sink_def_port
);
733 /* We're supposed to have 7 events */
734 ok(events
->len
== 7, "we have the expected number of events");
736 /* Source's port added */
737 event
.type
= GRAPH_SRC_OUTPUT_PORT_ADDED
;
738 event
.data
.graph_src_output_port_added
.comp
= gsrc
;
739 event
.data
.graph_src_output_port_added
.port
= gsrc_def_port
;
740 ok(has_event(&event
), "got the expected graph's port added event (for source, initial)");
742 /* Sink's port added */
743 event
.type
= GRAPH_SINK_INPUT_PORT_ADDED
;
744 event
.data
.graph_sink_input_port_added
.comp
= gsink
;
745 event
.data
.graph_sink_input_port_added
.port
= gsink_def_port
;
746 ok(has_event(&event
), "got the expected graph's port added event (for sink, initial)");
748 /* Source's accept port connection */
749 event
.type
= SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
;
750 event
.data
.src_comp_accept_output_port_connection
.comp
= gsrc
;
751 event
.data
.src_comp_accept_output_port_connection
.self_port
= gsrc_def_port
;
752 event
.data
.src_comp_accept_output_port_connection
.other_port
= gsink_def_port
;
753 ok(has_event(&event
), "got the expected source's accept port connection event");
754 src_accept_port_connection_pos
= event_pos(&event
);
756 /* Sink's accept port connection */
757 event
.type
= SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
;
758 event
.data
.sink_comp_accept_input_port_connection
.comp
= gsink
;
759 event
.data
.sink_comp_accept_input_port_connection
.self_port
= gsink_def_port
;
760 event
.data
.sink_comp_accept_input_port_connection
.other_port
= gsrc_def_port
;
761 ok(has_event(&event
), "got the expected sink's accept port connection event");
762 sink_accept_port_connection_pos
= event_pos(&event
);
764 /* Source's port connected */
765 event
.type
= SRC_COMP_OUTPUT_PORT_CONNECTED
;
766 event
.data
.src_comp_output_port_connected
.comp
= gsrc
;
767 event
.data
.src_comp_output_port_connected
.self_port
= gsrc_def_port
;
768 event
.data
.src_comp_output_port_connected
.other_port
= gsink_def_port
;
769 ok(has_event(&event
), "got the expected source's port connected event");
770 src_port_connected_pos
= event_pos(&event
);
772 /* Sink's port connected */
773 event
.type
= SINK_COMP_INPUT_PORT_CONNECTED
;
774 event
.data
.sink_comp_input_port_connected
.comp
= gsink
;
775 event
.data
.sink_comp_input_port_connected
.self_port
= gsink_def_port
;
776 event
.data
.sink_comp_input_port_connected
.other_port
= gsrc_def_port
;
777 ok(has_event(&event
), "got the expected sink's port connected event");
778 sink_port_connected_pos
= event_pos(&event
);
780 /* Graph's ports connected */
781 event
.type
= GRAPH_SRC_SINK_PORTS_CONNECTED
;
782 event
.data
.graph_src_sink_ports_connected
.upstream_comp
= gsrc
;
783 event
.data
.graph_src_sink_ports_connected
.downstream_comp
= gsink
;
784 event
.data
.graph_src_sink_ports_connected
.upstream_port
= gsrc_def_port
;
785 event
.data
.graph_src_sink_ports_connected
.downstream_port
= gsink_def_port
;
786 ok(has_event(&event
), "got the expected graph's ports connected event");
787 graph_ports_connected_pos
= event_pos(&event
);
789 /* Order of events */
790 ok(src_port_connected_pos
< graph_ports_connected_pos
,
791 "event order is good (1)");
792 ok(sink_port_connected_pos
< graph_ports_connected_pos
,
793 "event order is good (2)");
794 ok(src_accept_port_connection_pos
< src_port_connected_pos
,
795 "event order is good (3)");
796 ok(sink_accept_port_connection_pos
< sink_port_connected_pos
,
797 "event order is good (4)");
799 bt_component_sink_put_ref(sink
);
800 bt_graph_put_ref(graph
);
801 bt_component_source_put_ref(src
);
805 void test_src_port_connected_error(void)
807 const bt_component_source
*src
;
808 const bt_component_sink
*sink
;
809 const bt_component
*gsrc
;
810 const bt_component
*gsink
;
812 const bt_port_output
*src_def_port
;
813 const bt_port_input
*sink_def_port
;
814 const bt_port
*gsrc_def_port
;
815 const bt_port
*gsink_def_port
;
816 const bt_connection
*conn
= NULL
;
818 bt_graph_status status
;
819 size_t src_accept_port_connection_pos
;
820 size_t src_port_connected_pos
;
822 prepare_test(TEST_SRC_PORT_CONNECTED_ERROR
, "port connected error: source");
823 graph
= create_graph();
825 src
= create_src(graph
);
826 sink
= create_sink(graph
);
827 src_def_port
= bt_component_source_borrow_output_port_by_name_const(src
,
829 BT_ASSERT(src_def_port
);
830 sink_def_port
= bt_component_sink_borrow_input_port_by_name_const(sink
,
832 BT_ASSERT(sink_def_port
);
833 status
= bt_graph_connect_ports(graph
, src_def_port
,
834 sink_def_port
, &conn
);
835 ok(status
!= BT_GRAPH_STATUS_OK
,
836 "bt_graph_connect_ports() returns an error");
837 ok(!conn
, "returned connection is still NULL");
838 gsrc
= bt_component_source_as_component_const(src
);
839 gsink
= bt_component_sink_as_component_const(sink
);
840 gsrc_def_port
= bt_port_output_as_port_const(src_def_port
);
841 gsink_def_port
= bt_port_input_as_port_const(sink_def_port
);
843 /* We're supposed to have 5 events */
844 ok(events
->len
== 5, "we have the expected number of events");
846 /* Source's port added */
847 event
.type
= GRAPH_SRC_OUTPUT_PORT_ADDED
;
848 event
.data
.graph_src_output_port_added
.comp
= gsrc
;
849 event
.data
.graph_src_output_port_added
.port
= gsrc_def_port
;
850 ok(has_event(&event
), "got the expected graph's port added event (for source, initial)");
852 /* Sink's port added */
853 event
.type
= GRAPH_SINK_INPUT_PORT_ADDED
;
854 event
.data
.graph_sink_input_port_added
.comp
= gsink
;
855 event
.data
.graph_sink_input_port_added
.port
= gsink_def_port
;
856 ok(has_event(&event
), "got the expected graph's port added event (for sink, initial)");
858 /* Source's accept port connection */
859 event
.type
= SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
;
860 event
.data
.src_comp_accept_output_port_connection
.comp
= gsrc
;
861 event
.data
.src_comp_accept_output_port_connection
.self_port
= gsrc_def_port
;
862 event
.data
.src_comp_accept_output_port_connection
.other_port
= gsink_def_port
;
863 ok(has_event(&event
), "got the expected source's accept port connection event");
864 src_accept_port_connection_pos
= event_pos(&event
);
866 /* Sink's accept port connection */
867 event
.type
= SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
;
868 event
.data
.sink_comp_accept_input_port_connection
.comp
= gsink
;
869 event
.data
.sink_comp_accept_input_port_connection
.self_port
= gsink_def_port
;
870 event
.data
.sink_comp_accept_input_port_connection
.other_port
= gsrc_def_port
;
871 ok(has_event(&event
), "got the expected sink's accept port connection event");
873 /* Source's port connected */
874 event
.type
= SRC_COMP_OUTPUT_PORT_CONNECTED
;
875 event
.data
.src_comp_output_port_connected
.comp
= gsrc
;
876 event
.data
.src_comp_output_port_connected
.self_port
= gsrc_def_port
;
877 event
.data
.src_comp_output_port_connected
.other_port
= gsink_def_port
;
878 ok(has_event(&event
), "got the expected source's port connected event");
879 src_port_connected_pos
= event_pos(&event
);
881 /* Order of events */
882 ok(src_accept_port_connection_pos
< src_port_connected_pos
,
883 "event order is good (1)");
885 bt_graph_put_ref(graph
);
886 bt_component_sink_put_ref(sink
);
887 bt_component_source_put_ref(src
);
888 bt_connection_put_ref(conn
);
892 void test_sink_port_connected_error(void)
894 const bt_component_source
*src
;
895 const bt_component_sink
*sink
;
896 const bt_component
*gsrc
;
897 const bt_component
*gsink
;
899 const bt_port_output
*src_def_port
;
900 const bt_port_input
*sink_def_port
;
901 const bt_port
*gsrc_def_port
;
902 const bt_port
*gsink_def_port
;
903 const bt_connection
*conn
= NULL
;
905 bt_graph_status status
;
906 size_t src_accept_port_connection_pos
;
907 size_t sink_accept_port_connection_pos
;
908 size_t src_port_connected_pos
;
909 size_t sink_port_connected_pos
;
911 prepare_test(TEST_SINK_PORT_CONNECTED_ERROR
, "port connected error: sink");
912 graph
= create_graph();
914 src
= create_src(graph
);
915 sink
= create_sink(graph
);
916 src_def_port
= bt_component_source_borrow_output_port_by_name_const(src
,
918 BT_ASSERT(src_def_port
);
919 sink_def_port
= bt_component_sink_borrow_input_port_by_name_const(sink
,
921 BT_ASSERT(sink_def_port
);
922 status
= bt_graph_connect_ports(graph
, src_def_port
,
923 sink_def_port
, &conn
);
924 ok(status
!= BT_GRAPH_STATUS_OK
,
925 "bt_graph_connect_ports() returns an error");
926 ok(!conn
, "returned connection is still NULL");
927 gsrc
= bt_component_source_as_component_const(src
);
928 gsink
= bt_component_sink_as_component_const(sink
);
929 gsrc_def_port
= bt_port_output_as_port_const(src_def_port
);
930 gsink_def_port
= bt_port_input_as_port_const(sink_def_port
);
932 /* We're supposed to have 6 events */
933 ok(events
->len
== 6, "we have the expected number of events");
935 /* Source's port added */
936 event
.type
= GRAPH_SRC_OUTPUT_PORT_ADDED
;
937 event
.data
.graph_src_output_port_added
.comp
= gsrc
;
938 event
.data
.graph_src_output_port_added
.port
= gsrc_def_port
;
939 ok(has_event(&event
), "got the expected graph's port added event (for source, initial)");
941 /* Sink's port added */
942 event
.type
= GRAPH_SINK_INPUT_PORT_ADDED
;
943 event
.data
.graph_sink_input_port_added
.comp
= gsink
;
944 event
.data
.graph_sink_input_port_added
.port
= gsink_def_port
;
945 ok(has_event(&event
), "got the expected graph's port added event (for sink, initial)");
947 /* Source's accept port connection */
948 event
.type
= SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION
;
949 event
.data
.src_comp_accept_output_port_connection
.comp
= gsrc
;
950 event
.data
.src_comp_accept_output_port_connection
.self_port
= gsrc_def_port
;
951 event
.data
.src_comp_accept_output_port_connection
.other_port
= gsink_def_port
;
952 ok(has_event(&event
), "got the expected source's accept port connection event");
953 src_accept_port_connection_pos
= event_pos(&event
);
955 /* Sink's accept port connection */
956 event
.type
= SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION
;
957 event
.data
.sink_comp_accept_input_port_connection
.comp
= gsink
;
958 event
.data
.sink_comp_accept_input_port_connection
.self_port
= gsink_def_port
;
959 event
.data
.sink_comp_accept_input_port_connection
.other_port
= gsrc_def_port
;
960 ok(has_event(&event
), "got the expected sink's accept port connection event");
961 sink_accept_port_connection_pos
= event_pos(&event
);
963 /* Source's port connected */
964 event
.type
= SRC_COMP_OUTPUT_PORT_CONNECTED
;
965 event
.data
.src_comp_output_port_connected
.comp
= gsrc
;
966 event
.data
.src_comp_output_port_connected
.self_port
= gsrc_def_port
;
967 event
.data
.src_comp_output_port_connected
.other_port
= gsink_def_port
;
968 ok(has_event(&event
), "got the expected source's port connected event");
969 src_port_connected_pos
= event_pos(&event
);
971 /* Sink's port connected */
972 event
.type
= SINK_COMP_INPUT_PORT_CONNECTED
;
973 event
.data
.sink_comp_input_port_connected
.comp
= gsink
;
974 event
.data
.sink_comp_input_port_connected
.self_port
= gsink_def_port
;
975 event
.data
.sink_comp_input_port_connected
.other_port
= gsrc_def_port
;
976 ok(has_event(&event
), "got the expected sink's port connected event");
977 sink_port_connected_pos
= event_pos(&event
);
979 /* Order of events */
980 ok(src_accept_port_connection_pos
< src_port_connected_pos
,
981 "event order is good (1)");
982 ok(sink_accept_port_connection_pos
< sink_port_connected_pos
,
983 "event order is good (2)");
985 bt_connection_put_ref(conn
);
986 bt_graph_put_ref(graph
);
987 bt_component_sink_put_ref(sink
);
988 bt_component_source_put_ref(src
);
992 void test_empty_graph(void)
996 prepare_test(TEST_EMPTY_GRAPH
, "empty graph");
997 graph
= create_graph();
998 ok(events
->len
== 0, "empty graph generates no events");
999 bt_graph_put_ref(graph
);
1002 int main(int argc
, char **argv
)
1004 plan_tests(NR_TESTS
);
1008 test_src_port_connected_error();
1009 test_sink_port_connected_error();
1010 test_src_adds_port_in_port_connected();
1012 return exit_status();