linux: integration-test: test for HID++ mouse with mixed input capabilities

Signed-off-by: Miroslav Šuvada <miroslav.suvada@icloud.com>
This commit is contained in:
Miroslav Šuvada 2026-03-27 10:40:54 +01:00
parent f82c2f9c71
commit ecd2d4eb25
No known key found for this signature in database

View file

@ -4124,7 +4124,14 @@ class Tests(dbusmock.DBusTestCase):
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/input/input22",
parent,
[],
["DEVNAME", "input/mouse3", "ID_INPUT_MOUSE", "1"],
[
"DEVNAME",
"input/mouse3",
"ID_INPUT_MOUSE",
"1",
"ID_INPUT_KEYBOARD",
"1",
],
)
self.testbed.add_device(
@ -4174,6 +4181,388 @@ class Tests(dbusmock.DBusTestCase):
)
self.stop_daemon()
def test_hidpp_mouse_with_keyboard_interface(self):
"""HID++ mouse with extra keyboard interface stays classified as mouse"""
parent = self.testbed.add_device(
"usb", "/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2", None, [], []
)
parent = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009",
parent,
[],
[],
)
dev = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A",
parent,
[],
[],
)
parent = dev
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/input/input22",
parent,
[],
[
"DEVNAME",
"input/mouse3",
"ID_INPUT_MOUSE",
"1",
"ID_INPUT_KEYBOARD",
"1",
],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/input/input23",
parent,
[],
["DEVNAME", "input/event7", "ID_INPUT_KEYBOARD", "1"],
)
self.testbed.add_device(
"power_supply",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/power_supply/hidpp_battery_3",
parent,
[
"type",
"Battery",
"scope",
"Device",
"present",
"1",
"online",
"1",
"status",
"Discharging",
"capacity",
"30",
"serial_number",
"654321",
"model_name",
"Fancy Logitech mouse",
],
[],
)
self.start_daemon()
devs = self.proxy.EnumerateDevices()
self.assertEqual(len(devs), 1)
mousebat0_up = devs[0]
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Model"), "Fancy Logitech mouse"
)
self.assertAlmostEqual(
self.get_dbus_dev_property(mousebat0_up, "Percentage"), 30.0
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "PowerSupply"), False)
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Type"), UP_DEVICE_KIND_MOUSE
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "Serial"), "654321")
self.assertEqual(self.get_dbus_property("OnBattery"), False)
self.assertEqual(
self.get_dbus_display_property("WarningLevel"), UP_DEVICE_LEVEL_NONE
)
self.stop_daemon()
def test_hidpp_mouse_with_keyboard_interface_reverse_discovery(self):
"""HID++ mouse remains a mouse when keyboard sibling appears first"""
parent = self.testbed.add_device(
"usb", "/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2", None, [], []
)
parent = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009",
parent,
[],
[],
)
dev = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A",
parent,
[],
[],
)
parent = dev
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/input/input22",
parent,
[],
["DEVNAME", "input/event7", "ID_INPUT_KEYBOARD", "1"],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/input/input23",
parent,
[],
[
"DEVNAME",
"input/mouse3",
"ID_INPUT_MOUSE",
"1",
"ID_INPUT_KEYBOARD",
"1",
],
)
self.testbed.add_device(
"power_supply",
"/devices/pci0000:00/0000:00:14.0/usb3/3-10/3-10:1.2/0003:046D:C52B.0009/0003:046D:4101.000A/power_supply/hidpp_battery_3",
parent,
[
"type",
"Battery",
"scope",
"Device",
"present",
"1",
"online",
"1",
"status",
"Discharging",
"capacity",
"30",
"serial_number",
"654321",
"model_name",
"Fancy Logitech mouse",
],
[],
)
self.start_daemon()
devs = self.proxy.EnumerateDevices()
self.assertEqual(len(devs), 1)
mousebat0_up = devs[0]
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Model"), "Fancy Logitech mouse"
)
self.assertAlmostEqual(
self.get_dbus_dev_property(mousebat0_up, "Percentage"), 30.0
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "PowerSupply"), False)
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Type"), UP_DEVICE_KIND_MOUSE
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "Serial"), "654321")
self.assertEqual(self.get_dbus_property("OnBattery"), False)
self.assertEqual(
self.get_dbus_display_property("WarningLevel"), UP_DEVICE_LEVEL_NONE
)
self.stop_daemon()
def test_hidpp_receiver_mouse_with_keyboard_interface(self):
"""HID++ receiver mouse with mixed node stays classified as mouse"""
usb_parent = self.testbed.add_device(
"usb",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5",
None,
[],
[],
)
intf = self.testbed.add_device(
"usb",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2",
usb_parent,
[],
[],
)
receiver = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004",
intf,
[],
[],
)
mouse = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006",
receiver,
[],
[],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/input/input72",
mouse,
[],
[
"DEVNAME",
"input/event12",
"ID_INPUT_MOUSE",
"1",
"ID_INPUT_KEYBOARD",
"1",
],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/input/input73",
mouse,
[],
["DEVNAME", "input/event13", "ID_INPUT_KEYBOARD", "1"],
)
self.testbed.add_device(
"power_supply",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/power_supply/hidpp_battery_0",
mouse,
[
"type",
"Battery",
"scope",
"Device",
"present",
"1",
"online",
"1",
"status",
"Discharging",
"capacity",
"69",
"model_name",
"Logitech G502 X PLUS",
],
[],
)
self.start_daemon()
devs = self.proxy.EnumerateDevices()
self.assertEqual(len(devs), 1)
mousebat0_up = devs[0]
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Model"), "Logitech G502 X PLUS"
)
self.assertAlmostEqual(
self.get_dbus_dev_property(mousebat0_up, "Percentage"), 69.0
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "PowerSupply"), False)
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Type"), UP_DEVICE_KIND_MOUSE
)
self.assertEqual(self.get_dbus_property("OnBattery"), False)
self.assertEqual(
self.get_dbus_display_property("WarningLevel"), UP_DEVICE_LEVEL_NONE
)
self.stop_daemon()
def test_hidpp_receiver_mouse_with_keyboard_interface_reverse_discovery(self):
"""HID++ receiver mixed mouse/keyboard remains mouse when keyboard appears first"""
usb_parent = self.testbed.add_device(
"usb",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5",
None,
[],
[],
)
intf = self.testbed.add_device(
"usb",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2",
usb_parent,
[],
[],
)
receiver = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004",
intf,
[],
[],
)
mouse = self.testbed.add_device(
"hid",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006",
receiver,
[],
[],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/input/input73",
mouse,
[],
["DEVNAME", "input/event13", "ID_INPUT_KEYBOARD", "1"],
)
self.testbed.add_device(
"input",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/input/input72",
mouse,
[],
[
"DEVNAME",
"input/event12",
"ID_INPUT_MOUSE",
"1",
"ID_INPUT_KEYBOARD",
"1",
],
)
self.testbed.add_device(
"power_supply",
"/devices/pci0000:00/0000:00:01.2/0000:01:00.0/0000:02:08.0/0000:0d:00.1/usb1/1-5/1-5:1.2/0003:046D:C53A.0004/0003:046D:4099.0006/power_supply/hidpp_battery_0",
mouse,
[
"type",
"Battery",
"scope",
"Device",
"present",
"1",
"online",
"1",
"status",
"Discharging",
"capacity",
"69",
"model_name",
"Logitech G502 X PLUS",
],
[],
)
self.start_daemon()
devs = self.proxy.EnumerateDevices()
self.assertEqual(len(devs), 1)
mousebat0_up = devs[0]
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Model"), "Logitech G502 X PLUS"
)
self.assertAlmostEqual(
self.get_dbus_dev_property(mousebat0_up, "Percentage"), 69.0
)
self.assertEqual(self.get_dbus_dev_property(mousebat0_up, "PowerSupply"), False)
self.assertEqual(
self.get_dbus_dev_property(mousebat0_up, "Type"), UP_DEVICE_KIND_MOUSE
)
self.assertEqual(self.get_dbus_property("OnBattery"), False)
self.assertEqual(
self.get_dbus_display_property("WarningLevel"), UP_DEVICE_LEVEL_NONE
)
self.stop_daemon()
def test_hidpp_two_mouses_unifying_receiver(self):
"""Upower shows wrong model name when a unifying receiver connects two mouses #309"""