From 5acf13cf51f92f731f0242dbea21878496c190a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 22 Jan 2021 19:16:12 +0100 Subject: [PATCH] tests/fprintd: Ensure that all the methods can be called concurrently As per GDBus we can now get async calls (from the same client) happening while we're still processing a previous request, so we need to ensure that we react properly. --- tests/fprintd.py | 89 ++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) diff --git a/tests/fprintd.py b/tests/fprintd.py index b9908b6..8718ff8 100755 --- a/tests/fprintd.py +++ b/tests/fprintd.py @@ -1172,6 +1172,15 @@ class FPrintdVirtualDeviceTest(FPrintdVirtualDeviceBaseTest): devices = self.manager.GetDevices() self.assertNotIn(self.device.get_object_path(), devices) + def test_concourrent_claim(self): + self.call_device_method_async('Claim', '(s)', ['']) + self.call_device_method_async('Claim', '(s)', ['']) + + with self.assertFprintError('AlreadyInUse'): + self.wait_for_device_reply(expected_replies=2) + + self.assertIn(GLib.Variant('()', ()), self._async_call_res) + class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest): @@ -1720,6 +1729,86 @@ class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest): self.assertFalse(self.finger_needed) self.assertEqual([{'finger-needed': False}], self._changed_properties) + def test_concourrent_enroll_start(self): + self.call_device_method_async('EnrollStart', '(s)', ['left-little-finger']) + self.call_device_method_async('EnrollStart', '(s)', ['left-thumb']) + + with self.assertFprintError('AlreadyInUse'): + self.wait_for_device_reply(expected_replies=2) + + self.assertIn(GLib.Variant('()', ()), self._async_call_res) + + def test_concourrent_verify_start(self): + self.enroll_image('whorl', finger='left-thumb') + self.call_device_method_async('VerifyStart', '(s)', ['any']) + self.call_device_method_async('VerifyStart', '(s)', ['left-thumb']) + + with self.assertFprintError('AlreadyInUse'): + self.wait_for_device_reply(expected_replies=2) + + self.assertIn(GLib.Variant('()', ()), self._async_call_res) + + def test_concourrent_list_enrolled_fingers(self): + self.enroll_image('whorl') + self.call_device_method_async('ListEnrolledFingers', '(s)', ['testuser']) + self.call_device_method_async('ListEnrolledFingers', '(s)', ['testuser']) + + # No failure is expected here since it's all sync + self.wait_for_device_reply(expected_replies=2) + self.assertEqual([(['right-index-finger'],), (['right-index-finger'],)], + [ f.unpack() for f in self._async_call_res ]) + + def test_concourrent_delete_enrolled_fingers(self): + self.enroll_image('whorl') + self.call_device_method_async('DeleteEnrolledFingers', '(s)', ['testuser']) + self.call_device_method_async('DeleteEnrolledFingers', '(s)', ['testuser']) + + # No failure is expected here since it's all sync + self.wait_for_device_reply(expected_replies=2) + self.assertEqual([GLib.Variant('()', ()), GLib.Variant('()', ())], + self._async_call_res) + + def test_concourrent_delete_enrolled_fingers_unclaimed(self): + self.enroll_image('whorl') + self.device.Release() + self.call_device_method_async('DeleteEnrolledFingers', '(s)', ['testuser']) + self.call_device_method_async('DeleteEnrolledFingers', '(s)', ['testuser']) + + # No failure is expected here since it's all sync + self.wait_for_device_reply(expected_replies=2) + self.assertEqual([GLib.Variant('()', ()), GLib.Variant('()', ())], + self._async_call_res) + + def test_concourrent_delete_enrolled_fingers2(self): + self.enroll_image('whorl') + self.call_device_method_async('DeleteEnrolledFingers2', '()', []) + self.call_device_method_async('DeleteEnrolledFingers2', '()', []) + + # No failure is expected here since it's all sync + self.wait_for_device_reply(expected_replies=2) + self.assertEqual([GLib.Variant('()', ()), GLib.Variant('()', ())], + self._async_call_res) + + def test_concourrent_delete_enrolled_finger(self): + self.enroll_image('whorl', finger='left-thumb') + self.enroll_image('tented_arch', finger='right-thumb') + self.call_device_method_async('DeleteEnrolledFinger', '(s)', ['left-thumb']) + self.call_device_method_async('DeleteEnrolledFinger', '(s)', ['right-thumb']) + + # No failure is expected here since it's all sync + self.wait_for_device_reply(expected_replies=2) + self.assertEqual([GLib.Variant('()', ()), GLib.Variant('()', ())], + self._async_call_res) + + def test_concourrent_release(self): + self.call_device_method_async('Release', '()', []) + self.call_device_method_async('Release', '()', []) + + with self.assertFprintError('AlreadyInUse'): + self.wait_for_device_reply(expected_replies=2) + + self.assertIn(GLib.Variant('()', ()), self._async_call_res) + class FPrintdVirtualDeviceEnrollTests(FPrintdVirtualDeviceBaseTest):