X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=tests%2Flib%2Ftest_graph_topo.c;h=d3d45818d224531517935b4318aa328549c6e9da;hb=a3f0c7db90f4cfc81090a83a7442b7bc624d5789;hp=580648b24f053863bd4f26d21f66b6c4721ddf58;hpb=9d408fcae74602e3591f66623ceb85f482d948ed;p=babeltrace.git diff --git a/tests/lib/test_graph_topo.c b/tests/lib/test_graph_topo.c index 580648b2..d3d45818 100644 --- a/tests/lib/test_graph_topo.c +++ b/tests/lib/test_graph_topo.c @@ -17,47 +17,30 @@ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include +#include +#include "common/assert.h" #include #include #include -#include #include #include "tap/tap.h" -#define NR_TESTS 77 +#define NR_TESTS 26 enum event_type { - COMP_ACCEPT_PORT_CONNECTION, - COMP_PORT_CONNECTED, - COMP_PORT_DISCONNECTED, - GRAPH_PORT_ADDED, - GRAPH_PORT_REMOVED, - GRAPH_PORTS_CONNECTED, - GRAPH_PORTS_DISCONNECTED, + SRC_COMP_OUTPUT_PORT_CONNECTED, + SINK_COMP_INPUT_PORT_CONNECTED, + GRAPH_SRC_OUTPUT_PORT_ADDED, + GRAPH_SINK_INPUT_PORT_ADDED, }; 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, }; struct event { @@ -65,52 +48,33 @@ struct event { union { struct { - struct bt_component *comp; - struct bt_port *self_port; - struct bt_port *other_port; - } comp_accept_port_connection; + const bt_component *comp; + const bt_port *self_port; + const bt_port *other_port; + } src_comp_output_port_connected; struct { - struct bt_component *comp; - struct bt_port *self_port; - struct bt_port *other_port; - } comp_port_connected; + const bt_component *comp; + const bt_port *self_port; + const bt_port *other_port; + } sink_comp_input_port_connected; struct { - struct bt_component *comp; - struct bt_port *port; - } comp_port_disconnected; + const bt_component *comp; + const bt_port *port; + } graph_src_output_port_added; struct { - struct bt_component *comp; - struct bt_port *port; - } graph_port_added; - - struct { - struct bt_component *comp; - struct bt_port *port; - } graph_port_removed; - - struct { - struct bt_component *upstream_comp; - struct bt_component *downstream_comp; - struct bt_port *upstream_port; - struct bt_port *downstream_port; - struct bt_connection *conn; - } graph_ports_connected; - - struct { - struct bt_component *upstream_comp; - struct bt_component *downstream_comp; - struct bt_port *upstream_port; - struct bt_port *downstream_port; - } graph_ports_disconnected; + const bt_component *comp; + const bt_port *port; + } graph_sink_input_port_added; } data; }; static GArray *events; -static struct bt_component_class *src_comp_class; -static struct bt_component_class *sink_comp_class; +static bt_message_iterator_class *msg_iter_class; +static bt_component_class_source *src_comp_class; +static bt_component_class_sink *sink_comp_class; static enum test current_test; static @@ -133,115 +97,57 @@ bool compare_events(struct event *ev_a, struct event *ev_b) } switch (ev_a->type) { - case COMP_ACCEPT_PORT_CONNECTION: - if (ev_a->data.comp_accept_port_connection.comp != - ev_b->data.comp_accept_port_connection.comp) { - return false; - } - - if (ev_a->data.comp_accept_port_connection.self_port != - ev_b->data.comp_accept_port_connection.self_port) { - return false; - } - - if (ev_a->data.comp_accept_port_connection.other_port != - ev_b->data.comp_accept_port_connection.other_port) { - return false; - } - break; - case COMP_PORT_CONNECTED: - if (ev_a->data.comp_port_connected.comp != - ev_b->data.comp_port_connected.comp) { + case SRC_COMP_OUTPUT_PORT_CONNECTED: + if (ev_a->data.src_comp_output_port_connected.comp != + ev_b->data.src_comp_output_port_connected.comp) { return false; } - if (ev_a->data.comp_port_connected.self_port != - ev_b->data.comp_port_connected.self_port) { + if (ev_a->data.src_comp_output_port_connected.self_port != + ev_b->data.src_comp_output_port_connected.self_port) { return false; } - if (ev_a->data.comp_port_connected.other_port != - ev_b->data.comp_port_connected.other_port) { + if (ev_a->data.src_comp_output_port_connected.other_port != + ev_b->data.src_comp_output_port_connected.other_port) { return false; } break; - case COMP_PORT_DISCONNECTED: - if (ev_a->data.comp_port_disconnected.comp != - ev_b->data.comp_port_disconnected.comp) { + case SINK_COMP_INPUT_PORT_CONNECTED: + if (ev_a->data.sink_comp_input_port_connected.comp != + ev_b->data.sink_comp_input_port_connected.comp) { return false; } - if (ev_a->data.comp_port_disconnected.port != - ev_b->data.comp_port_disconnected.port) { - return false; - } - break; - case GRAPH_PORT_ADDED: - if (ev_a->data.graph_port_added.comp != - ev_b->data.graph_port_added.comp) { + if (ev_a->data.sink_comp_input_port_connected.self_port != + ev_b->data.sink_comp_input_port_connected.self_port) { return false; } - if (ev_a->data.graph_port_added.port != - ev_b->data.graph_port_added.port) { + if (ev_a->data.sink_comp_input_port_connected.other_port != + ev_b->data.sink_comp_input_port_connected.other_port) { return false; } break; - case GRAPH_PORT_REMOVED: - if (ev_a->data.graph_port_removed.comp != - ev_b->data.graph_port_removed.comp) { + case GRAPH_SRC_OUTPUT_PORT_ADDED: + if (ev_a->data.graph_src_output_port_added.comp != + ev_b->data.graph_src_output_port_added.comp) { return false; } - if (ev_a->data.graph_port_removed.port != - ev_b->data.graph_port_removed.port) { + if (ev_a->data.graph_src_output_port_added.port != + ev_b->data.graph_src_output_port_added.port) { return false; } break; - case GRAPH_PORTS_CONNECTED: - if (ev_a->data.graph_ports_connected.upstream_comp != - ev_b->data.graph_ports_connected.upstream_comp) { - return false; - } - - if (ev_a->data.graph_ports_connected.downstream_comp != - ev_b->data.graph_ports_connected.downstream_comp) { - return false; - } - - if (ev_a->data.graph_ports_connected.upstream_port != - ev_b->data.graph_ports_connected.upstream_port) { - return false; - } - - if (ev_a->data.graph_ports_connected.downstream_port != - ev_b->data.graph_ports_connected.downstream_port) { - return false; - } - - if (ev_a->data.graph_ports_connected.conn != - ev_b->data.graph_ports_connected.conn) { - return false; - } - break; - case GRAPH_PORTS_DISCONNECTED: - if (ev_a->data.graph_ports_disconnected.upstream_comp != - ev_b->data.graph_ports_disconnected.upstream_comp) { - return false; - } - - if (ev_a->data.graph_ports_disconnected.downstream_comp != - ev_b->data.graph_ports_disconnected.downstream_comp) { - return false; - } - - if (ev_a->data.graph_ports_disconnected.upstream_port != - ev_b->data.graph_ports_disconnected.upstream_port) { + case GRAPH_SINK_INPUT_PORT_ADDED: + if (ev_a->data.graph_sink_input_port_added.comp != + ev_b->data.graph_sink_input_port_added.comp) { return false; } - if (ev_a->data.graph_ports_disconnected.downstream_port != - ev_b->data.graph_ports_disconnected.downstream_port) { + if (ev_a->data.graph_sink_input_port_added.port != + ev_b->data.graph_sink_input_port_added.port) { return false; } break; @@ -285,262 +191,148 @@ size_t event_pos(struct event *event) } static -struct bt_notification_iterator_next_method_return src_iter_next( - struct bt_private_connection_private_notification_iterator *priv_iterator) +bt_message_iterator_class_next_method_status src_iter_next( + bt_self_message_iterator *self_iterator, + bt_message_array_const msgs, uint64_t capacity, + uint64_t *count) { - struct bt_notification_iterator_next_method_return ret = { - .status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR, - }; - - return ret; + return BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_ERROR; } static -enum bt_component_status accept_port_connection( - struct bt_private_component *private_component, - struct bt_private_port *self_private_port, - struct bt_port *other_port) -{ - struct event event = { - .type = COMP_ACCEPT_PORT_CONNECTION, - .data.comp_accept_port_connection = { - .comp = bt_component_from_private_component(private_component), - .self_port = bt_port_from_private_port(self_private_port), - .other_port = other_port, - }, - }; - - bt_put(event.data.comp_accept_port_connection.comp); - bt_put(event.data.comp_accept_port_connection.self_port); - append_event(&event); - return BT_COMPONENT_STATUS_OK; -} - -static -void src_port_connected(struct bt_private_component *private_component, - struct bt_private_port *self_private_port, - struct bt_port *other_port) +bt_component_class_port_connected_method_status src_output_port_connected( + bt_self_component_source *self_comp, + bt_self_component_port_output *self_comp_port, + const bt_port_input *other_port) { int ret; - struct event event = { - .type = COMP_PORT_CONNECTED, - .data.comp_port_connected = { - .comp = bt_component_from_private_component(private_component), - .self_port = bt_port_from_private_port(self_private_port), - .other_port = other_port, + .type = SRC_COMP_OUTPUT_PORT_CONNECTED, + .data.src_comp_output_port_connected = { + .comp = bt_self_component_as_component( + bt_self_component_source_as_self_component( + self_comp)), + .self_port = bt_self_component_port_as_port( + bt_self_component_port_output_as_self_component_port( + self_comp_port)), + .other_port = bt_port_input_as_port_const(other_port), }, }; - bt_put(event.data.comp_port_connected.comp); - bt_put(event.data.comp_port_connected.self_port); append_event(&event); switch (current_test) { case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED: - ret = bt_private_component_source_add_output_private_port( - private_component, "hello", NULL, NULL); - assert(ret == 0); + ret = bt_self_component_source_add_output_port( + self_comp, "hello", NULL, NULL); + BT_ASSERT(ret == 0); break; + case TEST_SRC_PORT_CONNECTED_ERROR: + return BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR; default: break; } + + return BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK; } static -void src_port_disconnected(struct bt_private_component *private_component, - struct bt_private_port *private_port) +bt_component_class_port_connected_method_status sink_input_port_connected( + bt_self_component_sink *self_comp, + bt_self_component_port_input *self_comp_port, + const bt_port_output *other_port) { - int ret; struct event event = { - .type = COMP_PORT_DISCONNECTED, - .data.comp_port_disconnected = { - .comp = bt_component_from_private_component(private_component), - .port = bt_port_from_private_port(private_port), + .type = SINK_COMP_INPUT_PORT_CONNECTED, + .data.sink_comp_input_port_connected = { + .comp = bt_self_component_as_component( + bt_self_component_sink_as_self_component( + self_comp)), + .self_port = bt_self_component_port_as_port( + bt_self_component_port_input_as_self_component_port( + self_comp_port)), + .other_port = bt_port_output_as_port_const(other_port), }, }; - bt_put(event.data.comp_port_disconnected.comp); - bt_put(event.data.comp_port_disconnected.port); append_event(&event); - switch (current_test) { - case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT: - ret = bt_private_port_remove_from_component(private_port); - assert(ret == 0); - default: - break; + if (current_test == TEST_SINK_PORT_CONNECTED_ERROR) { + return BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_ERROR; + } else { + return BT_COMPONENT_CLASS_PORT_CONNECTED_METHOD_STATUS_OK; } } static -enum bt_component_status src_init(struct bt_private_component *priv_comp, - struct bt_value *params, void *init_method_data) -{ - int ret; - - ret = bt_private_component_source_add_output_private_port( - priv_comp, "out", NULL, NULL); - assert(ret == 0); - return BT_COMPONENT_STATUS_OK; -} - -static -enum bt_component_status sink_consume( - struct bt_private_component *priv_component) +bt_component_class_initialize_method_status src_init( + bt_self_component_source *self_comp, + bt_self_component_source_configuration *config, + const bt_value *params, void *init_method_data) { - struct bt_private_port *def_port; int ret; - switch (current_test) { - case TEST_SINK_REMOVES_PORT_IN_CONSUME: - case TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT: - def_port = bt_private_component_sink_get_input_private_port_by_name( - priv_component, "in"); - assert(def_port); - ret = bt_private_port_remove_from_component(def_port); - assert(ret == 0); - bt_put(def_port); - break; - default: - break; - } - - return BT_COMPONENT_STATUS_OK; -} - -static -void sink_port_connected(struct bt_private_component *private_component, - struct bt_private_port *self_private_port, - struct bt_port *other_port) -{ - struct event event = { - .type = COMP_PORT_CONNECTED, - .data.comp_port_connected = { - .comp = bt_component_from_private_component(private_component), - .self_port = bt_port_from_private_port(self_private_port), - .other_port = other_port, - }, - }; - - bt_put(event.data.comp_port_connected.comp); - bt_put(event.data.comp_port_connected.self_port); - append_event(&event); -} - -static -void sink_port_disconnected(struct bt_private_component *private_component, - struct bt_private_port *private_port) -{ - struct event event = { - .type = COMP_PORT_DISCONNECTED, - .data.comp_port_disconnected = { - .comp = bt_component_from_private_component(private_component), - .port = bt_port_from_private_port(private_port), - }, - }; - - bt_put(event.data.comp_port_disconnected.comp); - bt_put(event.data.comp_port_disconnected.port); - append_event(&event); + ret = bt_self_component_source_add_output_port( + self_comp, "out", NULL, NULL); + BT_ASSERT(ret == 0); + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; } static -enum bt_component_status sink_init(struct bt_private_component *priv_comp, - struct bt_value *params, void *init_method_data) +bt_component_class_initialize_method_status sink_init( + bt_self_component_sink *self_comp, + bt_self_component_sink_configuration *config, + const bt_value *params, void *init_method_data) { int ret; - ret = bt_private_component_sink_add_input_private_port(priv_comp, + ret = bt_self_component_sink_add_input_port(self_comp, "in", NULL, NULL); - assert(ret == 0); - return BT_COMPONENT_STATUS_OK; + BT_ASSERT(ret == 0); + return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK; } static -void graph_port_added(struct bt_port *port, - void *data) +bt_component_class_sink_consume_method_status sink_consume( + bt_self_component_sink *self_comp) { - struct bt_component *comp = bt_port_get_component(port); - - assert(comp); - bt_put(comp); - - struct event event = { - .type = GRAPH_PORT_ADDED, - .data.graph_port_added = { - .comp = comp, - .port = port, - }, - }; - - append_event(&event); + return BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_OK; } static -void graph_port_removed(struct bt_component *component, - struct bt_port *port, void *data) +bt_graph_listener_func_status graph_src_output_port_added( + const bt_component_source *comp, const bt_port_output *port, + void *data) { struct event event = { - .type = GRAPH_PORT_REMOVED, - .data.graph_port_removed = { - .comp = component, - .port = port, + .type = GRAPH_SRC_OUTPUT_PORT_ADDED, + .data.graph_src_output_port_added = { + .comp = bt_component_source_as_component_const(comp), + .port = bt_port_output_as_port_const(port), }, }; append_event(&event); -} -static -void graph_ports_connected(struct bt_port *upstream_port, - struct bt_port *downstream_port, void *data) -{ - struct bt_component *upstream_comp = - bt_port_get_component(upstream_port); - struct bt_component *downstream_comp = - bt_port_get_component(downstream_port); - struct bt_connection *conn = bt_port_get_connection(upstream_port); - - assert(upstream_comp); - assert(downstream_comp); - assert(conn); - bt_put(upstream_comp); - bt_put(downstream_comp); - bt_put(conn); - - struct event event = { - .type = GRAPH_PORTS_CONNECTED, - .data.graph_ports_connected = { - .upstream_comp = upstream_comp, - .downstream_comp = downstream_comp, - .upstream_port = upstream_port, - .downstream_port = downstream_port, - .conn = conn, - }, - }; - - append_event(&event); + return BT_GRAPH_LISTENER_FUNC_STATUS_OK; } static -void graph_ports_disconnected( - struct bt_component *upstream_comp, - struct bt_component *downstream_comp, - struct bt_port *upstream_port, struct bt_port *downstream_port, +bt_graph_listener_func_status graph_sink_input_port_added( + const bt_component_sink *comp, const bt_port_input *port, void *data) { struct event event = { - .type = GRAPH_PORTS_DISCONNECTED, - .data.graph_ports_disconnected = { - .upstream_comp = upstream_comp, - .downstream_comp = downstream_comp, - .upstream_port = upstream_port, - .downstream_port = downstream_port, + .type = GRAPH_SINK_INPUT_PORT_ADDED, + .data.graph_sink_input_port_added = { + .comp = bt_component_sink_as_component_const(comp), + .port = bt_port_input_as_port_const(port), }, }; append_event(&event); + + return BT_GRAPH_LISTENER_FUNC_STATUS_OK; } static @@ -548,89 +340,76 @@ void init_test(void) { int ret; - src_comp_class = bt_component_class_source_create("src", src_iter_next); - assert(src_comp_class); - ret = bt_component_class_set_init_method(src_comp_class, src_init); - assert(ret == 0); - ret = bt_component_class_set_accept_port_connection_method( - src_comp_class, accept_port_connection); - assert(ret == 0); - ret = bt_component_class_set_port_connected_method(src_comp_class, - src_port_connected); - assert(ret == 0); - ret = bt_component_class_set_port_disconnected_method( - src_comp_class, src_port_disconnected); - assert(ret == 0); - sink_comp_class = bt_component_class_sink_create("sink", sink_consume); - assert(sink_comp_class); - ret = bt_component_class_set_init_method(sink_comp_class, sink_init); - assert(ret == 0); - ret = bt_component_class_set_accept_port_connection_method( - sink_comp_class, accept_port_connection); - assert(ret == 0); - ret = bt_component_class_set_port_connected_method(sink_comp_class, - sink_port_connected); - assert(ret == 0); - ret = bt_component_class_set_port_disconnected_method(sink_comp_class, - sink_port_disconnected); - assert(ret == 0); - bt_component_class_freeze(src_comp_class); - bt_component_class_freeze(sink_comp_class); + msg_iter_class = bt_message_iterator_class_create(src_iter_next); + BT_ASSERT(msg_iter_class); + + src_comp_class = bt_component_class_source_create( + "src", msg_iter_class); + BT_ASSERT(src_comp_class); + ret = bt_component_class_source_set_initialize_method( + src_comp_class, src_init); + BT_ASSERT(ret == 0); + ret = bt_component_class_source_set_output_port_connected_method( + src_comp_class, src_output_port_connected); + BT_ASSERT(ret == 0); + sink_comp_class = bt_component_class_sink_create("sink", + sink_consume); + BT_ASSERT(sink_comp_class); + ret = bt_component_class_sink_set_initialize_method(sink_comp_class, + sink_init); + BT_ASSERT(ret == 0); + ret = bt_component_class_sink_set_input_port_connected_method( + sink_comp_class, sink_input_port_connected); + BT_ASSERT(ret == 0); events = g_array_new(FALSE, TRUE, sizeof(struct event)); - assert(events); + BT_ASSERT(events); } static void fini_test(void) { - bt_put(src_comp_class); - bt_put(sink_comp_class); + bt_component_class_source_put_ref(src_comp_class); + bt_component_class_sink_put_ref(sink_comp_class); g_array_free(events, TRUE); } static -struct bt_component *create_src(struct bt_graph *graph) +const bt_component_source *create_src(bt_graph *graph) { - struct bt_component *comp; + const bt_component_source *comp; int ret; - ret = bt_graph_add_component(graph, src_comp_class, "src-comp", NULL, - &comp); - assert(ret == 0); + ret = bt_graph_add_source_component(graph, src_comp_class, + "src-comp", NULL, BT_LOGGING_LEVEL_NONE, &comp); + BT_ASSERT(ret == 0); return comp; } static -struct bt_component *create_sink(struct bt_graph *graph) +const bt_component_sink *create_sink(bt_graph *graph) { - struct bt_component *comp; + const bt_component_sink *comp; int ret; - ret = bt_graph_add_component(graph, sink_comp_class, "sink-comp", - NULL, &comp); - assert(ret == 0); + ret = bt_graph_add_sink_component(graph, sink_comp_class, + "sink-comp", NULL, BT_LOGGING_LEVEL_NONE, &comp); + BT_ASSERT(ret == 0); return comp; } static -struct bt_graph *create_graph(void) +bt_graph *create_graph(void) { - struct bt_graph *graph = bt_graph_create(); + bt_graph *graph = bt_graph_create(0); int ret; - assert(graph); - ret = bt_graph_add_port_added_listener(graph, graph_port_added, NULL, - NULL); - assert(ret >= 0); - ret = bt_graph_add_port_removed_listener(graph, graph_port_removed, - NULL, NULL); - assert(ret >= 0); - ret = bt_graph_add_ports_connected_listener(graph, - graph_ports_connected, NULL, NULL); - assert(ret >= 0); - ret = bt_graph_add_ports_disconnected_listener(graph, - graph_ports_disconnected, NULL, NULL); - assert(ret >= 0); + BT_ASSERT(graph); + ret = bt_graph_add_source_component_output_port_added_listener( + graph, graph_src_output_port_added, NULL, NULL); + BT_ASSERT(ret >= 0); + ret = bt_graph_add_sink_component_input_port_added_listener( + graph, graph_sink_input_port_added, NULL, NULL); + BT_ASSERT(ret >= 0); return graph; } @@ -643,581 +422,310 @@ void prepare_test(enum test test, const char *name) } static -void test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port(void) +void test_src_adds_port_in_port_connected(void) { - int ret; - 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; + 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_output *src_hello_port; + const bt_port_input *sink_def_port; + const bt_port *gsrc_def_port; + const bt_port *gsrc_hello_port; + const bt_port *gsink_def_port; struct event event; - enum bt_graph_status status; - size_t src_accept_port_connection_pos; - size_t sink_accept_port_connection_pos; + bt_graph_connect_ports_status status; size_t src_port_connected_pos; - size_t sink_port_connected_pos; - size_t graph_ports_connected; - 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"); + size_t graph_port_added_src_pos; + + prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED, + "source adds port in port connected"); graph = create_graph(); - assert(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"); - assert(src_def_port); - sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); - assert(sink_def_port); - status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, - &conn); - assert(status == 0); - assert(conn); - - /* We're supposed to have 7 events so far */ - ok(events->len == 7, "we have the expected number of events (before consume)"); + 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); + src_hello_port = bt_component_source_borrow_output_port_by_name_const(src, + "hello"); + BT_ASSERT(src_hello_port); + 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); + gsrc_hello_port = bt_port_output_as_port_const(src_hello_port); + gsink_def_port = bt_port_input_as_port_const(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_PORT_ADDED; - event.data.graph_port_added.comp = src; - event.data.graph_port_added.port = src_def_port; + 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_PORT_ADDED; - event.data.graph_port_added.comp = sink; - event.data.graph_port_added.port = sink_def_port; + 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 = 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; + 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); + /* Graph's port added (source) */ + 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_hello_port; + ok(has_event(&event), "got the expected graph's port added event (for source)"); + graph_port_added_src_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; + 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_PORTS_CONNECTED; - event.data.graph_ports_connected.upstream_comp = src; - event.data.graph_ports_connected.downstream_comp = sink; - event.data.graph_ports_connected.upstream_port = src_def_port; - event.data.graph_ports_connected.downstream_port = sink_def_port; - event.data.graph_ports_connected.conn = conn; - ok(has_event(&event), "got the expected graph's ports connected event"); - graph_ports_connected = event_pos(&event); /* Order of events */ - ok(src_port_connected_pos < graph_ports_connected, - "event order is good (1)"); - ok(sink_port_connected_pos < graph_ports_connected, - "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); - 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 = 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); - - /* Sink's port disconnected */ - event.type = COMP_PORT_DISCONNECTED; - event.data.comp_port_disconnected.comp = sink; - event.data.comp_port_disconnected.port = sink_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_PORTS_DISCONNECTED; - event.data.graph_ports_disconnected.upstream_comp = src; - event.data.graph_ports_disconnected.downstream_comp = sink; - event.data.graph_ports_disconnected.upstream_port = src_def_port; - event.data.graph_ports_disconnected.downstream_port = sink_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_PORT_REMOVED; - event.data.graph_port_removed.comp = sink; - event.data.graph_port_removed.port = sink_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_PORT_REMOVED; - event.data.graph_port_removed.comp = src; - event.data.graph_port_removed.port = src_def_port; - ok(has_event(&event), "got the expected graph's port removed event (for source)"); - graph_port_removed_src_pos = event_pos(&event); + ok(src_port_connected_pos < graph_port_added_src_pos, + "event order is good"); - /* 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_put(graph); - bt_put(sink); - bt_put(src); - bt_put(conn); - bt_put(src_def_port); - bt_put(sink_def_port); + bt_component_source_put_ref(src); + bt_component_sink_put_ref(sink); + bt_graph_put_ref(graph); } static -void test_sink_removes_port_in_port_connected(void) +void test_simple(void) { - int ret; - 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; + 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; - 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 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"); + bt_graph_connect_ports_status status; + + prepare_test(TEST_SIMPLE, "simple"); graph = create_graph(); - assert(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"); - assert(src_def_port); - sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); - assert(sink_def_port); - status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, - &conn); - assert(status == 0); - - /* We're supposed to have 7 events so far */ - ok(events->len == 7, "we have the expected number of events (before consume)"); + 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 4 events */ + ok(events->len == 4, "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; + 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_PORT_ADDED; - event.data.graph_port_added.comp = sink; - event.data.graph_port_added.port = sink_def_port; + 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 = 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; + 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 = 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; + 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_PORTS_CONNECTED; - event.data.graph_ports_connected.upstream_comp = src; - event.data.graph_ports_connected.downstream_comp = sink; - event.data.graph_ports_connected.upstream_port = src_def_port; - event.data.graph_ports_connected.downstream_port = sink_def_port; - event.data.graph_ports_connected.conn = conn; - 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); - 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 = 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); - - /* Sink's port disconnected */ - event.type = COMP_PORT_DISCONNECTED; - event.data.comp_port_disconnected.comp = sink; - event.data.comp_port_disconnected.port = sink_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_PORTS_DISCONNECTED; - event.data.graph_ports_disconnected.upstream_comp = src; - event.data.graph_ports_disconnected.downstream_comp = sink; - event.data.graph_ports_disconnected.upstream_port = src_def_port; - event.data.graph_ports_disconnected.downstream_port = sink_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_PORT_REMOVED; - event.data.graph_port_removed.comp = sink; - event.data.graph_port_removed.port = sink_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_put(graph); - bt_put(sink); - bt_put(src); - bt_put(conn); - bt_put(src_def_port); - bt_put(sink_def_port); + bt_component_sink_put_ref(sink); + bt_graph_put_ref(graph); + bt_component_source_put_ref(src); } static -void test_src_adds_port_in_port_connected(void) +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_port *src_hello_port; - struct bt_connection *conn; + 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; + const 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 sink_port_connected_pos; - size_t graph_ports_connected_pos; - size_t graph_port_added_src_pos; + bt_graph_connect_ports_status status; - prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED, - "source adds port in port connected"); + prepare_test(TEST_SRC_PORT_CONNECTED_ERROR, "port connected error: source"); graph = create_graph(); - assert(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"); - assert(src_def_port); - sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); - assert(sink_def_port); - status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, - &conn); - assert(status == 0); - src_hello_port = bt_component_source_get_output_port_by_name(src, - "hello"); - assert(src_hello_port); - - /* We're supposed to have 8 events */ - ok(events->len == 8, "we have the expected number of events"); + 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, &conn); + ok(status != BT_GRAPH_CONNECT_PORTS_STATUS_OK, + "bt_graph_connect_ports() returns an error"); + bt_current_thread_clear_error(); + ok(!conn, "returned connection is still NULL"); + 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 3 events */ + ok(events->len == 3, "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; + 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_PORT_ADDED; - event.data.graph_port_added.comp = sink; - event.data.graph_port_added.port = sink_def_port; + 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 = 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; + 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); - - /* Graph's port added (source) */ - event.type = GRAPH_PORT_ADDED; - event.data.graph_port_added.comp = src; - event.data.graph_port_added.port = src_hello_port; - ok(has_event(&event), "got the expected graph's port added event (for source)"); - graph_port_added_src_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); - - /* Graph's ports connected */ - event.type = GRAPH_PORTS_CONNECTED; - event.data.graph_ports_connected.upstream_comp = src; - event.data.graph_ports_connected.downstream_comp = sink; - event.data.graph_ports_connected.upstream_port = src_def_port; - event.data.graph_ports_connected.downstream_port = sink_def_port; - event.data.graph_ports_connected.conn = conn; - ok(has_event(&event), "got the expected graph's port connected event (for source)"); - 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)"); - ok(src_port_connected_pos < graph_port_added_src_pos, - "event order is good (5)"); - ok(graph_port_added_src_pos < graph_ports_connected_pos, - "event order is good (6)"); - - bt_put(graph); - bt_put(sink); - bt_put(src); - bt_put(conn); - bt_put(src_def_port); - bt_put(sink_def_port); - bt_put(src_hello_port); + bt_graph_put_ref(graph); + bt_component_sink_put_ref(sink); + bt_component_source_put_ref(src); + bt_connection_put_ref(conn); } static -void test_simple(void) +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; + 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; + const 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 sink_port_connected_pos; - size_t graph_ports_connected_pos; + bt_graph_connect_ports_status status; - prepare_test(TEST_SIMPLE, "simple"); + prepare_test(TEST_SINK_PORT_CONNECTED_ERROR, "port connected error: sink"); graph = create_graph(); - assert(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"); - assert(src_def_port); - sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in"); - assert(sink_def_port); - status = bt_graph_connect_ports(graph, src_def_port, sink_def_port, - &conn); - assert(status == 0); - - /* We're supposed to have 7 events */ - ok(events->len == 7, "we have the expected number of events"); + 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, &conn); + ok(status != BT_GRAPH_CONNECT_PORTS_STATUS_OK, + "bt_graph_connect_ports() returns an error"); + bt_current_thread_clear_error(); + ok(!conn, "returned connection is still NULL"); + 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 4 events */ + ok(events->len == 4, "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; + 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_PORT_ADDED; - event.data.graph_port_added.comp = sink; - event.data.graph_port_added.port = sink_def_port; + 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 = 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; + 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 = 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; + 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 port connected */ - event.type = GRAPH_PORTS_CONNECTED; - event.data.graph_ports_connected.upstream_comp = src; - event.data.graph_ports_connected.downstream_comp = sink; - event.data.graph_ports_connected.upstream_port = src_def_port; - event.data.graph_ports_connected.downstream_port = sink_def_port; - event.data.graph_ports_connected.conn = conn; - 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)"); - - bt_put(graph); - bt_put(sink); - bt_put(src); - bt_put(conn); - bt_put(src_def_port); - bt_put(sink_def_port); + bt_connection_put_ref(conn); + bt_graph_put_ref(graph); + bt_component_sink_put_ref(sink); + bt_component_source_put_ref(src); } static void test_empty_graph(void) { - struct bt_graph *graph; + bt_graph *graph; prepare_test(TEST_EMPTY_GRAPH, "empty graph"); graph = create_graph(); ok(events->len == 0, "empty graph generates no events"); - bt_put(graph); + bt_graph_put_ref(graph); } int main(int argc, char **argv) @@ -1226,9 +734,9 @@ 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(); fini_test(); return exit_status(); }