lkml.org 
[lkml]   [2023]   [Feb]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Date
    Subject[PATCH 03/11] selftests: hid: import hid-tools hid-gamepad tests
    These tests have been developed in the hid-tools[0] tree for a while.
    Now that we have a proper selftests/hid kernel entry and that the tests
    are more reliable, it is time to directly include those in the kernel
    tree.

    [0] https://gitlab.freedesktop.org/libevdev/hid-tools

    Cc: Candle Sun <candle.sun@unisoc.com>
    Cc: Jose Torreguitar <jtguitar@google.com>
    Cc: Peter Hutterer <peter.hutterer@who-t.net>
    Cc: Roderick Colenbrander <roderick.colenbrander@sony.com>
    Cc: Silvan Jegen <s.jegen@gmail.com>
    Signed-off-by: Benjamin Tissoires <benjamin.tissoires@redhat.com>
    ---
    tools/testing/selftests/hid/Makefile | 1 +
    tools/testing/selftests/hid/hid-gamepad.sh | 7 +
    tools/testing/selftests/hid/tests/test_gamepad.py | 209 ++++++++++++++++++++++
    3 files changed, 217 insertions(+)

    diff --git a/tools/testing/selftests/hid/Makefile b/tools/testing/selftests/hid/Makefile
    index bdcb36d80c8c..d16a22477140 100644
    --- a/tools/testing/selftests/hid/Makefile
    +++ b/tools/testing/selftests/hid/Makefile
    @@ -6,6 +6,7 @@ include ../../../scripts/Makefile.arch
    include ../../../scripts/Makefile.include

    TEST_PROGS := hid-core.sh
    +TEST_PROGS += hid-gamepad.sh

    CXX ?= $(CROSS_COMPILE)g++

    diff --git a/tools/testing/selftests/hid/hid-gamepad.sh b/tools/testing/selftests/hid/hid-gamepad.sh
    new file mode 100755
    index 000000000000..1ba00c0ca95f
    --- /dev/null
    +++ b/tools/testing/selftests/hid/hid-gamepad.sh
    @@ -0,0 +1,7 @@
    +#!/bin/sh
    +# SPDX-License-Identifier: GPL-2.0
    +# Runs tests for the HID subsystem
    +
    +export TARGET=test_gamepad.py
    +
    +bash ./run-hid-tools-tests.sh
    diff --git a/tools/testing/selftests/hid/tests/test_gamepad.py b/tools/testing/selftests/hid/tests/test_gamepad.py
    new file mode 100644
    index 000000000000..26c74040b796
    --- /dev/null
    +++ b/tools/testing/selftests/hid/tests/test_gamepad.py
    @@ -0,0 +1,209 @@
    +#!/bin/env python3
    +# SPDX-License-Identifier: GPL-2.0
    +# -*- coding: utf-8 -*-
    +#
    +# Copyright (c) 2019 Benjamin Tissoires <benjamin.tissoires@gmail.com>
    +# Copyright (c) 2019 Red Hat, Inc.
    +#
    +
    +from . import base
    +import libevdev
    +import pytest
    +
    +from hidtools.device.base_gamepad import AsusGamepad, SaitekGamepad
    +
    +import logging
    +
    +logger = logging.getLogger("hidtools.test.gamepad")
    +
    +
    +class BaseTest:
    + class TestGamepad(base.BaseTestCase.TestUhid):
    + @pytest.fixture(autouse=True)
    + def send_initial_state(self):
    + """send an empty report to initialize the axes"""
    + uhdev = self.uhdev
    +
    + r = uhdev.event()
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    +
    + def assert_button(self, button):
    + uhdev = self.uhdev
    + evdev = uhdev.get_evdev()
    + syn_event = self.syn_event
    +
    + buttons = {}
    + key = libevdev.evbit(uhdev.buttons_map[button])
    +
    + buttons[button] = True
    + r = uhdev.event(buttons=buttons)
    + expected_event = libevdev.InputEvent(key, 1)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + self.assertInputEventsIn((syn_event, expected_event), events)
    + assert evdev.value[key] == 1
    +
    + buttons[button] = False
    + r = uhdev.event(buttons=buttons)
    + expected_event = libevdev.InputEvent(key, 0)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + self.assertInputEventsIn((syn_event, expected_event), events)
    + assert evdev.value[key] == 0
    +
    + def test_buttons(self):
    + """check for button reliability."""
    + uhdev = self.uhdev
    +
    + for b in uhdev.buttons:
    + self.assert_button(b)
    +
    + def test_dual_buttons(self):
    + """check for button reliability when pressing 2 buttons"""
    + uhdev = self.uhdev
    + evdev = uhdev.get_evdev()
    + syn_event = self.syn_event
    +
    + # can change intended b1 b2 values
    + b1 = uhdev.buttons[0]
    + key1 = libevdev.evbit(uhdev.buttons_map[b1])
    + b2 = uhdev.buttons[1]
    + key2 = libevdev.evbit(uhdev.buttons_map[b2])
    +
    + buttons = {b1: True, b2: True}
    + r = uhdev.event(buttons=buttons)
    + expected_event0 = libevdev.InputEvent(key1, 1)
    + expected_event1 = libevdev.InputEvent(key2, 1)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + self.assertInputEventsIn(
    + (syn_event, expected_event0, expected_event1), events
    + )
    + assert evdev.value[key1] == 1
    + assert evdev.value[key2] == 1
    +
    + buttons = {b1: False, b2: None}
    + r = uhdev.event(buttons=buttons)
    + expected_event = libevdev.InputEvent(key1, 0)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + self.assertInputEventsIn((syn_event, expected_event), events)
    + assert evdev.value[key1] == 0
    + assert evdev.value[key2] == 1
    +
    + buttons = {b1: None, b2: False}
    + r = uhdev.event(buttons=buttons)
    + expected_event = libevdev.InputEvent(key2, 0)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + self.assertInputEventsIn((syn_event, expected_event), events)
    + assert evdev.value[key1] == 0
    + assert evdev.value[key2] == 0
    +
    + def _get_libevdev_abs_events(self, which):
    + """Returns which ABS_* evdev axes are expected for the given stick"""
    + abs_map = self.uhdev.axes_map[which]
    +
    + x = abs_map["x"].evdev
    + y = abs_map["y"].evdev
    +
    + assert x
    + assert y
    +
    + return x, y
    +
    + def _test_joystick_press(self, which, data):
    + uhdev = self.uhdev
    +
    + libevdev_axes = self._get_libevdev_abs_events(which)
    +
    + r = None
    + if which == "left_stick":
    + r = uhdev.event(left=data)
    + else:
    + r = uhdev.event(right=data)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    +
    + for i, d in enumerate(data):
    + if d is not None and d != 127:
    + assert libevdev.InputEvent(libevdev_axes[i], d) in events
    + else:
    + assert libevdev.InputEvent(libevdev_axes[i]) not in events
    +
    + def test_left_joystick_press_left(self):
    + """check for the left joystick reliability"""
    + self._test_joystick_press("left_stick", (63, None))
    + self._test_joystick_press("left_stick", (0, 127))
    +
    + def test_left_joystick_press_right(self):
    + """check for the left joystick reliability"""
    + self._test_joystick_press("left_stick", (191, 127))
    + self._test_joystick_press("left_stick", (255, None))
    +
    + def test_left_joystick_press_up(self):
    + """check for the left joystick reliability"""
    + self._test_joystick_press("left_stick", (None, 63))
    + self._test_joystick_press("left_stick", (127, 0))
    +
    + def test_left_joystick_press_down(self):
    + """check for the left joystick reliability"""
    + self._test_joystick_press("left_stick", (127, 191))
    + self._test_joystick_press("left_stick", (None, 255))
    +
    + def test_right_joystick_press_left(self):
    + """check for the right joystick reliability"""
    + self._test_joystick_press("right_stick", (63, None))
    + self._test_joystick_press("right_stick", (0, 127))
    +
    + def test_right_joystick_press_right(self):
    + """check for the right joystick reliability"""
    + self._test_joystick_press("right_stick", (191, 127))
    + self._test_joystick_press("right_stick", (255, None))
    +
    + def test_right_joystick_press_up(self):
    + """check for the right joystick reliability"""
    + self._test_joystick_press("right_stick", (None, 63))
    + self._test_joystick_press("right_stick", (127, 0))
    +
    + def test_right_joystick_press_down(self):
    + """check for the right joystick reliability"""
    + self._test_joystick_press("right_stick", (127, 191))
    + self._test_joystick_press("right_stick", (None, 255))
    +
    + @pytest.mark.skip_if_uhdev(
    + lambda uhdev: "Hat switch" not in uhdev.fields,
    + "Device not compatible, missing Hat switch usage",
    + )
    + @pytest.mark.parametrize(
    + "hat_value,expected_evdev,evdev_value",
    + [
    + (0, "ABS_HAT0Y", -1),
    + (2, "ABS_HAT0X", 1),
    + (4, "ABS_HAT0Y", 1),
    + (6, "ABS_HAT0X", -1),
    + ],
    + )
    + def test_hat_switch(self, hat_value, expected_evdev, evdev_value):
    + uhdev = self.uhdev
    +
    + r = uhdev.event(hat_switch=hat_value)
    + events = uhdev.next_sync_events()
    + self.debug_reports(r, uhdev, events)
    + assert (
    + libevdev.InputEvent(
    + libevdev.evbit("EV_ABS", expected_evdev), evdev_value
    + )
    + in events
    + )
    +
    +
    +class TestSaitekGamepad(BaseTest.TestGamepad):
    + def create_device(self):
    + return SaitekGamepad()
    +
    +
    +class TestAsusGamepad(BaseTest.TestGamepad):
    + def create_device(self):
    + return AsusGamepad()
    --
    2.39.1

    \
     
     \ /
      Last update: 2023-03-27 00:27    [W:4.291 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site