diff --git a/meson.build b/meson.build index 3cd23aba..c9e27365 100644 --- a/meson.build +++ b/meson.build @@ -166,6 +166,7 @@ endian_independent_drivers = virtual_drivers + [ 'aes4000', 'egis0570', 'egismoc', + 'egis_etu905', 'elanmoc', 'etes603', 'focaltech_moc', diff --git a/tests/egis_etu905/custom.pcapng b/tests/egis_etu905/custom.pcapng new file mode 100644 index 00000000..f0dd63db Binary files /dev/null and b/tests/egis_etu905/custom.pcapng differ diff --git a/tests/egis_etu905/custom.py b/tests/egis_etu905/custom.py new file mode 100644 index 00000000..a842f26e --- /dev/null +++ b/tests/egis_etu905/custom.py @@ -0,0 +1,109 @@ +#!/usr/bin/python3 +import traceback + +import sys +import gi + +gi.require_version('FPrint', '2.0') +from gi.repository import FPrint, GLib + +# Exit with error on any exception, included those happening in async callbacks +sys.excepthook = lambda *args: (traceback.print_exception(*args), sys.exit(1)) + +ctx = GLib.main_context_default() + +c = FPrint.Context() +c.enumerate() +devices = c.get_devices() + +d = devices[0] +del devices + +assert d.get_driver() == "egis_etu905" +assert not d.has_feature(FPrint.DeviceFeature.CAPTURE) +assert d.has_feature(FPrint.DeviceFeature.IDENTIFY) +assert d.has_feature(FPrint.DeviceFeature.VERIFY) +assert d.has_feature(FPrint.DeviceFeature.STORAGE) +assert d.has_feature(FPrint.DeviceFeature.STORAGE_LIST) +assert d.has_feature(FPrint.DeviceFeature.STORAGE_DELETE) +assert d.has_feature(FPrint.DeviceFeature.STORAGE_CLEAR) + +d.open_sync() + +def enroll_progress(*args): + assert d.get_finger_status() == FPrint.FingerStatusFlags.PRESENT + print("enroll progress stage: " + str(args[1])) + +def identify_done(dev, res): + global identified + identified = True + identify_match, identify_print = dev.identify_finish(res) + print("MATCH FOUND!" if identify_match else "NO MATCH FOUND") + assert identify_match.equal(identify_print) + +# List +print("--- LISTING ---") +stored = d.list_prints_sync() +prints1 = len(stored) +print(f"--- LIST DONE: Found {prints1} prints before enroll---") + +# Enroll +print("--- ENROLLING ---") +template = FPrint.Print.new(d) + +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +p = d.enroll_sync(template, None, enroll_progress, None) +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +print("--- ENROLL DONE ---") +del template + +# List +print("--- LISTING ---") +stored = d.list_prints_sync() +prints2 = len(stored) +print(f"--- LIST DONE: Found {prints2} prints after enroll---") +assert (prints2 - prints1) == 1 + +# Verify +print("--- VERIFYING ---") +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +verify_res, verify_print = d.verify_sync(p) +assert d.get_finger_status() == FPrint.FingerStatusFlags.NONE +print(f"--- VERIFY DONE: Result {verify_res} ---") + +# Identify +print("--- ASYNC IDENTIFYING ---") +identified = False +deserialized_prints = [] +for p in stored: + deserialized_prints.append(FPrint.Print.deserialize(p.serialize())) + assert deserialized_prints[-1].equal(p) + +d.identify(deserialized_prints, callback=identify_done) +del deserialized_prints + +while not identified: + ctx.iteration(True) +print("--- IDENTIFY DONE ---") + +# Delete +print("--- DELETING ---") +p_to_delete = next((sp for sp in stored if sp.equal(p)), None) +if p_to_delete: + d.delete_print_sync(p_to_delete) + print("--- DELETE DONE ---") +del p_to_delete +del p + +# List +print("--- LISTING ---") +stored = d.list_prints_sync() +prints3 = len(stored) +print(f"--- LIST DONE: Found {prints3} prints after deleting---") +assert (prints2 - prints3) == 1 +del stored + +d.close_sync() + +del d +del c diff --git a/tests/egis_etu905/device b/tests/egis_etu905/device new file mode 100644 index 00000000..65912657 --- /dev/null +++ b/tests/egis_etu905/device @@ -0,0 +1,370 @@ +P: /devices/pci0000:00/0000:00:14.0/usb3/3-2/3-2.1 +N: bus/usb/003/050=12010002FF0000407A1CAE0527990102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 +E: BUSNUM=003 +E: CURRENT_TAGS=:snap_cups_ippeveprinter:snap_cups_cupsd: +E: DEVNAME=/dev/bus/usb/003/050 +E: DEVNUM=050 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: ID_BUS=usb +E: ID_MODEL=ETU905Axx-E +E: ID_MODEL_ENC=ETU905Axx-E +E: ID_MODEL_ID=05ae +E: ID_PATH=pci-0000:00:14.0-usb-0:2.1 +E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_2_1 +E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:2.1 +E: ID_REVISION=9927 +E: ID_SERIAL=EGIS_ETU905Axx-E_0A2420PNA357 +E: ID_SERIAL_SHORT=0A2420PNA357 +E: ID_USB_INTERFACES=:ffffff: +E: ID_USB_MODEL=ETU905Axx-E +E: ID_USB_MODEL_ENC=ETU905Axx-E +E: ID_USB_MODEL_ID=05ae +E: ID_USB_REVISION=9927 +E: ID_USB_SERIAL=EGIS_ETU905Axx-E_0A2420PNA357 +E: ID_USB_SERIAL_SHORT=0A2420PNA357 +E: ID_USB_VENDOR=EGIS +E: ID_USB_VENDOR_ENC=EGIS +E: ID_USB_VENDOR_ID=1c7a +E: ID_VENDOR=EGIS +E: ID_VENDOR_ENC=EGIS +E: ID_VENDOR_FROM_DATABASE=LighTuning Technology Inc. +E: ID_VENDOR_ID=1c7a +E: MAJOR=189 +E: MINOR=305 +E: PRODUCT=1c7a/5ae/9927 +E: SUBSYSTEM=usb +E: TAGS=:snap_cups_ippeveprinter:snap_cups_cupsd: +E: TYPE=255/0/0 +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=ff\n +A: bDeviceProtocol=00\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=100mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=9927\n +A: bmAttributes=a0\n +A: busnum=3\n +A: configuration= +H: descriptors=12010002FF0000407A1CAE0527990102030109022700010100A0320904000003FFFFFF00070581024000000705020240000007058303400001 +A: dev=189:305\n +A: devnum=50\n +A: devpath=2.1\n +L: driver=../../../../../../bus/usb/drivers/usb +A: idProduct=05ae\n +A: idVendor=1c7a\n +A: ltm_capable=no\n +A: manufacturer=EGIS\n +A: maxchild=0\n +L: port=../3-2:1.0/3-2-port1 +A: power/active_duration=9509610\n +A: power/async=enabled\n +A: power/autosuspend=2\n +A: power/autosuspend_delay_ms=2000\n +A: power/connected_duration=9509610\n +A: power/control=on\n +A: power/level=on\n +A: power/persist=1\n +A: power/runtime_active_kids=0\n +A: power/runtime_active_time=9509451\n +A: power/runtime_enabled=forbidden\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=0\n +A: power/runtime_usage=1\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=ETU905Axx-E\n +A: quirks=0x0\n +A: removable=removable\n +A: rx_lanes=1\n +A: serial=0A2420PNA357\n +A: speed=12\n +A: tx_lanes=1\n +A: urbnum=4090\n +A: version= 2.00\n + +P: /devices/pci0000:00/0000:00:14.0/usb3/3-2 +N: bus/usb/003/042=1201100209000240DA0B115430610102000109022900010100E0000904000001090001000705810301000C0904000101090002000705810301000C +E: BUSNUM=003 +E: CURRENT_TAGS=:seat:snap_cups_ippeveprinter:snap_cups_cupsd: +E: DEVNAME=/dev/bus/usb/003/042 +E: DEVNUM=042 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: ID_BUS=usb +E: ID_FOR_SEAT=usb-pci-0000_00_14_0-usb-0_2 +E: ID_MODEL=4-Port_USB_2.0_Hub +E: ID_MODEL_ENC=4-Port\x20USB\x202.0\x20Hub +E: ID_MODEL_FROM_DATABASE=RTS5411 Hub +E: ID_MODEL_ID=5411 +E: ID_PATH=pci-0000:00:14.0-usb-0:2 +E: ID_PATH_TAG=pci-0000_00_14_0-usb-0_2 +E: ID_PATH_WITH_USB_REVISION=pci-0000:00:14.0-usbv2-0:2 +E: ID_REVISION=6130 +E: ID_SERIAL=Generic_4-Port_USB_2.0_Hub +E: ID_USB_INTERFACES=:090001:090002: +E: ID_USB_MODEL=4-Port_USB_2.0_Hub +E: ID_USB_MODEL_ENC=4-Port\x20USB\x202.0\x20Hub +E: ID_USB_MODEL_ID=5411 +E: ID_USB_REVISION=6130 +E: ID_USB_SERIAL=Generic_4-Port_USB_2.0_Hub +E: ID_USB_VENDOR=Generic +E: ID_USB_VENDOR_ENC=Generic +E: ID_USB_VENDOR_ID=0bda +E: ID_VENDOR=Generic +E: ID_VENDOR_ENC=Generic +E: ID_VENDOR_FROM_DATABASE=Realtek Semiconductor Corp. +E: ID_VENDOR_ID=0bda +E: MAJOR=189 +E: MINOR=297 +E: PRODUCT=bda/5411/6130 +E: SUBSYSTEM=usb +E: TAGS=:snap_cups_ippeveprinter:seat:snap_cups_cupsd: +E: TYPE=9/0/2 +A: authorized=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=02\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=6130\n +A: bmAttributes=e0\n +H: bos_descriptors=050F2A00030710021EF400000A1003000E00010AFF0314100400F1ADF5EC1150054091EC71CA7101B6A2 +A: busnum=3\n +A: configuration= +H: descriptors=1201100209000240DA0B115430610102000109022900010100E0000904000001090001000705810301000C0904000101090002000705810301000C +A: dev=189:297\n +A: devnum=42\n +A: devpath=2\n +L: driver=../../../../../bus/usb/drivers/usb +L: firmware_node=../../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:11/device:12/device:14 +A: idProduct=5411\n +A: idVendor=0bda\n +A: ltm_capable=no\n +A: manufacturer=Generic\n +A: maxchild=4\n +A: physical_location/dock=no\n +A: physical_location/horizontal_position=left\n +A: physical_location/lid=no\n +A: physical_location/panel=unknown\n +A: physical_location/vertical_position=center\n +L: port=../3-0:1.0/usb3-port2 +A: power/active_duration=19225334\n +A: power/async=enabled\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=19337938\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_kids=1\n +A: power/runtime_active_time=19232222\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=105465\n +A: power/runtime_usage=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=4-Port USB 2.0 Hub\n +A: quirks=0x0\n +A: removable=removable\n +A: rx_lanes=1\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=2268\n +A: version= 2.10\n + +P: /devices/pci0000:00/0000:00:14.0/usb3 +N: bus/usb/003/001=12010002090001406B1D020014060302010109021900010100E0000904000001090000000705810304000C +E: BUSNUM=003 +E: CURRENT_TAGS=:seat:snap_cups_cupsd:snap_cups_ippeveprinter: +E: DEVNAME=/dev/bus/usb/003/001 +E: DEVNUM=001 +E: DEVTYPE=usb_device +E: DRIVER=usb +E: ID_AUTOSUSPEND=1 +E: ID_BUS=usb +E: ID_FOR_SEAT=usb-pci-0000_00_14_0 +E: ID_MODEL=xHCI_Host_Controller +E: ID_MODEL_ENC=xHCI\x20Host\x20Controller +E: ID_MODEL_FROM_DATABASE=2.0 root hub +E: ID_MODEL_ID=0002 +E: ID_PATH=pci-0000:00:14.0 +E: ID_PATH_TAG=pci-0000_00_14_0 +E: ID_REVISION=0614 +E: ID_SERIAL=Linux_6.14.0-37-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 +E: ID_SERIAL_SHORT=0000:00:14.0 +E: ID_USB_INTERFACES=:090000: +E: ID_USB_MODEL=xHCI_Host_Controller +E: ID_USB_MODEL_ENC=xHCI\x20Host\x20Controller +E: ID_USB_MODEL_ID=0002 +E: ID_USB_REVISION=0614 +E: ID_USB_SERIAL=Linux_6.14.0-37-generic_xhci-hcd_xHCI_Host_Controller_0000:00:14.0 +E: ID_USB_SERIAL_SHORT=0000:00:14.0 +E: ID_USB_VENDOR=Linux_6.14.0-37-generic_xhci-hcd +E: ID_USB_VENDOR_ENC=Linux\x206.14.0-37-generic\x20xhci-hcd +E: ID_USB_VENDOR_ID=1d6b +E: ID_VENDOR=Linux_6.14.0-37-generic_xhci-hcd +E: ID_VENDOR_ENC=Linux\x206.14.0-37-generic\x20xhci-hcd +E: ID_VENDOR_FROM_DATABASE=Linux Foundation +E: ID_VENDOR_ID=1d6b +E: MAJOR=189 +E: MINOR=256 +E: PRODUCT=1d6b/2/614 +E: SUBSYSTEM=usb +E: TAGS=:seat:snap_cups_cupsd:snap_cups_ippeveprinter: +E: TYPE=9/0/1 +A: authorized=1\n +A: authorized_default=1\n +A: avoid_reset_quirk=0\n +A: bConfigurationValue=1\n +A: bDeviceClass=09\n +A: bDeviceProtocol=01\n +A: bDeviceSubClass=00\n +A: bMaxPacketSize0=64\n +A: bMaxPower=0mA\n +A: bNumConfigurations=1\n +A: bNumInterfaces= 1\n +A: bcdDevice=0614\n +A: bmAttributes=e0\n +A: busnum=3\n +A: configuration= +H: descriptors=12010002090001406B1D020014060302010109021900010100E0000904000001090000000705810304000C +A: dev=189:256\n +A: devnum=1\n +A: devpath=0\n +L: driver=../../../../bus/usb/drivers/usb +L: firmware_node=../../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:11/device:12 +A: idProduct=0002\n +A: idVendor=1d6b\n +A: interface_authorized_default=1\n +A: ltm_capable=no\n +A: manufacturer=Linux 6.14.0-37-generic xhci-hcd\n +A: maxchild=12\n +A: power/active_duration=1686863185\n +A: power/async=enabled\n +A: power/autosuspend=0\n +A: power/autosuspend_delay_ms=0\n +A: power/connected_duration=1686928088\n +A: power/control=auto\n +A: power/level=auto\n +A: power/runtime_active_kids=5\n +A: power/runtime_active_time=1686894465\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=3910\n +A: power/runtime_usage=0\n +A: power/wakeup=disabled\n +A: power/wakeup_abort_count=\n +A: power/wakeup_active=\n +A: power/wakeup_active_count=\n +A: power/wakeup_count=\n +A: power/wakeup_expire_count=\n +A: power/wakeup_last_time_ms=\n +A: power/wakeup_max_time_ms=\n +A: power/wakeup_total_time_ms=\n +A: product=xHCI Host Controller\n +A: quirks=0x0\n +A: removable=unknown\n +A: rx_lanes=1\n +A: serial=0000:00:14.0\n +A: speed=480\n +A: tx_lanes=1\n +A: urbnum=897487\n +A: version= 2.00\n + +P: /devices/pci0000:00/0000:00:14.0 +E: DRIVER=xhci_hcd +E: ID_MODEL_FROM_DATABASE=Meteor Lake-P USB 3.2 Gen 2x1 xHCI Host Controller +E: ID_PATH=pci-0000:00:14.0 +E: ID_PATH_TAG=pci-0000_00_14_0 +E: ID_PCI_CLASS_FROM_DATABASE=Serial bus controller +E: ID_PCI_INTERFACE_FROM_DATABASE=XHCI +E: ID_PCI_SUBCLASS_FROM_DATABASE=USB controller +E: ID_VENDOR_FROM_DATABASE=Intel Corporation +E: MODALIAS=pci:v00008086d00007E7Dsv00001028sd00000CB2bc0Csc03i30 +E: PCI_CLASS=C0330 +E: PCI_ID=8086:7E7D +E: PCI_SLOT_NAME=0000:00:14.0 +E: PCI_SUBSYS_ID=1028:0CB2 +E: SUBSYSTEM=pci +A: ari_enabled=0\n +A: broken_parity_status=0\n +A: class=0x0c0330\n +H: config=86807D7E060490022030030C1000800004002A195000000000000000000000000000000000000000000000002810B20C000000007000000000000000FF010000FD0134C08FC2FF8300000000000000003F6DDE0F000000000000000000000000326000000000000000000000000000000180C3C10800000000000000000000000590B7001804E0FE000000000000000009B014F01000400100000000C10A080000080E00001800008F50020000030000090000018680C00009001014000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000F200012000000 +A: consistent_dma_mask_bits=64\n +A: d3cold_allowed=1\n +A: dbc=disabled\n +A: dbc_bInterfaceProtocol=01\n +A: dbc_bcdDevice=0010\n +A: dbc_idProduct=0010\n +A: dbc_idVendor=1d6b\n +A: dbc_poll_interval_ms=64\n +A: device=0x7e7d\n +A: dma_mask_bits=64\n +L: driver=../../../bus/pci/drivers/xhci_hcd +A: driver_override=(null)\n +A: enable=1\n +L: firmware_node=../../LNXSYSTM:00/LNXSYBUS:00/PNP0A08:00/device:11 +L: iommu=../../virtual/iommu/dmar1 +L: iommu_group=../../../kernel/iommu_groups/11 +A: irq=133\n +A: local_cpulist=0-13\n +A: local_cpus=3fff\n +A: modalias=pci:v00008086d00007E7Dsv00001028sd00000CB2bc0Csc03i30\n +A: msi_bus=1\n +A: msi_irqs/133=msi\n +A: msi_irqs/134=msi\n +A: msi_irqs/135=msi\n +A: msi_irqs/136=msi\n +A: msi_irqs/137=msi\n +A: msi_irqs/138=msi\n +A: msi_irqs/139=msi\n +A: msi_irqs/140=msi\n +A: numa_node=-1\n +A: pools=poolinfo - 0.1\nbuffer-2048 0 0 2048 0\nbuffer-512 0 0 512 0\nbuffer-128 0 0 128 0\nbuffer-32 0 0 32 0\nxHCI 1KB stream ctx arrays 0 0 1024 0\nxHCI 256 byte stream ctx arrays 0 0 256 0\nxHCI input/output contexts 22 23 2112 23\nxHCI ring segments 75 75 4096 75\nbuffer-2048 0 0 2048 0\nbuffer-512 3 8 512 1\nbuffer-128 18 32 128 1\nbuffer-32 0 0 32 0\n +A: power/async=enabled\n +A: power/control=auto\n +A: power/runtime_active_kids=2\n +A: power/runtime_active_time=1686895728\n +A: power/runtime_enabled=enabled\n +A: power/runtime_status=active\n +A: power/runtime_suspended_time=2967\n +A: power/runtime_usage=0\n +A: power/wakeup=enabled\n +A: power/wakeup_abort_count=0\n +A: power/wakeup_active=0\n +A: power/wakeup_active_count=0\n +A: power/wakeup_count=0\n +A: power/wakeup_expire_count=0\n +A: power/wakeup_last_time_ms=0\n +A: power/wakeup_max_time_ms=0\n +A: power/wakeup_total_time_ms=0\n +A: power_state=D0\n +A: resource=0x00000050192a0000 0x00000050192affff 0x0000000000140204\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n0x0000000000000000 0x0000000000000000 0x0000000000000000\n +A: revision=0x20\n +A: subsystem_device=0x0cb2\n +A: subsystem_vendor=0x1028\n +A: vendor=0x8086\n + diff --git a/tests/meson.build b/tests/meson.build index 07c924be..b6e8bf95 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -52,6 +52,7 @@ drivers_tests = [ 'nb1010', 'egis0570', 'egismoc', + 'egis_etu905', 'egismoc-05a1', 'egismoc-0586', 'egismoc-0587',