Blame test/test-uinput.c

Packit Service b8eee4
/*
Packit Service b8eee4
 * Copyright © 2013 Red Hat, Inc.
Packit Service b8eee4
 *
Packit Service b8eee4
 * Permission to use, copy, modify, distribute, and sell this software and its
Packit Service b8eee4
 * documentation for any purpose is hereby granted without fee, provided that
Packit Service b8eee4
 * the above copyright notice appear in all copies and that both that copyright
Packit Service b8eee4
 * notice and this permission notice appear in supporting documentation, and
Packit Service b8eee4
 * that the name of the copyright holders not be used in advertising or
Packit Service b8eee4
 * publicity pertaining to distribution of the software without specific,
Packit Service b8eee4
 * written prior permission.  The copyright holders make no representations
Packit Service b8eee4
 * about the suitability of this software for any purpose.  It is provided "as
Packit Service b8eee4
 * is" without express or implied warranty.
Packit Service b8eee4
 *
Packit Service b8eee4
 * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS SOFTWARE,
Packit Service b8eee4
 * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS, IN NO
Packit Service b8eee4
 * EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY SPECIAL, INDIRECT OR
Packit Service b8eee4
 * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE,
Packit Service b8eee4
 * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER
Packit Service b8eee4
 * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE
Packit Service b8eee4
 * OF THIS SOFTWARE.
Packit Service b8eee4
 */
Packit Service b8eee4
Packit Service b8eee4
#include <config.h>
Packit Service b8eee4
#include <linux/input.h>
Packit Service b8eee4
#include <errno.h>
Packit Service b8eee4
#include <unistd.h>
Packit Service b8eee4
#include <stdlib.h>
Packit Service b8eee4
#include <fcntl.h>
Packit Service b8eee4
#include <libevdev/libevdev-uinput.h>
Packit Service b8eee4
Packit Service b8eee4
#include "test-common.h"
Packit Service b8eee4
#define UINPUT_NODE "/dev/uinput"
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_create_device)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev, *dev2;
Packit Service b8eee4
	struct libevdev_uinput *uidev;
Packit Service b8eee4
	int fd, uinput_fd;
Packit Service b8eee4
	unsigned int type, code;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
	const char *devnode;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_MAX, NULL);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
	ck_assert(uidev != NULL);
Packit Service b8eee4
Packit Service b8eee4
	uinput_fd = libevdev_uinput_get_fd(uidev);
Packit Service b8eee4
	ck_assert_int_gt(uinput_fd, -1);
Packit Service b8eee4
Packit Service b8eee4
	devnode = libevdev_uinput_get_devnode(uidev);
Packit Service b8eee4
	ck_assert(devnode != NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(devnode, O_RDONLY);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
	rc = libevdev_new_from_fd(fd, &dev2);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	for (type = 0; type < EV_CNT; type++) {
Packit Service b8eee4
		int max = libevdev_event_type_get_max(type);
Packit Service b8eee4
		if (max == -1)
Packit Service b8eee4
			continue;
Packit Service b8eee4
Packit Service b8eee4
		for (code = 0; code < max; code++) {
Packit Service b8eee4
			ck_assert_int_eq(libevdev_has_event_code(dev, type, code),
Packit Service b8eee4
					 libevdev_has_event_code(dev2, type, code));
Packit Service b8eee4
		}
Packit Service b8eee4
	}
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_free(dev2);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
Packit Service b8eee4
	/* uinput fd is managed, so make sure it did get closed */
Packit Service b8eee4
	ck_assert_int_eq(close(uinput_fd), -1);
Packit Service b8eee4
	ck_assert_int_eq(errno, EBADF);
Packit Service b8eee4
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_create_device_invalid)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev;
Packit Service b8eee4
	struct libevdev_uinput *uidev = NULL;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
Packit Service b8eee4
	libevdev_set_log_function(test_logfunc_ignore_error, NULL);
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, -1, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, -EBADF);
Packit Service b8eee4
	ck_assert(uidev == NULL);
Packit Service b8eee4
	libevdev_set_log_function(test_logfunc_abort_on_error, NULL);
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_create_device_from_fd)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev, *dev2;
Packit Service b8eee4
	struct libevdev_uinput *uidev;
Packit Service b8eee4
	int fd, fd2;
Packit Service b8eee4
	unsigned int type, code;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
	const char *devnode;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
	ck_assert(uidev != NULL);
Packit Service b8eee4
Packit Service b8eee4
	ck_assert_int_eq(libevdev_uinput_get_fd(uidev), fd);
Packit Service b8eee4
Packit Service b8eee4
	devnode = libevdev_uinput_get_devnode(uidev);
Packit Service b8eee4
	ck_assert(devnode != NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd2 = open(devnode, O_RDONLY);
Packit Service b8eee4
	ck_assert_int_gt(fd2, -1);
Packit Service b8eee4
	rc = libevdev_new_from_fd(fd2, &dev2);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	for (type = 0; type < EV_CNT; type++) {
Packit Service b8eee4
		int max = libevdev_event_type_get_max(type);
Packit Service b8eee4
		if (max == -1)
Packit Service b8eee4
			continue;
Packit Service b8eee4
Packit Service b8eee4
		for (code = 0; code < max; code++) {
Packit Service b8eee4
			ck_assert_int_eq(libevdev_has_event_code(dev, type, code),
Packit Service b8eee4
					 libevdev_has_event_code(dev2, type, code));
Packit Service b8eee4
		}
Packit Service b8eee4
	}
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_free(dev2);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
	close(fd2);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_check_syspath_time)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev;
Packit Service b8eee4
	struct libevdev_uinput *uidev, *uidev2;
Packit Service b8eee4
	const char *syspath, *syspath2;
Packit Service b8eee4
	int fd, fd2;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
	fd2 = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd2, -1);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	/* sleep for 1.5 seconds. sysfs resolution is 1 second, so
Packit Service b8eee4
	   creating both devices without delay means
Packit Service b8eee4
	   libevdev_uinput_get_syspath can't actually differ between
Packit Service b8eee4
	   them. By waiting, we get different ctime for uidev and uidev2,
Packit Service b8eee4
	   and exercise that part of the code.
Packit Service b8eee4
	 */
Packit Service b8eee4
	usleep(1500000);
Packit Service b8eee4
Packit Service b8eee4
	/* create a second one to test the syspath time filtering code */
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd2, &uidev2);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	syspath = libevdev_uinput_get_syspath(uidev);
Packit Service b8eee4
	ck_assert(syspath != NULL);
Packit Service b8eee4
Packit Service b8eee4
	/* get syspath twice returns same pointer */
Packit Service b8eee4
	syspath2 = libevdev_uinput_get_syspath(uidev);
Packit Service b8eee4
	ck_assert(syspath == syspath2);
Packit Service b8eee4
Packit Service b8eee4
	/* second dev has different syspath */
Packit Service b8eee4
	syspath2 = libevdev_uinput_get_syspath(uidev2);
Packit Service b8eee4
	ck_assert(strcmp(syspath, syspath2) != 0);
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev2);
Packit Service b8eee4
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
	close(fd2);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_check_syspath_name)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev;
Packit Service b8eee4
	struct libevdev_uinput *uidev, *uidev2;
Packit Service b8eee4
	const char *syspath, *syspath2;
Packit Service b8eee4
	int fd, fd2;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
	fd2 = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd2, -1);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	/* create a second one to stress the syspath filtering code */
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME " 2");
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd2, &uidev2);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	syspath = libevdev_uinput_get_syspath(uidev);
Packit Service b8eee4
	ck_assert(syspath != NULL);
Packit Service b8eee4
Packit Service b8eee4
	/* get syspath twice returns same pointer */
Packit Service b8eee4
	syspath2 = libevdev_uinput_get_syspath(uidev);
Packit Service b8eee4
	ck_assert(syspath == syspath2);
Packit Service b8eee4
Packit Service b8eee4
	/* second dev has different syspath */
Packit Service b8eee4
	syspath2 = libevdev_uinput_get_syspath(uidev2);
Packit Service b8eee4
	ck_assert(strcmp(syspath, syspath2) != 0);
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev2);
Packit Service b8eee4
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
	close(fd2);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_events)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev;
Packit Service b8eee4
	struct libevdev_uinput *uidev;
Packit Service b8eee4
	int fd, fd2;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
	const char *devnode;
Packit Service b8eee4
	int i;
Packit Service b8eee4
	const int nevents = 5;
Packit Service b8eee4
	struct input_event events[] = { {{0, 0}, EV_REL, REL_X, 1},
Packit Service b8eee4
					{{0, 0}, EV_REL, REL_Y, -1},
Packit Service b8eee4
					{{0, 0}, EV_SYN, SYN_REPORT, 0},
Packit Service b8eee4
					{{0, 0}, EV_KEY, BTN_LEFT, 1},
Packit Service b8eee4
					{{0, 0}, EV_SYN, SYN_REPORT, 0}};
Packit Service b8eee4
	struct input_event events_read[nevents];
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_KEY);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_KEY, BTN_LEFT, NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(UINPUT_NODE, O_RDWR);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, fd, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
	ck_assert(uidev != NULL);
Packit Service b8eee4
Packit Service b8eee4
	devnode = libevdev_uinput_get_devnode(uidev);
Packit Service b8eee4
	ck_assert(devnode != NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd2 = open(devnode, O_RDONLY);
Packit Service b8eee4
Packit Service b8eee4
	for (i = 0; i < nevents; i++)
Packit Service b8eee4
		libevdev_uinput_write_event(uidev, events[i].type, events[i].code, events[i].value);
Packit Service b8eee4
Packit Service b8eee4
	rc = read(fd2, events_read, sizeof(events_read));
Packit Service b8eee4
	ck_assert_int_eq(rc, sizeof(events_read));
Packit Service b8eee4
Packit Service b8eee4
	for (i = 0; i < nevents; i++) {
Packit Service b8eee4
		ck_assert_int_eq(events[i].type, events_read[i].type);
Packit Service b8eee4
		ck_assert_int_eq(events[i].code, events_read[i].code);
Packit Service b8eee4
		ck_assert_int_eq(events[i].value, events_read[i].value);
Packit Service b8eee4
	}
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
	close(fd2);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
START_TEST(test_uinput_properties)
Packit Service b8eee4
{
Packit Service b8eee4
	struct libevdev *dev, *dev2;
Packit Service b8eee4
	struct libevdev_uinput *uidev;
Packit Service b8eee4
	int fd;
Packit Service b8eee4
	int rc;
Packit Service b8eee4
	const char *devnode;
Packit Service b8eee4
Packit Service b8eee4
	dev = libevdev_new();
Packit Service b8eee4
	ck_assert(dev != NULL);
Packit Service b8eee4
	libevdev_set_name(dev, TEST_DEVICE_NAME);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_SYN);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_REL);
Packit Service b8eee4
	libevdev_enable_event_type(dev, EV_KEY);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_X, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_REL, REL_Y, NULL);
Packit Service b8eee4
	libevdev_enable_event_code(dev, EV_KEY, BTN_LEFT, NULL);
Packit Service b8eee4
	libevdev_enable_property(dev, INPUT_PROP_BUTTONPAD);
Packit Service b8eee4
	libevdev_enable_property(dev, INPUT_PROP_MAX);
Packit Service b8eee4
Packit Service b8eee4
	rc = libevdev_uinput_create_from_device(dev, LIBEVDEV_UINPUT_OPEN_MANAGED, &uidev);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
	ck_assert(uidev != NULL);
Packit Service b8eee4
Packit Service b8eee4
	devnode = libevdev_uinput_get_devnode(uidev);
Packit Service b8eee4
	ck_assert(devnode != NULL);
Packit Service b8eee4
Packit Service b8eee4
	fd = open(devnode, O_RDONLY);
Packit Service b8eee4
	ck_assert_int_gt(fd, -1);
Packit Service b8eee4
	rc = libevdev_new_from_fd(fd, &dev2);
Packit Service b8eee4
	ck_assert_int_eq(rc, 0);
Packit Service b8eee4
Packit Service b8eee4
	ck_assert(libevdev_has_property(dev2, INPUT_PROP_BUTTONPAD));
Packit Service b8eee4
	ck_assert(libevdev_has_property(dev2, INPUT_PROP_MAX));
Packit Service b8eee4
Packit Service b8eee4
	libevdev_free(dev);
Packit Service b8eee4
	libevdev_free(dev2);
Packit Service b8eee4
	libevdev_uinput_destroy(uidev);
Packit Service b8eee4
	close(fd);
Packit Service b8eee4
}
Packit Service b8eee4
END_TEST
Packit Service b8eee4
Packit Service b8eee4
TEST_SUITE_ROOT_PRIVILEGES(uinput_suite)
Packit Service b8eee4
{
Packit Service b8eee4
	Suite *s = suite_create("libevdev uinput device tests");
Packit Service b8eee4
Packit Service b8eee4
	TCase *tc = tcase_create("device creation");
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_create_device);
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_create_device_invalid);
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_create_device_from_fd);
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_check_syspath_time);
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_check_syspath_name);
Packit Service b8eee4
	suite_add_tcase(s, tc);
Packit Service b8eee4
Packit Service b8eee4
	tc = tcase_create("device events");
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_events);
Packit Service b8eee4
	suite_add_tcase(s, tc);
Packit Service b8eee4
Packit Service b8eee4
	tc = tcase_create("device properties");
Packit Service b8eee4
	tcase_add_test(tc, test_uinput_properties);
Packit Service b8eee4
	suite_add_tcase(s, tc);
Packit Service b8eee4
Packit Service b8eee4
	return s;
Packit Service b8eee4
}