Blame gcr/test-ssh-askpass.c

Packit b00eeb
/* -*- Mode: C; indent-tabs-mode: t; c-basic-offset: 8; tab-width: 8 -*- */
Packit b00eeb
/*
Packit b00eeb
   Copyright (C) 2014 Stefan Walter
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@gnome.org>
Packit b00eeb
*/
Packit b00eeb
Packit b00eeb
#include "config.h"
Packit b00eeb
Packit b00eeb
#include "gcr/gcr-base.h"
Packit b00eeb
Packit b00eeb
#include "egg/egg-testing.h"
Packit b00eeb
#include "egg/mock-interaction.h"
Packit b00eeb
Packit b00eeb
#include <glib/gstdio.h>
Packit b00eeb
Packit b00eeb
extern const char *gcr_ssh_askpass_executable;
Packit b00eeb
Packit b00eeb
typedef struct {
Packit b00eeb
	GTlsInteraction *interaction;
Packit b00eeb
	GcrSshAskpass *askpass;
Packit b00eeb
} Test;
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
setup (Test *test,
Packit b00eeb
       gconstpointer password)
Packit b00eeb
{
Packit b00eeb
	test->interaction = mock_interaction_new (password);
Packit b00eeb
	test->askpass = gcr_ssh_askpass_new (test->interaction);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
teardown (Test *test,
Packit b00eeb
          gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	g_object_unref (test->interaction);
Packit b00eeb
Packit b00eeb
	g_object_add_weak_pointer (G_OBJECT (test->askpass), (gpointer *)&test->askpass);
Packit b00eeb
	g_object_unref (test->askpass);
Packit b00eeb
	g_assert (test->askpass == NULL);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
on_ssh_child (GPid pid,
Packit b00eeb
              gint status,
Packit b00eeb
              gpointer user_data)
Packit b00eeb
{
Packit b00eeb
	gint *out = user_data;
Packit b00eeb
	*out = status;
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_ssh_keygen (Test *test,
Packit b00eeb
                 gconstpointer password)
Packit b00eeb
{
Packit b00eeb
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gint status;
Packit b00eeb
	GPid pid;
Packit b00eeb
Packit b00eeb
	gchar *filename = g_build_filename (SRCDIR, "gcr", "fixtures", "pem-rsa-enc.key", NULL);
Packit b00eeb
	gchar *argv[] = { "ssh-keygen", "-y", "-f", filename, NULL };
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr (password, ==, "booo");
Packit b00eeb
Packit b00eeb
	if (g_chmod (filename, 0600) < 0)
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	g_spawn_async (SRCDIR "/gcr/fixtures", argv, NULL,
Packit b00eeb
	               G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
Packit b00eeb
	               gcr_ssh_askpass_child_setup, test->askpass, &pid, &error);
Packit b00eeb
Packit b00eeb
	g_free (filename);
Packit b00eeb
Packit b00eeb
	if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) {
Packit b00eeb
		g_test_skip ("ssh-keygen not found");
Packit b00eeb
		return;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
Packit b00eeb
	status = -1;
Packit b00eeb
	g_child_watch_add (pid, on_ssh_child, &status);
Packit b00eeb
Packit b00eeb
	while (status == -1)
Packit b00eeb
		g_main_context_iteration (NULL, TRUE);
Packit b00eeb
Packit b00eeb
	g_spawn_check_exit_status (status, &error);
Packit b00eeb
	g_assert_cmpint (status, ==, 0);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_cancelled (Test *test,
Packit b00eeb
                gconstpointer password)
Packit b00eeb
{
Packit b00eeb
Packit b00eeb
	GError *error = NULL;
Packit b00eeb
	gint status;
Packit b00eeb
	GPid pid;
Packit b00eeb
Packit b00eeb
	gchar *filename = g_build_filename (SRCDIR, "gcr", "fixtures", "pem-rsa-enc.key", NULL);
Packit b00eeb
	gchar *argv[] = { "ssh-keygen", "-y", "-f", filename, NULL };
Packit b00eeb
Packit b00eeb
	g_assert_cmpstr (password, ==, NULL);
Packit b00eeb
Packit b00eeb
	if (g_chmod (filename, 0600) < 0)
Packit b00eeb
		g_assert_not_reached ();
Packit b00eeb
Packit b00eeb
	g_spawn_async (SRCDIR "/gcr/fixtures", argv, NULL,
Packit b00eeb
	               G_SPAWN_STDOUT_TO_DEV_NULL | G_SPAWN_SEARCH_PATH | G_SPAWN_DO_NOT_REAP_CHILD,
Packit b00eeb
	               gcr_ssh_askpass_child_setup, test->askpass, &pid, &error);
Packit b00eeb
Packit b00eeb
	g_free (filename);
Packit b00eeb
Packit b00eeb
	if (g_error_matches (error, G_SPAWN_ERROR, G_SPAWN_ERROR_NOENT)) {
Packit b00eeb
		g_test_skip ("ssh-keygen not found");
Packit b00eeb
		return;
Packit b00eeb
	}
Packit b00eeb
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
Packit b00eeb
	status = -1;
Packit b00eeb
	g_child_watch_add (pid, on_ssh_child, &status);
Packit b00eeb
Packit b00eeb
	while (status == -1)
Packit b00eeb
		g_main_context_iteration (NULL, TRUE);
Packit b00eeb
Packit b00eeb
	g_assert_cmpint (status, !=, 0);
Packit b00eeb
	g_assert_no_error (error);
Packit b00eeb
}
Packit b00eeb
Packit b00eeb
static void
Packit b00eeb
test_properties (Test *test,
Packit b00eeb
                 gconstpointer unused)
Packit b00eeb
{
Packit b00eeb
	GTlsInteraction *interaction;
Packit b00eeb
Packit b00eeb
	g_object_get (test->askpass, "interaction", &interaction, NULL);
Packit b00eeb
	g_assert (interaction == test->interaction);
Packit b00eeb
	g_object_unref (interaction);
Packit b00eeb
Packit b00eeb
	g_assert (gcr_ssh_askpass_get_interaction (test->askpass) == test->interaction);
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-ssh-askpass");
Packit b00eeb
Packit b00eeb
	gcr_ssh_askpass_executable = BUILDDIR "/gcr-ssh-askpass";
Packit b00eeb
Packit b00eeb
	g_test_add ("/gcr/ssh-askpass/ssh-keygen", Test, "booo", setup, test_ssh_keygen, teardown);
Packit b00eeb
	g_test_add ("/gcr/ssh-askpass/cancelled", Test, NULL, setup, test_cancelled, teardown);
Packit b00eeb
	g_test_add ("/gcr/ssh-askpass/properties", Test, NULL, setup, test_properties, teardown);
Packit b00eeb
Packit b00eeb
	return g_test_run ();
Packit b00eeb
}