summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorDaniel Playfair Cal <daniel.playfair.cal@gmail.com>2018-07-13 14:47:45 +0000
committerRay Strode <halfline@gmail.com>2018-07-13 14:47:45 +0000
commitd148fffb58935d69a20dcc42b3ce3d998742f0e7 (patch)
treeb4d508a34da52bc68e73341190ba087754e6fafe /tests
parente01be93304fdff9e4c5109ae50f1bc9e64524b0b (diff)
downloaddconf-d148fffb58935d69a20dcc42b3ce3d998742f0e7.tar.gz
Engine: track in progress watch handles to avoid spurious changed signals for the root path
Diffstat (limited to 'tests')
-rw-r--r--tests/engine.c66
1 files changed, 64 insertions, 2 deletions
diff --git a/tests/engine.c b/tests/engine.c
index a804b9a..aa1db1c 100644
--- a/tests/engine.c
+++ b/tests/engine.c
@@ -1153,7 +1153,7 @@ test_watch_fast (void)
DConfEngine *engine;
GvdbTable *table;
GVariant *triv;
- guint64 a, b;
+ guint64 a, b, c;
change_log = g_string_new (NULL);
@@ -1202,7 +1202,20 @@ test_watch_fast (void)
dconf_mock_dbus_assert_no_async ();
b = dconf_engine_get_state (engine);
g_assert_cmpuint (a, !=, b);
- g_assert_cmpstr (change_log->str, ==, "/:1::nil;");
+ g_assert_cmpstr (change_log->str, ==, "/a/b/c:1::nil;");
+ /* Try to establish a watch again for the same path */
+ dconf_engine_watch_fast (engine, "/a/b/c");
+ g_assert (!dconf_engine_has_outstanding (engine));
+ dconf_engine_sync (engine);
+ c = dconf_engine_get_state (engine);
+ g_assert_cmpuint (b, ==, c);
+ /* The watch result was not sent, because the path was already watched */
+ dconf_mock_dbus_assert_no_async();
+ c = dconf_engine_get_state (engine);
+ g_assert_cmpuint (b, ==, c);
+ /* Since the path was already being watched,
+ * do not expect a second false change notification */
+ g_assert_cmpstr (change_log->str, ==, "/a/b/c:1::nil;");
dconf_engine_unwatch_fast (engine, "/a/b/c");
dconf_mock_dbus_async_reply (triv, NULL);
dconf_mock_dbus_async_reply (triv, NULL);
@@ -1274,6 +1287,54 @@ test_watch_sync (void)
}
static void
+test_watching (void)
+{
+ DConfEngine *engine;
+ const gchar *apple = "apple";
+ const gchar *orange = "orange";
+ const gchar *banana = "banana";
+
+ engine = dconf_engine_new (SRCDIR "/profile/dos", NULL, NULL);
+
+ g_assert (!dconf_engine_is_watching(engine, apple, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, apple, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, orange, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, orange, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, banana, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, banana, FALSE));
+
+ dconf_engine_set_watching (engine, apple, FALSE, FALSE);
+ dconf_engine_set_watching (engine, orange, TRUE, FALSE);
+ dconf_engine_set_watching (engine, banana, TRUE, TRUE);
+
+ g_assert (!dconf_engine_is_watching(engine, apple, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, apple, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, orange, TRUE));
+ g_assert (dconf_engine_is_watching(engine, orange, FALSE));
+ g_assert (dconf_engine_is_watching(engine, banana, TRUE));
+ g_assert (dconf_engine_is_watching(engine, banana, FALSE));
+
+ dconf_engine_set_watching (engine, orange, TRUE, TRUE);
+ dconf_engine_set_watching (engine, banana, FALSE, FALSE);
+
+ g_assert (!dconf_engine_is_watching(engine, apple, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, apple, FALSE));
+ g_assert (dconf_engine_is_watching(engine, orange, TRUE));
+ g_assert (dconf_engine_is_watching(engine, orange, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, banana, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, banana, FALSE));
+
+ dconf_engine_set_watching (engine, orange, FALSE, FALSE);
+
+ g_assert (!dconf_engine_is_watching(engine, apple, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, apple, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, orange, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, orange, FALSE));
+ g_assert (!dconf_engine_is_watching(engine, banana, TRUE));
+ g_assert (!dconf_engine_is_watching(engine, banana, FALSE));
+}
+
+static void
test_change_fast (void)
{
DConfChangeset *empty, *good_write, *bad_write, *very_good_write, *slightly_bad_write;
@@ -1758,6 +1819,7 @@ main (int argc, char **argv)
g_test_add_func ("/engine/read", test_read);
g_test_add_func ("/engine/watch/fast", test_watch_fast);
g_test_add_func ("/engine/watch/sync", test_watch_sync);
+ g_test_add_func ("/engine/watch/watching", test_watching);
g_test_add_func ("/engine/change/fast", test_change_fast);
g_test_add_func ("/engine/change/sync", test_change_sync);
g_test_add_func ("/engine/signals", test_signals);