tests: use hidpp module in several test modules
This commit is contained in:
parent
ebc76bca24
commit
10e3f844dd
|
@ -1,7 +1,7 @@
|
|||
from dataclasses import dataclass
|
||||
from dataclasses import field
|
||||
from struct import pack
|
||||
from typing import Any
|
||||
from typing import Optional
|
||||
|
||||
import pytest
|
||||
|
||||
|
@ -10,13 +10,7 @@ from lib.logitech_receiver import hidpp20
|
|||
from lib.logitech_receiver import hidpp20_constants
|
||||
from lib.logitech_receiver import special_keys
|
||||
|
||||
|
||||
@dataclass
|
||||
class Response:
|
||||
response: Optional[str]
|
||||
request_id: int
|
||||
params: Any
|
||||
no_reply: bool = False
|
||||
from . import hidpp
|
||||
|
||||
|
||||
@dataclass
|
||||
|
@ -29,10 +23,11 @@ class Device:
|
|||
def request(self, id, *params, no_reply=False):
|
||||
if params is None:
|
||||
params = []
|
||||
params = b"".join(pack("B", p) if isinstance(p, int) else p for p in params)
|
||||
print("REQUEST ", self.name, hex(id), params)
|
||||
for r in self.responses:
|
||||
if id == r.request_id and params == r.params:
|
||||
print("RESPONSE", self.name, hex(r.request_id), r.params, r.response)
|
||||
if id == r.id and params == bytes.fromhex(r.params):
|
||||
print("RESPONSE", self.name, hex(r.id), r.params, r.response)
|
||||
return bytes.fromhex(r.response) if r.response is not None else None
|
||||
|
||||
def feature_request(self, feature, function=0x00, *params, no_reply=False):
|
||||
|
@ -43,21 +38,9 @@ class Device:
|
|||
device_offline = Device("REGISTERS", False)
|
||||
device_registers = Device("OFFLINE", True, 1.0)
|
||||
device_nofeatures = Device("NOFEATURES", True, 4.5)
|
||||
device_zerofeatures = Device("ZEROFEATURES", True, 4.5, [Response("0000", 0x0000, (b"\x00\x01",))])
|
||||
device_broken = Device("BROKEN", True, 4.5, [Response("0500", 0x0000, (b"\x00\x01",)), Response(None, 0x0100, ())])
|
||||
responses_standard = [
|
||||
Response("0100", 0x0000, (b"\x00\x01",)),
|
||||
Response("05000300", 0x0000, (b"\x1b\x04",)),
|
||||
Response("0500", 0x0100, ()),
|
||||
Response("01000000", 0x0110, (0x02,)),
|
||||
Response("1B040003", 0x0110, (0x05,)),
|
||||
Response("00110012AB010203CD00", 0x0510, (0,)),
|
||||
Response("01110022AB010203CD00", 0x0510, (1,)),
|
||||
Response("03110032AB010204CD00", 0x0510, (3,)),
|
||||
Response("00010111AB010203CD00", 0x0510, (2,)),
|
||||
Response("00030333AB010203CD00", 0x0510, (4,)),
|
||||
]
|
||||
device_standard = Device("STANDARD", True, 4.5, responses_standard)
|
||||
device_zerofeatures = Device("ZEROFEATURES", True, 4.5, [hidpp.Response("0000", 0x0000, "0001")])
|
||||
device_broken = Device("BROKEN", True, 4.5, [hidpp.Response("0500", 0x0000, "0001"), hidpp.Response(None, 0x0100)])
|
||||
device_standard = Device("STANDARD", True, 4.5, hidpp.r_keyboard_2)
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
|
@ -68,7 +51,7 @@ device_standard = Device("STANDARD", True, 4.5, responses_standard)
|
|||
(device_nofeatures, False, 0),
|
||||
(device_zerofeatures, False, 0),
|
||||
(device_broken, False, 0),
|
||||
(device_standard, True, 6),
|
||||
(device_standard, True, 9),
|
||||
],
|
||||
)
|
||||
def test_FeaturesArray_check(device, expected_result, expected_count):
|
||||
|
@ -88,7 +71,7 @@ def test_FeaturesArray_check(device, expected_result, expected_count):
|
|||
"device, expected0, expected1, expected2, expected5, expected5v",
|
||||
[
|
||||
(device_zerofeatures, None, None, None, None, None),
|
||||
(device_standard, 0x0000, 0x0001, 0x0100, hidpp20_constants.FEATURE.REPROG_CONTROLS_V4, 3),
|
||||
(device_standard, 0x0000, 0x0001, 0x1000, hidpp20_constants.FEATURE.REPROG_CONTROLS_V4, 3),
|
||||
],
|
||||
)
|
||||
def test_FeaturesArray_get_feature(device, expected0, expected1, expected2, expected5, expected5v):
|
||||
|
@ -119,10 +102,13 @@ def test_FeaturesArray_get_feature(device, expected0, expected1, expected2, expe
|
|||
[
|
||||
(hidpp20_constants.FEATURE.ROOT, 0),
|
||||
(hidpp20_constants.FEATURE.FEATURE_SET, 1),
|
||||
(common.NamedInt(256, "unknown:0100"), 2),
|
||||
(None, 3),
|
||||
(None, 4),
|
||||
(hidpp20_constants.FEATURE.BATTERY_STATUS, 2),
|
||||
(hidpp20_constants.FEATURE.DEVICE_FW_VERSION, 3),
|
||||
(common.NamedInt(256, "unknown:0100"), 4),
|
||||
(hidpp20_constants.FEATURE.REPROG_CONTROLS_V4, 5),
|
||||
(None, 6),
|
||||
(None, 7),
|
||||
(None, 8),
|
||||
],
|
||||
),
|
||||
],
|
||||
|
@ -273,25 +259,25 @@ def test_KeysArrayV4_index(key, index):
|
|||
|
||||
|
||||
responses_key = [
|
||||
Response("0A00", 0x0100, ()),
|
||||
Response("01000000", 0x0000, (b"\x00\x01",)),
|
||||
Response("09000300", 0x0000, (b"\x1b\x04",)),
|
||||
Response("00500038010001010400000000000000", 0x0910, (0,)),
|
||||
Response("00510039010001010400000000000000", 0x0910, (1,)),
|
||||
Response("0052003A310003070500000000000000", 0x0910, (2,)),
|
||||
Response("0053003C310002030500000000000000", 0x0910, (3,)),
|
||||
Response("0056003E310002030500000000000000", 0x0910, (4,)),
|
||||
Response("00C300A9310003070500000000000000", 0x0910, (5,)),
|
||||
Response("00C4009D310003070500000000000000", 0x0910, (6,)),
|
||||
Response("00D700B4A00004000300000000000000", 0x0910, (7,)),
|
||||
Response("00500000000000000000000000000000", 0x0920, (0, 0x50)),
|
||||
Response("00510000000000000000000000000000", 0x0920, (0, 0x51)),
|
||||
Response("00520000500000000000000000000000", 0x0920, (0, 0x52)),
|
||||
Response("00530000000000000000000000000000", 0x0920, (0, 0x53)),
|
||||
Response("00560000000000000000000000000000", 0x0920, (0, 0x56)),
|
||||
Response("00C30000000000000000000000000000", 0x0920, (0, 0xC3)),
|
||||
Response("00C40000500000000000000000000000", 0x0920, (0, 0xC4)),
|
||||
Response("00D70000510000000000000000000000", 0x0920, (0, 0xD7)),
|
||||
hidpp.Response("0A00", 0x0100),
|
||||
hidpp.Response("01000000", 0x0000, "0001"),
|
||||
hidpp.Response("09000300", 0x0000, "1b04"),
|
||||
hidpp.Response("00500038010001010400000000000000", 0x0910, "00"),
|
||||
hidpp.Response("00510039010001010400000000000000", 0x0910, "01"),
|
||||
hidpp.Response("0052003A310003070500000000000000", 0x0910, "02"),
|
||||
hidpp.Response("0053003C310002030500000000000000", 0x0910, "03"),
|
||||
hidpp.Response("0056003E310002030500000000000000", 0x0910, "04"),
|
||||
hidpp.Response("00C300A9310003070500000000000000", 0x0910, "05"),
|
||||
hidpp.Response("00C4009D310003070500000000000000", 0x0910, "06"),
|
||||
hidpp.Response("00D700B4A00004000300000000000000", 0x0910, "07"),
|
||||
hidpp.Response("00500000000000000000000000000000", 0x0920, "0050"),
|
||||
hidpp.Response("00510000000000000000000000000000", 0x0920, "0051"),
|
||||
hidpp.Response("00520000500000000000000000000000", 0x0920, "0052"),
|
||||
hidpp.Response("00530000000000000000000000000000", 0x0920, "0053"),
|
||||
hidpp.Response("00560000000000000000000000000000", 0x0920, "0056"),
|
||||
hidpp.Response("00C30000000000000000000000000000", 0x0920, "00C3"),
|
||||
hidpp.Response("00C40000500000000000000000000000", 0x0920, "00C4"),
|
||||
hidpp.Response("00D70000510000000000000000000000", 0x0920, "00D7"),
|
||||
]
|
||||
device_key = Device("KEY", True, 4.5, responses=responses_key)
|
||||
|
||||
|
|
|
@ -1,7 +1,5 @@
|
|||
from dataclasses import dataclass
|
||||
from functools import partial
|
||||
from struct import pack
|
||||
from typing import Optional
|
||||
from unittest import mock
|
||||
|
||||
import pytest
|
||||
|
@ -10,6 +8,8 @@ from logitech_receiver import common
|
|||
from logitech_receiver import exceptions
|
||||
from logitech_receiver import receiver
|
||||
|
||||
from . import hidpp
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"index, expected_kind",
|
||||
|
@ -39,29 +39,6 @@ class DeviceInfo:
|
|||
product_id: int = 0xC52B
|
||||
|
||||
|
||||
@dataclass
|
||||
class Response:
|
||||
response: Optional[str]
|
||||
handle: int
|
||||
devnumber: int
|
||||
id: int
|
||||
params: str = ""
|
||||
no_reply: bool = False
|
||||
|
||||
|
||||
def request(responses, handle, devnumber, id, *params, no_reply=False, return_error=False, long_message=False, protocol=1.0):
|
||||
params = b"".join(pack("B", p) if isinstance(p, int) else p for p in params)
|
||||
print("REQUEST ", hex(handle), hex(devnumber), hex(id), params.hex())
|
||||
for r in responses:
|
||||
if handle == r.handle and devnumber == r.devnumber and r.id == id and bytes.fromhex(r.params) == params:
|
||||
print("RESPONSE", hex(r.handle), hex(r.devnumber), hex(r.id), r.params, r.response)
|
||||
return bytes.fromhex(r.response) if r.response is not None else None
|
||||
|
||||
|
||||
def open_path(path: Optional[str]) -> Optional[int]:
|
||||
return int(path, 16) if path is not None else None
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def mock_request():
|
||||
with mock.patch("logitech_receiver.base.request", return_value=None) as mock_request:
|
||||
|
@ -76,38 +53,38 @@ def mock_base():
|
|||
|
||||
|
||||
responses_unifying = [
|
||||
Response("000000", 0x11, 0xFF, 0x8003, "FF"),
|
||||
Response("000300", 0x11, 0xFF, 0x8102),
|
||||
Response("0316CC9CB40506220000000000000000", 0x11, 0xFF, 0x83B5, "03"),
|
||||
Response("20200840820402020700000000000000", 0x11, 0xFF, 0x83B5, "20"),
|
||||
Response("21211420110400010D1A000000000000", 0x11, 0xFF, 0x83B5, "21"),
|
||||
Response("22220840660402010700000000020000", 0x11, 0xFF, 0x83B5, "22"),
|
||||
Response("30198E3EB80600000001000000000000", 0x11, 0xFF, 0x83B5, "30"),
|
||||
Response("31811119511A40000002000000000000", 0x11, 0xFF, 0x83B5, "31"),
|
||||
Response("32112C46EA1E40000003000000000000", 0x11, 0xFF, 0x83B5, "32"),
|
||||
Response("400B4D58204D61737465722033000000", 0x11, 0xFF, 0x83B5, "40"),
|
||||
Response("41044B35323020202020202020202020", 0x11, 0xFF, 0x83B5, "41"),
|
||||
Response("42054372616674000000000000000000", 0x11, 0xFF, 0x83B5, "42"),
|
||||
Response("012411", 0x11, 0xFF, 0x81F1, "01"),
|
||||
Response("020036", 0x11, 0xFF, 0x81F1, "02"),
|
||||
Response("03AAAC", 0x11, 0xFF, 0x81F1, "03"),
|
||||
Response("040209", 0x11, 0xFF, 0x81F1, "04"),
|
||||
hidpp.Response("000000", 0x8003, "FF"),
|
||||
hidpp.Response("000300", 0x8102),
|
||||
hidpp.Response("0316CC9CB40506220000000000000000", 0x83B5, "03"),
|
||||
hidpp.Response("20200840820402020700000000000000", 0x83B5, "20"),
|
||||
hidpp.Response("21211420110400010D1A000000000000", 0x83B5, "21"),
|
||||
hidpp.Response("22220840660402010700000000020000", 0x83B5, "22"),
|
||||
hidpp.Response("30198E3EB80600000001000000000000", 0x83B5, "30"),
|
||||
hidpp.Response("31811119511A40000002000000000000", 0x83B5, "31"),
|
||||
hidpp.Response("32112C46EA1E40000003000000000000", 0x83B5, "32"),
|
||||
hidpp.Response("400B4D58204D61737465722033000000", 0x83B5, "40"),
|
||||
hidpp.Response("41044B35323020202020202020202020", 0x83B5, "41"),
|
||||
hidpp.Response("42054372616674000000000000000000", 0x83B5, "42"),
|
||||
hidpp.Response("012411", 0x81F1, "01"),
|
||||
hidpp.Response("020036", 0x81F1, "02"),
|
||||
hidpp.Response("03AAAC", 0x81F1, "03"),
|
||||
hidpp.Response("040209", 0x81F1, "04"),
|
||||
]
|
||||
responses_c534 = [
|
||||
Response("000000", 0x12, 0xFF, 0x8003, "FF"),
|
||||
Response("000209", 0x12, 0xFF, 0x8102),
|
||||
Response("0316CC9CB40502220000000000000000", 0x12, 0xFF, 0x83B5, "03"),
|
||||
Response("00000445AB", 0x12, 0xFF, 0x83B5, "04"),
|
||||
hidpp.Response("000000", 0x8003, "FF", handle=0x12),
|
||||
hidpp.Response("000209", 0x8102, handle=0x12),
|
||||
hidpp.Response("0316CC9CB40502220000000000000000", 0x83B5, "03", handle=0x12),
|
||||
hidpp.Response("00000445AB", 0x83B5, "04", handle=0x12),
|
||||
]
|
||||
responses_unusual = [
|
||||
Response("000000", 0x13, 0xFF, 0x8003, "FF"),
|
||||
Response("000300", 0x13, 0xFF, 0x8102),
|
||||
Response("00000445AB", 0x13, 0xFF, 0x83B5, "04"),
|
||||
Response("0326CC9CB40508220000000000000000", 0x13, 0xFF, 0x83B5, "03"),
|
||||
hidpp.Response("000000", 0x8003, "FF", handle=0x13),
|
||||
hidpp.Response("000300", 0x8102, handle=0x13),
|
||||
hidpp.Response("00000445AB", 0x83B5, "04", handle=0x13),
|
||||
hidpp.Response("0326CC9CB40508220000000000000000", 0x83B5, "03", handle=0x13),
|
||||
]
|
||||
responses_lacking = [
|
||||
Response("000000", 0x14, 0xFF, 0x8003, "FF"),
|
||||
Response("000300", 0x14, 0xFF, 0x8102),
|
||||
hidpp.Response("000000", 0x8003, "FF", handle=0x14),
|
||||
hidpp.Response("000300", 0x8102, handle=0x14),
|
||||
]
|
||||
|
||||
mouse_info = {
|
||||
|
@ -133,8 +110,8 @@ c534_info = {"kind": common.NamedInt(0, "unknown"), "polling": "", "power_switch
|
|||
],
|
||||
)
|
||||
def test_ReceiverFactory_create_receiver(device_info, responses, handle, serial, max_devices, mock_base):
|
||||
mock_base[0].side_effect = open_path
|
||||
mock_base[1].side_effect = partial(request, responses)
|
||||
mock_base[0].side_effect = hidpp.open_path
|
||||
mock_base[1].side_effect = partial(hidpp.request, responses)
|
||||
|
||||
r = receiver.ReceiverFactory.create_receiver(device_info, lambda x: x)
|
||||
|
||||
|
@ -155,8 +132,8 @@ def test_ReceiverFactory_create_receiver(device_info, responses, handle, serial,
|
|||
],
|
||||
)
|
||||
def test_ReceiverFactory_props(device_info, responses, firmware, codename, remaining_pairings, pairing_info, count, mock_base):
|
||||
mock_base[0].side_effect = open_path
|
||||
mock_base[1].side_effect = partial(request, responses)
|
||||
mock_base[0].side_effect = hidpp.open_path
|
||||
mock_base[1].side_effect = partial(hidpp.request, responses)
|
||||
|
||||
r = receiver.ReceiverFactory.create_receiver(device_info, lambda x: x)
|
||||
|
||||
|
@ -176,8 +153,8 @@ def test_ReceiverFactory_props(device_info, responses, firmware, codename, remai
|
|||
],
|
||||
)
|
||||
def test_ReceiverFactory_string(device_info, responses, status_str, strng, mock_base):
|
||||
mock_base[0].side_effect = open_path
|
||||
mock_base[1].side_effect = partial(request, responses)
|
||||
mock_base[0].side_effect = hidpp.open_path
|
||||
mock_base[1].side_effect = partial(hidpp.request, responses)
|
||||
|
||||
r = receiver.ReceiverFactory.create_receiver(device_info, lambda x: x)
|
||||
|
||||
|
@ -193,8 +170,8 @@ def test_ReceiverFactory_string(device_info, responses, status_str, strng, mock_
|
|||
],
|
||||
)
|
||||
def test_ReceiverFactory_nodevice(device_info, responses, mock_base):
|
||||
mock_base[0].side_effect = open_path
|
||||
mock_base[1].side_effect = partial(request, responses)
|
||||
mock_base[0].side_effect = hidpp.open_path
|
||||
mock_base[1].side_effect = partial(hidpp.request, responses)
|
||||
|
||||
r = receiver.ReceiverFactory.create_receiver(device_info, lambda x: x)
|
||||
|
||||
|
|
Loading…
Reference in New Issue