[gedit] Added tests for document saver



commit 3b4841f72738758a1de56287ce9fcfb8b0a5f3bb
Author: Jesse van den Kieboom <jesse icecrew nl>
Date:   Sat Jan 23 17:42:15 2010 +0100

    Added tests for document saver

 tests/Makefile.am             |    4 +
 tests/document-saver.c        |  722 +++++++++++++++++++++++++++++++++++++++++
 tests/setup-document-saver.sh |   27 ++
 3 files changed, 753 insertions(+), 0 deletions(-)
---
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 2641d3f..04c7320 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -15,3 +15,7 @@ document_input_stream_LDADD	= $(progs_ldadd)
 TEST_PROGS			+= document-loader
 document_loader_SOURCES		= document-loader.c
 document_loader_LDADD		= $(progs_ldadd)
+
+TEST_PROGS			+= document-saver
+document_saver_SOURCES		= document-saver.c
+document_saver_LDADD		= $(progs_ldadd)
diff --git a/tests/document-saver.c b/tests/document-saver.c
new file mode 100644
index 0000000..1119eb6
--- /dev/null
+++ b/tests/document-saver.c
@@ -0,0 +1,722 @@
+/*
+ * document-saver.c
+ * This file is part of gedit
+ *
+ * Copyright (C) 2010 - Jesse van den Kieboom
+ *
+ * gedit 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 2 of the License, or
+ * (at your option) any later version.
+ *
+ * gedit 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 gedit; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, 
+ * Boston, MA  02110-1301  USA
+ */
+
+#include "gedit-gio-document-loader.h"
+#include <gio/gio.h>
+#include <gtk/gtk.h>
+#include <glib.h>
+#include <string.h>
+#include <sys/stat.h>
+
+#define DEFAULT_LOCAL_URI "/tmp/gedit-document-saver-test.txt"
+#define DEFAULT_REMOTE_URI "sftp://localhost/tmp/gedit-document-saver-test.txt";
+#define DEFAULT_CONTENT "hello world!"
+#define DEFAULT_CONTENT_RESULT "hello world!\n"
+
+#define UNOWNED_LOCAL_DIRECTORY "/tmp/gedit-document-saver-unowned"
+#define UNOWNED_LOCAL_URI "/tmp/gedit-document-saver-unowned/gedit-document-saver-test.txt"
+
+#define UNOWNED_REMOTE_DIRECTORY "sftp://localhost/tmp/gedit-document-saver-unowned";
+#define UNOWNED_REMOTE_URI "sftp://localhost/tmp/gedit-document-saver-unowned/gedit-document-saver-test.txt";
+
+#define UNOWNED_GROUP_LOCAL_URI "/tmp/gedit-document-saver-unowned-group.txt"
+#define UNOWNED_GROUP_REMOTE_URI "sftp://localhost/tmp/gedit-document-saver-unowned-group.txt";
+
+static gboolean test_completed;
+static gboolean mount_completed;
+static gboolean mount_success;
+
+typedef struct
+{
+	gchar *uri;
+	const gchar *test_contents;
+	gpointer data;
+} SaverTestData;
+
+static SaverTestData *
+saver_test_data_new (const gchar *uri, const gchar *test_contents, gpointer data)
+{
+	SaverTestData *ret = g_slice_new (SaverTestData);
+
+	ret->uri = g_strdup (uri);
+	ret->test_contents = test_contents;
+	ret->data = data;
+
+	return ret;
+}
+
+static void
+saver_test_data_free (SaverTestData *data)
+{
+	if (data == NULL)
+	{
+		return;
+	}
+
+	g_free (data->uri);
+	g_slice_free (SaverTestData, data);
+}
+
+static GeditDocument *
+create_document (const gchar *contents)
+{
+	GeditDocument *document = gedit_document_new ();
+
+	gtk_text_buffer_set_text (GTK_TEXT_BUFFER (document), contents, -1);
+	return document;
+}
+
+static void
+complete_test_error (GeditDocument *document,
+                     GError        *error,
+                     SaverTestData *data)
+{
+	g_assert_no_error (error);
+}
+
+static const gchar *
+read_file (const gchar *uri)
+{
+	GFile *file = g_file_new_for_commandline_arg (uri);
+	GError *error = NULL;
+	static gchar buffer[4096];
+	gsize read;
+
+	GInputStream *stream = G_INPUT_STREAM (g_file_read (file, NULL, &error));
+
+	g_assert_no_error (error);
+
+	g_input_stream_read_all (stream, buffer, sizeof (buffer) - 1, &read, NULL, &error);
+	g_assert_no_error (error);
+
+	buffer[read] = '\0';
+
+	g_input_stream_close (stream, NULL, NULL);
+
+	g_object_unref (stream);
+	g_object_unref (file);
+
+	return buffer;
+}
+
+static void
+complete_test (GeditDocument *document,
+               GError        *error,
+               SaverTestData *data)
+{
+	test_completed = TRUE;
+
+	if (data && data->test_contents && data->uri)
+	{
+		g_assert_cmpstr (data->test_contents, ==, read_file (data->uri));
+	}
+}
+
+static void
+mount_ready_callback (GObject      *object,
+                      GAsyncResult *result,
+                      gpointer      data)
+{
+	GError *error = NULL;
+	mount_success = g_file_mount_enclosing_volume_finish (G_FILE (object),
+	                                                      result,
+	                                                      &error);
+
+	if (error && error->code == G_IO_ERROR_ALREADY_MOUNTED)
+	{
+		mount_success = TRUE;
+		g_error_free (error);
+	}
+	else
+	{
+		g_assert_no_error (error);
+	}
+
+	mount_completed = TRUE;
+}
+
+static gboolean
+ensure_mounted (GFile *file)
+{
+	GMountOperation *mo;
+
+	mount_success = FALSE;
+	mount_completed = FALSE;
+
+	if (g_file_is_native (file))
+	{
+		return TRUE;
+	}
+
+	mo = gtk_mount_operation_new (NULL);
+
+	g_file_mount_enclosing_volume (file,
+	                               G_MOUNT_MOUNT_NONE,
+	                               mo,
+	                               NULL,
+	                               mount_ready_callback,
+	                               NULL);
+
+	while (!mount_completed)
+	{
+		g_main_context_iteration (NULL, TRUE);
+	}
+
+	g_object_unref (mo);
+
+	return mount_success;
+}
+
+static void
+test_saver (const gchar              *filename_or_uri,
+            const gchar              *contents,
+            GeditDocumentNewlineType  newline_type,
+            GeditDocumentSaveFlags    save_flags,
+            GCallback                 saved_callback,
+            SaverTestData            *data)
+{
+	GFile *file;
+	gchar *uri;
+	GeditDocument *document;
+	gboolean existed;
+
+	document = create_document (contents);
+	gedit_document_set_newline_type (document, newline_type);
+
+	g_signal_connect (document, "saved", G_CALLBACK (complete_test_error), data);
+
+	if (saved_callback)
+	{
+		g_signal_connect (document, "saved", saved_callback, data);
+	}
+
+	g_signal_connect_after (document, "saved", G_CALLBACK (complete_test), data);
+
+	test_completed = FALSE;
+
+	file = g_file_new_for_commandline_arg (filename_or_uri);
+	uri = g_file_get_uri (file);
+	existed = g_file_query_exists (file, NULL);
+
+	ensure_mounted (file);
+
+	gedit_document_save_as (document, uri, gedit_encoding_get_utf8 (), save_flags);
+
+	while (!test_completed)
+	{
+		g_main_context_iteration (NULL, TRUE);
+	}
+
+	if (!existed)
+	{
+		g_file_delete (file, NULL, NULL);
+	}
+
+	g_free (uri);
+	g_object_unref (file);
+
+	saver_test_data_free (data);
+}
+
+typedef struct
+{
+	GeditDocumentNewlineType type;
+	const gchar *text;
+	const gchar *result;
+} NewLineTestData;
+
+static NewLineTestData newline_test_data[] = {
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\nhello\nworld", "\nhello\nworld\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\nhello\nworld\n", "\nhello\nworld\n\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\nhello\nworld\n\n", "\nhello\nworld\n\n\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\r\nhello\r\nworld", "\nhello\nworld\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\r\nhello\r\nworld\r\n", "\nhello\nworld\n\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\rhello\rworld", "\nhello\nworld\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\rhello\rworld\r", "\nhello\nworld\n\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\nhello\r\nworld", "\nhello\nworld\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_LF, "\nhello\r\nworld\r", "\nhello\nworld\n\n"},
+
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\nhello\nworld", "\r\nhello\r\nworld\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\nhello\nworld\n", "\r\nhello\r\nworld\r\n\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\nhello\nworld\n\n", "\r\nhello\r\nworld\r\n\r\n\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\r\nhello\r\nworld", "\r\nhello\r\nworld\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\r\nhello\r\nworld\r\n", "\r\nhello\r\nworld\r\n\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\rhello\rworld", "\r\nhello\r\nworld\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\rhello\rworld\r", "\r\nhello\r\nworld\r\n\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\nhello\r\nworld", "\r\nhello\r\nworld\r\n"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR_LF, "\nhello\r\nworld\r", "\r\nhello\r\nworld\r\n\r\n"},
+
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\nhello\nworld", "\rhello\rworld\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\nhello\nworld\n", "\rhello\rworld\r\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\nhello\nworld\n\n", "\rhello\rworld\r\r\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\r\nhello\r\nworld", "\rhello\rworld\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\r\nhello\r\nworld\r\n", "\rhello\rworld\r\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\rhello\rworld", "\rhello\rworld\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\rhello\rworld\r", "\rhello\rworld\r\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\nhello\r\nworld", "\rhello\rworld\r"},
+	{GEDIT_DOCUMENT_NEWLINE_TYPE_CR, "\nhello\r\nworld\r", "\rhello\rworld\r\r"}
+};
+
+static void
+test_new_line (const gchar *filename, GeditDocumentSaveFlags save_flags)
+{
+	gint i;
+	gint num = sizeof (newline_test_data) / sizeof (NewLineTestData);
+
+	for (i = 0; i < num; ++i)
+	{
+		NewLineTestData *nt = &(newline_test_data[i]);
+
+		test_saver (filename,
+		            nt->text,
+		            nt->type,
+		            save_flags,
+		            NULL,
+		            saver_test_data_new (filename, nt->result, NULL));
+	}
+}
+
+static void
+test_local_newline ()
+{
+	test_new_line (DEFAULT_LOCAL_URI, 0);
+}
+
+static void
+test_local ()
+{
+	test_saver (DEFAULT_LOCAL_URI,
+	            "hello world",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_LOCAL_URI, "hello world\n", NULL));
+
+	test_saver (DEFAULT_LOCAL_URI,
+	            "hello world\r\n",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_LOCAL_URI, "hello world\n\n", NULL));
+
+	test_saver (DEFAULT_LOCAL_URI,
+	            "hello world\n",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_LOCAL_URI, "hello world\n\n", NULL));
+}
+
+static void
+test_remote_newline ()
+{
+	test_new_line (DEFAULT_REMOTE_URI, 0);
+}
+
+static void
+test_remote ()
+{
+	test_saver (DEFAULT_REMOTE_URI,
+	            "hello world",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_REMOTE_URI, "hello world\n", NULL));
+
+	test_saver (DEFAULT_REMOTE_URI,
+	            "hello world\r\n",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_REMOTE_URI, "hello world\n\n", NULL));
+
+	test_saver (DEFAULT_REMOTE_URI,
+	            "hello world\n",
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (DEFAULT_REMOTE_URI, "hello world\n\n", NULL));
+}
+
+static void
+check_permissions (GFile *file,
+                   guint  permissions)
+{
+	GError *error = NULL;
+	GFileInfo *info;
+
+	info = g_file_query_info (file,
+	                          G_FILE_ATTRIBUTE_UNIX_MODE,
+	                          G_FILE_QUERY_INFO_NONE,
+	                          NULL,
+	                          &error);
+
+	g_assert_no_error (error);
+
+	g_assert_cmpint (permissions,
+	                 ==,
+	                 g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE) & ACCESSPERMS);
+
+}
+
+static void
+check_permissions_saved (GeditDocument *document,
+                         GError        *error,
+                         SaverTestData *data)
+{
+	guint permissions = (guint)GPOINTER_TO_INT (data->data);
+	GFile *file = gedit_document_get_location (document);
+
+	check_permissions (file, permissions);
+
+	g_object_unref (file);
+}
+
+static void
+test_permissions (const gchar *uri,
+                  guint        permissions)
+{
+	GError *error = NULL;
+	GFile *file = g_file_new_for_commandline_arg (uri);
+	GFileOutputStream *stream;
+	GFileInfo *info;
+	guint mode;
+
+	g_file_delete (file, NULL, NULL);
+	stream = g_file_create (file, 0, NULL, &error);
+
+	g_assert_no_error (error);
+
+	g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, NULL);
+	g_object_unref (stream);
+
+	info = g_file_query_info (file,
+	                          G_FILE_ATTRIBUTE_UNIX_MODE,
+	                          G_FILE_QUERY_INFO_NONE,
+	                          NULL,
+	                          &error);
+
+	g_assert_no_error (error);
+
+	mode = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE);
+	g_object_unref (info);
+
+	g_file_set_attribute_uint32 (file,
+	                             G_FILE_ATTRIBUTE_UNIX_MODE,
+	                             (mode & ~ACCESSPERMS) | permissions,
+	                             G_FILE_QUERY_INFO_NONE,
+	                             NULL,
+	                             &error);
+	g_assert_no_error (error);
+
+	check_permissions (file, permissions);
+
+	test_saver (uri,
+	            DEFAULT_CONTENT,
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            G_CALLBACK (check_permissions_saved),
+	            saver_test_data_new (uri,
+	                                 DEFAULT_CONTENT_RESULT,
+	                                 GINT_TO_POINTER ((gint)permissions)));
+
+	g_file_delete (file, NULL, NULL);
+	g_object_unref (file);
+}
+
+static void
+test_local_permissions ()
+{
+	test_permissions (DEFAULT_LOCAL_URI, 0600);
+	test_permissions (DEFAULT_LOCAL_URI, 0660);
+	test_permissions (DEFAULT_LOCAL_URI, 0666);
+	test_permissions (DEFAULT_LOCAL_URI, 0760);
+}
+
+static void
+test_local_unowned_directory ()
+{
+	test_saver (UNOWNED_LOCAL_URI,
+	            DEFAULT_CONTENT,
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (UNOWNED_LOCAL_URI,
+	                                 DEFAULT_CONTENT_RESULT,
+	                                 NULL));
+}
+
+static void
+test_remote_permissions ()
+{
+	test_permissions (DEFAULT_REMOTE_URI, 0600);
+	test_permissions (DEFAULT_REMOTE_URI, 0660);
+	test_permissions (DEFAULT_REMOTE_URI, 0666);
+	test_permissions (DEFAULT_REMOTE_URI, 0760);
+}
+
+static void
+test_remote_unowned_directory ()
+{
+	test_saver (UNOWNED_REMOTE_URI,
+	            DEFAULT_CONTENT,
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            NULL,
+	            saver_test_data_new (UNOWNED_REMOTE_URI,
+	                                 DEFAULT_CONTENT_RESULT,
+	                                 NULL));
+}
+
+static void
+test_unowned_group_permissions (GeditDocument *document,
+                                GError        *error,
+                                SaverTestData *data)
+{
+	GFile *file = g_file_new_for_commandline_arg (data->uri);
+	GError *err = NULL;
+	const gchar *group;
+	guint32 mode;
+
+	GFileInfo *info = g_file_query_info (file,
+	                                     G_FILE_ATTRIBUTE_OWNER_GROUP ","
+	                                     G_FILE_ATTRIBUTE_UNIX_MODE,
+	                                     G_FILE_QUERY_INFO_NONE,
+	                                     NULL,
+	                                     &err);
+
+	g_assert_no_error (err);
+
+	group = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP);
+	g_assert_cmpstr (group, ==, "root");
+
+	mode = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE);
+
+	g_assert_cmpint (mode & ACCESSPERMS, ==, 0660);
+
+	g_object_unref (file);
+	g_object_unref (info);
+}
+
+static void
+test_unowned_group (const gchar *uri)
+{
+	test_saver (uri,
+	            DEFAULT_CONTENT,
+	            GEDIT_DOCUMENT_NEWLINE_TYPE_LF,
+	            0,
+	            G_CALLBACK (test_unowned_group_permissions),
+	            saver_test_data_new (uri,
+	                                 DEFAULT_CONTENT_RESULT,
+	                                 NULL));
+}
+
+static void
+test_local_unowned_group ()
+{
+	test_unowned_group (UNOWNED_GROUP_LOCAL_URI);
+}
+
+static void
+test_remote_unowned_group ()
+{
+	test_unowned_group (UNOWNED_GROUP_REMOTE_URI);
+}
+
+static gboolean
+check_unowned_directory ()
+{
+	GFile *unowned = g_file_new_for_path (UNOWNED_LOCAL_DIRECTORY);
+	GFile *unowned_file;
+	GFileInfo *info;
+	GError *error = NULL;
+
+	g_printf ("*** Checking for unowned directory test... ");
+
+	info = g_file_query_info (unowned,
+	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
+	                          G_FILE_QUERY_INFO_NONE,
+	                          NULL,
+	                          &error);
+
+	if (error)
+	{
+		g_object_unref (unowned);
+		g_printf ("NO: directory does not exist\n");
+
+		g_error_free (error);
+		return FALSE;
+	}
+
+	if (g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
+	{
+		g_object_unref (unowned);
+
+		g_printf ("NO: directory is writable\n");
+		g_object_unref (info);
+		return FALSE;
+	}
+
+	g_object_unref (info);
+	g_object_unref (unowned);
+
+	unowned_file = g_file_new_for_commandline_arg (UNOWNED_LOCAL_URI);
+
+	info = g_file_query_info (unowned_file,
+	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
+	                          G_FILE_QUERY_INFO_NONE,
+	                          NULL,
+	                          &error);
+
+	if (error)
+	{
+		g_object_unref (unowned_file);
+		g_error_free (error);
+
+		g_printf ("NO: file does not exist\n");
+		return FALSE;
+	}
+
+	if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
+	{
+		g_object_unref (unowned_file);
+
+		g_printf ("NO: file is not writable\n");
+		g_object_unref (info);
+		return FALSE;
+	}
+
+	g_object_unref (info);
+	g_object_unref (unowned_file);
+
+	g_printf ("YES\n");
+	return TRUE;
+}
+
+static gboolean
+check_unowned_group ()
+{
+	GFile *unowned = g_file_new_for_path (UNOWNED_GROUP_LOCAL_URI);
+	GFileInfo *info;
+	GError *error = NULL;
+
+	g_printf ("*** Checking for unowned group test... ");
+
+	info = g_file_query_info (unowned,
+	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE ","
+	                          G_FILE_ATTRIBUTE_OWNER_GROUP ","
+	                          G_FILE_ATTRIBUTE_UNIX_MODE,
+	                          G_FILE_QUERY_INFO_NONE,
+	                          NULL,
+	                          &error);
+
+	if (error)
+	{
+		g_object_unref (unowned);
+		g_printf ("NO: file does not exist\n");
+
+		g_error_free (error);
+		return FALSE;
+	}
+
+	if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
+	{
+		g_object_unref (unowned);
+
+		g_printf ("NO: file is not writable\n");
+		g_object_unref (info);
+		return FALSE;
+	}
+
+	if (g_strcmp0 (g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP),
+	               "root") != 0)
+	{
+		g_object_unref (unowned);
+
+		g_printf ("NO: group is not root (%s)\n", g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP));
+		g_object_unref (info);
+		return FALSE;
+	}
+
+	if ((g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE) & ACCESSPERMS) != 0660)
+	{
+		g_object_unref (unowned);
+
+		g_printf ("NO: file has wrong permissions\n");
+		g_object_unref (info);
+		return FALSE;
+	}
+
+	g_object_unref (info);
+	g_object_unref (unowned);
+
+	g_printf ("YES\n");
+	return TRUE;
+}
+
+int main (int   argc,
+          char *argv[])
+{
+	gboolean have_unowned;
+	gboolean have_unowned_group;
+
+	g_type_init ();
+	g_test_init (&argc, &argv, NULL);
+
+	gedit_prefs_manager_app_init ();
+
+	g_printf ("\n***\n");
+	have_unowned = check_unowned_directory ();
+	have_unowned_group = check_unowned_group ();
+	g_printf ("***\n\n");
+
+	g_test_add_func ("/document-saver/local", test_local);
+	g_test_add_func ("/document-saver/local-new-line", test_local_newline);
+	g_test_add_func ("/document-saver/local-permissions", test_local_permissions);
+
+	if (have_unowned)
+	{
+		g_test_add_func ("/document-saver/local-unowned-directory", test_local_unowned_directory);
+	}
+
+	if (have_unowned_group)
+	{
+		g_test_add_func ("/document-saver/local-unowned-group", test_local_unowned_group);
+	}
+
+	g_test_add_func ("/document-saver/remote", test_remote);
+	g_test_add_func ("/document-saver/remote-new-line", test_remote_newline);
+	g_test_add_func ("/document-saver/remote-permissions", test_remote_permissions);
+
+	if (have_unowned)
+	{
+		g_test_add_func ("/document-saver/remote-unowned-directory", test_remote_unowned_directory);
+	}
+
+	if (have_unowned_group)
+	{
+		/* FIXME: there is a bug in gvfs sftp which doesn't pass this test */
+		/* g_test_add_func ("/document-saver/remote-unowned-group", test_remote_unowned_group); */
+	}
+
+	return g_test_run ();
+}
diff --git a/tests/setup-document-saver.sh b/tests/setup-document-saver.sh
new file mode 100755
index 0000000..4e35d32
--- /dev/null
+++ b/tests/setup-document-saver.sh
@@ -0,0 +1,27 @@
+#!/bin/sh
+
+# This script is used to setup some special directory structures, permissions
+# for the saver test
+
+UNOWNED_DIRECTORY="/tmp/gedit-document-saver-unowned"
+UNOWNED_FILE="/tmp/gedit-document-saver-unowned/gedit-document-saver-test.txt"
+
+UNOWNED_GROUP="/tmp/gedit-document-saver-unowned-group.txt"
+
+if [ -f "$UNOWNED_FILE" ]; then
+	sudo rm "$UNOWNED_FILE"
+fi
+
+if [ -d "$UNOWNED_DIRECTORY" ]; then
+	sudo rmdir "$UNOWNED_DIRECTORY"
+fi
+
+mkdir "$UNOWNED_DIRECTORY"
+touch "$UNOWNED_FILE"
+
+sudo chown nobody "$UNOWNED_DIRECTORY"
+
+sudo touch "$UNOWNED_GROUP"
+sudo chgrp root "$UNOWNED_GROUP"
+sudo chmod u+w,g+w,o-rwx "$UNOWNED_GROUP"
+sudo chown $USER "$UNOWNED_GROUP"



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