1a46c0ec8Sopenharmony_ci/*
2a46c0ec8Sopenharmony_ci * Copyright © 2013 Red Hat, Inc.
3a46c0ec8Sopenharmony_ci *
4a46c0ec8Sopenharmony_ci * Permission is hereby granted, free of charge, to any person obtaining a
5a46c0ec8Sopenharmony_ci * copy of this software and associated documentation files (the "Software"),
6a46c0ec8Sopenharmony_ci * to deal in the Software without restriction, including without limitation
7a46c0ec8Sopenharmony_ci * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a46c0ec8Sopenharmony_ci * and/or sell copies of the Software, and to permit persons to whom the
9a46c0ec8Sopenharmony_ci * Software is furnished to do so, subject to the following conditions:
10a46c0ec8Sopenharmony_ci *
11a46c0ec8Sopenharmony_ci * The above copyright notice and this permission notice (including the next
12a46c0ec8Sopenharmony_ci * paragraph) shall be included in all copies or substantial portions of the
13a46c0ec8Sopenharmony_ci * Software.
14a46c0ec8Sopenharmony_ci *
15a46c0ec8Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a46c0ec8Sopenharmony_ci * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a46c0ec8Sopenharmony_ci * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a46c0ec8Sopenharmony_ci * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a46c0ec8Sopenharmony_ci * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a46c0ec8Sopenharmony_ci * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a46c0ec8Sopenharmony_ci * DEALINGS IN THE SOFTWARE.
22a46c0ec8Sopenharmony_ci */
23a46c0ec8Sopenharmony_ci
24a46c0ec8Sopenharmony_ci#include <config.h>
25a46c0ec8Sopenharmony_ci
26a46c0ec8Sopenharmony_ci#include <check.h>
27a46c0ec8Sopenharmony_ci#include <errno.h>
28a46c0ec8Sopenharmony_ci#include <fcntl.h>
29a46c0ec8Sopenharmony_ci#include <libinput.h>
30a46c0ec8Sopenharmony_ci#include <libinput-util.h>
31a46c0ec8Sopenharmony_ci#include <libudev.h>
32a46c0ec8Sopenharmony_ci#include <unistd.h>
33a46c0ec8Sopenharmony_ci
34a46c0ec8Sopenharmony_ci#include "litest.h"
35a46c0ec8Sopenharmony_ci
36a46c0ec8Sopenharmony_cistatic int open_restricted(const char *path, int flags, void *data)
37a46c0ec8Sopenharmony_ci{
38a46c0ec8Sopenharmony_ci	int fd;
39a46c0ec8Sopenharmony_ci	fd = open(path, flags);
40a46c0ec8Sopenharmony_ci	return fd < 0 ? -errno : fd;
41a46c0ec8Sopenharmony_ci}
42a46c0ec8Sopenharmony_cistatic void close_restricted(int fd, void *data)
43a46c0ec8Sopenharmony_ci{
44a46c0ec8Sopenharmony_ci	close(fd);
45a46c0ec8Sopenharmony_ci}
46a46c0ec8Sopenharmony_ci
47a46c0ec8Sopenharmony_cistatic const struct libinput_interface simple_interface = {
48a46c0ec8Sopenharmony_ci	.open_restricted = open_restricted,
49a46c0ec8Sopenharmony_ci	.close_restricted = close_restricted,
50a46c0ec8Sopenharmony_ci};
51a46c0ec8Sopenharmony_ci
52a46c0ec8Sopenharmony_ciSTART_TEST(udev_create_NULL)
53a46c0ec8Sopenharmony_ci{
54a46c0ec8Sopenharmony_ci	struct libinput *li;
55a46c0ec8Sopenharmony_ci	struct udev *udev;
56a46c0ec8Sopenharmony_ci
57a46c0ec8Sopenharmony_ci	udev = udev_new();
58a46c0ec8Sopenharmony_ci
59a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(NULL, NULL, NULL);
60a46c0ec8Sopenharmony_ci	ck_assert(li == NULL);
61a46c0ec8Sopenharmony_ci
62a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, NULL);
63a46c0ec8Sopenharmony_ci	ck_assert(li == NULL);
64a46c0ec8Sopenharmony_ci
65a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(NULL, NULL, udev);
66a46c0ec8Sopenharmony_ci	ck_assert(li == NULL);
67a46c0ec8Sopenharmony_ci
68a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
69a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
70a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, NULL), -1);
71a46c0ec8Sopenharmony_ci
72a46c0ec8Sopenharmony_ci	libinput_unref(li);
73a46c0ec8Sopenharmony_ci	udev_unref(udev);
74a46c0ec8Sopenharmony_ci}
75a46c0ec8Sopenharmony_ciEND_TEST
76a46c0ec8Sopenharmony_ci
77a46c0ec8Sopenharmony_ciSTART_TEST(udev_create_seat0)
78a46c0ec8Sopenharmony_ci{
79a46c0ec8Sopenharmony_ci	struct libinput *li;
80a46c0ec8Sopenharmony_ci	struct libinput_event *event;
81a46c0ec8Sopenharmony_ci	struct udev *udev;
82a46c0ec8Sopenharmony_ci	int fd;
83a46c0ec8Sopenharmony_ci
84a46c0ec8Sopenharmony_ci	udev = udev_new();
85a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
86a46c0ec8Sopenharmony_ci
87a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
88a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
89a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
90a46c0ec8Sopenharmony_ci
91a46c0ec8Sopenharmony_ci	fd = libinput_get_fd(li);
92a46c0ec8Sopenharmony_ci	ck_assert_int_ge(fd, 0);
93a46c0ec8Sopenharmony_ci
94a46c0ec8Sopenharmony_ci	/* expect at least one event */
95a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
96a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
97a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
98a46c0ec8Sopenharmony_ci
99a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
100a46c0ec8Sopenharmony_ci	libinput_unref(li);
101a46c0ec8Sopenharmony_ci	udev_unref(udev);
102a46c0ec8Sopenharmony_ci}
103a46c0ec8Sopenharmony_ciEND_TEST
104a46c0ec8Sopenharmony_ci
105a46c0ec8Sopenharmony_ciSTART_TEST(udev_create_empty_seat)
106a46c0ec8Sopenharmony_ci{
107a46c0ec8Sopenharmony_ci	struct libinput *li;
108a46c0ec8Sopenharmony_ci	struct libinput_event *event;
109a46c0ec8Sopenharmony_ci	struct udev *udev;
110a46c0ec8Sopenharmony_ci	int fd;
111a46c0ec8Sopenharmony_ci
112a46c0ec8Sopenharmony_ci	udev = udev_new();
113a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
114a46c0ec8Sopenharmony_ci
115a46c0ec8Sopenharmony_ci	/* expect a libinput reference, but no events */
116a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
117a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
118a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seatdoesntexist"), 0);
119a46c0ec8Sopenharmony_ci
120a46c0ec8Sopenharmony_ci	fd = libinput_get_fd(li);
121a46c0ec8Sopenharmony_ci	ck_assert_int_ge(fd, 0);
122a46c0ec8Sopenharmony_ci
123a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
124a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
125a46c0ec8Sopenharmony_ci	ck_assert(event == NULL);
126a46c0ec8Sopenharmony_ci
127a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
128a46c0ec8Sopenharmony_ci	libinput_unref(li);
129a46c0ec8Sopenharmony_ci	udev_unref(udev);
130a46c0ec8Sopenharmony_ci}
131a46c0ec8Sopenharmony_ciEND_TEST
132a46c0ec8Sopenharmony_ci
133a46c0ec8Sopenharmony_ciSTART_TEST(udev_create_seat_too_long)
134a46c0ec8Sopenharmony_ci{
135a46c0ec8Sopenharmony_ci	struct libinput *li;
136a46c0ec8Sopenharmony_ci	struct udev *udev;
137a46c0ec8Sopenharmony_ci	char seatname[258];
138a46c0ec8Sopenharmony_ci
139a46c0ec8Sopenharmony_ci	memset(seatname, 'a', sizeof(seatname) - 1);
140a46c0ec8Sopenharmony_ci	seatname[sizeof(seatname) - 1] = '\0';
141a46c0ec8Sopenharmony_ci
142a46c0ec8Sopenharmony_ci	udev = udev_new();
143a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
144a46c0ec8Sopenharmony_ci
145a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
146a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
147a46c0ec8Sopenharmony_ci	litest_set_log_handler_bug(li);
148a46c0ec8Sopenharmony_ci
149a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, seatname), -1);
150a46c0ec8Sopenharmony_ci
151a46c0ec8Sopenharmony_ci	litest_assert_empty_queue(li);
152a46c0ec8Sopenharmony_ci
153a46c0ec8Sopenharmony_ci	libinput_unref(li);
154a46c0ec8Sopenharmony_ci	udev_unref(udev);
155a46c0ec8Sopenharmony_ci}
156a46c0ec8Sopenharmony_ciEND_TEST
157a46c0ec8Sopenharmony_ci
158a46c0ec8Sopenharmony_ciSTART_TEST(udev_set_user_data)
159a46c0ec8Sopenharmony_ci{
160a46c0ec8Sopenharmony_ci	struct libinput *li;
161a46c0ec8Sopenharmony_ci	struct udev *udev;
162a46c0ec8Sopenharmony_ci	int data1, data2;
163a46c0ec8Sopenharmony_ci
164a46c0ec8Sopenharmony_ci	udev = udev_new();
165a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
166a46c0ec8Sopenharmony_ci
167a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, &data1, udev);
168a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
169a46c0ec8Sopenharmony_ci	ck_assert(libinput_get_user_data(li) == &data1);
170a46c0ec8Sopenharmony_ci	libinput_set_user_data(li, &data2);
171a46c0ec8Sopenharmony_ci	ck_assert(libinput_get_user_data(li) == &data2);
172a46c0ec8Sopenharmony_ci
173a46c0ec8Sopenharmony_ci	libinput_unref(li);
174a46c0ec8Sopenharmony_ci	udev_unref(udev);
175a46c0ec8Sopenharmony_ci}
176a46c0ec8Sopenharmony_ciEND_TEST
177a46c0ec8Sopenharmony_ci
178a46c0ec8Sopenharmony_ciSTART_TEST(udev_added_seat_default)
179a46c0ec8Sopenharmony_ci{
180a46c0ec8Sopenharmony_ci	struct libinput *li;
181a46c0ec8Sopenharmony_ci	struct libinput_event *event;
182a46c0ec8Sopenharmony_ci	struct udev *udev;
183a46c0ec8Sopenharmony_ci	struct libinput_device *device;
184a46c0ec8Sopenharmony_ci	struct libinput_seat *seat;
185a46c0ec8Sopenharmony_ci	const char *seat_name;
186a46c0ec8Sopenharmony_ci	struct litest_device *dev;
187a46c0ec8Sopenharmony_ci
188a46c0ec8Sopenharmony_ci	udev = udev_new();
189a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
190a46c0ec8Sopenharmony_ci
191a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
192a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
193a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
194a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
195a46c0ec8Sopenharmony_ci
196a46c0ec8Sopenharmony_ci	/* Drop any events from other devices */
197a46c0ec8Sopenharmony_ci	litest_drain_events(li);
198a46c0ec8Sopenharmony_ci
199a46c0ec8Sopenharmony_ci	/* Now create our own device, it should be in the "default"
200a46c0ec8Sopenharmony_ci	 * logical seat. This test may fail if there is a local rule changing
201a46c0ec8Sopenharmony_ci	 * that, but it'll be fine for the 99% case. */
202a46c0ec8Sopenharmony_ci	dev = litest_create(LITEST_MOUSE, NULL, NULL, NULL, NULL);
203a46c0ec8Sopenharmony_ci	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_DEVICE_ADDED, -1);
204a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
205a46c0ec8Sopenharmony_ci	device = libinput_event_get_device(event);
206a46c0ec8Sopenharmony_ci	seat = libinput_device_get_seat(device);
207a46c0ec8Sopenharmony_ci	ck_assert_notnull(seat);
208a46c0ec8Sopenharmony_ci
209a46c0ec8Sopenharmony_ci	seat_name = libinput_seat_get_logical_name(seat);
210a46c0ec8Sopenharmony_ci	ck_assert_str_eq(seat_name, "default");
211a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
212a46c0ec8Sopenharmony_ci
213a46c0ec8Sopenharmony_ci	libinput_unref(li);
214a46c0ec8Sopenharmony_ci	udev_unref(udev);
215a46c0ec8Sopenharmony_ci
216a46c0ec8Sopenharmony_ci	litest_delete_device(dev);
217a46c0ec8Sopenharmony_ci}
218a46c0ec8Sopenharmony_ciEND_TEST
219a46c0ec8Sopenharmony_ci
220a46c0ec8Sopenharmony_ciSTART_TEST(udev_change_seat)
221a46c0ec8Sopenharmony_ci{
222a46c0ec8Sopenharmony_ci	struct libinput *li;
223a46c0ec8Sopenharmony_ci	struct udev *udev;
224a46c0ec8Sopenharmony_ci	struct libinput_event *event;
225a46c0ec8Sopenharmony_ci	struct libinput_device *device;
226a46c0ec8Sopenharmony_ci	struct libinput_seat *seat1, *seat2;
227a46c0ec8Sopenharmony_ci	const char *seat1_name;
228a46c0ec8Sopenharmony_ci	const char *seat2_name = "new seat";
229a46c0ec8Sopenharmony_ci	int rc;
230a46c0ec8Sopenharmony_ci	struct litest_device *dev;
231a46c0ec8Sopenharmony_ci
232a46c0ec8Sopenharmony_ci	udev = udev_new();
233a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
234a46c0ec8Sopenharmony_ci
235a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
236a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
237a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
238a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
239a46c0ec8Sopenharmony_ci
240a46c0ec8Sopenharmony_ci	/* Drop any events from other devices */
241a46c0ec8Sopenharmony_ci	litest_drain_events(li);
242a46c0ec8Sopenharmony_ci
243a46c0ec8Sopenharmony_ci	/* Now create our own device, it should be in the "default"
244a46c0ec8Sopenharmony_ci	 * logical seat. This test may fail if there is a local rule changing
245a46c0ec8Sopenharmony_ci	 * that, but it'll be fine for the 99% case. */
246a46c0ec8Sopenharmony_ci	dev = litest_create(LITEST_MOUSE, NULL, NULL, NULL, NULL);
247a46c0ec8Sopenharmony_ci	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_DEVICE_ADDED, -1);
248a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
249a46c0ec8Sopenharmony_ci	device = libinput_event_get_device(event);
250a46c0ec8Sopenharmony_ci	libinput_device_ref(device);
251a46c0ec8Sopenharmony_ci
252a46c0ec8Sopenharmony_ci	seat1 = libinput_device_get_seat(device);
253a46c0ec8Sopenharmony_ci	libinput_seat_ref(seat1);
254a46c0ec8Sopenharmony_ci
255a46c0ec8Sopenharmony_ci	seat1_name = libinput_seat_get_logical_name(seat1);
256a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
257a46c0ec8Sopenharmony_ci
258a46c0ec8Sopenharmony_ci	litest_drain_events(li);
259a46c0ec8Sopenharmony_ci
260a46c0ec8Sopenharmony_ci	/* Changing the logical seat name will remove and re-add the device */
261a46c0ec8Sopenharmony_ci	rc = libinput_device_set_seat_logical_name(device,
262a46c0ec8Sopenharmony_ci						   seat2_name);
263a46c0ec8Sopenharmony_ci	ck_assert_int_eq(rc, 0);
264a46c0ec8Sopenharmony_ci
265a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
266a46c0ec8Sopenharmony_ci
267a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
268a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_event_get_type(event),
269a46c0ec8Sopenharmony_ci			 LIBINPUT_EVENT_DEVICE_REMOVED);
270a46c0ec8Sopenharmony_ci
271a46c0ec8Sopenharmony_ci	ck_assert(libinput_event_get_device(event) == device);
272a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
273a46c0ec8Sopenharmony_ci
274a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
275a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_event_get_type(event),
276a46c0ec8Sopenharmony_ci			 LIBINPUT_EVENT_DEVICE_ADDED);
277a46c0ec8Sopenharmony_ci	ck_assert(libinput_event_get_device(event) != device);
278a46c0ec8Sopenharmony_ci	libinput_device_unref(device);
279a46c0ec8Sopenharmony_ci
280a46c0ec8Sopenharmony_ci	device = libinput_event_get_device(event);
281a46c0ec8Sopenharmony_ci	seat2 = libinput_device_get_seat(device);
282a46c0ec8Sopenharmony_ci
283a46c0ec8Sopenharmony_ci	ck_assert_str_ne(libinput_seat_get_logical_name(seat2),
284a46c0ec8Sopenharmony_ci			 seat1_name);
285a46c0ec8Sopenharmony_ci	ck_assert_str_eq(libinput_seat_get_logical_name(seat2),
286a46c0ec8Sopenharmony_ci			 seat2_name);
287a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
288a46c0ec8Sopenharmony_ci
289a46c0ec8Sopenharmony_ci	libinput_seat_unref(seat1);
290a46c0ec8Sopenharmony_ci
291a46c0ec8Sopenharmony_ci	libinput_unref(li);
292a46c0ec8Sopenharmony_ci	udev_unref(udev);
293a46c0ec8Sopenharmony_ci
294a46c0ec8Sopenharmony_ci	litest_delete_device(dev);
295a46c0ec8Sopenharmony_ci}
296a46c0ec8Sopenharmony_ciEND_TEST
297a46c0ec8Sopenharmony_ci
298a46c0ec8Sopenharmony_ciSTART_TEST(udev_double_suspend)
299a46c0ec8Sopenharmony_ci{
300a46c0ec8Sopenharmony_ci	struct libinput *li;
301a46c0ec8Sopenharmony_ci	struct libinput_event *event;
302a46c0ec8Sopenharmony_ci	struct udev *udev;
303a46c0ec8Sopenharmony_ci	int fd;
304a46c0ec8Sopenharmony_ci
305a46c0ec8Sopenharmony_ci	udev = udev_new();
306a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
307a46c0ec8Sopenharmony_ci
308a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
309a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
310a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
311a46c0ec8Sopenharmony_ci
312a46c0ec8Sopenharmony_ci	fd = libinput_get_fd(li);
313a46c0ec8Sopenharmony_ci	ck_assert_int_ge(fd, 0);
314a46c0ec8Sopenharmony_ci
315a46c0ec8Sopenharmony_ci	/* expect at least one event */
316a46c0ec8Sopenharmony_ci	ck_assert_int_ge(libinput_dispatch(li), 0);
317a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
318a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
319a46c0ec8Sopenharmony_ci
320a46c0ec8Sopenharmony_ci	libinput_suspend(li);
321a46c0ec8Sopenharmony_ci	libinput_suspend(li);
322a46c0ec8Sopenharmony_ci	libinput_resume(li);
323a46c0ec8Sopenharmony_ci
324a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
325a46c0ec8Sopenharmony_ci	libinput_unref(li);
326a46c0ec8Sopenharmony_ci	udev_unref(udev);
327a46c0ec8Sopenharmony_ci}
328a46c0ec8Sopenharmony_ciEND_TEST
329a46c0ec8Sopenharmony_ci
330a46c0ec8Sopenharmony_ciSTART_TEST(udev_double_resume)
331a46c0ec8Sopenharmony_ci{
332a46c0ec8Sopenharmony_ci	struct libinput *li;
333a46c0ec8Sopenharmony_ci	struct libinput_event *event;
334a46c0ec8Sopenharmony_ci	struct udev *udev;
335a46c0ec8Sopenharmony_ci	int fd;
336a46c0ec8Sopenharmony_ci
337a46c0ec8Sopenharmony_ci	udev = udev_new();
338a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
339a46c0ec8Sopenharmony_ci
340a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
341a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
342a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
343a46c0ec8Sopenharmony_ci
344a46c0ec8Sopenharmony_ci	fd = libinput_get_fd(li);
345a46c0ec8Sopenharmony_ci	ck_assert_int_ge(fd, 0);
346a46c0ec8Sopenharmony_ci
347a46c0ec8Sopenharmony_ci	/* expect at least one event */
348a46c0ec8Sopenharmony_ci	ck_assert_int_ge(libinput_dispatch(li), 0);
349a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
350a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
351a46c0ec8Sopenharmony_ci
352a46c0ec8Sopenharmony_ci	libinput_suspend(li);
353a46c0ec8Sopenharmony_ci	libinput_resume(li);
354a46c0ec8Sopenharmony_ci	libinput_resume(li);
355a46c0ec8Sopenharmony_ci
356a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
357a46c0ec8Sopenharmony_ci	libinput_unref(li);
358a46c0ec8Sopenharmony_ci	udev_unref(udev);
359a46c0ec8Sopenharmony_ci}
360a46c0ec8Sopenharmony_ciEND_TEST
361a46c0ec8Sopenharmony_ci
362a46c0ec8Sopenharmony_cistatic void
363a46c0ec8Sopenharmony_ciprocess_events_count_devices(struct libinput *li, int *device_count)
364a46c0ec8Sopenharmony_ci{
365a46c0ec8Sopenharmony_ci	struct libinput_event *event;
366a46c0ec8Sopenharmony_ci
367a46c0ec8Sopenharmony_ci	while ((event = libinput_get_event(li))) {
368a46c0ec8Sopenharmony_ci		switch (libinput_event_get_type(event)) {
369a46c0ec8Sopenharmony_ci		case LIBINPUT_EVENT_DEVICE_ADDED:
370a46c0ec8Sopenharmony_ci			(*device_count)++;
371a46c0ec8Sopenharmony_ci			break;
372a46c0ec8Sopenharmony_ci		case LIBINPUT_EVENT_DEVICE_REMOVED:
373a46c0ec8Sopenharmony_ci			(*device_count)--;
374a46c0ec8Sopenharmony_ci			break;
375a46c0ec8Sopenharmony_ci		default:
376a46c0ec8Sopenharmony_ci			break;
377a46c0ec8Sopenharmony_ci		}
378a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
379a46c0ec8Sopenharmony_ci	}
380a46c0ec8Sopenharmony_ci}
381a46c0ec8Sopenharmony_ci
382a46c0ec8Sopenharmony_ciSTART_TEST(udev_suspend_resume)
383a46c0ec8Sopenharmony_ci{
384a46c0ec8Sopenharmony_ci	struct libinput *li;
385a46c0ec8Sopenharmony_ci	struct udev *udev;
386a46c0ec8Sopenharmony_ci	int fd;
387a46c0ec8Sopenharmony_ci	int num_devices = 0;
388a46c0ec8Sopenharmony_ci
389a46c0ec8Sopenharmony_ci	udev = udev_new();
390a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
391a46c0ec8Sopenharmony_ci
392a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
393a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
394a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
395a46c0ec8Sopenharmony_ci
396a46c0ec8Sopenharmony_ci	fd = libinput_get_fd(li);
397a46c0ec8Sopenharmony_ci	ck_assert_int_ge(fd, 0);
398a46c0ec8Sopenharmony_ci
399a46c0ec8Sopenharmony_ci	/* Check that at least one device was discovered after creation. */
400a46c0ec8Sopenharmony_ci	ck_assert_int_ge(libinput_dispatch(li), 0);
401a46c0ec8Sopenharmony_ci	process_events_count_devices(li, &num_devices);
402a46c0ec8Sopenharmony_ci	ck_assert_int_gt(num_devices, 0);
403a46c0ec8Sopenharmony_ci
404a46c0ec8Sopenharmony_ci	/* Check that after a suspend, no devices are left. */
405a46c0ec8Sopenharmony_ci	libinput_suspend(li);
406a46c0ec8Sopenharmony_ci	ck_assert_int_ge(libinput_dispatch(li), 0);
407a46c0ec8Sopenharmony_ci	process_events_count_devices(li, &num_devices);
408a46c0ec8Sopenharmony_ci	ck_assert_int_eq(num_devices, 0);
409a46c0ec8Sopenharmony_ci
410a46c0ec8Sopenharmony_ci	/* Check that after a resume, at least one device is discovered. */
411a46c0ec8Sopenharmony_ci	libinput_resume(li);
412a46c0ec8Sopenharmony_ci	ck_assert_int_ge(libinput_dispatch(li), 0);
413a46c0ec8Sopenharmony_ci	process_events_count_devices(li, &num_devices);
414a46c0ec8Sopenharmony_ci	ck_assert_int_gt(num_devices, 0);
415a46c0ec8Sopenharmony_ci
416a46c0ec8Sopenharmony_ci	libinput_unref(li);
417a46c0ec8Sopenharmony_ci	udev_unref(udev);
418a46c0ec8Sopenharmony_ci}
419a46c0ec8Sopenharmony_ciEND_TEST
420a46c0ec8Sopenharmony_ci
421a46c0ec8Sopenharmony_ciSTART_TEST(udev_resume_before_seat)
422a46c0ec8Sopenharmony_ci{
423a46c0ec8Sopenharmony_ci	struct libinput *li;
424a46c0ec8Sopenharmony_ci	struct udev *udev;
425a46c0ec8Sopenharmony_ci	int rc;
426a46c0ec8Sopenharmony_ci
427a46c0ec8Sopenharmony_ci	udev = udev_new();
428a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
429a46c0ec8Sopenharmony_ci
430a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
431a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
432a46c0ec8Sopenharmony_ci
433a46c0ec8Sopenharmony_ci	rc = libinput_resume(li);
434a46c0ec8Sopenharmony_ci	ck_assert_int_eq(rc, 0);
435a46c0ec8Sopenharmony_ci
436a46c0ec8Sopenharmony_ci	libinput_unref(li);
437a46c0ec8Sopenharmony_ci	udev_unref(udev);
438a46c0ec8Sopenharmony_ci}
439a46c0ec8Sopenharmony_ciEND_TEST
440a46c0ec8Sopenharmony_ci
441a46c0ec8Sopenharmony_ciSTART_TEST(udev_suspend_resume_before_seat)
442a46c0ec8Sopenharmony_ci{
443a46c0ec8Sopenharmony_ci	struct libinput *li;
444a46c0ec8Sopenharmony_ci	struct udev *udev;
445a46c0ec8Sopenharmony_ci	int rc;
446a46c0ec8Sopenharmony_ci
447a46c0ec8Sopenharmony_ci	udev = udev_new();
448a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
449a46c0ec8Sopenharmony_ci
450a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
451a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
452a46c0ec8Sopenharmony_ci
453a46c0ec8Sopenharmony_ci	libinput_suspend(li);
454a46c0ec8Sopenharmony_ci	rc = libinput_resume(li);
455a46c0ec8Sopenharmony_ci	ck_assert_int_eq(rc, 0);
456a46c0ec8Sopenharmony_ci
457a46c0ec8Sopenharmony_ci	libinput_unref(li);
458a46c0ec8Sopenharmony_ci	udev_unref(udev);
459a46c0ec8Sopenharmony_ci}
460a46c0ec8Sopenharmony_ciEND_TEST
461a46c0ec8Sopenharmony_ci
462a46c0ec8Sopenharmony_ciSTART_TEST(udev_device_sysname)
463a46c0ec8Sopenharmony_ci{
464a46c0ec8Sopenharmony_ci	struct libinput *li;
465a46c0ec8Sopenharmony_ci	struct libinput_event *ev;
466a46c0ec8Sopenharmony_ci	struct libinput_device *device;
467a46c0ec8Sopenharmony_ci	const char *sysname;
468a46c0ec8Sopenharmony_ci	struct udev *udev;
469a46c0ec8Sopenharmony_ci
470a46c0ec8Sopenharmony_ci	udev = udev_new();
471a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
472a46c0ec8Sopenharmony_ci
473a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
474a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
475a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
476a46c0ec8Sopenharmony_ci
477a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
478a46c0ec8Sopenharmony_ci
479a46c0ec8Sopenharmony_ci	while ((ev = libinput_get_event(li))) {
480a46c0ec8Sopenharmony_ci		if (libinput_event_get_type(ev) !=
481a46c0ec8Sopenharmony_ci		    LIBINPUT_EVENT_DEVICE_ADDED) {
482a46c0ec8Sopenharmony_ci			libinput_event_destroy(ev);
483a46c0ec8Sopenharmony_ci			continue;
484a46c0ec8Sopenharmony_ci		}
485a46c0ec8Sopenharmony_ci
486a46c0ec8Sopenharmony_ci		device = libinput_event_get_device(ev);
487a46c0ec8Sopenharmony_ci		sysname = libinput_device_get_sysname(device);
488a46c0ec8Sopenharmony_ci		ck_assert_notnull(sysname);
489a46c0ec8Sopenharmony_ci		ck_assert_int_gt(strlen(sysname), 1);
490a46c0ec8Sopenharmony_ci		ck_assert(strchr(sysname, '/') == NULL);
491a46c0ec8Sopenharmony_ci		ck_assert(strneq(sysname, "event", 5));
492a46c0ec8Sopenharmony_ci		libinput_event_destroy(ev);
493a46c0ec8Sopenharmony_ci	}
494a46c0ec8Sopenharmony_ci
495a46c0ec8Sopenharmony_ci	libinput_unref(li);
496a46c0ec8Sopenharmony_ci	udev_unref(udev);
497a46c0ec8Sopenharmony_ci}
498a46c0ec8Sopenharmony_ciEND_TEST
499a46c0ec8Sopenharmony_ci
500a46c0ec8Sopenharmony_ciSTART_TEST(udev_seat_recycle)
501a46c0ec8Sopenharmony_ci{
502a46c0ec8Sopenharmony_ci	struct udev *udev;
503a46c0ec8Sopenharmony_ci	struct libinput *li;
504a46c0ec8Sopenharmony_ci	struct libinput_event *ev;
505a46c0ec8Sopenharmony_ci	struct libinput_device *device;
506a46c0ec8Sopenharmony_ci	struct libinput_seat *saved_seat = NULL;
507a46c0ec8Sopenharmony_ci	struct libinput_seat *seat;
508a46c0ec8Sopenharmony_ci	int data = 0;
509a46c0ec8Sopenharmony_ci	int found = 0;
510a46c0ec8Sopenharmony_ci	void *user_data;
511a46c0ec8Sopenharmony_ci
512a46c0ec8Sopenharmony_ci	udev = udev_new();
513a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
514a46c0ec8Sopenharmony_ci
515a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
516a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
517a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
518a46c0ec8Sopenharmony_ci
519a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
520a46c0ec8Sopenharmony_ci	while ((ev = libinput_get_event(li))) {
521a46c0ec8Sopenharmony_ci		switch (libinput_event_get_type(ev)) {
522a46c0ec8Sopenharmony_ci		case LIBINPUT_EVENT_DEVICE_ADDED:
523a46c0ec8Sopenharmony_ci			if (saved_seat)
524a46c0ec8Sopenharmony_ci				break;
525a46c0ec8Sopenharmony_ci
526a46c0ec8Sopenharmony_ci			device = libinput_event_get_device(ev);
527a46c0ec8Sopenharmony_ci			ck_assert_notnull(device);
528a46c0ec8Sopenharmony_ci			saved_seat = libinput_device_get_seat(device);
529a46c0ec8Sopenharmony_ci			libinput_seat_set_user_data(saved_seat, &data);
530a46c0ec8Sopenharmony_ci			libinput_seat_ref(saved_seat);
531a46c0ec8Sopenharmony_ci			break;
532a46c0ec8Sopenharmony_ci		default:
533a46c0ec8Sopenharmony_ci			break;
534a46c0ec8Sopenharmony_ci		}
535a46c0ec8Sopenharmony_ci
536a46c0ec8Sopenharmony_ci		libinput_event_destroy(ev);
537a46c0ec8Sopenharmony_ci	}
538a46c0ec8Sopenharmony_ci
539a46c0ec8Sopenharmony_ci	ck_assert_notnull(saved_seat);
540a46c0ec8Sopenharmony_ci
541a46c0ec8Sopenharmony_ci	libinput_suspend(li);
542a46c0ec8Sopenharmony_ci
543a46c0ec8Sopenharmony_ci	litest_drain_events(li);
544a46c0ec8Sopenharmony_ci
545a46c0ec8Sopenharmony_ci	libinput_resume(li);
546a46c0ec8Sopenharmony_ci
547a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
548a46c0ec8Sopenharmony_ci	while ((ev = libinput_get_event(li))) {
549a46c0ec8Sopenharmony_ci		switch (libinput_event_get_type(ev)) {
550a46c0ec8Sopenharmony_ci		case LIBINPUT_EVENT_DEVICE_ADDED:
551a46c0ec8Sopenharmony_ci			device = libinput_event_get_device(ev);
552a46c0ec8Sopenharmony_ci			ck_assert_notnull(device);
553a46c0ec8Sopenharmony_ci
554a46c0ec8Sopenharmony_ci			seat = libinput_device_get_seat(device);
555a46c0ec8Sopenharmony_ci			user_data = libinput_seat_get_user_data(seat);
556a46c0ec8Sopenharmony_ci			if (user_data == &data) {
557a46c0ec8Sopenharmony_ci				found = 1;
558a46c0ec8Sopenharmony_ci				ck_assert(seat == saved_seat);
559a46c0ec8Sopenharmony_ci			}
560a46c0ec8Sopenharmony_ci			break;
561a46c0ec8Sopenharmony_ci		default:
562a46c0ec8Sopenharmony_ci			break;
563a46c0ec8Sopenharmony_ci		}
564a46c0ec8Sopenharmony_ci
565a46c0ec8Sopenharmony_ci		libinput_event_destroy(ev);
566a46c0ec8Sopenharmony_ci	}
567a46c0ec8Sopenharmony_ci
568a46c0ec8Sopenharmony_ci	ck_assert(found == 1);
569a46c0ec8Sopenharmony_ci
570a46c0ec8Sopenharmony_ci	libinput_unref(li);
571a46c0ec8Sopenharmony_ci	udev_unref(udev);
572a46c0ec8Sopenharmony_ci}
573a46c0ec8Sopenharmony_ciEND_TEST
574a46c0ec8Sopenharmony_ci
575a46c0ec8Sopenharmony_ciSTART_TEST(udev_path_add_device)
576a46c0ec8Sopenharmony_ci{
577a46c0ec8Sopenharmony_ci	struct udev *udev;
578a46c0ec8Sopenharmony_ci	struct libinput *li;
579a46c0ec8Sopenharmony_ci	struct libinput_device *device;
580a46c0ec8Sopenharmony_ci
581a46c0ec8Sopenharmony_ci	udev = udev_new();
582a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
583a46c0ec8Sopenharmony_ci
584a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
585a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
586a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
587a46c0ec8Sopenharmony_ci
588a46c0ec8Sopenharmony_ci	litest_set_log_handler_bug(li);
589a46c0ec8Sopenharmony_ci	device = libinput_path_add_device(li, "/dev/input/event0");
590a46c0ec8Sopenharmony_ci	ck_assert(device == NULL);
591a46c0ec8Sopenharmony_ci	litest_restore_log_handler(li);
592a46c0ec8Sopenharmony_ci
593a46c0ec8Sopenharmony_ci	libinput_unref(li);
594a46c0ec8Sopenharmony_ci	udev_unref(udev);
595a46c0ec8Sopenharmony_ci}
596a46c0ec8Sopenharmony_ciEND_TEST
597a46c0ec8Sopenharmony_ci
598a46c0ec8Sopenharmony_ciSTART_TEST(udev_path_remove_device)
599a46c0ec8Sopenharmony_ci{
600a46c0ec8Sopenharmony_ci	struct udev *udev;
601a46c0ec8Sopenharmony_ci	struct libinput *li;
602a46c0ec8Sopenharmony_ci	struct libinput_device *device;
603a46c0ec8Sopenharmony_ci	struct libinput_event *event;
604a46c0ec8Sopenharmony_ci
605a46c0ec8Sopenharmony_ci	udev = udev_new();
606a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
607a46c0ec8Sopenharmony_ci
608a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
609a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
610a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
611a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
612a46c0ec8Sopenharmony_ci
613a46c0ec8Sopenharmony_ci	litest_wait_for_event_of_type(li, LIBINPUT_EVENT_DEVICE_ADDED, -1);
614a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
615a46c0ec8Sopenharmony_ci	device = libinput_event_get_device(event);
616a46c0ec8Sopenharmony_ci	ck_assert_notnull(device);
617a46c0ec8Sopenharmony_ci
618a46c0ec8Sopenharmony_ci	/* no effect bug a bug log msg */
619a46c0ec8Sopenharmony_ci	litest_set_log_handler_bug(li);
620a46c0ec8Sopenharmony_ci	libinput_path_remove_device(device);
621a46c0ec8Sopenharmony_ci	litest_restore_log_handler(li);
622a46c0ec8Sopenharmony_ci
623a46c0ec8Sopenharmony_ci	libinput_event_destroy(event);
624a46c0ec8Sopenharmony_ci	libinput_unref(li);
625a46c0ec8Sopenharmony_ci	udev_unref(udev);
626a46c0ec8Sopenharmony_ci}
627a46c0ec8Sopenharmony_ciEND_TEST
628a46c0ec8Sopenharmony_ci
629a46c0ec8Sopenharmony_ciSTART_TEST(udev_ignore_device)
630a46c0ec8Sopenharmony_ci{
631a46c0ec8Sopenharmony_ci	struct udev *udev;
632a46c0ec8Sopenharmony_ci	struct libinput *li;
633a46c0ec8Sopenharmony_ci	struct libinput_device *device;
634a46c0ec8Sopenharmony_ci	struct libinput_event *event;
635a46c0ec8Sopenharmony_ci	struct litest_device *dev;
636a46c0ec8Sopenharmony_ci	const char *devname;
637a46c0ec8Sopenharmony_ci
638a46c0ec8Sopenharmony_ci	dev = litest_create(LITEST_IGNORED_MOUSE, NULL, NULL, NULL, NULL);
639a46c0ec8Sopenharmony_ci	devname = libevdev_get_name(dev->evdev);
640a46c0ec8Sopenharmony_ci
641a46c0ec8Sopenharmony_ci	udev = udev_new();
642a46c0ec8Sopenharmony_ci	ck_assert_notnull(udev);
643a46c0ec8Sopenharmony_ci
644a46c0ec8Sopenharmony_ci	li = libinput_udev_create_context(&simple_interface, NULL, udev);
645a46c0ec8Sopenharmony_ci	ck_assert_notnull(li);
646a46c0ec8Sopenharmony_ci	litest_restore_log_handler(li);
647a46c0ec8Sopenharmony_ci
648a46c0ec8Sopenharmony_ci	ck_assert_int_eq(libinput_udev_assign_seat(li, "seat0"), 0);
649a46c0ec8Sopenharmony_ci	libinput_dispatch(li);
650a46c0ec8Sopenharmony_ci
651a46c0ec8Sopenharmony_ci	event = libinput_get_event(li);
652a46c0ec8Sopenharmony_ci	ck_assert_notnull(event);
653a46c0ec8Sopenharmony_ci	while (event) {
654a46c0ec8Sopenharmony_ci		if (libinput_event_get_type(event) ==
655a46c0ec8Sopenharmony_ci		    LIBINPUT_EVENT_DEVICE_ADDED) {
656a46c0ec8Sopenharmony_ci			const char *name;
657a46c0ec8Sopenharmony_ci
658a46c0ec8Sopenharmony_ci			device = libinput_event_get_device(event);
659a46c0ec8Sopenharmony_ci			name = libinput_device_get_name(device);
660a46c0ec8Sopenharmony_ci			ck_assert_str_ne(devname, name);
661a46c0ec8Sopenharmony_ci		}
662a46c0ec8Sopenharmony_ci		libinput_event_destroy(event);
663a46c0ec8Sopenharmony_ci		libinput_dispatch(li);
664a46c0ec8Sopenharmony_ci		event = libinput_get_event(li);
665a46c0ec8Sopenharmony_ci	}
666a46c0ec8Sopenharmony_ci
667a46c0ec8Sopenharmony_ci	libinput_unref(li);
668a46c0ec8Sopenharmony_ci	udev_unref(udev);
669a46c0ec8Sopenharmony_ci
670a46c0ec8Sopenharmony_ci	litest_delete_device(dev);
671a46c0ec8Sopenharmony_ci}
672a46c0ec8Sopenharmony_ciEND_TEST
673a46c0ec8Sopenharmony_ci
674a46c0ec8Sopenharmony_ciTEST_COLLECTION(udev)
675a46c0ec8Sopenharmony_ci{
676a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_create_NULL);
677a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_create_seat0);
678a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_create_empty_seat);
679a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_create_seat_too_long);
680a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_set_user_data);
681a46c0ec8Sopenharmony_ci
682a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_added_seat_default);
683a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_change_seat);
684a46c0ec8Sopenharmony_ci
685a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_double_suspend, LITEST_SYNAPTICS_CLICKPAD_X220);
686a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_double_resume, LITEST_SYNAPTICS_CLICKPAD_X220);
687a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_suspend_resume, LITEST_SYNAPTICS_CLICKPAD_X220);
688a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_resume_before_seat, LITEST_SYNAPTICS_CLICKPAD_X220);
689a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_suspend_resume_before_seat, LITEST_SYNAPTICS_CLICKPAD_X220);
690a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_device_sysname, LITEST_SYNAPTICS_CLICKPAD_X220);
691a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_seat_recycle, LITEST_SYNAPTICS_CLICKPAD_X220);
692a46c0ec8Sopenharmony_ci
693a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_path_add_device);
694a46c0ec8Sopenharmony_ci	litest_add_for_device(udev_path_remove_device, LITEST_SYNAPTICS_CLICKPAD_X220);
695a46c0ec8Sopenharmony_ci
696a46c0ec8Sopenharmony_ci	litest_add_no_device(udev_ignore_device);
697a46c0ec8Sopenharmony_ci}
698