Line data Source code
1 : /**
2 : * @file
3 : *
4 : * @brief Relation between keys.
5 : *
6 : * @copyright BSD License (see LICENSE.md or https://www.libelektra.org)
7 : */
8 :
9 : #include <tests.h>
10 :
11 2 : static void test_keyCmp (void)
12 : {
13 2 : printf ("check keyCmp\n");
14 :
15 2 : Key * k1 = keyNew ("user/valid", KEY_END);
16 2 : Key * k2 = keyNew ("user/valid", KEY_END);
17 :
18 2 : Key * nk1 = keyNew (0);
19 2 : Key * nk2 = keyNew (0);
20 :
21 2 : succeed_if (keyCmp (0, 0) == 0, "all null pointers are same");
22 2 : succeed_if (keyCmp (nk1, 0) == 1, "null pointer is smaller");
23 2 : succeed_if (keyCmp (0, nk2) == -1, "null pointer is smaller");
24 :
25 : //! [cmp null]
26 2 : succeed_if (keyCmp (0, 0) == 0, "all null pointers same");
27 2 : succeed_if (keyCmp (k1, 0) == 1, "null pointer is smaller");
28 2 : succeed_if (keyCmp (0, k2) == -1, "null pointer is smaller");
29 : //! [cmp null]
30 :
31 2 : succeed_if (keyCmp (nk1, nk1) == 0, "all null keys are same");
32 2 : succeed_if (keyCmp (k1, nk1) == 1, "null keys are smaller");
33 2 : succeed_if (keyCmp (nk1, k2) == -1, "null keys are smaller");
34 :
35 2 : succeed_if (keyCmp (k1, k2) == 0, "should be same");
36 :
37 2 : keySetName (k1, "");
38 2 : keySetName (k2, "");
39 2 : succeed_if (keyCmp (k1, k2) == 0, "should be same");
40 :
41 2 : keySetName (k1, "user");
42 2 : keySetName (k2, "user");
43 2 : succeed_if (keyCmp (k1, k2) == 0, "should be same");
44 :
45 2 : keySetName (k1, "system");
46 2 : keySetName (k2, "system");
47 2 : succeed_if (keyCmp (k1, k2) == 0, "should be same");
48 :
49 2 : keySetName (k1, "system");
50 2 : keySetName (k2, "user");
51 2 : succeed_if (keyCmp (k1, k2) < 0, "system is smaller");
52 2 : succeed_if (keyCmp (k2, k1) > 0, "system is smaller");
53 :
54 2 : keySetName (k1, "user/a");
55 2 : keySetName (k2, "user/a");
56 2 : succeed_if (keyCmp (k1, k2) == 0, "should be same");
57 2 : succeed_if (keyCmp (k2, k1) == 0, "should be same");
58 :
59 2 : keySetName (k1, "user/a");
60 2 : keySetName (k2, "user/b");
61 2 : succeed_if (keyCmp (k1, k2) < 0, "a is smaller");
62 2 : succeed_if (keyCmp (k2, k1) > 0, "a is smaller");
63 :
64 2 : keySetName (k1, "user/a/a");
65 2 : keySetName (k2, "user/a-a");
66 2 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
67 2 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
68 :
69 2 : char cmp[] = "user/a-a";
70 512 : for (int i = 1; i < 256; ++i)
71 : {
72 510 : if (i == '/') continue;
73 508 : cmp[6] = i;
74 : // printf ("%i %s\n", i, cmp);
75 508 : keySetName (k1, "user/a/a");
76 508 : keySetName (k2, cmp);
77 508 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
78 508 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
79 : }
80 :
81 2 : keySetName (k1, "user/a");
82 2 : keySetName (k2, "user/a/a");
83 2 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
84 2 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
85 :
86 2 : keySetName (k1, "user/a");
87 2 : keySetName (k2, "user/a-a");
88 2 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
89 2 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
90 :
91 2 : keySetName (k1, "user/a");
92 2 : keySetName (k2, "user/aa");
93 2 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
94 2 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
95 :
96 2 : keySetName (k1, "user/a");
97 2 : keySetName (k2, "user/a-");
98 2 : succeed_if (keyCmp (k1, k2) < 0, "/ is smaller");
99 2 : succeed_if (keyCmp (k2, k1) > 0, "/ is smaller");
100 :
101 2 : keySetName (k1, "user/find_me");
102 2 : keySetName (k2, "user/find_me/a");
103 2 : succeed_if (keyCmp (k1, k2) < 0, "find_me is smaller");
104 2 : succeed_if (keyCmp (k2, k1) > 0, "find_me is smaller");
105 :
106 2 : keyDel (nk1);
107 2 : keyDel (nk2);
108 :
109 2 : keyDel (k1);
110 2 : keyDel (k2);
111 2 : }
112 :
113 2 : static void test_directbelow (void)
114 : {
115 2 : printf ("check if direct below\n");
116 2 : Key * k1 = keyNew (0);
117 2 : Key * k2 = keyNew (0);
118 :
119 2 : keySetName (k1, "user");
120 2 : keySetName (k2, "user/a");
121 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
122 :
123 2 : keySetName (k1, "system");
124 2 : keySetName (k2, "system/a");
125 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
126 :
127 2 : keySetName (k1, "user");
128 2 : keySetName (k2, "user/longer_name");
129 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
130 :
131 2 : keySetName (k1, "system");
132 2 : keySetName (k2, "system/longer_name");
133 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
134 :
135 2 : keySetName (k1, "user/a");
136 2 : keySetName (k2, "user/a/a");
137 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
138 :
139 2 : keySetName (k1, "system/a");
140 2 : keySetName (k2, "system/a/a");
141 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
142 :
143 2 : keySetName (k1, "system/a\\/a");
144 2 : keySetName (k2, "system/a\\/a/a");
145 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
146 :
147 2 : keySetName (k1, "system/a\\/a\\/a");
148 2 : keySetName (k2, "system/a\\/a\\/a/b");
149 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
150 :
151 2 : keySetName (k1, "system/a\\/a\\/a");
152 2 : keySetName (k2, "system/a\\/a\\/a/b");
153 2 : succeed_if (keyRel (k1, k2) == 1, "should be direct below");
154 :
155 :
156 2 : keyDel (k1);
157 2 : keyDel (k2);
158 2 : }
159 :
160 2 : static void test_below (void)
161 : {
162 2 : printf ("check if below\n");
163 2 : Key * k1 = keyNew (0);
164 2 : Key * k2 = keyNew (0);
165 :
166 2 : keySetName (k1, "user/tests/simple");
167 2 : keySetName (k2, "user/tests/simple/below");
168 2 : succeed_if (keyRel (k1, k2) >= 0, "should be below");
169 2 : succeed_if (keyRel (k1, k2) == 1, "should be below");
170 :
171 2 : keySetName (k1, "user");
172 2 : keySetName (k2, "user/a/a");
173 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
174 :
175 2 : keySetName (k1, "system");
176 2 : keySetName (k2, "system/a/a");
177 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
178 :
179 2 : keySetName (k1, "user");
180 2 : keySetName (k2, "user/longer_name/also_longer_name");
181 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
182 :
183 2 : keySetName (k1, "system");
184 2 : keySetName (k2, "system/longer_name/also_longer_name");
185 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
186 :
187 2 : keySetName (k1, "user/a");
188 2 : keySetName (k2, "user/a/a/a/a/a/a");
189 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
190 :
191 2 : keySetName (k1, "system/a");
192 2 : keySetName (k2, "system/a/a/a/a/a/a");
193 2 : succeed_if (keyRel (k1, k2) == 2, "should be below");
194 :
195 :
196 2 : keyDel (k1);
197 2 : keyDel (k2);
198 2 : }
199 :
200 2 : static void test_examples (void)
201 : {
202 2 : printf ("check examples\n");
203 2 : Key * key = keyNew (0);
204 2 : Key * check = keyNew (0);
205 :
206 2 : keySetName (key, "user/key/folder");
207 2 : keySetName (check, "user/key/folder");
208 2 : succeed_if (keyRel (key, check) == 0, "should be same");
209 :
210 2 : keySetName (key, "user/key/folder");
211 2 : keySetName (check, "user/key/folder/child");
212 2 : succeed_if (keyRel (key, check) == 1, "should be direct below");
213 :
214 2 : keySetName (key, "user/key/folder");
215 2 : keySetName (check, "user/key/folder/any/depth/deeper/grand-child");
216 2 : succeed_if (keyRel (key, check) == 2, "should be below (but not direct)");
217 2 : succeed_if (keyRel (key, check) > 0, "should be below");
218 2 : succeed_if (keyRel (key, check) >= 0, "should be the same or below");
219 :
220 2 : keySetName (key, "user/key/folder");
221 2 : keySetName (check, "user/notsame/folder");
222 2 : succeed_if (keyRel (key, check) < -2, "key is not below");
223 :
224 2 : keySetName (key, "user/key/folder");
225 2 : keySetName (check, "system/notsame/folder");
226 2 : succeed_if (keyRel (key, check) == -2, "not in the same namespace");
227 :
228 2 : keyDel (key);
229 2 : keyDel (check);
230 2 : }
231 :
232 2 : static void test_hierarchy (void)
233 : {
234 2 : printf ("check hierarchy\n");
235 2 : Key * key = keyNew (0);
236 2 : Key * check = keyNew (0);
237 :
238 2 : keySetName (key, "user/key/folder/key");
239 2 : keySetName (check, "user/other/folder/key");
240 2 : succeed_if (keyRel (key, check) < -2, "should be same");
241 :
242 2 : keySetName (key, "system/key/folder/key");
243 2 : keySetName (check, "system/other/folder/key");
244 2 : succeed_if (keyRel (key, check) < -2, "should be same");
245 :
246 2 : keySetName (key, "user/key/folder/key");
247 2 : keySetName (check, "system/other/folder/key");
248 2 : succeed_if (keyRel (key, check) == -2, "should be different");
249 :
250 2 : keySetName (key, "system/key/folder/key");
251 2 : keySetName (check, "user/other/folder/key");
252 2 : succeed_if (keyRel (key, check) == -2, "should be different");
253 :
254 2 : keyDel (key);
255 2 : keyDel (check);
256 2 : }
257 :
258 2 : static void test_null (void)
259 : {
260 2 : printf ("check invalid keys or null ptr\n");
261 2 : Key * key = keyNew (0);
262 2 : Key * check = keyNew (0);
263 :
264 2 : succeed_if (keyRel (key, check) == -1, "invalid");
265 :
266 2 : succeed_if (keyRel (0, check) == -1, "null ptr");
267 :
268 2 : succeed_if (keyRel (key, 0) == -1, "null ptr");
269 :
270 2 : keySetName (check, "system/key/folder/key");
271 2 : succeed_if (keyRel (key, check) == -1, "should be still invalid");
272 :
273 2 : keyDel (key);
274 2 : keyDel (check);
275 2 : }
276 :
277 :
278 2 : int main (int argc, char ** argv)
279 : {
280 2 : printf ("KEY RELATION TESTS\n");
281 2 : printf ("==================\n\n");
282 :
283 2 : init (argc, argv);
284 :
285 2 : test_keyCmp ();
286 2 : test_directbelow ();
287 2 : test_below ();
288 2 : test_examples ();
289 2 : test_hierarchy ();
290 2 : test_null ();
291 :
292 2 : printf ("\ntest_key RESULTS: %d test(s) done. %d error(s).\n", nbTest, nbError);
293 :
294 2 : return nbError;
295 : }
|