Commit 1aee3a44 authored by Benjamin Tissoires's avatar Benjamin Tissoires
Browse files

selftests/hid: sync python tests to hid-tools 0.10



hid-tools 0.10 fixes one inconvenience introduced by
commit 6a9e76f7 ("HID: multitouch: Disable touchpad
on firmware level while not in use")

This change added a new callback when a hid-nultitouch device is opened
or closed to put the underlying device into a given operating mode.
However, in the test cases, that means that while the single threaded
test is run, it opens the device but has to react to the device while
the open() is still running. hid-tools now implements a minimal thread
to circumvent this.

This makes the HID kernel tests in sync with hid-tools 0.10.

This has the net effect of running the full HID python testsuite in 6
minutes instead of 1 hour.

Reviewed-by: default avatarPeter Hutterer <peter.hutterer@who-t.net>
Link: https://patch.msgid.link/20250709-wip-fix-ci-v1-3-b7df4c271cf8@kernel.org


Signed-off-by: default avatarBenjamin Tissoires <bentiss@kernel.org>
parent 642f9b2d
Loading
Loading
Loading
Loading
+19 −0
Original line number Diff line number Diff line
@@ -23,6 +23,7 @@ import fcntl
import functools
import libevdev
import os
import threading

try:
    import pyudev
@@ -344,10 +345,28 @@ class BaseDevice(UHIDDevice):
        if not self.kernel_is_ready or not self.started:
            return []

        # Starting with kernel v6.16, an event is emitted when
        # userspace opens a kernel device, and for some devices
        # this translates into a SET_REPORT.
        # Because EvdevDevice(path) opens every single evdev node
        # we need to have a separate thread to process the incoming
        # SET_REPORT or we end up having to wait for the kernel
        # timeout of 5 seconds.
        done = False

        def dispatch():
            while not done:
                self.dispatch(1)

        t = threading.Thread(target=dispatch)
        t.start()

        self._input_nodes = [
            EvdevDevice(path)
            for path in self.walk_sysfs("input", "input/input*/event*")
        ]
        done = True
        t.join()
        return self._input_nodes

    def match_evdev_rule(self, application, evdev):