/*
* This file is part of Cockpit.
*
* Copyright (C) 2016 Red Hat, Inc.
*
* Cockpit 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.
*
* Cockpit 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 Cockpit; If not, see .
*/
#include "config.h"
#include "remotectl.h"
#include "common/cockpittest.h"
#include
#include
#include
#include
#include
const gchar *config_dir = BUILDDIR "/test-configdir";
typedef struct {
gint ret;
gchar *cert_dir;
} TestCase;
typedef struct {
const gchar **files;
const gchar *expected_message;
} TestFixture;
static void
delete_all (TestCase *tc)
{
GDir *dir = NULL;
GError *error = NULL;
gchar *parent = NULL;
const gchar *name;
dir = g_dir_open (tc->cert_dir, 0, &error);
if (!dir)
goto out;
while ((name = g_dir_read_name (dir)) != NULL)
{
gchar *path = g_build_filename (tc->cert_dir, name, NULL);
g_unlink (path);
g_free (path);
}
parent = g_path_get_dirname (tc->cert_dir);
g_rmdir (parent);
g_rmdir (tc->cert_dir);
g_rmdir (config_dir);
out:
if (dir)
g_dir_close (dir);
g_clear_error (&error);
g_free (parent);
}
static void
setup (TestCase *tc,
gconstpointer data)
{
GPtrArray *ptr = g_ptr_array_new ();
const TestFixture *fix = data;
const gchar *old_val = g_getenv ("XDG_CONFIG_DIRS");
gint i;
g_setenv ("XDG_CONFIG_DIRS", config_dir, TRUE);
tc->cert_dir = g_build_filename (config_dir, "cockpit", "ws-certs.d", NULL);
/* make sure we start clean */
delete_all(tc);
g_ptr_array_add (ptr, "certificate");
g_ptr_array_add (ptr, "--user");
g_ptr_array_add (ptr, (gchar *) g_get_user_name ());
g_ptr_array_add (ptr, "--group");
g_ptr_array_add (ptr, (gchar *) g_get_user_name ());
for (i = 0; fix->files[i] != NULL; i++)
g_ptr_array_add (ptr, (gchar *) fix->files[i]);
if (fix->expected_message)
cockpit_expect_message (fix->expected_message);
tc->ret = cockpit_remotectl_certificate (ptr->len, (gchar **) ptr->pdata);
g_ptr_array_free (ptr, TRUE);
if (old_val)
g_setenv ("XDG_CONFIG_DIRS", old_val, TRUE);
else
g_unsetenv ("XDG_CONFIG_DIRS");
}
static void
teardown (TestCase *tc,
gconstpointer data)
{
delete_all(tc);
cockpit_assert_expected ();
g_free (tc->cert_dir);
}
static void
test_combine_good (TestCase *test,
gconstpointer data)
{
g_assert_cmpint (test->ret, ==, 0);
}
static void
test_combine_bad (TestCase *test,
gconstpointer data)
{
GDir *dir = NULL;
GError *error = NULL;
g_assert_cmpint (test->ret, ==, 1);
dir = g_dir_open (test->cert_dir, 0, &error);
g_assert_null (error);
g_assert_null (g_dir_read_name (dir));
g_dir_close (dir);
}
const gchar *good_files[3] = { SRCDIR "/src/bridge/mock-server.crt",
SRCDIR "/src/bridge/mock-server.key", NULL };
const gchar *bad_files[2] = { "bad", NULL };
const gchar *bad_files2[3] = { SRCDIR "/src/bridge/mock-server.crt", "bad2", NULL };
const gchar *invalid_files1[3] = { SRCDIR "/src/ws/mock-config/cockpit/cockpit.conf",
SRCDIR "/src/ws/mock-config/cockpit/cockpit-alt.conf", NULL };
const gchar *invalid_files2[3] = { SRCDIR "/src/bridge/mock-server.crt",
SRCDIR "/src/bridge/mock-client.crt", NULL };
const gchar *invalid_files3[2] = { SRCDIR "/src/bridge/mock-client.key", NULL };
static const TestFixture fixture_good_file = {
.expected_message = NULL,
.files = good_files
};
static const TestFixture fixture_bad_file = {
.expected_message = "*Failed to open file *bad*: No such file or directory",
.files = bad_files
};
static const TestFixture fixture_bad_file2 = {
.expected_message = "*Failed to open file *bad2*: No such file or directory",
.files = bad_files2
};
static const TestFixture fixture_invalid1= {
.expected_message = "*: No PEM-encoded private key found",
.files = invalid_files1
};
static const TestFixture fixture_invalid2 = {
.expected_message = "*: No PEM-encoded private key found",
.files = invalid_files2
};
static const TestFixture fixture_invalid3 = {
.expected_message = "*: No PEM-encoded certificate found",
.files = invalid_files3
};
int
main (int argc,
char *argv[])
{
cockpit_test_init (&argc, &argv);
g_test_add ("/remotectl-certificate/combine-good", TestCase, &fixture_good_file,
setup, test_combine_good, teardown);
g_test_add ("/remotectl-certificate/combine-bad-file", TestCase, &fixture_bad_file,
setup, test_combine_bad, teardown);
g_test_add ("/remotectl-certificate/combine-bad-file2", TestCase, &fixture_bad_file2,
setup, test_combine_bad, teardown);
g_test_add ("/remotectl-certificate/combine-not-valid", TestCase, &fixture_invalid1,
setup, test_combine_bad, teardown);
g_test_add ("/remotectl-certificate/combine-no-key", TestCase, &fixture_invalid2,
setup, test_combine_bad, teardown);
g_test_add ("/remotectl-certificate/combine-no-cert", TestCase, &fixture_invalid3,
setup, test_combine_bad, teardown);
return g_test_run ();
}