diff options
author | Daiki Ueno <dueno@src.gnome.org> | 2021-02-11 16:18:32 +0100 |
---|---|---|
committer | Daiki Ueno <dueno@src.gnome.org> | 2021-03-27 09:49:47 +0100 |
commit | e225c52586d17a9cc44ac57e7bc58ad417f42fe9 (patch) | |
tree | 5ec351804abc0625a53482dc293b8b4eb6521df0 /gcr/test-ssh-agent-preload.c | |
parent | 04c2c84e776f2af3639cd79d69009efdd189e293 (diff) | |
download | gcr-e225c52586d17a9cc44ac57e7bc58ad417f42fe9.tar.gz |
gcr: Port ssh-agent tests from gnome-keyring
This copies most of the tests and fixtures from gnome-keyring,
exercising ssh-agent functionality. Currently
test-gkd-ssh-agent-interaction has not been ported yet, because the
new implementation interacts with secret-service.
Diffstat (limited to 'gcr/test-ssh-agent-preload.c')
-rw-r--r-- | gcr/test-ssh-agent-preload.c | 166 |
1 files changed, 166 insertions, 0 deletions
diff --git a/gcr/test-ssh-agent-preload.c b/gcr/test-ssh-agent-preload.c new file mode 100644 index 0000000..ddf27c4 --- /dev/null +++ b/gcr/test-ssh-agent-preload.c @@ -0,0 +1,166 @@ +/* + * 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 + * <http://www.gnu.org/licenses/>. + * + * Author: Daiki Ueno + */ + +#include "config.h" + +#include "gcr-ssh-agent-preload.h" +#include "egg/egg-testing.h" + +#include <glib/gstdio.h> +#include <unistd.h> + +typedef struct { + gchar *directory; + GcrSshAgentPreload *preload; +} Test; + +static void +setup (Test *test, gconstpointer unused) +{ + test->directory = egg_tests_create_scratch_directory (NULL, NULL); + + egg_tests_copy_scratch_file (test->directory, SRCDIR "/gcr/fixtures/ssh-agent/id_rsa_plain"); + egg_tests_copy_scratch_file (test->directory, SRCDIR "/gcr/fixtures/ssh-agent/id_rsa_plain.pub"); + + test->preload = gcr_ssh_agent_preload_new (test->directory); +} + +static void +teardown (Test *test, gconstpointer unused) +{ + g_object_unref (test->preload); + + egg_tests_remove_scratch_directory (test->directory); + g_free (test->directory); +} + +static void +test_list (Test *test, gconstpointer unused) +{ + GList *keys; + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (1, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); +} + +static void +test_added (Test *test, gconstpointer unused) +{ + GList *keys; + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (1, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); + + /* Mtime must change so wait between tests */ + sleep (1); + + egg_tests_copy_scratch_file (test->directory, SRCDIR "/gcr/fixtures/ssh-agent/id_ecdsa_plain"); + egg_tests_copy_scratch_file (test->directory, SRCDIR "/gcr/fixtures/ssh-agent/id_ecdsa_plain.pub"); + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (2, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); +} + +static void +test_removed (Test *test, gconstpointer unused) +{ + GList *keys; + gchar *path; + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (1, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); + + /* Mtime must change so wait between tests */ + sleep (1); + + path = g_build_filename (test->directory, "id_rsa_plain.pub", NULL); + g_unlink (path); + g_free (path); + + path = g_build_filename (test->directory, "id_rsa_plain", NULL); + g_unlink (path); + g_free (path); + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (0, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); +} + +static void +test_changed (Test *test, gconstpointer unused) +{ + GList *keys; + gchar *path; + gchar *contents; + gsize length; + GError *error; + gchar *p; + gboolean ret; + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (1, ==, g_list_length (keys)); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); + + /* Mtime must change so wait between tests */ + sleep (1); + + path = g_build_filename (test->directory, "id_rsa_plain.pub", NULL); + error = NULL; + ret = g_file_get_contents (path, &contents, &length, &error); + g_assert_true (ret); + g_assert_no_error (error); + +#define COMMENT "comment" + contents = g_realloc (contents, length + strlen (COMMENT) + 1); + p = strchr (contents, '\n'); + g_assert_nonnull (p); + memcpy (p, " " COMMENT "\n", strlen (COMMENT) + 2); + error = NULL; + ret = g_file_set_contents (path, contents, length + strlen (COMMENT), &error); + g_assert_true (ret); + g_assert_no_error (error); + g_free (path); + g_free (contents); + + keys = gcr_ssh_agent_preload_get_keys (test->preload); + g_assert_cmpint (1, ==, g_list_length (keys)); + g_assert_cmpstr (COMMENT, ==, ((GcrSshAgentKeyInfo *)keys->data)->comment); + g_list_free_full (keys, (GDestroyNotify)gcr_ssh_agent_key_info_free); +#undef COMMENT +} + +int +main (int argc, char **argv) +{ + g_test_init (&argc, &argv, NULL); + + g_test_add ("/ssh-agent/preload/list", Test, NULL, setup, test_list, teardown); + g_test_add ("/ssh-agent/preload/added", Test, NULL, setup, test_added, teardown); + g_test_add ("/ssh-agent/preload/removed", Test, NULL, setup, test_removed, teardown); + g_test_add ("/ssh-agent/preload/changed", Test, NULL, setup, test_changed, teardown); + + return g_test_run (); +} |