lib: add internal object pool API and use it; adapt plugins/tests
[babeltrace.git] / tests / plugins / test-utils-muxer.c
CommitLineData
8deeabc6
PP
1/*
2 * Copyright 2017 - Philippe Proulx <pproulx@efficios.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; under version 2 of the License.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
18#include <stdio.h>
19#include <stdlib.h>
20#include <stdint.h>
c55a9f58 21#include <stdbool.h>
8deeabc6
PP
22#include <inttypes.h>
23#include <string.h>
24#include <assert.h>
9d408fca 25#include <babeltrace/babeltrace.h>
8deeabc6
PP
26#include <glib.h>
27
28#include "tap/tap.h"
29
3230ee6b 30#define NR_TESTS 12
8deeabc6
PP
31
32enum test {
33 TEST_NO_TS,
34 TEST_NO_UPSTREAM_CONNECTION,
8deeabc6
PP
35 TEST_SIMPLE_4_PORTS,
36 TEST_4_PORTS_WITH_RETRIES,
37 TEST_SINGLE_END_THEN_MULTIPLE_FULL,
38 TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL,
39};
40
41enum test_event_type {
42 TEST_EV_TYPE_NOTIF_UNEXPECTED,
43 TEST_EV_TYPE_NOTIF_EVENT,
44 TEST_EV_TYPE_NOTIF_INACTIVITY,
45 TEST_EV_TYPE_NOTIF_PACKET_BEGIN,
46 TEST_EV_TYPE_NOTIF_PACKET_END,
3230ee6b
PP
47 TEST_EV_TYPE_NOTIF_STREAM_BEGIN,
48 TEST_EV_TYPE_NOTIF_STREAM_END,
8deeabc6
PP
49 TEST_EV_TYPE_AGAIN,
50 TEST_EV_TYPE_END,
51 TEST_EV_TYPE_SENTINEL,
52};
53
54struct test_event {
55 enum test_event_type type;
56 int64_t ts_ns;
57};
58
59struct source_muxer_sink {
60 struct bt_component *source;
61 struct bt_component *muxer;
62 struct bt_component *sink;
63};
64
65struct graph_listener_data {
66 struct bt_graph *graph;
67 struct bt_component *source;
68 struct bt_component *muxer;
69 struct bt_component *sink;
70};
71
72static bool debug = false;
73static enum test current_test;
74static GArray *test_events;
75static struct bt_clock_class_priority_map *src_cc_prio_map;
76static struct bt_clock_class_priority_map *src_empty_cc_prio_map;
50842bdc
PP
77static struct bt_clock_class *src_clock_class;
78static struct bt_stream_class *src_stream_class;
79static struct bt_event_class *src_event_class;
80static struct bt_packet *src_packet0;
81static struct bt_packet *src_packet1;
82static struct bt_packet *src_packet2;
83static struct bt_packet *src_packet3;
8deeabc6
PP
84
85enum {
86 SEQ_END = -1,
87 SEQ_AGAIN = -2,
88 SEQ_PACKET_BEGIN = -3,
89 SEQ_PACKET_END = -4,
f42867e2
PP
90 SEQ_STREAM_BEGIN = -5,
91 SEQ_STREAM_END = -6,
8deeabc6
PP
92};
93
94struct src_iter_user_data {
95 size_t iter_index;
96 int64_t *seq;
97 size_t at;
50842bdc 98 struct bt_packet *packet;
8deeabc6
PP
99};
100
101struct sink_user_data {
102 struct bt_notification_iterator *notif_iter;
103};
104
105static int64_t seq1[] = {
f42867e2
PP
106 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 24, 53, 97, 105, 119, 210,
107 222, 240, 292, 317, 353, 407, 433, 473, 487, 504, 572, 615, 708,
108 766, 850, 852, 931, 951, 956, 996, SEQ_PACKET_END,
109 SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
110};
111
112static int64_t seq2[] = {
f42867e2
PP
113 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 51, 59, 68, 77, 91, 121,
114 139, 170, 179, 266, 352, 454, 478, 631, 644, 668, 714, 744, 750,
115 778, 790, 836, SEQ_PACKET_END, SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
116};
117
118static int64_t seq3[] = {
f42867e2
PP
119 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 8, 71, 209, 254, 298, 320,
120 350, 393, 419, 624, 651, 678, 717, 731, 733, 788, 819, 820, 857,
121 892, 903, 944, 998, SEQ_PACKET_END, SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
122};
123
124static int64_t seq4[] = {
f42867e2
PP
125 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 41, 56, 120, 138, 154, 228,
126 471, 479, 481, 525, 591, 605, 612, 618, 632, 670, 696, 825, 863,
127 867, 871, 884, 953, 985, 999, SEQ_PACKET_END, SEQ_STREAM_END,
8deeabc6
PP
128 SEQ_END,
129};
130
131static int64_t seq1_with_again[] = {
f42867e2
PP
132 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 24, 53, 97, 105, 119, 210,
133 SEQ_AGAIN, 222, 240, 292, 317, 353, 407, 433, 473, 487, 504,
134 572, 615, 708, 766, 850, 852, 931, 951, 956, 996,
135 SEQ_PACKET_END, SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
136};
137
138static int64_t seq2_with_again[] = {
f42867e2
PP
139 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 51, 59, 68, 77, 91, 121,
140 139, 170, 179, 266, 352, 454, 478, 631, 644, 668, 714, 744, 750,
141 778, 790, 836, SEQ_AGAIN, SEQ_PACKET_END, SEQ_STREAM_END,
142 SEQ_END,
8deeabc6
PP
143};
144
145static int64_t seq3_with_again[] = {
f42867e2
PP
146 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 8, 71, 209, 254, 298, 320,
147 350, 393, 419, 624, 651, SEQ_AGAIN, 678, 717, 731, 733, 788,
148 819, 820, 857, 892, 903, 944, 998, SEQ_PACKET_END,
149 SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
150};
151
152static int64_t seq4_with_again[] = {
f42867e2
PP
153 SEQ_AGAIN, SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 41, 56, 120, 138,
154 154, 228, 471, 479, 481, 525, 591, 605, 612, 618, 632, 670, 696,
155 825, 863, 867, 871, 884, 953, 985, 999, SEQ_PACKET_END,
156 SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
157};
158
159static int64_t seq5[] = {
f42867e2
PP
160 SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 1, 4, 189, 1001,
161 SEQ_PACKET_END, SEQ_STREAM_END, SEQ_END,
8deeabc6
PP
162};
163
8deeabc6
PP
164static
165void clear_test_events(void)
166{
167 g_array_set_size(test_events, 0);
168}
169
170static
171void print_test_event(FILE *fp, const struct test_event *event)
172{
173 fprintf(fp, "{ type = ");
174
175 switch (event->type) {
176 case TEST_EV_TYPE_NOTIF_UNEXPECTED:
177 fprintf(fp, "TEST_EV_TYPE_NOTIF_UNEXPECTED");
178 break;
179 case TEST_EV_TYPE_NOTIF_EVENT:
180 fprintf(fp, "TEST_EV_TYPE_NOTIF_EVENT");
181 break;
182 case TEST_EV_TYPE_NOTIF_INACTIVITY:
183 fprintf(fp, "TEST_EV_TYPE_NOTIF_INACTIVITY");
184 break;
185 case TEST_EV_TYPE_NOTIF_PACKET_BEGIN:
186 fprintf(fp, "TEST_EV_TYPE_NOTIF_PACKET_BEGIN");
187 break;
188 case TEST_EV_TYPE_NOTIF_PACKET_END:
189 fprintf(fp, "TEST_EV_TYPE_NOTIF_PACKET_END");
190 break;
3230ee6b
PP
191 case TEST_EV_TYPE_NOTIF_STREAM_BEGIN:
192 fprintf(fp, "TEST_EV_TYPE_NOTIF_STREAM_BEGIN");
193 break;
194 case TEST_EV_TYPE_NOTIF_STREAM_END:
195 fprintf(fp, "TEST_EV_TYPE_NOTIF_STREAM_END");
196 break;
8deeabc6
PP
197 case TEST_EV_TYPE_AGAIN:
198 fprintf(fp, "TEST_EV_TYPE_AGAIN");
199 break;
200 case TEST_EV_TYPE_END:
201 fprintf(fp, "TEST_EV_TYPE_END");
202 break;
203 case TEST_EV_TYPE_SENTINEL:
204 fprintf(fp, "TEST_EV_TYPE_SENTINEL");
205 break;
206 default:
207 fprintf(fp, "(UNKNOWN)");
208 break;
209 }
210
211 switch (event->type) {
212 case TEST_EV_TYPE_NOTIF_EVENT:
213 case TEST_EV_TYPE_NOTIF_INACTIVITY:
214 fprintf(fp, ", ts-ns = %" PRId64, event->ts_ns);
215 default:
216 break;
217 }
218
219 fprintf(fp, " }");
220}
221
222static
223void append_test_event(struct test_event *event)
224{
225 g_array_append_val(test_events, *event);
226}
227
228static
229bool compare_single_test_events(const struct test_event *ev_a,
230 const struct test_event *ev_b)
231{
232 if (debug) {
233 fprintf(stderr, ":: Comparing test events: ");
234 print_test_event(stderr, ev_a);
235 fprintf(stderr, " vs. ");
236 print_test_event(stderr, ev_b);
237 fprintf(stderr, "\n");
238 }
239
240 if (ev_a->type != ev_b->type) {
241 return false;
242 }
243
244 switch (ev_a->type) {
245 case TEST_EV_TYPE_NOTIF_EVENT:
246 case TEST_EV_TYPE_NOTIF_INACTIVITY:
247 if (ev_a->ts_ns != ev_b->ts_ns) {
248 return false;
249 }
250 break;
251 default:
252 break;
253 }
254
255 return true;
256}
257
258static
259bool compare_test_events(const struct test_event *expected_events)
260{
261 const struct test_event *expected_event = expected_events;
262 size_t i = 0;
263
264 assert(expected_events);
265
266 while (true) {
267 const struct test_event *event;
268
269 if (expected_event->type == TEST_EV_TYPE_SENTINEL) {
270 break;
271 }
272
273 if (i >= test_events->len) {
274 return false;
275 }
276
277 event = &g_array_index(test_events, struct test_event, i);
278
279 if (!compare_single_test_events(event, expected_event)) {
280 return false;
281 }
282
283 i++;
284 expected_event++;
285 }
286
287 if (i != test_events->len) {
089717de
PP
288 if (debug) {
289 fprintf(stderr, ":: Length mismatch\n");
290 }
291
8deeabc6
PP
292 return false;
293 }
294
295 return true;
296}
297
298static
299void init_static_data(void)
300{
301 int ret;
50842bdc
PP
302 struct bt_trace *trace;
303 struct bt_stream *stream;
304 struct bt_field_type *empty_struct_ft;
312c056a
PP
305 struct bt_field_type *eh_ft;
306 struct bt_field_type *eh_ts_ft;
8deeabc6
PP
307
308 /* Test events */
309 test_events = g_array_new(FALSE, TRUE, sizeof(struct test_event));
310 assert(test_events);
311
312 /* Metadata */
50842bdc 313 empty_struct_ft = bt_field_type_structure_create();
8deeabc6 314 assert(empty_struct_ft);
312c056a
PP
315 src_clock_class = bt_clock_class_create("my-clock", 1000000000);
316 assert(src_clock_class);
50842bdc 317 trace = bt_trace_create();
8deeabc6 318 assert(trace);
50842bdc
PP
319 ret = bt_trace_set_native_byte_order(trace,
320 BT_BYTE_ORDER_LITTLE_ENDIAN);
8deeabc6 321 assert(ret == 0);
3dca2276 322 ret = bt_trace_set_packet_header_field_type(trace, empty_struct_ft);
8deeabc6 323 assert(ret == 0);
50842bdc 324 ret = bt_clock_class_set_is_absolute(src_clock_class, 1);
8deeabc6 325 assert(ret == 0);
50842bdc 326 ret = bt_trace_add_clock_class(trace, src_clock_class);
8deeabc6
PP
327 assert(ret == 0);
328 src_empty_cc_prio_map = bt_clock_class_priority_map_create();
329 assert(src_empty_cc_prio_map);
330 src_cc_prio_map = bt_clock_class_priority_map_create();
331 assert(src_cc_prio_map);
332 ret = bt_clock_class_priority_map_add_clock_class(src_cc_prio_map,
333 src_clock_class, 0);
334 assert(ret == 0);
50842bdc 335 src_stream_class = bt_stream_class_create("my-stream-class");
8deeabc6 336 assert(src_stream_class);
3dca2276 337 ret = bt_stream_class_set_packet_context_field_type(src_stream_class,
8deeabc6
PP
338 empty_struct_ft);
339 assert(ret == 0);
312c056a
PP
340 eh_ft = bt_field_type_structure_create();
341 assert(eh_ft);
342 eh_ts_ft = bt_field_type_integer_create(64);
343 assert(eh_ts_ft);
344 ret = bt_field_type_structure_add_field(eh_ft, eh_ts_ft, "ts");
345 assert(ret == 0);
346 ret = bt_field_type_integer_set_mapped_clock_class(eh_ts_ft,
347 src_clock_class);
348 assert(ret == 0);
3dca2276 349 ret = bt_stream_class_set_event_header_field_type(src_stream_class,
312c056a 350 eh_ft);
8deeabc6 351 assert(ret == 0);
3dca2276 352 ret = bt_stream_class_set_event_context_field_type(src_stream_class,
8deeabc6
PP
353 empty_struct_ft);
354 assert(ret == 0);
50842bdc 355 src_event_class = bt_event_class_create("my-event-class");
3dca2276 356 ret = bt_event_class_set_context_field_type(src_event_class,
8deeabc6
PP
357 empty_struct_ft);
358 assert(ret == 0);
3dca2276 359 ret = bt_event_class_set_context_field_type(src_event_class,
8deeabc6
PP
360 empty_struct_ft);
361 assert(ret == 0);
50842bdc 362 ret = bt_stream_class_add_event_class(src_stream_class,
8deeabc6
PP
363 src_event_class);
364 assert(ret == 0);
50842bdc 365 ret = bt_trace_add_stream_class(trace, src_stream_class);
8deeabc6 366 assert(ret == 0);
3dca2276 367 stream = bt_stream_create(src_stream_class, "stream0", 0);
3230ee6b 368 assert(stream);
50842bdc 369 src_packet0 = bt_packet_create(stream);
3230ee6b
PP
370 assert(src_packet0);
371 bt_put(stream);
3dca2276 372 stream = bt_stream_create(src_stream_class, "stream1", 1);
8deeabc6 373 assert(stream);
50842bdc 374 src_packet1 = bt_packet_create(stream);
3230ee6b
PP
375 assert(src_packet0);
376 bt_put(stream);
3dca2276 377 stream = bt_stream_create(src_stream_class, "stream2", 2);
3230ee6b 378 assert(stream);
50842bdc 379 src_packet2 = bt_packet_create(stream);
3230ee6b
PP
380 assert(src_packet0);
381 bt_put(stream);
3dca2276 382 stream = bt_stream_create(src_stream_class, "stream3", 3);
3230ee6b 383 assert(stream);
50842bdc 384 src_packet3 = bt_packet_create(stream);
3230ee6b
PP
385 assert(src_packet0);
386 bt_put(stream);
8deeabc6
PP
387
388 bt_put(trace);
8deeabc6 389 bt_put(empty_struct_ft);
312c056a
PP
390 bt_put(eh_ft);
391 bt_put(eh_ts_ft);
8deeabc6
PP
392}
393
394static
395void fini_static_data(void)
396{
397 /* Test events */
398 g_array_free(test_events, TRUE);
399
400 /* Metadata */
401 bt_put(src_empty_cc_prio_map);
402 bt_put(src_cc_prio_map);
403 bt_put(src_clock_class);
404 bt_put(src_stream_class);
405 bt_put(src_event_class);
3230ee6b
PP
406 bt_put(src_packet0);
407 bt_put(src_packet1);
408 bt_put(src_packet2);
409 bt_put(src_packet3);
8deeabc6
PP
410}
411
412static
413void src_iter_finalize(
90157d89 414 struct bt_private_connection_private_notification_iterator *private_notification_iterator)
8deeabc6
PP
415{
416 struct src_iter_user_data *user_data =
90157d89 417 bt_private_connection_private_notification_iterator_get_user_data(
8deeabc6
PP
418 private_notification_iterator);
419
420 if (user_data) {
421 g_free(user_data);
422 }
423}
424
425static
426enum bt_notification_iterator_status src_iter_init(
90157d89 427 struct bt_private_connection_private_notification_iterator *priv_notif_iter,
8deeabc6
PP
428 struct bt_private_port *private_port)
429{
430 struct src_iter_user_data *user_data =
431 g_new0(struct src_iter_user_data, 1);
6d137876 432 struct bt_port *port = bt_port_from_private(private_port);
8deeabc6
PP
433 const char *port_name;
434 int ret;
435
436 assert(user_data);
437 assert(port);
90157d89 438 ret = bt_private_connection_private_notification_iterator_set_user_data(priv_notif_iter,
8deeabc6
PP
439 user_data);
440 assert(ret == 0);
441 port_name = bt_port_get_name(port);
442 assert(port_name);
443 user_data->iter_index = port_name[3] - '0';
444 bt_put(port);
445
3230ee6b
PP
446 switch (user_data->iter_index) {
447 case 0:
448 user_data->packet = src_packet0;
449 break;
450 case 1:
451 user_data->packet = src_packet1;
452 break;
453 case 2:
454 user_data->packet = src_packet2;
455 break;
456 case 3:
457 user_data->packet = src_packet3;
458 break;
459 default:
0fbb9a9f 460 abort();
3230ee6b
PP
461 }
462
8deeabc6
PP
463 switch (current_test) {
464 case TEST_NO_TS:
465 if (user_data->iter_index == 1) {
466 user_data->seq = seq5;
467 }
468 break;
8deeabc6
PP
469 case TEST_SIMPLE_4_PORTS:
470 if (user_data->iter_index == 0) {
471 user_data->seq = seq1;
472 } else if (user_data->iter_index == 1) {
473 user_data->seq = seq2;
474 } else if (user_data->iter_index == 2) {
475 user_data->seq = seq3;
476 } else {
477 user_data->seq = seq4;
478 }
479 break;
480 case TEST_4_PORTS_WITH_RETRIES:
481 if (user_data->iter_index == 0) {
482 user_data->seq = seq1_with_again;
483 } else if (user_data->iter_index == 1) {
484 user_data->seq = seq2_with_again;
485 } else if (user_data->iter_index == 2) {
486 user_data->seq = seq3_with_again;
487 } else {
488 user_data->seq = seq4_with_again;
489 }
490 break;
491 case TEST_SINGLE_END_THEN_MULTIPLE_FULL:
492 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL:
493 if (user_data->iter_index == 0) {
494 /* Ignore: this iterator only returns END */
495 } else if (user_data->iter_index == 1) {
496 user_data->seq = seq2;
497 } else {
498 user_data->seq = seq3;
499 }
500 break;
501 default:
0fbb9a9f 502 abort();
8deeabc6
PP
503 }
504
505 return BT_NOTIFICATION_ITERATOR_STATUS_OK;
506}
507
508static
312c056a
PP
509struct bt_notification *src_create_event_notif(struct bt_packet *packet,
510 struct bt_clock_class_priority_map *cc_prio_map, int64_t ts_ns)
8deeabc6 511{
8deeabc6 512 int ret;
312c056a
PP
513 struct bt_event *event;
514 struct bt_notification *notif;
515 struct bt_clock_value *clock_value;
516 struct bt_field *field;
517
518 notif = bt_notification_event_create(src_event_class,
519 packet, cc_prio_map);
520 assert(notif);
521 event = bt_notification_event_borrow_event(notif);
8deeabc6 522 assert(event);
312c056a
PP
523 field = bt_event_borrow_header(event);
524 assert(field);
525 field = bt_field_structure_borrow_field_by_name(field, "ts");
526 assert(field);
527 ret = bt_field_integer_unsigned_set_value(field, (uint64_t) ts_ns);
8deeabc6 528 assert(ret == 0);
312c056a
PP
529 clock_value = bt_event_borrow_clock_value(event, src_clock_class);
530 assert(clock_value);
531 ret = bt_clock_value_set_value(clock_value, (uint64_t) ts_ns);
532 assert(ret == 0);
533 return notif;
8deeabc6
PP
534}
535
536static
90157d89 537struct bt_notification_iterator_next_method_return src_iter_next_seq(
8deeabc6
PP
538 struct src_iter_user_data *user_data)
539{
90157d89 540 struct bt_notification_iterator_next_method_return next_return = {
8deeabc6
PP
541 .status = BT_NOTIFICATION_ITERATOR_STATUS_OK,
542 };
543 int64_t cur_ts_ns;
f42867e2 544 struct bt_stream *stream;
8deeabc6
PP
545
546 assert(user_data->seq);
547 cur_ts_ns = user_data->seq[user_data->at];
548
549 switch (cur_ts_ns) {
550 case SEQ_END:
551 next_return.status =
552 BT_NOTIFICATION_ITERATOR_STATUS_END;
553 break;
554 case SEQ_AGAIN:
555 next_return.status =
556 BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
557 break;
558 case SEQ_PACKET_BEGIN:
559 next_return.notification =
3230ee6b 560 bt_notification_packet_begin_create(user_data->packet);
8deeabc6
PP
561 assert(next_return.notification);
562 break;
563 case SEQ_PACKET_END:
564 next_return.notification =
3230ee6b 565 bt_notification_packet_end_create(user_data->packet);
8deeabc6
PP
566 assert(next_return.notification);
567 break;
f42867e2
PP
568 case SEQ_STREAM_BEGIN:
569 stream = bt_packet_get_stream(user_data->packet);
570 next_return.notification =
571 bt_notification_stream_begin_create(stream);
572 assert(next_return.notification);
573 bt_put(stream);
574 break;
575 case SEQ_STREAM_END:
576 stream = bt_packet_get_stream(user_data->packet);
577 next_return.notification =
578 bt_notification_stream_end_create(stream);
579 assert(next_return.notification);
580 bt_put(stream);
581 break;
8deeabc6
PP
582 default:
583 {
312c056a
PP
584 next_return.notification = src_create_event_notif(
585 user_data->packet, src_cc_prio_map, cur_ts_ns);
8deeabc6
PP
586 assert(next_return.notification);
587 break;
588 }
589 }
590
591 if (next_return.status != BT_NOTIFICATION_ITERATOR_STATUS_END) {
592 user_data->at++;
593 }
594
595 return next_return;
596}
597
598static
90157d89
PP
599struct bt_notification_iterator_next_method_return src_iter_next(
600 struct bt_private_connection_private_notification_iterator *priv_iterator)
8deeabc6 601{
90157d89 602 struct bt_notification_iterator_next_method_return next_return = {
624fa311
PP
603 .notification = NULL,
604 .status = BT_NOTIFICATION_ITERATOR_STATUS_OK,
605 };
8deeabc6 606 struct src_iter_user_data *user_data =
90157d89 607 bt_private_connection_private_notification_iterator_get_user_data(priv_iterator);
8deeabc6 608 struct bt_private_component *private_component =
90157d89 609 bt_private_connection_private_notification_iterator_get_private_component(priv_iterator);
f42867e2 610 struct bt_stream *stream;
147337a3 611 int ret;
8deeabc6
PP
612
613 assert(user_data);
614 assert(private_component);
615
616 switch (current_test) {
617 case TEST_NO_TS:
618 if (user_data->iter_index == 0) {
619 if (user_data->at == 0) {
f42867e2
PP
620 stream = bt_packet_get_stream(user_data->packet);
621 next_return.notification =
622 bt_notification_stream_begin_create(
623 stream);
624 bt_put(stream);
625 assert(next_return.notification);
626 } else if (user_data->at == 1) {
8deeabc6 627 next_return.notification =
3230ee6b
PP
628 bt_notification_packet_begin_create(
629 user_data->packet);
8deeabc6 630 assert(next_return.notification);
f42867e2 631 } else if (user_data->at < 7) {
8deeabc6 632 next_return.notification =
312c056a
PP
633 src_create_event_notif(
634 user_data->packet,
635 src_empty_cc_prio_map, 0);
8deeabc6 636 assert(next_return.notification);
f42867e2
PP
637 } else if (user_data->at == 7) {
638 next_return.notification =
639 bt_notification_packet_end_create(
640 user_data->packet);
641 assert(next_return.notification);
642 } else if (user_data->at == 8) {
643 stream = bt_packet_get_stream(user_data->packet);
644 next_return.notification =
645 bt_notification_stream_end_create(
646 stream);
647 bt_put(stream);
648 assert(next_return.notification);
8deeabc6
PP
649 } else {
650 next_return.status =
651 BT_NOTIFICATION_ITERATOR_STATUS_END;
652 }
653
654 user_data->at++;
655 } else {
656 next_return = src_iter_next_seq(user_data);
657 }
658 break;
8deeabc6
PP
659 case TEST_SIMPLE_4_PORTS:
660 case TEST_4_PORTS_WITH_RETRIES:
661 next_return = src_iter_next_seq(user_data);
662 break;
663 case TEST_SINGLE_END_THEN_MULTIPLE_FULL:
664 if (user_data->iter_index == 0) {
147337a3
PP
665 ret = bt_private_component_source_add_output_private_port(
666 private_component, "out1", NULL, NULL);
667 assert(ret == 0);
668 ret = bt_private_component_source_add_output_private_port(
669 private_component, "out2", NULL, NULL);
670 assert(ret == 0);
8deeabc6
PP
671 next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
672 } else {
673 next_return = src_iter_next_seq(user_data);
674 }
675 break;
676 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL:
677 if (user_data->iter_index == 0) {
678 if (user_data->at == 0) {
679 next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
680 user_data->at++;
681 } else {
147337a3
PP
682 ret = bt_private_component_source_add_output_private_port(
683 private_component, "out1", NULL, NULL);
684 assert(ret == 0);
685 ret = bt_private_component_source_add_output_private_port(
686 private_component, "out2", NULL, NULL);
687 assert(ret == 0);
8deeabc6
PP
688 next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
689 }
690 } else {
691 next_return = src_iter_next_seq(user_data);
692 }
693 break;
694 default:
0fbb9a9f 695 abort();
8deeabc6
PP
696 }
697
698 bt_put(private_component);
699 return next_return;
700}
701
702static
703enum bt_component_status src_init(
704 struct bt_private_component *private_component,
705 struct bt_value *params, void *init_method_data)
706{
147337a3 707 int ret;
8deeabc6
PP
708 size_t nb_ports;
709
8deeabc6
PP
710 switch (current_test) {
711 case TEST_NO_TS:
8deeabc6
PP
712 nb_ports = 2;
713 break;
714 case TEST_SINGLE_END_THEN_MULTIPLE_FULL:
715 case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL:
716 nb_ports = 1;
717 break;
718 default:
719 nb_ports = 4;
720 break;
721 }
722
723 if (nb_ports >= 1) {
147337a3
PP
724 ret = bt_private_component_source_add_output_private_port(
725 private_component, "out0", NULL, NULL);
726 assert(ret == 0);
8deeabc6
PP
727 }
728
729 if (nb_ports >= 2) {
147337a3
PP
730 ret = bt_private_component_source_add_output_private_port(
731 private_component, "out1", NULL, NULL);
732 assert(ret == 0);
8deeabc6
PP
733 }
734
735 if (nb_ports >= 3) {
147337a3
PP
736 ret = bt_private_component_source_add_output_private_port(
737 private_component, "out2", NULL, NULL);
738 assert(ret == 0);
8deeabc6
PP
739 }
740
741 if (nb_ports >= 4) {
147337a3
PP
742 ret = bt_private_component_source_add_output_private_port(
743 private_component, "out3", NULL, NULL);
744 assert(ret == 0);
8deeabc6
PP
745 }
746
747 return BT_COMPONENT_STATUS_OK;
748}
749
750static
751void src_finalize(struct bt_private_component *private_component)
752{
753}
754
755static
756enum bt_component_status sink_consume(
757 struct bt_private_component *priv_component)
758{
759 enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
760 struct bt_notification *notification = NULL;
761 struct sink_user_data *user_data =
762 bt_private_component_get_user_data(priv_component);
763 enum bt_notification_iterator_status it_ret;
764 struct test_event test_event;
765 bool do_append_test_event = true;
766
767 assert(user_data && user_data->notif_iter);
768 it_ret = bt_notification_iterator_next(user_data->notif_iter);
769
770 if (it_ret < 0) {
771 ret = BT_COMPONENT_STATUS_ERROR;
772 do_append_test_event = false;
773 goto end;
774 }
775
776 switch (it_ret) {
777 case BT_NOTIFICATION_ITERATOR_STATUS_END:
778 test_event.type = TEST_EV_TYPE_END;
779 ret = BT_COMPONENT_STATUS_END;
780 BT_PUT(user_data->notif_iter);
781 goto end;
782 case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
783 test_event.type = TEST_EV_TYPE_AGAIN;
784 ret = BT_COMPONENT_STATUS_AGAIN;
785 goto end;
786 default:
787 break;
788 }
789
790 notification = bt_notification_iterator_get_notification(
791 user_data->notif_iter);
792 assert(notification);
793
794 switch (bt_notification_get_type(notification)) {
795 case BT_NOTIFICATION_TYPE_EVENT:
796 {
50842bdc 797 struct bt_event *event;
8deeabc6
PP
798 struct bt_clock_class_priority_map *cc_prio_map;
799
800 test_event.type = TEST_EV_TYPE_NOTIF_EVENT;
801 cc_prio_map =
312c056a 802 bt_notification_event_borrow_clock_class_priority_map(
8deeabc6
PP
803 notification);
804 assert(cc_prio_map);
312c056a 805 event = bt_notification_event_borrow_event(notification);
8deeabc6
PP
806 assert(event);
807
808 if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map) > 0) {
50842bdc
PP
809 struct bt_clock_value *clock_value;
810 struct bt_clock_class *clock_class =
312c056a 811 bt_clock_class_priority_map_borrow_highest_priority_clock_class(
8deeabc6
PP
812 cc_prio_map);
813
814 assert(clock_class);
312c056a 815 clock_value = bt_event_borrow_clock_value(event,
8deeabc6
PP
816 clock_class);
817 assert(clock_value);
50842bdc 818 ret = bt_clock_value_get_value_ns_from_epoch(
8deeabc6
PP
819 clock_value, &test_event.ts_ns);
820 assert(ret == 0);
8deeabc6
PP
821 } else {
822 test_event.ts_ns = -1;
823 }
824
8deeabc6
PP
825 break;
826 }
827 case BT_NOTIFICATION_TYPE_INACTIVITY:
828 {
829 struct bt_clock_class_priority_map *cc_prio_map;
830
831 test_event.type = TEST_EV_TYPE_NOTIF_INACTIVITY;
312c056a 832 cc_prio_map = bt_notification_inactivity_borrow_clock_class_priority_map(
8deeabc6
PP
833 notification);
834 assert(cc_prio_map);
835
836 if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map) > 0) {
50842bdc
PP
837 struct bt_clock_value *clock_value;
838 struct bt_clock_class *clock_class =
312c056a 839 bt_clock_class_priority_map_borrow_highest_priority_clock_class(
8deeabc6
PP
840 cc_prio_map);
841
842 assert(clock_class);
843 clock_value =
312c056a 844 bt_notification_inactivity_borrow_clock_value(
8deeabc6
PP
845 notification, clock_class);
846 assert(clock_value);
50842bdc 847 ret = bt_clock_value_get_value_ns_from_epoch(
8deeabc6
PP
848 clock_value, &test_event.ts_ns);
849 assert(ret == 0);
8deeabc6
PP
850 } else {
851 test_event.ts_ns = -1;
852 }
853
8deeabc6
PP
854 break;
855 }
856 case BT_NOTIFICATION_TYPE_PACKET_BEGIN:
857 test_event.type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN;
858 break;
859 case BT_NOTIFICATION_TYPE_PACKET_END:
860 test_event.type = TEST_EV_TYPE_NOTIF_PACKET_END;
861 break;
3230ee6b
PP
862 case BT_NOTIFICATION_TYPE_STREAM_BEGIN:
863 test_event.type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN;
864 break;
865 case BT_NOTIFICATION_TYPE_STREAM_END:
866 test_event.type = TEST_EV_TYPE_NOTIF_STREAM_END;
867 break;
8deeabc6
PP
868 default:
869 test_event.type = TEST_EV_TYPE_NOTIF_UNEXPECTED;
870 break;
871 }
872
873end:
874 if (do_append_test_event) {
875 append_test_event(&test_event);
876 }
877
878 bt_put(notification);
879 return ret;
880}
881
882static
883void sink_port_connected(struct bt_private_component *private_component,
884 struct bt_private_port *self_private_port,
885 struct bt_port *other_port)
886{
887 struct bt_private_connection *priv_conn =
888 bt_private_port_get_private_connection(self_private_port);
889 struct sink_user_data *user_data = bt_private_component_get_user_data(
890 private_component);
73d5c1ad 891 enum bt_connection_status conn_status;
8deeabc6
PP
892
893 assert(user_data);
894 assert(priv_conn);
73d5c1ad 895 conn_status = bt_private_connection_create_notification_iterator(
f42867e2 896 priv_conn, &user_data->notif_iter);
73d5c1ad 897 assert(conn_status == 0);
8deeabc6
PP
898 bt_put(priv_conn);
899}
900
901static
902enum bt_component_status sink_init(
903 struct bt_private_component *private_component,
904 struct bt_value *params, void *init_method_data)
905{
906 struct sink_user_data *user_data = g_new0(struct sink_user_data, 1);
907 int ret;
908
909 assert(user_data);
910 ret = bt_private_component_set_user_data(private_component,
911 user_data);
912 assert(ret == 0);
147337a3
PP
913 ret = bt_private_component_sink_add_input_private_port(
914 private_component, "in", NULL, NULL);
915 assert(ret == 0);
8deeabc6
PP
916 return BT_COMPONENT_STATUS_OK;
917}
918
919static
920void sink_finalize(struct bt_private_component *private_component)
921{
922 struct sink_user_data *user_data = bt_private_component_get_user_data(
923 private_component);
924
925 if (user_data) {
926 bt_put(user_data->notif_iter);
927 g_free(user_data);
928 }
929}
930
931static
36712f1d
PP
932void create_source_muxer_sink(struct bt_graph *graph,
933 struct bt_component **source,
8deeabc6
PP
934 struct bt_component **muxer,
935 struct bt_component **sink)
936{
937 struct bt_component_class *src_comp_class;
938 struct bt_component_class *muxer_comp_class;
939 struct bt_component_class *sink_comp_class;
940 int ret;
941
942 /* Create source component */
943 src_comp_class = bt_component_class_source_create("src", src_iter_next);
944 assert(src_comp_class);
945 ret = bt_component_class_set_init_method(src_comp_class, src_init);
946 assert(ret == 0);
947 ret = bt_component_class_set_finalize_method(src_comp_class,
948 src_finalize);
949 assert(ret == 0);
950 ret = bt_component_class_source_set_notification_iterator_init_method(
951 src_comp_class, src_iter_init);
952 assert(ret == 0);
953 ret = bt_component_class_source_set_notification_iterator_finalize_method(
954 src_comp_class, src_iter_finalize);
955 assert(ret == 0);
36712f1d
PP
956 ret = bt_graph_add_component(graph, src_comp_class, "source", NULL, source);
957 assert(ret == 0);
8deeabc6
PP
958
959 /* Create muxer component */
960 muxer_comp_class = bt_plugin_find_component_class("utils", "muxer",
961 BT_COMPONENT_CLASS_TYPE_FILTER);
962 assert(muxer_comp_class);
36712f1d
PP
963 ret = bt_graph_add_component(graph, muxer_comp_class, "muxer", NULL, muxer);
964 assert(ret == 0);
8deeabc6
PP
965
966 /* Create sink component */
967 sink_comp_class = bt_component_class_sink_create("sink", sink_consume);
968 assert(sink_comp_class);
969 ret = bt_component_class_set_init_method(sink_comp_class, sink_init);
970 assert(ret == 0);
971 ret = bt_component_class_set_finalize_method(sink_comp_class,
972 sink_finalize);
973 ret = bt_component_class_set_port_connected_method(sink_comp_class,
974 sink_port_connected);
975 assert(ret == 0);
36712f1d
PP
976 ret = bt_graph_add_component(graph, sink_comp_class, "sink", NULL, sink);
977 assert(ret == 0);
8deeabc6
PP
978
979 bt_put(src_comp_class);
980 bt_put(muxer_comp_class);
981 bt_put(sink_comp_class);
982}
983
984static
985void do_std_test(enum test test, const char *name,
986 const struct test_event *expected_test_events,
987 bool with_upstream)
988{
989 struct bt_component *src_comp;
990 struct bt_component *muxer_comp;
991 struct bt_component *sink_comp;
992 struct bt_port *upstream_port;
993 struct bt_port *downstream_port;
994 struct bt_graph *graph;
544d0515
PP
995 int64_t i;
996 int64_t count;
8deeabc6
PP
997 enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
998
999 clear_test_events();
1000 current_test = test;
1001 diag("test: %s", name);
8deeabc6
PP
1002 graph = bt_graph_create();
1003 assert(graph);
36712f1d 1004 create_source_muxer_sink(graph, &src_comp, &muxer_comp, &sink_comp);
8deeabc6
PP
1005
1006 /* Connect source output ports to muxer input ports */
1007 if (with_upstream) {
544d0515
PP
1008 count = bt_component_source_get_output_port_count(src_comp);
1009 assert(count >= 0);
8deeabc6
PP
1010
1011 for (i = 0; i < count; i++) {
9ac68eb1 1012 upstream_port = bt_component_source_get_output_port_by_index(
8deeabc6
PP
1013 src_comp, i);
1014 assert(upstream_port);
9ac68eb1 1015 downstream_port = bt_component_filter_get_input_port_by_index(
8deeabc6
PP
1016 muxer_comp, i);
1017 assert(downstream_port);
a256a42d
PP
1018 graph_status = bt_graph_connect_ports(graph,
1019 upstream_port, downstream_port, NULL);
1020 assert(graph_status == 0);
8deeabc6
PP
1021 bt_put(upstream_port);
1022 bt_put(downstream_port);
1023 }
1024 }
1025
1026 /* Connect muxer output port to sink input port */
9ac68eb1 1027 upstream_port = bt_component_filter_get_output_port_by_name(muxer_comp,
8deeabc6
PP
1028 "out");
1029 assert(upstream_port);
b9d103be 1030 downstream_port = bt_component_sink_get_input_port_by_name(sink_comp, "in");
8deeabc6 1031 assert(downstream_port);
a256a42d
PP
1032 graph_status = bt_graph_connect_ports(graph, upstream_port,
1033 downstream_port, NULL);
1034 assert(graph_status == 0);
8deeabc6
PP
1035 bt_put(upstream_port);
1036 bt_put(downstream_port);
1037
1038 while (graph_status == BT_GRAPH_STATUS_OK ||
1039 graph_status == BT_GRAPH_STATUS_AGAIN) {
1040 graph_status = bt_graph_run(graph);
1041 }
1042
1043 ok(graph_status == BT_GRAPH_STATUS_END, "graph finishes without any error");
1044 ok(compare_test_events(expected_test_events),
1045 "the produced sequence of test events is the expected one");
1046
1047 bt_put(src_comp);
1048 bt_put(muxer_comp);
1049 bt_put(sink_comp);
1050 bt_put(graph);
1051}
1052
1053static
1054void test_no_ts(void)
1055{
1056 const struct test_event expected_test_events[] = {
3230ee6b
PP
1057 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1058 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1059 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
8deeabc6
PP
1060 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1061 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = -1, },
1062 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = -1, },
1063 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = -1, },
1064 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = -1, },
1065 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = -1, },
3230ee6b
PP
1066 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1067 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1068 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 1, },
1069 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 4, },
1070 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 189, },
1071 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 1001, },
3230ee6b
PP
1072 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1073 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1074 { .type = TEST_EV_TYPE_END, },
1075 { .type = TEST_EV_TYPE_SENTINEL, },
1076 };
1077
1078 do_std_test(TEST_NO_TS, "event notifications with no time",
1079 expected_test_events, true);
1080}
1081
1082static
1083void test_no_upstream_connection(void)
1084{
1085 const struct test_event expected_test_events[] = {
1086 { .type = TEST_EV_TYPE_END, },
1087 { .type = TEST_EV_TYPE_SENTINEL, },
1088 };
1089
1090 do_std_test(TEST_NO_UPSTREAM_CONNECTION, "no upstream connection",
1091 expected_test_events, false);
1092}
1093
1094static
3230ee6b 1095void test_simple_4_ports(void)
8deeabc6
PP
1096{
1097 const struct test_event expected_test_events[] = {
3230ee6b 1098 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
8deeabc6 1099 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
3230ee6b
PP
1100 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1101 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1102 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1103 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1104 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
8deeabc6 1105 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
8deeabc6
PP
1106 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 8 },
1107 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 24 },
1108 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 41 },
1109 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 51 },
1110 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 53 },
1111 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 56 },
1112 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 59 },
1113 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 68 },
1114 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 71 },
1115 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 77 },
1116 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 91 },
1117 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 97 },
1118 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 105 },
1119 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 119 },
1120 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 120 },
1121 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 121 },
1122 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 138 },
1123 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 139 },
1124 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 154 },
1125 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 170 },
1126 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 179 },
1127 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 209 },
1128 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 210 },
1129 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 222 },
1130 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 228 },
1131 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 240 },
1132 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 254 },
1133 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 266 },
1134 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 292 },
1135 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 298 },
1136 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 317 },
1137 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 320 },
1138 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 350 },
1139 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 352 },
1140 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 353 },
1141 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 393 },
1142 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 407 },
1143 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 419 },
1144 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 433 },
1145 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 454 },
1146 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 471 },
1147 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 473 },
1148 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 478 },
1149 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 479 },
1150 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 481 },
1151 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 487 },
1152 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 504 },
1153 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 525 },
1154 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 572 },
1155 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 591 },
1156 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 605 },
1157 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 612 },
1158 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 615 },
1159 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 618 },
1160 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 624 },
1161 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 631 },
1162 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 632 },
1163 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 644 },
1164 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 651 },
1165 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 668 },
1166 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 670 },
1167 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 678 },
1168 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 696 },
1169 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 708 },
1170 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 714 },
1171 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 717 },
1172 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 731 },
1173 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 733 },
1174 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 744 },
1175 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 750 },
1176 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 766 },
1177 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 778 },
1178 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 788 },
1179 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 790 },
1180 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 819 },
1181 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 820 },
1182 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 825 },
1183 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 836 },
3230ee6b
PP
1184 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1185 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1186 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 850 },
1187 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 852 },
1188 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 857 },
1189 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 863 },
1190 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 867 },
1191 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 871 },
1192 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 884 },
1193 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 892 },
1194 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 903 },
1195 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 931 },
1196 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 944 },
1197 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 951 },
1198 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 953 },
1199 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 956 },
1200 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 985 },
1201 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 996 },
3230ee6b
PP
1202 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1203 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6 1204 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 998 },
3230ee6b
PP
1205 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1206 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6 1207 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 999 },
3230ee6b
PP
1208 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1209 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1210 { .type = TEST_EV_TYPE_END, },
1211 { .type = TEST_EV_TYPE_SENTINEL, },
1212 };
1213
1214 do_std_test(TEST_SIMPLE_4_PORTS, "simple: 4 ports without retries",
1215 expected_test_events, true);
1216}
1217
1218static
1219void test_4_ports_with_retries(void)
1220{
1221 const struct test_event expected_test_events[] = {
1222 { .type = TEST_EV_TYPE_AGAIN, },
3230ee6b
PP
1223 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1224 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1225 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1226 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1227 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1228 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1229 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1230 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
8deeabc6
PP
1231 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 8 },
1232 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 24 },
1233 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 41 },
1234 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 51 },
1235 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 53 },
1236 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 56 },
1237 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 59 },
1238 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 68 },
1239 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 71 },
1240 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 77 },
1241 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 91 },
1242 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 97 },
1243 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 105 },
1244 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 119 },
1245 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 120 },
1246 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 121 },
1247 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 138 },
1248 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 139 },
1249 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 154 },
1250 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 170 },
1251 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 179 },
1252 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 209 },
1253 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 210 },
1254 { .type = TEST_EV_TYPE_AGAIN, },
1255 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 222 },
1256 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 228 },
1257 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 240 },
1258 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 254 },
1259 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 266 },
1260 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 292 },
1261 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 298 },
1262 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 317 },
1263 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 320 },
1264 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 350 },
1265 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 352 },
1266 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 353 },
1267 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 393 },
1268 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 407 },
1269 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 419 },
1270 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 433 },
1271 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 454 },
1272 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 471 },
1273 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 473 },
1274 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 478 },
1275 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 479 },
1276 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 481 },
1277 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 487 },
1278 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 504 },
1279 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 525 },
1280 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 572 },
1281 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 591 },
1282 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 605 },
1283 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 612 },
1284 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 615 },
1285 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 618 },
1286 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 624 },
1287 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 631 },
1288 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 632 },
1289 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 644 },
1290 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 651 },
1291 { .type = TEST_EV_TYPE_AGAIN, },
1292 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 668 },
1293 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 670 },
1294 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 678 },
1295 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 696 },
1296 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 708 },
1297 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 714 },
1298 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 717 },
1299 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 731 },
1300 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 733 },
1301 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 744 },
1302 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 750 },
1303 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 766 },
1304 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 778 },
1305 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 788 },
1306 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 790 },
1307 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 819 },
1308 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 820 },
1309 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 825 },
1310 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 836 },
1311 { .type = TEST_EV_TYPE_AGAIN, },
3230ee6b
PP
1312 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1313 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1314 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 850 },
1315 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 852 },
1316 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 857 },
1317 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 863 },
1318 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 867 },
1319 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 871 },
1320 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 884 },
1321 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 892 },
1322 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 903 },
1323 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 931 },
1324 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 944 },
1325 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 951 },
1326 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 953 },
1327 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 956 },
1328 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 985 },
1329 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 996 },
3230ee6b
PP
1330 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1331 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6 1332 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 998 },
3230ee6b
PP
1333 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1334 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6 1335 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 999 },
3230ee6b
PP
1336 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1337 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1338 { .type = TEST_EV_TYPE_END, },
1339 { .type = TEST_EV_TYPE_SENTINEL, },
1340 };
1341
1342 do_std_test(TEST_4_PORTS_WITH_RETRIES, "4 ports with retries",
1343 expected_test_events, true);
1344}
1345
1346static
1347void connect_port_to_first_avail_muxer_port(struct bt_graph *graph,
1348 struct bt_port *source_port,
1349 struct bt_component *muxer_comp)
1350{
1351 struct bt_port *avail_muxer_port = NULL;
544d0515
PP
1352 int64_t i;
1353 int64_t count;
a256a42d 1354 enum bt_graph_status graph_status;
8deeabc6 1355
544d0515
PP
1356 count = bt_component_filter_get_input_port_count(muxer_comp);
1357 assert(count >= 0);
8deeabc6
PP
1358
1359 for (i = 0; i < count; i++) {
1360 struct bt_port *muxer_port =
9ac68eb1 1361 bt_component_filter_get_input_port_by_index(
8deeabc6
PP
1362 muxer_comp, i);
1363
1364 assert(muxer_port);
1365
1366 if (!bt_port_is_connected(muxer_port)) {
1367 BT_MOVE(avail_muxer_port, muxer_port);
1368 break;
1369 } else {
1370 bt_put(muxer_port);
1371 }
1372 }
1373
a256a42d
PP
1374 graph_status = bt_graph_connect_ports(graph, source_port,
1375 avail_muxer_port, NULL);
1376 assert(graph_status == 0);
8deeabc6
PP
1377 bt_put(avail_muxer_port);
1378}
1379
1380static
1381void graph_port_added_listener_connect_to_avail_muxer_port(struct bt_port *port,
1382 void *data)
1383{
1384 struct graph_listener_data *graph_listener_data = data;
1385 struct bt_component *comp;
1386
1387 comp = bt_port_get_component(port);
1388 assert(comp);
1389
1390 if (comp != graph_listener_data->source) {
1391 goto end;
1392 }
1393
1394 connect_port_to_first_avail_muxer_port(graph_listener_data->graph,
1395 port, graph_listener_data->muxer);
1396
1397end:
1398 bt_put(comp);
1399}
1400
1401static
1402void test_single_end_then_multiple_full(void)
1403{
1404 struct bt_component *src_comp;
1405 struct bt_component *muxer_comp;
1406 struct bt_component *sink_comp;
1407 struct bt_port *upstream_port;
1408 struct bt_port *downstream_port;
1409 struct bt_graph *graph;
544d0515
PP
1410 int64_t i;
1411 int64_t count;
8deeabc6
PP
1412 int ret;
1413 enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
1414 struct graph_listener_data graph_listener_data;
1415 const struct test_event expected_test_events[] = {
3230ee6b
PP
1416 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1417 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1418 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1419 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
8deeabc6
PP
1420 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 8 },
1421 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 51 },
1422 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 59 },
1423 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 68 },
1424 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 71 },
1425 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 77 },
1426 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 91 },
1427 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 121 },
1428 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 139 },
1429 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 170 },
1430 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 179 },
1431 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 209 },
1432 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 254 },
1433 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 266 },
1434 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 298 },
1435 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 320 },
1436 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 350 },
1437 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 352 },
1438 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 393 },
1439 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 419 },
1440 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 454 },
1441 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 478 },
1442 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 624 },
1443 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 631 },
1444 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 644 },
1445 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 651 },
1446 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 668 },
1447 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 678 },
1448 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 714 },
1449 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 717 },
1450 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 731 },
1451 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 733 },
1452 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 744 },
1453 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 750 },
1454 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 778 },
1455 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 788 },
1456 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 790 },
1457 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 819 },
1458 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 820 },
1459 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 836 },
3230ee6b
PP
1460 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1461 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1462 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 857 },
1463 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 892 },
1464 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 903 },
1465 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 944 },
1466 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 998 },
3230ee6b
PP
1467 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1468 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1469 { .type = TEST_EV_TYPE_END, },
1470 { .type = TEST_EV_TYPE_SENTINEL, },
1471 };
1472
1473 clear_test_events();
1474 current_test = TEST_SINGLE_END_THEN_MULTIPLE_FULL;
1475 diag("test: single end then multiple full");
8deeabc6
PP
1476 graph = bt_graph_create();
1477 assert(graph);
36712f1d 1478 create_source_muxer_sink(graph, &src_comp, &muxer_comp, &sink_comp);
8deeabc6
PP
1479 graph_listener_data.graph = graph;
1480 graph_listener_data.source = src_comp;
1481 graph_listener_data.muxer = muxer_comp;
1482 graph_listener_data.sink = sink_comp;
1483 ret = bt_graph_add_port_added_listener(graph,
8cc092c9 1484 graph_port_added_listener_connect_to_avail_muxer_port, NULL,
8deeabc6 1485 &graph_listener_data);
0d107cdd 1486 assert(ret >= 0);
8deeabc6
PP
1487
1488 /* Connect source output ports to muxer input ports */
544d0515 1489 count = bt_component_source_get_output_port_count(src_comp);
8deeabc6
PP
1490 assert(ret == 0);
1491
1492 for (i = 0; i < count; i++) {
9ac68eb1 1493 upstream_port = bt_component_source_get_output_port_by_index(
8deeabc6
PP
1494 src_comp, i);
1495 assert(upstream_port);
1496 connect_port_to_first_avail_muxer_port(graph,
1497 upstream_port, muxer_comp);
1498 bt_put(upstream_port);
1499 }
1500
1501 /* Connect muxer output port to sink input port */
9ac68eb1 1502 upstream_port = bt_component_filter_get_output_port_by_name(muxer_comp,
8deeabc6
PP
1503 "out");
1504 assert(upstream_port);
b9d103be 1505 downstream_port = bt_component_sink_get_input_port_by_name(sink_comp, "in");
8deeabc6 1506 assert(downstream_port);
a256a42d
PP
1507 graph_status = bt_graph_connect_ports(graph, upstream_port,
1508 downstream_port, NULL);
1509 assert(graph_status == 0);
8deeabc6
PP
1510 bt_put(upstream_port);
1511 bt_put(downstream_port);
1512
1513 while (graph_status == BT_GRAPH_STATUS_OK ||
1514 graph_status == BT_GRAPH_STATUS_AGAIN) {
1515 graph_status = bt_graph_run(graph);
1516 }
1517
1518 ok(graph_status == BT_GRAPH_STATUS_END, "graph finishes without any error");
1519 ok(compare_test_events(expected_test_events),
1520 "the produced sequence of test events is the expected one");
1521
1522 bt_put(src_comp);
1523 bt_put(muxer_comp);
1524 bt_put(sink_comp);
1525 bt_put(graph);
1526}
1527
1528static
1529void test_single_again_end_then_multiple_full(void)
1530{
1531 struct bt_component *src_comp;
1532 struct bt_component *muxer_comp;
1533 struct bt_component *sink_comp;
1534 struct bt_port *upstream_port;
1535 struct bt_port *downstream_port;
1536 struct bt_graph *graph;
544d0515
PP
1537 int64_t i;
1538 int64_t count;
8deeabc6
PP
1539 int ret;
1540 enum bt_graph_status graph_status = BT_GRAPH_STATUS_OK;
1541 struct graph_listener_data graph_listener_data;
1542 const struct test_event expected_test_events[] = {
1543 { .type = TEST_EV_TYPE_AGAIN, },
3230ee6b
PP
1544 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1545 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
1546 { .type = TEST_EV_TYPE_NOTIF_STREAM_BEGIN, },
1547 { .type = TEST_EV_TYPE_NOTIF_PACKET_BEGIN, },
8deeabc6
PP
1548 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 8 },
1549 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 51 },
1550 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 59 },
1551 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 68 },
1552 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 71 },
1553 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 77 },
1554 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 91 },
1555 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 121 },
1556 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 139 },
1557 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 170 },
1558 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 179 },
1559 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 209 },
1560 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 254 },
1561 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 266 },
1562 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 298 },
1563 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 320 },
1564 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 350 },
1565 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 352 },
1566 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 393 },
1567 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 419 },
1568 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 454 },
1569 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 478 },
1570 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 624 },
1571 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 631 },
1572 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 644 },
1573 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 651 },
1574 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 668 },
1575 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 678 },
1576 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 714 },
1577 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 717 },
1578 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 731 },
1579 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 733 },
1580 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 744 },
1581 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 750 },
1582 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 778 },
1583 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 788 },
1584 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 790 },
1585 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 819 },
1586 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 820 },
1587 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 836 },
3230ee6b
PP
1588 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1589 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1590 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 857 },
1591 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 892 },
1592 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 903 },
1593 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 944 },
1594 { .type = TEST_EV_TYPE_NOTIF_EVENT, .ts_ns = 998 },
3230ee6b
PP
1595 { .type = TEST_EV_TYPE_NOTIF_PACKET_END, },
1596 { .type = TEST_EV_TYPE_NOTIF_STREAM_END, },
8deeabc6
PP
1597 { .type = TEST_EV_TYPE_END, },
1598 { .type = TEST_EV_TYPE_SENTINEL, },
1599 };
1600
1601 clear_test_events();
1602 current_test = TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL;
1603 diag("test: single again then end then multiple full");
8deeabc6
PP
1604 graph = bt_graph_create();
1605 assert(graph);
36712f1d 1606 create_source_muxer_sink(graph, &src_comp, &muxer_comp, &sink_comp);
8deeabc6
PP
1607 graph_listener_data.graph = graph;
1608 graph_listener_data.source = src_comp;
1609 graph_listener_data.muxer = muxer_comp;
1610 graph_listener_data.sink = sink_comp;
1611 ret = bt_graph_add_port_added_listener(graph,
8cc092c9 1612 graph_port_added_listener_connect_to_avail_muxer_port, NULL,
8deeabc6 1613 &graph_listener_data);
0d107cdd 1614 assert(ret >= 0);
8deeabc6
PP
1615
1616 /* Connect source output ports to muxer input ports */
544d0515 1617 count = bt_component_source_get_output_port_count(src_comp);
8deeabc6
PP
1618 assert(ret == 0);
1619
1620 for (i = 0; i < count; i++) {
9ac68eb1 1621 upstream_port = bt_component_source_get_output_port_by_index(
8deeabc6
PP
1622 src_comp, i);
1623 assert(upstream_port);
1624 connect_port_to_first_avail_muxer_port(graph,
1625 upstream_port, muxer_comp);
1626 bt_put(upstream_port);
1627 }
1628
1629 /* Connect muxer output port to sink input port */
9ac68eb1 1630 upstream_port = bt_component_filter_get_output_port_by_name(muxer_comp,
8deeabc6
PP
1631 "out");
1632 assert(upstream_port);
b9d103be 1633 downstream_port = bt_component_sink_get_input_port_by_name(sink_comp, "in");
8deeabc6 1634 assert(downstream_port);
a256a42d
PP
1635 graph_status = bt_graph_connect_ports(graph, upstream_port,
1636 downstream_port, NULL);
1637 assert(graph_status == 0);
8deeabc6
PP
1638 bt_put(upstream_port);
1639 bt_put(downstream_port);
1640
1641 while (graph_status == BT_GRAPH_STATUS_OK ||
1642 graph_status == BT_GRAPH_STATUS_AGAIN) {
1643 graph_status = bt_graph_run(graph);
1644 }
1645
1646 ok(graph_status == BT_GRAPH_STATUS_END, "graph finishes without any error");
1647 ok(compare_test_events(expected_test_events),
1648 "the produced sequence of test events is the expected one");
1649
1650 bt_put(src_comp);
1651 bt_put(muxer_comp);
1652 bt_put(sink_comp);
1653 bt_put(graph);
1654}
1655
1656#define DEBUG_ENV_VAR "TEST_UTILS_MUXER_DEBUG"
1657
1658int main(int argc, char **argv)
1659{
1660 if (getenv(DEBUG_ENV_VAR) && strcmp(getenv(DEBUG_ENV_VAR), "1") == 0) {
1661 debug = true;
1662 }
1663
1664 plan_tests(NR_TESTS);
1665 init_static_data();
1666 test_no_ts();
1667 test_no_upstream_connection();
8deeabc6
PP
1668 test_simple_4_ports();
1669 test_4_ports_with_retries();
1670 test_single_end_then_multiple_full();
1671 test_single_again_end_then_multiple_full();
1672 fini_static_data();
1673 return exit_status();
1674}
This page took 0.105692 seconds and 4 git commands to generate.