#!/bin/env python3# SPDX-License-Identifier: GPL-2.0# -*- coding: utf-8 -*-## Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com># Copyright (c) 2017 Red Hat, Inc.from packaging.version import Versionimport platformimport pytestimport reimport resourceimport subprocessfrom .base import HIDTestUdevRulefrom pathlib import Path@pytest.fixture(autouse=True)def hidtools_version_check(): HIDTOOLS_VERSION = "0.12" try: import hidtools version = hidtools.__version__ # type: ignore if Version(version) < Version(HIDTOOLS_VERSION): pytest.skip(reason=f"have hidtools {version}, require >={HIDTOOLS_VERSION}") except Exception: pytest.skip(reason=f"hidtools >={HIDTOOLS_VERSION} required")# See the comment in HIDTestUdevRule, this doesn't set up but it will clean# up once the last test exited.@pytest.fixture(autouse=True, scope="session")def udev_rules_session_setup(): with HIDTestUdevRule.instance(): yield@pytest.fixture(autouse=True, scope="session")def setup_rlimit(): resource.setrlimit(resource.RLIMIT_CORE, (0, 0))@pytest.fixture(autouse=True, scope="session")def start_udevd(pytestconfig): if pytestconfig.getoption("udevd"): import subprocess with subprocess.Popen("/usr/lib/systemd/systemd-udevd") as proc: yield proc.kill() else: yielddef pytest_configure(config): config.addinivalue_line( "markers", "skip_if_uhdev(condition, message): mark test to skip if the condition on the uhdev device is met", )# Generate the list of modules and modaliases# for the tests that need to be parametrized with thosedef pytest_generate_tests(metafunc): if "usbVidPid" in metafunc.fixturenames: modules = ( Path("/lib/modules/") / platform.uname().release / "kernel" / "drivers" / "hid" ) modalias_re = re.compile(r"alias:\s+hid:b0003g.*v([0-9a-fA-F]+)p([0-9a-fA-F]+)") params = [] ids = [] for module in modules.glob("*.ko"): p = subprocess.run( ["modinfo", module], capture_output=True, check=True, encoding="utf-8" ) for line in p.stdout.split("\n"): m = modalias_re.match(line) if m is not None: vid, pid = m.groups() vid = int(vid, 16) pid = int(pid, 16) params.append([module.name.replace(".ko", ""), vid, pid]) ids.append(f"{module.name} {vid:04x}:{pid:04x}") metafunc.parametrize("usbVidPid", params, ids=ids)def pytest_addoption(parser): parser.addoption("--udevd", action="store_true", default=False)
#!/bin/env python3
# SPDX-License-Identifier: GPL-2.0
# -*- coding: utf-8 -*-
#
# Copyright (c) 2017 Benjamin Tissoires <benjamin.tissoires@gmail.com>
# Copyright (c) 2017 Red Hat, Inc.
from packaging.version import Version
import platform
import pytest
import re
import resource
import subprocess
from .base import HIDTestUdevRule
from pathlib import Path
@pytest.fixture(autouse=True)
def hidtools_version_check():
HIDTOOLS_VERSION = "0.12"
try:
import hidtools
version = hidtools.__version__ # type: ignore
if Version(version) < Version(HIDTOOLS_VERSION):
pytest.skip(reason=f"have hidtools {version}, require >={HIDTOOLS_VERSION}")
except Exception:
pytest.skip(reason=f"hidtools >={HIDTOOLS_VERSION} required")
# See the comment in HIDTestUdevRule, this doesn't set up but it will clean
# up once the last test exited.
@pytest.fixture(autouse=True, scope="session")
def udev_rules_session_setup():
with HIDTestUdevRule.instance():
yield
@pytest.fixture(autouse=True, scope="session")
def setup_rlimit():
resource.setrlimit(resource.RLIMIT_CORE, (0, 0))
@pytest.fixture(autouse=True, scope="session")
def start_udevd(pytestconfig):
if pytestconfig.getoption("udevd"):
import subprocess
with subprocess.Popen("/usr/lib/systemd/systemd-udevd") as proc:
yield
proc.kill()
else:
yield
def pytest_configure(config):
config.addinivalue_line(
"markers",
"skip_if_uhdev(condition, message): mark test to skip if the condition on the uhdev device is met",
)
# Generate the list of modules and modaliases
# for the tests that need to be parametrized with those
def pytest_generate_tests(metafunc):
if "usbVidPid" in metafunc.fixturenames:
modules = (
Path("/lib/modules/")
/ platform.uname().release
/ "kernel"
/ "drivers"
/ "hid"
)
modalias_re = re.compile(r"alias:\s+hid:b0003g.*v([0-9a-fA-F]+)p([0-9a-fA-F]+)")
params = []
ids = []
for module in modules.glob("*.ko"):
p = subprocess.run(
["modinfo", module], capture_output=True, check=True, encoding="utf-8"
)
for line in p.stdout.split("\n"):
m = modalias_re.match(line)
if m is not None:
vid, pid = m.groups()
vid = int(vid, 16)
pid = int(pid, 16)
params.append([module.name.replace(".ko", ""), vid, pid])
ids.append(f"{module.name} {vid:04x}:{pid:04x}")
metafunc.parametrize("usbVidPid", params, ids=ids)
def pytest_addoption(parser):
parser.addoption("--udevd", action="store_true", default=False)