Avoid unnecessary inclusions in public headers
[babeltrace.git] / tests / lib / test_graph_topo.c
CommitLineData
fb9935cc
PP
1/*
2 * test_graph_topo.c
3 *
4 * Copyright 2017 - Philippe Proulx <pproulx@efficios.com>
5 *
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.
9 *
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.
14 *
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.
18 */
19
9d408fca 20#include <babeltrace/ref.h>
fb9935cc
PP
21#include <babeltrace/graph/component-class.h>
22#include <babeltrace/graph/component-class-source.h>
23#include <babeltrace/graph/component-class-sink.h>
24#include <babeltrace/graph/component.h>
25#include <babeltrace/graph/component-source.h>
26#include <babeltrace/graph/component-sink.h>
27#include <babeltrace/graph/graph.h>
28#include <babeltrace/graph/connection.h>
29#include <babeltrace/graph/port.h>
30#include <babeltrace/graph/private-component.h>
31#include <babeltrace/graph/private-component-source.h>
32#include <babeltrace/graph/private-component-sink.h>
33#include <babeltrace/graph/private-port.h>
34#include <babeltrace/graph/private-connection.h>
35#include <stdlib.h>
36#include <string.h>
37#include <stdbool.h>
38#include <assert.h>
39#include <glib.h>
40
41#include "tap/tap.h"
42
36712f1d 43#define NR_TESTS 77
fb9935cc
PP
44
45enum event_type {
46 COMP_ACCEPT_PORT_CONNECTION,
c14181ff 47 COMP_PORT_CONNECTED,
fb9935cc
PP
48 COMP_PORT_DISCONNECTED,
49 GRAPH_PORT_ADDED,
50 GRAPH_PORT_REMOVED,
51 GRAPH_PORTS_CONNECTED,
52 GRAPH_PORTS_DISCONNECTED,
53};
54
55enum test {
56 TEST_EMPTY_GRAPH,
57 TEST_SIMPLE,
c14181ff 58 TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED,
fb9935cc
PP
59 TEST_SINK_REMOVES_PORT_IN_CONSUME,
60 TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
61};
62
63struct event {
64 enum event_type type;
65
66 union {
67 struct {
68 struct bt_component *comp;
69 struct bt_port *self_port;
70 struct bt_port *other_port;
71 } comp_accept_port_connection;
72
c14181ff
PP
73 struct {
74 struct bt_component *comp;
75 struct bt_port *self_port;
76 struct bt_port *other_port;
77 } comp_port_connected;
78
fb9935cc
PP
79 struct {
80 struct bt_component *comp;
81 struct bt_port *port;
82 } comp_port_disconnected;
83
84 struct {
85 struct bt_component *comp;
86 struct bt_port *port;
87 } graph_port_added;
88
89 struct {
90 struct bt_component *comp;
91 struct bt_port *port;
92 } graph_port_removed;
93
94 struct {
95 struct bt_component *upstream_comp;
96 struct bt_component *downstream_comp;
97 struct bt_port *upstream_port;
98 struct bt_port *downstream_port;
99 struct bt_connection *conn;
100 } graph_ports_connected;
101
102 struct {
103 struct bt_component *upstream_comp;
104 struct bt_component *downstream_comp;
105 struct bt_port *upstream_port;
106 struct bt_port *downstream_port;
107 } graph_ports_disconnected;
108 } data;
109};
110
111static GArray *events;
112static struct bt_component_class *src_comp_class;
113static struct bt_component_class *sink_comp_class;
114static enum test current_test;
115
116static
117void clear_events(void)
118{
119 g_array_set_size(events, 0);
120}
121
122static
123void append_event(struct event *event)
124{
125 g_array_append_val(events, *event);
126}
127
128static
129bool compare_events(struct event *ev_a, struct event *ev_b)
130{
131 if (ev_a->type != ev_b->type) {
132 return false;
133 }
134
135 switch (ev_a->type) {
136 case COMP_ACCEPT_PORT_CONNECTION:
137 if (ev_a->data.comp_accept_port_connection.comp !=
138 ev_b->data.comp_accept_port_connection.comp) {
139 return false;
140 }
141
142 if (ev_a->data.comp_accept_port_connection.self_port !=
143 ev_b->data.comp_accept_port_connection.self_port) {
144 return false;
145 }
146
147 if (ev_a->data.comp_accept_port_connection.other_port !=
148 ev_b->data.comp_accept_port_connection.other_port) {
149 return false;
150 }
151 break;
c14181ff
PP
152 case COMP_PORT_CONNECTED:
153 if (ev_a->data.comp_port_connected.comp !=
154 ev_b->data.comp_port_connected.comp) {
155 return false;
156 }
157
158 if (ev_a->data.comp_port_connected.self_port !=
159 ev_b->data.comp_port_connected.self_port) {
160 return false;
161 }
162
163 if (ev_a->data.comp_port_connected.other_port !=
164 ev_b->data.comp_port_connected.other_port) {
165 return false;
166 }
167 break;
fb9935cc
PP
168 case COMP_PORT_DISCONNECTED:
169 if (ev_a->data.comp_port_disconnected.comp !=
170 ev_b->data.comp_port_disconnected.comp) {
171 return false;
172 }
173
174 if (ev_a->data.comp_port_disconnected.port !=
175 ev_b->data.comp_port_disconnected.port) {
176 return false;
177 }
178 break;
179 case GRAPH_PORT_ADDED:
180 if (ev_a->data.graph_port_added.comp !=
181 ev_b->data.graph_port_added.comp) {
182 return false;
183 }
184
185 if (ev_a->data.graph_port_added.port !=
186 ev_b->data.graph_port_added.port) {
187 return false;
188 }
189 break;
190 case GRAPH_PORT_REMOVED:
191 if (ev_a->data.graph_port_removed.comp !=
192 ev_b->data.graph_port_removed.comp) {
193 return false;
194 }
195
196 if (ev_a->data.graph_port_removed.port !=
197 ev_b->data.graph_port_removed.port) {
198 return false;
199 }
200 break;
201 case GRAPH_PORTS_CONNECTED:
202 if (ev_a->data.graph_ports_connected.upstream_comp !=
203 ev_b->data.graph_ports_connected.upstream_comp) {
204 return false;
205 }
206
207 if (ev_a->data.graph_ports_connected.downstream_comp !=
208 ev_b->data.graph_ports_connected.downstream_comp) {
209 return false;
210 }
211
212 if (ev_a->data.graph_ports_connected.upstream_port !=
213 ev_b->data.graph_ports_connected.upstream_port) {
214 return false;
215 }
216
217 if (ev_a->data.graph_ports_connected.downstream_port !=
218 ev_b->data.graph_ports_connected.downstream_port) {
219 return false;
220 }
221
222 if (ev_a->data.graph_ports_connected.conn !=
223 ev_b->data.graph_ports_connected.conn) {
224 return false;
225 }
226 break;
227 case GRAPH_PORTS_DISCONNECTED:
228 if (ev_a->data.graph_ports_disconnected.upstream_comp !=
229 ev_b->data.graph_ports_disconnected.upstream_comp) {
230 return false;
231 }
232
233 if (ev_a->data.graph_ports_disconnected.downstream_comp !=
234 ev_b->data.graph_ports_disconnected.downstream_comp) {
235 return false;
236 }
237
238 if (ev_a->data.graph_ports_disconnected.upstream_port !=
239 ev_b->data.graph_ports_disconnected.upstream_port) {
240 return false;
241 }
242
243 if (ev_a->data.graph_ports_disconnected.downstream_port !=
244 ev_b->data.graph_ports_disconnected.downstream_port) {
245 return false;
246 }
247 break;
248 default:
0fbb9a9f 249 abort();
fb9935cc
PP
250 }
251
252 return true;
253}
254
255static
256bool has_event(struct event *event)
257{
258 size_t i;
259
260 for (i = 0; i < events->len; i++) {
261 struct event *ev = &g_array_index(events, struct event, i);
262
263 if (compare_events(event, ev)) {
264 return true;
265 }
266 }
267
268 return false;
269}
270
271static
272size_t event_pos(struct event *event)
273{
274 size_t i;
275
276 for (i = 0; i < events->len; i++) {
277 struct event *ev = &g_array_index(events, struct event, i);
278
279 if (compare_events(event, ev)) {
280 return i;
281 }
282 }
283
1974687e 284 return SIZE_MAX;
fb9935cc
PP
285}
286
287static
90157d89
PP
288struct bt_notification_iterator_next_method_return src_iter_next(
289 struct bt_private_connection_private_notification_iterator *priv_iterator)
fb9935cc 290{
90157d89 291 struct bt_notification_iterator_next_method_return ret = {
fb9935cc
PP
292 .status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR,
293 };
294
295 return ret;
296}
297
298static
c14181ff 299enum bt_component_status accept_port_connection(
fb9935cc
PP
300 struct bt_private_component *private_component,
301 struct bt_private_port *self_private_port,
302 struct bt_port *other_port)
303{
fb9935cc
PP
304 struct event event = {
305 .type = COMP_ACCEPT_PORT_CONNECTION,
306 .data.comp_accept_port_connection = {
307 .comp = bt_component_from_private_component(private_component),
308 .self_port = bt_port_from_private_port(self_private_port),
309 .other_port = other_port,
310 },
311 };
312
313 bt_put(event.data.comp_accept_port_connection.comp);
314 bt_put(event.data.comp_accept_port_connection.self_port);
315 append_event(&event);
c14181ff
PP
316 return BT_COMPONENT_STATUS_OK;
317}
318
319static
320void src_port_connected(struct bt_private_component *private_component,
321 struct bt_private_port *self_private_port,
322 struct bt_port *other_port)
323{
147337a3 324 int ret;
c14181ff
PP
325
326 struct event event = {
327 .type = COMP_PORT_CONNECTED,
328 .data.comp_port_connected = {
329 .comp = bt_component_from_private_component(private_component),
330 .self_port = bt_port_from_private_port(self_private_port),
331 .other_port = other_port,
332 },
333 };
334
335 bt_put(event.data.comp_port_connected.comp);
336 bt_put(event.data.comp_port_connected.self_port);
337 append_event(&event);
fb9935cc
PP
338
339 switch (current_test) {
c14181ff 340 case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED:
147337a3
PP
341 ret = bt_private_component_source_add_output_private_port(
342 private_component, "hello", NULL, NULL);
343 assert(ret == 0);
fb9935cc
PP
344 break;
345 default:
346 break;
347 }
fb9935cc
PP
348}
349
350static
351void src_port_disconnected(struct bt_private_component *private_component,
352 struct bt_private_port *private_port)
353{
354 int ret;
355 struct event event = {
356 .type = COMP_PORT_DISCONNECTED,
357 .data.comp_port_disconnected = {
358 .comp = bt_component_from_private_component(private_component),
359 .port = bt_port_from_private_port(private_port),
360 },
361 };
362
363 bt_put(event.data.comp_port_disconnected.comp);
364 bt_put(event.data.comp_port_disconnected.port);
365 append_event(&event);
366
367 switch (current_test) {
368 case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT:
369 ret = bt_private_port_remove_from_component(private_port);
370 assert(ret == 0);
371 default:
372 break;
373 }
374}
375
b9d103be
PP
376static
377enum bt_component_status src_init(struct bt_private_component *priv_comp,
378 struct bt_value *params, void *init_method_data)
379{
147337a3 380 int ret;
b9d103be 381
147337a3
PP
382 ret = bt_private_component_source_add_output_private_port(
383 priv_comp, "out", NULL, NULL);
384 assert(ret == 0);
b9d103be
PP
385 return BT_COMPONENT_STATUS_OK;
386}
387
fb9935cc
PP
388static
389enum bt_component_status sink_consume(
390 struct bt_private_component *priv_component)
391{
392 struct bt_private_port *def_port;
393 int ret;
394
395 switch (current_test) {
396 case TEST_SINK_REMOVES_PORT_IN_CONSUME:
397 case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT:
b9d103be
PP
398 def_port = bt_private_component_sink_get_input_private_port_by_name(
399 priv_component, "in");
fb9935cc
PP
400 assert(def_port);
401 ret = bt_private_port_remove_from_component(def_port);
402 assert(ret == 0);
403 bt_put(def_port);
404 break;
405 default:
406 break;
407 }
408
409 return BT_COMPONENT_STATUS_OK;
410}
411
412static
c14181ff 413void sink_port_connected(struct bt_private_component *private_component,
fb9935cc
PP
414 struct bt_private_port *self_private_port,
415 struct bt_port *other_port)
416{
417 struct event event = {
c14181ff
PP
418 .type = COMP_PORT_CONNECTED,
419 .data.comp_port_connected = {
fb9935cc
PP
420 .comp = bt_component_from_private_component(private_component),
421 .self_port = bt_port_from_private_port(self_private_port),
422 .other_port = other_port,
423 },
424 };
425
c14181ff
PP
426 bt_put(event.data.comp_port_connected.comp);
427 bt_put(event.data.comp_port_connected.self_port);
fb9935cc 428 append_event(&event);
fb9935cc
PP
429}
430
431static
432void sink_port_disconnected(struct bt_private_component *private_component,
433 struct bt_private_port *private_port)
434{
435 struct event event = {
436 .type = COMP_PORT_DISCONNECTED,
437 .data.comp_port_disconnected = {
438 .comp = bt_component_from_private_component(private_component),
439 .port = bt_port_from_private_port(private_port),
440 },
441 };
442
443 bt_put(event.data.comp_port_disconnected.comp);
444 bt_put(event.data.comp_port_disconnected.port);
445 append_event(&event);
446}
447
b9d103be
PP
448static
449enum bt_component_status sink_init(struct bt_private_component *priv_comp,
450 struct bt_value *params, void *init_method_data)
451{
147337a3 452 int ret;
b9d103be 453
147337a3
PP
454 ret = bt_private_component_sink_add_input_private_port(priv_comp,
455 "in", NULL, NULL);
456 assert(ret == 0);
b9d103be
PP
457 return BT_COMPONENT_STATUS_OK;
458}
459
fb9935cc
PP
460static
461void graph_port_added(struct bt_port *port,
462 void *data)
463{
464 struct bt_component *comp = bt_port_get_component(port);
465
466 assert(comp);
467 bt_put(comp);
468
469 struct event event = {
470 .type = GRAPH_PORT_ADDED,
471 .data.graph_port_added = {
472 .comp = comp,
473 .port = port,
474 },
475 };
476
477 append_event(&event);
478}
479
480static
481void graph_port_removed(struct bt_component *component,
482 struct bt_port *port, void *data)
483{
484 struct event event = {
485 .type = GRAPH_PORT_REMOVED,
486 .data.graph_port_removed = {
487 .comp = component,
488 .port = port,
489 },
490 };
491
492 append_event(&event);
493}
494
495static
496void graph_ports_connected(struct bt_port *upstream_port,
497 struct bt_port *downstream_port, void *data)
498{
499 struct bt_component *upstream_comp =
500 bt_port_get_component(upstream_port);
501 struct bt_component *downstream_comp =
502 bt_port_get_component(downstream_port);
503 struct bt_connection *conn = bt_port_get_connection(upstream_port);
504
505 assert(upstream_comp);
506 assert(downstream_comp);
507 assert(conn);
508 bt_put(upstream_comp);
509 bt_put(downstream_comp);
510 bt_put(conn);
511
512 struct event event = {
513 .type = GRAPH_PORTS_CONNECTED,
514 .data.graph_ports_connected = {
515 .upstream_comp = upstream_comp,
516 .downstream_comp = downstream_comp,
517 .upstream_port = upstream_port,
518 .downstream_port = downstream_port,
519 .conn = conn,
520 },
521 };
522
523 append_event(&event);
524}
525
526static
527void graph_ports_disconnected(
528 struct bt_component *upstream_comp,
529 struct bt_component *downstream_comp,
530 struct bt_port *upstream_port, struct bt_port *downstream_port,
531 void *data)
532{
533 struct event event = {
534 .type = GRAPH_PORTS_DISCONNECTED,
535 .data.graph_ports_disconnected = {
536 .upstream_comp = upstream_comp,
537 .downstream_comp = downstream_comp,
538 .upstream_port = upstream_port,
539 .downstream_port = downstream_port,
540 },
541 };
542
543 append_event(&event);
544}
545
546static
547void init_test(void)
548{
549 int ret;
550
551 src_comp_class = bt_component_class_source_create("src", src_iter_next);
552 assert(src_comp_class);
b9d103be
PP
553 ret = bt_component_class_set_init_method(src_comp_class, src_init);
554 assert(ret == 0);
fb9935cc 555 ret = bt_component_class_set_accept_port_connection_method(
c14181ff
PP
556 src_comp_class, accept_port_connection);
557 assert(ret == 0);
558 ret = bt_component_class_set_port_connected_method(src_comp_class,
559 src_port_connected);
fb9935cc
PP
560 assert(ret == 0);
561 ret = bt_component_class_set_port_disconnected_method(
562 src_comp_class, src_port_disconnected);
563 assert(ret == 0);
564 sink_comp_class = bt_component_class_sink_create("sink", sink_consume);
565 assert(sink_comp_class);
b9d103be
PP
566 ret = bt_component_class_set_init_method(sink_comp_class, sink_init);
567 assert(ret == 0);
fb9935cc 568 ret = bt_component_class_set_accept_port_connection_method(
c14181ff 569 sink_comp_class, accept_port_connection);
fb9935cc 570 assert(ret == 0);
c14181ff
PP
571 ret = bt_component_class_set_port_connected_method(sink_comp_class,
572 sink_port_connected);
573 assert(ret == 0);
574 ret = bt_component_class_set_port_disconnected_method(sink_comp_class,
575 sink_port_disconnected);
fb9935cc
PP
576 assert(ret == 0);
577 bt_component_class_freeze(src_comp_class);
578 bt_component_class_freeze(sink_comp_class);
579 events = g_array_new(FALSE, TRUE, sizeof(struct event));
580 assert(events);
581}
582
583static
584void fini_test(void)
585{
586 bt_put(src_comp_class);
587 bt_put(sink_comp_class);
588 g_array_free(events, TRUE);
589}
590
591static
36712f1d 592struct bt_component *create_src(struct bt_graph *graph)
fb9935cc 593{
36712f1d
PP
594 struct bt_component *comp;
595 int ret;
fb9935cc 596
36712f1d
PP
597 ret = bt_graph_add_component(graph, src_comp_class, "src-comp", NULL,
598 &comp);
599 assert(ret == 0);
fb9935cc
PP
600 return comp;
601}
602
603static
36712f1d 604struct bt_component *create_sink(struct bt_graph *graph)
fb9935cc 605{
36712f1d
PP
606 struct bt_component *comp;
607 int ret;
fb9935cc 608
36712f1d
PP
609 ret = bt_graph_add_component(graph, sink_comp_class, "sink-comp",
610 NULL, &comp);
611 assert(ret == 0);
fb9935cc
PP
612 return comp;
613}
614
615static
616struct bt_graph *create_graph(void)
617{
618 struct bt_graph *graph = bt_graph_create();
619 int ret;
620
621 assert(graph);
8cc092c9
PP
622 ret = bt_graph_add_port_added_listener(graph, graph_port_added, NULL,
623 NULL);
0d107cdd 624 assert(ret >= 0);
fb9935cc 625 ret = bt_graph_add_port_removed_listener(graph, graph_port_removed,
8cc092c9 626 NULL, NULL);
0d107cdd 627 assert(ret >= 0);
8cc092c9
PP
628 ret = bt_graph_add_ports_connected_listener(graph,
629 graph_ports_connected, NULL, NULL);
0d107cdd 630 assert(ret >= 0);
fb9935cc 631 ret = bt_graph_add_ports_disconnected_listener(graph,
8cc092c9 632 graph_ports_disconnected, NULL, NULL);
0d107cdd 633 assert(ret >= 0);
fb9935cc
PP
634 return graph;
635}
636
637static
638void prepare_test(enum test test, const char *name)
639{
640 clear_events();
641 current_test = test;
642 diag("test: %s", name);
643}
644
645static
c14181ff 646void test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port(void)
fb9935cc
PP
647{
648 int ret;
649 struct bt_component *src;
650 struct bt_component *sink;
651 struct bt_graph *graph;
652 struct bt_port *src_def_port;
653 struct bt_port *sink_def_port;
654 struct bt_connection *conn;
655 struct event event;
a256a42d 656 enum bt_graph_status status;
c14181ff
PP
657 size_t src_accept_port_connection_pos;
658 size_t sink_accept_port_connection_pos;
659 size_t src_port_connected_pos;
660 size_t sink_port_connected_pos;
fb9935cc
PP
661 size_t graph_ports_connected;
662 size_t src_port_disconnected_pos;
663 size_t sink_port_disconnected_pos;
664 size_t graph_ports_disconnected_pos;
665 size_t graph_port_removed_src_pos;
666 size_t graph_port_removed_sink_pos;
667
668 prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
669 "sink removes port in consume, then source removes disconnected port");
fb9935cc 670 graph = create_graph();
36712f1d
PP
671 assert(graph);
672 src = create_src(graph);
673 sink = create_sink(graph);
b9d103be 674 src_def_port = bt_component_source_get_output_port_by_name(src, "out");
fb9935cc 675 assert(src_def_port);
b9d103be 676 sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
fb9935cc 677 assert(sink_def_port);
a256a42d
PP
678 status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
679 &conn);
680 assert(status == 0);
fb9935cc
PP
681 assert(conn);
682
36712f1d
PP
683 /* We're supposed to have 7 events so far */
684 ok(events->len == 7, "we have the expected number of events (before consume)");
685
686 /* Source's port added */
687 event.type = GRAPH_PORT_ADDED;
688 event.data.graph_port_added.comp = src;
689 event.data.graph_port_added.port = src_def_port;
690 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
691
692 /* Sink's port added */
693 event.type = GRAPH_PORT_ADDED;
694 event.data.graph_port_added.comp = sink;
695 event.data.graph_port_added.port = sink_def_port;
696 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
697
698 /* Source's accept port connection */
699 event.type = COMP_ACCEPT_PORT_CONNECTION;
700 event.data.comp_accept_port_connection.comp = src;
701 event.data.comp_accept_port_connection.self_port = src_def_port;
702 event.data.comp_accept_port_connection.other_port = sink_def_port;
703 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 704 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
705
706 /* Sink's accept port connection */
707 event.type = COMP_ACCEPT_PORT_CONNECTION;
708 event.data.comp_accept_port_connection.comp = sink;
709 event.data.comp_accept_port_connection.self_port = sink_def_port;
710 event.data.comp_accept_port_connection.other_port = src_def_port;
711 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
712 sink_accept_port_connection_pos = event_pos(&event);
713
714 /* Source's port connected */
715 event.type = COMP_PORT_CONNECTED;
716 event.data.comp_port_connected.comp = src;
717 event.data.comp_port_connected.self_port = src_def_port;
718 event.data.comp_port_connected.other_port = sink_def_port;
719 ok(has_event(&event), "got the expected source's port connected event");
720 src_port_connected_pos = event_pos(&event);
721
722 /* Sink's port connected */
723 event.type = COMP_PORT_CONNECTED;
724 event.data.comp_port_connected.comp = sink;
725 event.data.comp_port_connected.self_port = sink_def_port;
726 event.data.comp_port_connected.other_port = src_def_port;
727 ok(has_event(&event), "got the expected sink's port connected event");
728 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
729
730 /* Graph's ports connected */
731 event.type = GRAPH_PORTS_CONNECTED;
732 event.data.graph_ports_connected.upstream_comp = src;
733 event.data.graph_ports_connected.downstream_comp = sink;
734 event.data.graph_ports_connected.upstream_port = src_def_port;
735 event.data.graph_ports_connected.downstream_port = sink_def_port;
736 event.data.graph_ports_connected.conn = conn;
737 ok(has_event(&event), "got the expected graph's ports connected event");
738 graph_ports_connected = event_pos(&event);
739
740 /* Order of events */
c14181ff 741 ok(src_port_connected_pos < graph_ports_connected,
fb9935cc 742 "event order is good (1)");
c14181ff 743 ok(sink_port_connected_pos < graph_ports_connected,
fb9935cc 744 "event order is good (2)");
c14181ff
PP
745 ok(src_accept_port_connection_pos < src_port_connected_pos,
746 "event order is good (3)");
747 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
748 "event order is good (4)");
fb9935cc
PP
749
750 /* Consume sink once */
751 clear_events();
752 ret = bt_graph_consume(graph);
753 assert(ret == 0);
754
755 /* We're supposed to have 5 new events */
756 ok(events->len == 5, "we have the expected number of events (after consume)");
757
758 /* Source's port disconnected */
759 event.type = COMP_PORT_DISCONNECTED;
760 event.data.comp_port_disconnected.comp = src;
761 event.data.comp_port_disconnected.port = src_def_port;
762 ok(has_event(&event), "got the expected source's port disconnected event");
763 src_port_disconnected_pos = event_pos(&event);
764
765 /* Sink's port disconnected */
766 event.type = COMP_PORT_DISCONNECTED;
767 event.data.comp_port_disconnected.comp = sink;
768 event.data.comp_port_disconnected.port = sink_def_port;
769 ok(has_event(&event), "got the expected sink's port disconnected event");
770 sink_port_disconnected_pos = event_pos(&event);
771
772 /* Graph's ports disconnected */
773 event.type = GRAPH_PORTS_DISCONNECTED;
774 event.data.graph_ports_disconnected.upstream_comp = src;
775 event.data.graph_ports_disconnected.downstream_comp = sink;
776 event.data.graph_ports_disconnected.upstream_port = src_def_port;
777 event.data.graph_ports_disconnected.downstream_port = sink_def_port;
778 ok(has_event(&event), "got the expected graph's ports disconnected event");
779 graph_ports_disconnected_pos = event_pos(&event);
780
781 /* Graph's port removed (sink) */
782 event.type = GRAPH_PORT_REMOVED;
783 event.data.graph_port_removed.comp = sink;
784 event.data.graph_port_removed.port = sink_def_port;
785 ok(has_event(&event), "got the expected graph's port removed event (for sink)");
786 graph_port_removed_sink_pos = event_pos(&event);
787
788 /* Graph's port removed (source) */
789 event.type = GRAPH_PORT_REMOVED;
790 event.data.graph_port_removed.comp = src;
791 event.data.graph_port_removed.port = src_def_port;
792 ok(has_event(&event), "got the expected graph's port removed event (for source)");
793 graph_port_removed_src_pos = event_pos(&event);
794
795 /* Order of events */
796 ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
797 "event order is good (5)");
798 ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
799 "event order is good (6)");
800 ok(src_port_disconnected_pos < graph_port_removed_src_pos,
801 "event order is good (7)");
802 ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
803 "event order is good (8)");
804 ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
805 "event order is good (9)");
806 ok(sink_port_disconnected_pos < graph_port_removed_src_pos,
807 "event order is good (10)");
808 ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
809 "event order is good (11)");
810 ok(graph_port_removed_src_pos < graph_ports_disconnected_pos,
811 "event order is good (12)");
812 ok(graph_port_removed_src_pos < graph_port_removed_sink_pos,
813 "event order is good (13)");
814
815 bt_put(graph);
816 bt_put(sink);
817 bt_put(src);
818 bt_put(conn);
819 bt_put(src_def_port);
820 bt_put(sink_def_port);
821}
822
823static
c14181ff 824void test_sink_removes_port_in_port_connected(void)
fb9935cc
PP
825{
826 int ret;
827 struct bt_component *src;
828 struct bt_component *sink;
829 struct bt_graph *graph;
830 struct bt_port *src_def_port;
831 struct bt_port *sink_def_port;
832 struct bt_connection *conn;
833 struct event event;
a256a42d 834 enum bt_graph_status status;
c14181ff
PP
835 size_t src_accept_port_connection_pos;
836 size_t sink_accept_port_connection_pos;
837 size_t src_port_connected_pos;
838 size_t sink_port_connected_pos;
fb9935cc
PP
839 size_t graph_ports_connected_pos;
840 size_t src_port_disconnected_pos;
841 size_t sink_port_disconnected_pos;
842 size_t graph_ports_disconnected_pos;
843 size_t graph_port_removed_sink_pos;
844
845 prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME,
846 "sink removes port in consume");
fb9935cc 847 graph = create_graph();
36712f1d
PP
848 assert(graph);
849 src = create_src(graph);
850 sink = create_sink(graph);
b9d103be 851 src_def_port = bt_component_source_get_output_port_by_name(src, "out");
fb9935cc 852 assert(src_def_port);
b9d103be 853 sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
fb9935cc 854 assert(sink_def_port);
a256a42d
PP
855 status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
856 &conn);
857 assert(status == 0);
fb9935cc 858
36712f1d
PP
859 /* We're supposed to have 7 events so far */
860 ok(events->len == 7, "we have the expected number of events (before consume)");
861
862 /* Source's port added */
863 event.type = GRAPH_PORT_ADDED;
864 event.data.graph_port_added.comp = src;
865 event.data.graph_port_added.port = src_def_port;
866 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
867
868 /* Sink's port added */
869 event.type = GRAPH_PORT_ADDED;
870 event.data.graph_port_added.comp = sink;
871 event.data.graph_port_added.port = sink_def_port;
872 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
873
874 /* Source's accept port connection */
875 event.type = COMP_ACCEPT_PORT_CONNECTION;
876 event.data.comp_accept_port_connection.comp = src;
877 event.data.comp_accept_port_connection.self_port = src_def_port;
878 event.data.comp_accept_port_connection.other_port = sink_def_port;
879 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 880 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
881
882 /* Sink's accept port connection */
883 event.type = COMP_ACCEPT_PORT_CONNECTION;
884 event.data.comp_accept_port_connection.comp = sink;
885 event.data.comp_accept_port_connection.self_port = sink_def_port;
886 event.data.comp_accept_port_connection.other_port = src_def_port;
887 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
888 sink_accept_port_connection_pos = event_pos(&event);
889
890 /* Source's port connected */
891 event.type = COMP_PORT_CONNECTED;
892 event.data.comp_port_connected.comp = src;
893 event.data.comp_port_connected.self_port = src_def_port;
894 event.data.comp_port_connected.other_port = sink_def_port;
895 ok(has_event(&event), "got the expected source's port connected event");
896 src_port_connected_pos = event_pos(&event);
897
898 /* Sink's port connected */
899 event.type = COMP_PORT_CONNECTED;
900 event.data.comp_port_connected.comp = sink;
901 event.data.comp_port_connected.self_port = sink_def_port;
902 event.data.comp_port_connected.other_port = src_def_port;
903 ok(has_event(&event), "got the expected sink's port connected event");
904 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
905
906 /* Graph's ports connected */
907 event.type = GRAPH_PORTS_CONNECTED;
908 event.data.graph_ports_connected.upstream_comp = src;
909 event.data.graph_ports_connected.downstream_comp = sink;
910 event.data.graph_ports_connected.upstream_port = src_def_port;
911 event.data.graph_ports_connected.downstream_port = sink_def_port;
912 event.data.graph_ports_connected.conn = conn;
913 ok(has_event(&event), "got the expected graph's ports connected event");
914 graph_ports_connected_pos = event_pos(&event);
915
916 /* Order of events */
c14181ff 917 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 918 "event order is good (1)");
c14181ff 919 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 920 "event order is good (2)");
c14181ff
PP
921 ok(src_accept_port_connection_pos < src_port_connected_pos,
922 "event order is good (3)");
923 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
924 "event order is good (4)");
fb9935cc
PP
925
926 /* Consume sink once */
927 clear_events();
928 ret = bt_graph_consume(graph);
929 assert(ret == 0);
930
931 /* We're supposed to have 4 new events */
932 ok(events->len == 4, "we have the expected number of events (after consume)");
933
934 /* Source's port disconnected */
935 event.type = COMP_PORT_DISCONNECTED;
936 event.data.comp_port_disconnected.comp = src;
937 event.data.comp_port_disconnected.port = src_def_port;
938 ok(has_event(&event), "got the expected source's port disconnected event");
939 src_port_disconnected_pos = event_pos(&event);
940
941 /* Sink's port disconnected */
942 event.type = COMP_PORT_DISCONNECTED;
943 event.data.comp_port_disconnected.comp = sink;
944 event.data.comp_port_disconnected.port = sink_def_port;
945 ok(has_event(&event), "got the expected sink's port disconnected event");
946 sink_port_disconnected_pos = event_pos(&event);
947
948 /* Graph's ports disconnected */
949 event.type = GRAPH_PORTS_DISCONNECTED;
950 event.data.graph_ports_disconnected.upstream_comp = src;
951 event.data.graph_ports_disconnected.downstream_comp = sink;
952 event.data.graph_ports_disconnected.upstream_port = src_def_port;
953 event.data.graph_ports_disconnected.downstream_port = sink_def_port;
954 ok(has_event(&event), "got the expected graph's ports disconnected event");
955 graph_ports_disconnected_pos = event_pos(&event);
956
957 /* Graph's port removed (sink) */
958 event.type = GRAPH_PORT_REMOVED;
959 event.data.graph_port_removed.comp = sink;
960 event.data.graph_port_removed.port = sink_def_port;
961 ok(has_event(&event), "got the expected graph's port removed event (for sink)");
962 graph_port_removed_sink_pos = event_pos(&event);
963
964 /* Order of events */
965 ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
966 "event order is good (5)");
967 ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
968 "event order is good (7)");
969 ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
970 "event order is good (8)");
971 ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
972 "event order is good (10)");
973 ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
974 "event order is good (11)");
975
976 bt_put(graph);
977 bt_put(sink);
978 bt_put(src);
979 bt_put(conn);
980 bt_put(src_def_port);
981 bt_put(sink_def_port);
982}
983
984static
c14181ff 985void test_src_adds_port_in_port_connected(void)
fb9935cc
PP
986{
987 struct bt_component *src;
988 struct bt_component *sink;
989 struct bt_graph *graph;
990 struct bt_port *src_def_port;
991 struct bt_port *sink_def_port;
992 struct bt_port *src_hello_port;
993 struct bt_connection *conn;
994 struct event event;
a256a42d 995 enum bt_graph_status status;
c14181ff
PP
996 size_t src_accept_port_connection_pos;
997 size_t sink_accept_port_connection_pos;
998 size_t src_port_connected_pos;
999 size_t sink_port_connected_pos;
fb9935cc
PP
1000 size_t graph_ports_connected_pos;
1001 size_t graph_port_added_src_pos;
1002
c14181ff
PP
1003 prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED,
1004 "source adds port in port connected");
fb9935cc 1005 graph = create_graph();
36712f1d
PP
1006 assert(graph);
1007 src = create_src(graph);
1008 sink = create_sink(graph);
b9d103be 1009 src_def_port = bt_component_source_get_output_port_by_name(src, "out");
fb9935cc 1010 assert(src_def_port);
b9d103be 1011 sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
fb9935cc 1012 assert(sink_def_port);
a256a42d
PP
1013 status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
1014 &conn);
1015 assert(status == 0);
9ac68eb1
PP
1016 src_hello_port = bt_component_source_get_output_port_by_name(src,
1017 "hello");
fb9935cc
PP
1018 assert(src_hello_port);
1019
36712f1d
PP
1020 /* We're supposed to have 8 events */
1021 ok(events->len == 8, "we have the expected number of events");
1022
1023 /* Source's port added */
1024 event.type = GRAPH_PORT_ADDED;
1025 event.data.graph_port_added.comp = src;
1026 event.data.graph_port_added.port = src_def_port;
1027 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1028
1029 /* Sink's port added */
1030 event.type = GRAPH_PORT_ADDED;
1031 event.data.graph_port_added.comp = sink;
1032 event.data.graph_port_added.port = sink_def_port;
1033 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
1034
1035 /* Source's accept port connection */
1036 event.type = COMP_ACCEPT_PORT_CONNECTION;
1037 event.data.comp_accept_port_connection.comp = src;
1038 event.data.comp_accept_port_connection.self_port = src_def_port;
1039 event.data.comp_accept_port_connection.other_port = sink_def_port;
1040 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff
PP
1041 src_accept_port_connection_pos = event_pos(&event);
1042
1043 /* Sink's accept port connection */
1044 event.type = COMP_ACCEPT_PORT_CONNECTION;
1045 event.data.comp_accept_port_connection.comp = sink;
1046 event.data.comp_accept_port_connection.self_port = sink_def_port;
1047 event.data.comp_accept_port_connection.other_port = src_def_port;
1048 ok(has_event(&event), "got the expected sink's accept port connection event");
1049 sink_accept_port_connection_pos = event_pos(&event);
1050
1051 /* Source's port connected */
1052 event.type = COMP_PORT_CONNECTED;
1053 event.data.comp_port_connected.comp = src;
1054 event.data.comp_port_connected.self_port = src_def_port;
1055 event.data.comp_port_connected.other_port = sink_def_port;
1056 ok(has_event(&event), "got the expected source's port connected event");
1057 src_port_connected_pos = event_pos(&event);
fb9935cc
PP
1058
1059 /* Graph's port added (source) */
1060 event.type = GRAPH_PORT_ADDED;
1061 event.data.graph_port_added.comp = src;
1062 event.data.graph_port_added.port = src_hello_port;
1063 ok(has_event(&event), "got the expected graph's port added event (for source)");
1064 graph_port_added_src_pos = event_pos(&event);
1065
c14181ff
PP
1066 /* Sink's port connected */
1067 event.type = COMP_PORT_CONNECTED;
1068 event.data.comp_port_connected.comp = sink;
1069 event.data.comp_port_connected.self_port = sink_def_port;
1070 event.data.comp_port_connected.other_port = src_def_port;
1071 ok(has_event(&event), "got the expected sink's port connected event");
1072 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
1073
1074 /* Graph's ports connected */
1075 event.type = GRAPH_PORTS_CONNECTED;
1076 event.data.graph_ports_connected.upstream_comp = src;
1077 event.data.graph_ports_connected.downstream_comp = sink;
1078 event.data.graph_ports_connected.upstream_port = src_def_port;
1079 event.data.graph_ports_connected.downstream_port = sink_def_port;
1080 event.data.graph_ports_connected.conn = conn;
1081 ok(has_event(&event), "got the expected graph's port connected event (for source)");
1082 graph_ports_connected_pos = event_pos(&event);
1083
1084 /* Order of events */
c14181ff 1085 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1086 "event order is good (1)");
c14181ff 1087 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1088 "event order is good (2)");
c14181ff 1089 ok(src_accept_port_connection_pos < src_port_connected_pos,
fb9935cc 1090 "event order is good (3)");
c14181ff 1091 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
fb9935cc 1092 "event order is good (4)");
c14181ff
PP
1093 ok(src_port_connected_pos < graph_port_added_src_pos,
1094 "event order is good (5)");
1095 ok(graph_port_added_src_pos < graph_ports_connected_pos,
1096 "event order is good (6)");
fb9935cc
PP
1097
1098 bt_put(graph);
1099 bt_put(sink);
1100 bt_put(src);
1101 bt_put(conn);
1102 bt_put(src_def_port);
1103 bt_put(sink_def_port);
1104 bt_put(src_hello_port);
1105}
1106
1107static
1108void test_simple(void)
1109{
1110 struct bt_component *src;
1111 struct bt_component *sink;
1112 struct bt_graph *graph;
1113 struct bt_port *src_def_port;
1114 struct bt_port *sink_def_port;
1115 struct bt_connection *conn;
1116 struct event event;
a256a42d 1117 enum bt_graph_status status;
c14181ff
PP
1118 size_t src_accept_port_connection_pos;
1119 size_t sink_accept_port_connection_pos;
1120 size_t src_port_connected_pos;
1121 size_t sink_port_connected_pos;
fb9935cc
PP
1122 size_t graph_ports_connected_pos;
1123
1124 prepare_test(TEST_SIMPLE, "simple");
fb9935cc 1125 graph = create_graph();
36712f1d
PP
1126 assert(graph);
1127 src = create_src(graph);
1128 sink = create_sink(graph);
b9d103be 1129 src_def_port = bt_component_source_get_output_port_by_name(src, "out");
fb9935cc 1130 assert(src_def_port);
b9d103be 1131 sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
fb9935cc 1132 assert(sink_def_port);
a256a42d
PP
1133 status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
1134 &conn);
1135 assert(status == 0);
fb9935cc 1136
36712f1d
PP
1137 /* We're supposed to have 7 events */
1138 ok(events->len == 7, "we have the expected number of events");
1139
1140 /* Source's port added */
1141 event.type = GRAPH_PORT_ADDED;
1142 event.data.graph_port_added.comp = src;
1143 event.data.graph_port_added.port = src_def_port;
1144 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1145
1146 /* Sink's port added */
1147 event.type = GRAPH_PORT_ADDED;
1148 event.data.graph_port_added.comp = sink;
1149 event.data.graph_port_added.port = sink_def_port;
1150 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
1151
1152 /* Source's accept port connection */
1153 event.type = COMP_ACCEPT_PORT_CONNECTION;
1154 event.data.comp_accept_port_connection.comp = src;
1155 event.data.comp_accept_port_connection.self_port = src_def_port;
1156 event.data.comp_accept_port_connection.other_port = sink_def_port;
1157 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 1158 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
1159
1160 /* Sink's accept port connection */
1161 event.type = COMP_ACCEPT_PORT_CONNECTION;
1162 event.data.comp_accept_port_connection.comp = sink;
1163 event.data.comp_accept_port_connection.self_port = sink_def_port;
1164 event.data.comp_accept_port_connection.other_port = src_def_port;
1165 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
1166 sink_accept_port_connection_pos = event_pos(&event);
1167
1168 /* Source's port connected */
1169 event.type = COMP_PORT_CONNECTED;
1170 event.data.comp_port_connected.comp = src;
1171 event.data.comp_port_connected.self_port = src_def_port;
1172 event.data.comp_port_connected.other_port = sink_def_port;
1173 ok(has_event(&event), "got the expected source's port connected event");
1174 src_port_connected_pos = event_pos(&event);
1175
1176 /* Sink's port connected */
1177 event.type = COMP_PORT_CONNECTED;
1178 event.data.comp_port_connected.comp = sink;
1179 event.data.comp_port_connected.self_port = sink_def_port;
1180 event.data.comp_port_connected.other_port = src_def_port;
1181 ok(has_event(&event), "got the expected sink's port connected event");
1182 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
1183
1184 /* Graph's port connected */
1185 event.type = GRAPH_PORTS_CONNECTED;
1186 event.data.graph_ports_connected.upstream_comp = src;
1187 event.data.graph_ports_connected.downstream_comp = sink;
1188 event.data.graph_ports_connected.upstream_port = src_def_port;
1189 event.data.graph_ports_connected.downstream_port = sink_def_port;
1190 event.data.graph_ports_connected.conn = conn;
1191 ok(has_event(&event), "got the expected graph's ports connected event");
1192 graph_ports_connected_pos = event_pos(&event);
1193
1194 /* Order of events */
c14181ff 1195 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1196 "event order is good (1)");
c14181ff 1197 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1198 "event order is good (2)");
c14181ff
PP
1199 ok(src_accept_port_connection_pos < src_port_connected_pos,
1200 "event order is good (3)");
1201 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
1202 "event order is good (4)");
fb9935cc
PP
1203
1204 bt_put(graph);
1205 bt_put(sink);
1206 bt_put(src);
1207 bt_put(conn);
1208 bt_put(src_def_port);
1209 bt_put(sink_def_port);
1210}
1211
1212static
1213void test_empty_graph(void)
1214{
1215 struct bt_graph *graph;
1216
1217 prepare_test(TEST_EMPTY_GRAPH, "empty graph");
1218 graph = create_graph();
1219 ok(events->len == 0, "empty graph generates no events");
1220 bt_put(graph);
1221}
1222
1223int main(int argc, char **argv)
1224{
1225 plan_tests(NR_TESTS);
1226 init_test();
1227 test_empty_graph();
1228 test_simple();
c14181ff
PP
1229 test_src_adds_port_in_port_connected();
1230 test_sink_removes_port_in_port_connected();
1231 test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port();
fb9935cc
PP
1232 fini_test();
1233 return exit_status();
1234}
This page took 0.08197 seconds and 4 git commands to generate.