X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Flib%2Ftest_graph_topo.c;h=c34821a60cab0e67b14c235636b7d2c31a85f150;hb=bf55043c2e742cafb86d3a3404d0d35c4cf294a3;hp=efc2cc5f30acb5299f8f1c7e3781790492165731;hpb=d4393e0875e7b08f6ee97d617cc5f2c9286742a4;p=babeltrace.git diff --git a/tests/lib/test_graph_topo.c b/tests/lib/test_graph_topo.c index efc2cc5f..c34821a6 100644 --- a/tests/lib/test_graph_topo.c +++ b/tests/lib/test_graph_topo.c @@ -40,7 +40,7 @@ #include "tap/tap.h" -#define NR_TESTS 77 +#define NR_TESTS 99 enum event_type { COMP_ACCEPT_PORT_CONNECTION, @@ -55,6 +55,8 @@ enum event_type { enum test { TEST_EMPTY_GRAPH, TEST_SIMPLE, + TEST_SRC_PORT_CONNECTED_ERROR, + TEST_SINK_PORT_CONNECTED_ERROR, TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED, TEST_SINK_REMOVES_PORT_IN_CONSUME, TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT, @@ -313,7 +315,8 @@ enum bt_component_status accept_port_connection( } static -void src_port_connected(struct bt_private_component *private_component, +enum bt_component_status src_port_connected( + struct bt_private_component *private_component, struct bt_private_port *self_private_port, struct bt_port *other_port) { @@ -336,9 +339,13 @@ void src_port_connected(struct bt_private_component *private_component, private_component, "hello", NULL, NULL); BT_ASSERT(ret == 0); break; + case TEST_SRC_PORT_CONNECTED_ERROR: + return BT_COMPONENT_STATUS_ERROR; default: break; } + + return BT_COMPONENT_STATUS_OK; } static @@ -402,7 +409,8 @@ enum bt_component_status sink_consume( } 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) { @@ -416,6 +424,12 @@ void sink_port_connected(struct bt_private_component *private_component, }; append_event(&event); + + if (current_test == TEST_SINK_PORT_CONNECTED_ERROR) { + return BT_COMPONENT_STATUS_ERROR; + } else { + return BT_COMPONENT_STATUS_OK; + } } static @@ -1197,6 +1211,187 @@ void test_simple(void) bt_put(sink_def_port); } +static +void test_src_port_connected_error(void) +{ + struct bt_component *src; + struct bt_component *sink; + struct bt_graph *graph; + struct bt_port *src_def_port; + struct bt_port *sink_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_get_output_port_by_name(src, "out"); + BT_ASSERT(src_def_port); + sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); + BT_ASSERT(sink_def_port); + status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, + &conn); + ok(status != BT_GRAPH_STATUS_OK, + "bt_graph_connect_ports() returns an error"); + ok(!conn, "returned connection is NULL"); + + /* 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_PORT_ADDED; + event.data.graph_port_added.comp = src; + event.data.graph_port_added.port = src_def_port; + ok(has_event(&event), "got the expected graph's port added event (for source, initial)"); + + /* Sink's port added */ + event.type = GRAPH_PORT_ADDED; + event.data.graph_port_added.comp = sink; + event.data.graph_port_added.port = sink_def_port; + ok(has_event(&event), "got the expected graph's port added event (for sink, initial)"); + + /* Source's accept port connection */ + event.type = COMP_ACCEPT_PORT_CONNECTION; + event.data.comp_accept_port_connection.comp = src; + event.data.comp_accept_port_connection.self_port = src_def_port; + event.data.comp_accept_port_connection.other_port = sink_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 = COMP_ACCEPT_PORT_CONNECTION; + event.data.comp_accept_port_connection.comp = sink; + event.data.comp_accept_port_connection.self_port = sink_def_port; + event.data.comp_accept_port_connection.other_port = src_def_port; + ok(has_event(&event), "got the expected sink's accept port connection event"); + + /* Source's port connected */ + event.type = COMP_PORT_CONNECTED; + event.data.comp_port_connected.comp = src; + event.data.comp_port_connected.self_port = src_def_port; + event.data.comp_port_connected.other_port = sink_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_put(graph); + bt_put(sink); + bt_put(src); + bt_put(conn); + bt_put(src_def_port); + bt_put(sink_def_port); +} + +static +void test_sink_port_connected_error(void) +{ + struct bt_component *src; + struct bt_component *sink; + struct bt_graph *graph; + struct bt_port *src_def_port; + struct bt_port *sink_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_get_output_port_by_name(src, "out"); + BT_ASSERT(src_def_port); + sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); + BT_ASSERT(sink_def_port); + status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, + &conn); + ok(status != BT_GRAPH_STATUS_OK, + "bt_graph_connect_ports() returns an error"); + ok(!conn, "returned connection is NULL"); + + /* 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_PORT_ADDED; + event.data.graph_port_added.comp = src; + event.data.graph_port_added.port = src_def_port; + ok(has_event(&event), "got the expected graph's port added event (for source, initial)"); + + /* Sink's port added */ + event.type = GRAPH_PORT_ADDED; + event.data.graph_port_added.comp = sink; + event.data.graph_port_added.port = sink_def_port; + ok(has_event(&event), "got the expected graph's port added event (for sink, initial)"); + + /* Source's accept port connection */ + event.type = COMP_ACCEPT_PORT_CONNECTION; + event.data.comp_accept_port_connection.comp = src; + event.data.comp_accept_port_connection.self_port = src_def_port; + event.data.comp_accept_port_connection.other_port = sink_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 = COMP_ACCEPT_PORT_CONNECTION; + event.data.comp_accept_port_connection.comp = sink; + event.data.comp_accept_port_connection.self_port = sink_def_port; + event.data.comp_accept_port_connection.other_port = src_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 = COMP_PORT_CONNECTED; + event.data.comp_port_connected.comp = src; + event.data.comp_port_connected.self_port = src_def_port; + event.data.comp_port_connected.other_port = sink_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 = COMP_PORT_CONNECTED; + event.data.comp_port_connected.comp = sink; + event.data.comp_port_connected.self_port = sink_def_port; + event.data.comp_port_connected.other_port = src_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 = COMP_PORT_DISCONNECTED; + event.data.comp_port_disconnected.comp = src; + event.data.comp_port_disconnected.port = src_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_put(graph); + bt_put(sink); + bt_put(src); + bt_put(conn); + bt_put(src_def_port); + bt_put(sink_def_port); +} + static void test_empty_graph(void) { @@ -1214,6 +1409,8 @@ int main(int argc, char **argv) init_test(); test_empty_graph(); test_simple(); + test_src_port_connected_error(); + test_sink_port_connected_error(); test_src_adds_port_in_port_connected(); test_sink_removes_port_in_port_connected(); test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port();