Commit | Line | Data |
---|---|---|
ebdb334b JR |
1 | /* |
2 | * test_map_query.c | |
3 | * | |
4 | * Unit tests for the map query API. | |
5 | * | |
6 | * Copyright (C) 2021 Francis Deslauriers <francis.deslauriers@efficios.com> | |
7 | * | |
8 | * SPDX-License-Identifier: GPL-2.0-only | |
9 | * | |
10 | */ | |
11 | ||
12 | #include <assert.h> | |
13 | #include <inttypes.h> | |
14 | #include <stdio.h> | |
15 | #include <string.h> | |
16 | #include <unistd.h> | |
17 | ||
18 | #include <tap/tap.h> | |
19 | ||
20 | #include <lttng/map/map-query-internal.h> | |
21 | ||
22 | #include <common/dynamic-buffer.h> | |
23 | #include <common/buffer-view.h> | |
24 | #include <common/payload.h> | |
25 | ||
26 | #define NUM_TESTS 56 | |
27 | ||
28 | static | |
29 | void test_map_query_key_filter_all_cpus_all_uids_64_no_sum(void) | |
30 | { | |
31 | int ret; | |
32 | struct lttng_payload buffer; | |
33 | struct lttng_map_query *query, *query_from_payload = NULL; | |
34 | const char *filter = "pitarifique_key"; | |
35 | const char *filter_from_payload; | |
36 | enum lttng_map_query_status status; | |
37 | ||
38 | enum lttng_map_query_config_cpu config_cpu = | |
39 | LTTNG_MAP_QUERY_CONFIG_CPU_ALL; | |
40 | enum lttng_map_query_config_buffer config_buffer = | |
41 | LTTNG_MAP_QUERY_CONFIG_BUFFER_UST_UID_ALL; | |
42 | enum lttng_map_query_config_app_bitness config_bitness = | |
43 | LTTNG_MAP_QUERY_CONFIG_APP_BITNESS_ALL; | |
44 | ||
45 | diag("Map query, all cpus, all uids, 64bits, no sum"); | |
46 | lttng_payload_init(&buffer); | |
47 | ||
48 | query = lttng_map_query_create(config_cpu, config_buffer, | |
49 | config_bitness); | |
50 | ok(query, "Map query created succesfully"); | |
51 | ||
52 | status = lttng_map_query_add_key_filter(query, filter); | |
53 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Key filter created succesfully"); | |
54 | ||
55 | /* Add a cpu manually with a _CONFIG_CPU_ALL should fail. */ | |
56 | status = lttng_map_query_add_cpu(query, 121); | |
57 | ok(status == LTTNG_MAP_QUERY_STATUS_INVALID, "Adding a cpu failed as expected"); | |
58 | ||
59 | /* Add a pid manually with a _CONFIG_BUFFER_UST_UID_ should fail. */ | |
60 | status = lttng_map_query_add_pid(query, 931214); | |
61 | ok(status == LTTNG_MAP_QUERY_STATUS_INVALID, "Adding a PID of uid map query failed as expected"); | |
62 | ||
63 | ret = lttng_map_query_serialize(query, &buffer); | |
64 | ok(ret == 0, "Map query serialized"); | |
65 | ||
66 | { | |
67 | struct lttng_payload_view view = | |
68 | lttng_payload_view_from_payload(&buffer, 0, -1); | |
69 | (void) lttng_map_query_create_from_payload( | |
70 | &view, &query_from_payload); | |
71 | } | |
72 | ||
73 | ok(query_from_payload, "Map query created from payload"); | |
74 | ||
75 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
76 | config_bitness, "Getting app bitness config from payload"); | |
77 | ||
78 | ok(lttng_map_query_get_config_buffer(query_from_payload) == | |
79 | config_buffer, "Buffer config"); | |
80 | ||
81 | ok(lttng_map_query_get_config_cpu(query_from_payload) == | |
82 | config_cpu, "CPU config"); | |
83 | ||
84 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
85 | config_bitness, "App bitness config"); | |
86 | ||
87 | status = lttng_map_query_get_key_filter(query_from_payload, &filter_from_payload); | |
88 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Key filter"); | |
89 | ok(strcmp(filter_from_payload, filter) == 0, "Key filter"); | |
90 | ||
91 | lttng_map_query_destroy(query); | |
92 | lttng_map_query_destroy(query_from_payload); | |
93 | lttng_payload_reset(&buffer); | |
94 | } | |
95 | ||
96 | static | |
97 | void test_map_query_key_some_cpu_some_uid_summed_by_uid(void) | |
98 | { | |
99 | int ret; | |
100 | struct lttng_payload buffer; | |
101 | struct lttng_map_query *query, *query_from_payload = NULL; | |
102 | unsigned int cpu_count, uid_count; | |
103 | bool sum_by_cpu = false, sum_by_uid = true; | |
104 | uid_t uid1 = 12131, uid1_from_payload; | |
105 | int cpu1 = 494581, cpu1_from_payload; | |
106 | enum lttng_map_query_status status; | |
107 | ||
108 | enum lttng_map_query_config_cpu config_cpu = | |
109 | LTTNG_MAP_QUERY_CONFIG_CPU_SUBSET; | |
110 | enum lttng_map_query_config_buffer config_buffer = | |
111 | LTTNG_MAP_QUERY_CONFIG_BUFFER_UST_UID_SUBSET; | |
112 | enum lttng_map_query_config_app_bitness config_bitness = | |
113 | LTTNG_MAP_QUERY_CONFIG_APP_BITNESS_ALL; | |
114 | ||
115 | diag("Map query some cpus, some uids, summed by uid"); | |
116 | lttng_payload_init(&buffer); | |
117 | ||
118 | query = lttng_map_query_create(config_cpu, config_buffer, | |
119 | config_bitness); | |
120 | ok(query, "Map query created succesfully"); | |
121 | ||
122 | status = lttng_map_query_set_sum_by_cpu(query, sum_by_cpu); | |
123 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Setting sum-by-cpu option"); | |
124 | ||
125 | status = lttng_map_query_set_sum_by_uid(query, sum_by_uid); | |
126 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Setting sum-by-uid option"); | |
127 | ||
128 | status = lttng_map_query_add_cpu(query, cpu1); | |
129 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Adding a cpu %d", cpu1); | |
130 | ||
131 | status = lttng_map_query_add_uid(query, uid1); | |
132 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Adding a uid %d", uid1); | |
133 | ||
134 | /* Add a pid manually with a _CONFIG_BUFFER_UST_UID_ should fail. */ | |
135 | status = lttng_map_query_add_pid(query, 931214); | |
136 | ok(status == LTTNG_MAP_QUERY_STATUS_INVALID, "Adding a PID of uid map query failed as expected"); | |
137 | ||
138 | ret = lttng_map_query_serialize(query, &buffer); | |
139 | ok(ret == 0, "Map query serialized"); | |
140 | ||
141 | { | |
142 | struct lttng_payload_view view = | |
143 | lttng_payload_view_from_payload(&buffer, 0, -1); | |
144 | (void) lttng_map_query_create_from_payload( | |
145 | &view, &query_from_payload); | |
146 | } | |
147 | ||
148 | ok(query_from_payload, "Map query created from payload"); | |
149 | ||
150 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
151 | config_bitness, "Getting app bitness config from payload"); | |
152 | ||
153 | ok(lttng_map_query_get_config_sum_by_cpu(query_from_payload) == | |
154 | sum_by_cpu, "Getting sum-by-cpu config from payload"); | |
155 | ||
156 | ok(lttng_map_query_get_config_sum_by_uid(query_from_payload) == | |
157 | sum_by_uid, "Getting sum-by-uid config from payload"); | |
158 | ||
159 | ok(lttng_map_query_get_config_buffer(query_from_payload) == | |
160 | config_buffer, "Buffer config"); | |
161 | ||
162 | ok(lttng_map_query_get_config_cpu(query_from_payload) == | |
163 | config_cpu, "CPU config"); | |
164 | ||
165 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
166 | config_bitness, "App bitness config"); | |
167 | ||
168 | status = lttng_map_query_get_cpu_count(query, &cpu_count); | |
169 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting cpu count"); | |
170 | ok(cpu_count == 1, "Getting cpu count"); | |
171 | ||
172 | status = lttng_map_query_get_cpu_at_index(query, 0, &cpu1_from_payload); | |
173 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting cpu count"); | |
174 | ok(cpu1_from_payload == cpu1, "Getting cpu value"); | |
175 | ||
176 | status = lttng_map_query_get_uid_count(query, &uid_count); | |
177 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting uid count"); | |
178 | ok(uid_count == 1, "Getting uid count"); | |
179 | ||
180 | status = lttng_map_query_get_uid_at_index(query, 0, &uid1_from_payload); | |
181 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting uid count"); | |
182 | ok(uid1_from_payload == uid1, "Getting uid value"); | |
183 | ||
184 | lttng_map_query_destroy(query); | |
185 | lttng_map_query_destroy(query_from_payload); | |
186 | lttng_payload_reset(&buffer); | |
187 | } | |
188 | ||
189 | static | |
190 | void test_map_query_key_one_cpu_some_pid_summed_by_cpu(void) | |
191 | { | |
192 | int ret; | |
193 | struct lttng_payload buffer; | |
194 | struct lttng_map_query *query, *query_from_payload = NULL; | |
195 | unsigned int cpu_count, pid_count; | |
196 | pid_t pid1 = 12131, pid1_from_payload; | |
197 | int cpu1 = 494581, cpu1_from_payload; | |
198 | bool sum_by_cpu = true, sum_by_pid = false; | |
199 | enum lttng_map_query_status status; | |
200 | ||
201 | enum lttng_map_query_config_cpu config_cpu = | |
202 | LTTNG_MAP_QUERY_CONFIG_CPU_SUBSET; | |
203 | enum lttng_map_query_config_buffer config_buffer = | |
204 | LTTNG_MAP_QUERY_CONFIG_BUFFER_UST_PID_SUBSET; | |
205 | enum lttng_map_query_config_app_bitness config_bitness = | |
206 | LTTNG_MAP_QUERY_CONFIG_APP_BITNESS_ALL; | |
207 | ||
208 | diag("Map query one cpu, some pid, summed by cpu"); | |
209 | lttng_payload_init(&buffer); | |
210 | ||
211 | query = lttng_map_query_create(config_cpu, config_buffer, | |
212 | config_bitness); | |
213 | ok(query, "Map query created succesfully"); | |
214 | ||
215 | status = lttng_map_query_set_sum_by_cpu(query, sum_by_cpu); | |
216 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Setting sum-by-cpu option"); | |
217 | ||
218 | status = lttng_map_query_set_sum_by_pid(query, sum_by_pid); | |
219 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Setting sum-by-pid option"); | |
220 | ||
221 | status = lttng_map_query_add_cpu(query, cpu1); | |
222 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Adding a cpu %d", cpu1); | |
223 | ||
224 | status = lttng_map_query_add_pid(query, pid1); | |
225 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Adding a pid %d", pid1); | |
226 | ||
227 | /* Add a pid manually with a _CONFIG_BUFFER_UST_PID_ should fail. */ | |
228 | status = lttng_map_query_add_uid(query, 931214); | |
229 | ok(status == LTTNG_MAP_QUERY_STATUS_INVALID, "Adding a UID of pid map query failed as expected"); | |
230 | ||
231 | ret = lttng_map_query_serialize(query, &buffer); | |
232 | ok(ret == 0, "Map query serialized"); | |
233 | ||
234 | { | |
235 | struct lttng_payload_view view = | |
236 | lttng_payload_view_from_payload(&buffer, 0, -1); | |
237 | (void) lttng_map_query_create_from_payload( | |
238 | &view, &query_from_payload); | |
239 | } | |
240 | ||
241 | ok(query_from_payload, "Map query created from payload"); | |
242 | ||
243 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
244 | config_bitness, "Getting app bitness config from payload"); | |
245 | ||
246 | ok(lttng_map_query_get_config_sum_by_cpu(query_from_payload) == | |
247 | sum_by_cpu, "Getting sum-by-cpu config from payload"); | |
248 | ||
249 | ok(lttng_map_query_get_config_sum_by_pid(query_from_payload) == | |
250 | sum_by_pid, "Getting sum-by-pid config from payload"); | |
251 | ||
252 | ok(lttng_map_query_get_config_buffer(query_from_payload) == | |
253 | config_buffer, "Getting buffer config from payload"); | |
254 | ||
255 | ok(lttng_map_query_get_config_cpu(query_from_payload) == | |
256 | config_cpu, "Getting CPU config from payload"); | |
257 | ||
258 | ok(lttng_map_query_get_config_app_bitness(query_from_payload) == | |
259 | config_bitness, "App bitness config from payload"); | |
260 | ||
261 | status = lttng_map_query_get_cpu_count(query, &cpu_count); | |
262 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting cpu count from payload"); | |
263 | ok(cpu_count == 1, "Getting cpu count from payload"); | |
264 | ||
265 | status = lttng_map_query_get_cpu_at_index(query, 0, &cpu1_from_payload); | |
266 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting cpu count from payload"); | |
267 | ok(cpu1_from_payload == cpu1, "Getting cpu value from payload"); | |
268 | ||
269 | status = lttng_map_query_get_pid_count(query, &pid_count); | |
270 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting pid count from payload"); | |
271 | ok(pid_count == 1, "Getting pid count from payload"); | |
272 | ||
273 | status = lttng_map_query_get_pid_at_index(query, 0, &pid1_from_payload); | |
274 | ok(status == LTTNG_MAP_QUERY_STATUS_OK, "Getting pid count from payload"); | |
275 | ok(pid1_from_payload == pid1, "Getting pid value from payload"); | |
276 | ||
277 | lttng_map_query_destroy(query); | |
278 | lttng_map_query_destroy(query_from_payload); | |
279 | lttng_payload_reset(&buffer); | |
280 | } | |
281 | ||
282 | int main(int argc, const char *argv[]) | |
283 | { | |
284 | plan_tests(NUM_TESTS); | |
285 | ||
286 | test_map_query_key_filter_all_cpus_all_uids_64_no_sum(); | |
287 | test_map_query_key_some_cpu_some_uid_summed_by_uid(); | |
288 | test_map_query_key_one_cpu_some_pid_summed_by_cpu(); | |
289 | ||
290 | return exit_status(); | |
291 | } |