Blame gcr/test-gnupg-process.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/*
Packit b00eeb
   Copyright (C) 2011 Collabora Ltd
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is free software; you can redistribute it and/or
Packit b00eeb
   modify it under the terms of the GNU Library General Public License as
Packit b00eeb
   published by the Free Software Foundation; either version 2 of the
Packit b00eeb
   License, or (at your option) any later version.
Packit b00eeb
Packit b00eeb
   The Gnome Keyring Library is distributed in the hope that it will be useful,
Packit b00eeb
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit b00eeb
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit b00eeb
   Library General Public License for more details.
Packit b00eeb
Packit b00eeb
   You should have received a copy of the GNU Library General Public
Packit b00eeb
   License along with the Gnome Library; see the file COPYING.LIB.  If not,
Packit b00eeb
   see <http://www.gnu.org/licenses/>.
Packit b00eeb
Packit b00eeb
   Author: Stef Walter <stefw@collabora.co.uk>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gcr/gcr-base.h"
Packit b00eeb
#include "gcr/gcr-callback-output-stream.h"
Packit b00eeb
#include "gcr/gcr-gnupg-process.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
Packit b00eeb
#include <glib.h>
Packit b00eeb
Packit b00eeb
#include <errno.h>
Packit b00eeb
#include <string.h>
Packit b00eeb
Packit b00eeb
#define WAIT 50000
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GcrGnupgProcess *process;
Packit b00eeb
	GAsyncResult *result;
Packit b00eeb
	GString *output_buf;
Packit b00eeb
	GString *error_buf;
Packit b00eeb
	GString *attribute_buf;
Packit b00eeb
	GcrRecord *record;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	test->output_buf = g_string_new ("");
Packit b00eeb
	test->error_buf = g_string_new ("");
Packit b00eeb
	test->attribute_buf = g_string_new ("");
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	if (test->result)
Packit b00eeb
		g_object_unref (test->result);
Packit b00eeb
	if (test->process)
Packit b00eeb
		g_object_unref (test->process);
Packit b00eeb
Packit b00eeb
	while (g_main_context_iteration (NULL, FALSE));
Packit b00eeb
Packit b00eeb
	if (test->result)
Packit b00eeb
		g_assert (test->result == NULL);
Packit b00eeb
	if (test->process)
Packit b00eeb
		g_assert (test->process == NULL);
Packit b00eeb
Packit b00eeb
	if (test->output_buf)
Packit b00eeb
		g_string_free (test->output_buf, TRUE);
Packit b00eeb
	if (test->error_buf)
Packit b00eeb
		g_string_free (test->error_buf, TRUE);
Packit b00eeb
	if (test->attribute_buf)
Packit b00eeb
		g_string_free (test->attribute_buf, TRUE);
Packit b00eeb
	_gcr_record_free (test->record);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_create (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	gchar *value;
Packit b00eeb
Packit b00eeb
	test->process = _gcr_gnupg_process_new ("/the/directory", "/path/to/executable");
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
Packit b00eeb
	g_object_get (test->process, "directory", &value, NULL);
Packit b00eeb
	g_assert_cmpstr (value, ==, "/the/directory");
Packit b00eeb
	g_free (value);
Packit b00eeb
Packit b00eeb
	g_object_get (test->process, "executable", &value, NULL);
Packit b00eeb
	g_assert_cmpstr (value, ==, "/path/to/executable");
Packit b00eeb
	g_free (value);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_async_ready (GObject *source, GAsyncResult *result, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
	GObject *result_source;
Packit b00eeb
Packit b00eeb
	g_assert (G_OBJECT (test->process) == source);
Packit b00eeb
	g_assert (test->result == NULL);
Packit b00eeb
Packit b00eeb
	result_source = g_async_result_get_source_object (result);
Packit b00eeb
	g_assert (result_source == source);
Packit b00eeb
	g_object_unref (result_source);
Packit b00eeb
Packit b00eeb
	test->result = g_object_ref (result);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->result), (gpointer *)&test->result);
Packit b00eeb
	egg_test_wait_stop ();
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gchar*
Packit b00eeb
build_script_path (const gchar *name)
Packit b00eeb
{
Packit b00eeb
	gchar *path;
Packit b00eeb
Packit b00eeb
	path = g_build_filename (SRCDIR, "gcr", "fixtures", "gnupg-mock", name, NULL);
Packit b00eeb
Packit b00eeb
	return path;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gssize
Packit b00eeb
on_process_output_data (gconstpointer buffer,
Packit b00eeb
                        gsize count,
Packit b00eeb
                        GCancellable *cancellable,
Packit b00eeb
                        gpointer user_data,
Packit b00eeb
                        GError **error)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
	g_string_append_len (test->output_buf, buffer, count);
Packit b00eeb
	return count;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gssize
Packit b00eeb
on_process_attribute_data (gconstpointer buffer,
Packit b00eeb
                           gsize count,
Packit b00eeb
                           GCancellable *cancellable,
Packit b00eeb
                           gpointer user_data,
Packit b00eeb
                           GError **error)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
	g_string_append_len (test->attribute_buf, buffer, count);
Packit b00eeb
	return count;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_process_error_line (GcrGnupgProcess *process, const gchar *line, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
Packit b00eeb
	g_assert (process == test->process);
Packit b00eeb
	g_assert (line);
Packit b00eeb
	g_assert (!strchr (line, '\n'));
Packit b00eeb
Packit b00eeb
	g_string_append_printf (test->error_buf, "%s\n", line);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_process_status_record (GcrGnupgProcess *process, GcrRecord *record, gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	Test *test = user_data;
Packit b00eeb
Packit b00eeb
	g_assert (process == test->process);
Packit b00eeb
	g_assert (record);
Packit b00eeb
Packit b00eeb
	g_assert (!test->record);
Packit b00eeb
	test->record = _gcr_record_copy (record);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_simple_output (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gboolean ret;
Packit b00eeb
	gchar *script;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-simple-output");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr ("simple-output\n", ==, test->output_buf->str);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_simple_error (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-simple-error");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	g_signal_connect (test->process, "error-line", G_CALLBACK (on_process_error_line), test);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr ("line 1: more line 1\nline 2\nline 3\n", ==, test->error_buf->str);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_status_and_output (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-status-and-output");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
Packit b00eeb
	g_signal_connect (test->process, "status-record", G_CALLBACK (on_process_status_record), test);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, GCR_GNUPG_PROCESS_WITH_STATUS,
Packit b00eeb
	                              NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	g_assert (test->record);
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 0), ==, "SCHEMA");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 1), ==, "one");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 2), ==, "two");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 3), ==, "three");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 4), ==, "four");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 5), ==, NULL);
Packit b00eeb
	g_assert_cmpstr ("Here's some output\nMore output\n", ==, test->output_buf->str);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_status_and_attribute (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-status-and-attribute");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_attribute_data, test, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_attribute_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
Packit b00eeb
	g_signal_connect (test->process, "status-record", G_CALLBACK (on_process_status_record), test);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL,
Packit b00eeb
	                              GCR_GNUPG_PROCESS_WITH_STATUS | GCR_GNUPG_PROCESS_WITH_ATTRIBUTES,
Packit b00eeb
	                              NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	g_assert (test->record);
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 0), ==, "SCHEMA");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 1), ==, "one");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 2), ==, "two");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 3), ==, "three");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 4), ==, "four");
Packit b00eeb
	g_assert_cmpstr (_gcr_record_get_raw (test->record, 5), ==, NULL);
Packit b00eeb
	g_assert_cmpstr ("1lc923g4laoeurc23rc241lcg2r23c4gr3", ==, test->attribute_buf->str);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_arguments_and_environment (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	const gchar *argv[] = {
Packit b00eeb
		"-1", "value1",
Packit b00eeb
		"-2", "value2",
Packit b00eeb
		NULL
Packit b00eeb
	};
Packit b00eeb
Packit b00eeb
	const gchar *envp[] = {
Packit b00eeb
		"ENVIRON1=VALUE1",
Packit b00eeb
		"ENVIRON2=VALUE2",
Packit b00eeb
		NULL
Packit b00eeb
	};
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-arguments-environ");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
Packit b00eeb
	g_signal_connect (test->process, "error-line", G_CALLBACK (on_process_error_line), test);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, envp, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	if (error) {
Packit b00eeb
		g_printerr ("%s\n", test->error_buf->str);
Packit b00eeb
		g_assert_no_error (error);
Packit b00eeb
	}
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr ("value1\nvalue2\n", ==, test->output_buf->str);
Packit b00eeb
	g_assert_cmpstr ("VALUE1VALUE2\n", ==, test->error_buf->str);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_with_homedir (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gchar *check;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-with-homedir");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (SRCDIR, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_output_data, test, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	check = g_strdup_printf ("DIR: %s\n", SRCDIR);
Packit b00eeb
	g_assert_cmpstr (check, ==, test->output_buf->str);
Packit b00eeb
	g_free (check);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_with_input_and_output (Test *test,
Packit b00eeb
                                gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	const gchar *data = "one\ntwenty two\nthree\nfourty four\n";
Packit b00eeb
	GInputStream *input;
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	GString *string;
Packit b00eeb
	gchar *script;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-echo");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (SRCDIR, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	input = g_memory_input_stream_new_from_data ((gpointer)data, -1, NULL);
Packit b00eeb
	output = g_memory_output_stream_new (NULL, 0, g_realloc, g_free);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_set_input_stream (test->process, input);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
	g_assert (ret == TRUE);
Packit b00eeb
Packit b00eeb
	string = g_string_new_len (g_memory_output_stream_get_data (G_MEMORY_OUTPUT_STREAM (output)),
Packit b00eeb
	                           g_memory_output_stream_get_data_size (G_MEMORY_OUTPUT_STREAM (output)));
Packit b00eeb
	g_assert_cmpstr (data, ==, string->str);
Packit b00eeb
	g_string_free (string, TRUE);
Packit b00eeb
Packit b00eeb
	g_clear_object (&input);
Packit b00eeb
	g_clear_object (&output);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_bad_executable (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	const gchar *argv[] = { NULL };
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-invalid");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT);
Packit b00eeb
	g_clear_error (&error);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_fail_exit (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	const gchar *argv[] = { "55", NULL };
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-fail-exit");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED);
Packit b00eeb
	g_assert_cmpstr (error->message, ==, "Gnupg process exited with code: 55");
Packit b00eeb
	g_clear_error (&error);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_fail_signal (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	const gchar *argv[] = { "15", NULL };
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-fail-signal");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, NULL, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_error (error, G_SPAWN_ERROR, G_SPAWN_ERROR_FAILED);
Packit b00eeb
	g_assert_cmpstr (error->message, ==, "Gnupg process was terminated with signal: 15");
Packit b00eeb
	g_clear_error (&error);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_and_cancel (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gchar *script;
Packit b00eeb
	const gchar *argv[] = { "15", NULL };
Packit b00eeb
	GCancellable *cancellable;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	cancellable = g_cancellable_new ();
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-simple-output");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, cancellable, on_async_ready, test);
Packit b00eeb
	g_cancellable_cancel (cancellable);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
Packit b00eeb
	g_clear_error (&error);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
Packit b00eeb
	g_object_unref (cancellable);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static gssize
Packit b00eeb
on_process_output_cancel (gconstpointer buffer,
Packit b00eeb
                          gsize count,
Packit b00eeb
                          GCancellable *cancellable,
Packit b00eeb
                          gpointer user_data,
Packit b00eeb
                          GError **error)
Packit b00eeb
{
Packit b00eeb
	g_cancellable_cancel (cancellable);
Packit b00eeb
	g_cancellable_set_error_if_cancelled (cancellable, error);
Packit b00eeb
	return -1;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_run_and_cancel_later (Test *test, gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	GOutputStream *output;
Packit b00eeb
	gchar *script;
Packit b00eeb
	const gchar *argv[] = { "15", NULL };
Packit b00eeb
	GCancellable *cancellable;
Packit b00eeb
	gboolean ret;
Packit b00eeb
Packit b00eeb
	cancellable = g_cancellable_new ();
Packit b00eeb
Packit b00eeb
	script = build_script_path ("mock-simple-output");
Packit b00eeb
	test->process = _gcr_gnupg_process_new (NULL, script);
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->process), (gpointer *)&test->process);
Packit b00eeb
	output = _gcr_callback_output_stream_new (on_process_output_cancel, NULL, NULL);
Packit b00eeb
	_gcr_gnupg_process_set_output_stream (test->process, output);
Packit b00eeb
	g_object_unref (output);
Packit b00eeb
	g_free (script);
Packit b00eeb
Packit b00eeb
	_gcr_gnupg_process_run_async (test->process, argv, NULL, 0, cancellable, on_async_ready, test);
Packit b00eeb
	egg_test_wait_until (WAIT);
Packit b00eeb
Packit b00eeb
	g_assert (test->result);
Packit b00eeb
	ret = _gcr_gnupg_process_run_finish (test->process, test->result, &error);
Packit b00eeb
	g_assert_error (error, G_IO_ERROR, G_IO_ERROR_CANCELLED);
Packit b00eeb
	g_clear_error (&error);
Packit b00eeb
	g_assert (ret == FALSE);
Packit b00eeb
Packit b00eeb
	g_object_unref (cancellable);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
int
Packit b00eeb
main (int argc, char **argv)
Packit b00eeb
{
Packit b00eeb
	g_test_init (&argc, &argv, NULL);
Packit b00eeb
	g_set_prgname ("test-gnupg-process");
Packit b00eeb
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/create", Test, NULL, setup, test_create, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_simple_output", Test, NULL, setup, test_run_simple_output, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_simple_error", Test, NULL, setup, test_run_simple_error, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_status_and_output", Test, NULL, setup, test_run_status_and_output, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_status_and_attribute", Test, NULL, setup, test_run_status_and_attribute, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_arguments_and_environment", Test, NULL, setup, test_run_arguments_and_environment, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_with_homedir", Test, NULL, setup, test_run_with_homedir, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_with_input_and_output", Test, NULL, setup, test_run_with_input_and_output, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_fail_exit", Test, NULL, setup, test_run_fail_exit, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_fail_signal", Test, NULL, setup, test_run_fail_signal, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_and_cancel", Test, NULL, setup, test_run_and_cancel, teardown);
Packit b00eeb
	g_test_add ("/gcr/gnupg-process/run_and_cancel_later", Test, NULL, setup, test_run_and_cancel_later, teardown);
Packit b00eeb
Packit b00eeb
	/* Valgrind seems to have problems with g_spawn_async_xxx() failing */
Packit b00eeb
	if (!egg_testing_on_valgrind ())
Packit b00eeb
		g_test_add ("/gcr/gnupg-process/run_bad_executable", Test, NULL, setup, test_run_bad_executable, teardown);
Packit b00eeb
Packit b00eeb
	return egg_tests_run_with_loop ();
Packit b00eeb
}