lib: make plugin API const-correct
[babeltrace.git] / tests / lib / test_plugin.c
CommitLineData
cbb9e0b1 1/*
cbb9e0b1
PP
2 * Copyright (c) 2017 Philippe Proulx <pproulx@efficios.com>
3 *
4 * This program is free software; you can redistribute it and/or modify
5 * it under the terms of the GNU General Public License as published by
6 * the Free Software Foundation; under version 2 of the License.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License along
14 * with this program; if not, write to the Free Software Foundation, Inc.,
15 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
16 */
17
d94d92ac 18#include <babeltrace/babeltrace.h>
cbb9e0b1
PP
19#include <stdlib.h>
20#include <string.h>
21#include <stdio.h>
25583cd0 22#include <babeltrace/assert-internal.h>
cbb9e0b1
PP
23#include <glib.h>
24#include "tap/tap.h"
25#include "common.h"
26
d94d92ac 27#define NR_TESTS 35
cbb9e0b1
PP
28#define NON_EXISTING_PATH "/this/hopefully/does/not/exist/5bc75f8d-0dba-4043-a509-d7984b97e42b.so"
29
30/* Those symbols are written to by some test plugins */
df5b5d01
PP
31static int check_env_var(const char *name)
32{
33 const char *val = getenv(name);
34
35 if (!val) {
36 return -1;
37 }
38
39 return atoi(val);
40}
cbb9e0b1 41
df5b5d01 42static void reset_test_plugin_env_vars(void)
cbb9e0b1 43{
fbb2f0da
MJ
44 g_setenv("BT_TEST_PLUGIN_INIT_CALLED", "0", 1);
45 g_setenv("BT_TEST_PLUGIN_EXIT_CALLED", "0", 1);
cbb9e0b1
PP
46}
47
48static char *get_test_plugin_path(const char *plugin_dir,
49 const char *plugin_name)
50{
cbb9e0b1 51 char *ret;
84095ea4
MJ
52 char *plugin_file_name;
53
54 if (asprintf(&plugin_file_name, "plugin-%s." G_MODULE_SUFFIX,
55 plugin_name) == -1) {
56 abort();
57 }
58
59 ret = g_build_filename(plugin_dir, plugin_file_name, NULL);
60 free(plugin_file_name);
cbb9e0b1 61
cbb9e0b1
PP
62 return ret;
63}
64
cbb9e0b1
PP
65static void test_minimal(const char *plugin_dir)
66{
92fed4e1
PP
67 const struct bt_plugin_set *plugin_set;
68 const struct bt_plugin *plugin;
cbb9e0b1
PP
69 char *minimal_path = get_test_plugin_path(plugin_dir, "minimal");
70
25583cd0 71 BT_ASSERT(minimal_path);
cbb9e0b1
PP
72 diag("minimal plugin test below");
73
df5b5d01 74 reset_test_plugin_env_vars();
a8ff38ef
PP
75 plugin_set = bt_plugin_create_all_from_file(minimal_path);
76 ok(plugin_set && bt_plugin_set_get_plugin_count(plugin_set) == 1,
77 "bt_plugin_create_all_from_file() succeeds with a valid file");
df5b5d01
PP
78 ok(check_env_var("BT_TEST_PLUGIN_INIT_CALLED") == 1,
79 "plugin's initialization function is called during bt_plugin_create_all_from_file()");
a8ff38ef 80 ok(bt_plugin_set_get_plugin_count(plugin_set) == 1,
6ba0b073 81 "bt_plugin_create_all_from_file() returns the expected number of plugins");
92fed4e1 82 plugin = bt_plugin_set_borrow_plugin_by_index_const(plugin_set, 0);
6ba0b073 83 ok(strcmp(bt_plugin_get_name(plugin), "test_minimal") == 0,
cbb9e0b1
PP
84 "bt_plugin_get_name() returns the expected name");
85 ok(strcmp(bt_plugin_get_description(plugin),
86 "Minimal Babeltrace plugin with no component classes") == 0,
87 "bt_plugin_get_description() returns the expected description");
d94d92ac
PP
88 ok(bt_plugin_get_version(plugin, NULL, NULL, NULL, NULL) ==
89 BT_PROPERTY_AVAILABILITY_NOT_AVAILABLE,
458e8e1d 90 "bt_plugin_get_version() fails when there's no version");
cbb9e0b1
PP
91 ok(strcmp(bt_plugin_get_author(plugin), "Janine Sutto") == 0,
92 "bt_plugin_get_author() returns the expected author");
93 ok(strcmp(bt_plugin_get_license(plugin), "Beerware") == 0,
94 "bt_plugin_get_license() returns the expected license");
95 ok(strcmp(bt_plugin_get_path(plugin), minimal_path) == 0,
96 "bt_plugin_get_path() returns the expected path");
d94d92ac
PP
97 ok(bt_plugin_get_source_component_class_count(plugin) == 0,
98 "bt_plugin_get_source_component_class_count() returns the expected value");
99 ok(bt_plugin_get_filter_component_class_count(plugin) == 0,
100 "bt_plugin_get_filter_component_class_count() returns the expected value");
101 ok(bt_plugin_get_sink_component_class_count(plugin) == 0,
102 "bt_plugin_get_sink_component_class_count() returns the expected value");
65300d60 103 bt_object_put_ref(plugin_set);
df5b5d01
PP
104 ok(check_env_var("BT_TEST_PLUGIN_EXIT_CALLED") == 1,
105 "plugin's exit function is called when the plugin is destroyed");
cbb9e0b1
PP
106
107 free(minimal_path);
108}
109
110static void test_sfs(const char *plugin_dir)
111{
92fed4e1
PP
112 const struct bt_plugin_set *plugin_set;
113 const struct bt_plugin *plugin;
d94d92ac
PP
114 struct bt_component_class_sink *sink_comp_class;
115 struct bt_component_class_source *source_comp_class;
116 struct bt_component_class_filter *filter_comp_class;
117 struct bt_component_sink *sink_component;
cbb9e0b1 118 char *sfs_path = get_test_plugin_path(plugin_dir, "sfs");
458e8e1d
PP
119 unsigned int major, minor, patch;
120 const char *extra;
05e21286
PP
121 struct bt_value *params;
122 const struct bt_value *results;
123 const struct bt_value *object;
124 const struct bt_value *res_params;
a2d06fd5 125 struct bt_private_graph *graph;
a67681c1 126 const char *object_str;
c3c69044 127 enum bt_graph_status graph_ret;
d94d92ac
PP
128 struct bt_private_query_executor *query_exec =
129 bt_private_query_executor_create();
c7eee084 130 int ret;
cbb9e0b1 131
25583cd0
PP
132 BT_ASSERT(query_exec);
133 BT_ASSERT(sfs_path);
cbb9e0b1
PP
134 diag("sfs plugin test below");
135
a8ff38ef 136 plugin_set = bt_plugin_create_all_from_file(sfs_path);
25583cd0 137 BT_ASSERT(plugin_set && bt_plugin_set_get_plugin_count(plugin_set) == 1);
92fed4e1 138 plugin = bt_plugin_set_borrow_plugin_by_index_const(plugin_set, 0);
458e8e1d 139 ok(bt_plugin_get_version(plugin, &major, &minor, &patch, &extra) ==
d94d92ac 140 BT_PROPERTY_AVAILABILITY_AVAILABLE,
458e8e1d
PP
141 "bt_plugin_get_version() succeeds when there's a version");
142 ok(major == 1,
143 "bt_plugin_get_version() returns the expected major version");
144 ok(minor == 2,
145 "bt_plugin_get_version() returns the expected minor version");
146 ok(patch == 3,
147 "bt_plugin_get_version() returns the expected patch version");
148 ok(strcmp(extra, "yes") == 0,
149 "bt_plugin_get_version() returns the expected extra version");
d94d92ac
PP
150 ok(bt_plugin_get_source_component_class_count(plugin) == 1,
151 "bt_plugin_get_source_component_class_count() returns the expected value");
152 ok(bt_plugin_get_filter_component_class_count(plugin) == 1,
153 "bt_plugin_get_filter_component_class_count() returns the expected value");
154 ok(bt_plugin_get_sink_component_class_count(plugin) == 1,
155 "bt_plugin_get_sink_component_class_count() returns the expected value");
156
92fed4e1 157 source_comp_class = bt_plugin_borrow_source_component_class_by_name_const(
d94d92ac 158 plugin, "source");
cbb9e0b1 159 ok(source_comp_class,
92fed4e1 160 "bt_plugin_borrow_source_component_class_by_name_const() finds a source component class");
cbb9e0b1 161
92fed4e1 162 sink_comp_class = bt_plugin_borrow_sink_component_class_by_name_const(
d94d92ac 163 plugin, "sink");
cbb9e0b1 164 ok(sink_comp_class,
92fed4e1 165 "bt_plugin_borrow_sink_component_class_by_name_const() finds a sink component class");
d94d92ac 166 ok(strcmp(bt_component_class_get_help(
707b7d35 167 bt_component_class_sink_as_component_class(sink_comp_class)),
a889b89f
PP
168 "Bacon ipsum dolor amet strip steak cupim pastrami venison shoulder.\n"
169 "Prosciutto beef ribs flank meatloaf pancetta brisket kielbasa drumstick\n"
170 "venison tenderloin cow tail. Beef short loin shoulder meatball, sirloin\n"
171 "ground round brisket salami cupim pork bresaola turkey bacon boudin.\n") == 0,
172 "bt_component_class_get_help() returns the expected help text");
173
92fed4e1 174 filter_comp_class = bt_plugin_borrow_filter_component_class_by_name_const(
d94d92ac 175 plugin, "filter");
cbb9e0b1 176 ok(filter_comp_class,
92fed4e1 177 "bt_plugin_borrow_filter_component_class_by_name_const() finds a filter component class");
05e21286 178 params = bt_value_integer_create_init(23);
25583cd0 179 BT_ASSERT(params);
d94d92ac 180 ret = bt_private_query_executor_query(query_exec,
707b7d35 181 bt_component_class_filter_as_component_class(filter_comp_class),
05e21286 182 "get-something", params, &results);
d94d92ac 183 ok(ret == 0 && results, "bt_private_query_executor_query() succeeds");
07208d85 184 BT_ASSERT(bt_value_is_array(results) && bt_value_array_get_size(results) == 2);
05e21286 185 object = bt_value_array_borrow_element_by_index_const(results, 0);
25583cd0 186 BT_ASSERT(object && bt_value_is_string(object));
601b0d3c 187 object_str = bt_value_string_get(object);
a67681c1
PP
188 ok(strcmp(object_str, "get-something") == 0,
189 "bt_component_class_query() receives the expected object name");
05e21286
PP
190 res_params = bt_value_array_borrow_element_by_index_const(results, 1);
191 ok(bt_value_compare(res_params, params),
a67681c1 192 "bt_component_class_query() receives the expected parameters");
cbb9e0b1 193
d94d92ac
PP
194 bt_object_get_ref(sink_comp_class);
195 diag("> putting the plugin set object here");
196 BT_OBJECT_PUT_REF_AND_RESET(plugin_set);
a2d06fd5 197 graph = bt_private_graph_create();
25583cd0 198 BT_ASSERT(graph);
d94d92ac 199 graph_ret = bt_private_graph_add_sink_component(graph, sink_comp_class, "the-sink",
c3c69044
MD
200 NULL, &sink_component);
201 ok(graph_ret == BT_GRAPH_STATUS_OK && sink_component,
d94d92ac 202 "bt_private_graph_add_sink_component() still works after the plugin object is destroyed");
65300d60 203 BT_OBJECT_PUT_REF_AND_RESET(sink_component);
65300d60 204 bt_object_put_ref(graph);
cbb9e0b1
PP
205
206 free(sfs_path);
d94d92ac 207 bt_object_put_ref(sink_comp_class);
65300d60
PP
208 bt_object_put_ref(results);
209 bt_object_put_ref(params);
210 bt_object_put_ref(query_exec);
cbb9e0b1
PP
211}
212
213static void test_create_all_from_dir(const char *plugin_dir)
214{
92fed4e1 215 const struct bt_plugin_set *plugin_set;
cbb9e0b1
PP
216
217 diag("create from all test below");
218
c55a9f58 219 plugin_set = bt_plugin_create_all_from_dir(NON_EXISTING_PATH, BT_FALSE);
a8ff38ef 220 ok(!plugin_set,
cbb9e0b1
PP
221 "bt_plugin_create_all_from_dir() fails with an invalid path");
222
c55a9f58 223 plugin_set = bt_plugin_create_all_from_dir(plugin_dir, BT_FALSE);
a8ff38ef 224 ok(plugin_set, "bt_plugin_create_all_from_dir() succeeds with a valid path");
cbb9e0b1
PP
225
226 /* 2 or 4, if `.la` files are considered or not */
a8ff38ef
PP
227 ok(bt_plugin_set_get_plugin_count(plugin_set) == 2 ||
228 bt_plugin_set_get_plugin_count(plugin_set) == 4,
229 "bt_plugin_create_all_from_dir() returns the expected number of plugin objects");
cbb9e0b1 230
65300d60 231 bt_object_put_ref(plugin_set);
cbb9e0b1
PP
232}
233
2b43acf9 234static void test_find(const char *plugin_dir)
a8b3f23b 235{
8a6001c5 236 int ret;
92fed4e1 237 const struct bt_plugin *plugin;
a8b3f23b
PP
238 char *plugin_path;
239
2b43acf9
PP
240 ok(!bt_plugin_find(NON_EXISTING_PATH),
241 "bt_plugin_find() returns NULL with an unknown plugin name");
84095ea4
MJ
242 ret = asprintf(&plugin_path, "%s" G_SEARCHPATH_SEPARATOR_S
243 G_DIR_SEPARATOR_S "ec1d09e5-696c-442e-b1c3-f9c6cf7f5958"
244 G_SEARCHPATH_SEPARATOR_S G_SEARCHPATH_SEPARATOR_S
245 G_SEARCHPATH_SEPARATOR_S "%s" G_SEARCHPATH_SEPARATOR_S
246 "8db46494-a398-466a-9649-c765ae077629"
247 G_SEARCHPATH_SEPARATOR_S,
a8b3f23b 248 NON_EXISTING_PATH, plugin_dir);
25583cd0 249 BT_ASSERT(ret > 0 && plugin_path);
aacfaf40 250 g_setenv("BABELTRACE_PLUGIN_PATH", plugin_path, 1);
2b43acf9 251 plugin = bt_plugin_find("test_minimal");
a8b3f23b 252 ok(plugin,
2b43acf9 253 "bt_plugin_find() succeeds with a plugin name it can find");
a8b3f23b 254 ok(strcmp(bt_plugin_get_author(plugin), "Janine Sutto") == 0,
2b43acf9 255 "bt_plugin_find() finds the correct plugin for a given name");
65300d60 256 BT_OBJECT_PUT_REF_AND_RESET(plugin);
a8b3f23b
PP
257 free(plugin_path);
258}
259
cbb9e0b1
PP
260int main(int argc, char **argv)
261{
262 int ret;
263 const char *plugin_dir;
264
265 if (argc != 2) {
266 puts("Usage: test_plugin plugin_directory");
267 ret = 1;
268 goto end;
269 }
270
271 plugin_dir = argv[1];
272 plan_tests(NR_TESTS);
cbb9e0b1
PP
273 test_minimal(plugin_dir);
274 test_sfs(plugin_dir);
275 test_create_all_from_dir(plugin_dir);
2b43acf9 276 test_find(plugin_dir);
cbb9e0b1
PP
277 ret = exit_status();
278end:
279 return ret;
280}
This page took 0.049815 seconds and 4 git commands to generate.