-static
-void test_sink_removes_port_in_consume_then_src_removes_disconnected_port(void)
-{
- int ret;
- const bt_component_source *src;
- const bt_component_sink *sink;
- const bt_component *gsrc;
- const bt_component *gsink;
- bt_graph *graph;
- const bt_port_output *src_def_port;
- const bt_port_input *sink_def_port;
- const bt_port *gsrc_def_port;
- const bt_port *gsink_def_port;
- struct event event;
- bt_graph_status status;
- size_t src_accept_port_connection_pos;
- size_t sink_accept_port_connection_pos;
- size_t src_port_connected_pos;
- size_t sink_port_connected_pos;
- size_t graph_ports_connected_pos;
- size_t src_port_disconnected_pos;
- size_t sink_port_disconnected_pos;
- size_t graph_ports_disconnected_pos;
- size_t graph_port_removed_src_pos;
- size_t graph_port_removed_sink_pos;
-
- prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
- "sink removes port in consume, then source removes disconnected port");
- graph = create_graph();
- BT_ASSERT(graph);
- src = create_src(graph);
- sink = create_sink(graph);
- src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
- "out");
- BT_ASSERT(src_def_port);
- sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
- "in");
- BT_ASSERT(sink_def_port);
- status = bt_graph_connect_ports(graph, src_def_port,
- sink_def_port, NULL);
- BT_ASSERT(status == 0);
- gsrc = bt_component_source_as_component_const(src);
- gsink = bt_component_sink_as_component_const(sink);
- gsrc_def_port = bt_port_output_as_port_const(src_def_port);
- gsink_def_port = bt_port_input_as_port_const(sink_def_port);
-
- /* We're supposed to have 7 events so far */
- ok(events->len == 7, "we have the expected number of events (before consume)");
-
- /* Source's port added */
- event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
- event.data.graph_src_output_port_added.comp = gsrc;
- event.data.graph_src_output_port_added.port = gsrc_def_port;
- ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
-
- /* Sink's port added */
- event.type = GRAPH_SINK_INPUT_PORT_ADDED;
- event.data.graph_sink_input_port_added.comp = gsink;
- event.data.graph_sink_input_port_added.port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
-
- /* Source's accept port connection */
- event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
- event.data.src_comp_accept_output_port_connection.comp = gsrc;
- event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
- event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
- ok(has_event(&event), "got the expected source's accept port connection event");
- src_accept_port_connection_pos = event_pos(&event);
-
- /* Sink's accept port connection */
- event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
- event.data.sink_comp_accept_input_port_connection.comp = gsink;
- event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
- event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
- ok(has_event(&event), "got the expected sink's accept port connection event");
- sink_accept_port_connection_pos = event_pos(&event);
-
- /* Source's port connected */
- event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
- event.data.src_comp_output_port_connected.comp = gsrc;
- event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
- event.data.src_comp_output_port_connected.other_port = gsink_def_port;
- ok(has_event(&event), "got the expected source's port connected event");
- src_port_connected_pos = event_pos(&event);
-
- /* Sink's port connected */
- event.type = SINK_COMP_INPUT_PORT_CONNECTED;
- event.data.sink_comp_input_port_connected.comp = gsink;
- event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
- event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
- ok(has_event(&event), "got the expected sink's port connected event");
- sink_port_connected_pos = event_pos(&event);
-
- /* Graph's ports connected */
- event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
- event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
- event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
- event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
- event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's ports connected event");
- graph_ports_connected_pos = event_pos(&event);
-
- /* Order of events */
- ok(src_port_connected_pos < graph_ports_connected_pos,
- "event order is good (1)");
- ok(sink_port_connected_pos < graph_ports_connected_pos,
- "event order is good (2)");
- ok(src_accept_port_connection_pos < src_port_connected_pos,
- "event order is good (3)");
- ok(sink_accept_port_connection_pos < sink_port_connected_pos,
- "event order is good (4)");
-
- /* Consume sink once */
- clear_events();
- ret = bt_graph_consume(graph);
- BT_ASSERT(ret == 0);
-
- /* We're supposed to have 5 new events */
- ok(events->len == 5, "we have the expected number of events (after consume)");
-
- /* Source's port disconnected */
- event.type = SRC_COMP_OUTPUT_PORT_DISCONNECTED;
- event.data.src_comp_output_port_disconnected.comp = gsrc;
- event.data.src_comp_output_port_disconnected.self_port = gsrc_def_port;
- ok(has_event(&event), "got the expected source's port disconnected event");
- src_port_disconnected_pos = event_pos(&event);
-
- /* Sink's port disconnected */
- event.type = SINK_COMP_INPUT_PORT_DISCONNECTED;
- event.data.sink_comp_input_port_disconnected.comp = gsink;
- event.data.sink_comp_input_port_disconnected.self_port = gsink_def_port;
- ok(has_event(&event), "got the expected sink's port disconnected event");
- sink_port_disconnected_pos = event_pos(&event);
-
- /* Graph's ports disconnected */
- event.type = GRAPH_SRC_SINK_PORTS_DISCONNECTED;
- event.data.graph_src_sink_ports_disconnected.upstream_comp = gsrc;
- event.data.graph_src_sink_ports_disconnected.downstream_comp = gsink;
- event.data.graph_src_sink_ports_disconnected.upstream_port = gsrc_def_port;
- event.data.graph_src_sink_ports_disconnected.downstream_port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's ports disconnected event");
- graph_ports_disconnected_pos = event_pos(&event);
-
- /* Graph's port removed (sink) */
- event.type = GRAPH_SINK_INPUT_PORT_REMOVED;
- event.data.graph_sink_input_port_removed.comp = gsink;
- event.data.graph_sink_input_port_removed.port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's port removed event (for sink)");
- graph_port_removed_sink_pos = event_pos(&event);
-
- /* Graph's port removed (source) */
- event.type = GRAPH_SRC_OUTPUT_PORT_REMOVED;
- event.data.graph_src_output_port_removed.comp = gsrc;
- event.data.graph_src_output_port_removed.port = gsrc_def_port;
- ok(has_event(&event), "got the expected graph's port removed event (for source)");
- graph_port_removed_src_pos = event_pos(&event);
-
- /* Order of events */
- ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
- "event order is good (5)");
- ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (6)");
- ok(src_port_disconnected_pos < graph_port_removed_src_pos,
- "event order is good (7)");
- ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
- "event order is good (8)");
- ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (9)");
- ok(sink_port_disconnected_pos < graph_port_removed_src_pos,
- "event order is good (10)");
- ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (11)");
- ok(graph_port_removed_src_pos < graph_ports_disconnected_pos,
- "event order is good (12)");
- ok(graph_port_removed_src_pos < graph_port_removed_sink_pos,
- "event order is good (13)");
-
- bt_graph_put_ref(graph);
- bt_component_sink_put_ref(sink);
- bt_component_source_put_ref(src);
-}
-
-static
-void test_sink_removes_port_in_consume(void)
-{
- int ret;
- const bt_component_source *src;
- const bt_component_sink *sink;
- const bt_component *gsrc;
- const bt_component *gsink;
- bt_graph *graph;
- const bt_port_output *src_def_port;
- const bt_port_input *sink_def_port;
- const bt_port *gsrc_def_port;
- const bt_port *gsink_def_port;
- struct event event;
- bt_graph_status status;
- size_t src_accept_port_connection_pos;
- size_t sink_accept_port_connection_pos;
- size_t src_port_connected_pos;
- size_t sink_port_connected_pos;
- size_t graph_ports_connected_pos;
- size_t src_port_disconnected_pos;
- size_t sink_port_disconnected_pos;
- size_t graph_ports_disconnected_pos;
- size_t graph_port_removed_sink_pos;
-
- prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME,
- "sink removes port in consume");
- graph = create_graph();
- BT_ASSERT(graph);
- src = create_src(graph);
- sink = create_sink(graph);
- src_def_port = bt_component_source_borrow_output_port_by_name_const(src,
- "out");
- BT_ASSERT(src_def_port);
- sink_def_port = bt_component_sink_borrow_input_port_by_name_const(sink,
- "in");
- BT_ASSERT(sink_def_port);
- status = bt_graph_connect_ports(graph, src_def_port,
- sink_def_port, NULL);
- BT_ASSERT(status == 0);
- gsrc = bt_component_source_as_component_const(src);
- gsink = bt_component_sink_as_component_const(sink);
- gsrc_def_port = bt_port_output_as_port_const(src_def_port);
- gsink_def_port = bt_port_input_as_port_const(sink_def_port);
-
- /* We're supposed to have 7 events so far */
- ok(events->len == 7, "we have the expected number of events (before consume)");
-
- /* Source's port added */
- event.type = GRAPH_SRC_OUTPUT_PORT_ADDED;
- event.data.graph_src_output_port_added.comp = gsrc;
- event.data.graph_src_output_port_added.port = gsrc_def_port;
- ok(has_event(&event), "got the expected graph's port added event (for source, initial)");
-
- /* Sink's port added */
- event.type = GRAPH_SINK_INPUT_PORT_ADDED;
- event.data.graph_sink_input_port_added.comp = gsink;
- event.data.graph_sink_input_port_added.port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's port added event (for sink, initial)");
-
- /* Source's accept port connection */
- event.type = SRC_COMP_ACCEPT_OUTPUT_PORT_CONNECTION;
- event.data.src_comp_accept_output_port_connection.comp = gsrc;
- event.data.src_comp_accept_output_port_connection.self_port = gsrc_def_port;
- event.data.src_comp_accept_output_port_connection.other_port = gsink_def_port;
- ok(has_event(&event), "got the expected source's accept port connection event");
- src_accept_port_connection_pos = event_pos(&event);
-
- /* Sink's accept port connection */
- event.type = SINK_COMP_ACCEPT_INPUT_PORT_CONNECTION;
- event.data.sink_comp_accept_input_port_connection.comp = gsink;
- event.data.sink_comp_accept_input_port_connection.self_port = gsink_def_port;
- event.data.sink_comp_accept_input_port_connection.other_port = gsrc_def_port;
- ok(has_event(&event), "got the expected sink's accept port connection event");
- sink_accept_port_connection_pos = event_pos(&event);
-
- /* Source's port connected */
- event.type = SRC_COMP_OUTPUT_PORT_CONNECTED;
- event.data.src_comp_output_port_connected.comp = gsrc;
- event.data.src_comp_output_port_connected.self_port = gsrc_def_port;
- event.data.src_comp_output_port_connected.other_port = gsink_def_port;
- ok(has_event(&event), "got the expected source's port connected event");
- src_port_connected_pos = event_pos(&event);
-
- /* Sink's port connected */
- event.type = SINK_COMP_INPUT_PORT_CONNECTED;
- event.data.sink_comp_input_port_connected.comp = gsink;
- event.data.sink_comp_input_port_connected.self_port = gsink_def_port;
- event.data.sink_comp_input_port_connected.other_port = gsrc_def_port;
- ok(has_event(&event), "got the expected sink's port connected event");
- sink_port_connected_pos = event_pos(&event);
-
- /* Graph's ports connected */
- event.type = GRAPH_SRC_SINK_PORTS_CONNECTED;
- event.data.graph_src_sink_ports_connected.upstream_comp = gsrc;
- event.data.graph_src_sink_ports_connected.downstream_comp = gsink;
- event.data.graph_src_sink_ports_connected.upstream_port = gsrc_def_port;
- event.data.graph_src_sink_ports_connected.downstream_port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's ports connected event");
- graph_ports_connected_pos = event_pos(&event);
-
- /* Order of events */
- ok(src_port_connected_pos < graph_ports_connected_pos,
- "event order is good (1)");
- ok(sink_port_connected_pos < graph_ports_connected_pos,
- "event order is good (2)");
- ok(src_accept_port_connection_pos < src_port_connected_pos,
- "event order is good (3)");
- ok(sink_accept_port_connection_pos < sink_port_connected_pos,
- "event order is good (4)");
-
- /* Consume sink once */
- clear_events();
- ret = bt_graph_consume(graph);
- BT_ASSERT(ret == 0);
-
- /* We're supposed to have 4 new events */
- ok(events->len == 4, "we have the expected number of events (after consume)");
-
- /* Source's port disconnected */
- event.type = SRC_COMP_OUTPUT_PORT_DISCONNECTED;
- event.data.src_comp_output_port_disconnected.comp = gsrc;
- event.data.src_comp_output_port_disconnected.self_port = gsrc_def_port;
- ok(has_event(&event), "got the expected source's port disconnected event");
- src_port_disconnected_pos = event_pos(&event);
-
- /* Sink's port disconnected */
- event.type = SINK_COMP_INPUT_PORT_DISCONNECTED;
- event.data.sink_comp_input_port_disconnected.comp = gsink;
- event.data.sink_comp_input_port_disconnected.self_port = gsink_def_port;
- ok(has_event(&event), "got the expected sink's port disconnected event");
- sink_port_disconnected_pos = event_pos(&event);
-
- /* Graph's ports disconnected */
- event.type = GRAPH_SRC_SINK_PORTS_DISCONNECTED;
- event.data.graph_src_sink_ports_disconnected.upstream_comp = gsrc;
- event.data.graph_src_sink_ports_disconnected.downstream_comp = gsink;
- event.data.graph_src_sink_ports_disconnected.upstream_port = gsrc_def_port;
- event.data.graph_src_sink_ports_disconnected.downstream_port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's ports disconnected event");
- graph_ports_disconnected_pos = event_pos(&event);
-
- /* Graph's port removed (sink) */
- event.type = GRAPH_SINK_INPUT_PORT_REMOVED;
- event.data.graph_sink_input_port_removed.comp = gsink;
- event.data.graph_sink_input_port_removed.port = gsink_def_port;
- ok(has_event(&event), "got the expected graph's port removed event (for sink)");
- graph_port_removed_sink_pos = event_pos(&event);
-
- /* Order of events */
- ok(src_port_disconnected_pos < graph_ports_disconnected_pos,
- "event order is good (5)");
- ok(src_port_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (7)");
- ok(sink_port_disconnected_pos < graph_ports_disconnected_pos,
- "event order is good (8)");
- ok(sink_port_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (10)");
- ok(graph_ports_disconnected_pos < graph_port_removed_sink_pos,
- "event order is good (11)");
-
- bt_component_sink_put_ref(sink);
- bt_component_source_put_ref(src);
- bt_graph_put_ref(graph);
-}
-