|
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 |
}
|