summaryrefslogtreecommitdiffstats
path: root/app/tests/gimp-test-session-utils.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--app/tests/gimp-test-session-utils.c244
1 files changed, 244 insertions, 0 deletions
diff --git a/app/tests/gimp-test-session-utils.c b/app/tests/gimp-test-session-utils.c
new file mode 100644
index 0000000..8d16fe3
--- /dev/null
+++ b/app/tests/gimp-test-session-utils.c
@@ -0,0 +1,244 @@
+/* GIMP - The GNU Image Manipulation Program
+ * Copyright (C) 2011 Martin Nordholts <martinn@src.gnome.org>
+ *
+ * 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 <https://www.gnu.org/licenses/>.
+ */
+
+#include "config.h"
+
+#include <gegl.h>
+#include <glib/gstdio.h>
+#include <gtk/gtk.h>
+#include <stdlib.h>
+#include <string.h>
+#include <utime.h>
+
+#include "libgimpbase/gimpbase.h"
+
+#include "dialogs/dialogs-types.h"
+
+#include "widgets/gimpdialogfactory.h"
+#include "widgets/gimpsessioninfo.h"
+
+#include "core/gimp.h"
+#include "core/gimpcontext.h"
+
+#include "tests.h"
+
+#include "gimp-app-test-utils.h"
+#include "gimp-test-session-utils.h"
+
+
+typedef struct
+{
+ gchar *filename;
+ gchar *md5;
+ guint64 modtime;
+} GimpTestFileState;
+
+
+static gboolean
+gimp_test_get_file_state_verbose (const gchar *filename,
+ GimpTestFileState *filestate)
+{
+ gboolean success = TRUE;
+
+ filestate->filename = g_strdup (filename);
+
+ /* Get checksum */
+ if (success)
+ {
+ gchar *contents = NULL;
+ gsize length = 0;
+
+ success = g_file_get_contents (filename,
+ &contents,
+ &length,
+ NULL);
+ if (success)
+ {
+ filestate->md5 = 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)
+ {
+ filestate->modtime = g_file_info_get_attribute_uint64 (
+ info, G_FILE_ATTRIBUTE_TIME_MODIFIED);
+ success = TRUE;
+ g_object_unref (info);
+ }
+ else
+ {
+ success = FALSE;
+ }
+
+ g_object_unref (file);
+ }
+
+ if (! success)
+ g_printerr ("Failed to get initial file info for '%s'\n", filename);
+
+ return success;
+}
+
+static gboolean
+gimp_test_file_state_changes (const gchar *filename,
+ GimpTestFileState *state1,
+ GimpTestFileState *state2)
+{
+ if (state1->modtime == state2->modtime)
+ {
+ g_printerr ("A new '%s' was not created\n", filename);
+ return FALSE;
+ }
+
+ if (strcmp (state1->md5, state2->md5) != 0)
+ {
+ char *diff_argv[5] = {
+ "diff",
+ "-u",
+ state1->filename,
+ state2->filename,
+ NULL
+ };
+
+ g_printerr ("'%s' was changed but should not have been. Reason, using "
+ "`diff -u $expected $actual`\n", filename);
+
+ g_spawn_sync (NULL /*working_directory*/,
+ diff_argv,
+ NULL /*envp*/,
+ G_SPAWN_SEARCH_PATH,
+ NULL /*child_setup*/,
+ NULL /*user_data*/,
+ NULL /*standard_output*/,
+ NULL /*standard_error*/,
+ NULL /*exist_status*/,
+ NULL /*error*/);
+
+ return FALSE;
+ }
+
+ return TRUE;
+}
+
+/**
+ * gimp_test_session_load_and_write_session_files:
+ * @loaded_sessionrc: The name of the file of the sessionrc file to
+ * load
+ * @loaded_dockrc: The name of the file of the dockrc file to load
+ * @expected_sessionrc: The name of the file with the expected
+ * sessionrc file content
+ * @expected_dockrc: The name of the file with the expected dockrc
+ * file content
+ *
+ * Utility function for the various session management tests. We can't
+ * easily have all those tests in a single program several Gimp
+ * instance can't easily be initialized in the same process.
+ **/
+void
+gimp_test_session_load_and_write_session_files (const gchar *loaded_sessionrc,
+ const gchar *loaded_dockrc,
+ const gchar *expected_sessionrc,
+ const gchar *expected_dockrc,
+ gboolean single_window_mode)
+{
+ Gimp *gimp;
+ GimpTestFileState initial_sessionrc_state = { NULL, NULL, 0 };
+ GimpTestFileState initial_dockrc_state = { NULL, NULL, 0 };
+ GimpTestFileState final_sessionrc_state = { NULL, NULL, 0 };
+ GimpTestFileState final_dockrc_state = { NULL, NULL, 0 };
+ gchar *sessionrc_filename = NULL;
+ gchar *dockrc_filename = NULL;
+
+ /* Make sure to run this before we use any GIMP functions */
+ gimp_test_utils_set_gimp2_directory ("GIMP_TESTING_ABS_TOP_SRCDIR",
+ "app/tests/gimpdir");
+ gimp_test_utils_setup_menus_path ();
+
+ /* Note that we expect the resulting sessionrc to be different from
+ * the read file, which is why we check the MD5 of the -expected
+ * variant
+ */
+ sessionrc_filename = gimp_personal_rc_file (expected_sessionrc);
+ dockrc_filename = gimp_personal_rc_file (expected_dockrc);
+
+ /* Remember the modtimes and MD5s */
+ g_assert (gimp_test_get_file_state_verbose (sessionrc_filename,
+ &initial_sessionrc_state));
+ g_assert (gimp_test_get_file_state_verbose (dockrc_filename,
+ &initial_dockrc_state));
+
+ /* Use specific input files when restoring the session */
+ g_setenv ("GIMP_TESTING_SESSIONRC_NAME", loaded_sessionrc, TRUE /*overwrite*/);
+ g_setenv ("GIMP_TESTING_DOCKRC_NAME", loaded_dockrc, TRUE /*overwrite*/);
+
+ /* Start up GIMP */
+ gimp = gimp_init_for_gui_testing (TRUE /*show_gui*/);
+
+ /* Let the main loop run until idle to let things stabilize. This
+ * includes parsing sessionrc and dockrc
+ */
+ gimp_test_run_mainloop_until_idle ();
+
+ /* Change the gimp dir to the output dir so files are written there,
+ * we don't want to (can't always) write to files in the source
+ * dir. There is a hook in Makefile.am that makes sure the output
+ * dir exists
+ */
+ gimp_test_utils_set_gimp2_directory ("GIMP_TESTING_ABS_TOP_BUILDDIR",
+ "app/tests/gimpdir-output");
+ /* Use normal output names */
+ g_unsetenv ("GIMP_TESTING_SESSIONRC_NAME");
+ g_unsetenv ("GIMP_TESTING_DOCKRC_NAME");
+
+ g_free (sessionrc_filename);
+ g_free (dockrc_filename);
+ sessionrc_filename = gimp_personal_rc_file ("sessionrc");
+ dockrc_filename = gimp_personal_rc_file ("dockrc");
+
+ /* Exit. This includes writing sessionrc and dockrc*/
+ gimp_exit (gimp, TRUE);
+
+ /* Now get the new modtimes and MD5s */
+ g_assert (gimp_test_get_file_state_verbose (sessionrc_filename,
+ &final_sessionrc_state));
+ g_assert (gimp_test_get_file_state_verbose (dockrc_filename,
+ &final_dockrc_state));
+
+ /* If things have gone our way, GIMP will have deserialized
+ * sessionrc and dockrc, shown the GUI, and then serialized the new
+ * files. To make sure we have new files we check the modtime, and
+ * to make sure that their content remains the same we compare their
+ * MD5
+ */
+ g_assert (gimp_test_file_state_changes ("sessionrc",
+ &initial_sessionrc_state,
+ &final_sessionrc_state));
+ g_assert (gimp_test_file_state_changes ("dockrc",
+ &initial_dockrc_state,
+ &final_dockrc_state));
+}