lib: rename "notification" -> "message"
[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
d94d92ac
PP
20#include <babeltrace/babeltrace.h>
21#include <babeltrace/assert-internal.h>
fb9935cc
PP
22#include <stdlib.h>
23#include <string.h>
24#include <stdbool.h>
fb9935cc
PP
25#include <glib.h>
26
27#include "tap/tap.h"
28
bf55043c 29#define NR_TESTS 99
fb9935cc
PP
30
31enum event_type {
d94d92ac
PP
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 SRC_COMP_OUTPUT_PORT_DISCONNECTED,
37 SINK_COMP_INPUT_PORT_DISCONNECTED,
38 GRAPH_SRC_OUTPUT_PORT_ADDED,
39 GRAPH_SINK_INPUT_PORT_ADDED,
40 GRAPH_SRC_OUTPUT_PORT_REMOVED,
41 GRAPH_SINK_INPUT_PORT_REMOVED,
42 GRAPH_SRC_SINK_PORTS_CONNECTED,
43 GRAPH_SRC_SINK_PORTS_DISCONNECTED,
fb9935cc
PP
44};
45
46enum test {
47 TEST_EMPTY_GRAPH,
48 TEST_SIMPLE,
bf55043c
PP
49 TEST_SRC_PORT_CONNECTED_ERROR,
50 TEST_SINK_PORT_CONNECTED_ERROR,
c14181ff 51 TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED,
fb9935cc
PP
52 TEST_SINK_REMOVES_PORT_IN_CONSUME,
53 TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
54};
55
56struct event {
57 enum event_type type;
58
59 union {
60 struct {
b19ff26f
PP
61 const bt_component *comp;
62 const bt_port *self_port;
63 const bt_port *other_port;
d94d92ac
PP
64 } src_comp_accept_output_port_connection;
65
66 struct {
b19ff26f
PP
67 const bt_component *comp;
68 const bt_port *self_port;
69 const bt_port *other_port;
d94d92ac
PP
70 } sink_comp_accept_input_port_connection;
71
72 struct {
b19ff26f
PP
73 const bt_component *comp;
74 const bt_port *self_port;
75 const bt_port *other_port;
d94d92ac 76 } src_comp_output_port_connected;
fb9935cc 77
c14181ff 78 struct {
b19ff26f
PP
79 const bt_component *comp;
80 const bt_port *self_port;
81 const bt_port *other_port;
d94d92ac
PP
82 } sink_comp_input_port_connected;
83
84 struct {
b19ff26f
PP
85 const bt_component *comp;
86 const bt_port *self_port;
d94d92ac
PP
87 } src_comp_output_port_disconnected;
88
89 struct {
b19ff26f
PP
90 const bt_component *comp;
91 const bt_port *self_port;
d94d92ac 92 } sink_comp_input_port_disconnected;
c14181ff 93
fb9935cc 94 struct {
b19ff26f
PP
95 const bt_component *comp;
96 const bt_port *port;
d94d92ac 97 } graph_src_output_port_added;
fb9935cc
PP
98
99 struct {
b19ff26f
PP
100 const bt_component *comp;
101 const bt_port *port;
d94d92ac 102 } graph_sink_input_port_added;
fb9935cc
PP
103
104 struct {
b19ff26f
PP
105 const bt_component *comp;
106 const bt_port *port;
d94d92ac
PP
107 } graph_src_output_port_removed;
108
109 struct {
b19ff26f
PP
110 const bt_component *comp;
111 const bt_port *port;
d94d92ac 112 } graph_sink_input_port_removed;
fb9935cc
PP
113
114 struct {
b19ff26f
PP
115 const bt_component *upstream_comp;
116 const bt_component *downstream_comp;
117 const bt_port *upstream_port;
118 const bt_port *downstream_port;
d94d92ac 119 } graph_src_sink_ports_connected;
fb9935cc
PP
120
121 struct {
b19ff26f
PP
122 const bt_component *upstream_comp;
123 const bt_component *downstream_comp;
124 const bt_port *upstream_port;
125 const bt_port *downstream_port;
d94d92ac 126 } graph_src_sink_ports_disconnected;
fb9935cc
PP
127 } data;
128};
129
130static GArray *events;
b19ff26f
PP
131static bt_component_class_source *src_comp_class;
132static bt_component_class_sink *sink_comp_class;
fb9935cc
PP
133static enum test current_test;
134
135static
136void clear_events(void)
137{
138 g_array_set_size(events, 0);
139}
140
141static
142void append_event(struct event *event)
143{
144 g_array_append_val(events, *event);
145}
146
147static
148bool compare_events(struct event *ev_a, struct event *ev_b)
149{
150 if (ev_a->type != ev_b->type) {
151 return false;
152 }
153
154 switch (ev_a->type) {
d94d92ac
PP
155 case SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION:
156 if (ev_a->data.src_comp_accept_output_port_connection.comp !=
157 ev_b->data.src_comp_accept_output_port_connection.comp) {
fb9935cc
PP
158 return false;
159 }
160
d94d92ac
PP
161 if (ev_a->data.src_comp_accept_output_port_connection.self_port !=
162 ev_b->data.src_comp_accept_output_port_connection.self_port) {
fb9935cc
PP
163 return false;
164 }
165
d94d92ac
PP
166 if (ev_a->data.src_comp_accept_output_port_connection.other_port !=
167 ev_b->data.src_comp_accept_output_port_connection.other_port) {
fb9935cc
PP
168 return false;
169 }
170 break;
d94d92ac
PP
171 case SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION:
172 if (ev_a->data.sink_comp_accept_input_port_connection.comp !=
173 ev_b->data.sink_comp_accept_input_port_connection.comp) {
c14181ff
PP
174 return false;
175 }
176
d94d92ac
PP
177 if (ev_a->data.sink_comp_accept_input_port_connection.self_port !=
178 ev_b->data.sink_comp_accept_input_port_connection.self_port) {
c14181ff
PP
179 return false;
180 }
181
d94d92ac
PP
182 if (ev_a->data.sink_comp_accept_input_port_connection.other_port !=
183 ev_b->data.sink_comp_accept_input_port_connection.other_port) {
c14181ff
PP
184 return false;
185 }
186 break;
d94d92ac
PP
187 case SRC_COMP_OUTPUT_PORT_CONNECTED:
188 if (ev_a->data.src_comp_output_port_connected.comp !=
189 ev_b->data.src_comp_output_port_connected.comp) {
190 return false;
191 }
192
193 if (ev_a->data.src_comp_output_port_connected.self_port !=
194 ev_b->data.src_comp_output_port_connected.self_port) {
fb9935cc
PP
195 return false;
196 }
197
d94d92ac
PP
198 if (ev_a->data.src_comp_output_port_connected.other_port !=
199 ev_b->data.src_comp_output_port_connected.other_port) {
fb9935cc
PP
200 return false;
201 }
202 break;
d94d92ac
PP
203 case SINK_COMP_INPUT_PORT_CONNECTED:
204 if (ev_a->data.sink_comp_input_port_connected.comp !=
205 ev_b->data.sink_comp_input_port_connected.comp) {
fb9935cc
PP
206 return false;
207 }
208
d94d92ac
PP
209 if (ev_a->data.sink_comp_input_port_connected.self_port !=
210 ev_b->data.sink_comp_input_port_connected.self_port) {
211 return false;
212 }
213
214 if (ev_a->data.sink_comp_input_port_connected.other_port !=
215 ev_b->data.sink_comp_input_port_connected.other_port) {
fb9935cc
PP
216 return false;
217 }
218 break;
d94d92ac
PP
219 case SRC_COMP_OUTPUT_PORT_DISCONNECTED:
220 if (ev_a->data.src_comp_output_port_disconnected.comp !=
221 ev_b->data.src_comp_output_port_disconnected.comp) {
fb9935cc
PP
222 return false;
223 }
224
d94d92ac
PP
225 if (ev_a->data.src_comp_output_port_disconnected.self_port !=
226 ev_b->data.src_comp_output_port_disconnected.self_port) {
fb9935cc
PP
227 return false;
228 }
229 break;
d94d92ac
PP
230 case SINK_COMP_INPUT_PORT_DISCONNECTED:
231 if (ev_a->data.sink_comp_input_port_disconnected.comp !=
232 ev_b->data.sink_comp_input_port_disconnected.comp) {
fb9935cc
PP
233 return false;
234 }
235
d94d92ac
PP
236 if (ev_a->data.sink_comp_input_port_disconnected.self_port !=
237 ev_b->data.sink_comp_input_port_disconnected.self_port) {
238 return false;
239 }
240 break;
241 case GRAPH_SRC_OUTPUT_PORT_ADDED:
242 if (ev_a->data.graph_src_output_port_added.comp !=
243 ev_b->data.graph_src_output_port_added.comp) {
fb9935cc
PP
244 return false;
245 }
246
d94d92ac
PP
247 if (ev_a->data.graph_src_output_port_added.port !=
248 ev_b->data.graph_src_output_port_added.port) {
249 return false;
250 }
251 break;
252 case GRAPH_SINK_INPUT_PORT_ADDED:
253 if (ev_a->data.graph_sink_input_port_added.comp !=
254 ev_b->data.graph_sink_input_port_added.comp) {
255 return false;
256 }
257
258 if (ev_a->data.graph_sink_input_port_added.port !=
259 ev_b->data.graph_sink_input_port_added.port) {
260 return false;
261 }
262 break;
263 case GRAPH_SRC_OUTPUT_PORT_REMOVED:
264 if (ev_a->data.graph_src_output_port_removed.comp !=
265 ev_b->data.graph_src_output_port_removed.comp) {
266 return false;
267 }
268
269 if (ev_a->data.graph_src_output_port_removed.port !=
270 ev_b->data.graph_src_output_port_removed.port) {
271 return false;
272 }
273 break;
274 case GRAPH_SINK_INPUT_PORT_REMOVED:
275 if (ev_a->data.graph_sink_input_port_removed.comp !=
276 ev_b->data.graph_sink_input_port_removed.comp) {
277 return false;
278 }
279
280 if (ev_a->data.graph_sink_input_port_removed.port !=
281 ev_b->data.graph_sink_input_port_removed.port) {
282 return false;
283 }
284 break;
285 case GRAPH_SRC_SINK_PORTS_CONNECTED:
286 if (ev_a->data.graph_src_sink_ports_connected.upstream_comp !=
287 ev_b->data.graph_src_sink_ports_connected.upstream_comp) {
288 return false;
289 }
290
291 if (ev_a->data.graph_src_sink_ports_connected.downstream_comp !=
292 ev_b->data.graph_src_sink_ports_connected.downstream_comp) {
fb9935cc
PP
293 return false;
294 }
295
d94d92ac
PP
296 if (ev_a->data.graph_src_sink_ports_connected.upstream_port !=
297 ev_b->data.graph_src_sink_ports_connected.upstream_port) {
fb9935cc
PP
298 return false;
299 }
300
d94d92ac
PP
301 if (ev_a->data.graph_src_sink_ports_connected.downstream_port !=
302 ev_b->data.graph_src_sink_ports_connected.downstream_port) {
fb9935cc
PP
303 return false;
304 }
305 break;
d94d92ac
PP
306 case GRAPH_SRC_SINK_PORTS_DISCONNECTED:
307 if (ev_a->data.graph_src_sink_ports_disconnected.upstream_comp !=
308 ev_b->data.graph_src_sink_ports_disconnected.upstream_comp) {
fb9935cc
PP
309 return false;
310 }
311
d94d92ac
PP
312 if (ev_a->data.graph_src_sink_ports_disconnected.downstream_comp !=
313 ev_b->data.graph_src_sink_ports_disconnected.downstream_comp) {
fb9935cc
PP
314 return false;
315 }
316
d94d92ac
PP
317 if (ev_a->data.graph_src_sink_ports_disconnected.upstream_port !=
318 ev_b->data.graph_src_sink_ports_disconnected.upstream_port) {
fb9935cc
PP
319 return false;
320 }
321
d94d92ac
PP
322 if (ev_a->data.graph_src_sink_ports_disconnected.downstream_port !=
323 ev_b->data.graph_src_sink_ports_disconnected.downstream_port) {
fb9935cc
PP
324 return false;
325 }
326 break;
327 default:
0fbb9a9f 328 abort();
fb9935cc
PP
329 }
330
331 return true;
332}
333
334static
335bool has_event(struct event *event)
336{
337 size_t i;
338
339 for (i = 0; i < events->len; i++) {
340 struct event *ev = &g_array_index(events, struct event, i);
341
342 if (compare_events(event, ev)) {
343 return true;
344 }
345 }
346
347 return false;
348}
349
350static
351size_t event_pos(struct event *event)
352{
353 size_t i;
354
355 for (i = 0; i < events->len; i++) {
356 struct event *ev = &g_array_index(events, struct event, i);
357
358 if (compare_events(event, ev)) {
359 return i;
360 }
361 }
362
1974687e 363 return SIZE_MAX;
fb9935cc
PP
364}
365
366static
d6e69534
PP
367enum bt_self_message_iterator_status src_iter_next(
368 bt_self_message_iterator *self_iterator,
369 bt_message_array_const msgs, uint64_t capacity,
d4393e08 370 uint64_t *count)
fb9935cc 371{
d6e69534 372 return BT_SELF_MESSAGE_ITERATOR_STATUS_ERROR;
fb9935cc
PP
373}
374
375static
d94d92ac 376enum bt_self_component_status src_accept_output_port_connection(
b19ff26f
PP
377 bt_self_component_source *self_comp,
378 bt_self_component_port_output *self_comp_port,
379 const bt_port_input *other_port)
fb9935cc 380{
fb9935cc 381 struct event event = {
d94d92ac
PP
382 .type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION,
383 .data.src_comp_accept_output_port_connection = {
707b7d35
PP
384 .comp = bt_self_component_as_component(
385 bt_self_component_source_as_self_component(
d94d92ac 386 self_comp)),
707b7d35
PP
387 .self_port = bt_self_component_port_as_port(
388 bt_self_component_port_output_as_self_component_port(
d94d92ac 389 self_comp_port)),
0d72b8c3 390 .other_port = bt_port_input_as_port_const(other_port),
fb9935cc
PP
391 },
392 };
393
fb9935cc 394 append_event(&event);
d94d92ac 395 return BT_SELF_COMPONENT_STATUS_OK;
c14181ff
PP
396}
397
398static
d94d92ac 399enum bt_self_component_status sink_accept_input_port_connection(
b19ff26f
PP
400 bt_self_component_sink *self_comp,
401 bt_self_component_port_input *self_comp_port,
402 const bt_port_output *other_port)
c14181ff 403{
d94d92ac
PP
404 struct event event = {
405 .type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION,
406 .data.sink_comp_accept_input_port_connection = {
707b7d35
PP
407 .comp = bt_self_component_as_component(
408 bt_self_component_sink_as_self_component(
d94d92ac 409 self_comp)),
707b7d35
PP
410 .self_port = bt_self_component_port_as_port(
411 bt_self_component_port_input_as_self_component_port(
d94d92ac 412 self_comp_port)),
0d72b8c3 413 .other_port = bt_port_output_as_port_const(other_port),
d94d92ac
PP
414 },
415 };
c14181ff 416
d94d92ac
PP
417 append_event(&event);
418 return BT_SELF_COMPONENT_STATUS_OK;
419}
420
421static
422enum bt_self_component_status src_output_port_connected(
b19ff26f
PP
423 bt_self_component_source *self_comp,
424 bt_self_component_port_output *self_comp_port,
425 const bt_port_input *other_port)
d94d92ac
PP
426{
427 int ret;
c14181ff 428 struct event event = {
d94d92ac
PP
429 .type = SRC_COMP_OUTPUT_PORT_CONNECTED,
430 .data.src_comp_output_port_connected = {
707b7d35
PP
431 .comp = bt_self_component_as_component(
432 bt_self_component_source_as_self_component(
d94d92ac 433 self_comp)),
707b7d35
PP
434 .self_port = bt_self_component_port_as_port(
435 bt_self_component_port_output_as_self_component_port(
d94d92ac 436 self_comp_port)),
0d72b8c3 437 .other_port = bt_port_input_as_port_const(other_port),
c14181ff
PP
438 },
439 };
440
c14181ff 441 append_event(&event);
fb9935cc
PP
442
443 switch (current_test) {
c14181ff 444 case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED:
d94d92ac
PP
445 ret = bt_self_component_source_add_output_port(
446 self_comp, "hello", NULL, NULL);
25583cd0 447 BT_ASSERT(ret == 0);
fb9935cc 448 break;
bf55043c 449 case TEST_SRC_PORT_CONNECTED_ERROR:
d94d92ac 450 return BT_SELF_COMPONENT_STATUS_ERROR;
fb9935cc
PP
451 default:
452 break;
453 }
bf55043c 454
d94d92ac 455 return BT_SELF_COMPONENT_STATUS_OK;
fb9935cc
PP
456}
457
458static
d94d92ac 459enum bt_self_component_status sink_input_port_connected(
b19ff26f
PP
460 bt_self_component_sink *self_comp,
461 bt_self_component_port_input *self_comp_port,
462 const bt_port_output *other_port)
d94d92ac
PP
463{
464 struct event event = {
465 .type = SINK_COMP_INPUT_PORT_CONNECTED,
466 .data.sink_comp_input_port_connected = {
707b7d35
PP
467 .comp = bt_self_component_as_component(
468 bt_self_component_sink_as_self_component(
d94d92ac 469 self_comp)),
707b7d35
PP
470 .self_port = bt_self_component_port_as_port(
471 bt_self_component_port_input_as_self_component_port(
d94d92ac 472 self_comp_port)),
0d72b8c3 473 .other_port = bt_port_output_as_port_const(other_port),
d94d92ac
PP
474 },
475 };
476
477 append_event(&event);
478
479 if (current_test == TEST_SINK_PORT_CONNECTED_ERROR) {
480 return BT_SELF_COMPONENT_STATUS_ERROR;
481 } else {
482 return BT_SELF_COMPONENT_STATUS_OK;
483 }
484}
485
486static
b19ff26f
PP
487void src_output_port_disconnected(bt_self_component_source *self_comp,
488 bt_self_component_port_output *self_comp_port)
fb9935cc
PP
489{
490 int ret;
491 struct event event = {
d94d92ac
PP
492 .type = SRC_COMP_OUTPUT_PORT_DISCONNECTED,
493 .data.src_comp_output_port_disconnected = {
707b7d35
PP
494 .comp = bt_self_component_as_component(
495 bt_self_component_source_as_self_component(
d94d92ac 496 self_comp)),
707b7d35
PP
497 .self_port = bt_self_component_port_as_port(
498 bt_self_component_port_output_as_self_component_port(
d94d92ac 499 self_comp_port)),
fb9935cc
PP
500 },
501 };
502
fb9935cc
PP
503 append_event(&event);
504
505 switch (current_test) {
506 case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT:
d94d92ac 507 ret = bt_self_component_port_remove_from_component(
707b7d35 508 bt_self_component_port_output_as_self_component_port(
d94d92ac 509 self_comp_port));
25583cd0 510 BT_ASSERT(ret == 0);
fb9935cc
PP
511 default:
512 break;
513 }
514}
515
b9d103be 516static
b19ff26f
PP
517void sink_input_port_disconnected(bt_self_component_sink *self_comp,
518 bt_self_component_port_input *self_comp_port)
d94d92ac
PP
519{
520 struct event event = {
521 .type = SINK_COMP_INPUT_PORT_DISCONNECTED,
522 .data.sink_comp_input_port_disconnected = {
707b7d35
PP
523 .comp = bt_self_component_as_component(
524 bt_self_component_sink_as_self_component(
d94d92ac 525 self_comp)),
707b7d35
PP
526 .self_port = bt_self_component_port_as_port(
527 bt_self_component_port_input_as_self_component_port(
d94d92ac
PP
528 self_comp_port)),
529 },
530 };
531
532 append_event(&event);
533}
534
535static
536enum bt_self_component_status src_init(
b19ff26f
PP
537 bt_self_component_source *self_comp,
538 const bt_value *params, void *init_method_data)
b9d103be 539{
147337a3 540 int ret;
b9d103be 541
d94d92ac
PP
542 ret = bt_self_component_source_add_output_port(
543 self_comp, "out", NULL, NULL);
25583cd0 544 BT_ASSERT(ret == 0);
d94d92ac 545 return BT_SELF_COMPONENT_STATUS_OK;
b9d103be
PP
546}
547
fb9935cc 548static
d94d92ac 549enum bt_self_component_status sink_init(
b19ff26f
PP
550 bt_self_component_sink *self_comp,
551 const bt_value *params, void *init_method_data)
fb9935cc 552{
d94d92ac
PP
553 int ret;
554
555 ret = bt_self_component_sink_add_input_port(self_comp,
556 "in", NULL, NULL);
557 BT_ASSERT(ret == 0);
558 return BT_SELF_COMPONENT_STATUS_OK;
559}
560
561static
562enum bt_self_component_status sink_consume(
b19ff26f 563 bt_self_component_sink *self_comp)
d94d92ac 564{
b19ff26f 565 bt_self_component_port_input *def_port;
fb9935cc
PP
566 int ret;
567
568 switch (current_test) {
569 case TEST_SINK_REMOVES_PORT_IN_CONSUME:
570 case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT:
d94d92ac
PP
571 def_port = bt_self_component_sink_borrow_input_port_by_name(
572 self_comp, "in");
25583cd0 573 BT_ASSERT(def_port);
d94d92ac 574 ret = bt_self_component_port_remove_from_component(
707b7d35 575 bt_self_component_port_input_as_self_component_port(
d94d92ac 576 def_port));
25583cd0 577 BT_ASSERT(ret == 0);
fb9935cc
PP
578 break;
579 default:
580 break;
581 }
582
d94d92ac 583 return BT_SELF_COMPONENT_STATUS_OK;
fb9935cc
PP
584}
585
586static
b19ff26f
PP
587void graph_src_output_port_added(const bt_component_source *comp,
588 const bt_port_output *port, void *data)
fb9935cc
PP
589{
590 struct event event = {
d94d92ac
PP
591 .type = GRAPH_SRC_OUTPUT_PORT_ADDED,
592 .data.graph_src_output_port_added = {
0d72b8c3
PP
593 .comp = bt_component_source_as_component_const(comp),
594 .port = bt_port_output_as_port_const(port),
fb9935cc
PP
595 },
596 };
597
fb9935cc 598 append_event(&event);
fb9935cc
PP
599}
600
601static
b19ff26f
PP
602void graph_sink_input_port_added(const bt_component_sink *comp,
603 const bt_port_input *port, void *data)
fb9935cc
PP
604{
605 struct event event = {
d94d92ac
PP
606 .type = GRAPH_SINK_INPUT_PORT_ADDED,
607 .data.graph_sink_input_port_added = {
0d72b8c3
PP
608 .comp = bt_component_sink_as_component_const(comp),
609 .port = bt_port_input_as_port_const(port),
fb9935cc
PP
610 },
611 };
612
fb9935cc
PP
613 append_event(&event);
614}
615
b9d103be 616static
b19ff26f
PP
617void graph_src_output_port_removed(const bt_component_source *comp,
618 const bt_port_output *port, void *data)
fb9935cc 619{
fb9935cc 620 struct event event = {
d94d92ac
PP
621 .type = GRAPH_SRC_OUTPUT_PORT_REMOVED,
622 .data.graph_src_output_port_removed = {
0d72b8c3
PP
623 .comp = bt_component_source_as_component_const(comp),
624 .port = bt_port_output_as_port_const(port),
fb9935cc
PP
625 },
626 };
627
628 append_event(&event);
629}
630
631static
b19ff26f
PP
632void graph_sink_input_port_removed(const bt_component_sink *comp,
633 const bt_port_input *port, void *data)
fb9935cc
PP
634{
635 struct event event = {
d94d92ac
PP
636 .type = GRAPH_SINK_INPUT_PORT_REMOVED,
637 .data.graph_sink_input_port_removed = {
0d72b8c3
PP
638 .comp = bt_component_sink_as_component_const(comp),
639 .port = bt_port_input_as_port_const(port),
fb9935cc
PP
640 },
641 };
642
643 append_event(&event);
644}
645
646static
b19ff26f
PP
647void graph_src_sink_ports_connected(const bt_component_source *upstream_comp,
648 const bt_component_sink *downstream_comp,
649 const bt_port_output *upstream_port,
650 const bt_port_input *downstream_port, void *data)
fb9935cc 651{
fb9935cc 652 struct event event = {
d94d92ac
PP
653 .type = GRAPH_SRC_SINK_PORTS_CONNECTED,
654 .data.graph_src_sink_ports_connected = {
655 .upstream_comp =
0d72b8c3
PP
656 bt_component_source_as_component_const(upstream_comp),
657 .downstream_comp =
658 bt_component_sink_as_component_const(downstream_comp),
659 .upstream_port =
660 bt_port_output_as_port_const(upstream_port),
661 .downstream_port =
662 bt_port_input_as_port_const(downstream_port),
fb9935cc
PP
663 },
664 };
665
666 append_event(&event);
667}
668
669static
b19ff26f
PP
670void graph_src_sink_ports_disconnected(const bt_component_source *upstream_comp,
671 const bt_component_sink *downstream_comp,
672 const bt_port_output *upstream_port,
673 const bt_port_input *downstream_port, void *data)
fb9935cc
PP
674{
675 struct event event = {
d94d92ac
PP
676 .type = GRAPH_SRC_SINK_PORTS_DISCONNECTED,
677 .data.graph_src_sink_ports_disconnected = {
678 .upstream_comp =
0d72b8c3
PP
679 bt_component_source_as_component_const(upstream_comp),
680 .downstream_comp =
681 bt_component_sink_as_component_const(downstream_comp),
682 .upstream_port =
683 bt_port_output_as_port_const(upstream_port),
684 .downstream_port =
685 bt_port_input_as_port_const(downstream_port),
fb9935cc
PP
686 },
687 };
688
689 append_event(&event);
690}
691
692static
693void init_test(void)
694{
695 int ret;
696
0d72b8c3 697 src_comp_class = bt_component_class_source_create(
d94d92ac 698 "src", src_iter_next);
25583cd0 699 BT_ASSERT(src_comp_class);
0d72b8c3 700 ret = bt_component_class_source_set_init_method(
d94d92ac 701 src_comp_class, src_init);
25583cd0 702 BT_ASSERT(ret == 0);
0d72b8c3 703 ret = bt_component_class_source_set_accept_output_port_connection_method(
d94d92ac 704 src_comp_class, src_accept_output_port_connection);
25583cd0 705 BT_ASSERT(ret == 0);
0d72b8c3 706 ret = bt_component_class_source_set_output_port_connected_method(
d94d92ac 707 src_comp_class, src_output_port_connected);
25583cd0 708 BT_ASSERT(ret == 0);
0d72b8c3 709 ret = bt_component_class_source_set_output_port_disconnected_method(
d94d92ac 710 src_comp_class, src_output_port_disconnected);
25583cd0 711 BT_ASSERT(ret == 0);
0d72b8c3 712 sink_comp_class = bt_component_class_sink_create("sink",
d94d92ac 713 sink_consume);
25583cd0 714 BT_ASSERT(sink_comp_class);
0d72b8c3 715 ret = bt_component_class_sink_set_init_method(sink_comp_class,
d94d92ac 716 sink_init);
25583cd0 717 BT_ASSERT(ret == 0);
0d72b8c3 718 ret = bt_component_class_sink_set_accept_input_port_connection_method(
d94d92ac 719 sink_comp_class, sink_accept_input_port_connection);
25583cd0 720 BT_ASSERT(ret == 0);
0d72b8c3 721 ret = bt_component_class_sink_set_input_port_connected_method(
d94d92ac 722 sink_comp_class, sink_input_port_connected);
25583cd0 723 BT_ASSERT(ret == 0);
0d72b8c3 724 ret = bt_component_class_sink_set_input_port_disconnected_method(
d94d92ac 725 sink_comp_class, sink_input_port_disconnected);
25583cd0 726 BT_ASSERT(ret == 0);
fb9935cc 727 events = g_array_new(FALSE, TRUE, sizeof(struct event));
25583cd0 728 BT_ASSERT(events);
fb9935cc
PP
729}
730
731static
732void fini_test(void)
733{
c5b9b441
PP
734 bt_component_class_source_put_ref(src_comp_class);
735 bt_component_class_sink_put_ref(sink_comp_class);
fb9935cc
PP
736 g_array_free(events, TRUE);
737}
738
739static
b19ff26f 740const bt_component_source *create_src(bt_graph *graph)
fb9935cc 741{
b19ff26f 742 const bt_component_source *comp;
36712f1d 743 int ret;
fb9935cc 744
0d72b8c3 745 ret = bt_graph_add_source_component(graph, src_comp_class,
d94d92ac 746 "src-comp", NULL, &comp);
25583cd0 747 BT_ASSERT(ret == 0);
fb9935cc
PP
748 return comp;
749}
750
751static
b19ff26f 752const bt_component_sink *create_sink(bt_graph *graph)
fb9935cc 753{
b19ff26f 754 const bt_component_sink *comp;
36712f1d 755 int ret;
fb9935cc 756
0d72b8c3 757 ret = bt_graph_add_sink_component(graph, sink_comp_class,
d94d92ac 758 "sink-comp", NULL, &comp);
25583cd0 759 BT_ASSERT(ret == 0);
fb9935cc
PP
760 return comp;
761}
762
763static
b19ff26f 764bt_graph *create_graph(void)
fb9935cc 765{
b19ff26f 766 bt_graph *graph = bt_graph_create();
fb9935cc
PP
767 int ret;
768
25583cd0 769 BT_ASSERT(graph);
0d72b8c3 770 ret = bt_graph_add_source_component_output_port_added_listener(
d94d92ac
PP
771 graph, graph_src_output_port_added, NULL, NULL, NULL);
772 BT_ASSERT(ret >= 0);
0d72b8c3 773 ret = bt_graph_add_sink_component_input_port_added_listener(
d94d92ac 774 graph, graph_sink_input_port_added, NULL, NULL, NULL);
25583cd0 775 BT_ASSERT(ret >= 0);
0d72b8c3 776 ret = bt_graph_add_source_component_output_port_removed_listener(
d94d92ac 777 graph, graph_src_output_port_removed, NULL, NULL, NULL);
25583cd0 778 BT_ASSERT(ret >= 0);
0d72b8c3 779 ret = bt_graph_add_sink_component_input_port_removed_listener(
d94d92ac 780 graph, graph_sink_input_port_removed, NULL, NULL, NULL);
25583cd0 781 BT_ASSERT(ret >= 0);
0d72b8c3 782 ret = bt_graph_add_source_sink_component_ports_connected_listener(
d94d92ac
PP
783 graph, graph_src_sink_ports_connected, NULL, NULL, NULL);
784 BT_ASSERT(ret >= 0);
0d72b8c3 785 ret = bt_graph_add_source_sink_component_ports_disconnected_listener(
d94d92ac 786 graph, graph_src_sink_ports_disconnected, NULL, NULL, NULL);
25583cd0 787 BT_ASSERT(ret >= 0);
fb9935cc
PP
788 return graph;
789}
790
791static
792void prepare_test(enum test test, const char *name)
793{
794 clear_events();
795 current_test = test;
796 diag("test: %s", name);
797}
798
799static
d94d92ac 800void test_sink_removes_port_in_consume_then_src_removes_disconnected_port(void)
fb9935cc
PP
801{
802 int ret;
b19ff26f
PP
803 const bt_component_source *src;
804 const bt_component_sink *sink;
805 const bt_component *gsrc;
806 const bt_component *gsink;
807 bt_graph *graph;
808 const bt_port_output *src_def_port;
809 const bt_port_input *sink_def_port;
810 const bt_port *gsrc_def_port;
811 const bt_port *gsink_def_port;
fb9935cc 812 struct event event;
a256a42d 813 enum bt_graph_status status;
c14181ff
PP
814 size_t src_accept_port_connection_pos;
815 size_t sink_accept_port_connection_pos;
816 size_t src_port_connected_pos;
817 size_t sink_port_connected_pos;
d94d92ac 818 size_t graph_ports_connected_pos;
fb9935cc
PP
819 size_t src_port_disconnected_pos;
820 size_t sink_port_disconnected_pos;
821 size_t graph_ports_disconnected_pos;
822 size_t graph_port_removed_src_pos;
823 size_t graph_port_removed_sink_pos;
824
825 prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
826 "sink removes port in consume, then source removes disconnected port");
fb9935cc 827 graph = create_graph();
25583cd0 828 BT_ASSERT(graph);
36712f1d
PP
829 src = create_src(graph);
830 sink = create_sink(graph);
0d72b8c3
PP
831 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
832 "out");
25583cd0 833 BT_ASSERT(src_def_port);
0d72b8c3
PP
834 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
835 "in");
25583cd0 836 BT_ASSERT(sink_def_port);
0d72b8c3 837 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 838 sink_def_port, NULL);
25583cd0 839 BT_ASSERT(status == 0);
0d72b8c3
PP
840 gsrc = bt_component_source_as_component_const(src);
841 gsink = bt_component_sink_as_component_const(sink);
842 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
843 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
fb9935cc 844
36712f1d
PP
845 /* We're supposed to have 7 events so far */
846 ok(events->len == 7, "we have the expected number of events (before consume)");
847
848 /* Source's port added */
d94d92ac
PP
849 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
850 event.data.graph_src_output_port_added.comp = gsrc;
851 event.data.graph_src_output_port_added.port = gsrc_def_port;
36712f1d
PP
852 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
853
854 /* Sink's port added */
d94d92ac
PP
855 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
856 event.data.graph_sink_input_port_added.comp = gsink;
857 event.data.graph_sink_input_port_added.port = gsink_def_port;
36712f1d 858 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
859
860 /* Source's accept port connection */
d94d92ac
PP
861 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
862 event.data.src_comp_accept_output_port_connection.comp = gsrc;
863 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
864 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
fb9935cc 865 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 866 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
867
868 /* Sink's accept port connection */
d94d92ac
PP
869 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
870 event.data.sink_comp_accept_input_port_connection.comp = gsink;
871 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
872 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
fb9935cc 873 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
874 sink_accept_port_connection_pos = event_pos(&event);
875
876 /* Source's port connected */
d94d92ac
PP
877 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
878 event.data.src_comp_output_port_connected.comp = gsrc;
879 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
880 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
c14181ff
PP
881 ok(has_event(&event), "got the expected source's port connected event");
882 src_port_connected_pos = event_pos(&event);
883
884 /* Sink's port connected */
d94d92ac
PP
885 event.type = SINK_COMP_INPUT_PORT_CONNECTED;
886 event.data.sink_comp_input_port_connected.comp = gsink;
887 event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
888 event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
c14181ff
PP
889 ok(has_event(&event), "got the expected sink's port connected event");
890 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
891
892 /* Graph's ports connected */
d94d92ac
PP
893 event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
894 event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
895 event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
896 event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
897 event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
fb9935cc 898 ok(has_event(&event), "got the expected graph's ports connected event");
d94d92ac 899 graph_ports_connected_pos = event_pos(&event);
fb9935cc
PP
900
901 /* Order of events */
d94d92ac 902 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 903 "event order is good (1)");
d94d92ac 904 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 905 "event order is good (2)");
c14181ff
PP
906 ok(src_accept_port_connection_pos < src_port_connected_pos,
907 "event order is good (3)");
908 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
909 "event order is good (4)");
fb9935cc
PP
910
911 /* Consume sink once */
912 clear_events();
0d72b8c3 913 ret = bt_graph_consume(graph);
25583cd0 914 BT_ASSERT(ret == 0);
fb9935cc
PP
915
916 /* We're supposed to have 5 new events */
917 ok(events->len == 5, "we have the expected number of events (after consume)");
918
919 /* Source's port disconnected */
d94d92ac
PP
920 event.type = SRC_COMP_OUTPUT_PORT_DISCONNECTED;
921 event.data.src_comp_output_port_disconnected.comp = gsrc;
922 event.data.src_comp_output_port_disconnected.self_port = gsrc_def_port;
fb9935cc
PP
923 ok(has_event(&event), "got the expected source's port disconnected event");
924 src_port_disconnected_pos = event_pos(&event);
925
926 /* Sink's port disconnected */
d94d92ac
PP
927 event.type = SINK_COMP_INPUT_PORT_DISCONNECTED;
928 event.data.sink_comp_input_port_disconnected.comp = gsink;
929 event.data.sink_comp_input_port_disconnected.self_port = gsink_def_port;
fb9935cc
PP
930 ok(has_event(&event), "got the expected sink's port disconnected event");
931 sink_port_disconnected_pos = event_pos(&event);
932
933 /* Graph's ports disconnected */
d94d92ac
PP
934 event.type = GRAPH_SRC_SINK_PORTS_DISCONNECTED;
935 event.data.graph_src_sink_ports_disconnected.upstream_comp = gsrc;
936 event.data.graph_src_sink_ports_disconnected.downstream_comp = gsink;
937 event.data.graph_src_sink_ports_disconnected.upstream_port = gsrc_def_port;
938 event.data.graph_src_sink_ports_disconnected.downstream_port = gsink_def_port;
fb9935cc
PP
939 ok(has_event(&event), "got the expected graph's ports disconnected event");
940 graph_ports_disconnected_pos = event_pos(&event);
941
942 /* Graph's port removed (sink) */
d94d92ac
PP
943 event.type = GRAPH_SINK_INPUT_PORT_REMOVED;
944 event.data.graph_sink_input_port_removed.comp = gsink;
945 event.data.graph_sink_input_port_removed.port = gsink_def_port;
fb9935cc
PP
946 ok(has_event(&event), "got the expected graph's port removed event (for sink)");
947 graph_port_removed_sink_pos = event_pos(&event);
948
949 /* Graph's port removed (source) */
d94d92ac
PP
950 event.type = GRAPH_SRC_OUTPUT_PORT_REMOVED;
951 event.data.graph_src_output_port_removed.comp = gsrc;
952 event.data.graph_src_output_port_removed.port = gsrc_def_port;
fb9935cc
PP
953 ok(has_event(&event), "got the expected graph's port removed event (for source)");
954 graph_port_removed_src_pos = event_pos(&event);
955
956 /* Order of events */
957 ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
958 "event order is good (5)");
959 ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
960 "event order is good (6)");
961 ok(src_port_disconnected_pos < graph_port_removed_src_pos,
962 "event order is good (7)");
963 ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
964 "event order is good (8)");
965 ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
966 "event order is good (9)");
967 ok(sink_port_disconnected_pos < graph_port_removed_src_pos,
968 "event order is good (10)");
969 ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
970 "event order is good (11)");
971 ok(graph_port_removed_src_pos < graph_ports_disconnected_pos,
972 "event order is good (12)");
973 ok(graph_port_removed_src_pos < graph_port_removed_sink_pos,
974 "event order is good (13)");
975
c5b9b441
PP
976 bt_graph_put_ref(graph);
977 bt_component_sink_put_ref(sink);
978 bt_component_source_put_ref(src);
fb9935cc
PP
979}
980
981static
d94d92ac 982void test_sink_removes_port_in_consume(void)
fb9935cc
PP
983{
984 int ret;
b19ff26f
PP
985 const bt_component_source *src;
986 const bt_component_sink *sink;
987 const bt_component *gsrc;
988 const bt_component *gsink;
989 bt_graph *graph;
990 const bt_port_output *src_def_port;
991 const bt_port_input *sink_def_port;
992 const bt_port *gsrc_def_port;
993 const bt_port *gsink_def_port;
fb9935cc 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 src_port_disconnected_pos;
1002 size_t sink_port_disconnected_pos;
1003 size_t graph_ports_disconnected_pos;
1004 size_t graph_port_removed_sink_pos;
1005
1006 prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME,
1007 "sink removes port in consume");
fb9935cc 1008 graph = create_graph();
25583cd0 1009 BT_ASSERT(graph);
36712f1d
PP
1010 src = create_src(graph);
1011 sink = create_sink(graph);
0d72b8c3
PP
1012 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
1013 "out");
25583cd0 1014 BT_ASSERT(src_def_port);
0d72b8c3
PP
1015 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
1016 "in");
25583cd0 1017 BT_ASSERT(sink_def_port);
0d72b8c3 1018 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 1019 sink_def_port, NULL);
25583cd0 1020 BT_ASSERT(status == 0);
0d72b8c3
PP
1021 gsrc = bt_component_source_as_component_const(src);
1022 gsink = bt_component_sink_as_component_const(sink);
1023 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
1024 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
fb9935cc 1025
36712f1d
PP
1026 /* We're supposed to have 7 events so far */
1027 ok(events->len == 7, "we have the expected number of events (before consume)");
1028
1029 /* Source's port added */
d94d92ac
PP
1030 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1031 event.data.graph_src_output_port_added.comp = gsrc;
1032 event.data.graph_src_output_port_added.port = gsrc_def_port;
36712f1d
PP
1033 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1034
1035 /* Sink's port added */
d94d92ac
PP
1036 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
1037 event.data.graph_sink_input_port_added.comp = gsink;
1038 event.data.graph_sink_input_port_added.port = gsink_def_port;
36712f1d 1039 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
1040
1041 /* Source's accept port connection */
d94d92ac
PP
1042 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
1043 event.data.src_comp_accept_output_port_connection.comp = gsrc;
1044 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
1045 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
fb9935cc 1046 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 1047 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
1048
1049 /* Sink's accept port connection */
d94d92ac
PP
1050 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
1051 event.data.sink_comp_accept_input_port_connection.comp = gsink;
1052 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
1053 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
fb9935cc 1054 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
1055 sink_accept_port_connection_pos = event_pos(&event);
1056
1057 /* Source's port connected */
d94d92ac
PP
1058 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
1059 event.data.src_comp_output_port_connected.comp = gsrc;
1060 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
1061 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
c14181ff
PP
1062 ok(has_event(&event), "got the expected source's port connected event");
1063 src_port_connected_pos = event_pos(&event);
1064
1065 /* Sink's port connected */
d94d92ac
PP
1066 event.type = SINK_COMP_INPUT_PORT_CONNECTED;
1067 event.data.sink_comp_input_port_connected.comp = gsink;
1068 event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
1069 event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
c14181ff
PP
1070 ok(has_event(&event), "got the expected sink's port connected event");
1071 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
1072
1073 /* Graph's ports connected */
d94d92ac
PP
1074 event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
1075 event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
1076 event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
1077 event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
1078 event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
fb9935cc
PP
1079 ok(has_event(&event), "got the expected graph's ports connected event");
1080 graph_ports_connected_pos = event_pos(&event);
1081
1082 /* Order of events */
c14181ff 1083 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1084 "event order is good (1)");
c14181ff 1085 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1086 "event order is good (2)");
c14181ff
PP
1087 ok(src_accept_port_connection_pos < src_port_connected_pos,
1088 "event order is good (3)");
1089 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
1090 "event order is good (4)");
fb9935cc
PP
1091
1092 /* Consume sink once */
1093 clear_events();
0d72b8c3 1094 ret = bt_graph_consume(graph);
25583cd0 1095 BT_ASSERT(ret == 0);
fb9935cc
PP
1096
1097 /* We're supposed to have 4 new events */
1098 ok(events->len == 4, "we have the expected number of events (after consume)");
1099
1100 /* Source's port disconnected */
d94d92ac
PP
1101 event.type = SRC_COMP_OUTPUT_PORT_DISCONNECTED;
1102 event.data.src_comp_output_port_disconnected.comp = gsrc;
1103 event.data.src_comp_output_port_disconnected.self_port = gsrc_def_port;
fb9935cc
PP
1104 ok(has_event(&event), "got the expected source's port disconnected event");
1105 src_port_disconnected_pos = event_pos(&event);
1106
1107 /* Sink's port disconnected */
d94d92ac
PP
1108 event.type = SINK_COMP_INPUT_PORT_DISCONNECTED;
1109 event.data.sink_comp_input_port_disconnected.comp = gsink;
1110 event.data.sink_comp_input_port_disconnected.self_port = gsink_def_port;
fb9935cc
PP
1111 ok(has_event(&event), "got the expected sink's port disconnected event");
1112 sink_port_disconnected_pos = event_pos(&event);
1113
1114 /* Graph's ports disconnected */
d94d92ac
PP
1115 event.type = GRAPH_SRC_SINK_PORTS_DISCONNECTED;
1116 event.data.graph_src_sink_ports_disconnected.upstream_comp = gsrc;
1117 event.data.graph_src_sink_ports_disconnected.downstream_comp = gsink;
1118 event.data.graph_src_sink_ports_disconnected.upstream_port = gsrc_def_port;
1119 event.data.graph_src_sink_ports_disconnected.downstream_port = gsink_def_port;
fb9935cc
PP
1120 ok(has_event(&event), "got the expected graph's ports disconnected event");
1121 graph_ports_disconnected_pos = event_pos(&event);
1122
1123 /* Graph's port removed (sink) */
d94d92ac
PP
1124 event.type = GRAPH_SINK_INPUT_PORT_REMOVED;
1125 event.data.graph_sink_input_port_removed.comp = gsink;
1126 event.data.graph_sink_input_port_removed.port = gsink_def_port;
fb9935cc
PP
1127 ok(has_event(&event), "got the expected graph's port removed event (for sink)");
1128 graph_port_removed_sink_pos = event_pos(&event);
1129
1130 /* Order of events */
1131 ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
1132 "event order is good (5)");
1133 ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
1134 "event order is good (7)");
1135 ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
1136 "event order is good (8)");
1137 ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
1138 "event order is good (10)");
1139 ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
1140 "event order is good (11)");
1141
c5b9b441
PP
1142 bt_component_sink_put_ref(sink);
1143 bt_component_source_put_ref(src);
1144 bt_graph_put_ref(graph);
fb9935cc
PP
1145}
1146
1147static
c14181ff 1148void test_src_adds_port_in_port_connected(void)
fb9935cc 1149{
b19ff26f
PP
1150 const bt_component_source *src;
1151 const bt_component_sink *sink;
1152 const bt_component *gsrc;
1153 const bt_component *gsink;
1154 bt_graph *graph;
1155 const bt_port_output *src_def_port;
1156 const bt_port_output *src_hello_port;
1157 const bt_port_input *sink_def_port;
1158 const bt_port *gsrc_def_port;
1159 const bt_port *gsrc_hello_port;
1160 const bt_port *gsink_def_port;
fb9935cc 1161 struct event event;
a256a42d 1162 enum bt_graph_status status;
c14181ff
PP
1163 size_t src_accept_port_connection_pos;
1164 size_t sink_accept_port_connection_pos;
1165 size_t src_port_connected_pos;
1166 size_t sink_port_connected_pos;
fb9935cc
PP
1167 size_t graph_ports_connected_pos;
1168 size_t graph_port_added_src_pos;
1169
c14181ff
PP
1170 prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED,
1171 "source adds port in port connected");
fb9935cc 1172 graph = create_graph();
25583cd0 1173 BT_ASSERT(graph);
36712f1d
PP
1174 src = create_src(graph);
1175 sink = create_sink(graph);
0d72b8c3
PP
1176 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
1177 "out");
25583cd0 1178 BT_ASSERT(src_def_port);
0d72b8c3
PP
1179 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
1180 "in");
25583cd0 1181 BT_ASSERT(sink_def_port);
0d72b8c3 1182 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 1183 sink_def_port, NULL);
25583cd0 1184 BT_ASSERT(status == 0);
0d72b8c3
PP
1185 src_hello_port = bt_component_source_borrow_output_port_by_name_const(src,
1186 "hello");
25583cd0 1187 BT_ASSERT(src_hello_port);
0d72b8c3
PP
1188 gsrc = bt_component_source_as_component_const(src);
1189 gsink = bt_component_sink_as_component_const(sink);
1190 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
1191 gsrc_hello_port = bt_port_output_as_port_const(src_hello_port);
1192 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
fb9935cc 1193
36712f1d
PP
1194 /* We're supposed to have 8 events */
1195 ok(events->len == 8, "we have the expected number of events");
1196
1197 /* Source's port added */
d94d92ac
PP
1198 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1199 event.data.graph_src_output_port_added.comp = gsrc;
1200 event.data.graph_src_output_port_added.port = gsrc_def_port;
36712f1d
PP
1201 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1202
1203 /* Sink's port added */
d94d92ac
PP
1204 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
1205 event.data.graph_sink_input_port_added.comp = gsink;
1206 event.data.graph_sink_input_port_added.port = gsink_def_port;
36712f1d 1207 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
1208
1209 /* Source's accept port connection */
d94d92ac
PP
1210 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
1211 event.data.src_comp_accept_output_port_connection.comp = gsrc;
1212 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
1213 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
fb9935cc 1214 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff
PP
1215 src_accept_port_connection_pos = event_pos(&event);
1216
1217 /* Sink's accept port connection */
d94d92ac
PP
1218 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
1219 event.data.sink_comp_accept_input_port_connection.comp = gsink;
1220 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
1221 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
c14181ff
PP
1222 ok(has_event(&event), "got the expected sink's accept port connection event");
1223 sink_accept_port_connection_pos = event_pos(&event);
1224
1225 /* Source's port connected */
d94d92ac
PP
1226 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
1227 event.data.src_comp_output_port_connected.comp = gsrc;
1228 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
1229 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
c14181ff
PP
1230 ok(has_event(&event), "got the expected source's port connected event");
1231 src_port_connected_pos = event_pos(&event);
fb9935cc
PP
1232
1233 /* Graph's port added (source) */
d94d92ac
PP
1234 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1235 event.data.graph_src_output_port_added.comp = gsrc;
1236 event.data.graph_src_output_port_added.port = gsrc_hello_port;
fb9935cc
PP
1237 ok(has_event(&event), "got the expected graph's port added event (for source)");
1238 graph_port_added_src_pos = event_pos(&event);
1239
c14181ff 1240 /* Sink's port connected */
d94d92ac
PP
1241 event.type = SINK_COMP_INPUT_PORT_CONNECTED;
1242 event.data.sink_comp_input_port_connected.comp = gsink;
1243 event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
1244 event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
c14181ff
PP
1245 ok(has_event(&event), "got the expected sink's port connected event");
1246 sink_port_connected_pos = event_pos(&event);
fb9935cc
PP
1247
1248 /* Graph's ports connected */
d94d92ac
PP
1249 event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
1250 event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
1251 event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
1252 event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
1253 event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
1254 ok(has_event(&event), "got the expected graph's ports connected event");
fb9935cc
PP
1255 graph_ports_connected_pos = event_pos(&event);
1256
1257 /* Order of events */
c14181ff 1258 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1259 "event order is good (1)");
c14181ff 1260 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1261 "event order is good (2)");
c14181ff 1262 ok(src_accept_port_connection_pos < src_port_connected_pos,
fb9935cc 1263 "event order is good (3)");
c14181ff 1264 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
fb9935cc 1265 "event order is good (4)");
c14181ff
PP
1266 ok(src_port_connected_pos < graph_port_added_src_pos,
1267 "event order is good (5)");
1268 ok(graph_port_added_src_pos < graph_ports_connected_pos,
1269 "event order is good (6)");
fb9935cc 1270
c5b9b441
PP
1271 bt_component_source_put_ref(src);
1272 bt_component_sink_put_ref(sink);
1273 bt_graph_put_ref(graph);
fb9935cc
PP
1274}
1275
1276static
1277void test_simple(void)
1278{
b19ff26f
PP
1279 const bt_component_source *src;
1280 const bt_component_sink *sink;
1281 const bt_component *gsrc;
1282 const bt_component *gsink;
1283 bt_graph *graph;
1284 const bt_port_output *src_def_port;
1285 const bt_port_input *sink_def_port;
1286 const bt_port *gsrc_def_port;
1287 const bt_port *gsink_def_port;
fb9935cc 1288 struct event event;
a256a42d 1289 enum bt_graph_status status;
c14181ff
PP
1290 size_t src_accept_port_connection_pos;
1291 size_t sink_accept_port_connection_pos;
1292 size_t src_port_connected_pos;
1293 size_t sink_port_connected_pos;
fb9935cc
PP
1294 size_t graph_ports_connected_pos;
1295
1296 prepare_test(TEST_SIMPLE, "simple");
fb9935cc 1297 graph = create_graph();
25583cd0 1298 BT_ASSERT(graph);
36712f1d
PP
1299 src = create_src(graph);
1300 sink = create_sink(graph);
0d72b8c3
PP
1301 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
1302 "out");
25583cd0 1303 BT_ASSERT(src_def_port);
0d72b8c3
PP
1304 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
1305 "in");
25583cd0 1306 BT_ASSERT(sink_def_port);
0d72b8c3 1307 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 1308 sink_def_port, NULL);
25583cd0 1309 BT_ASSERT(status == 0);
0d72b8c3
PP
1310 gsrc = bt_component_source_as_component_const(src);
1311 gsink = bt_component_sink_as_component_const(sink);
1312 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
1313 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
fb9935cc 1314
36712f1d
PP
1315 /* We're supposed to have 7 events */
1316 ok(events->len == 7, "we have the expected number of events");
1317
1318 /* Source's port added */
d94d92ac
PP
1319 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1320 event.data.graph_src_output_port_added.comp = gsrc;
1321 event.data.graph_src_output_port_added.port = gsrc_def_port;
36712f1d
PP
1322 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1323
1324 /* Sink's port added */
d94d92ac
PP
1325 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
1326 event.data.graph_sink_input_port_added.comp = gsink;
1327 event.data.graph_sink_input_port_added.port = gsink_def_port;
36712f1d 1328 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
fb9935cc
PP
1329
1330 /* Source's accept port connection */
d94d92ac
PP
1331 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
1332 event.data.src_comp_accept_output_port_connection.comp = gsrc;
1333 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
1334 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
fb9935cc 1335 ok(has_event(&event), "got the expected source's accept port connection event");
c14181ff 1336 src_accept_port_connection_pos = event_pos(&event);
fb9935cc
PP
1337
1338 /* Sink's accept port connection */
d94d92ac
PP
1339 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
1340 event.data.sink_comp_accept_input_port_connection.comp = gsink;
1341 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
1342 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
fb9935cc 1343 ok(has_event(&event), "got the expected sink's accept port connection event");
c14181ff
PP
1344 sink_accept_port_connection_pos = event_pos(&event);
1345
1346 /* Source's port connected */
d94d92ac
PP
1347 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
1348 event.data.src_comp_output_port_connected.comp = gsrc;
1349 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
1350 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
c14181ff
PP
1351 ok(has_event(&event), "got the expected source's port connected event");
1352 src_port_connected_pos = event_pos(&event);
1353
1354 /* Sink's port connected */
d94d92ac
PP
1355 event.type = SINK_COMP_INPUT_PORT_CONNECTED;
1356 event.data.sink_comp_input_port_connected.comp = gsink;
1357 event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
1358 event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
c14181ff
PP
1359 ok(has_event(&event), "got the expected sink's port connected event");
1360 sink_port_connected_pos = event_pos(&event);
fb9935cc 1361
d94d92ac
PP
1362 /* Graph's ports connected */
1363 event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
1364 event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
1365 event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
1366 event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
1367 event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
fb9935cc
PP
1368 ok(has_event(&event), "got the expected graph's ports connected event");
1369 graph_ports_connected_pos = event_pos(&event);
1370
1371 /* Order of events */
c14181ff 1372 ok(src_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1373 "event order is good (1)");
c14181ff 1374 ok(sink_port_connected_pos < graph_ports_connected_pos,
fb9935cc 1375 "event order is good (2)");
c14181ff
PP
1376 ok(src_accept_port_connection_pos < src_port_connected_pos,
1377 "event order is good (3)");
1378 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
1379 "event order is good (4)");
fb9935cc 1380
c5b9b441
PP
1381 bt_component_sink_put_ref(sink);
1382 bt_graph_put_ref(graph);
1383 bt_component_source_put_ref(src);
fb9935cc
PP
1384}
1385
bf55043c
PP
1386static
1387void test_src_port_connected_error(void)
1388{
b19ff26f
PP
1389 const bt_component_source *src;
1390 const bt_component_sink *sink;
1391 const bt_component *gsrc;
1392 const bt_component *gsink;
1393 bt_graph *graph;
1394 const bt_port_output *src_def_port;
1395 const bt_port_input *sink_def_port;
1396 const bt_port *gsrc_def_port;
1397 const bt_port *gsink_def_port;
1398 const bt_connection *conn = NULL;
bf55043c
PP
1399 struct event event;
1400 enum bt_graph_status status;
1401 size_t src_accept_port_connection_pos;
1402 size_t src_port_connected_pos;
1403
1404 prepare_test(TEST_SRC_PORT_CONNECTED_ERROR, "port connected error: source");
1405 graph = create_graph();
1406 BT_ASSERT(graph);
1407 src = create_src(graph);
1408 sink = create_sink(graph);
0d72b8c3
PP
1409 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
1410 "out");
bf55043c 1411 BT_ASSERT(src_def_port);
0d72b8c3
PP
1412 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
1413 "in");
bf55043c 1414 BT_ASSERT(sink_def_port);
0d72b8c3 1415 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 1416 sink_def_port, &conn);
bf55043c 1417 ok(status != BT_GRAPH_STATUS_OK,
0d72b8c3 1418 "bt_graph_connect_ports() returns an error");
d94d92ac 1419 ok(!conn, "returned connection is still NULL");
0d72b8c3
PP
1420 gsrc = bt_component_source_as_component_const(src);
1421 gsink = bt_component_sink_as_component_const(sink);
1422 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
1423 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
bf55043c
PP
1424
1425 /* We're supposed to have 5 events */
1426 ok(events->len == 5, "we have the expected number of events");
1427
1428 /* Source's port added */
d94d92ac
PP
1429 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1430 event.data.graph_src_output_port_added.comp = gsrc;
1431 event.data.graph_src_output_port_added.port = gsrc_def_port;
bf55043c
PP
1432 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1433
1434 /* Sink's port added */
d94d92ac
PP
1435 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
1436 event.data.graph_sink_input_port_added.comp = gsink;
1437 event.data.graph_sink_input_port_added.port = gsink_def_port;
bf55043c
PP
1438 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
1439
1440 /* Source's accept port connection */
d94d92ac
PP
1441 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
1442 event.data.src_comp_accept_output_port_connection.comp = gsrc;
1443 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
1444 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
bf55043c
PP
1445 ok(has_event(&event), "got the expected source's accept port connection event");
1446 src_accept_port_connection_pos = event_pos(&event);
1447
1448 /* Sink's accept port connection */
d94d92ac
PP
1449 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
1450 event.data.sink_comp_accept_input_port_connection.comp = gsink;
1451 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
1452 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
bf55043c
PP
1453 ok(has_event(&event), "got the expected sink's accept port connection event");
1454
1455 /* Source's port connected */
d94d92ac
PP
1456 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
1457 event.data.src_comp_output_port_connected.comp = gsrc;
1458 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
1459 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
bf55043c
PP
1460 ok(has_event(&event), "got the expected source's port connected event");
1461 src_port_connected_pos = event_pos(&event);
1462
1463 /* Order of events */
1464 ok(src_accept_port_connection_pos < src_port_connected_pos,
1465 "event order is good (1)");
1466
c5b9b441
PP
1467 bt_graph_put_ref(graph);
1468 bt_component_sink_put_ref(sink);
1469 bt_component_source_put_ref(src);
1470 bt_connection_put_ref(conn);
bf55043c
PP
1471}
1472
1473static
1474void test_sink_port_connected_error(void)
1475{
b19ff26f
PP
1476 const bt_component_source *src;
1477 const bt_component_sink *sink;
1478 const bt_component *gsrc;
1479 const bt_component *gsink;
1480 bt_graph *graph;
1481 const bt_port_output *src_def_port;
1482 const bt_port_input *sink_def_port;
1483 const bt_port *gsrc_def_port;
1484 const bt_port *gsink_def_port;
1485 const bt_connection *conn = NULL;
bf55043c
PP
1486 struct event event;
1487 enum bt_graph_status status;
1488 size_t src_accept_port_connection_pos;
1489 size_t sink_accept_port_connection_pos;
1490 size_t src_port_connected_pos;
1491 size_t src_port_disconnected_pos;
1492 size_t sink_port_connected_pos;
1493
1494 prepare_test(TEST_SINK_PORT_CONNECTED_ERROR, "port connected error: sink");
1495 graph = create_graph();
1496 BT_ASSERT(graph);
1497 src = create_src(graph);
1498 sink = create_sink(graph);
0d72b8c3
PP
1499 src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
1500 "out");
bf55043c 1501 BT_ASSERT(src_def_port);
0d72b8c3
PP
1502 sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
1503 "in");
bf55043c 1504 BT_ASSERT(sink_def_port);
0d72b8c3 1505 status = bt_graph_connect_ports(graph, src_def_port,
d94d92ac 1506 sink_def_port, &conn);
bf55043c 1507 ok(status != BT_GRAPH_STATUS_OK,
0d72b8c3 1508 "bt_graph_connect_ports() returns an error");
d94d92ac 1509 ok(!conn, "returned connection is still NULL");
0d72b8c3
PP
1510 gsrc = bt_component_source_as_component_const(src);
1511 gsink = bt_component_sink_as_component_const(sink);
1512 gsrc_def_port = bt_port_output_as_port_const(src_def_port);
1513 gsink_def_port = bt_port_input_as_port_const(sink_def_port);
bf55043c
PP
1514
1515 /* We're supposed to have 5 events */
1516 ok(events->len == 7, "we have the expected number of events");
1517
1518 /* Source's port added */
d94d92ac
PP
1519 event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
1520 event.data.graph_src_output_port_added.comp = gsrc;
1521 event.data.graph_src_output_port_added.port = gsrc_def_port;
bf55043c
PP
1522 ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
1523
1524 /* Sink's port added */
d94d92ac
PP
1525 event.type = GRAPH_SINK_INPUT_PORT_ADDED;
1526 event.data.graph_sink_input_port_added.comp = gsink;
1527 event.data.graph_sink_input_port_added.port = gsink_def_port;
bf55043c
PP
1528 ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
1529
1530 /* Source's accept port connection */
d94d92ac
PP
1531 event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
1532 event.data.src_comp_accept_output_port_connection.comp = gsrc;
1533 event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
1534 event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
bf55043c
PP
1535 ok(has_event(&event), "got the expected source's accept port connection event");
1536 src_accept_port_connection_pos = event_pos(&event);
1537
1538 /* Sink's accept port connection */
d94d92ac
PP
1539 event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
1540 event.data.sink_comp_accept_input_port_connection.comp = gsink;
1541 event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
1542 event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
bf55043c
PP
1543 ok(has_event(&event), "got the expected sink's accept port connection event");
1544 sink_accept_port_connection_pos = event_pos(&event);
1545
1546 /* Source's port connected */
d94d92ac
PP
1547 event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
1548 event.data.src_comp_output_port_connected.comp = gsrc;
1549 event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
1550 event.data.src_comp_output_port_connected.other_port = gsink_def_port;
bf55043c
PP
1551 ok(has_event(&event), "got the expected source's port connected event");
1552 src_port_connected_pos = event_pos(&event);
1553
1554 /* Sink's port connected */
d94d92ac
PP
1555 event.type = SINK_COMP_INPUT_PORT_CONNECTED;
1556 event.data.sink_comp_input_port_connected.comp = gsink;
1557 event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
1558 event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
bf55043c
PP
1559 ok(has_event(&event), "got the expected sink's port connected event");
1560 sink_port_connected_pos = event_pos(&event);
1561
1562 /* Source's port disconnected */
d94d92ac
PP
1563 event.type = SRC_COMP_OUTPUT_PORT_DISCONNECTED;
1564 event.data.src_comp_output_port_disconnected.comp = gsrc;
1565 event.data.src_comp_output_port_disconnected.self_port = gsrc_def_port;
bf55043c
PP
1566 ok(has_event(&event), "got the expected source's port disconnected event");
1567 src_port_disconnected_pos = event_pos(&event);
1568
1569 /* Order of events */
1570 ok(src_accept_port_connection_pos < src_port_connected_pos,
1571 "event order is good (1)");
1572 ok(sink_accept_port_connection_pos < sink_port_connected_pos,
1573 "event order is good (2)");
1574 ok(sink_port_connected_pos < src_port_disconnected_pos,
1575 "event order is good (3)");
1576
c5b9b441
PP
1577 bt_connection_put_ref(conn);
1578 bt_graph_put_ref(graph);
1579 bt_component_sink_put_ref(sink);
1580 bt_component_source_put_ref(src);
bf55043c
PP
1581}
1582
fb9935cc
PP
1583static
1584void test_empty_graph(void)
1585{
b19ff26f 1586 bt_graph *graph;
fb9935cc
PP
1587
1588 prepare_test(TEST_EMPTY_GRAPH, "empty graph");
1589 graph = create_graph();
1590 ok(events->len == 0, "empty graph generates no events");
c5b9b441 1591 bt_graph_put_ref(graph);
fb9935cc
PP
1592}
1593
1594int main(int argc, char **argv)
1595{
1596 plan_tests(NR_TESTS);
1597 init_test();
1598 test_empty_graph();
1599 test_simple();
bf55043c
PP
1600 test_src_port_connected_error();
1601 test_sink_port_connected_error();
c14181ff 1602 test_src_adds_port_in_port_connected();
d94d92ac
PP
1603 test_sink_removes_port_in_consume();
1604 test_sink_removes_port_in_consume_then_src_removes_disconnected_port();
fb9935cc
PP
1605 fini_test();
1606 return exit_status();
1607}
This page took 0.111241 seconds and 4 git commands to generate.