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