[PATCH synaptics 16/17] test: Add some tests for HW state changes.

Peter Hutterer peter.hutterer at who-t.net
Sun Mar 20 19:08:33 PDT 2011


Includes basic finger counting test, some button tests and axis tests. These
tests simply check that the HW state changes reflect the events pumped in.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
 test/Makefile.am      |    1 +
 test/eventcomm-test.c |  153 +++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 154 insertions(+), 0 deletions(-)

diff --git a/test/Makefile.am b/test/Makefile.am
index aaa160d..6e11e93 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -6,6 +6,7 @@ if BUILD_EVENTCOMM
 noinst_PROGRAMS = eventcomm-test
 
 eventcomm_test_SOURCES = eventcomm-test.c\
+			 $(top_srcdir)/src/eventcomm.c \
 			 $(fake_syms)
 endif
 
diff --git a/test/eventcomm-test.c b/test/eventcomm-test.c
index ac24640..7faf638 100644
--- a/test/eventcomm-test.c
+++ b/test/eventcomm-test.c
@@ -31,7 +31,160 @@
 #include <stdio.h>
 #include <assert.h>
 
+#include "synaptics.h"
+#include "synapticsstr.h"
+#include "eventcomm.h"
+
+int fd_read, fd_write;
+
+/* A syn event, always handy to have */
+struct input_event syn = { {0, 0}, EV_SYN, SYN_REPORT, 0 };
+
+static void
+create_pipe_fd(void)
+{
+    int pipefd[2];
+
+    assert(pipe(pipefd) != -1);
+
+    fd_read = pipefd[0];
+    fd_write = pipefd[1];
+}
+
+static void
+reset_data(struct SynapticsHwState *hw, struct CommData *comm)
+{
+    memset(comm, 0, sizeof(struct CommData));
+    memset(hw, 0, sizeof(struct SynapticsHwState));
+}
+
+/**
+ * Write n input events to fd, followed by the syn event.
+ */
+static void
+write_event(int fd, struct input_event *ev, int n)
+{
+    write(fd, ev, sizeof(struct input_event) * n);
+    write(fd, &syn, sizeof(syn));
+}
+
+
+static void
+test_buttons(int fd,
+             InputInfoPtr pInfo,
+             struct SynapticsHwState *hw,
+             struct CommData *comm)
+{
+    struct input_event ev = {{0, 0}, EV_KEY, 0, 0};
+
+    reset_data(hw, comm);
+
+#define _test_press_release(_code, field)       \
+        ev.code = (_code);                      \
+        ev.value = 1;                           \
+        write_event(fd, &ev, 1);                \
+        EventReadHwState(pInfo, comm, hw);      \
+        assert(hw->field == 1);                 \
+        ev.value = 0; /* button release */      \
+        write_event(fd_write, &ev, 1);          \
+        EventReadHwState(pInfo, comm, hw);      \
+        assert(hw->field == 0);
+
+    _test_press_release(BTN_LEFT,       left);
+    _test_press_release(BTN_RIGHT,      right);
+    _test_press_release(BTN_MIDDLE,     middle);
+    _test_press_release(BTN_FORWARD,    up);
+    _test_press_release(BTN_BACK,       down);
+    _test_press_release(BTN_0,          multi[0]);
+    _test_press_release(BTN_1,          multi[1]);
+    _test_press_release(BTN_2,          multi[2]);
+    _test_press_release(BTN_3,          multi[3]);
+    _test_press_release(BTN_4,          multi[4]);
+    _test_press_release(BTN_5,          multi[5]);
+    _test_press_release(BTN_6,          multi[6]);
+    _test_press_release(BTN_7,          multi[7]);
+}
+
+/**
+ * This test checks that the recognised event fields set the right hardware
+ * state. It's a fairly limited test and does not check whether any of the
+ * others change the HW state at all.
+ */
+static void
+test_read_hw_state(void)
+{
+    InputInfoRec                info    = {0};
+    SynapticsPrivate            private;
+    struct SynapticsHwState     hw      = {0};
+    struct CommData             comm    = {0};
+
+    struct input_event ev[] = {
+	{ {0, 0}, EV_KEY, BTN_TOOL_FINGER, 1 },
+	{ {0, 0}, EV_KEY, BTN_TOOL_DOUBLETAP, 1 },
+	{ {0, 0}, EV_KEY, BTN_TOOL_TRIPLETAP, 1 },
+	{ {0, 0}, EV_ABS, ABS_X, 42 },
+	{ {0, 0}, EV_ABS, ABS_Y, 21 },
+	{ {0, 0}, EV_ABS, ABS_PRESSURE, 56 },
+	{ {0, 0}, EV_ABS, ABS_TOOL_WIDTH, 204 },
+    };
+
+    memset(&private, 0, sizeof(private));
+
+    info.private = &private;
+    info.fd = fd_read;
+
+
+    /* just the syn event */
+    reset_data(&hw, &comm);
+    write(fd_write, &syn, sizeof(syn));
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.numFingers == 0);
+
+    /* one finger */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[0], 1);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.numFingers == 1);
+
+    /* two fingers */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[1], 1);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.numFingers == 2);
+
+    /* three fingers */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[2], 1);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.numFingers == 3);
+
+    /* x/y data */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[3], 2);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.x == ev[3].value);
+    assert(hw.y == ev[4].value);
+
+    /* pressure */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[5], 1);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.z == ev[5].value);
+
+    /* finger width */
+    reset_data(&hw, &comm);
+    write_event(fd_write, &ev[6], 1);
+    EventReadHwState(&info, &comm, &hw);
+    assert(hw.fingerWidth == ev[6].value);
+
+    /* the various buttons */
+    test_buttons(fd_write, &info, &hw, &comm);
+}
+
 int main (int argc, char **argv)
 {
+    create_pipe_fd();
+
+    test_read_hw_state();
     return 0;
 }
-- 
1.7.4



More information about the xorg-devel mailing list