File: tests-request.c

package info (click to toggle)
libgpiod 2.2.1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 6,108 kB
  • sloc: ansic: 26,612; sh: 7,554; cpp: 4,944; python: 2,426; makefile: 811; xml: 49
file content (116 lines) | stat: -rw-r--r-- 3,896 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
// 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/request"

static GVariant *make_empty_request_config(void)
{
	GVariantBuilder builder;

	g_variant_builder_init(&builder, G_VARIANT_TYPE("a{sv}"));

	return g_variant_ref_sink(g_variant_builder_end(&builder));
}

static GVariant *make_input_lines_line_config(void)
{
	g_autoptr(GVariant) output_values = NULL;
	g_autoptr(GVariant) line_settings = NULL;
	g_autoptr(GVariant) line_offsets = NULL;
	g_autoptr(GVariant) line_configs = NULL;
	g_autoptr(GVariant) line_config = NULL;
	GVariantBuilder builder;

	g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
	g_variant_builder_add_value(&builder, g_variant_new_uint32(3));
	g_variant_builder_add_value(&builder, g_variant_new_uint32(5));
	g_variant_builder_add_value(&builder, g_variant_new_uint32(7));
	line_offsets = g_variant_builder_end(&builder);

	g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
	g_variant_builder_add_value(&builder,
				g_variant_new("{sv}", "direction",
					      g_variant_new_string("input")));
	line_settings = g_variant_builder_end(&builder);

	g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
	g_variant_builder_add_value(&builder, g_variant_ref(line_offsets));
	g_variant_builder_add_value(&builder, g_variant_ref(line_settings));
	line_config = g_variant_builder_end(&builder);

	g_variant_builder_init(&builder, G_VARIANT_TYPE_ARRAY);
	g_variant_builder_add_value(&builder, g_variant_ref(line_config));
	line_configs = g_variant_builder_end(&builder);

	output_values = g_variant_new("ai", NULL);

	g_variant_builder_init(&builder, G_VARIANT_TYPE_TUPLE);
	g_variant_builder_add_value(&builder, g_variant_ref(line_configs));
	g_variant_builder_add_value(&builder, g_variant_ref(output_values));

	return g_variant_ref_sink(g_variant_builder_end(&builder));
}

GPIOD_TEST_CASE(request_input_lines)
{
	g_autoptr(GPIOSimChip) sim = g_gpiosim_chip_new("num-lines", 8, NULL);
	g_autoptr(GpiodbusDaemonProcess) mgr = NULL;
	g_autoptr(GVariant) request_config = NULL;
	g_autoptr(GVariant) line_config = NULL;
	g_autofree gchar *request_path = 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);

	line_config = make_input_lines_line_config();
	request_config = make_empty_request_config();

	gpiodbus_test_chip_call_request_lines_sync_or_fail(chip, line_config,
							   request_config,
							   &request_path);
}

GPIOD_TEST_CASE(release_request)
{
	g_autoptr(GPIOSimChip) sim = g_gpiosim_chip_new("num-lines", 8, NULL);
	g_autoptr(GpiodbusDaemonProcess) mgr = NULL;
	g_autoptr(GVariant) request_config = NULL;
	g_autoptr(GpiodbusRequest) request = NULL;
	g_autoptr(GVariant) line_config = NULL;
	g_autofree gchar *request_path = 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);

	line_config = make_input_lines_line_config();
	request_config = make_empty_request_config();

	gpiodbus_test_chip_call_request_lines_sync_or_fail(chip, line_config,
							   request_config,
							   &request_path);

	request = gpiodbus_test_get_request_proxy_or_fail(request_path);
	gpiodbus_test_request_call_release_sync_or_fail(request);
}