]>
Commit | Line | Data |
---|---|---|
53e1b683 | 1 | /* SPDX-License-Identifier: LGPL-2.1+ */ |
647f6824 | 2 | |
647f6824 | 3 | #include "set.h" |
ef79eae0 | 4 | #include "strv.h" |
647f6824 | 5 | |
de747a00 ZJS |
6 | const bool mempool_use_allowed = VALGRIND; |
7 | ||
647f6824 ZJS |
8 | static void test_set_steal_first(void) { |
9 | _cleanup_set_free_ Set *m = NULL; | |
10 | int seen[3] = {}; | |
11 | char *val; | |
12 | ||
13 | m = set_new(&string_hash_ops); | |
14 | assert_se(m); | |
15 | ||
16 | assert_se(set_put(m, (void*) "1") == 1); | |
17 | assert_se(set_put(m, (void*) "22") == 1); | |
18 | assert_se(set_put(m, (void*) "333") == 1); | |
19 | ||
20 | while ((val = set_steal_first(m))) | |
21 | seen[strlen(val) - 1]++; | |
22 | ||
bdf7026e | 23 | assert_se(seen[0] == 1 && seen[1] == 1 && seen[2] == 1); |
647f6824 ZJS |
24 | |
25 | assert_se(set_isempty(m)); | |
26 | } | |
27 | ||
224b0e7a ZJS |
28 | typedef struct Item { |
29 | int seen; | |
30 | } Item; | |
31 | static void item_seen(Item *item) { | |
32 | item->seen++; | |
33 | } | |
34 | ||
35 | static void test_set_free_with_destructor(void) { | |
36 | Set *m; | |
37 | struct Item items[4] = {}; | |
38 | unsigned i; | |
39 | ||
40 | assert_se(m = set_new(NULL)); | |
41 | for (i = 0; i < ELEMENTSOF(items) - 1; i++) | |
42 | assert_se(set_put(m, items + i) == 1); | |
43 | ||
44 | m = set_free_with_destructor(m, item_seen); | |
45 | assert_se(items[0].seen == 1); | |
46 | assert_se(items[1].seen == 1); | |
47 | assert_se(items[2].seen == 1); | |
48 | assert_se(items[3].seen == 0); | |
49 | } | |
50 | ||
98233ee5 YW |
51 | DEFINE_PRIVATE_HASH_OPS_WITH_VALUE_DESTRUCTOR(item_hash_ops, void, trivial_hash_func, trivial_compare_func, Item, item_seen); |
52 | ||
53 | static void test_set_free_with_hash_ops(void) { | |
54 | Set *m; | |
55 | struct Item items[4] = {}; | |
56 | unsigned i; | |
57 | ||
58 | assert_se(m = set_new(&item_hash_ops)); | |
59 | for (i = 0; i < ELEMENTSOF(items) - 1; i++) | |
60 | assert_se(set_put(m, items + i) == 1); | |
61 | ||
62 | m = set_free(m); | |
63 | assert_se(items[0].seen == 1); | |
64 | assert_se(items[1].seen == 1); | |
65 | assert_se(items[2].seen == 1); | |
66 | assert_se(items[3].seen == 0); | |
67 | } | |
68 | ||
756c09e6 RC |
69 | static void test_set_put(void) { |
70 | _cleanup_set_free_ Set *m = NULL; | |
71 | ||
72 | m = set_new(&string_hash_ops); | |
73 | assert_se(m); | |
74 | ||
75 | assert_se(set_put(m, (void*) "1") == 1); | |
76 | assert_se(set_put(m, (void*) "22") == 1); | |
77 | assert_se(set_put(m, (void*) "333") == 1); | |
78 | assert_se(set_put(m, (void*) "333") == 0); | |
79 | assert_se(set_remove(m, (void*) "333")); | |
80 | assert_se(set_put(m, (void*) "333") == 1); | |
81 | assert_se(set_put(m, (void*) "333") == 0); | |
82 | assert_se(set_put(m, (void*) "22") == 0); | |
ef79eae0 ZJS |
83 | |
84 | _cleanup_free_ char **t = set_get_strv(m); | |
85 | assert_se(strv_contains(t, "1")); | |
86 | assert_se(strv_contains(t, "22")); | |
87 | assert_se(strv_contains(t, "333")); | |
88 | assert_se(strv_length(t) == 3); | |
756c09e6 RC |
89 | } |
90 | ||
de747a00 ZJS |
91 | static void test_set_put_strdup(void) { |
92 | _cleanup_set_free_ Set *m = NULL; | |
93 | ||
94 | assert_se(set_put_strdup(&m, "aaa") == 1); | |
95 | assert_se(set_put_strdup(&m, "aaa") == 0); | |
96 | assert_se(set_put_strdup(&m, "bbb") == 1); | |
97 | assert_se(set_put_strdup(&m, "bbb") == 0); | |
98 | assert_se(set_put_strdup(&m, "aaa") == 0); | |
99 | assert_se(set_size(m) == 2); | |
100 | } | |
101 | ||
102 | static void test_set_put_strdupv(void) { | |
103 | _cleanup_set_free_ Set *m = NULL; | |
104 | ||
105 | assert_se(set_put_strdupv(&m, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "aaa")) == 2); | |
106 | assert_se(set_put_strdupv(&m, STRV_MAKE("aaa", "aaa", "bbb", "bbb", "ccc")) == 1); | |
107 | assert_se(set_size(m) == 3); | |
108 | } | |
109 | ||
0f9ccd95 ZJS |
110 | static void test_set_ensure_allocated(void) { |
111 | _cleanup_set_free_ Set *m = NULL; | |
112 | ||
113 | assert_se(set_ensure_allocated(&m, &string_hash_ops) == 1); | |
114 | assert_se(set_ensure_allocated(&m, &string_hash_ops) == 0); | |
115 | assert_se(set_ensure_allocated(&m, NULL) == 0); | |
116 | assert_se(set_size(m) == 0); | |
117 | } | |
118 | ||
119 | static void test_set_ensure_put(void) { | |
120 | _cleanup_set_free_ Set *m = NULL; | |
121 | ||
122 | assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 1); | |
123 | assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 0); | |
124 | assert_se(set_ensure_put(&m, NULL, "a") == 0); | |
125 | assert_se(set_ensure_put(&m, &string_hash_ops, "b") == 1); | |
126 | assert_se(set_ensure_put(&m, &string_hash_ops, "b") == 0); | |
127 | assert_se(set_ensure_put(&m, &string_hash_ops, "a") == 0); | |
128 | assert_se(set_size(m) == 2); | |
129 | } | |
130 | ||
fcc1d031 ZJS |
131 | static void test_set_ensure_consume(void) { |
132 | _cleanup_set_free_ Set *m = NULL; | |
133 | char *s, *t; | |
134 | ||
135 | assert_se(s = strdup("a")); | |
136 | assert_se(set_ensure_consume(&m, &string_hash_ops_free, s) == 1); | |
137 | ||
138 | assert_se(t = strdup("a")); | |
139 | assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0); | |
140 | ||
141 | assert_se(t = strdup("a")); | |
142 | assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0); | |
143 | ||
144 | assert_se(t = strdup("b")); | |
145 | assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 1); | |
146 | ||
147 | assert_se(t = strdup("b")); | |
148 | assert_se(set_ensure_consume(&m, &string_hash_ops_free, t) == 0); | |
149 | ||
150 | assert_se(set_size(m) == 2); | |
151 | } | |
152 | ||
647f6824 ZJS |
153 | int main(int argc, const char *argv[]) { |
154 | test_set_steal_first(); | |
224b0e7a | 155 | test_set_free_with_destructor(); |
98233ee5 | 156 | test_set_free_with_hash_ops(); |
756c09e6 | 157 | test_set_put(); |
de747a00 ZJS |
158 | test_set_put_strdup(); |
159 | test_set_put_strdupv(); | |
0f9ccd95 ZJS |
160 | test_set_ensure_allocated(); |
161 | test_set_ensure_put(); | |
fcc1d031 | 162 | test_set_ensure_consume(); |
647f6824 ZJS |
163 | |
164 | return 0; | |
165 | } |