[dconf] engine: issue warnings once per source



commit 048e2e5e9c89eb08ef954194f2a5505e3d4ace3a
Author: Ryan Lortie <desrt desrt ca>
Date:   Mon Nov 25 11:37:24 2013 -0500

    engine: issue warnings once per source
    
    On failure to open a gvdb file in /etc/dconf/db we would issue a warning
    once per process -- even if multiple files were missing.
    
    This was enforced using a static variable.
    
    An unfortunate side effect of this global state is that the testcases
    couldn't reliably know if to expect the error or not.  This issue was
    side-stepped by running any cases that may emit the warning under a
    fork, but that made it difficult to debug some of the cases.
    
    Rework the backends not to use global state for the flag and instead
    store it per-source.
    
    Remove a use of g_test_trap_fork().

 engine/dconf-engine-source-service.c |    5 +--
 engine/dconf-engine-source-system.c  |    5 +--
 engine/dconf-engine-source.h         |    1 +
 tests/engine.c                       |   47 +++++++++++++++++++++++++++------
 4 files changed, 43 insertions(+), 15 deletions(-)
---
diff --git a/engine/dconf-engine-source-service.c b/engine/dconf-engine-source-service.c
index 0bd0c05..b4da653 100644
--- a/engine/dconf-engine-source-service.c
+++ b/engine/dconf-engine-source-service.c
@@ -48,7 +48,6 @@ dconf_engine_source_service_needs_reopen (DConfEngineSource *source)
 static GvdbTable *
 dconf_engine_source_service_reopen (DConfEngineSource *source)
 {
-  static gboolean did_warn;
   GError *error = NULL;
   GvdbTable *table;
   gchar *filename;
@@ -68,10 +67,10 @@ dconf_engine_source_service_reopen (DConfEngineSource *source)
 
       if (table == NULL)
         {
-          if (!did_warn)
+          if (!source->did_warn)
             {
               g_warning ("unable to open file '%s': %s; expect degraded performance", filename, 
error->message);
-              did_warn = TRUE;
+              source->did_warn = TRUE;
             }
 
           g_error_free (error);
diff --git a/engine/dconf-engine-source-system.c b/engine/dconf-engine-source-system.c
index 5d48e7f..30e67eb 100644
--- a/engine/dconf-engine-source-system.c
+++ b/engine/dconf-engine-source-system.c
@@ -45,7 +45,6 @@ dconf_engine_source_system_needs_reopen (DConfEngineSource *source)
 static GvdbTable *
 dconf_engine_source_system_reopen (DConfEngineSource *source)
 {
-  static gboolean did_warn;
   GError *error = NULL;
   GvdbTable *table;
   gchar *filename;
@@ -55,10 +54,10 @@ dconf_engine_source_system_reopen (DConfEngineSource *source)
 
   if (table == NULL)
     {
-      if (!did_warn)
+      if (!source->did_warn)
         {
           g_warning ("unable to open file '%s': %s; expect degraded performance", filename, error->message);
-          did_warn = TRUE;
+          source->did_warn = TRUE;
         }
 
       g_error_free (error);
diff --git a/engine/dconf-engine-source.h b/engine/dconf-engine-source.h
index 3828dba..8aefc41 100644
--- a/engine/dconf-engine-source.h
+++ b/engine/dconf-engine-source.h
@@ -47,6 +47,7 @@ struct _DConfEngineSource
   GvdbTable *locks;
   GBusType   bus_type;
   gboolean   writable;
+  gboolean   did_warn;
   gchar     *bus_name;
   gchar     *object_path;
   gchar     *name;
diff --git a/tests/engine.c b/tests/engine.c
index 578c928..156e2bc 100644
--- a/tests/engine.c
+++ b/tests/engine.c
@@ -858,6 +858,35 @@ check_read (DConfEngine *engine,
     }
 }
 
+static gboolean
+is_expected (const gchar    *log_domain,
+             GLogLevelFlags  log_level,
+             const gchar    *message)
+{
+  return g_str_equal (log_domain, "dconf") &&
+         log_level == (G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL) &&
+         strstr (message, "unable to open file '/etc/dconf/db");
+}
+
+static gboolean
+fatal_handler (const gchar    *log_domain,
+               GLogLevelFlags  log_level,
+               const gchar    *message,
+               gpointer        user_data)
+{
+  return !is_expected (log_domain, log_level, message);
+}
+
+static void
+normal_handler (const gchar    *log_domain,
+                GLogLevelFlags  log_level,
+                const gchar    *message,
+                gpointer        user_data)
+{
+  if (!is_expected (log_domain, log_level, message))
+    g_error ("unexpected error: %s\n", message);
+}
+
 static void
 test_read (void)
 {
@@ -868,15 +897,13 @@ test_read (void)
   DConfEngine *engine;
   guint i, j, k;
   guint n;
+  guint handler_id;
 
-  /* Hack to silence warning */
-  if (!g_test_trap_fork (0, G_TEST_TRAP_SILENCE_STDERR))
-    {
-      g_test_trap_assert_passed ();
-      g_test_trap_assert_stderr ("*this gvdb does not exist; expect degraded performance*");
-      return;
-    }
-  g_log_set_always_fatal (G_LOG_LEVEL_ERROR);
+  /* This test throws a lot of messages about missing databases.
+   * Capture and ignore them.
+   */
+  g_test_log_set_fatal_handler (fatal_handler, NULL);
+  handler_id = g_log_set_handler ("dconf", G_LOG_LEVEL_WARNING | G_LOG_FLAG_FATAL, normal_handler, NULL);
 
   /* Our test strategy is as follows:
    *
@@ -1050,7 +1077,9 @@ test_read (void)
   g_unsetenv ("DCONF_PROFILE");
   g_unlink (profile_filename);
   g_free (profile_filename);
-  exit (0);
+  dconf_mock_shm_reset ();
+
+  g_log_remove_handler ("dconf", handler_id);
 }
 
 static void


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]