]>
git.ipfire.org Git - thirdparty/systemd.git/blob - src/test/test-set.c
4c1872d636d3e35465aeca3892acd2d55eb77793
1 /* SPDX-License-Identifier: LGPL-2.1-or-later */
5 #include "random-util.h"
10 TEST(set_steal_first
) {
11 _cleanup_set_free_ Set
*m
= NULL
;
15 m
= set_new(&string_hash_ops
);
18 assert_se(set_put(m
, (void*) "1") == 1);
19 assert_se(set_put(m
, (void*) "22") == 1);
20 assert_se(set_put(m
, (void*) "333") == 1);
22 while ((val
= set_steal_first(m
)))
23 seen
[strlen(val
) - 1]++;
25 assert_se(seen
[0] == 1 && seen
[1] == 1 && seen
[2] == 1);
27 assert_se(set_isempty(m
));
33 static void item_seen(Item
*item
) {
37 DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops
, void, trivial_hash_func
, trivial_compare_func
, Item
, item_seen
);
39 TEST(set_free_with_hash_ops
) {
41 struct Item items
[4] = {};
43 assert_se(m
= set_new(&item_hash_ops
));
44 FOREACH_ARRAY(item
, items
, ELEMENTSOF(items
) - 1)
45 assert_se(set_put(m
, item
) == 1);
48 assert_se(items
[0].seen
== 1);
49 assert_se(items
[1].seen
== 1);
50 assert_se(items
[2].seen
== 1);
51 assert_se(items
[3].seen
== 0);
55 _cleanup_set_free_ Set
*m
= NULL
;
57 m
= set_new(&string_hash_ops
);
60 assert_se(set_put(m
, (void*) "1") == 1);
61 assert_se(set_put(m
, (void*) "22") == 1);
62 assert_se(set_put(m
, (void*) "333") == 1);
63 assert_se(set_put(m
, (void*) "333") == 0);
64 assert_se(set_remove(m
, (void*) "333"));
65 assert_se(set_put(m
, (void*) "333") == 1);
66 assert_se(set_put(m
, (void*) "333") == 0);
67 assert_se(set_put(m
, (void*) "22") == 0);
69 _cleanup_free_
char **t
= set_get_strv(m
);
70 assert_se(strv_contains(t
, "1"));
71 assert_se(strv_contains(t
, "22"));
72 assert_se(strv_contains(t
, "333"));
73 assert_se(strv_length(t
) == 3);
76 TEST(set_put_strndup
) {
77 _cleanup_set_free_ Set
*m
= NULL
;
79 assert_se(set_put_strndup(&m
, "12345", 0) == 1);
80 assert_se(set_put_strndup(&m
, "12345", 1) == 1);
81 assert_se(set_put_strndup(&m
, "12345", 2) == 1);
82 assert_se(set_put_strndup(&m
, "12345", 3) == 1);
83 assert_se(set_put_strndup(&m
, "12345", 4) == 1);
84 assert_se(set_put_strndup(&m
, "12345", 5) == 1);
85 assert_se(set_put_strndup(&m
, "12345", 6) == 0);
87 assert_se(set_contains(m
, ""));
88 assert_se(set_contains(m
, "1"));
89 assert_se(set_contains(m
, "12"));
90 assert_se(set_contains(m
, "123"));
91 assert_se(set_contains(m
, "1234"));
92 assert_se(set_contains(m
, "12345"));
94 assert_se(set_size(m
) == 6);
97 TEST(set_put_strdup
) {
98 _cleanup_set_free_ Set
*m
= NULL
;
100 assert_se(set_put_strdup(&m
, "aaa") == 1);
101 assert_se(set_put_strdup(&m
, "aaa") == 0);
102 assert_se(set_put_strdup(&m
, "bbb") == 1);
103 assert_se(set_put_strdup(&m
, "bbb") == 0);
104 assert_se(set_put_strdup(&m
, "aaa") == 0);
106 assert_se(set_contains(m
, "aaa"));
107 assert_se(set_contains(m
, "bbb"));
109 assert_se(set_size(m
) == 2);
112 TEST(set_put_strdupv
) {
113 _cleanup_set_free_ Set
*m
= NULL
;
115 assert_se(set_put_strdupv(&m
, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "aaa")) == 2);
116 assert_se(set_put_strdupv(&m
, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "ccc")) == 1);
118 assert_se(set_contains(m
, "aaa"));
119 assert_se(set_contains(m
, "bbb"));
120 assert_se(set_contains(m
, "ccc"));
122 assert_se(set_size(m
) == 3);
125 TEST(set_ensure_allocated
) {
126 _cleanup_set_free_ Set
*m
= NULL
;
128 ASSERT_OK_POSITIVE(set_ensure_allocated(&m
, &string_hash_ops
));
129 ASSERT_OK_ZERO(set_ensure_allocated(&m
, &string_hash_ops
));
130 ASSERT_SIGNAL(set_ensure_allocated(&m
, NULL
), SIGABRT
);
131 ASSERT_TRUE(set_isempty(m
));
135 _cleanup_set_free_ Set
*s
= NULL
, *copy
= NULL
;
136 _cleanup_free_
char *key1
= NULL
, *key2
= NULL
, *key3
= NULL
, *key4
= NULL
;
138 key1
= strdup("key1");
140 key2
= strdup("key2");
142 key3
= strdup("key3");
144 key4
= strdup("key4");
147 s
= set_new(&string_hash_ops
);
150 assert_se(set_put(s
, key1
) >= 0);
151 assert_se(set_put(s
, key2
) >= 0);
152 assert_se(set_put(s
, key3
) >= 0);
153 assert_se(set_put(s
, key4
) >= 0);
158 assert_se(set_equal(s
, copy
));
161 TEST(set_ensure_put
) {
162 _cleanup_set_free_ Set
*m
= NULL
;
164 ASSERT_OK_POSITIVE(set_ensure_put(&m
, &string_hash_ops
, "a"));
165 ASSERT_OK_ZERO(set_ensure_put(&m
, &string_hash_ops
, "a"));
166 ASSERT_SIGNAL(set_ensure_put(&m
, NULL
, "a"), SIGABRT
);
167 ASSERT_OK_POSITIVE(set_ensure_put(&m
, &string_hash_ops
, "b"));
168 ASSERT_OK_ZERO(set_ensure_put(&m
, &string_hash_ops
, "b"));
169 ASSERT_OK_ZERO(set_ensure_put(&m
, &string_hash_ops
, "a"));
170 ASSERT_EQ(set_size(m
), 2u);
173 TEST(set_ensure_consume
) {
174 _cleanup_set_free_ Set
*m
= NULL
;
177 assert_se(s
= strdup("a"));
178 assert_se(set_ensure_consume(&m
, &string_hash_ops_free
, s
) == 1);
180 assert_se(t
= strdup("a"));
181 assert_se(set_ensure_consume(&m
, &string_hash_ops_free
, t
) == 0);
183 assert_se(t
= strdup("a"));
184 assert_se(set_ensure_consume(&m
, &string_hash_ops_free
, t
) == 0);
186 assert_se(t
= strdup("b"));
187 assert_se(set_ensure_consume(&m
, &string_hash_ops_free
, t
) == 1);
189 assert_se(t
= strdup("b"));
190 assert_se(set_ensure_consume(&m
, &string_hash_ops_free
, t
) == 0);
192 assert_se(set_size(m
) == 2);
196 _cleanup_set_free_ Set
*m
= NULL
;
197 _cleanup_free_
char *joined
= NULL
;
200 assert_se(set_strjoin(m
, NULL
, false, &joined
) >= 0);
202 assert_se(set_strjoin(m
, "", false, &joined
) >= 0);
204 assert_se(set_strjoin(m
, " ", false, &joined
) >= 0);
206 assert_se(set_strjoin(m
, "xxx", false, &joined
) >= 0);
208 assert_se(set_strjoin(m
, NULL
, true, &joined
) >= 0);
210 assert_se(set_strjoin(m
, "", true, &joined
) >= 0);
212 assert_se(set_strjoin(m
, " ", true, &joined
) >= 0);
214 assert_se(set_strjoin(m
, "xxx", true, &joined
) >= 0);
218 assert_se(set_put_strdup(&m
, "aaa") == 1);
219 assert_se(set_strjoin(m
, NULL
, false, &joined
) >= 0);
220 ASSERT_STREQ(joined
, "aaa");
221 joined
= mfree(joined
);
222 assert_se(set_strjoin(m
, "", false, &joined
) >= 0);
223 ASSERT_STREQ(joined
, "aaa");
224 joined
= mfree(joined
);
225 assert_se(set_strjoin(m
, " ", false, &joined
) >= 0);
226 ASSERT_STREQ(joined
, "aaa");
227 joined
= mfree(joined
);
228 assert_se(set_strjoin(m
, "xxx", false, &joined
) >= 0);
229 ASSERT_STREQ(joined
, "aaa");
230 joined
= mfree(joined
);
231 assert_se(set_strjoin(m
, NULL
, true, &joined
) >= 0);
232 ASSERT_STREQ(joined
, "aaa");
233 joined
= mfree(joined
);
234 assert_se(set_strjoin(m
, "", true, &joined
) >= 0);
235 ASSERT_STREQ(joined
, "aaa");
236 joined
= mfree(joined
);
237 assert_se(set_strjoin(m
, " ", true, &joined
) >= 0);
238 ASSERT_STREQ(joined
, " aaa ");
239 joined
= mfree(joined
);
240 assert_se(set_strjoin(m
, "xxx", true, &joined
) >= 0);
241 ASSERT_STREQ(joined
, "xxxaaaxxx");
244 assert_se(set_put_strdup(&m
, "bbb") == 1);
245 assert_se(set_put_strdup(&m
, "aaa") == 0);
246 joined
= mfree(joined
);
247 assert_se(set_strjoin(m
, NULL
, false, &joined
) >= 0);
248 assert_se(STR_IN_SET(joined
, "aaabbb", "bbbaaa"));
249 joined
= mfree(joined
);
250 assert_se(set_strjoin(m
, "", false, &joined
) >= 0);
251 assert_se(STR_IN_SET(joined
, "aaabbb", "bbbaaa"));
252 joined
= mfree(joined
);
253 assert_se(set_strjoin(m
, " ", false, &joined
) >= 0);
254 assert_se(STR_IN_SET(joined
, "aaa bbb", "bbb aaa"));
255 joined
= mfree(joined
);
256 assert_se(set_strjoin(m
, "xxx", false, &joined
) >= 0);
257 assert_se(STR_IN_SET(joined
, "aaaxxxbbb", "bbbxxxaaa"));
258 joined
= mfree(joined
);
259 assert_se(set_strjoin(m
, NULL
, true, &joined
) >= 0);
260 assert_se(STR_IN_SET(joined
, "aaabbb", "bbbaaa"));
261 joined
= mfree(joined
);
262 assert_se(set_strjoin(m
, "", true, &joined
) >= 0);
263 assert_se(STR_IN_SET(joined
, "aaabbb", "bbbaaa"));
264 joined
= mfree(joined
);
265 assert_se(set_strjoin(m
, " ", true, &joined
) >= 0);
266 assert_se(STR_IN_SET(joined
, " aaa bbb ", " bbb aaa "));
267 joined
= mfree(joined
);
268 assert_se(set_strjoin(m
, "xxx", true, &joined
) >= 0);
269 assert_se(STR_IN_SET(joined
, "xxxaaaxxxbbbxxx", "xxxbbbxxxaaaxxx"));
273 _cleanup_set_free_ Set
*a
= NULL
, *b
= NULL
;
277 assert_se(a
= set_new(NULL
));
278 assert_se(b
= set_new(NULL
));
280 assert_se(set_equal(a
, a
));
281 assert_se(set_equal(b
, b
));
282 assert_se(set_equal(a
, b
));
283 assert_se(set_equal(b
, a
));
284 assert_se(set_equal(NULL
, a
));
285 assert_se(set_equal(NULL
, b
));
286 assert_se(set_equal(a
, NULL
));
287 assert_se(set_equal(b
, NULL
));
288 assert_se(set_equal(NULL
, NULL
));
290 for (unsigned i
= 0; i
< 333; i
++) {
291 p
= INT32_TO_PTR(1 + (random_u32() & 0xFFFU
));
294 assert_se(r
>= 0 || r
== -EEXIST
);
297 assert_se(set_put(a
, INT32_TO_PTR(0x1000U
)) >= 0);
299 assert_se(set_size(a
) >= 2);
300 assert_se(set_size(a
) <= 334);
302 assert_se(!set_equal(a
, b
));
303 assert_se(!set_equal(b
, a
));
304 assert_se(!set_equal(a
, NULL
));
307 assert_se(set_put(b
, p
) >= 0);
309 assert_se(set_equal(a
, b
));
310 assert_se(set_equal(b
, a
));
312 assert_se(set_remove(a
, INT32_TO_PTR(0x1000U
)) == INT32_TO_PTR(0x1000U
));
314 assert_se(!set_equal(a
, b
));
315 assert_se(!set_equal(b
, a
));
317 assert_se(set_remove(b
, INT32_TO_PTR(0x1000U
)) == INT32_TO_PTR(0x1000U
));
319 assert_se(set_equal(a
, b
));
320 assert_se(set_equal(b
, a
));
322 assert_se(set_put(b
, INT32_TO_PTR(0x1001U
)) >= 0);
324 assert_se(!set_equal(a
, b
));
325 assert_se(!set_equal(b
, a
));
327 assert_se(set_put(a
, INT32_TO_PTR(0x1001U
)) >= 0);
329 assert_se(set_equal(a
, b
));
330 assert_se(set_equal(b
, a
));
334 assert_se(!set_equal(a
, b
));
335 assert_se(!set_equal(b
, a
));
339 assert_se(set_equal(a
, b
));
340 assert_se(set_equal(b
, a
));
344 _cleanup_set_free_ Set
*match
= NULL
, *nomatch
= NULL
;
346 assert_se(set_put_strdup(&match
, "aaa") >= 0);
347 assert_se(set_put_strdup(&match
, "bbb*") >= 0);
348 assert_se(set_put_strdup(&match
, "*ccc") >= 0);
350 assert_se(set_put_strdup(&nomatch
, "a*") >= 0);
351 assert_se(set_put_strdup(&nomatch
, "bbb") >= 0);
352 assert_se(set_put_strdup(&nomatch
, "ccc*") >= 0);
354 assert_se(set_fnmatch(NULL
, NULL
, ""));
355 assert_se(set_fnmatch(NULL
, NULL
, "hoge"));
357 assert_se(set_fnmatch(match
, NULL
, "aaa"));
358 assert_se(set_fnmatch(match
, NULL
, "bbb"));
359 assert_se(set_fnmatch(match
, NULL
, "bbbXXX"));
360 assert_se(set_fnmatch(match
, NULL
, "ccc"));
361 assert_se(set_fnmatch(match
, NULL
, "XXXccc"));
362 assert_se(!set_fnmatch(match
, NULL
, ""));
363 assert_se(!set_fnmatch(match
, NULL
, "aaaa"));
364 assert_se(!set_fnmatch(match
, NULL
, "XXbbb"));
365 assert_se(!set_fnmatch(match
, NULL
, "cccXX"));
367 assert_se(set_fnmatch(NULL
, nomatch
, ""));
368 assert_se(set_fnmatch(NULL
, nomatch
, "Xa"));
369 assert_se(set_fnmatch(NULL
, nomatch
, "bbbb"));
370 assert_se(set_fnmatch(NULL
, nomatch
, "XXXccc"));
371 assert_se(!set_fnmatch(NULL
, nomatch
, "a"));
372 assert_se(!set_fnmatch(NULL
, nomatch
, "aXXXX"));
373 assert_se(!set_fnmatch(NULL
, nomatch
, "bbb"));
374 assert_se(!set_fnmatch(NULL
, nomatch
, "ccc"));
375 assert_se(!set_fnmatch(NULL
, nomatch
, "cccXXX"));
377 assert_se(set_fnmatch(match
, nomatch
, "bbbbb"));
378 assert_se(set_fnmatch(match
, nomatch
, "XXccc"));
379 assert_se(!set_fnmatch(match
, nomatch
, ""));
380 assert_se(!set_fnmatch(match
, nomatch
, "a"));
381 assert_se(!set_fnmatch(match
, nomatch
, "aaa"));
382 assert_se(!set_fnmatch(match
, nomatch
, "b"));
383 assert_se(!set_fnmatch(match
, nomatch
, "bbb"));
384 assert_se(!set_fnmatch(match
, nomatch
, "ccc"));
385 assert_se(!set_fnmatch(match
, nomatch
, "ccccc"));
386 assert_se(!set_fnmatch(match
, nomatch
, "cccXX"));
390 _cleanup_set_free_ Set
*set
= NULL
;
391 _cleanup_strv_free_
char **a
= NULL
;
392 _cleanup_free_
char **b
= NULL
;
393 char **v
= STRV_MAKE("aaa", "bbb", "ccc");
395 ASSERT_NOT_NULL(a
= set_to_strv(&set
));
396 ASSERT_TRUE(strv_isempty(a
));
400 ASSERT_OK(set_put_strdupv(&set
, v
));
401 ASSERT_EQ(set_size(set
), strv_length(v
));
403 ASSERT_NOT_NULL(b
= set_get_strv(set
));
404 ASSERT_EQ(strv_length(b
), strv_length(v
));
405 ASSERT_TRUE(strv_equal_ignore_order(b
, v
));
407 ASSERT_NOT_NULL(a
= set_to_strv(&set
));
408 ASSERT_EQ(strv_length(a
), strv_length(v
));
409 ASSERT_TRUE(strv_equal_ignore_order(a
, v
));
413 DEFINE_TEST_MAIN(LOG_INFO
);