[gimp] app: Add regression testing for sessionrc/docks
- From: Martin Nordholts <martinn src gnome org>
- To: svn-commits-list gnome org
- Cc:
- Subject: [gimp] app: Add regression testing for sessionrc/docks
- Date: Wed, 16 Sep 2009 23:54:31 +0000 (UTC)
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]