Blame testsuite/test-file-saver.c

Packit a7d494
/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8; coding: utf-8 -*- */
Packit a7d494
/* test-file-saver.c
Packit a7d494
 * This file is part of GtkSourceView
Packit a7d494
 *
Packit a7d494
 * Copyright (C) 2010 - Jesse van den Kieboom
Packit a7d494
 * Copyright (C) 2014 - Sébastien Wilmet
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is free software; you can redistribute it and/or
Packit a7d494
 * modify it under the terms of the GNU Lesser General Public
Packit a7d494
 * License as published by the Free Software Foundation; either
Packit a7d494
 * version 2.1 of the License, or (at your option) any later version.
Packit a7d494
 *
Packit a7d494
 * GtkSourceView is distributed in the hope that it will be useful,
Packit a7d494
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit a7d494
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit a7d494
 * Lesser General Public License for more details.
Packit a7d494
 *
Packit a7d494
 * You should have received a copy of the GNU Lesser General Public
Packit a7d494
 * License along with this library; if not, write to the Free Software
Packit a7d494
 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
Packit a7d494
 */
Packit a7d494
Packit a7d494
#include <gio/gio.h>
Packit a7d494
#include <gtk/gtk.h>
Packit a7d494
#include <string.h>
Packit a7d494
#include <sys/stat.h>
Packit a7d494
#include <glib/gprintf.h>
Packit a7d494
#include <gtksourceview/gtksource.h>
Packit a7d494
Packit a7d494
#define ENABLE_REMOTE_TESTS	FALSE
Packit a7d494
Packit a7d494
/* linux/bsd has it. others such as Solaris, do not */
Packit a7d494
#ifndef ACCESSPERMS
Packit a7d494
#define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO)
Packit a7d494
#endif
Packit a7d494
Packit a7d494
#define DEFAULT_REMOTE_URI_DIR "sftp://localhost/tmp/"
Packit a7d494
#define DEFAULT_TEST_TEXT_FILE "gtksourceview-file-saver-test.txt"
Packit a7d494
#define DEFAULT_TEST_UNOWNED_TEXT_FILE "gtksourceview-file-saver-unowned-group.txt"
Packit a7d494
#define DEFAULT_UNOWNED_DIR "gtksourceview-file-saver-unowned"
Packit a7d494
Packit a7d494
#define DEFAULT_REMOTE_URI DEFAULT_REMOTE_URI_DIR DEFAULT_TEST_TEXT_FILE
Packit a7d494
#define DEFAULT_CONTENT "hello world!"
Packit a7d494
#define DEFAULT_CONTENT_RESULT "hello world!\n"
Packit a7d494
Packit a7d494
#define UNOWNED_REMOTE_DIRECTORY DEFAULT_REMOTE_URI_DIR DEFAULT_UNOWNED_DIR
Packit a7d494
Packit a7d494
typedef struct _SaverTestData SaverTestData;
Packit a7d494
typedef void (*SavedCallback) (SaverTestData *data);
Packit a7d494
Packit a7d494
struct _SaverTestData
Packit a7d494
{
Packit a7d494
	GtkSourceFileSaver *saver;
Packit a7d494
	GFile *location;
Packit a7d494
	const gchar *expected_file_contents;
Packit a7d494
	SavedCallback saved_callback;
Packit a7d494
	gpointer userdata;
Packit a7d494
Packit a7d494
	guint file_existed : 1;
Packit a7d494
};
Packit a7d494
Packit a7d494
static const gchar *
Packit a7d494
read_file (GFile *location)
Packit a7d494
{
Packit a7d494
	/* TODO use g_file_load_contents() */
Packit a7d494
	GError *error = NULL;
Packit a7d494
	static gchar buffer[4096];
Packit a7d494
	gsize read;
Packit a7d494
Packit a7d494
	GInputStream *stream = G_INPUT_STREAM (g_file_read (location, NULL, &error));
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	g_input_stream_read_all (stream, buffer, sizeof (buffer) - 1, &read, NULL, &error);
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	buffer[read] = '\0';
Packit a7d494
Packit a7d494
	g_input_stream_close (stream, NULL, NULL);
Packit a7d494
Packit a7d494
	g_object_unref (stream);
Packit a7d494
Packit a7d494
	return buffer;
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
save_file_cb (GtkSourceFileSaver *saver,
Packit a7d494
	      GAsyncResult       *result,
Packit a7d494
	      SaverTestData      *data)
Packit a7d494
{
Packit a7d494
	GError *error = NULL;
Packit a7d494
Packit a7d494
	gtk_source_file_saver_save_finish (saver, result, &error);
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	g_assert_cmpstr (data->expected_file_contents, ==, read_file (data->location));
Packit a7d494
Packit a7d494
	if (data->saved_callback != NULL)
Packit a7d494
	{
Packit a7d494
		data->saved_callback (data);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (!data->file_existed)
Packit a7d494
	{
Packit a7d494
		g_file_delete (data->location, NULL, NULL);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	/* finished */
Packit a7d494
	gtk_main_quit ();
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
save_file (SaverTestData *data)
Packit a7d494
{
Packit a7d494
	data->file_existed = g_file_query_exists (data->location, NULL);
Packit a7d494
Packit a7d494
	gtk_source_file_saver_save_async (data->saver,
Packit a7d494
					  G_PRIORITY_DEFAULT,
Packit a7d494
					  NULL, NULL, NULL, NULL,
Packit a7d494
					  (GAsyncReadyCallback) save_file_cb,
Packit a7d494
					  data);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
mount_cb (GFile         *location,
Packit a7d494
	  GAsyncResult  *result,
Packit a7d494
	  SaverTestData *data)
Packit a7d494
{
Packit a7d494
	GError *error = NULL;
Packit a7d494
Packit a7d494
	g_file_mount_enclosing_volume_finish (location, result, &error);
Packit a7d494
Packit a7d494
	if (error != NULL && error->code == G_IO_ERROR_ALREADY_MOUNTED)
Packit a7d494
	{
Packit a7d494
		g_error_free (error);
Packit a7d494
	}
Packit a7d494
	else
Packit a7d494
	{
Packit a7d494
		g_assert_no_error (error);
Packit a7d494
	}
Packit a7d494
Packit a7d494
	save_file (data);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
check_mounted (SaverTestData *data)
Packit a7d494
{
Packit a7d494
	GMountOperation *mount_operation;
Packit a7d494
Packit a7d494
	if (g_file_is_native (data->location))
Packit a7d494
	{
Packit a7d494
		save_file (data);
Packit a7d494
		return;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	mount_operation = gtk_mount_operation_new (NULL);
Packit a7d494
Packit a7d494
	g_file_mount_enclosing_volume (data->location,
Packit a7d494
	                               G_MOUNT_MOUNT_NONE,
Packit a7d494
	                               mount_operation,
Packit a7d494
	                               NULL,
Packit a7d494
	                               (GAsyncReadyCallback) mount_cb,
Packit a7d494
	                               data);
Packit a7d494
Packit a7d494
	g_object_unref (mount_operation);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_saver (const gchar            *filename_or_uri,
Packit a7d494
	    const gchar            *buffer_contents,
Packit a7d494
	    const gchar            *expected_file_contents,
Packit a7d494
	    GtkSourceNewlineType    newline_type,
Packit a7d494
	    SavedCallback           saved_callback,
Packit a7d494
	    gpointer                userdata)
Packit a7d494
{
Packit a7d494
	GFile *location;
Packit a7d494
	GtkSourceBuffer *buffer;
Packit a7d494
	GtkSourceFile *file;
Packit a7d494
	GtkSourceFileSaver *saver;
Packit a7d494
	SaverTestData *data;
Packit a7d494
Packit a7d494
	location = g_file_new_for_commandline_arg (filename_or_uri);
Packit a7d494
Packit a7d494
	buffer = gtk_source_buffer_new (NULL);
Packit a7d494
	gtk_text_buffer_set_text (GTK_TEXT_BUFFER (buffer), buffer_contents, -1);
Packit a7d494
Packit a7d494
	file = gtk_source_file_new ();
Packit a7d494
	saver = gtk_source_file_saver_new_with_target (buffer, file, location);
Packit a7d494
Packit a7d494
	gtk_source_file_saver_set_newline_type (saver, newline_type);
Packit a7d494
	gtk_source_file_saver_set_encoding (saver, gtk_source_encoding_get_utf8 ());
Packit a7d494
Packit a7d494
	data = g_slice_new (SaverTestData);
Packit a7d494
	data->saver = saver;
Packit a7d494
	data->location = location;
Packit a7d494
	data->expected_file_contents = expected_file_contents;
Packit a7d494
	data->saved_callback = saved_callback;
Packit a7d494
	data->userdata = userdata;
Packit a7d494
Packit a7d494
	check_mounted (data);
Packit a7d494
	gtk_main ();
Packit a7d494
Packit a7d494
	g_object_unref (location);
Packit a7d494
	g_object_unref (buffer);
Packit a7d494
	g_object_unref (file);
Packit a7d494
	g_object_unref (saver);
Packit a7d494
	g_slice_free (SaverTestData, data);
Packit a7d494
}
Packit a7d494
Packit a7d494
typedef struct
Packit a7d494
{
Packit a7d494
	GtkSourceNewlineType type;
Packit a7d494
	const gchar *text;
Packit a7d494
	const gchar *result;
Packit a7d494
} NewLineTestData;
Packit a7d494
Packit a7d494
static NewLineTestData newline_test_data[] = {
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\nhello\nworld", "\nhello\nworld\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\nhello\nworld\n", "\nhello\nworld\n\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\nhello\nworld\n\n", "\nhello\nworld\n\n\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\r\nhello\r\nworld", "\nhello\nworld\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\r\nhello\r\nworld\r\n", "\nhello\nworld\n\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\rhello\rworld", "\nhello\nworld\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\rhello\rworld\r", "\nhello\nworld\n\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\nhello\r\nworld", "\nhello\nworld\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_LF, "\nhello\r\nworld\r", "\nhello\nworld\n\n"},
Packit a7d494
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\nhello\nworld", "\r\nhello\r\nworld\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\nhello\nworld\n", "\r\nhello\r\nworld\r\n\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\nhello\nworld\n\n", "\r\nhello\r\nworld\r\n\r\n\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\r\nhello\r\nworld", "\r\nhello\r\nworld\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\r\nhello\r\nworld\r\n", "\r\nhello\r\nworld\r\n\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\rhello\rworld", "\r\nhello\r\nworld\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\rhello\rworld\r", "\r\nhello\r\nworld\r\n\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\nhello\r\nworld", "\r\nhello\r\nworld\r\n"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR_LF, "\nhello\r\nworld\r", "\r\nhello\r\nworld\r\n\r\n"},
Packit a7d494
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\nhello\nworld", "\rhello\rworld\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\nhello\nworld\n", "\rhello\rworld\r\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\nhello\nworld\n\n", "\rhello\rworld\r\r\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\r\nhello\r\nworld", "\rhello\rworld\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\r\nhello\r\nworld\r\n", "\rhello\rworld\r\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\rhello\rworld", "\rhello\rworld\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\rhello\rworld\r", "\rhello\rworld\r\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\nhello\r\nworld", "\rhello\rworld\r"},
Packit a7d494
	{GTK_SOURCE_NEWLINE_TYPE_CR, "\nhello\r\nworld\r", "\rhello\rworld\r\r"}
Packit a7d494
};
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_new_line (const gchar *filename)
Packit a7d494
{
Packit a7d494
	gint i;
Packit a7d494
	gint num = sizeof (newline_test_data) / sizeof (NewLineTestData);
Packit a7d494
Packit a7d494
	for (i = 0; i < num; ++i)
Packit a7d494
	{
Packit a7d494
		NewLineTestData *nt = &(newline_test_data[i]);
Packit a7d494
Packit a7d494
		test_saver (filename,
Packit a7d494
		            nt->text,
Packit a7d494
			    nt->result,
Packit a7d494
		            nt->type,
Packit a7d494
			    NULL,
Packit a7d494
			    NULL);
Packit a7d494
	}
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_local_newline (void)
Packit a7d494
{
Packit a7d494
	gchar *default_local_uri;
Packit a7d494
Packit a7d494
	default_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                      DEFAULT_TEST_TEXT_FILE,
Packit a7d494
	                                      NULL);
Packit a7d494
	test_new_line (default_local_uri);
Packit a7d494
	g_free (default_local_uri);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_local (void)
Packit a7d494
{
Packit a7d494
	gchar *default_local_uri;
Packit a7d494
Packit a7d494
	default_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                      DEFAULT_TEST_TEXT_FILE,
Packit a7d494
	                                      NULL);
Packit a7d494
	test_saver (default_local_uri,
Packit a7d494
	            "hello world",
Packit a7d494
		    "hello world\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
Packit a7d494
	test_saver (default_local_uri,
Packit a7d494
	            "hello world\r\n",
Packit a7d494
		    "hello world\n\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
Packit a7d494
	test_saver (default_local_uri,
Packit a7d494
	            "hello world\n",
Packit a7d494
		    "hello world\n\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
	g_free (default_local_uri);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_remote_newline (void)
Packit a7d494
{
Packit a7d494
	test_new_line (DEFAULT_REMOTE_URI);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_remote (void)
Packit a7d494
{
Packit a7d494
	test_saver (DEFAULT_REMOTE_URI,
Packit a7d494
	            "hello world",
Packit a7d494
		    "hello world\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
Packit a7d494
	test_saver (DEFAULT_REMOTE_URI,
Packit a7d494
	            "hello world\r\n",
Packit a7d494
		    "hello world\n\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
Packit a7d494
	test_saver (DEFAULT_REMOTE_URI,
Packit a7d494
	            "hello world\n",
Packit a7d494
		    "hello world\n\n",
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
}
Packit a7d494
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
static void
Packit a7d494
check_permissions (GFile *location,
Packit a7d494
                   guint  permissions)
Packit a7d494
{
Packit a7d494
	GError *error = NULL;
Packit a7d494
	GFileInfo *info;
Packit a7d494
Packit a7d494
	info = g_file_query_info (location,
Packit a7d494
	                          G_FILE_ATTRIBUTE_UNIX_MODE,
Packit a7d494
	                          G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                          NULL,
Packit a7d494
	                          &error);
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	g_assert_cmpint (permissions,
Packit a7d494
	                 ==,
Packit a7d494
	                 g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE) & ACCESSPERMS);
Packit a7d494
Packit a7d494
	g_object_unref (info);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
check_permissions_saved (SaverTestData *data)
Packit a7d494
{
Packit a7d494
	guint permissions = (guint)GPOINTER_TO_INT (data->userdata);
Packit a7d494
Packit a7d494
	check_permissions (data->location, permissions);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_permissions (const gchar *uri,
Packit a7d494
                  guint        permissions)
Packit a7d494
{
Packit a7d494
	GError *error = NULL;
Packit a7d494
	GFile *location = g_file_new_for_commandline_arg (uri);
Packit a7d494
	GFileOutputStream *stream;
Packit a7d494
	GFileInfo *info;
Packit a7d494
	guint mode;
Packit a7d494
Packit a7d494
	g_file_delete (location, NULL, NULL);
Packit a7d494
	stream = g_file_create (location, 0, NULL, &error);
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	g_output_stream_close (G_OUTPUT_STREAM (stream), NULL, NULL);
Packit a7d494
	g_object_unref (stream);
Packit a7d494
Packit a7d494
	info = g_file_query_info (location,
Packit a7d494
	                          G_FILE_ATTRIBUTE_UNIX_MODE,
Packit a7d494
	                          G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                          NULL,
Packit a7d494
	                          &error);
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	mode = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE);
Packit a7d494
	g_object_unref (info);
Packit a7d494
Packit a7d494
	g_file_set_attribute_uint32 (location,
Packit a7d494
	                             G_FILE_ATTRIBUTE_UNIX_MODE,
Packit a7d494
	                             (mode & ~ACCESSPERMS) | permissions,
Packit a7d494
	                             G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                             NULL,
Packit a7d494
	                             &error);
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	check_permissions (location, permissions);
Packit a7d494
Packit a7d494
	test_saver (uri,
Packit a7d494
	            DEFAULT_CONTENT,
Packit a7d494
		    DEFAULT_CONTENT_RESULT,
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    check_permissions_saved,
Packit a7d494
		    GINT_TO_POINTER ((gint)permissions));
Packit a7d494
Packit a7d494
	g_file_delete (location, NULL, NULL);
Packit a7d494
	g_object_unref (location);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_local_permissions (void)
Packit a7d494
{
Packit a7d494
	gchar *default_local_uri;
Packit a7d494
Packit a7d494
	default_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                      DEFAULT_TEST_TEXT_FILE,
Packit a7d494
	                                      NULL);
Packit a7d494
	test_permissions (default_local_uri, 0600);
Packit a7d494
	test_permissions (default_local_uri, 0660);
Packit a7d494
	test_permissions (default_local_uri, 0666);
Packit a7d494
	test_permissions (default_local_uri, 0760);
Packit a7d494
	g_free (default_local_uri);
Packit a7d494
}
Packit a7d494
#endif
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_local_unowned_directory (void)
Packit a7d494
{
Packit a7d494
	gchar *unowned_local_uri;
Packit a7d494
Packit a7d494
	unowned_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                             DEFAULT_UNOWNED_DIR,
Packit a7d494
	                                             DEFAULT_TEST_TEXT_FILE,
Packit a7d494
                                                 NULL);
Packit a7d494
	test_saver (unowned_local_uri,
Packit a7d494
	            DEFAULT_CONTENT,
Packit a7d494
		    DEFAULT_CONTENT_RESULT,
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
	g_free (unowned_local_uri);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_remote_unowned_directory (void)
Packit a7d494
{
Packit a7d494
	gchar *unowned_remote_uri;
Packit a7d494
Packit a7d494
	unowned_remote_uri = g_strconcat (UNOWNED_REMOTE_DIRECTORY,
Packit a7d494
	                                  DEFAULT_TEST_TEXT_FILE,
Packit a7d494
	                                  NULL);
Packit a7d494
	test_saver (unowned_remote_uri,
Packit a7d494
	            DEFAULT_CONTENT,
Packit a7d494
		    DEFAULT_CONTENT_RESULT,
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    NULL,
Packit a7d494
		    NULL);
Packit a7d494
	g_free (unowned_remote_uri);
Packit a7d494
}
Packit a7d494
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
static void
Packit a7d494
test_remote_permissions (void)
Packit a7d494
{
Packit a7d494
	test_permissions (DEFAULT_REMOTE_URI, 0600);
Packit a7d494
	test_permissions (DEFAULT_REMOTE_URI, 0660);
Packit a7d494
	test_permissions (DEFAULT_REMOTE_URI, 0666);
Packit a7d494
	test_permissions (DEFAULT_REMOTE_URI, 0760);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_unowned_group_permissions (SaverTestData *data)
Packit a7d494
{
Packit a7d494
	GError *error = NULL;
Packit a7d494
	const gchar *group;
Packit a7d494
	guint32 mode;
Packit a7d494
Packit a7d494
	GFileInfo *info = g_file_query_info (data->location,
Packit a7d494
	                                     G_FILE_ATTRIBUTE_OWNER_GROUP ","
Packit a7d494
	                                     G_FILE_ATTRIBUTE_UNIX_MODE,
Packit a7d494
	                                     G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                                     NULL,
Packit a7d494
	                                     &error);
Packit a7d494
Packit a7d494
	g_assert_no_error (error);
Packit a7d494
Packit a7d494
	group = g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP);
Packit a7d494
	g_assert_cmpstr (group, ==, "root");
Packit a7d494
Packit a7d494
	mode = g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE);
Packit a7d494
Packit a7d494
	g_assert_cmpint (mode & ACCESSPERMS, ==, 0660);
Packit a7d494
Packit a7d494
	g_object_unref (info);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_unowned_group (const gchar *uri)
Packit a7d494
{
Packit a7d494
	test_saver (uri,
Packit a7d494
	            DEFAULT_CONTENT,
Packit a7d494
		    DEFAULT_CONTENT_RESULT,
Packit a7d494
	            GTK_SOURCE_NEWLINE_TYPE_LF,
Packit a7d494
		    test_unowned_group_permissions,
Packit a7d494
		    NULL);
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
test_local_unowned_group (void)
Packit a7d494
{
Packit a7d494
	gchar *unowned_group_local_uri;
Packit a7d494
Packit a7d494
	unowned_group_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                            DEFAULT_TEST_UNOWNED_TEXT_FILE,
Packit a7d494
	                                            NULL);
Packit a7d494
	test_unowned_group (unowned_group_local_uri);
Packit a7d494
	g_free (unowned_group_local_uri);
Packit a7d494
}
Packit a7d494
Packit a7d494
#if 0
Packit a7d494
static void
Packit a7d494
test_remote_unowned_group (void)
Packit a7d494
{
Packit a7d494
	g_char *unowned_group_remote_uri;
Packit a7d494
Packit a7d494
	unowned_group_remote_uri = g_strconcat (DEFAULT_REMOTE_URI_DIR,
Packit a7d494
	                                        DEFAULT_TEST_UNOWNED_TEXT_FILE,
Packit a7d494
	                                        NULL);
Packit a7d494
	test_unowned_group ();
Packit a7d494
	g_free (unowned_group_remote_uri);
Packit a7d494
}
Packit a7d494
#endif
Packit a7d494
Packit a7d494
#endif
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
check_unowned_directory (void)
Packit a7d494
{
Packit a7d494
	gchar *unowned_local_directory, *unowned_local_uri;
Packit a7d494
	GFile *unowned, *unowned_file;
Packit a7d494
	GFileInfo *info;
Packit a7d494
	GError *error = NULL;
Packit a7d494
Packit a7d494
	unowned_local_directory = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                            DEFAULT_UNOWNED_DIR,
Packit a7d494
	                                            NULL);
Packit a7d494
	unowned = g_file_new_for_path (unowned_local_directory);
Packit a7d494
	g_free (unowned_local_directory);
Packit a7d494
	g_printf ("*** Checking for unowned directory test... ");
Packit a7d494
Packit a7d494
	info = g_file_query_info (unowned,
Packit a7d494
	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
Packit a7d494
	                          G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                          NULL,
Packit a7d494
	                          &error);
Packit a7d494
Packit a7d494
	if (error)
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
		g_printf ("NO: directory does not exist\n");
Packit a7d494
Packit a7d494
		g_error_free (error);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
Packit a7d494
		g_printf ("NO: directory is writable\n");
Packit a7d494
		g_object_unref (info);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	g_object_unref (info);
Packit a7d494
	g_object_unref (unowned);
Packit a7d494
	unowned_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                      DEFAULT_UNOWNED_DIR,
Packit a7d494
	                                      DEFAULT_TEST_TEXT_FILE,
Packit a7d494
	                                      NULL);
Packit a7d494
	unowned_file = g_file_new_for_commandline_arg (unowned_local_uri);
Packit a7d494
Packit a7d494
	info = g_file_query_info (unowned_file,
Packit a7d494
	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE,
Packit a7d494
	                          G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                          NULL,
Packit a7d494
	                          &error);
Packit a7d494
	g_free (unowned_local_uri);
Packit a7d494
Packit a7d494
	if (error)
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned_file);
Packit a7d494
		g_error_free (error);
Packit a7d494
Packit a7d494
		g_printf ("NO: file does not exist\n");
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned_file);
Packit a7d494
Packit a7d494
		g_printf ("NO: file is not writable\n");
Packit a7d494
		g_object_unref (info);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	g_object_unref (info);
Packit a7d494
	g_object_unref (unowned_file);
Packit a7d494
Packit a7d494
	g_printf ("YES\n");
Packit a7d494
	return TRUE;
Packit a7d494
}
Packit a7d494
Packit a7d494
static gboolean
Packit a7d494
check_unowned_group (void)
Packit a7d494
{
Packit a7d494
	gchar *unowned_group_local_uri;
Packit a7d494
	GFile *unowned;
Packit a7d494
	GFileInfo *info;
Packit a7d494
	GError *error = NULL;
Packit a7d494
Packit a7d494
	unowned_group_local_uri = g_build_filename (g_get_tmp_dir (),
Packit a7d494
	                                            DEFAULT_TEST_UNOWNED_TEXT_FILE,
Packit a7d494
	                                            NULL);
Packit a7d494
	unowned = g_file_new_for_path (unowned_group_local_uri);
Packit a7d494
Packit a7d494
	g_printf ("*** Checking for unowned group test... ");
Packit a7d494
Packit a7d494
	info = g_file_query_info (unowned,
Packit a7d494
	                          G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE ","
Packit a7d494
	                          G_FILE_ATTRIBUTE_OWNER_GROUP ","
Packit a7d494
	                          G_FILE_ATTRIBUTE_UNIX_MODE,
Packit a7d494
	                          G_FILE_QUERY_INFO_NONE,
Packit a7d494
	                          NULL,
Packit a7d494
	                          &error);
Packit a7d494
	g_free (unowned_group_local_uri);
Packit a7d494
Packit a7d494
	if (error)
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
		g_printf ("NO: file does not exist\n");
Packit a7d494
Packit a7d494
		g_error_free (error);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (!g_file_info_get_attribute_boolean (info, G_FILE_ATTRIBUTE_ACCESS_CAN_WRITE))
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
Packit a7d494
		g_printf ("NO: file is not writable\n");
Packit a7d494
		g_object_unref (info);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (g_strcmp0 (g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP),
Packit a7d494
	               "root") != 0)
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
Packit a7d494
		g_printf ("NO: group is not root (%s)\n", g_file_info_get_attribute_string (info, G_FILE_ATTRIBUTE_OWNER_GROUP));
Packit a7d494
		g_object_unref (info);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
	if ((g_file_info_get_attribute_uint32 (info, G_FILE_ATTRIBUTE_UNIX_MODE) & ACCESSPERMS) != 0660)
Packit a7d494
	{
Packit a7d494
		g_object_unref (unowned);
Packit a7d494
Packit a7d494
		g_printf ("NO: file has wrong permissions\n");
Packit a7d494
		g_object_unref (info);
Packit a7d494
		return FALSE;
Packit a7d494
	}
Packit a7d494
#endif
Packit a7d494
Packit a7d494
	g_object_unref (info);
Packit a7d494
	g_object_unref (unowned);
Packit a7d494
Packit a7d494
	g_printf ("YES\n");
Packit a7d494
	return TRUE;
Packit a7d494
}
Packit a7d494
Packit a7d494
static void
Packit a7d494
all_tests (void)
Packit a7d494
{
Packit a7d494
	gboolean have_unowned;
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
	gboolean have_unowned_group;
Packit a7d494
#endif
Packit a7d494
Packit a7d494
	g_printf ("\n***\n");
Packit a7d494
	have_unowned = check_unowned_directory ();
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
	have_unowned_group = check_unowned_group ();
Packit a7d494
#endif
Packit a7d494
	g_printf ("***\n\n");
Packit a7d494
Packit a7d494
	g_test_trap_subprocess ("/file-saver/subprocess/local",
Packit a7d494
				0,
Packit a7d494
				G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
	g_test_trap_assert_passed ();
Packit a7d494
Packit a7d494
	g_test_trap_subprocess ("/file-saver/subprocess/local-new-line",
Packit a7d494
				0,
Packit a7d494
				G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
	g_test_trap_assert_passed ();
Packit a7d494
Packit a7d494
	if (have_unowned)
Packit a7d494
	{
Packit a7d494
		g_test_trap_subprocess ("/file-saver/subprocess/local-unowned-directory",
Packit a7d494
					0,
Packit a7d494
					G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
		g_test_trap_assert_passed ();
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (ENABLE_REMOTE_TESTS)
Packit a7d494
	{
Packit a7d494
		g_test_trap_subprocess ("/file-saver/subprocess/remote",
Packit a7d494
					0,
Packit a7d494
					G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
		g_test_trap_assert_passed ();
Packit a7d494
Packit a7d494
		g_test_trap_subprocess ("/file-saver/subprocess/remote-new-line",
Packit a7d494
					0,
Packit a7d494
					G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
		g_test_trap_assert_passed ();
Packit a7d494
Packit a7d494
		if (have_unowned)
Packit a7d494
		{
Packit a7d494
			g_test_trap_subprocess ("/file-saver/subprocess/remote-unowned-directory",
Packit a7d494
						0,
Packit a7d494
						G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
			g_test_trap_assert_passed ();
Packit a7d494
		}
Packit a7d494
Packit a7d494
		/*
Packit a7d494
		if (have_unowned_group)
Packit a7d494
		{
Packit a7d494
			g_test_trap_subprocess ("/file-saver/subprocess/remote-unowned-group",
Packit a7d494
						0,
Packit a7d494
						G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
			g_test_trap_assert_passed ();
Packit a7d494
		}
Packit a7d494
		*/
Packit a7d494
	}
Packit a7d494
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
	g_test_trap_subprocess ("/file-saver/subprocess/local-permissions",
Packit a7d494
				0,
Packit a7d494
				G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
	g_test_trap_assert_passed ();
Packit a7d494
Packit a7d494
	if (have_unowned_group)
Packit a7d494
	{
Packit a7d494
		g_test_trap_subprocess ("/file-saver/subprocess/local-unowned-group",
Packit a7d494
					0,
Packit a7d494
					G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
		g_test_trap_assert_passed ();
Packit a7d494
	}
Packit a7d494
Packit a7d494
	if (ENABLE_REMOTE_TESTS)
Packit a7d494
	{
Packit a7d494
		g_test_trap_subprocess ("/file-saver/subprocess/remote-permissions",
Packit a7d494
					0,
Packit a7d494
					G_TEST_SUBPROCESS_INHERIT_STDERR);
Packit a7d494
		g_test_trap_assert_passed ();
Packit a7d494
	}
Packit a7d494
#endif
Packit a7d494
}
Packit a7d494
Packit a7d494
gint
Packit a7d494
main (gint   argc,
Packit a7d494
      gchar *argv[])
Packit a7d494
{
Packit a7d494
	gtk_test_init (&argc, &argv);
Packit a7d494
Packit a7d494
	g_test_add_func ("/file-saver", all_tests);
Packit a7d494
Packit a7d494
	g_test_add_func ("/file-saver/subprocess/local", test_local);
Packit a7d494
	g_test_add_func ("/file-saver/subprocess/local-new-line", test_local_newline);
Packit a7d494
	g_test_add_func ("/file-saver/subprocess/local-unowned-directory", test_local_unowned_directory);
Packit a7d494
Packit a7d494
	if (ENABLE_REMOTE_TESTS)
Packit a7d494
	{
Packit a7d494
		g_test_add_func ("/file-saver/subprocess/remote", test_remote);
Packit a7d494
		g_test_add_func ("/file-saver/subprocess/remote-new-line", test_remote_newline);
Packit a7d494
		g_test_add_func ("/file-saver/subprocess/remote-unowned-directory", test_remote_unowned_directory);
Packit a7d494
Packit a7d494
		/* FIXME: there is a bug in gvfs sftp which doesn't pass this test */
Packit a7d494
		/* g_test_add_func ("/file-saver/subprocess/remote-unowned-group", test_remote_unowned_group); */
Packit a7d494
	}
Packit a7d494
Packit a7d494
#ifndef G_OS_WIN32
Packit a7d494
	g_test_add_func ("/file-saver/subprocess/local-permissions", test_local_permissions);
Packit a7d494
	g_test_add_func ("/file-saver/subprocess/local-unowned-group", test_local_unowned_group);
Packit a7d494
Packit a7d494
	if (ENABLE_REMOTE_TESTS)
Packit a7d494
	{
Packit a7d494
		g_test_add_func ("/file-saver/subprocess/remote-permissions", test_remote_permissions);
Packit a7d494
	}
Packit a7d494
#endif
Packit a7d494
Packit a7d494
	return g_test_run ();
Packit a7d494
}