From 872089883c72574d182bd7c2dbbf297f39879c88 Mon Sep 17 00:00:00 2001 From: Bastien Nocera Date: Mon, 20 Jan 2020 17:26:24 +0100 Subject: [PATCH] tests: Add scripting capabilities to the verification process Add scripting capabilities to the verification process so that the mock daemon can send its own results without needing the client to prod it to do that. This is incredibly useful when the client is single threaded and blocking. Note that there are barely any safeguards, so the scripting task is not cancelled if an error occurs, or the VerifyStatus signals are sent out of order. --- tests/dbusmock/fprintd.py | 29 +++++++++++++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/tests/dbusmock/fprintd.py b/tests/dbusmock/fprintd.py index 2052d7f..8349dde 100644 --- a/tests/dbusmock/fprintd.py +++ b/tests/dbusmock/fprintd.py @@ -19,6 +19,7 @@ __copyright__ = '(c) 2020 Red Hat Inc.' __license__ = 'LGPL 3+' import dbus +import asyncio from dbusmock import MOCK_IFACE, mockobject @@ -77,6 +78,7 @@ def load(mock, parameters): fprintd = mockobject.objects[MAIN_OBJ] mock.last_device_id = 0 fprintd.fingers = {} + mock.loop = asyncio.new_event_loop() @dbus.service.method(MAIN_IFACE, in_signature='', out_signature='ao') @@ -142,6 +144,7 @@ def AddDevice(self, device_name, num_enroll_stages, scan_type): device.fingers = {} device.claimed_user = None device.action = None + device.verify_script = [] return path @@ -195,6 +198,14 @@ def can_verify_finger(device, finger_name): return True return False +async def send_verify_script(device, script): + for [result, done, timeout] in device.verify_script: + await asyncio.sleep(timeout) + device.EmitSignal(DEVICE_IFACE, 'VerifyStatus', 'sb', [ + result, + done + ]) + @dbus.service.method(DEVICE_IFACE, in_signature='s', out_signature='') def VerifyStart(device, finger_name): @@ -226,6 +237,10 @@ def VerifyStart(device, finger_name): finger_name ]) + if device.verify_script is not None and len(device.verify_script) > 0: + asyncio.run(send_verify_script(device, device.verify_script)) + + @dbus.service.method(DEVICE_MOCK_IFACE, in_signature='sb', out_signature='') def EmitVerifyStatus(device, result, done): @@ -318,3 +333,17 @@ def SetEnrolledFingers(device, user, fingers): device.fingers[user] = fingers +@dbus.service.method(DEVICE_MOCK_IFACE, + in_signature='a(sbi)', out_signature='') +def SetVerifyScript(device, script): + '''Convenience method to set the verification script. + + After VerifyStart is called, signal results will be sent in order after + a certain timeout declared in seconds. The array contains each + 'result' followed by the 'done' argument for VerifyStatus, and the + amount of time to wait before each signal is sent. + + Returns nothing. + ''' + + device.verify_script = script