4 * CTF IR Reference Count test
6 * Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License as published by
10 * the Free Software Foundation; under version 2 of the License.
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
17 * You should have received a copy of the GNU General Public License along
18 * with this program; if not, write to the Free Software Foundation, Inc.,
19 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
22 #include <babeltrace/plugin/plugin.h>
23 #include <babeltrace/ref.h>
24 #include <babeltrace/values.h>
30 #include <linux/limits.h>
35 #define NON_EXISTING_PATH "/this/hopefully/does/not/exist/5bc75f8d-0dba-4043-a509-d7984b97e42b.so"
37 /* Those symbols are written to by some test plugins */
38 int test_plugin_init_called
;
39 int test_plugin_exit_called
;
41 static void reset_test_plugin_symbols(void)
43 test_plugin_init_called
= 0;
44 test_plugin_exit_called
= 0;
47 static char *get_test_plugin_path(const char *plugin_dir
,
48 const char *plugin_name
)
50 GString
*path
= g_string_new(plugin_dir
);
54 g_string_append_printf(path
, "/plugin-%s.so", plugin_name
);
56 g_string_free(path
, FALSE
);
60 static void test_invalid(const char *plugin_dir
)
62 struct bt_plugin
**plugins
;
64 plugins
= bt_plugin_create_all_from_file(NON_EXISTING_PATH
);
65 ok(!plugins
, "bt_plugin_create_all_from_file() fails with a non-existing file");
67 plugins
= bt_plugin_create_all_from_file(plugin_dir
);
68 ok(!plugins
, "bt_plugin_create_all_from_file() fails with a directory");
70 ok(!bt_plugin_create_all_from_file(NULL
),
71 "bt_plugin_create_all_from_file() handles NULL correctly");
72 ok(!bt_plugin_create_all_from_dir(NULL
, false),
73 "bt_plugin_create_all_from_dir() handles NULL correctly");
74 ok(!bt_plugin_get_name(NULL
),
75 "bt_plugin_get_name() handles NULL correctly");
76 ok(!bt_plugin_get_description(NULL
),
77 "bt_plugin_get_description() handles NULL correctly");
78 ok(bt_plugin_get_version(NULL
, NULL
, NULL
, NULL
, NULL
) !=
80 "bt_plugin_get_version() handles NULL correctly");
81 ok(!bt_plugin_get_author(NULL
),
82 "bt_plugin_get_author() handles NULL correctly");
83 ok(!bt_plugin_get_license(NULL
),
84 "bt_plugin_get_license() handles NULL correctly");
85 ok(!bt_plugin_get_path(NULL
),
86 "bt_plugin_get_path() handles NULL correctly");
87 ok(bt_plugin_get_component_class_count(NULL
) < 0,
88 "bt_plugin_get_component_class_count() handles NULL correctly");
89 ok(!bt_plugin_get_component_class(NULL
, 0),
90 "bt_plugin_get_component_class() handles NULL correctly");
91 ok(!bt_plugin_get_component_class_by_name_and_type(NULL
, NULL
, 0),
92 "bt_plugin_get_component_class_by_name_and_type() handles NULL correctly");
95 static void test_minimal(const char *plugin_dir
)
97 struct bt_plugin
**plugins
;
98 struct bt_plugin
*plugin
;
99 char *minimal_path
= get_test_plugin_path(plugin_dir
, "minimal");
101 assert(minimal_path
);
102 diag("minimal plugin test below");
104 reset_test_plugin_symbols();
105 plugins
= bt_plugin_create_all_from_file(minimal_path
);
106 ok(plugins
&& plugins
[0], "bt_plugin_create_all_from_file() succeeds with a valid file");
107 ok(test_plugin_init_called
, "plugin's initialization function is called during bt_plugin_create_all_from_file()");
108 ok(plugins
&& plugins
[0] && !plugins
[1],
109 "bt_plugin_create_all_from_file() returns the expected number of plugins");
111 ok(strcmp(bt_plugin_get_name(plugin
), "test_minimal") == 0,
112 "bt_plugin_get_name() returns the expected name");
113 ok(strcmp(bt_plugin_get_description(plugin
),
114 "Minimal Babeltrace plugin with no component classes") == 0,
115 "bt_plugin_get_description() returns the expected description");
116 ok(bt_plugin_get_version(plugin
, NULL
, NULL
, NULL
, NULL
) !=
118 "bt_plugin_get_version() fails when there's no version");
119 ok(strcmp(bt_plugin_get_author(plugin
), "Janine Sutto") == 0,
120 "bt_plugin_get_author() returns the expected author");
121 ok(strcmp(bt_plugin_get_license(plugin
), "Beerware") == 0,
122 "bt_plugin_get_license() returns the expected license");
123 ok(strcmp(bt_plugin_get_path(plugin
), minimal_path
) == 0,
124 "bt_plugin_get_path() returns the expected path");
125 ok(bt_plugin_get_component_class_count(plugin
) == 0,
126 "bt_plugin_get_component_class_count() returns the expected value");
128 ok(test_plugin_exit_called
, "plugin's exit function is called when the plugin is destroyed");
134 static void test_sfs(const char *plugin_dir
)
136 struct bt_plugin
**plugins
;
137 struct bt_plugin
*plugin
;
138 struct bt_component_class
*sink_comp_class
;
139 struct bt_component_class
*source_comp_class
;
140 struct bt_component_class
*filter_comp_class
;
141 struct bt_component
*sink_component
;
142 char *sfs_path
= get_test_plugin_path(plugin_dir
, "sfs");
143 unsigned int major
, minor
, patch
;
147 diag("sfs plugin test below");
149 plugins
= bt_plugin_create_all_from_file(sfs_path
);
150 assert(plugins
&& plugins
[0]);
152 ok(bt_plugin_get_version(plugin
, &major
, &minor
, &patch
, &extra
) ==
154 "bt_plugin_get_version() succeeds when there's a version");
156 "bt_plugin_get_version() returns the expected major version");
158 "bt_plugin_get_version() returns the expected minor version");
160 "bt_plugin_get_version() returns the expected patch version");
161 ok(strcmp(extra
, "yes") == 0,
162 "bt_plugin_get_version() returns the expected extra version");
163 ok(bt_plugin_get_component_class_count(plugin
) == 3,
164 "bt_plugin_get_component_class_count() returns the expected value");
166 source_comp_class
= bt_plugin_get_component_class_by_name_and_type(
167 plugin
, "source", BT_COMPONENT_CLASS_TYPE_SOURCE
);
168 ok(source_comp_class
,
169 "bt_plugin_get_component_class_by_name_and_type() finds a source component class");
171 sink_comp_class
= bt_plugin_get_component_class_by_name_and_type(
172 plugin
, "sink", BT_COMPONENT_CLASS_TYPE_SINK
);
174 "bt_plugin_get_component_class_by_name_and_type() finds a sink component class");
175 ok(strcmp(bt_component_class_get_help(sink_comp_class
),
176 "Bacon ipsum dolor amet strip steak cupim pastrami venison shoulder.\n"
177 "Prosciutto beef ribs flank meatloaf pancetta brisket kielbasa drumstick\n"
178 "venison tenderloin cow tail. Beef short loin shoulder meatball, sirloin\n"
179 "ground round brisket salami cupim pork bresaola turkey bacon boudin.\n") == 0,
180 "bt_component_class_get_help() returns the expected help text");
182 filter_comp_class
= bt_plugin_get_component_class_by_name_and_type(
183 plugin
, "filter", BT_COMPONENT_CLASS_TYPE_FILTER
);
184 ok(filter_comp_class
,
185 "bt_plugin_get_component_class_by_name_and_type() finds a filter component class");
186 ok(!bt_plugin_get_component_class_by_name_and_type(plugin
, "filter",
187 BT_COMPONENT_CLASS_TYPE_SOURCE
),
188 "bt_plugin_get_component_class_by_name_and_type() does not find a component class given the wrong type");
190 diag("> putting the plugin object here");
192 sink_component
= bt_component_create(sink_comp_class
, NULL
, bt_value_null
);
193 ok(sink_component
, "bt_component_create() still works after the plugin object is destroyed");
194 BT_PUT(sink_component
);
195 BT_PUT(source_comp_class
);
196 sink_component
= bt_component_create(sink_comp_class
, NULL
, bt_value_null
);
197 ok(sink_component
, "bt_component_create() still works after the source component class object is destroyed");
198 BT_PUT(sink_component
);
199 BT_PUT(filter_comp_class
);
200 sink_component
= bt_component_create(sink_comp_class
, NULL
, bt_value_null
);
201 ok(sink_component
, "bt_component_create() still works after the filter component class object is destroyed");
202 BT_PUT(sink_comp_class
);
203 BT_PUT(sink_component
);
209 static void test_create_all_from_dir(const char *plugin_dir
)
211 struct bt_plugin
**plugins
;
212 struct bt_plugin
*plugin
;
215 diag("create from all test below");
217 plugins
= bt_plugin_create_all_from_dir(NON_EXISTING_PATH
, false);
219 "bt_plugin_create_all_from_dir() fails with an invalid path");
221 plugins
= bt_plugin_create_all_from_dir(plugin_dir
, false);
222 ok(plugins
, "bt_plugin_create_all_from_dir() succeeds with a valid path");
225 while ((plugin
= plugins
[i
])) {
230 /* 2 or 4, if `.la` files are considered or not */
231 ok(i
== 2 || i
== 4, "bt_plugin_create_all_from_dir() returns the expected number of plugin objects");
236 static void test_create_from_name(const char *plugin_dir
)
238 struct bt_plugin
*plugin
;
241 ok(!bt_plugin_create_from_name(NULL
),
242 "bt_plugin_create_from_name() handles NULL");
243 ok(!bt_plugin_create_from_name(NON_EXISTING_PATH
),
244 "bt_plugin_create_from_name() returns NULL with an unknown plugin name");
245 plugin_path
= malloc(PATH_MAX
* 5);
247 sprintf(plugin_path
, "%s:/ec1d09e5-696c-442e-b1c3-f9c6cf7f5958:::%s:8db46494-a398-466a-9649-c765ae077629:",
248 NON_EXISTING_PATH
, plugin_dir
);
249 setenv("BABELTRACE_PLUGIN_PATH", plugin_path
, 1);
250 plugin
= bt_plugin_create_from_name("test_minimal");
252 "bt_plugin_create_from_name() succeeds with a plugin name it can find");
253 ok(strcmp(bt_plugin_get_author(plugin
), "Janine Sutto") == 0,
254 "bt_plugin_create_from_name() finds the correct plugin for a given name");
259 int main(int argc
, char **argv
)
262 const char *plugin_dir
;
265 puts("Usage: test_plugin plugin_directory");
270 plugin_dir
= argv
[1];
271 plan_tests(NR_TESTS
);
272 test_invalid(plugin_dir
);
273 test_minimal(plugin_dir
);
274 test_sfs(plugin_dir
);
275 test_create_all_from_dir(plugin_dir
);
276 test_create_from_name(plugin_dir
);