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;
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,
};
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,
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);
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);
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);
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;
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 =
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) {
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(
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:
}
bt_put(private_component);
- return next_return;
+ return status;
}
static
}
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_private_connection_notification_iterator_next(
- user_data->notif_iter, ¬ification);
-
- 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(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;
}
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;
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, ¬ifications, &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)
{
priv_conn, &user_data->notif_iter);
BT_ASSERT(conn_status == 0);
bt_put(priv_conn);
+ return BT_COMPONENT_STATUS_OK;
}
static