+ bt_object_put_ref(sink);
+ bt_object_put_ref(graph);
+ bt_object_put_ref(src);
+}
+
+static
+void test_src_port_connected_error(void)
+{
+ struct bt_component_source *src;
+ struct bt_component_sink *sink;
+ struct bt_component *gsrc;
+ struct bt_component *gsink;
+ struct bt_private_graph *graph;
+ struct bt_port_output *src_def_port;
+ struct bt_port_input *sink_def_port;
+ struct bt_port *gsrc_def_port;
+ struct bt_port *gsink_def_port;
+ struct bt_connection *conn = NULL;
+ struct event event;
+ enum bt_graph_status status;
+ size_t src_accept_port_connection_pos;
+ size_t src_port_connected_pos;
+
+ prepare_test(TEST_SRC_PORT_CONNECTED_ERROR, "port connected error: source");
+ 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(src, "out");
+ BT_ASSERT(src_def_port);
+ sink_def_port = bt_component_sink_borrow_input_port_by_name(sink, "in");
+ BT_ASSERT(sink_def_port);
+ status = bt_private_graph_connect_ports(graph, src_def_port,
+ sink_def_port, &conn);
+ ok(status != BT_GRAPH_STATUS_OK,
+ "bt_private_graph_connect_ports() returns an error");
+ ok(!conn, "returned connection is still NULL");
+ gsrc = bt_component_source_as_component(src);
+ gsink = bt_component_sink_as_component(sink);
+ gsrc_def_port = bt_port_output_as_port(src_def_port);
+ gsink_def_port = bt_port_input_as_port(sink_def_port);
+
+ /* We're supposed to have 5 events */
+ ok(events->len == 5, "we have the expected number of events");
+
+ /* 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");
+
+ /* 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);
+
+ /* Order of events */
+ ok(src_accept_port_connection_pos < src_port_connected_pos,
+ "event order is good (1)");
+
+ bt_object_put_ref(graph);
+ bt_object_put_ref(sink);
+ bt_object_put_ref(src);
+ bt_object_put_ref(conn);
+}
+
+static
+void test_sink_port_connected_error(void)
+{
+ struct bt_component_source *src;
+ struct bt_component_sink *sink;
+ struct bt_component *gsrc;
+ struct bt_component *gsink;
+ struct bt_private_graph *graph;
+ struct bt_port_output *src_def_port;
+ struct bt_port_input *sink_def_port;
+ struct bt_port *gsrc_def_port;
+ struct bt_port *gsink_def_port;
+ struct bt_connection *conn = NULL;
+ struct event event;
+ enum 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 src_port_disconnected_pos;
+ size_t sink_port_connected_pos;
+
+ prepare_test(TEST_SINK_PORT_CONNECTED_ERROR, "port connected error: sink");
+ 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(src, "out");
+ BT_ASSERT(src_def_port);
+ sink_def_port = bt_component_sink_borrow_input_port_by_name(sink, "in");
+ BT_ASSERT(sink_def_port);
+ status = bt_private_graph_connect_ports(graph, src_def_port,
+ sink_def_port, &conn);
+ ok(status != BT_GRAPH_STATUS_OK,
+ "bt_private_graph_connect_ports() returns an error");
+ ok(!conn, "returned connection is still NULL");
+ gsrc = bt_component_source_as_component(src);
+ gsink = bt_component_sink_as_component(sink);
+ gsrc_def_port = bt_port_output_as_port(src_def_port);
+ gsink_def_port = bt_port_input_as_port(sink_def_port);
+
+ /* We're supposed to have 5 events */
+ ok(events->len == 7, "we have the expected number of events");
+
+ /* 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);
+
+ /* 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);
+
+ /* Order of events */
+ ok(src_accept_port_connection_pos < src_port_connected_pos,
+ "event order is good (1)");
+ ok(sink_accept_port_connection_pos < sink_port_connected_pos,
+ "event order is good (2)");
+ ok(sink_port_connected_pos < src_port_disconnected_pos,
+ "event order is good (3)");
+
+ bt_object_put_ref(conn);
+ bt_object_put_ref(graph);
+ bt_object_put_ref(sink);
+ bt_object_put_ref(src);