Hi, On 09/03/2014 04:03 AM, Peter Hutterer wrote: > Signed-off-by: Peter Hutterer <[email protected]>
Looks good: Reviewed-by: Hans de Goede <[email protected]> Regards, Hans > --- > test/Makefile.am | 7 +- > test/device.c | 275 > +++++++++++++++++++++++++++++++++++++++++++++++++++++++ > 2 files changed, 281 insertions(+), 1 deletion(-) > create mode 100644 test/device.c > > diff --git a/test/Makefile.am b/test/Makefile.am > index 56ed9d1..86859d8 100644 > --- a/test/Makefile.am > +++ b/test/Makefile.am > @@ -35,7 +35,8 @@ run_tests = \ > test-log \ > test-touchpad \ > test-misc \ > - test-keyboard > + test-keyboard \ > + test-device > build_tests = \ > test-build-cxx \ > test-build-linker \ > @@ -79,6 +80,10 @@ test_keyboard_SOURCES = keyboard.c > test_keyboard_LDADD = $(TEST_LIBS) > test_keyboard_LDFLAGS = -no-install > > +test_device_SOURCES = device.c > +test_device_LDADD = $(TEST_LIBS) > +test_device_LDFLAGS = -no-install > + > # build-test only > test_build_pedantic_c99_SOURCES = build-pedantic.c > test_build_pedantic_c99_CFLAGS = -std=c99 -pedantic -Werror > diff --git a/test/device.c b/test/device.c > new file mode 100644 > index 0000000..1294740 > --- /dev/null > +++ b/test/device.c > @@ -0,0 +1,275 @@ > +/* > + * Copyright © 2014 Red Hat, Inc. > + * > + * Permission to use, copy, modify, distribute, and sell this software and > + * its documentation for any purpose is hereby granted without fee, provided > + * that the above copyright notice appear in all copies and that both that > + * copyright notice and this permission notice appear in supporting > + * documentation, and that the name of the copyright holders not be used in > + * advertising or publicity pertaining to distribution of the software > + * without specific, written prior permission. The copyright holders make > + * no representations about the suitability of this software for any > + * purpose. It is provided "as is" without express or implied warranty. > + * > + * THE COPYRIGHT HOLDERS DISCLAIM ALL WARRANTIES WITH REGARD TO THIS > + * SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND > + * FITNESS, IN NO EVENT SHALL THE COPYRIGHT HOLDERS BE LIABLE FOR ANY > + * SPECIAL, INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER > + * RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF > + * CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN > + * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. > + */ > + > +#include <config.h> > + > +#include <check.h> > +#include <errno.h> > +#include <fcntl.h> > +#include <libinput.h> > +#include <libudev.h> > +#include <unistd.h> > + > +#include "litest.h" > + > +START_TEST(device_sendevents_config) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput_device *device; > + uint32_t modes; > + > + device = dev->libinput_device; > + > + modes = libinput_device_config_send_events_get_modes(device); > + ck_assert_int_eq(modes, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED| > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > +} > +END_TEST > + > +START_TEST(device_sendevents_config_default) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput_device *device; > + uint32_t mode; > + > + device = dev->libinput_device; > + > + mode = libinput_device_config_send_events_get_mode(device); > + ck_assert_int_eq(mode, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + > + mode = libinput_device_config_send_events_get_default_mode(device); > + ck_assert_int_eq(mode, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > +} > +END_TEST > + > +START_TEST(device_disable) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput *li = dev->libinput; > + struct libinput_device *device; > + enum libinput_config_status status; > + > + device = dev->libinput_device; > + > + litest_drain_events(li); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + /* no event from disabling */ > + litest_assert_empty_queue(li); > + > + /* no event from disabled device */ > + litest_event(dev, EV_REL, REL_X, 10); > + litest_event(dev, EV_SYN, SYN_REPORT, 0); > + litest_assert_empty_queue(li); > + > + /* no event from resuming */ > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + litest_assert_empty_queue(li); > +} > +END_TEST > + > +START_TEST(device_disable_events_pending) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput *li = dev->libinput; > + struct libinput_device *device; > + enum libinput_config_status status; > + struct libinput_event *event; > + int i; > + > + device = dev->libinput_device; > + > + litest_drain_events(li); > + > + /* put a couple of events in the queue, enough to > + feed the ptraccel trackers */ > + for (i = 0; i < 10; i++) { > + litest_event(dev, EV_REL, REL_X, 10); > + litest_event(dev, EV_SYN, SYN_REPORT, 0); > + } > + libinput_dispatch(li); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + /* expect above events */ > + litest_wait_for_event(li); > + while ((event = libinput_get_event(li)) != NULL) { > + ck_assert_int_eq(libinput_event_get_type(event), > + LIBINPUT_EVENT_POINTER_MOTION); > + libinput_event_destroy(event); > + } > +} > +END_TEST > + > +START_TEST(device_double_disable) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput *li = dev->libinput; > + struct libinput_device *device; > + enum libinput_config_status status; > + > + device = dev->libinput_device; > + > + litest_drain_events(li); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + litest_assert_empty_queue(li); > +} > +END_TEST > + > +START_TEST(device_double_enable) > +{ > + struct litest_device *dev = litest_current_device(); > + struct libinput *li = dev->libinput; > + struct libinput_device *device; > + enum libinput_config_status status; > + > + device = dev->libinput_device; > + > + litest_drain_events(li); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + litest_assert_empty_queue(li); > +} > +END_TEST > + > +START_TEST(device_reenable_syspath_changed) > +{ > + struct libinput *li; > + struct litest_device *litest_device; > + struct libinput_device *device1, *device2; > + enum libinput_config_status status; > + struct libinput_event *event; > + > + li = litest_create_context(); > + litest_device = litest_add_device(li, LITEST_MOUSE); > + device1 = litest_device->libinput_device; > + > + libinput_device_ref(device1); > + status = libinput_device_config_send_events_set_mode(device1, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + litest_drain_events(li); > + > + litest_delete_device(litest_device); > + litest_drain_events(li); > + > + litest_device = litest_add_device(li, LITEST_MOUSE); > + device2 = litest_device->libinput_device; > + ck_assert_str_eq(libinput_device_get_sysname(device1), > + libinput_device_get_sysname(device2)); > + > + status = libinput_device_config_send_events_set_mode(device1, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + /* can't really check for much here, other than that if we pump > + events through libinput, none of them should be from the first > + device */ > + litest_event(litest_device, EV_REL, REL_X, 1); > + litest_event(litest_device, EV_REL, REL_Y, 1); > + litest_event(litest_device, EV_SYN, SYN_REPORT, 0); > + > + libinput_dispatch(li); > + while ((event = libinput_get_event(li))) { > + ck_assert(libinput_event_get_device(event) != device1); > + libinput_event_destroy(event); > + } > + > + litest_delete_device(litest_device); > + libinput_device_unref(device1); > + libinput_unref(li); > +} > +END_TEST > + > +START_TEST(device_reenable_device_removed) > +{ > + struct libinput *li; > + struct litest_device *litest_device; > + struct libinput_device *device; > + enum libinput_config_status status; > + > + li = litest_create_context(); > + litest_device = litest_add_device(li, LITEST_MOUSE); > + device = litest_device->libinput_device; > + > + libinput_device_ref(device); > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_DISABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + litest_drain_events(li); > + > + litest_delete_device(litest_device); > + litest_drain_events(li); > + > + status = libinput_device_config_send_events_set_mode(device, > + LIBINPUT_CONFIG_SEND_EVENTS_ENABLED); > + ck_assert_int_eq(status, LIBINPUT_CONFIG_STATUS_SUCCESS); > + > + /* can't really check for much here, this really just exercises the > + code path. */ > + litest_assert_empty_queue(li); > + > + libinput_device_unref(device); > + libinput_unref(li); > +} > +END_TEST > + > +int main (int argc, char **argv) > +{ > + litest_add("device:sendevents", device_sendevents_config, LITEST_ANY, > LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_sendevents_config_default, > LITEST_ANY, LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_disable, LITEST_POINTER, > LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_disable_events_pending, > LITEST_POINTER, LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_double_disable, LITEST_ANY, > LITEST_TOUCHPAD); > + litest_add("device:sendevents", device_double_enable, LITEST_ANY, > LITEST_TOUCHPAD); > + litest_add_no_device("device:sendevents", > device_reenable_syspath_changed); > + litest_add_no_device("device:sendevents", > device_reenable_device_removed); > + > + return litest_run(argc, argv); > +} > _______________________________________________ wayland-devel mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/wayland-devel
