diff options
author | Peter Hutterer <peter.hutterer@who-t.net> | 2012-10-12 12:37:02 +1000 |
---|---|---|
committer | Peter Hutterer <peter.hutterer@who-t.net> | 2012-10-16 14:09:20 +1000 |
commit | 3053e8d8e09971c70c16735f9d43fa248cd9901d (patch) | |
tree | 9af63a33a2e6c547de4a1f7066657d13a50ddf4f /test | |
parent | 12538b834956ad7f570736b0b5af40e2413ed697 (diff) |
xserver: set the hierarchy mask before WaitForDevice
Don't rely on the caller to set up the mask correctly, modify its current
mask to include the hierarchy mask and then un-do that modification (if
needed)
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
Diffstat (limited to 'test')
-rw-r--r-- | test/xserver-test.cpp | 120 |
1 files changed, 120 insertions, 0 deletions
diff --git a/test/xserver-test.cpp b/test/xserver-test.cpp index 5faa6ca..932dff6 100644 --- a/test/xserver-test.cpp +++ b/test/xserver-test.cpp @@ -5,6 +5,7 @@ #include <fstream> #include <xorg/gtest/xorg-gtest.h> +#include <X11/extensions/XInput2.h> using namespace xorg::testing; @@ -71,6 +72,125 @@ TEST(XServer, WaitForSIGUSR1) } } +static void assert_masks_equal(Display *dpy) +{ + int nmasks_before; + XIEventMask *masks_before; + int nmasks_after; + XIEventMask *masks_after; + + masks_before = XIGetSelectedEvents(dpy, DefaultRootWindow(dpy), &nmasks_before); + XServer::WaitForDevice(dpy, "not actually waiting for device", 1); + masks_after = XIGetSelectedEvents(dpy, DefaultRootWindow(dpy), &nmasks_after); + + ASSERT_EQ(nmasks_before, nmasks_after); + + for (int i = 0; i < nmasks_before; i++) { + ASSERT_EQ(masks_before[i].deviceid, masks_after[i].deviceid); + ASSERT_EQ(masks_before[i].mask_len, masks_after[i].mask_len); + ASSERT_EQ(memcmp(masks_before[i].mask, masks_after[i].mask, masks_before[i].mask_len), 0); + } + + XFree(masks_before); + XFree(masks_after); + +} + +TEST(XServer, WaitForDeviceEventMask) +{ + XORG_TESTCASE("The event mask is left as-is by WaitForDevice"); + + XServer server; + server.SetOption("-logfile", "/tmp/Xorg-WaitForDevice.log"); + server.SetOption("-noreset", ""); + server.Start(); + ASSERT_EQ(server.GetState(), Process::RUNNING); + ::Display *dpy = XOpenDisplay(server.GetDisplayString().c_str()); + ASSERT_TRUE(dpy != NULL); + int major = 2, minor = 0; + XIQueryVersion(dpy, &major, &minor); + + /* empty mask */ + assert_masks_equal(dpy); + + /* device specific mask */ + XIEventMask m; + m.deviceid = 2; + m.mask_len = 1; + m.mask = new unsigned char[m.mask_len](); + XISetMask(m.mask, XI_Motion); + XISelectEvents(dpy, DefaultRootWindow(dpy), &m, 1); + + assert_masks_equal(dpy); + delete m.mask; + + /* XIAllDevices mask with short mask */ + m.deviceid = XIAllDevices; + m.mask_len = 1; + m.mask = new unsigned char[m.mask_len](); + XISetMask(m.mask, XI_Motion); + XISelectEvents(dpy, DefaultRootWindow(dpy), &m, 1); + + assert_masks_equal(dpy); + delete m.mask; + + /* XIAllDevices mask with hierarchy bit not set */ + m.deviceid = XIAllDevices; + m.mask_len = XIMaskLen(XI_HierarchyChanged); + m.mask = new unsigned char[m.mask_len](); + XISetMask(m.mask, XI_Motion); + XISelectEvents(dpy, DefaultRootWindow(dpy), &m, 1); + + assert_masks_equal(dpy); + delete m.mask; + + /* XIAllDevices mask with hierarchy bit set */ + m.deviceid = XIAllDevices; + m.mask_len = XIMaskLen(XI_HierarchyChanged); + m.mask = new unsigned char[m.mask_len](); + XISetMask(m.mask, XI_HierarchyChanged); + XISelectEvents(dpy, DefaultRootWindow(dpy), &m, 1); + + assert_masks_equal(dpy); + delete m.mask; +} + +#ifdef HAVE_EVEMU +TEST(XServer, WaitForExistingDevice) +{ + XORG_TESTCASE("WaitForDevice() returns true for already existing device"); + + xorg::testing::evemu::Device d(TEST_ROOT_DIR "PIXART-USB-OPTICAL-MOUSE.desc"); + + XServer server; + server.SetOption("-logfile", "/tmp/Xorg-WaitForDevice.log"); + server.SetOption("-noreset", ""); + server.Start(); + ASSERT_EQ(server.GetState(), Process::RUNNING); + ::Display *dpy = XOpenDisplay(server.GetDisplayString().c_str()); + ASSERT_TRUE(dpy != NULL); + + ASSERT_TRUE(XServer::WaitForDevice(dpy, "PIXART USB OPTICAL MOUSE", 1000)); +} + +TEST(XServer, WaitForNewDevice) +{ + XORG_TESTCASE("WaitForDevice() waits for newly created dvice"); + + XServer server; + server.SetOption("-logfile", "/tmp/Xorg-WaitForDevice.log"); + server.SetOption("-noreset", ""); + server.Start(); + ASSERT_EQ(server.GetState(), Process::RUNNING); + ::Display *dpy = XOpenDisplay(server.GetDisplayString().c_str()); + ASSERT_TRUE(dpy != NULL); + + xorg::testing::evemu::Device d(TEST_ROOT_DIR "PIXART-USB-OPTICAL-MOUSE.desc"); + + ASSERT_TRUE(XServer::WaitForDevice(dpy, "PIXART USB OPTICAL MOUSE", 1000)); +} +#endif + int main(int argc, char *argv[]) { testing::InitGoogleTest(&argc, argv); return RUN_ALL_TESTS(); |