[PATCH 2/2] XKB: Add two tests around XkbListComponents

Daniel Stone daniel at fooishbar.org
Sun Nov 4 20:58:43 PST 2012


These require patches which aren't even in git master yet.

Signed-off-by: Daniel Stone <daniel at fooishbar.org>
---
 configure.ac          |    1 +
 tests/Makefile.am     |    2 +-
 tests/xkb/Makefile.am |    7 ++++
 tests/xkb/list.cpp    |  107 +++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 116 insertions(+), 1 deletion(-)
 create mode 100644 tests/xkb/Makefile.am
 create mode 100644 tests/xkb/list.cpp

diff --git a/configure.ac b/configure.ac
index f9459a7..0456678 100644
--- a/configure.ac
+++ b/configure.ac
@@ -93,5 +93,6 @@ AC_CONFIG_FILES([Makefile
                  tests/input/Makefile
                  tests/video/Makefile
                  tests/server/Makefile
+                 tests/xkb/Makefile
                  tests/lib/Makefile])
 AC_OUTPUT
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 7e389e9..40c2545 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -1 +1 @@
-SUBDIRS = common input server lib video
+SUBDIRS = common input server lib video xkb
diff --git a/tests/xkb/Makefile.am b/tests/xkb/Makefile.am
new file mode 100644
index 0000000..c7ef5b8
--- /dev/null
+++ b/tests/xkb/Makefile.am
@@ -0,0 +1,7 @@
+include $(top_srcdir)/tests/common/Makefile.am
+
+noinst_PROGRAMS = list
+TESTS=$(noinst_PROGRAMS)
+
+list_SOURCES = list.cpp $(common_sources)
+list_LDADD = $(GTEST_LDADDS)
diff --git a/tests/xkb/list.cpp b/tests/xkb/list.cpp
new file mode 100644
index 0000000..2359744
--- /dev/null
+++ b/tests/xkb/list.cpp
@@ -0,0 +1,107 @@
+#include <stdexcept>
+#include <tr1/tuple>
+
+#include "helpers.h"
+#include "device-interface.h"
+#include "xit-server-input-test.h"
+
+#include <xorg/gtest/xorg-gtest.h>
+
+#include <X11/Xlibint.h>
+#include <X11/XKBlib.h>
+#include <X11/extensions/XKBproto.h>
+
+class XKBTest : public XITServerTest {
+public:
+    virtual void SetUpConfigAndLog() {
+        config.AddDefaultScreenWithDriver();
+        config.AddInputSection("void", "--device--", "Option \"CorePointer\" \"on\"\n");
+        config.WriteConfig();
+        server.SetOption("-config", config.GetPath());
+    }
+
+    virtual void SetUp() {
+        XITServerTest::SetUp();
+        dpy = Display();
+        ASSERT_TRUE(XkbQueryExtension(dpy, &base_req, &base_ev, &base_err, NULL, NULL));
+    }
+
+    ::Display *dpy;
+    int base_req;
+    int base_ev;
+    int base_err;
+};
+
+TEST_F(XKBTest, XKBComponentListLength)
+{
+    XORG_TESTCASE("Register for the XKB extension.\n"
+                  "Construct a component list query with a malicious length.\n"
+                  "Hope the server doesn't crash.\n");
+
+    XErrorEvent *err;
+    xkbListComponentsReq *req;
+    xkbListComponentsReply rep;
+    char *str;
+    int i;
+
+    SetErrorTrap(dpy);
+
+    LockDisplay(dpy);
+    GetReq(kbListComponents, req);
+    req->reqType = base_req;
+    req->xkbReqType = X_kbListComponents;
+    req->deviceSpec = XkbUseCoreKbd;
+    req->maxNames = 1024;
+    req->length += 2;
+    BufAlloc(char *, str, 8);
+    for (i = 0; i < 6; i++)
+        *str++ = 255;
+    ASSERT_FALSE(_XReply(dpy, (xReply *) &rep, 0, xFalse));
+    UnlockDisplay(dpy);
+    SyncHandle();
+
+    err = ReleaseErrorTrap(dpy);
+    ASSERT_ERROR(err, BadLength);
+}
+
+TEST_F(XKBTest, XKBComponentListEmpty)
+{
+    XORG_TESTCASE("Register for the XKB extension.\n"
+                  "Check the listed legacy components.\n"
+                  "Ensure that no components are listed.\n");
+
+    XkbComponentListPtr list;
+    XkbComponentNamesRec patterns;
+    int max = 1024;
+
+    memset(&patterns, 0, sizeof(patterns));
+    patterns.keymap = NULL;
+    patterns.keycodes = strdup("*");
+    patterns.types = strdup("*");
+    patterns.compat = strdup("*");
+    patterns.symbols = strdup("*");
+    patterns.geometry = strdup("*");
+
+    list = XkbListComponents(Display(), XkbUseCoreKbd, &patterns, &max);
+    ASSERT_TRUE(list);
+
+    ASSERT_EQ(list->num_keymaps, 0);
+    ASSERT_EQ(list->num_keycodes, 0);
+    ASSERT_EQ(list->num_types, 0);
+    ASSERT_EQ(list->num_compat, 0);
+    ASSERT_EQ(list->num_symbols, 0);
+    ASSERT_EQ(list->num_geometry, 0);
+    ASSERT_EQ(max, 0);
+
+    free(patterns.keycodes);
+    free(patterns.types);
+    free(patterns.compat);
+    free(patterns.symbols);
+    free(patterns.geometry);
+    free(list);
+}
+
+int main(int argc, char** argv) {
+    testing::InitGoogleTest(&argc, argv);
+    return RUN_ALL_TESTS();
+}
-- 
1.7.10.4



More information about the xorg-devel mailing list