lib: make the "port connected" method return a status
[babeltrace.git] / tests / lib / test_graph_topo.c
index 058da9e8ce6783e85abfa3bf58d1ce1c8ce81431..c34821a60cab0e67b14c235636b7d2c31a85f150 100644 (file)
@@ -17,6 +17,7 @@
  * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
  */
 
+#include <babeltrace/ref.h>
 #include <babeltrace/graph/component-class.h>
 #include <babeltrace/graph/component-class-source.h>
 #include <babeltrace/graph/component-class-sink.h>
 #include <stdlib.h>
 #include <string.h>
 #include <stdbool.h>
-#include <assert.h>
+#include <babeltrace/assert-internal.h>
 #include <glib.h>
 
 #include "tap/tap.h"
 
-#define NR_TESTS       69
+#define NR_TESTS       99
 
 enum event_type {
        COMP_ACCEPT_PORT_CONNECTION,
@@ -54,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,
@@ -245,7 +248,7 @@ bool compare_events(struct event *ev_a, struct event *ev_b)
                        }
                        break;
                default:
-                       assert(false);
+                       abort();
        }
 
        return true;
@@ -280,18 +283,16 @@ size_t event_pos(struct event *event)
                }
        }
 
-       return -1ULL;
+       return SIZE_MAX;
 }
 
 static
-struct bt_notification_iterator_next_return src_iter_next(
-               struct bt_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_return ret = {
-               .status = BT_NOTIFICATION_ITERATOR_STATUS_ERROR,
-       };
-
-       return ret;
+       return BT_NOTIFICATION_ITERATOR_STATUS_ERROR;
 }
 
 static
@@ -303,48 +304,48 @@ enum bt_component_status accept_port_connection(
        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),
+                       .comp = bt_component_borrow_from_private(private_component),
+                       .self_port = bt_port_borrow_from_private(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,
+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)
 {
-       struct bt_private_port *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),
+                       .comp = bt_component_borrow_from_private(private_component),
+                       .self_port = bt_port_borrow_from_private(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);
 
        switch (current_test) {
        case TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED:
-               port = bt_private_component_source_add_output_private_port(
-                       private_component, "hello", NULL);
-               assert(port);
-               bt_put(port);
+               ret = bt_private_component_source_add_output_private_port(
+                       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
@@ -355,19 +356,17 @@ void src_port_disconnected(struct bt_private_component *private_component,
        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),
+                       .comp = bt_component_borrow_from_private(private_component),
+                       .port = bt_port_borrow_from_private(private_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);
+               BT_ASSERT(ret == 0);
        default:
                break;
        }
@@ -377,12 +376,11 @@ static
 enum bt_component_status src_init(struct bt_private_component *priv_comp,
        struct bt_value *params, void *init_method_data)
 {
-       void *priv_port;
+       int ret;
 
-       priv_port = bt_private_component_source_add_output_private_port(
-               priv_comp, "out", NULL);
-       assert(priv_port);
-       bt_put(priv_port);
+       ret = bt_private_component_source_add_output_private_port(
+               priv_comp, "out", NULL, NULL);
+       BT_ASSERT(ret == 0);
        return BT_COMPONENT_STATUS_OK;
 }
 
@@ -398,9 +396,9 @@ enum bt_component_status sink_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);
+               BT_ASSERT(def_port);
                ret = bt_private_port_remove_from_component(def_port);
-               assert(ret == 0);
+               BT_ASSERT(ret == 0);
                bt_put(def_port);
                break;
        default:
@@ -411,22 +409,27 @@ 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)
 {
        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),
+                       .comp = bt_component_borrow_from_private(private_component),
+                       .self_port = bt_port_borrow_from_private(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);
+
+       if (current_test == TEST_SINK_PORT_CONNECTED_ERROR) {
+               return BT_COMPONENT_STATUS_ERROR;
+       } else {
+               return BT_COMPONENT_STATUS_OK;
+       }
 }
 
 static
@@ -436,13 +439,11 @@ void sink_port_disconnected(struct bt_private_component *private_component,
        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),
+                       .comp = bt_component_borrow_from_private(private_component),
+                       .port = bt_port_borrow_from_private(private_port),
                },
        };
 
-       bt_put(event.data.comp_port_disconnected.comp);
-       bt_put(event.data.comp_port_disconnected.port);
        append_event(&event);
 }
 
@@ -450,12 +451,11 @@ static
 enum bt_component_status sink_init(struct bt_private_component *priv_comp,
        struct bt_value *params, void *init_method_data)
 {
-       void *priv_port;
+       int ret;
 
-       priv_port = bt_private_component_sink_add_input_private_port(priv_comp,
-               "in", NULL);
-       assert(priv_port);
-       bt_put(priv_port);
+       ret = bt_private_component_sink_add_input_private_port(priv_comp,
+               "in", NULL, NULL);
+       BT_ASSERT(ret == 0);
        return BT_COMPONENT_STATUS_OK;
 }
 
@@ -465,7 +465,7 @@ void graph_port_added(struct bt_port *port,
 {
        struct bt_component *comp = bt_port_get_component(port);
 
-       assert(comp);
+       BT_ASSERT(comp);
        bt_put(comp);
 
        struct event event = {
@@ -504,9 +504,9 @@ void graph_ports_connected(struct bt_port *upstream_port,
                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_ASSERT(upstream_comp);
+       BT_ASSERT(downstream_comp);
+       BT_ASSERT(conn);
        bt_put(upstream_comp);
        bt_put(downstream_comp);
        bt_put(conn);
@@ -551,35 +551,35 @@ void init_test(void)
        int ret;
 
        src_comp_class = bt_component_class_source_create("src", src_iter_next);
-       assert(src_comp_class);
+       BT_ASSERT(src_comp_class);
        ret = bt_component_class_set_init_method(src_comp_class, src_init);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_accept_port_connection_method(
                src_comp_class, accept_port_connection);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_port_connected_method(src_comp_class,
                src_port_connected);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_port_disconnected_method(
                src_comp_class, src_port_disconnected);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        sink_comp_class = bt_component_class_sink_create("sink", sink_consume);
-       assert(sink_comp_class);
+       BT_ASSERT(sink_comp_class);
        ret = bt_component_class_set_init_method(sink_comp_class, sink_init);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_accept_port_connection_method(
                sink_comp_class, accept_port_connection);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_port_connected_method(sink_comp_class,
                sink_port_connected);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        ret = bt_component_class_set_port_disconnected_method(sink_comp_class,
                sink_port_disconnected);
-       assert(ret == 0);
+       BT_ASSERT(ret == 0);
        bt_component_class_freeze(src_comp_class);
        bt_component_class_freeze(sink_comp_class);
        events = g_array_new(FALSE, TRUE, sizeof(struct event));
-       assert(events);
+       BT_ASSERT(events);
 }
 
 static
@@ -591,22 +591,26 @@ void fini_test(void)
 }
 
 static
-struct bt_component *create_src(void)
+struct bt_component *create_src(struct bt_graph *graph)
 {
-       struct bt_component *comp =
-               bt_component_create(src_comp_class, "src-comp", NULL);
+       struct bt_component *comp;
+       int ret;
 
-       assert(comp);
+       ret = bt_graph_add_component(graph, src_comp_class, "src-comp", NULL,
+               &comp);
+       BT_ASSERT(ret == 0);
        return comp;
 }
 
 static
-struct bt_component *create_sink(void)
+struct bt_component *create_sink(struct bt_graph *graph)
 {
-       struct bt_component *comp =
-               bt_component_create(sink_comp_class, "sink-comp", NULL);
+       struct bt_component *comp;
+       int ret;
 
-       assert(comp);
+       ret = bt_graph_add_component(graph, sink_comp_class, "sink-comp",
+               NULL, &comp);
+       BT_ASSERT(ret == 0);
        return comp;
 }
 
@@ -616,18 +620,19 @@ struct bt_graph *create_graph(void)
        struct bt_graph *graph = bt_graph_create();
        int ret;
 
-       assert(graph);
-       ret = bt_graph_add_port_added_listener(graph, graph_port_added, NULL);
-       assert(ret == 0);
-       ret = bt_graph_add_port_removed_listener(graph, graph_port_removed,
+       BT_ASSERT(graph);
+       ret = bt_graph_add_port_added_listener(graph, graph_port_added, NULL,
                NULL);
-       assert(ret == 0);
-       ret = bt_graph_add_ports_connected_listener(graph, graph_ports_connected,
-               NULL);
-       assert(ret == 0);
+       BT_ASSERT(ret >= 0);
+       ret = bt_graph_add_port_removed_listener(graph, graph_port_removed,
+               NULL, NULL);
+       BT_ASSERT(ret >= 0);
+       ret = bt_graph_add_ports_connected_listener(graph,
+               graph_ports_connected, NULL, NULL);
+       BT_ASSERT(ret >= 0);
        ret = bt_graph_add_ports_disconnected_listener(graph,
-               graph_ports_disconnected, NULL);
-       assert(ret == 0);
+               graph_ports_disconnected, NULL, NULL);
+       BT_ASSERT(ret >= 0);
        return graph;
 }
 
@@ -650,6 +655,7 @@ void test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port
        struct bt_port *sink_def_port;
        struct bt_connection *conn;
        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;
@@ -663,18 +669,33 @@ void test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port
 
        prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME_THEN_SRC_REMOVES_DISCONNECTED_PORT,
                "sink removes port in consume, then source removes disconnected port");
-       src = create_src();
-       sink = create_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");
-       assert(src_def_port);
+       BT_ASSERT(src_def_port);
        sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
-       assert(sink_def_port);
-       conn = bt_graph_connect_ports(graph, src_def_port, sink_def_port);
-       assert(conn);
+       BT_ASSERT(sink_def_port);
+       status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
+               &conn);
+       BT_ASSERT(status == 0);
+       BT_ASSERT(conn);
 
-       /* We're supposed to have 5 events so far */
-       ok(events->len == 5, "we have the expected number of events (before consume)");
+       /* 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_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;
@@ -731,7 +752,7 @@ void test_sink_removes_port_in_port_connected_then_src_removes_disconnected_port
        /* Consume sink once */
        clear_events();
        ret = bt_graph_consume(graph);
-       assert(ret == 0);
+       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)");
@@ -812,6 +833,7 @@ void test_sink_removes_port_in_port_connected(void)
        struct bt_port *sink_def_port;
        struct bt_connection *conn;
        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;
@@ -824,18 +846,32 @@ void test_sink_removes_port_in_port_connected(void)
 
        prepare_test(TEST_SINK_REMOVES_PORT_IN_CONSUME,
                "sink removes port in consume");
-       src = create_src();
-       sink = create_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");
-       assert(src_def_port);
+       BT_ASSERT(src_def_port);
        sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
-       assert(sink_def_port);
-       conn = bt_graph_connect_ports(graph, src_def_port, sink_def_port);
-       assert(conn);
+       BT_ASSERT(sink_def_port);
+       status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
+               &conn);
+       BT_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)");
 
-       /* We're supposed to have 5 events so far */
-       ok(events->len == 5, "we have the expected number of events (before consume)");
+       /* 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;
@@ -892,7 +928,7 @@ void test_sink_removes_port_in_port_connected(void)
        /* Consume sink once */
        clear_events();
        ret = bt_graph_consume(graph);
-       assert(ret == 0);
+       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)");
@@ -958,6 +994,7 @@ void test_src_adds_port_in_port_connected(void)
        struct bt_port *src_hello_port;
        struct bt_connection *conn;
        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;
@@ -967,21 +1004,35 @@ void test_src_adds_port_in_port_connected(void)
 
        prepare_test(TEST_SRC_ADDS_PORT_IN_PORT_CONNECTED,
                "source adds port in port connected");
-       src = create_src();
-       sink = create_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");
-       assert(src_def_port);
+       BT_ASSERT(src_def_port);
        sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
-       assert(sink_def_port);
-       conn = bt_graph_connect_ports(graph, src_def_port, sink_def_port);
-       assert(conn);
+       BT_ASSERT(sink_def_port);
+       status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
+               &conn);
+       BT_ASSERT(status == 0);
        src_hello_port = bt_component_source_get_output_port_by_name(src,
                "hello");
-       assert(src_hello_port);
+       BT_ASSERT(src_hello_port);
 
-       /* We're supposed to have 6 events */
-       ok(events->len == 6, "we have the expected number of events");
+       /* We're supposed to have 8 events */
+       ok(events->len == 8, "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;
@@ -1065,6 +1116,7 @@ void test_simple(void)
        struct bt_port *sink_def_port;
        struct bt_connection *conn;
        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;
@@ -1072,18 +1124,32 @@ void test_simple(void)
        size_t graph_ports_connected_pos;
 
        prepare_test(TEST_SIMPLE, "simple");
-       src = create_src();
-       sink = create_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");
-       assert(src_def_port);
+       BT_ASSERT(src_def_port);
        sink_def_port = bt_component_sink_get_input_port_by_name(sink, "in");
-       assert(sink_def_port);
-       conn = bt_graph_connect_ports(graph, src_def_port, sink_def_port);
-       assert(conn);
+       BT_ASSERT(sink_def_port);
+       status = bt_graph_connect_ports(graph, src_def_port, sink_def_port,
+               &conn);
+       BT_ASSERT(status == 0);
 
-       /* We're supposed to have 5 events */
-       ok(events->len == 5, "we have the expected number of events");
+       /* We're supposed to have 7 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;
@@ -1145,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)
 {
@@ -1162,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();
This page took 0.036645 seconds and 4 git commands to generate.