1
0
mirror of https://git.kernel.org/pub/scm/libs/libgpiod/libgpiod.git synced 2026-10-24 00:48:53 +03:00
Files
libgpiod/dbus/tests/tests-chip.c
Bartosz Golaszewski a5ab76da1e dbus: add the D-Bus daemon, command-line client and tests
Add the D-Bus API definition and its implementation in the form of a GPIO
manager daemon and a companion command-line client as well as some
additional configuration and data files (systemd service, example udev
configuration, etc.) and test suites.

Tested-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
Link: https://lore.kernel.org/r/20240812-dbus-v5-4-ead288509217@linaro.org
Signed-off-by: Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
2024-08-13 10:45:25 +02:00

134 lines
3.5 KiB
C

// SPDX-License-Identifier: GPL-2.0-or-later
// SPDX-FileCopyrightText: 2022-2023 Bartosz Golaszewski <bartosz.golaszewski@linaro.org>
#include <gio/gio.h>
#include <glib.h>
#include <gpiod-test.h>
#include <gpiod-test-common.h>
#include <gpiodbus.h>
#include <gpiosim-glib.h>
#include "daemon-process.h"
#include "helpers.h"
#define GPIOD_TEST_GROUP "gpiodbus/chip"
GPIOD_TEST_CASE(read_chip_info)
{
g_autoptr(GPIOSimChip) sim = g_gpiosim_chip_new("num-lines", 8,
"label", "foobar",
NULL);
g_autoptr(GpiodbusDaemonProcess) mgr = NULL;
g_autoptr(GpiodbusChip) chip = NULL;
g_autofree gchar *obj_path = NULL;
mgr = gpiodbus_daemon_process_new();
gpiodbus_test_wait_for_sim_intf(sim);
obj_path = g_strdup_printf("/io/gpiod1/chips/%s",
g_gpiosim_chip_get_name(sim));
chip = gpiodbus_test_get_chip_proxy_or_fail(obj_path);
g_assert_cmpstr(gpiodbus_chip_get_name(chip), ==,
g_gpiosim_chip_get_name(sim));
g_assert_cmpstr(gpiodbus_chip_get_label(chip), ==, "foobar");
g_assert_cmpuint(gpiodbus_chip_get_num_lines(chip), ==, 8);
g_assert_cmpstr(gpiodbus_chip_get_path(chip), ==,
g_gpiosim_chip_get_dev_path(sim));
}
static gboolean on_timeout(gpointer user_data)
{
gboolean *timed_out = user_data;
*timed_out = TRUE;
return G_SOURCE_REMOVE;
}
static void on_object_event(GDBusObjectManager *manager G_GNUC_UNUSED,
GpiodbusObject *object, gpointer user_data)
{
gchar **obj_path = user_data;
*obj_path = g_strdup(g_dbus_object_get_object_path(
G_DBUS_OBJECT(object)));
}
GPIOD_TEST_CASE(chip_added)
{
g_autoptr(GDBusObjectManager) manager = NULL;
g_autoptr(GpiodbusDaemonProcess) mgr = NULL;
g_autofree gchar *sim_obj_path = NULL;
g_autoptr(GPIOSimChip) sim = NULL;
g_autofree gchar *obj_path = NULL;
gboolean timed_out = FALSE;
guint timeout_id;
mgr = gpiodbus_daemon_process_new();
manager = gpiodbus_test_get_chip_object_manager_or_fail();
g_signal_connect(manager, "object-added", G_CALLBACK(on_object_event),
&obj_path);
timeout_id = g_timeout_add_seconds(5, on_timeout, &timed_out);
sim = g_gpiosim_chip_new(NULL);
while (!obj_path && !timed_out)
g_main_context_iteration(NULL, TRUE);
if (timed_out) {
g_test_fail_printf("timeout reached waiting for chip to be added");
return;
}
sim_obj_path = g_strdup_printf("/io/gpiod1/chips/%s",
g_gpiosim_chip_get_name(sim));
g_assert_cmpstr(sim_obj_path, ==, obj_path);
g_source_remove(timeout_id);
}
GPIOD_TEST_CASE(chip_removed)
{
g_autoptr(GPIOSimChip) sim = g_gpiosim_chip_new(NULL);
g_autoptr(GDBusObjectManager) manager = NULL;
g_autoptr(GpiodbusDaemonProcess) mgr = NULL;
g_autofree gchar *sim_obj_path = NULL;
g_autoptr(GpiodbusChip) chip = NULL;
g_autofree gchar *obj_path = NULL;
gboolean timed_out = FALSE;
guint timeout_id;
sim_obj_path = g_strdup_printf("/io/gpiod1/chips/%s",
g_gpiosim_chip_get_name(sim));
mgr = gpiodbus_daemon_process_new();
gpiodbus_test_wait_for_sim_intf(sim);
obj_path = g_strdup_printf("/io/gpiod1/chips/%s",
g_gpiosim_chip_get_name(sim));
chip = gpiodbus_test_get_chip_proxy_or_fail(obj_path);
manager = gpiodbus_test_get_chip_object_manager_or_fail();
g_signal_connect(manager, "object-removed", G_CALLBACK(on_object_event),
&obj_path);
timeout_id = g_timeout_add_seconds(5, on_timeout, &timed_out);
g_clear_object(&sim);
while (!obj_path && !timed_out)
g_main_context_iteration(NULL, TRUE);
if (timed_out) {
g_test_fail_printf("timeout reached waiting for chip to be removed");
return;
}
g_assert_cmpstr(sim_obj_path, ==, obj_path);
g_source_remove(timeout_id);
}