4 * Unit tests for the map API.
6 * Copyright (C) 2021 Francis Deslauriers <francis.deslauriers@efficios.com>
8 * SPDX-License-Identifier: GPL-2.0-only
12 #include "lttng/domain.h"
13 #include "lttng/map/map.h"
22 #include <lttng/map/map-internal.h>
24 #include <common/dynamic-buffer.h>
25 #include <common/buffer-view.h>
26 #include <common/payload.h>
31 void test_map_key_value_pair_serialize_deserialize(void)
33 struct lttng_map_key_value_pair
*kv
;
34 struct lttng_map_key_value_pair
*kv_from_payload
;
35 struct lttng_payload buffer
;
36 enum lttng_map_status map_status
;
37 const char *kv_from_payload_key
, *key
= "ma_clé";
38 int64_t kv_from_payload_value
, value
= 133121;
41 diag("Simple lttng_map_key_value_pair tests");
43 lttng_payload_init(&buffer
);
45 kv
= lttng_map_key_value_pair_create(key
, value
);
46 ok(kv
, "Key-value pair created");
48 /* Test incr value action serialization */
49 ret
= lttng_map_key_value_pair_serialize(kv
, &buffer
);
50 ok(ret
== 0, "Key-value pair serialized");
53 struct lttng_payload_view view
=
54 lttng_payload_view_from_payload(&buffer
, 0, -1);
56 (void) lttng_map_key_value_pair_create_from_payload(
57 &view
, &kv_from_payload
);
59 ok(kv_from_payload
, "Key-value pair created from payload is non-null");
61 map_status
= lttng_map_key_value_pair_get_key(kv_from_payload
,
62 &kv_from_payload_key
);
63 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key-value pair 1 key");
64 ok(strcmp(kv_from_payload_key
, key
) == 0, "Key-value pair from payload has correct key");
66 map_status
= lttng_map_key_value_pair_get_value(kv_from_payload
,
67 &kv_from_payload_value
);
68 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key-value pair 1 value");
69 ok(kv_from_payload_value
== value
, "Key-value pair from payload has correct value");
71 lttng_payload_reset(&buffer
);
72 lttng_map_key_value_pair_destroy(kv
);
73 lttng_map_key_value_pair_destroy(kv_from_payload
);
77 void test_map_key_value_pair_list_serialize_deserialize(void)
79 struct lttng_map_key_value_pair
*kv
;
80 const struct lttng_map_key_value_pair
*kv_from_payload
= NULL
;
82 struct lttng_map_key_value_pair_list
*kv_pair_list
;
83 struct lttng_map_key_value_pair_list
*kv_pair_list_from_payload
;
85 struct lttng_payload buffer
;
86 enum lttng_map_status map_status
;
87 const char *kv_from_payload_key
, *key1
= "ma_clé", *key2
= "autre_clé";
88 int64_t kv_from_payload_value
, value1
= 123456, value2
= 98765;
89 enum lttng_map_key_value_pair_list_type list_type
=
90 LTTNG_MAP_KEY_VALUE_PAIR_LIST_TYPE_UST_PER_PID
;
91 uint64_t identifier
= 3192112;
92 bool summed_all_cpus
= true;
93 unsigned int kv_count
;
96 diag("Simple lttng_map_key_value_pair_list tests");
98 lttng_payload_init(&buffer
);
100 kv_pair_list
= lttng_map_key_value_pair_list_create(list_type
,
102 ok(kv_pair_list
, "Key-value pair_list list created");
104 map_status
= lttng_map_key_value_pair_list_set_identifier(kv_pair_list
,
106 ok(kv_pair_list
, "Key-value set identifier");
108 kv
= lttng_map_key_value_pair_create(key1
, value1
);
109 ok(kv
, "Key-value pair 1 created");
111 map_status
= lttng_map_key_value_pair_list_append_key_value(kv_pair_list
, kv
);
112 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key value 1 appended to list");
114 kv
= lttng_map_key_value_pair_create(key2
, value2
);
115 ok(kv
, "Key-value pair 2 created");
117 map_status
= lttng_map_key_value_pair_list_append_key_value(kv_pair_list
, kv
);
118 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key value 2 appended to list");
120 /* Test incr value action serialization */
121 ret
= lttng_map_key_value_pair_list_serialize(kv_pair_list
, &buffer
);
122 ok(ret
== 0, "Key-value pair_list list serialized");
125 struct lttng_payload_view view
=
126 lttng_payload_view_from_payload(&buffer
, 0, -1);
128 (void) lttng_map_key_value_pair_list_create_from_payload(
129 &view
, &kv_pair_list_from_payload
);
131 ok(kv_pair_list_from_payload
, "Key-value pair list created from payload is non-null");
133 ok(lttng_map_key_value_pair_list_get_summed_all_cpu(kv_pair_list_from_payload
) == summed_all_cpus
,
134 "Got the expected summed all cpu state");
136 ok(lttng_map_key_value_pair_list_get_type(kv_pair_list_from_payload
) == list_type
,
137 "Got the expected list type");
138 ok(lttng_map_key_value_pair_list_get_identifer(kv_pair_list_from_payload
) == identifier
,
139 "Got the expected list identifier");
141 map_status
= lttng_map_key_value_pair_list_get_count(
142 kv_pair_list_from_payload
, &kv_count
);
143 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got key value pair count");
144 ok(kv_count
== 2, "Got the right key value pair count");
146 kv_from_payload
= lttng_map_key_value_pair_list_get_at_index(
147 kv_pair_list_from_payload
, 0);
148 ok(kv_from_payload
, "Key-value pair 1 created from payload");
150 map_status
= lttng_map_key_value_pair_get_key(kv_from_payload
,
151 &kv_from_payload_key
);
152 ok(strcmp(kv_from_payload_key
, key1
) == 0, "Key-value pair 1 from payload has correct key");
154 map_status
= lttng_map_key_value_pair_get_value(kv_from_payload
,
155 &kv_from_payload_value
);
156 ok(kv_from_payload_value
== value1
, "Key-value pair 1 from payload has correct value");
158 kv_from_payload
= lttng_map_key_value_pair_list_get_at_index(
159 kv_pair_list_from_payload
, 1);
160 ok(kv_from_payload
, "Key-value pair 2 created from payload");
162 map_status
= lttng_map_key_value_pair_get_key(kv_from_payload
,
163 &kv_from_payload_key
);
164 ok(strcmp(kv_from_payload_key
, key2
) == 0, "Key-value pair 2 from payload has correct key");
166 map_status
= lttng_map_key_value_pair_get_value(kv_from_payload
,
167 &kv_from_payload_value
);
168 ok(kv_from_payload_value
== value2
, "Key-value pair 2 from payload has correct value");
170 lttng_payload_reset(&buffer
);
171 lttng_map_key_value_pair_list_destroy(kv_pair_list
);
172 lttng_map_key_value_pair_list_destroy(kv_pair_list_from_payload
);
176 void test_map_content_serialize_deserialize(void)
178 struct lttng_map_content
*map_content
, *map_content_from_payload
;
179 enum lttng_map_status map_status
;
180 struct lttng_payload buffer
;
181 struct lttng_map_key_value_pair
*kv1
, *kv2
;
182 const char *key1
= "ma_clé", *key2
= "autre_clé";
183 uint64_t value1
= 123456, value2
= 98765;
184 enum lttng_map_key_value_pair_list_type list_type1
=
185 LTTNG_MAP_KEY_VALUE_PAIR_LIST_TYPE_UST_PER_PID
;
186 enum lttng_map_key_value_pair_list_type list_type2
=
187 LTTNG_MAP_KEY_VALUE_PAIR_LIST_TYPE_UST_PER_PID
;
188 enum lttng_map_key_value_pair_list_type list_type3
=
189 LTTNG_MAP_KEY_VALUE_PAIR_LIST_TYPE_UST_PER_PID_AGGREGATED
;
190 uint64_t id1
= 958323, id2
= 121942;
191 struct lttng_map_key_value_pair_list
*kv_pair_list1
, *kv_pair_list2
, *kv_pair_list3
;
192 const struct lttng_map_key_value_pair_list
*kv_pair_list1_from_payload
;
193 const struct lttng_map_key_value_pair_list
*kv_pair_list2_from_payload
;
194 const struct lttng_map_key_value_pair_list
*kv_pair_list3_from_payload
;
195 unsigned int list_count
;
196 enum lttng_buffer_type buffer_type
= LTTNG_BUFFER_PER_UID
;
199 diag("Simple lttng_map_content tests");
201 lttng_payload_init(&buffer
);
203 kv_pair_list1
= lttng_map_key_value_pair_list_create(list_type1
, true);
204 map_status
= lttng_map_key_value_pair_list_set_identifier(kv_pair_list1
, id1
);
206 kv_pair_list2
= lttng_map_key_value_pair_list_create(list_type2
, false);
207 map_status
= lttng_map_key_value_pair_list_set_identifier(kv_pair_list2
, id2
);
209 kv_pair_list3
= lttng_map_key_value_pair_list_create(list_type3
, true);
211 kv1
= lttng_map_key_value_pair_create(key1
, value1
);
212 map_status
= lttng_map_key_value_pair_list_append_key_value(kv_pair_list1
, kv1
);
214 kv2
= lttng_map_key_value_pair_create(key2
, value2
);
215 map_status
= lttng_map_key_value_pair_list_append_key_value(kv_pair_list2
, kv2
);
217 map_content
= lttng_map_content_create(buffer_type
);
219 map_status
= lttng_map_content_append_key_value_list(map_content
, kv_pair_list1
);
220 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key value list 1 appended to map_content");
222 map_status
= lttng_map_content_append_key_value_list(map_content
, kv_pair_list2
);
223 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key value list 2 appended to map_content");
225 map_status
= lttng_map_content_append_key_value_list(map_content
, kv_pair_list3
);
226 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Key value list 3 appended to map_content");
228 ret
= lttng_map_content_serialize(map_content
, &buffer
);
229 ok(ret
== 0, "Map list serialized");
231 struct lttng_payload_view view
=
232 lttng_payload_view_from_payload(&buffer
, 0, -1);
233 (void) lttng_map_content_create_from_payload(
234 &view
, &map_content_from_payload
);
237 ok(map_content
, "map content created from payload is non-null");
238 map_status
= lttng_map_content_get_count(map_content_from_payload
, &list_count
);
239 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got key value pair count");
240 ok(list_count
== 3, "Got the expected key-value list count");
242 ok(lttng_map_content_get_buffer_type(map_content_from_payload
) == buffer_type
,
243 "Got the expected buffer type");
245 kv_pair_list1_from_payload
= lttng_map_content_get_at_index(map_content_from_payload
, 0);
246 ok(kv_pair_list1_from_payload
, "Key-value pair list created from payload is non-null");
248 ok(lttng_map_key_value_pair_list_get_type(kv_pair_list1_from_payload
) == list_type1
,
249 "Got the expected list type");
251 ok(lttng_map_key_value_pair_list_get_identifer(kv_pair_list1_from_payload
) == id1
,
252 "Got the expected list identifier");
254 kv_pair_list2_from_payload
= lttng_map_content_get_at_index(map_content_from_payload
, 1);
255 ok(kv_pair_list2_from_payload
, "Key-value pair list created from payload is non-null");
257 ok(lttng_map_key_value_pair_list_get_type(kv_pair_list2_from_payload
) == list_type2
,
258 "Got the expected list type");
260 ok(lttng_map_key_value_pair_list_get_identifer(kv_pair_list2_from_payload
) == id2
,
261 "Got the expected list identifier");
263 kv_pair_list3_from_payload
= lttng_map_content_get_at_index(map_content_from_payload
, 2);
264 ok(kv_pair_list3_from_payload
, "Key-value pair list created from payload is non-null");
266 ok(lttng_map_key_value_pair_list_get_type(kv_pair_list3_from_payload
) == list_type3
,
267 "Got the expected list type");
269 lttng_payload_reset(&buffer
);
270 lttng_map_content_destroy(map_content
);
271 lttng_map_content_destroy(map_content_from_payload
);
278 struct lttng_payload buffer
;
279 struct lttng_map
*map
, *map_from_payload
= NULL
;
280 enum lttng_map_status map_status
;
281 const char *map_name
= "map_name", *map_name_from_payload
;
282 unsigned int dimension_count
= 1;
283 uint64_t first_dim_size
= 423;
284 uint64_t dimension_sizes
[1] = {first_dim_size
};
285 enum lttng_domain_type domain
= LTTNG_DOMAIN_UST
;
286 enum lttng_buffer_type buffer_type
= LTTNG_BUFFER_PER_UID
;
287 enum lttng_map_bitness bitness
= LTTNG_MAP_BITNESS_32BITS
;
288 enum lttng_map_boundary_policy boundary_policy
= LTTNG_MAP_BOUNDARY_POLICY_OVERFLOW
;
289 bool coalesce_hits
= true;
292 diag("Simple lttng_map tests");
293 lttng_payload_init(&buffer
);
295 map_status
= lttng_map_create(map_name
, dimension_count
,
296 dimension_sizes
, domain
, buffer_type
, bitness
,
297 boundary_policy
, coalesce_hits
, &map
);
298 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Created map");
300 lttng_map_set_is_enabled(map
, true);
302 ret
= lttng_map_serialize(map
, &buffer
);
303 ok(ret
== 0, "Map serialized");
306 struct lttng_payload_view view
=
307 lttng_payload_view_from_payload(&buffer
, 0, -1);
308 (void) lttng_map_create_from_payload(
309 &view
, &map_from_payload
);
311 ok(map_from_payload
, "Map created from payload");
313 ok(lttng_map_get_dimension_count(map_from_payload
) == dimension_count
,
314 "Got the expected dimension count from payload");
316 ok(lttng_map_get_is_enabled(map_from_payload
) == 1,
317 "Got the expected enabled state from payload");
319 ok(lttng_map_get_bitness(map_from_payload
) == bitness
,
320 "Got the expected bitness from payload");
322 ok(lttng_map_get_domain(map_from_payload
) == domain
,
323 "Got the expected domain from payload");
325 ok(lttng_map_get_buffer_type(map_from_payload
) == buffer_type
,
326 "Got the expected buffer type from payload");
328 ok(lttng_map_get_boundary_policy(map_from_payload
) == boundary_policy
,
329 "Got the expected boundary policy from payload");
331 ok(lttng_map_get_coalesce_hits(map_from_payload
) == coalesce_hits
,
332 "Got the expected coalesce hits value from payload");
334 map_status
= lttng_map_get_name(map_from_payload
, &map_name_from_payload
);
335 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got map name from payload");
336 ok(strcmp(map_name_from_payload
, map_name
) == 0,
337 "Got the expected map name from payload");
339 lttng_map_destroy(map
);
340 lttng_map_destroy(map_from_payload
);
341 lttng_payload_reset(&buffer
);
345 void test_map_list(void)
348 struct lttng_payload buffer
;
349 enum lttng_map_status map_status
;
350 struct lttng_map
*map1
, *map2
;
351 const struct lttng_map
*map1_from_payload
= NULL
, *map2_from_payload
= NULL
;
352 struct lttng_map_list
*map_list
, *map_list_from_payload
= NULL
;
353 const char *map1_name
= "map_name_1", *map1_name_from_payload
;
354 const char *map2_name
= "map_name_2", *map2_name_from_payload
;
355 unsigned int dimension_count
= 1, map_count
= 0;
356 uint64_t first_dim_size
= 423;
357 uint64_t dimension_sizes
[1] = {first_dim_size
};
358 enum lttng_domain_type domain
= LTTNG_DOMAIN_KERNEL
;
359 enum lttng_buffer_type buffer_type1
= LTTNG_BUFFER_PER_PID
, buffer_type2
= LTTNG_BUFFER_PER_UID
;
360 enum lttng_map_bitness bitness
= LTTNG_MAP_BITNESS_64BITS
;
361 enum lttng_map_boundary_policy boundary_policy
= LTTNG_MAP_BOUNDARY_POLICY_OVERFLOW
;
362 bool coalesce_hits
= false;
364 diag("Simple lttng_map_list tests");
366 lttng_payload_init(&buffer
);
368 map_status
= lttng_map_create(map1_name
, dimension_count
,
369 dimension_sizes
, domain
, buffer_type1
, bitness
,
370 boundary_policy
, coalesce_hits
, &map1
);
371 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Created map 1");
372 lttng_map_set_is_enabled(map1
, true);
374 map_status
= lttng_map_create(map2_name
, dimension_count
,
375 dimension_sizes
, domain
, buffer_type2
, bitness
,
376 boundary_policy
, coalesce_hits
, &map2
);
377 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Created map 2");
378 lttng_map_set_is_enabled(map2
, true);
380 map_list
= lttng_map_list_create();
381 ok(map_list
, "Map list created");
383 map_status
= lttng_map_list_add(map_list
, map1
);
384 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Map 1 added to map list");
386 map_status
= lttng_map_list_add(map_list
, map2
);
387 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Map 1 added to map list");
389 ret
= lttng_map_list_serialize(map_list
, &buffer
);
390 ok(ret
== 0, "Map list serialized");
393 struct lttng_payload_view view
=
394 lttng_payload_view_from_payload(&buffer
, 0, -1);
395 (void) lttng_map_list_create_from_payload(
396 &view
, &map_list_from_payload
);
399 map_status
= lttng_map_list_get_count(map_list
, &map_count
);
400 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got map count from payload");
401 ok(map_count
== 2, "Got the right map count from payload");
403 map1_from_payload
= lttng_map_list_get_at_index(map_list
, 0);
404 ok(map1_from_payload
, "Got first map from payload");
405 map_status
= lttng_map_get_name(map1_from_payload
, &map1_name_from_payload
);
406 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got map 1 name from payload");
407 ok(strcmp(map1_name_from_payload
, map1_name
) == 0,
408 "Got right map 1 name from payload");
409 ok(lttng_map_get_is_enabled(map1_from_payload
) == 1,
410 "Got right map 1 enabled state from payload");
412 map2_from_payload
= lttng_map_list_get_at_index(map_list
, 1);
413 ok(map2_from_payload
, "Got first map from payload");
414 map_status
= lttng_map_get_name(map2_from_payload
, &map2_name_from_payload
);
415 ok(map_status
== LTTNG_MAP_STATUS_OK
, "Got map 2 name from payload");
416 ok(strcmp(map2_name_from_payload
, map2_name
) == 0,
417 "Got right map 2 name from payload");
418 ok(lttng_map_get_is_enabled(map2_from_payload
) == 1,
419 "Got right map 2 enabled state from payload");
421 lttng_map_destroy(map1
);
422 lttng_map_destroy(map2
);
423 lttng_map_list_destroy(map_list
);
424 lttng_map_list_destroy(map_list_from_payload
);
425 lttng_payload_reset(&buffer
);
428 int main(int argc
, const char *argv
[])
430 plan_tests(NUM_TESTS
);
434 test_map_key_value_pair_serialize_deserialize();
435 test_map_key_value_pair_list_serialize_deserialize();
436 test_map_content_serialize_deserialize();
438 return exit_status();