/*
* gnome-keyring
*
* Copyright (C) 2018 Red Hat, Inc.
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as
* published by the Free Software Foundation; either version 2.1 of
* the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this program; if not, see
* .
*
* Author: Daiki Ueno
*/
#include "config.h"
#include "gcr-ssh-agent-private.h"
#include "gcr-ssh-agent-process.h"
#include "gcr-ssh-agent-util.h"
#include "gcr-ssh-agent-test.h"
#include "egg/egg-testing.h"
#include
typedef struct {
gchar *directory;
EggBuffer req;
EggBuffer resp;
GcrSshAgentProcess *process;
GSocketConnection *connection;
GMainLoop *loop;
} Test;
static void
setup (Test *test, gconstpointer unused)
{
gchar *path;
test->directory = egg_tests_create_scratch_directory (NULL, NULL);
egg_buffer_init_full (&test->req, 128, (EggBufferAllocator)g_realloc);
egg_buffer_init_full (&test->resp, 128, (EggBufferAllocator)g_realloc);
path = g_strdup_printf ("%s/.ssh.sock", test->directory);
test->process = gcr_ssh_agent_process_new (path);
g_free (path);
g_assert_nonnull (test->process);
test->connection = NULL;
}
static void
teardown (Test *test, gconstpointer unused)
{
g_clear_object (&test->process);
g_clear_object (&test->connection);
egg_buffer_uninit (&test->req);
egg_buffer_uninit (&test->resp);
egg_tests_remove_scratch_directory (test->directory);
free (test->directory);
}
static void
connect_to_process (Test *test)
{
GError *error = NULL;
g_assert_null (test->connection);
test->connection = gcr_ssh_agent_process_connect (test->process, NULL, &error);
g_assert_nonnull (test->connection);
g_assert_no_error (error);
}
static void
test_connect (Test *test, gconstpointer unused)
{
connect_to_process (test);
}
static void
call (Test *test)
{
GError *error;
gboolean ret;
error = NULL;
ret = _gcr_ssh_agent_call (test->connection, &test->req, &test->resp, NULL, &error);
g_assert_true (ret);
g_assert_no_error (error);
}
DEFINE_CALL_FUNCS(Test, call)
static void
test_list (Test *test, gconstpointer unused)
{
connect_to_process (test);
call_request_identities(test, 0);
}
static void
test_add (Test *test, gconstpointer unused)
{
connect_to_process (test);
call_add_identity (test);
call_request_identities (test, 1);
}
static void
test_remove (Test *test, gconstpointer unused)
{
connect_to_process (test);
call_add_identity (test);
call_request_identities (test, 1);
call_remove_identity (test);
call_request_identities (test, 0);
}
static void
test_remove_all (Test *test, gconstpointer unused)
{
connect_to_process (test);
call_add_identity (test);
call_request_identities (test, 1);
call_remove_all_identities (test);
call_request_identities (test, 0);
}
static void
test_sign (Test *test, gconstpointer unused)
{
connect_to_process (test);
call_add_identity (test);
call_request_identities (test, 1);
call_sign (test);
call_remove_all_identities (test);
call_request_identities (test, 0);
}
static gpointer
kill_thread (gpointer data)
{
Test *test = data;
GPid pid;
pid = gcr_ssh_agent_process_get_pid (test->process);
g_assert_cmpint (-1, !=, pid);
kill (pid, SIGTERM);
return NULL;
}
static void
on_closed (GcrSshAgentProcess *self, gpointer data)
{
GMainLoop *loop = data;
g_main_loop_quit (loop);
g_main_loop_unref (loop);
}
static void
test_restart (Test *test, gconstpointer unused)
{
GPid pid;
GMainLoop *loop;
GThread *thread;
connect_to_process (test);
pid = gcr_ssh_agent_process_get_pid (test->process);
g_assert_cmpint (0, !=, pid);
thread = g_thread_new ("kill", kill_thread, test);
loop = g_main_loop_new (NULL, FALSE);
g_signal_connect (test->process, "closed", G_CALLBACK (on_closed), loop);
g_main_loop_run (loop);
g_thread_join (thread);
pid = gcr_ssh_agent_process_get_pid (test->process);
g_assert_cmpint (0, ==, pid);
g_clear_object (&test->connection);
connect_to_process (test);
pid = gcr_ssh_agent_process_get_pid (test->process);
g_assert_cmpint (0, !=, pid);
}
int
main (int argc, char **argv)
{
g_test_init (&argc, &argv, NULL);
g_test_add ("/ssh-agent/process/connect", Test, NULL, setup, test_connect, teardown);
g_test_add ("/ssh-agent/process/list", Test, NULL, setup, test_list, teardown);
g_test_add ("/ssh-agent/process/add", Test, NULL, setup, test_add, teardown);
g_test_add ("/ssh-agent/process/remove", Test, NULL, setup, test_remove, teardown);
g_test_add ("/ssh-agent/process/remove_all", Test, NULL, setup, test_remove_all, teardown);
g_test_add ("/ssh-agent/process/sign", Test, NULL, setup, test_sign, teardown);
g_test_add ("/ssh-agent/process/restart", Test, NULL, setup, test_restart, teardown);
return g_test_run ();
}