/* Copyright (C) 2014 Red Hat Inc The Gnome Keyring Library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. The Gnome Keyring Library 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 Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with the Gnome Library; see the file COPYING.LIB. If not, . Author: Stef Walter */ #include "config.h" #include "gkd-test.h" #include "daemon/control/gkd-control.h" #include "egg/egg-testing.h" #include #include #include #include #include #include typedef struct { GTestDBus *dbus; gchar *directory; GPid pid; } Test; static void setup (Test *test, gconstpointer unused) { test->dbus = g_test_dbus_new (G_TEST_DBUS_NONE); g_test_dbus_up (test->dbus); test->directory = egg_tests_create_scratch_directory ( SRCDIR "/daemon/dbus/fixtures/test.keyring", NULL); } static void teardown (Test *test, gconstpointer unused) { if (test->pid) { if (waitpid (test->pid, NULL, WNOHANG) != test->pid) { kill (test->pid, SIGTERM); g_assert_cmpint (waitpid (test->pid, NULL, 0), ==, test->pid); } g_spawn_close_pid (test->pid); } egg_tests_remove_scratch_directory (test->directory); g_free (test->directory); g_test_dbus_down (test->dbus); g_object_unref (test->dbus); } static void test_control_valid (Test *test, gconstpointer unused) { gchar *fixed = g_strdup_printf ("%s/xxxx", test->directory); const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--control-directory", fixed, "--components=", NULL }; gchar **output; gint status; GPid pid; output = gkd_test_launch_daemon (test->directory, argv, &pid, NULL); g_assert_cmpstr (g_environ_getenv (output, "GNOME_KEYRING_CONTROL"), ==, fixed); g_strfreev (output); g_assert (gkd_control_quit (fixed, 0)); g_assert_cmpint (waitpid (pid, &status, 0), ==, pid); g_assert_cmpint (status, ==, 0); g_free (fixed); } static void test_control_creates (Test *test, gconstpointer unused) { gchar *directory = g_build_filename (test->directory, "under", NULL); const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--control-directory", directory, "--components=", NULL }; gchar **output; output = gkd_test_launch_daemon (test->directory, argv, &test->pid, NULL); g_assert_cmpstr (g_environ_getenv (output, "GNOME_KEYRING_CONTROL"), ==, directory); g_strfreev (output); g_assert (g_file_test (directory, G_FILE_TEST_IS_DIR)); g_free (directory); } static void test_control_noaccess (Test *test, gconstpointer unused) { gchar *noaccess = g_build_filename (test->directory, "under", NULL); gchar *directory = g_build_filename (test->directory, "under", "subdir", NULL); const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--control-directory", directory, "--components=", NULL }; gchar **output; if (g_mkdir_with_parents (noaccess, 0000) < 0) g_assert_not_reached (); /* Should choose a different directory */ output = gkd_test_launch_daemon (test->directory, argv, &test->pid, NULL); g_assert_cmpstr (g_environ_getenv (output, "GNOME_KEYRING_CONTROL"), !=, directory); g_strfreev (output); g_assert (!g_file_test (directory, G_FILE_TEST_IS_DIR)); g_free (directory); if (chmod (noaccess, 0700) < 0) g_assert_not_reached (); g_free (noaccess); } static void test_control_badperm (Test *test, gconstpointer unused) { gchar *directory = g_build_filename (test->directory, "under", NULL); const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--control-directory", directory, "--components=", NULL }; gchar **output; if (g_mkdir_with_parents (directory, 0777) < 0) g_assert_not_reached (); /* Should choose a different directory */ output = gkd_test_launch_daemon (test->directory, argv, &test->pid, NULL); g_assert_cmpstr (g_environ_getenv (output, "GNOME_KEYRING_CONTROL"), !=, directory); g_strfreev (output); g_free (directory); } static void test_control_xdghome (Test *test, gconstpointer unused) { const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--components=", NULL }; gchar *directory; gchar *expected; GPid pid; gchar **output; gint status; /* Control directory not printed when default */ directory = g_build_filename (test->directory, "different", NULL); output = gkd_test_launch_daemon (test->directory, argv, &pid, "XDG_RUNTIME_DIR", directory, NULL); expected = g_build_filename (directory, "/keyring", NULL); g_assert_cmpstr (g_environ_getenv (output, "GNOME_KEYRING_CONTROL"), ==, NULL); g_strfreev (output); g_assert (gkd_control_quit (expected, 0)); g_assert_cmpint (waitpid (pid, &status, 0), ==, pid); g_assert_cmpint (status, ==, 0); g_free (directory); g_free (expected); } static void test_daemon_replace (Test *test, gconstpointer unused) { const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--components=", NULL }; const gchar *replace[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--replace", "--components=", NULL }; gchar **output; gint status; GPid pid; /* Start the first daemon */ output = gkd_test_launch_daemon (test->directory, argv, &pid, "XDG_RUNTIME_DIR", "/tmp/keyring-test-two", NULL); g_strfreev (output); /* Replace with the second daemon */ output = gkd_test_launch_daemon (test->directory, replace, &test->pid, "XDG_RUNTIME_DIR", "/tmp/keyring-test-two", NULL); g_strfreev (output); /* The first daemon should have exited cleanly here */ g_assert_cmpint (waitpid (pid, &status, 0), ==, pid); g_assert_cmpint (status, ==, 0); } #ifdef WITH_SSH static void test_ssh_agent (Test *test, gconstpointer unused) { gchar *auth_sock = g_build_filename (test->directory, "keyring", "ssh", NULL); const gchar *argv[] = { BUILDDIR "/gnome-keyring-daemon", "--foreground", "--components=ssh-agent", NULL }; gchar **output; output = gkd_test_launch_daemon (test->directory, argv, &test->pid, NULL); g_assert_cmpstr (g_environ_getenv (output, "SSH_AUTH_SOCK"), ==, auth_sock); g_strfreev (output); g_assert (g_file_test (auth_sock, G_FILE_TEST_EXISTS)); g_free (auth_sock); } #endif int main (int argc, char **argv) { g_test_init (&argc, &argv, NULL); g_test_add ("/daemon/startup/control/valid", Test, NULL, setup, test_control_valid, teardown); g_test_add ("/daemon/startup/control/creates", Test, NULL, setup, test_control_creates, teardown); g_test_add ("/daemon/startup/control/noaccess", Test, NULL, setup, test_control_noaccess, teardown); g_test_add ("/daemon/startup/control/badperm", Test, NULL, setup, test_control_badperm, teardown); g_test_add ("/daemon/startup/control/xdghome", Test, NULL, setup, test_control_xdghome, teardown); g_test_add ("/daemon/startup/replace", Test, NULL, setup, test_daemon_replace, teardown); #ifdef WITH_SSH g_test_add ("/daemon/startup/ssh-agent", Test, NULL, setup, test_ssh_agent, teardown); #endif return g_test_run (); }