[gimp] app: Add regression testing for sessionrc/docks



commit 6e0befa6ba87823df645ad3e153f4f68111a6894
Author: Martin Nordholts <martinn src gnome org>
Date:   Thu Sep 17 01:12:21 2009 +0200

    app: Add regression testing for sessionrc/docks
    
    Add a regression test for sessionrc parsing, handing and writing. The
    test work in the following way: GIMP starts so that sessionrc is
    deserialized and stored internally, the UI is shown, and then the
    internal data structure about windows is serialized to a new
    sessionrc. The test makes sure that a new sessionrc actually has been
    created, and then that the content of the new file is identical to the
    old one.

 app/tests/.gitignore                |    1 +
 app/tests/Makefile.am               |   12 ++-
 app/tests/gimpdir/.gitignore        |    1 -
 app/tests/gimpdir/sessionrc         |   86 +++++++++++++++++++
 app/tests/test-session-management.c |  160 +++++++++++++++++++++++++++++++++++
 5 files changed, 254 insertions(+), 6 deletions(-)
---
diff --git a/app/tests/.gitignore b/app/tests/.gitignore
index 64c9614..f1c039a 100644
--- a/app/tests/.gitignore
+++ b/app/tests/.gitignore
@@ -3,4 +3,5 @@
 /Makefile.in
 /test-layer-grouping*
 /test-layers*
+/test-session-management*
 /test-window-management*
diff --git a/app/tests/Makefile.am b/app/tests/Makefile.am
index bb1ebe6..5046ce2 100644
--- a/app/tests/Makefile.am
+++ b/app/tests/Makefile.am
@@ -3,15 +3,17 @@ TESTS_ENVIRONMENT = \
 	GIMP2_DIRECTORY=$(abs_top_srcdir)/app/tests/gimpdir
 
 TESTS = \
+	test-layer-grouping	\
 	test-layers		\
-	test-window-management	\
-	test-layer-grouping
+	test-session-management	\
+	test-window-management
 
 EXTRA_PROGRAMS = $(TESTS)
 
-test_layers_SOURCES            = test-layers.c
-test_layer_grouping_SOURCES    = test-layer-grouping.c
-test_window_management_SOURCES = test-window-management.c
+test_layers_SOURCES             = test-layers.c
+test_layer_grouping_SOURCES     = test-layer-grouping.c
+test_window_management_SOURCES  = test-window-management.c
+test_session_management_SOURCES = test-session-management.c
 
 libgimpbase = $(top_builddir)/libgimpbase/libgimpbase-$(GIMP_API_VERSION).la
 libgimpconfig = $(top_builddir)/libgimpconfig/libgimpconfig-$(GIMP_API_VERSION).la
diff --git a/app/tests/gimpdir/.gitignore b/app/tests/gimpdir/.gitignore
index fa44da7..b7d4064 100644
--- a/app/tests/gimpdir/.gitignore
+++ b/app/tests/gimpdir/.gitignore
@@ -4,7 +4,6 @@
 /menurc
 /parasiterc
 /pluginrc
-/sessionrc
 /templaterc
 /themerc
 /toolrc
diff --git a/app/tests/gimpdir/sessionrc b/app/tests/gimpdir/sessionrc
new file mode 100644
index 0000000..36d5707
--- /dev/null
+++ b/app/tests/gimpdir/sessionrc
@@ -0,0 +1,86 @@
+# GIMP sessionrc
+# 
+# This file takes session-specific info (that is info, you want to keep
+# between two GIMP sessions).  You are not supposed to edit it manually, but
+# of course you can do.  The sessionrc will be entirely rewritten every time
+# you quit GIMP.  If this file isn't found, defaults are used.
+
+(session-info "dock" "dock"
+    (position 428 198)
+    (size 210 523)
+    (open-on-exit)
+    (aux-info
+        (show-image-menu "true")
+        (follow-active-image "true"))
+    (dock
+        (book
+            (current-page 1)
+            (dockable "gimp-layer-list"
+                (tab-style icon)
+                (preview-size 32))
+            (dockable "gimp-undo-history"
+                (tab-style icon)))
+        (book
+            (position 259)
+            (current-page 0)
+            (dockable "gimp-brush-grid"
+                (tab-style preview)))))
+(session-info "dock" "dock"
+    (position 184 358)
+    (size 200 300)
+    (open-on-exit)
+    (aux-info
+        (show-image-menu "false")
+        (follow-active-image "true"))
+    (dock
+        (book
+            (current-page 0)
+            (dockable "gimp-tool-options"
+                (tab-style icon)))))
+(session-info "dock" "dock"
+    (position 769 64)
+    (size 200 265)
+    (open-on-exit)
+    (aux-info
+        (show-image-menu "true")
+        (follow-active-image "true"))
+    (dock
+        (book
+            (current-page 1)
+            (dockable "gimp-pattern-grid"
+                (tab-style preview))
+            (dockable "gimp-gradient-list"
+                (tab-style preview)))))
+(session-info "dock" "dock"
+    (position 714 320)
+    (size 200 384)
+    (open-on-exit)
+    (aux-info
+        (show-image-menu "true")
+        (follow-active-image "true"))
+    (dock
+        (book
+            (current-page 0)
+            (dockable "gimp-channel-list"
+                (tab-style icon)
+                (preview-size 32)))
+        (book
+            (position 169)
+            (current-page 0)
+            (dockable "gimp-vectors-list"
+                (tab-style icon)
+                (preview-size 32)))))
+(session-info "toolbox" "dock"
+    (position 44 104)
+    (size 102 526)
+    (open-on-exit))
+(session-info "toplevel" "gimp-file-open-dialog"
+    (position 392 140)
+    (size 902 816))
+(session-info "display" "gimp-empty-image-window"
+    (position 178 35)
+    (size 563 190))
+
+(last-tip-shown 0)
+
+# end of sessionrc
diff --git a/app/tests/test-session-management.c b/app/tests/test-session-management.c
new file mode 100644
index 0000000..83d60ce
--- /dev/null
+++ b/app/tests/test-session-management.c
@@ -0,0 +1,160 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 2009 Martin Nordholts
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gegl.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#include <string.h>
+#include <utime.h>
+
+#include "libgimpbase/gimpbase.h"
+
+#include "dialogs/dialogs-types.h"
+
+#include "dialogs/dialogs.h"
+
+#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpsessioninfo.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
+
+#include "tests.h"
+
+
+typedef struct
+{
+  int dummy;
+} GimpTestFixture;
+
+
+static gboolean gimp_test_get_sessionrc_timestamp_and_md5 (gchar    **checksum,
+                                                           GTimeVal  *modtime);
+
+static Gimp *gimp = NULL;
+
+
+int main(int argc, char **argv)
+{
+  gchar    *initial_md5     = NULL;
+  gchar    *final_md5       = NULL;
+  GTimeVal  initial_modtime = { 0, };
+  GTimeVal  final_modtime   = { 0, };
+
+  g_type_init ();
+  gtk_init (&argc, &argv);
+  g_test_init (&argc, &argv, NULL);
+
+  /* Remeber the timestamp and MD5 on sessionrc */
+  if (!gimp_test_get_sessionrc_timestamp_and_md5 (&initial_md5,
+                                                  &initial_modtime))
+    goto fail;
+
+  /* Start up GIMP and let the main loop run for a while (quits after
+   * a short timeout) to let things stabilize. This includes parsing
+   * sessionrc
+   */
+  gimp = gimp_init_for_gui_testing (FALSE, TRUE);
+  gimp_test_run_temp_mainloop (4000);
+
+  /* Exit. This includes writing sessionrc */
+  gimp_exit (gimp, TRUE);
+
+  /* Now get the new MD5 and modtime */
+  if (!gimp_test_get_sessionrc_timestamp_and_md5 (&final_md5,
+                                                  &final_modtime))
+    goto fail;
+
+  /* If things have gone our way, GIMP will have deserialized
+   * sessionrc, shown the GUI, and then serialized the new sessionrc.
+   * To make sure we have a new sessionrc we check the modtime, and to
+   * make sure that the sessionrc remains the same we compare its MD5
+   */
+  if (initial_modtime.tv_sec == final_modtime.tv_sec)
+    {
+      g_printerr ("A new sessionrc was not created\n");
+      goto fail;
+    }
+  if (strcmp (initial_md5, final_md5) != 0)
+    {
+      g_printerr ("The new sessionrc is not identical to the old one\n");
+      goto fail;
+    }
+
+  g_free (initial_md5);
+  g_free (final_md5);
+
+  return 0;
+
+ fail:
+  return -1;
+}
+
+static gboolean
+gimp_test_get_sessionrc_timestamp_and_md5 (gchar    **checksum,
+                                           GTimeVal  *modtime)
+{
+  gchar    *filename = NULL;
+  gboolean  success  = TRUE;
+
+  filename = gimp_personal_rc_file ("sessionrc");
+
+  /* Get checksum */
+  if (success)
+    {
+      gchar *contents = NULL;
+      gsize  length   = 0;
+
+      success = g_file_get_contents (filename,
+                                     &contents,
+                                     &length,
+                                     NULL);
+      if (success)
+        {
+          *checksum = g_compute_checksum_for_string (G_CHECKSUM_MD5,
+                                                     contents,
+                                                     length);
+        }
+
+      g_free (contents);
+    }
+
+  /* Get modification time */
+  if (success)
+    {
+      GFile     *file = g_file_new_for_path (filename);
+      GFileInfo *info = g_file_query_info (file,
+                                           G_FILE_ATTRIBUTE_TIME_MODIFIED, 0,
+                                           NULL, NULL);
+      if (info)
+        {
+          g_file_info_get_modification_time (info, modtime);
+          success = TRUE;
+          g_object_unref (info);
+        }
+      else
+        {
+          success = FALSE;
+        }
+
+      g_object_unref (file);
+    }
+
+  g_free (filename);
+
+  return success;
+}



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