2 * SPDX-License-Identifier: GPL-2.0-only
4 * Copyright (C) 2019 Philippe Proulx <pproulx@efficios.com>
7 #include <babeltrace2/babeltrace.h>
8 #include "common/assert.h"
15 bt_graph_simple_sink_component_initialize_func_status init_status
;
16 bt_graph_simple_sink_component_consume_func_status consume_status
;
20 bt_graph_simple_sink_component_initialize_func_status
simple_INITIALIZE_func(
21 bt_message_iterator
*iterator
,
24 struct test_data
*test_data
= data
;
26 ok(iterator
, "Message iterator is not NULL in initialization function");
27 ok(data
, "Data is not NULL in initialization function");
28 return test_data
->init_status
;
32 bt_graph_simple_sink_component_consume_func_status
simple_consume_func(
33 bt_message_iterator
*iterator
,
36 struct test_data
*test_data
= data
;
38 ok(iterator
, "Message iterator is not NULL in consume function");
39 ok(data
, "Data is not NULL in consume function");
40 return test_data
->consume_status
;
44 void simple_fini_func(void *data
)
46 ok(data
, "Data is not NULL in finalization function");
50 bt_component_class_initialize_method_status
src_init(
51 bt_self_component_source
*self_comp
,
52 bt_self_component_source_configuration
*config
__attribute__((unused
)),
53 const bt_value
*params
__attribute__((unused
)),
54 void *init_method_data
__attribute__((unused
)))
56 bt_self_component_add_port_status status
;
58 status
= bt_self_component_source_add_output_port(self_comp
,
60 BT_ASSERT(status
== BT_SELF_COMPONENT_ADD_PORT_STATUS_OK
);
61 return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK
;
65 bt_message_iterator_class_next_method_status
src_iter_next(
66 bt_self_message_iterator
*message_iterator
__attribute__((unused
)),
67 bt_message_array_const msgs
__attribute__((unused
)),
68 uint64_t capacity
__attribute__((unused
)),
69 uint64_t *count
__attribute__((unused
)))
71 return BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END
;
75 bt_graph
*create_graph_with_source(const bt_port_output
**out_port
)
77 bt_message_iterator_class
*msg_iter_cls
;
78 bt_component_class_source
*src_comp_cls
;
80 const bt_component_source
*src_comp
= NULL
;
81 bt_graph_add_component_status add_comp_status
;
82 bt_component_class_set_method_status set_method_status
;
86 msg_iter_cls
= bt_message_iterator_class_create(src_iter_next
);
87 BT_ASSERT(msg_iter_cls
);
89 src_comp_cls
= bt_component_class_source_create("src", msg_iter_cls
);
90 BT_ASSERT(src_comp_cls
);
91 set_method_status
= bt_component_class_source_set_initialize_method(
92 src_comp_cls
, src_init
);
93 BT_ASSERT(set_method_status
== BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK
);
94 graph
= bt_graph_create(0);
96 add_comp_status
= bt_graph_add_source_component(graph
, src_comp_cls
,
97 "src", NULL
, BT_LOGGING_LEVEL_NONE
, &src_comp
);
98 BT_ASSERT(add_comp_status
== BT_GRAPH_ADD_COMPONENT_STATUS_OK
);
100 *out_port
= bt_component_source_borrow_output_port_by_index_const(
102 BT_ASSERT(*out_port
);
103 bt_component_class_source_put_ref(src_comp_cls
);
104 bt_message_iterator_class_put_ref(msg_iter_cls
);
109 void test_simple_expect_run_once_status(
110 bt_graph_simple_sink_component_initialize_func_status init_status
,
111 bt_graph_simple_sink_component_consume_func_status consume_status
,
112 bt_graph_run_once_status exp_run_once_status
)
114 const bt_port_output
*src_out_port
= NULL
;
116 const bt_component_sink
*sink_comp
= NULL
;
117 const bt_port_input
*sink_in_port
;
118 bt_graph_add_component_status add_comp_status
;
119 bt_graph_run_once_status run_once_status
;
120 bt_graph_connect_ports_status connect_status
;
121 struct test_data test_data
= {
122 .init_status
= init_status
,
123 .consume_status
= consume_status
,
125 const struct bt_error
*err
;
127 graph
= create_graph_with_source(&src_out_port
);
129 BT_ASSERT(src_out_port
);
131 add_comp_status
= bt_graph_add_simple_sink_component(graph
, "sink",
132 simple_INITIALIZE_func
, simple_consume_func
, simple_fini_func
,
133 &test_data
, &sink_comp
);
134 BT_ASSERT(add_comp_status
== BT_GRAPH_ADD_COMPONENT_STATUS_OK
);
135 BT_ASSERT(sink_comp
);
137 sink_in_port
= bt_component_sink_borrow_input_port_by_name_const(
140 "Simple sink component has an input port named \"in\"");
142 connect_status
= bt_graph_connect_ports(graph
, src_out_port
,
144 ok(connect_status
== BT_GRAPH_CONNECT_PORTS_STATUS_OK
,
145 "Simple sink component's \"in\" port is connectable");
147 run_once_status
= bt_graph_run_once(graph
);
148 ok(run_once_status
== exp_run_once_status
,
149 "Graph \"run once\" status is the expected one (status code: %d)",
152 err
= bt_current_thread_take_error();
153 ok((run_once_status
< 0) == (err
!= NULL
),
154 "Current thread error is set if bt_graph_run_once returned an error");
156 bt_graph_put_ref(graph
);
158 bt_error_release(err
);
164 plan_tests(NR_TESTS
);
166 /* Test initialization function status */
167 test_simple_expect_run_once_status(
168 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
169 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK
,
170 BT_GRAPH_RUN_ONCE_STATUS_OK
);
171 test_simple_expect_run_once_status(
172 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_ERROR
,
173 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK
,
174 BT_GRAPH_RUN_ONCE_STATUS_ERROR
);
175 test_simple_expect_run_once_status(
176 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_MEMORY_ERROR
,
177 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK
,
178 BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR
);
180 /* Test "consume" function status */
181 test_simple_expect_run_once_status(
182 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
183 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_OK
,
184 BT_GRAPH_RUN_ONCE_STATUS_OK
);
185 test_simple_expect_run_once_status(
186 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
187 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_ERROR
,
188 BT_GRAPH_RUN_ONCE_STATUS_ERROR
);
189 test_simple_expect_run_once_status(
190 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
191 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_MEMORY_ERROR
,
192 BT_GRAPH_RUN_ONCE_STATUS_MEMORY_ERROR
);
193 test_simple_expect_run_once_status(
194 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
195 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_AGAIN
,
196 BT_GRAPH_RUN_ONCE_STATUS_AGAIN
);
197 test_simple_expect_run_once_status(
198 BT_GRAPH_SIMPLE_SINK_COMPONENT_INITIALIZE_FUNC_STATUS_OK
,
199 BT_GRAPH_SIMPLE_SINK_COMPONENT_CONSUME_FUNC_STATUS_END
,
200 BT_GRAPH_RUN_ONCE_STATUS_END
);
202 return exit_status();