assert-pre-internal.h: add BT_ASSERT_PRE_VALID_INDEX()
[babeltrace.git] / tests / plugins / test-utils-muxer.c
index 7648fa110ba35aec0f64b51a923ea02c3a8b5fb3..d7c582bba38318275251b5a2be52152b20fa3de6 100644 (file)
@@ -73,8 +73,7 @@ static bool debug = false;
 static enum test current_test;
 static GArray *test_events;
 static struct bt_graph *graph;
-static struct bt_clock_class_priority_map *src_cc_prio_map;
-static struct bt_clock_class_priority_map *src_empty_cc_prio_map;
+static struct bt_private_connection_private_notification_iterator *cur_notif_iter;
 static struct bt_clock_class *src_clock_class;
 static struct bt_stream_class *src_stream_class;
 static struct bt_event_class *src_event_class;
@@ -131,22 +130,22 @@ static int64_t seq4[] = {
 
 static int64_t seq1_with_again[] = {
        SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 24, 53, 97, 105, 119, 210,
-       SEQ_AGAIN, 222, 240, 292, 317, 353, 407, 433, 473, 487, 504,
-       572, 615, 708, 766, 850, 852, 931, 951, 956, 996,
+       SEQ_AGAIN, SEQ_AGAIN, 222, 240, 292, 317, 353, 407, 433, 473,
+       487, 504, 572, 615, 708, 766, 850, 852, 931, 951, 956, 996,
        SEQ_PACKET_END, SEQ_STREAM_END, SEQ_END,
 };
 
 static int64_t seq2_with_again[] = {
        SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 51, 59, 68, 77, 91, 121,
        139, 170, 179, 266, 352, 454, 478, 631, 644, 668, 714, 744, 750,
-       778, 790, 836, SEQ_AGAIN, SEQ_PACKET_END, SEQ_STREAM_END,
-       SEQ_END,
+       778, 790, 836, SEQ_AGAIN, SEQ_AGAIN, SEQ_PACKET_END,
+       SEQ_STREAM_END, SEQ_END,
 };
 
 static int64_t seq3_with_again[] = {
        SEQ_STREAM_BEGIN, SEQ_PACKET_BEGIN, 8, 71, 209, 254, 298, 320,
-       350, 393, 419, 624, 651, SEQ_AGAIN, 678, 717, 731, 733, 788,
-       819, 820, 857, 892, 903, 944, 998, SEQ_PACKET_END,
+       350, 393, 419, 624, 651, SEQ_AGAIN, SEQ_AGAIN, 678, 717, 731,
+       733, 788, 819, 820, 857, 892, 903, 944, 998, SEQ_PACKET_END,
        SEQ_STREAM_END, SEQ_END,
 };
 
@@ -326,13 +325,6 @@ void init_static_data(void)
        BT_ASSERT(ret == 0);
        ret = bt_trace_add_clock_class(trace, src_clock_class);
        BT_ASSERT(ret == 0);
-       src_empty_cc_prio_map = bt_clock_class_priority_map_create();
-       BT_ASSERT(src_empty_cc_prio_map);
-       src_cc_prio_map = bt_clock_class_priority_map_create();
-       BT_ASSERT(src_cc_prio_map);
-       ret = bt_clock_class_priority_map_add_clock_class(src_cc_prio_map,
-               src_clock_class, 0);
-       BT_ASSERT(ret == 0);
        src_stream_class = bt_stream_class_create("my-stream-class");
        BT_ASSERT(src_stream_class);
        ret = bt_stream_class_set_packet_context_field_type(src_stream_class,
@@ -367,22 +359,26 @@ void init_static_data(void)
        BT_ASSERT(ret == 0);
        stream = bt_stream_create(src_stream_class, "stream0", 0);
        BT_ASSERT(stream);
-       src_packet0 = bt_packet_create(stream);
+       src_packet0 = bt_packet_create(stream,
+               BT_PACKET_PREVIOUS_PACKET_AVAILABILITY_NONE, NULL);
        BT_ASSERT(src_packet0);
        bt_put(stream);
        stream = bt_stream_create(src_stream_class, "stream1", 1);
        BT_ASSERT(stream);
-       src_packet1 = bt_packet_create(stream);
+       src_packet1 = bt_packet_create(stream,
+               BT_PACKET_PREVIOUS_PACKET_AVAILABILITY_NONE, NULL);
        BT_ASSERT(src_packet0);
        bt_put(stream);
        stream = bt_stream_create(src_stream_class, "stream2", 2);
        BT_ASSERT(stream);
-       src_packet2 = bt_packet_create(stream);
+       src_packet2 = bt_packet_create(stream,
+               BT_PACKET_PREVIOUS_PACKET_AVAILABILITY_NONE, NULL);
        BT_ASSERT(src_packet0);
        bt_put(stream);
        stream = bt_stream_create(src_stream_class, "stream3", 3);
        BT_ASSERT(stream);
-       src_packet3 = bt_packet_create(stream);
+       src_packet3 = bt_packet_create(stream,
+               BT_PACKET_PREVIOUS_PACKET_AVAILABILITY_NONE, NULL);
        BT_ASSERT(src_packet0);
        bt_put(stream);
 
@@ -399,8 +395,6 @@ void fini_static_data(void)
        g_array_free(test_events, TRUE);
 
        /* Metadata */
-       bt_put(src_empty_cc_prio_map);
-       bt_put(src_cc_prio_map);
        bt_put(src_clock_class);
        bt_put(src_stream_class);
        bt_put(src_event_class);
@@ -507,16 +501,15 @@ enum bt_notification_iterator_status src_iter_init(
 
 static
 struct bt_notification *src_create_event_notif(struct bt_packet *packet,
-               struct bt_clock_class_priority_map *cc_prio_map, int64_t ts_ns)
+               int64_t ts_ns)
 {
        int ret;
        struct bt_event *event;
        struct bt_notification *notif;
-       struct bt_clock_value *clock_value;
        struct bt_field *field;
 
-       notif = bt_notification_event_create(graph, src_event_class,
-               packet, cc_prio_map);
+       notif = bt_notification_event_create(cur_notif_iter,
+               src_event_class, packet);
        BT_ASSERT(notif);
        event = bt_notification_event_borrow_event(notif);
        BT_ASSERT(event);
@@ -526,20 +519,23 @@ struct bt_notification *src_create_event_notif(struct bt_packet *packet,
        BT_ASSERT(field);
        ret = bt_field_integer_unsigned_set_value(field, (uint64_t) ts_ns);
        BT_ASSERT(ret == 0);
-       clock_value = bt_event_borrow_clock_value(event, src_clock_class);
-       BT_ASSERT(clock_value);
-       ret = bt_clock_value_set_value(clock_value, (uint64_t) ts_ns);
-       BT_ASSERT(ret == 0);
+
+       if (ts_ns != UINT64_C(-1)) {
+               ret = bt_event_set_clock_value(event, src_clock_class, (uint64_t) ts_ns,
+                       BT_TRUE);
+               BT_ASSERT(ret == 0);
+       }
+
        return notif;
 }
 
 static
-struct bt_notification_iterator_next_method_return src_iter_next_seq(
-               struct src_iter_user_data *user_data)
+enum bt_notification_iterator_status src_iter_next_seq(
+               struct src_iter_user_data *user_data,
+               bt_notification_array notifs)
 {
-       struct bt_notification_iterator_next_method_return next_return = {
-               .status = BT_NOTIFICATION_ITERATOR_STATUS_OK,
-       };
+       enum bt_notification_iterator_status status =
+               BT_NOTIFICATION_ITERATOR_STATUS_OK;
        int64_t cur_ts_ns;
        struct bt_stream *stream;
 
@@ -548,63 +544,59 @@ struct bt_notification_iterator_next_method_return src_iter_next_seq(
 
        switch (cur_ts_ns) {
        case SEQ_END:
-               next_return.status =
-                       BT_NOTIFICATION_ITERATOR_STATUS_END;
+               status = BT_NOTIFICATION_ITERATOR_STATUS_END;
                break;
        case SEQ_AGAIN:
-               next_return.status =
-                       BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
+               status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
                break;
        case SEQ_PACKET_BEGIN:
-               next_return.notification =
-                       bt_notification_packet_begin_create(graph,
+               notifs[0] = bt_notification_packet_begin_create(cur_notif_iter,
                                user_data->packet);
-               BT_ASSERT(next_return.notification);
+               BT_ASSERT(notifs[0]);
                break;
        case SEQ_PACKET_END:
-               next_return.notification =
-                       bt_notification_packet_end_create(graph,
+               notifs[0] = bt_notification_packet_end_create(cur_notif_iter,
                                user_data->packet);
-               BT_ASSERT(next_return.notification);
+               BT_ASSERT(notifs[0]);
                break;
        case SEQ_STREAM_BEGIN:
                stream = bt_packet_get_stream(user_data->packet);
-               next_return.notification =
-                       bt_notification_stream_begin_create(graph, stream);
-               BT_ASSERT(next_return.notification);
+               notifs[0] = bt_notification_stream_begin_create(cur_notif_iter,
+                       stream);
+               BT_ASSERT(notifs[0]);
                bt_put(stream);
                break;
        case SEQ_STREAM_END:
                stream = bt_packet_get_stream(user_data->packet);
-               next_return.notification =
-                       bt_notification_stream_end_create(graph, stream);
-               BT_ASSERT(next_return.notification);
+               notifs[0] = bt_notification_stream_end_create(cur_notif_iter,
+                       stream);
+               BT_ASSERT(notifs[0]);
                bt_put(stream);
                break;
        default:
        {
-               next_return.notification = src_create_event_notif(
-                       user_data->packet, src_cc_prio_map, cur_ts_ns);
-               BT_ASSERT(next_return.notification);
+               notifs[0] = src_create_event_notif(user_data->packet,
+                       cur_ts_ns);
+               BT_ASSERT(notifs[0]);
                break;
        }
        }
 
-       if (next_return.status != BT_NOTIFICATION_ITERATOR_STATUS_END) {
+       if (status != BT_NOTIFICATION_ITERATOR_STATUS_END) {
                user_data->at++;
        }
 
-       return next_return;
+       return status;
 }
 
 static
-struct bt_notification_iterator_next_method_return src_iter_next(
-               struct bt_private_connection_private_notification_iterator *priv_iterator)
+enum bt_notification_iterator_status src_iter_next(
+               struct bt_private_connection_private_notification_iterator *priv_iterator,
+               bt_notification_array notifs, uint64_t capacity,
+               uint64_t *count)
 {
-       struct bt_notification_iterator_next_method_return next_return = {
-               .notification = NULL,
-               .status = BT_NOTIFICATION_ITERATOR_STATUS_OK,
-       };
+       enum bt_notification_iterator_status status =
+               BT_NOTIFICATION_ITERATOR_STATUS_OK;
        struct src_iter_user_data *user_data =
                bt_private_connection_private_notification_iterator_get_user_data(priv_iterator);
        struct bt_private_component *private_component =
@@ -614,53 +606,62 @@ struct bt_notification_iterator_next_method_return src_iter_next(
 
        BT_ASSERT(user_data);
        BT_ASSERT(private_component);
+       cur_notif_iter = priv_iterator;
+
+       /*
+        * We can always set it to 1: it's not going to be considered
+        * anyway if the status is not
+        * BT_NOTIFICATION_ITERATOR_STATUS_OK.
+        */
+       *count = 1;
 
        switch (current_test) {
        case TEST_NO_TS:
                if (user_data->iter_index == 0) {
                        if (user_data->at == 0) {
                                stream = bt_packet_get_stream(user_data->packet);
-                               next_return.notification =
+                               notifs[0] =
                                        bt_notification_stream_begin_create(
-                                               graph, stream);
+                                               cur_notif_iter, stream);
                                bt_put(stream);
-                               BT_ASSERT(next_return.notification);
+                               BT_ASSERT(notifs[0]);
                        } else if (user_data->at == 1) {
-                               next_return.notification =
+                               notifs[0] =
                                        bt_notification_packet_begin_create(
-                                               graph, user_data->packet);
-                               BT_ASSERT(next_return.notification);
+                                               cur_notif_iter,
+                                               user_data->packet);
+                               BT_ASSERT(notifs[0]);
                        } else if (user_data->at < 7) {
-                               next_return.notification =
+                               notifs[0] =
                                        src_create_event_notif(
-                                               user_data->packet,
-                                               src_empty_cc_prio_map, 0);
-                               BT_ASSERT(next_return.notification);
+                                               user_data->packet, UINT64_C(-1));
+                               BT_ASSERT(notifs[0]);
                        } else if (user_data->at == 7) {
-                               next_return.notification =
+                               notifs[0] =
                                        bt_notification_packet_end_create(
-                                               graph, user_data->packet);
-                               BT_ASSERT(next_return.notification);
+                                               cur_notif_iter,
+                                               user_data->packet);
+                               BT_ASSERT(notifs[0]);
                        } else if (user_data->at == 8) {
                                stream = bt_packet_get_stream(user_data->packet);
-                               next_return.notification =
+                               notifs[0] =
                                        bt_notification_stream_end_create(
-                                               graph, stream);
+                                               cur_notif_iter, stream);
                                bt_put(stream);
-                               BT_ASSERT(next_return.notification);
+                               BT_ASSERT(notifs[0]);
                        } else {
-                               next_return.status =
+                               status =
                                        BT_NOTIFICATION_ITERATOR_STATUS_END;
                        }
 
                        user_data->at++;
                } else {
-                       next_return = src_iter_next_seq(user_data);
+                       status = src_iter_next_seq(user_data, notifs);
                }
                break;
        case TEST_SIMPLE_4_PORTS:
        case TEST_4_PORTS_WITH_RETRIES:
-               next_return = src_iter_next_seq(user_data);
+               status = src_iter_next_seq(user_data, notifs);
                break;
        case TEST_SINGLE_END_THEN_MULTIPLE_FULL:
                if (user_data->iter_index == 0) {
@@ -670,15 +671,15 @@ struct bt_notification_iterator_next_method_return src_iter_next(
                        ret = bt_private_component_source_add_output_private_port(
                                private_component, "out2", NULL, NULL);
                        BT_ASSERT(ret == 0);
-                       next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
+                       status = BT_NOTIFICATION_ITERATOR_STATUS_END;
                } else {
-                       next_return = src_iter_next_seq(user_data);
+                       status = src_iter_next_seq(user_data, notifs);
                }
                break;
        case TEST_SINGLE_AGAIN_END_THEN_MULTIPLE_FULL:
                if (user_data->iter_index == 0) {
                        if (user_data->at == 0) {
-                               next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_AGAIN;
                                user_data->at++;
                        } else {
                                ret = bt_private_component_source_add_output_private_port(
@@ -687,10 +688,10 @@ struct bt_notification_iterator_next_method_return src_iter_next(
                                ret = bt_private_component_source_add_output_private_port(
                                        private_component, "out2", NULL, NULL);
                                BT_ASSERT(ret == 0);
-                               next_return.status = BT_NOTIFICATION_ITERATOR_STATUS_END;
+                               status = BT_NOTIFICATION_ITERATOR_STATUS_END;
                        }
                } else {
-                       next_return = src_iter_next_seq(user_data);
+                       status = src_iter_next_seq(user_data, notifs);
                }
                break;
        default:
@@ -698,7 +699,7 @@ struct bt_notification_iterator_next_method_return src_iter_next(
        }
 
        bt_put(private_component);
-       return next_return;
+       return status;
 }
 
 static
@@ -755,70 +756,25 @@ void src_finalize(struct bt_private_component *private_component)
 }
 
 static
-enum bt_component_status sink_consume(
-               struct bt_private_component *priv_component)
+void append_test_event_from_notification(struct bt_notification *notification)
 {
-       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
-       struct bt_notification *notification = NULL;
-       struct sink_user_data *user_data =
-               bt_private_component_get_user_data(priv_component);
-       enum bt_notification_iterator_status it_ret;
+       int ret;
        struct test_event test_event;
-       bool do_append_test_event = true;
-
-       BT_ASSERT(user_data && user_data->notif_iter);
-       it_ret = bt_notification_iterator_next(user_data->notif_iter);
-
-       if (it_ret < 0) {
-               ret = BT_COMPONENT_STATUS_ERROR;
-               do_append_test_event = false;
-               goto end;
-       }
-
-       switch (it_ret) {
-       case BT_NOTIFICATION_ITERATOR_STATUS_END:
-               test_event.type = TEST_EV_TYPE_END;
-               ret = BT_COMPONENT_STATUS_END;
-               BT_PUT(user_data->notif_iter);
-               goto end;
-       case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
-               test_event.type = TEST_EV_TYPE_AGAIN;
-               ret = BT_COMPONENT_STATUS_AGAIN;
-               goto end;
-       default:
-               break;
-       }
-
-       notification = bt_notification_iterator_get_notification(
-               user_data->notif_iter);
-       BT_ASSERT(notification);
+       struct bt_clock_value *cv;
 
        switch (bt_notification_get_type(notification)) {
        case BT_NOTIFICATION_TYPE_EVENT:
        {
                struct bt_event *event;
-               struct bt_clock_class_priority_map *cc_prio_map;
 
                test_event.type = TEST_EV_TYPE_NOTIF_EVENT;
-               cc_prio_map =
-                       bt_notification_event_borrow_clock_class_priority_map(
-                               notification);
-               BT_ASSERT(cc_prio_map);
                event = bt_notification_event_borrow_event(notification);
                BT_ASSERT(event);
+               cv = bt_event_borrow_default_clock_value(event);
 
-               if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map) > 0) {
-                       struct bt_clock_value *clock_value;
-                       struct bt_clock_class *clock_class =
-                               bt_clock_class_priority_map_borrow_highest_priority_clock_class(
-                                       cc_prio_map);
-
-                       BT_ASSERT(clock_class);
-                       clock_value = bt_event_borrow_clock_value(event,
-                               clock_class);
-                       BT_ASSERT(clock_value);
+               if (cv) {
                        ret = bt_clock_value_get_value_ns_from_epoch(
-                                       clock_value, &test_event.ts_ns);
+                               cv, &test_event.ts_ns);
                        BT_ASSERT(ret == 0);
                } else {
                        test_event.ts_ns = -1;
@@ -828,26 +784,13 @@ enum bt_component_status sink_consume(
        }
        case BT_NOTIFICATION_TYPE_INACTIVITY:
        {
-               struct bt_clock_class_priority_map *cc_prio_map;
-
                test_event.type = TEST_EV_TYPE_NOTIF_INACTIVITY;
-               cc_prio_map = bt_notification_inactivity_borrow_clock_class_priority_map(
+               cv = bt_notification_inactivity_borrow_default_clock_value(
                        notification);
-               BT_ASSERT(cc_prio_map);
-
-               if (bt_clock_class_priority_map_get_clock_class_count(cc_prio_map) > 0) {
-                       struct bt_clock_value *clock_value;
-                       struct bt_clock_class *clock_class =
-                               bt_clock_class_priority_map_borrow_highest_priority_clock_class(
-                                       cc_prio_map);
-
-                       BT_ASSERT(clock_class);
-                       clock_value =
-                               bt_notification_inactivity_borrow_clock_value(
-                                       notification, clock_class);
-                       BT_ASSERT(clock_value);
+
+               if (cv) {
                        ret = bt_clock_value_get_value_ns_from_epoch(
-                                       clock_value, &test_event.ts_ns);
+                                       cv, &test_event.ts_ns);
                        BT_ASSERT(ret == 0);
                } else {
                        test_event.ts_ns = -1;
@@ -872,17 +815,66 @@ enum bt_component_status sink_consume(
                break;
        }
 
+       append_test_event(&test_event);
+}
+
+static
+enum bt_component_status sink_consume(
+               struct bt_private_component *priv_component)
+{
+       enum bt_component_status ret = BT_COMPONENT_STATUS_OK;
+       bt_notification_array notifications = NULL;
+       uint64_t count;
+       struct sink_user_data *user_data =
+               bt_private_component_get_user_data(priv_component);
+       enum bt_notification_iterator_status it_ret;
+       struct test_event test_event;
+       bool do_append_test_event = true;
+       uint64_t i;
+
+       BT_ASSERT(user_data && user_data->notif_iter);
+       it_ret = bt_private_connection_notification_iterator_next(
+               user_data->notif_iter, &notifications, &count);
+       if (it_ret < 0) {
+               ret = BT_COMPONENT_STATUS_ERROR;
+               do_append_test_event = false;
+               goto end;
+       }
+
+       switch (it_ret) {
+       case BT_NOTIFICATION_ITERATOR_STATUS_END:
+               test_event.type = TEST_EV_TYPE_END;
+               ret = BT_COMPONENT_STATUS_END;
+               BT_PUT(user_data->notif_iter);
+               goto end;
+       case BT_NOTIFICATION_ITERATOR_STATUS_AGAIN:
+               test_event.type = TEST_EV_TYPE_AGAIN;
+               ret = BT_COMPONENT_STATUS_AGAIN;
+               goto end;
+       default:
+               break;
+       }
+
+       BT_ASSERT(notifications);
+
+       for (i = 0; i < count; i++) {
+               append_test_event_from_notification(notifications[i]);
+               bt_put(notifications[i]);
+       }
+
+       do_append_test_event = false;
+
 end:
        if (do_append_test_event) {
                append_test_event(&test_event);
        }
 
-       bt_put(notification);
        return ret;
 }
 
 static
-void sink_port_connected(struct bt_private_component *private_component,
+enum bt_component_status sink_port_connected(
+               struct bt_private_component *private_component,
                struct bt_private_port *self_private_port,
                struct bt_port *other_port)
 {
@@ -898,6 +890,7 @@ void sink_port_connected(struct bt_private_component *private_component,
                priv_conn, &user_data->notif_iter);
        BT_ASSERT(conn_status == 0);
        bt_put(priv_conn);
+       return BT_COMPONENT_STATUS_OK;
 }
 
 static
This page took 0.030697 seconds and 4 git commands to generate.