COMMON_TEST_LDADD = \
$(top_builddir)/tests/utils/tap/libtap.la \
$(top_builddir)/tests/utils/libtestcommon.la \
+ $(top_builddir)/tests/lib/utils/liblib-utils.la \
$(top_builddir)/src/common/libbabeltrace2-common.la \
$(top_builddir)/src/logging/libbabeltrace2-logging.la
test_bt_values_LDADD = $(COMMON_TEST_LDADD) \
$(top_builddir)/src/lib/libbabeltrace2.la
+test_fields_bin_LDADD = $(COMMON_TEST_LDADD) \
+ $(top_builddir)/src/lib/libbabeltrace2.la
+
test_bt_uuid_LDADD = $(COMMON_TEST_LDADD)
test_trace_ir_ref_LDADD = $(COMMON_TEST_LDADD) \
test_bt_uuid \
test_bt_values \
test_graph_topo \
+ test_fields_bin \
test_remove_destruction_listener_in_destruction_listener \
test_simple_sink \
test_trace_ir_ref
test_bt_values_SOURCES = test_bt_values.c
+test_fields_bin_SOURCES = test_fields_bin.cpp
test_simple_sink_SOURCES = test_simple_sink.c
test_bt_uuid_SOURCES = test_bt_uuid.c
test_trace_ir_ref_SOURCES = test_trace_ir_ref.c
SUBDIRS += test-plugin-plugins
endif
-dist_check_SCRIPTS = test_plugin
+dist_check_SCRIPTS = test_plugin test_fields
if HAVE_PYTHON
if DEV_MODE
--- /dev/null
+/*
+ * SPDX-License-Identifier: GPL-2.0-only
+ *
+ * Copyright (C) 2023 EfficiOS Inc.
+ */
+
+#include "utils/run-in.hpp"
+#include "tap/tap.h"
+#include "common/assert.h"
+#include <cstring>
+
+static const int NR_TESTS = 2;
+
+static void test_string_clear()
+{
+ runInMsgIterClsInit([](bt_self_message_iterator * const self) {
+ /* Boilerplate to get a string field */
+ const auto traceCls =
+ bt_trace_class_create(bt_self_message_iterator_borrow_component(self));
+ const auto streamCls = bt_stream_class_create(traceCls);
+ const auto eventCls = bt_event_class_create(streamCls);
+ const auto payloadCls = bt_field_class_structure_create(traceCls);
+
+ {
+ const auto stringFieldCls = bt_field_class_string_create(traceCls);
+ const auto status =
+ bt_field_class_structure_append_member(payloadCls, "str", stringFieldCls);
+ BT_ASSERT(status == BT_FIELD_CLASS_STRUCTURE_APPEND_MEMBER_STATUS_OK);
+ bt_field_class_put_ref(stringFieldCls);
+ }
+
+ {
+ const auto status = bt_event_class_set_payload_field_class(eventCls, payloadCls);
+ BT_ASSERT(status == BT_EVENT_CLASS_SET_FIELD_CLASS_STATUS_OK);
+ }
+
+ const auto trace = bt_trace_create(traceCls);
+ const auto stream = bt_stream_create(streamCls, trace);
+ const auto msg = bt_message_event_create(self, eventCls, stream);
+ const auto field = bt_field_structure_borrow_member_field_by_name(
+ bt_event_borrow_payload_field(bt_message_event_borrow_event(msg)), "str");
+
+ /* Set the field to a known non-empty value */
+ {
+ const auto status = bt_field_string_set_value(field, "pomme");
+ BT_ASSERT(status == BT_FIELD_STRING_SET_VALUE_STATUS_OK);
+ BT_ASSERT(std::strcmp(bt_field_string_get_value(field), "pomme") == 0);
+ }
+
+ /* Clear the field, verify its value and length */
+ bt_field_string_clear(field);
+ ok(std::strcmp(bt_field_string_get_value(field), "") == 0, "string field is empty");
+ ok(bt_field_string_get_length(field) == 0, "string field length is 0");
+
+ bt_message_put_ref(msg);
+ bt_stream_put_ref(stream);
+ bt_trace_put_ref(trace);
+ bt_field_class_put_ref(payloadCls);
+ bt_event_class_put_ref(eventCls);
+ bt_stream_class_put_ref(streamCls);
+ bt_trace_class_put_ref(traceCls);
+ });
+}
+
+int main()
+{
+ plan_tests(NR_TESTS);
+
+ test_string_clear();
+
+ return exit_status();
+}
return BT_MESSAGE_ITERATOR_CLASS_NEXT_METHOD_STATUS_END;
}
+struct DummySinkData
+{
+ bt_message_iterator *msgIter;
+};
+
+static bt_component_class_initialize_method_status
+dummySinkInit(bt_self_component_sink * const self, bt_self_component_sink_configuration * const,
+ const bt_value * const, void * const initMethodData)
+{
+ const auto status = bt_self_component_sink_add_input_port(self, "in", NULL, nullptr);
+ BT_ASSERT(status == BT_SELF_COMPONENT_ADD_PORT_STATUS_OK);
+ bt_self_component_set_data(bt_self_component_sink_as_self_component(self), initMethodData);
+ return BT_COMPONENT_CLASS_INITIALIZE_METHOD_STATUS_OK;
+}
+
+static DummySinkData& dummySinkDataFromSelfCompSink(bt_self_component_sink * const self)
+{
+ return *static_cast<DummySinkData *>(
+ bt_self_component_get_data(bt_self_component_sink_as_self_component(self)));
+}
+
+static bt_component_class_sink_graph_is_configured_method_status
+dummySinkGraphIsConfigured(bt_self_component_sink *const self)
+{
+ auto& data = dummySinkDataFromSelfCompSink(self);
+ const auto port = bt_self_component_sink_borrow_input_port_by_name(self, "in");
+ BT_ASSERT(port);
+ const auto status = bt_message_iterator_create_from_sink_component(self, port, &data.msgIter);
+ BT_ASSERT(status == BT_MESSAGE_ITERATOR_CREATE_FROM_SINK_COMPONENT_STATUS_OK);
+ return BT_COMPONENT_CLASS_SINK_GRAPH_IS_CONFIGURED_METHOD_STATUS_OK;
+}
+
+static bt_component_class_sink_consume_method_status dummySinkConsume(bt_self_component_sink *const self)
+{
+ const auto& data = dummySinkDataFromSelfCompSink(self);
+ bt_message_array_const msgs;
+ uint64_t msgCount;
+ const auto status = bt_message_iterator_next(data.msgIter, &msgs, &msgCount);
+ BT_ASSERT(status == BT_MESSAGE_ITERATOR_NEXT_STATUS_END);
+ return BT_COMPONENT_CLASS_SINK_CONSUME_METHOD_STATUS_END;
+}
+
void runIn(RunInCompClsQueryFunc compClsCtxFunc, RunInCompClsInitFunc compCtxFunc,
RunInMsgIterClsInitFunc msgIterCtxFunc)
{
bt_query_executor_put_ref(queryExec);
}
+ /* Create a dummy sink component */
+ const auto sinkCompCls = bt_component_class_sink_create("dummy", dummySinkConsume);
+ BT_ASSERT(sinkCompCls);
+
+ {
+ const auto status =
+ bt_component_class_sink_set_initialize_method(sinkCompCls, dummySinkInit);
+ BT_ASSERT(status == BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK);
+ }
+
+ {
+ const auto status = bt_component_class_sink_set_graph_is_configured_method(
+ sinkCompCls, dummySinkGraphIsConfigured);
+ BT_ASSERT(status == BT_COMPONENT_CLASS_SET_METHOD_STATUS_OK);
+ }
+
/* Create graph */
const auto graph = bt_graph_create(0);
{
const auto status = bt_graph_add_source_component_with_initialize_method_data(
- graph, srcCompCls, "whatever", NULL, &data, BT_LOGGING_LEVEL_NONE, &srcComp);
+ graph, srcCompCls, "the-source", NULL, &data, BT_LOGGING_LEVEL_NONE, &srcComp);
BT_ASSERT(status == BT_GRAPH_ADD_COMPONENT_STATUS_OK);
}
- /* Find `sink.utils.dummy` component class */
- const bt_plugin *utilsPlugin = nullptr;
-
- {
- const auto status =
- bt_plugin_find("utils", BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, BT_TRUE, &utilsPlugin);
-
- BT_ASSERT(status == BT_PLUGIN_FIND_STATUS_OK);
- }
-
- /* Add `sink.utils.dummy` component */
+ /* Add dummy sink component */
const bt_component_sink *sinkComp;
+ DummySinkData dummySinkData;
{
- const auto dummyCompCls =
- bt_plugin_borrow_sink_component_class_by_name_const(utilsPlugin, "dummy");
-
- BT_ASSERT(dummyCompCls);
-
- const auto status = bt_graph_add_sink_component(graph, dummyCompCls, "the-sink", nullptr,
- BT_LOGGING_LEVEL_NONE, &sinkComp);
-
+ const auto status = bt_graph_add_sink_component_with_initialize_method_data(
+ graph, sinkCompCls, "the-sink", NULL, &dummySinkData, BT_LOGGING_LEVEL_NONE, &sinkComp);
BT_ASSERT(status == BT_GRAPH_ADD_COMPONENT_STATUS_OK);
}
BT_ASSERT(status == BT_GRAPH_RUN_STATUS_OK);
/* Discard plugin and graph */
- bt_plugin_put_ref(utilsPlugin);
bt_graph_put_ref(graph);
bt_component_class_source_put_ref(srcCompCls);
+ bt_component_class_sink_put_ref(sinkCompCls);
bt_message_iterator_class_put_ref(msgIterCls);
}