xref: /linux/tools/testing/selftests/hid/tests/conftest.py (revision 6a069876eb1402478900ee0eb7d7fe276bb1f4e3)
1#!/bin/env python3
2# SPDX-License-Identifier: GPL-2.0
3# -*- coding: utf-8 -*-
4#
5# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com>
6# Copyright (c) 2017 Red Hat, Inc.
7
8from packaging.version import Version
9import platform
10import pytest
11import re
12import resource
13import subprocess
14from .base import HIDTestUdevRule
15from pathlib import Path
16
17
18@pytest.fixture(autouse=True)
19def hidtools_version_check():
20    HIDTOOLS_VERSION = "0.12"
21    try:
22        import hidtools
23
24        version = hidtools.__version__  # type: ignore
25        if Version(version) < Version(HIDTOOLS_VERSION):
26            pytest.skip(reason=f"have hidtools {version}, require >={HIDTOOLS_VERSION}")
27    except Exception:
28        pytest.skip(reason=f"hidtools >={HIDTOOLS_VERSION} required")
29
30
31# See the comment in HIDTestUdevRule, this doesn't set up but it will clean
32# up once the last test exited.
33@pytest.fixture(autouse=True, scope="session")
34def udev_rules_session_setup():
35    with HIDTestUdevRule.instance():
36        yield
37
38
39@pytest.fixture(autouse=True, scope="session")
40def setup_rlimit():
41    resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
42
43
44@pytest.fixture(autouse=True, scope="session")
45def start_udevd(pytestconfig):
46    if pytestconfig.getoption("udevd"):
47        import subprocess
48
49        with subprocess.Popen("/usr/lib/systemd/systemd-udevd") as proc:
50            yield
51            proc.kill()
52    else:
53        yield
54
55
56def pytest_configure(config):
57    config.addinivalue_line(
58        "markers",
59        "skip_if_uhdev(condition, message): mark test to skip if the condition on the uhdev device is met",
60    )
61
62
63# Generate the list of modules and modaliases
64# for the tests that need to be parametrized with those
65def pytest_generate_tests(metafunc):
66    if "usbVidPid" in metafunc.fixturenames:
67        modules = (
68            Path("/lib/modules/")
69            / platform.uname().release
70            / "kernel"
71            / "drivers"
72            / "hid"
73        )
74
75        modalias_re = re.compile(r"alias:\s+hid:b0003g.*v([0-9a-fA-F]+)p([0-9a-fA-F]+)")
76
77        params = []
78        ids = []
79        for module in modules.glob("*.ko"):
80            p = subprocess.run(
81                ["modinfo", module], capture_output=True, check=True, encoding="utf-8"
82            )
83            for line in p.stdout.split("\n"):
84                m = modalias_re.match(line)
85                if m is not None:
86                    vid, pid = m.groups()
87                    vid = int(vid, 16)
88                    pid = int(pid, 16)
89                    params.append([module.name.replace(".ko", ""), vid, pid])
90                    ids.append(f"{module.name} {vid:04x}:{pid:04x}")
91        metafunc.parametrize("usbVidPid", params, ids=ids)
92
93
94def pytest_addoption(parser):
95    parser.addoption("--udevd", action="store_true", default=False)
96