summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorPeter Hutterer <peter.hutterer@who-t.net>2012-10-12 12:37:02 +1000
committerPeter Hutterer <peter.hutterer@who-t.net>2012-10-16 14:09:20 +1000
commit3053e8d8e09971c70c16735f9d43fa248cd9901d (patch)
tree9af63a33a2e6c547de4a1f7066657d13a50ddf4f /test
parent12538b834956ad7f570736b0b5af40e2413ed697 (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.cpp120
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();