1 #include "../common/dconf-changeset.h"
4 should_not_run (const gchar
*key
,
8 g_assert_not_reached ();
12 is_null (const gchar
*key
,
20 is_not_null (const gchar
*key
,
30 DConfChangeset
*changeset
;
35 changeset
= dconf_changeset_new ();
36 dconf_changeset_ref (changeset
);
37 dconf_changeset_all (changeset
, should_not_run
, NULL
);
38 n_items
= dconf_changeset_describe (changeset
, NULL
, NULL
, NULL
);
39 g_assert_cmpint (n_items
, ==, 0);
40 dconf_changeset_unref (changeset
);
41 dconf_changeset_unref (changeset
);
43 changeset
= dconf_changeset_new_write ("/value/a", NULL
);
44 result
= dconf_changeset_all (changeset
, is_null
, NULL
);
46 result
= dconf_changeset_all (changeset
, is_not_null
, NULL
);
49 result
= dconf_changeset_get (changeset
, "/value/a", &value
);
51 g_assert (value
== NULL
);
53 result
= dconf_changeset_get (changeset
, "/value/b", &value
);
56 dconf_changeset_set (changeset
, "/value/b", g_variant_new_int32 (123));
57 result
= dconf_changeset_all (changeset
, is_null
, NULL
);
59 result
= dconf_changeset_all (changeset
, is_not_null
, NULL
);
62 result
= dconf_changeset_get (changeset
, "/value/a", &value
);
64 g_assert (value
== NULL
);
66 result
= dconf_changeset_get (changeset
, "/value/b", &value
);
68 g_assert_cmpint (g_variant_get_int32 (value
), ==, 123);
69 g_variant_unref (value
);
71 dconf_changeset_set (changeset
, "/value/a", g_variant_new_string ("a string"));
72 result
= dconf_changeset_all (changeset
, is_null
, NULL
);
74 result
= dconf_changeset_all (changeset
, is_not_null
, NULL
);
77 result
= dconf_changeset_get (changeset
, "/value/a", &value
);
79 g_assert_cmpstr (g_variant_get_string (value
, NULL
), ==, "a string");
80 g_variant_unref (value
);
82 result
= dconf_changeset_get (changeset
, "/value/b", &value
);
84 g_assert_cmpint (g_variant_get_int32 (value
), ==, 123);
85 g_variant_unref (value
);
87 dconf_changeset_unref (changeset
);
91 test_similarity (void)
93 DConfChangeset
*a
, *b
;
95 a
= dconf_changeset_new ();
96 b
= dconf_changeset_new ();
98 g_assert (dconf_changeset_is_similar_to (a
, b
));
99 g_assert (dconf_changeset_is_similar_to (b
, a
));
101 dconf_changeset_set (a
, "/value/a", g_variant_new_int32 (0));
102 g_assert (!dconf_changeset_is_similar_to (a
, b
));
103 g_assert (!dconf_changeset_is_similar_to (b
, a
));
105 /* different values for the same key are still the same */
106 dconf_changeset_set (b
, "/value/a", g_variant_new_int32 (1));
107 g_assert (dconf_changeset_is_similar_to (a
, b
));
108 g_assert (dconf_changeset_is_similar_to (b
, a
));
110 /* make sure even a NULL is counted as different */
111 dconf_changeset_set (a
, "/value/b", NULL
);
112 g_assert (!dconf_changeset_is_similar_to (a
, b
));
113 g_assert (!dconf_changeset_is_similar_to (b
, a
));
115 dconf_changeset_set (b
, "/value/b", NULL
);
116 g_assert (dconf_changeset_is_similar_to (a
, b
));
117 g_assert (dconf_changeset_is_similar_to (b
, a
));
119 /* different types are still the same */
120 dconf_changeset_set (b
, "/value/a", g_variant_new_uint32 (222));
121 g_assert (dconf_changeset_is_similar_to (a
, b
));
122 g_assert (dconf_changeset_is_similar_to (b
, a
));
124 dconf_changeset_set (a
, "/value/c", NULL
);
125 dconf_changeset_set (b
, "/value/d", NULL
);
126 g_assert (!dconf_changeset_is_similar_to (a
, b
));
127 g_assert (!dconf_changeset_is_similar_to (b
, a
));
129 dconf_changeset_unref (a
);
130 dconf_changeset_unref (b
);
136 DConfChangeset
*changeset
;
137 const gchar
* const *keys
;
138 GVariant
* const *values
;
143 /* test zero items */
144 changeset
= dconf_changeset_new ();
145 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
146 g_assert_cmpint (n_items
, ==, 0);
147 dconf_changeset_unref (changeset
);
149 /* test one NULL item */
150 changeset
= dconf_changeset_new_write ("/value/a", NULL
);
151 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
152 g_assert_cmpint (n_items
, ==, 1);
153 g_assert_cmpstr (prefix
, ==, "/value/a");
154 g_assert_cmpstr (keys
[0], ==, "");
155 g_assert (keys
[1] == NULL
);
156 g_assert (values
[0] == NULL
);
163 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
164 g_assert_cmpint (n_items
, ==, 1);
165 g_assert_cmpstr (prefix
, ==, "/value/a");
166 g_assert_cmpstr (keys
[0], ==, "");
167 g_assert (keys
[1] == NULL
);
168 g_assert (values
[0] == NULL
);
169 dconf_changeset_unref (changeset
);
171 /* test one non-NULL item */
172 changeset
= dconf_changeset_new_write ("/value/a", g_variant_new_int32 (55));
173 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
174 g_assert_cmpint (n_items
, ==, 1);
175 g_assert_cmpstr (prefix
, ==, "/value/a");
176 g_assert_cmpstr (keys
[0], ==, "");
177 g_assert (keys
[1] == NULL
);
178 g_assert_cmpint (g_variant_get_int32 (values
[0]), ==, 55);
179 dconf_changeset_unref (changeset
);
181 /* test many items */
182 changeset
= dconf_changeset_new ();
183 for (i
= 0; i
< 100; i
++)
187 g_snprintf (key
, sizeof key
, "/test/value/%2d", i
);
189 dconf_changeset_set (changeset
, key
, g_variant_new_int32 (i
));
192 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
193 g_assert_cmpint (n_items
, ==, i
);
194 g_assert_cmpstr (prefix
, ==, "/test/value/");
195 for (i
= 0; i
< 100; i
++)
199 g_snprintf (key
, sizeof key
, "%2d", i
);
201 g_assert_cmpstr (keys
[i
], ==, key
);
202 g_assert_cmpint (g_variant_get_int32 (values
[i
]), ==, i
);
204 g_assert (keys
[n_items
] == NULL
);
205 dconf_changeset_unref (changeset
);
207 /* test many items with common names */
208 changeset
= dconf_changeset_new ();
209 for (i
= 0; i
< 100; i
++)
213 g_snprintf (key
, sizeof key
, "/test/value/aaa%02d", i
);
215 dconf_changeset_set (changeset
, key
, g_variant_new_int32 (i
));
218 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
219 g_assert_cmpint (n_items
, ==, i
);
220 g_assert_cmpstr (prefix
, ==, "/test/value/");
221 for (i
= 0; i
< 100; i
++)
225 g_snprintf (key
, sizeof key
, "aaa%02d", i
);
227 g_assert_cmpstr (keys
[i
], ==, key
);
228 g_assert_cmpint (g_variant_get_int32 (values
[i
]), ==, i
);
230 g_assert (keys
[n_items
] == NULL
);
231 dconf_changeset_unref (changeset
);
233 /* test several values in different directories */
234 changeset
= dconf_changeset_new ();
235 dconf_changeset_set (changeset
, "/value/reset/", NULL
);
236 dconf_changeset_set (changeset
, "/value/int/a", g_variant_new_int32 (123));
237 dconf_changeset_set (changeset
, "/value/string", g_variant_new_string ("bar"));
238 dconf_changeset_set (changeset
, "/value/string/a", g_variant_new_string ("foo"));
239 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
240 g_assert_cmpint (n_items
, ==, 4);
241 g_assert_cmpstr (prefix
, ==, "/value/");
242 g_assert_cmpstr (keys
[0], ==, "int/a");
243 g_assert_cmpint (g_variant_get_int32 (values
[0]), ==, 123);
244 g_assert_cmpstr (keys
[1], ==, "reset/");
245 g_assert (values
[1] == NULL
);
246 g_assert_cmpstr (keys
[2], ==, "string");
247 g_assert_cmpstr (g_variant_get_string (values
[2], NULL
), ==, "bar");
248 g_assert_cmpstr (keys
[3], ==, "string/a");
249 g_assert_cmpstr (g_variant_get_string (values
[3], NULL
), ==, "foo");
250 g_assert (keys
[4] == NULL
);
251 dconf_changeset_unref (changeset
);
253 /* test a couple of values in very different directories */
254 changeset
= dconf_changeset_new_write ("/a/deep/directory/", NULL
);
255 dconf_changeset_set (changeset
, "/another/deep/directory/", NULL
);
256 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
257 g_assert_cmpint (n_items
, ==, 2);
258 g_assert_cmpstr (prefix
, ==, "/");
259 g_assert_cmpstr (keys
[0], ==, "a/deep/directory/");
260 g_assert_cmpstr (keys
[1], ==, "another/deep/directory/");
261 g_assert (keys
[2] == NULL
);
262 g_assert (values
[0] == NULL
);
263 g_assert (values
[1] == NULL
);
264 dconf_changeset_unref (changeset
);
266 /* one more similar case, but with the first letter different */
267 changeset
= dconf_changeset_new_write ("/deep/directory/", NULL
);
268 dconf_changeset_set (changeset
, "/another/deep/directory/", NULL
);
269 n_items
= dconf_changeset_describe (changeset
, &prefix
, &keys
, &values
);
270 g_assert_cmpint (n_items
, ==, 2);
271 g_assert_cmpstr (prefix
, ==, "/");
272 g_assert_cmpstr (keys
[0], ==, "another/deep/directory/");
273 g_assert_cmpstr (keys
[1], ==, "deep/directory/");
274 g_assert (keys
[2] == NULL
);
275 g_assert (values
[0] == NULL
);
276 g_assert (values
[1] == NULL
);
277 dconf_changeset_unref (changeset
);
283 DConfChangeset
*changeset
;
286 changeset
= dconf_changeset_new ();
287 g_assert (!dconf_changeset_get (changeset
, "/value/a", NULL
));
288 g_assert (!dconf_changeset_get (changeset
, "/value/a", &value
));
289 /* value was not set */
292 dconf_changeset_set (changeset
, "/value/a", g_variant_new_boolean (TRUE
));
293 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
294 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
295 g_assert (value
!= NULL
);
296 g_variant_unref (value
);
298 /* record the reset */
299 dconf_changeset_set (changeset
, "/value/", NULL
);
300 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
301 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
302 g_assert (value
== NULL
);
305 dconf_changeset_set (changeset
, "/value/a", g_variant_new_boolean (TRUE
));
306 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
307 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
308 g_assert (value
!= NULL
);
309 g_variant_unref (value
);
312 dconf_changeset_set (changeset
, "/value/", NULL
);
313 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
314 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
315 g_assert (value
== NULL
);
318 dconf_changeset_set (changeset
, "/value/a", g_variant_new_boolean (TRUE
));
319 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
320 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
321 g_assert (value
!= NULL
);
322 g_variant_unref (value
);
324 /* reset a different way */
325 dconf_changeset_set (changeset
, "/value/a", NULL
);
326 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
327 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
328 g_assert (value
== NULL
);
330 /* write last time */
331 dconf_changeset_set (changeset
, "/value/a", g_variant_new_boolean (TRUE
));
332 g_assert (dconf_changeset_get (changeset
, "/value/a", NULL
));
333 g_assert (dconf_changeset_get (changeset
, "/value/a", &value
));
334 g_assert (value
!= NULL
);
335 g_variant_unref (value
);
337 dconf_changeset_unref (changeset
);
341 has_same_value (const gchar
*key
,
345 DConfChangeset
*other
= user_data
;
346 GVariant
*other_value
;
349 success
= dconf_changeset_get (other
, key
, &other_value
);
353 g_assert (other_value
== NULL
);
356 g_assert (g_variant_equal (value
, other_value
));
357 g_variant_unref (other_value
);
364 test_serialisation (DConfChangeset
*changes
)
366 GVariant
*serialised
;
367 DConfChangeset
*copy
;
369 serialised
= dconf_changeset_serialise (changes
);
370 copy
= dconf_changeset_deserialise (serialised
);
371 g_variant_unref (serialised
);
373 g_assert (dconf_changeset_is_similar_to (copy
, changes
));
374 g_assert (dconf_changeset_is_similar_to (changes
, copy
));
375 g_assert (dconf_changeset_all (copy
, has_same_value
, changes
));
376 g_assert (dconf_changeset_all (changes
, has_same_value
, copy
));
378 dconf_changeset_unref (copy
);
382 test_serialiser (void)
384 DConfChangeset
*changeset
;
386 changeset
= dconf_changeset_new ();
387 test_serialisation (changeset
);
389 dconf_changeset_set (changeset
, "/some/value", g_variant_new_int32 (333));
390 test_serialisation (changeset
);
392 dconf_changeset_set (changeset
, "/other/value", NULL
);
393 test_serialisation (changeset
);
395 dconf_changeset_set (changeset
, "/other/value", g_variant_new_int32 (55));
396 test_serialisation (changeset
);
398 dconf_changeset_set (changeset
, "/other/", NULL
);
399 test_serialisation (changeset
);
401 dconf_changeset_set (changeset
, "/", NULL
);
402 test_serialisation (changeset
);
404 dconf_changeset_unref (changeset
);
410 DConfChangeset
*deltaa
, *deltab
;
411 DConfChangeset
*dba
, *dbb
;
413 dba
= dconf_changeset_new_database (NULL
);
414 dbb
= dconf_changeset_new_database (dba
);
415 g_assert (dconf_changeset_is_empty (dbb
));
416 dconf_changeset_unref (dbb
);
418 deltaa
= dconf_changeset_new ();
419 dconf_changeset_change (dba
, deltaa
);
420 g_assert (dconf_changeset_is_empty (dba
));
421 dconf_changeset_unref (deltaa
);
423 deltaa
= dconf_changeset_new_write ("/some/value", NULL
);
424 dconf_changeset_change (dba
, deltaa
);
425 g_assert (dconf_changeset_is_empty (dba
));
426 dconf_changeset_unref (deltaa
);
428 deltaa
= dconf_changeset_new ();
429 deltab
= dconf_changeset_new_write ("/some/value", g_variant_new_int32 (123));
430 dconf_changeset_change (deltaa
, deltab
);
431 g_assert (!dconf_changeset_is_empty (deltaa
));
432 dconf_changeset_change (dba
, deltab
);
433 g_assert (!dconf_changeset_is_empty (dba
));
434 dconf_changeset_unref (deltaa
);
435 dconf_changeset_unref (deltab
);
437 deltaa
= dconf_changeset_new ();
438 deltab
= dconf_changeset_new_write ("/other/value", g_variant_new_int32 (123));
439 dconf_changeset_change (deltaa
, deltab
);
440 g_assert (!dconf_changeset_is_empty (deltaa
));
441 dconf_changeset_unref (deltab
);
442 deltab
= dconf_changeset_new_write ("/other/", NULL
);
443 dconf_changeset_change (deltaa
, deltab
);
444 g_assert (!dconf_changeset_is_empty (deltaa
));
445 dconf_changeset_change (dba
, deltaa
);
446 g_assert (!dconf_changeset_is_empty (dba
));
448 dbb
= dconf_changeset_new_database (dba
);
449 g_assert (!dconf_changeset_is_empty (dbb
));
451 dconf_changeset_set (dba
, "/some/", NULL
);
453 dconf_changeset_set (dba
, "/other/value", g_variant_new_int32 (123));
454 g_assert (!dconf_changeset_is_empty (dba
));
455 dconf_changeset_change (dba
, deltaa
);
456 g_assert (dconf_changeset_is_empty (dba
));
457 g_assert (!dconf_changeset_is_empty (dbb
));
459 dconf_changeset_unref (deltaa
);
460 dconf_changeset_unref (deltab
);
461 dconf_changeset_unref (dbb
);
462 dconf_changeset_unref (dba
);
466 assert_diff_change_invariant (DConfChangeset
*from
,
469 DConfChangeset
*copy
;
470 DConfChangeset
*diff
;
472 /* Verify this promise from the docs:
474 * Applying the returned changeset to @from using
475 * dconf_changeset_change() will result in the two changesets being
479 copy
= dconf_changeset_new_database (from
);
480 diff
= dconf_changeset_diff (from
, to
);
483 dconf_changeset_change (copy
, diff
);
484 dconf_changeset_unref (diff
);
487 /* Make sure they are now equal */
488 diff
= dconf_changeset_diff (copy
, to
);
489 g_assert (diff
== NULL
);
491 /* Why not try it the other way too? */
492 diff
= dconf_changeset_diff (to
, copy
);
493 g_assert (diff
== NULL
);
495 dconf_changeset_unref (copy
);
499 create_random_key (void)
504 key
= g_string_new (NULL
);
505 n
= g_test_rand_int_range (1, 5);
506 for (i
= 0; i
< n
; i
++)
510 g_string_append_c (key
, '/');
511 for (j
= 0; j
< 5; j
++)
512 g_string_append_c (key
, g_test_rand_int_range ('a', 'z' + 1));
515 return g_string_free (key
, FALSE
);
519 create_random_value (void)
521 return g_variant_new_take_string (create_random_key ());
524 static DConfChangeset
*
525 create_random_db (void)
530 set
= dconf_changeset_new_database (NULL
);
531 n
= g_test_rand_int_range (0, 20);
532 for (i
= 0; i
< n
; i
++)
534 GVariant
*value
= create_random_value ();
535 gchar
*key
= create_random_key ();
537 dconf_changeset_set (set
, key
, value
);
547 DConfChangeset
*a
, *b
;
550 /* Check diff between two empties */
551 a
= dconf_changeset_new_database (NULL
);
552 b
= dconf_changeset_new_database (NULL
);
553 assert_diff_change_invariant (a
, b
);
554 dconf_changeset_unref (a
);
555 dconf_changeset_unref (b
);
557 /* Check diff between two non-empties that are equal */
558 a
= create_random_db ();
559 b
= dconf_changeset_new_database (a
);
560 assert_diff_change_invariant (a
, b
);
561 dconf_changeset_unref (a
);
562 dconf_changeset_unref (b
);
564 /* Check diff between two random databases that are probably unequal */
565 for (i
= 0; i
< 1000; i
++)
567 a
= create_random_db ();
568 b
= create_random_db ();
569 assert_diff_change_invariant (a
, b
);
570 dconf_changeset_unref (a
);
571 dconf_changeset_unref (b
);
576 main (int argc
, char **argv
)
578 g_test_init (&argc
, &argv
, NULL
);
580 g_test_add_func ("/changeset/basic", test_basic
);
581 g_test_add_func ("/changeset/similarity", test_similarity
);
582 g_test_add_func ("/changeset/describe", test_describe
);
583 g_test_add_func ("/changeset/reset", test_reset
);
584 g_test_add_func ("/changeset/serialiser", test_serialiser
);
585 g_test_add_func ("/changeset/change", test_change
);
586 g_test_add_func ("/changeset/diff", test_diff
);
588 return g_test_run ();