/*
* 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 "cockpitdbusinternal.h"
#include "common/cockpittest.h"
#include
#include
typedef struct {
GDBusConnection *connection;
} TestCase;
static void
setup (TestCase *tc,
gconstpointer unused)
{
cockpit_dbus_internal_startup (FALSE);
cockpit_dbus_process_startup ();
while (g_main_context_iteration (NULL, FALSE));
tc->connection = cockpit_dbus_internal_client();
}
static void
teardown (TestCase *tc,
gconstpointer unused)
{
cockpit_assert_expected ();
g_object_unref (tc->connection);
cockpit_dbus_internal_cleanup ();
}
static void
on_complete_get_result (GObject *source,
GAsyncResult *result,
gpointer user_data)
{
GAsyncResult **ret = user_data;
g_assert (ret != NULL);
g_assert (*ret == NULL);
*ret = g_object_ref (result);
}
static GVariant *
dbus_call_with_main_loop (TestCase *tc,
const gchar *object_path,
const gchar *interface_name,
const gchar *method_name,
GVariant *parameters,
const GVariantType *reply_type,
GError **error)
{
GAsyncResult *result = NULL;
GVariant *retval;
g_dbus_connection_call (tc->connection, NULL, object_path,
interface_name, method_name, parameters,
reply_type, G_DBUS_CALL_FLAGS_NONE, -1,
NULL, on_complete_get_result, &result);
while (result == NULL)
g_main_context_iteration (NULL, TRUE);
retval = g_dbus_connection_call_finish (tc->connection, result, error);
g_object_unref (result);
return retval;
}
static void
test_get_properties (TestCase *tc,
gconstpointer unused)
{
GVariant *retval;
GVariant *inner = NULL;
GVariant *variable = NULL;
gchar **environ = g_listenv ();
gint i;
GError *error = NULL;
retval = dbus_call_with_main_loop (tc, "/bridge", "org.freedesktop.DBus.Properties", "GetAll",
g_variant_new ("(s)", "cockpit.Process"),
G_VARIANT_TYPE ("(a{sv})"), &error);
g_assert_no_error (error);
inner = g_variant_get_child_value (retval, 0);
variable = g_variant_lookup_value (inner, "Environment", G_VARIANT_TYPE ("a{ss}"));
for (i = 0; environ[i] != NULL; i++)
{
gchar *value = NULL;
g_assert_true (g_variant_lookup (variable, environ[i], "&s", &value));
g_assert_cmpstr (g_getenv (environ[i]), ==, value);
}
g_variant_unref (variable);
variable = g_variant_lookup_value (inner, "Pid", G_VARIANT_TYPE ("u"));
g_assert (variable != NULL);
g_assert_cmpuint (g_variant_get_uint32 (variable), ==, getpid ());
g_variant_unref (variable);
variable = g_variant_lookup_value (inner, "Uid", G_VARIANT_TYPE ("i"));
g_assert (variable != NULL);
g_assert_cmpuint (g_variant_get_int32 (variable), ==, getuid ());
g_variant_unref (variable);
variable = g_variant_lookup_value (inner, "SessionId", G_VARIANT_TYPE ("s"));
g_assert (variable != NULL);
/* Not always a valid string during testing */
g_variant_unref (variable);
variable = g_variant_lookup_value (inner, "StartTime", G_VARIANT_TYPE ("t"));
g_assert (variable != NULL);
g_assert_cmpuint (g_variant_get_uint64 (variable), !=, 0);
g_variant_unref (variable);
g_variant_unref (inner);
g_variant_unref (retval);
g_strfreev (environ);
}
int
main (int argc,
char *argv[])
{
cockpit_test_init (&argc, &argv);
g_test_add ("/process/get-properties", TestCase, NULL,
setup, test_get_properties, teardown);
return g_test_run ();
}