Blame tests/fprintd.py

Packit Service f1aff6
#! /usr/bin/env python3
Packit Service f1aff6
# Copyright © 2017, 2019 Red Hat, Inc
Packit Service 8ebd8e
# Copyright © 2020 Canonical Ltd
Packit Service f1aff6
#
Packit Service f1aff6
# This program is free software; you can redistribute it and/or
Packit Service f1aff6
# modify it under the terms of the GNU Lesser General Public
Packit Service f1aff6
# License as published by the Free Software Foundation; either
Packit Service f1aff6
# version 2.1 of the License, or (at your option) any later version.
Packit Service f1aff6
#
Packit Service f1aff6
# This program is distributed in the hope that it will be useful,
Packit Service f1aff6
# but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service f1aff6
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
Packit Service f1aff6
# Lesser General Public License for more details.
Packit Service f1aff6
#
Packit Service f1aff6
# You should have received a copy of the GNU Lesser General Public
Packit Service f1aff6
# License along with this library. If not, see <http://www.gnu.org/licenses/>.
Packit Service f1aff6
# Authors:
Packit Service f1aff6
#       Christian J. Kellner <christian@kellner.me>
Packit Service f1aff6
#       Benjamin Berg <bberg@redhat.com>
Packit Service 8ebd8e
#       Marco Trevisan <marco.trevisan@canonical.com>
Packit Service f1aff6
Packit Service f1aff6
import unittest
Packit Service f1aff6
import time
Packit Service f1aff6
import subprocess
Packit Service f1aff6
import os
Packit Service f1aff6
import os.path
Packit Service f1aff6
import sys
Packit Service f1aff6
import tempfile
Packit Service f1aff6
import glob
Packit Service 8ebd8e
import pwd
Packit Service f1aff6
import shutil
Packit Service f1aff6
import socket
Packit Service f1aff6
import struct
Packit Service f1aff6
import dbusmock
Packit Service f1aff6
import gi
Packit Service 8ebd8e
gi.require_version('FPrint', '2.0')
Packit Service 8ebd8e
from gi.repository import GLib, Gio, FPrint
Packit Service f1aff6
import cairo
Packit Service f1aff6
Packit Service f1aff6
try:
Packit Service f1aff6
    from subprocess import DEVNULL
Packit Service f1aff6
except ImportError:
Packit Service f1aff6
    DEVNULL = open(os.devnull, 'wb')
Packit Service f1aff6
Packit Service f1aff6
SERVICE_FILE = '/usr/share/dbus-1/system-services/net.reactivated.Fprint.service'
Packit Service f1aff6
Packit Service f1aff6
def get_timeout(topic='default'):
Packit Service f1aff6
    vals = {
Packit Service f1aff6
        'valgrind': {
Packit Service f1aff6
            'test': 300,
Packit Service f1aff6
            'default': 20,
Packit Service f1aff6
            'daemon_start': 60
Packit Service f1aff6
        },
Packit Service 8ebd8e
        'asan': {
Packit Service 8ebd8e
            'test': 120,
Packit Service 8ebd8e
            'default': 6,
Packit Service 8ebd8e
            'daemon_start': 10
Packit Service 8ebd8e
        },
Packit Service f1aff6
        'default': {
Packit Service f1aff6
            'test': 60,
Packit Service f1aff6
            'default': 3,
Packit Service f1aff6
            'daemon_start': 5
Packit Service f1aff6
        }
Packit Service f1aff6
    }
Packit Service f1aff6
Packit Service 8ebd8e
    if os.getenv('VALGRIND') is not None:
Packit Service 8ebd8e
        lut = vals['valgrind']
Packit Service 8ebd8e
    elif os.getenv('ADDRESS_SANITIZER') is not None:
Packit Service 8ebd8e
        lut = vals['asan']
Packit Service 8ebd8e
    else:
Packit Service 8ebd8e
        lut = vals['default']
Packit Service 8ebd8e
Packit Service f1aff6
    if topic not in lut:
Packit Service f1aff6
        raise ValueError('invalid topic')
Packit Service f1aff6
    return lut[topic]
Packit Service f1aff6
Packit Service f1aff6
Packit Service f1aff6
# Copied from libfprint tests
Packit Service f1aff6
class Connection:
Packit Service f1aff6
Packit Service f1aff6
    def __init__(self, addr):
Packit Service f1aff6
        self.addr = addr
Packit Service f1aff6
Packit Service f1aff6
    def __enter__(self):
Packit Service f1aff6
        self.con = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
Packit Service f1aff6
        self.con.connect(self.addr)
Packit Service f1aff6
        return self.con
Packit Service f1aff6
Packit Service f1aff6
    def __exit__(self, exc_type, exc_val, exc_tb):
Packit Service f1aff6
        self.con.close()
Packit Service f1aff6
        del self.con
Packit Service f1aff6
Packit Service f1aff6
def load_image(img):
Packit Service f1aff6
    png = cairo.ImageSurface.create_from_png(img)
Packit Service f1aff6
Packit Service f1aff6
    # Cairo wants 4 byte aligned rows, so just add a few pixel if necessary
Packit Service f1aff6
    w = png.get_width()
Packit Service f1aff6
    h = png.get_height()
Packit Service f1aff6
    w = (w + 3) // 4 * 4
Packit Service f1aff6
    h = (h + 3) // 4 * 4
Packit Service f1aff6
    img = cairo.ImageSurface(cairo.Format.A8, w, h)
Packit Service f1aff6
    cr = cairo.Context(img)
Packit Service f1aff6
Packit Service f1aff6
    cr.set_source_rgba(1, 1, 1, 1)
Packit Service f1aff6
    cr.paint()
Packit Service f1aff6
Packit Service f1aff6
    cr.set_source_rgba(0, 0, 0, 0)
Packit Service f1aff6
    cr.set_operator(cairo.OPERATOR_SOURCE)
Packit Service f1aff6
Packit Service f1aff6
    cr.set_source_surface(png)
Packit Service f1aff6
    cr.paint()
Packit Service f1aff6
Packit Service f1aff6
    return img
Packit Service f1aff6
Packit Service f1aff6
if hasattr(os.environ, 'TOPSRCDIR'):
Packit Service f1aff6
    root = os.environ['TOPSRCDIR']
Packit Service f1aff6
else:
Packit Service f1aff6
    root = os.path.join(os.path.dirname(__file__), '..')
Packit Service f1aff6
Packit Service f1aff6
imgdir = os.path.join(root, 'tests', 'prints')
Packit Service f1aff6
Packit Service f1aff6
ctx = GLib.main_context_default()
Packit Service f1aff6
Packit Service f1aff6
class FPrintdTest(dbusmock.DBusTestCase):
Packit Service f1aff6
Packit Service f1aff6
    @staticmethod
Packit Service f1aff6
    def path_from_service_file(sf):
Packit Service f1aff6
        with open(SERVICE_FILE) as f:
Packit Service f1aff6
                for line in f:
Packit Service f1aff6
                    if not line.startswith('Exec='):
Packit Service f1aff6
                        continue
Packit Service f1aff6
                    return line.split('=', 1)[1].strip()
Packit Service f1aff6
        return None
Packit Service f1aff6
Packit Service f1aff6
    @classmethod
Packit Service f1aff6
    def setUpClass(cls):
Packit Service 8ebd8e
        super().setUpClass()
Packit Service f1aff6
        fprintd = None
Packit Service 8ebd8e
        cls._polkitd = None
Packit Service 8ebd8e
Packit Service 8ebd8e
        cls._has_hotplug = FPrint.Device.find_property("removed") is not None
Packit Service f1aff6
Packit Service f1aff6
        if 'FPRINT_BUILD_DIR' in os.environ:
Packit Service f1aff6
            print('Testing local build')
Packit Service f1aff6
            build_dir = os.environ['FPRINT_BUILD_DIR']
Packit Service f1aff6
            fprintd = os.path.join(build_dir, 'fprintd')
Packit Service f1aff6
        elif 'UNDER_JHBUILD' in os.environ:
Packit Service f1aff6
            print('Testing JHBuild version')
Packit Service f1aff6
            jhbuild_prefix = os.environ['JHBUILD_PREFIX']
Packit Service f1aff6
            fprintd = os.path.join(jhbuild_prefix, 'libexec', 'fprintd')
Packit Service f1aff6
        else:
Packit Service f1aff6
            print('Testing installed system binaries')
Packit Service f1aff6
            fprintd = cls.path_from_service_file(SERVICE_FILE)
Packit Service f1aff6
Packit Service f1aff6
        assert fprintd is not None, 'failed to find daemon'
Packit Service f1aff6
        cls.paths = {'daemon': fprintd }
Packit Service f1aff6
Packit Service f1aff6
Packit Service f1aff6
        cls.tmpdir = tempfile.mkdtemp(prefix='libfprint-')
Packit Service f1aff6
Packit Service f1aff6
        cls.sockaddr = os.path.join(cls.tmpdir, 'virtual-image.socket')
Packit Service f1aff6
        os.environ['FP_VIRTUAL_IMAGE'] = cls.sockaddr
Packit Service f1aff6
Packit Service f1aff6
        cls.prints = {}
Packit Service f1aff6
        for f in glob.glob(os.path.join(imgdir, '*.png')):
Packit Service f1aff6
            n = os.path.basename(f)[:-4]
Packit Service f1aff6
            cls.prints[n] = load_image(f)
Packit Service f1aff6
Packit Service f1aff6
Packit Service f1aff6
        cls.test_bus = Gio.TestDBus.new(Gio.TestDBusFlags.NONE)
Packit Service f1aff6
        cls.test_bus.up()
Packit Service 8ebd8e
        cls.test_bus.unset()
Packit Service 8ebd8e
        addr = cls.test_bus.get_bus_address()
Packit Service 8ebd8e
        os.environ['DBUS_SYSTEM_BUS_ADDRESS'] = addr
Packit Service 8ebd8e
        cls.dbus = Gio.DBusConnection.new_for_address_sync(addr,
Packit Service 8ebd8e
            Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION |
Packit Service 8ebd8e
            Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT, None, None)
Packit Service 8ebd8e
        assert cls.dbus.is_closed() == False
Packit Service f1aff6
Packit Service f1aff6
    @classmethod
Packit Service f1aff6
    def tearDownClass(cls):
Packit Service 8ebd8e
        cls.dbus.close()
Packit Service f1aff6
        cls.test_bus.down()
Packit Service 8ebd8e
        del cls.dbus
Packit Service 8ebd8e
        del cls.test_bus
Packit Service f1aff6
        shutil.rmtree(cls.tmpdir)
Packit Service f1aff6
        dbusmock.DBusTestCase.tearDownClass()
Packit Service f1aff6
Packit Service f1aff6
Packit Service f1aff6
    def daemon_start(self):
Packit Service f1aff6
        timeout = get_timeout('daemon_start')  # seconds
Packit Service f1aff6
        env = os.environ.copy()
Packit Service f1aff6
        env['G_DEBUG'] = 'fatal-criticals'
Packit Service 8ebd8e
        env['STATE_DIRECTORY'] = (self.state_dir + ':' + '/hopefully/a/state_dir_path/that/shouldnt/be/writable')
Packit Service f1aff6
        env['RUNTIME_DIRECTORY'] = self.run_dir
Packit Service f1aff6
Packit Service f1aff6
        argv = [self.paths['daemon'], '-t']
Packit Service f1aff6
        valgrind = os.getenv('VALGRIND')
Packit Service f1aff6
        if valgrind is not None:
Packit Service f1aff6
            argv.insert(0, 'valgrind')
Packit Service f1aff6
            argv.insert(1, '--leak-check=full')
Packit Service f1aff6
            if os.path.exists(valgrind):
Packit Service f1aff6
                argv.insert(2, '--suppressions=%s' % valgrind)
Packit Service f1aff6
            self.valgrind = True
Packit Service f1aff6
        self.daemon = subprocess.Popen(argv,
Packit Service f1aff6
                                       env=env,
Packit Service f1aff6
                                       stdout=None,
Packit Service f1aff6
                                       stderr=subprocess.STDOUT)
Packit Service 8ebd8e
        self.addCleanup(self.daemon_stop)
Packit Service f1aff6
Packit Service f1aff6
        timeout_count = timeout * 10
Packit Service f1aff6
        timeout_sleep = 0.1
Packit Service f1aff6
        while timeout_count > 0:
Packit Service f1aff6
            time.sleep(timeout_sleep)
Packit Service f1aff6
            timeout_count -= 1
Packit Service f1aff6
            try:
Packit Service f1aff6
                self.manager = Gio.DBusProxy.new_sync(self.dbus,
Packit Service f1aff6
                                                      Gio.DBusProxyFlags.DO_NOT_AUTO_START,
Packit Service f1aff6
                                                      None,
Packit Service f1aff6
                                                      'net.reactivated.Fprint',
Packit Service f1aff6
                                                      '/net/reactivated/Fprint/Manager',
Packit Service f1aff6
                                                      'net.reactivated.Fprint.Manager',
Packit Service f1aff6
                                                      None)
Packit Service f1aff6
Packit Service f1aff6
                devices = self.manager.GetDevices()
Packit Service f1aff6
                # Find the virtual device, just in case it is a local run
Packit Service f1aff6
                # and there is another usable sensor available locally
Packit Service f1aff6
                for path in devices:
Packit Service f1aff6
                    dev = Gio.DBusProxy.new_sync(self.dbus,
Packit Service f1aff6
                                                 Gio.DBusProxyFlags.DO_NOT_AUTO_START,
Packit Service f1aff6
                                                 None,
Packit Service f1aff6
                                                 'net.reactivated.Fprint',
Packit Service f1aff6
                                                 path,
Packit Service f1aff6
                                                 'net.reactivated.Fprint.Device',
Packit Service f1aff6
                                                 None)
Packit Service f1aff6
Packit Service f1aff6
                    if 'Virtual image device' in str(dev.get_cached_property('name')):
Packit Service f1aff6
                        self.device = dev
Packit Service f1aff6
                        break
Packit Service f1aff6
                else:
Packit Service f1aff6
                    print('Did not find virtual device! Probably libfprint was build without the corresponding driver!')
Packit Service f1aff6
Packit Service f1aff6
                break
Packit Service f1aff6
            except GLib.GError:
Packit Service f1aff6
                pass
Packit Service f1aff6
        else:
Packit Service f1aff6
            timeout_time = timeout * 10 * timeout_sleep
Packit Service f1aff6
            self.fail('daemon did not start in %d seconds' % timeout_time)
Packit Service f1aff6
Packit Service f1aff6
    def daemon_stop(self):
Packit Service f1aff6
Packit Service f1aff6
        if self.daemon:
Packit Service f1aff6
            try:
Packit Service f1aff6
                self.daemon.terminate()
Packit Service f1aff6
            except OSError:
Packit Service f1aff6
                pass
Packit Service 8ebd8e
            self.daemon.wait(timeout=2)
Packit Service 8ebd8e
            self.assertLess(self.daemon.returncode, 128)
Packit Service 8ebd8e
            self.assertGreaterEqual(self.daemon.returncode, 0)
Packit Service f1aff6
Packit Service f1aff6
        self.daemon = None
Packit Service f1aff6
Packit Service f1aff6
    def polkitd_start(self):
Packit Service 8ebd8e
        if self._polkitd:
Packit Service 8ebd8e
            return
Packit Service 8ebd8e
Packit Service 8ebd8e
        if 'POLKITD_MOCK_PATH' in os.environ:
Packit Service 8ebd8e
            polkitd_template = os.path.join(os.getenv('POLKITD_MOCK_PATH'), 'polkitd.py')
Packit Service 8ebd8e
        else:
Packit Service 8ebd8e
            polkitd_template = os.path.join(os.path.dirname(__file__), 'dbusmock/polkitd.py')
Packit Service 8ebd8e
        print ('Using template from %s' % polkitd_template)
Packit Service 8ebd8e
Packit Service f1aff6
        self._polkitd, self._polkitd_obj = self.spawn_server_template(
Packit Service 8ebd8e
            polkitd_template, {}, stdout=subprocess.PIPE)
Packit Service 8ebd8e
Packit Service 8ebd8e
        return self._polkitd
Packit Service f1aff6
Packit Service f1aff6
    def polkitd_stop(self):
Packit Service f1aff6
        if self._polkitd is None:
Packit Service f1aff6
            return
Packit Service f1aff6
        self._polkitd.terminate()
Packit Service f1aff6
        self._polkitd.wait()
Packit Service f1aff6
Packit Service 8ebd8e
    def get_current_user(self):
Packit Service 8ebd8e
        return pwd.getpwuid(os.getuid()).pw_name
Packit Service f1aff6
Packit Service f1aff6
    def setUp(self):
Packit Service f1aff6
        self.test_dir = tempfile.mkdtemp()
Packit Service 8ebd8e
        self.addCleanup(shutil.rmtree, self.test_dir)
Packit Service f1aff6
        self.state_dir = os.path.join(self.test_dir, 'state')
Packit Service f1aff6
        self.run_dir = os.path.join(self.test_dir, 'run')
Packit Service 8ebd8e
        os.environ['FP_DRIVERS_WHITELIST'] = 'virtual_image'
Packit Service f1aff6
Packit Service 8ebd8e
    def assertFprintError(self, fprint_error):
Packit Service 8ebd8e
        return self.assertRaisesRegex(GLib.Error,
Packit Service 8ebd8e
            '.*net\.reactivated\.Fprint\.Error\.{}.*'.format(fprint_error))
Packit Service f1aff6
Packit Service f1aff6
    # From libfprint tests
Packit Service 8ebd8e
    def send_retry(self, retry_error=FPrint.DeviceRetry.TOO_SHORT):
Packit Service f1aff6
        with Connection(self.sockaddr) as con:
Packit Service f1aff6
            con.sendall(struct.pack('ii', -1, retry_error))
Packit Service f1aff6
Packit Service f1aff6
    # From libfprint tests
Packit Service 8ebd8e
    def send_error(self, error=FPrint.DeviceError.GENERAL):
Packit Service 8ebd8e
        with Connection(self.sockaddr) as con:
Packit Service 8ebd8e
            con.sendall(struct.pack('ii', -2, error))
Packit Service 8ebd8e
Packit Service 8ebd8e
    # From libfprint tests
Packit Service 8ebd8e
    def send_remove(self):
Packit Service 8ebd8e
        with Connection(self.sockaddr) as con:
Packit Service 8ebd8e
            con.sendall(struct.pack('ii', -5, 0))
Packit Service 8ebd8e
Packit Service 8ebd8e
    # From libfprint tests
Packit Service f1aff6
    def send_image(self, image):
Packit Service f1aff6
        img = self.prints[image]
Packit Service f1aff6
        with Connection(self.sockaddr) as con:
Packit Service f1aff6
            mem = img.get_data()
Packit Service f1aff6
            mem = mem.tobytes()
Packit Service 8ebd8e
            self.assertEqual(len(mem), img.get_width() * img.get_height())
Packit Service f1aff6
Packit Service f1aff6
            encoded_img = struct.pack('ii', img.get_width(), img.get_height())
Packit Service f1aff6
            encoded_img += mem
Packit Service f1aff6
Packit Service f1aff6
            con.sendall(encoded_img)
Packit Service f1aff6
Packit Service 8ebd8e
    def call_device_method_async(self, method, *args):
Packit Service 8ebd8e
        """ add cancellable... """
Packit Service 8ebd8e
        self.device.call(method, GLib.Variant(*args),
Packit Service 8ebd8e
            Gio.DBusCallFlags.NONE, -1, None, self._method_call_handler)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def _method_call_handler(self, proxy, res):
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            self._async_call_res = proxy.call_finish(res)
Packit Service 8ebd8e
        except Exception as e:
Packit Service 8ebd8e
            self._async_call_res = e
Packit Service 8ebd8e
Packit Service 8ebd8e
    def wait_for_device_reply(self):
Packit Service 8ebd8e
        self._async_call_res = None
Packit Service 8ebd8e
        while not self._async_call_res:
Packit Service 8ebd8e
            ctx.iteration(True)
Packit Service 8ebd8e
Packit Service 8ebd8e
        if isinstance(self._async_call_res, Exception):
Packit Service 8ebd8e
            raise self._async_call_res
Packit Service 8ebd8e
Packit Service 8ebd8e
    def gdbus_device_method_call_process(self, method, args=[]):
Packit Service 8ebd8e
        return subprocess.Popen([
Packit Service 8ebd8e
            'gdbus',
Packit Service 8ebd8e
            'call',
Packit Service 8ebd8e
            '--system',
Packit Service 8ebd8e
            '--dest',
Packit Service 8ebd8e
            self.device.get_name(),
Packit Service 8ebd8e
            '--object-path',
Packit Service 8ebd8e
            self.device.get_object_path(),
Packit Service 8ebd8e
            '--method',
Packit Service 8ebd8e
            '{}.{}'.format(self.device.get_interface_name(), method),
Packit Service 8ebd8e
        ] + args, stderr=subprocess.STDOUT, stdout=subprocess.PIPE)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def call_device_method_from_other_client(self, method, args=[]):
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            proc = self.gdbus_device_method_call_process(method, args)
Packit Service 8ebd8e
            proc.wait(timeout=5)
Packit Service 8ebd8e
            if proc.returncode != 0:
Packit Service 8ebd8e
                raise GLib.GError(proc.stdout.read())
Packit Service 8ebd8e
            return proc.stdout.read()
Packit Service 8ebd8e
        except subprocess.TimeoutExpired as e:
Packit Service 8ebd8e
            raise GLib.GError(e.output)
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdVirtualDeviceBaseTest(FPrintdTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def setUp(self):
Packit Service 8ebd8e
        super().setUp()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.manager = None
Packit Service 8ebd8e
        self.device = None
Packit Service f1aff6
        self.polkitd_start()
Packit Service f1aff6
        self.daemon_start()
Packit Service f1aff6
Packit Service f1aff6
        if self.device is None:
Packit Service f1aff6
            self.skipTest("Need virtual_image device to run the test")
Packit Service f1aff6
Packit Service f1aff6
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername',
Packit Service f1aff6
                                      'net.reactivated.fprint.device.enroll',
Packit Service f1aff6
                                      'net.reactivated.fprint.device.verify'])
Packit Service f1aff6
Packit Service f1aff6
        def signal_cb(proxy, sender, signal, params):
Packit Service f1aff6
            print(signal, params)
Packit Service f1aff6
            if signal == 'EnrollStatus':
Packit Service f1aff6
                self._abort = params[1]
Packit Service f1aff6
                self._last_result = params[0]
Packit Service f1aff6
Packit Service 8ebd8e
                if not self._abort and self._last_result.startswith('enroll-'):
Packit Service 8ebd8e
                    # Exit wait loop, onto next enroll state (if any)
Packit Service 8ebd8e
                    self._abort = True
Packit Service f1aff6
                elif self._abort:
Packit Service f1aff6
                    pass
Packit Service f1aff6
                else:
Packit Service f1aff6
                    self._abort = True
Packit Service f1aff6
                    self._last_result = 'Unexpected signal values'
Packit Service f1aff6
                    print('Unexpected signal values')
Packit Service f1aff6
            elif signal == 'VerifyFingerSelected':
Packit Service f1aff6
                pass
Packit Service f1aff6
            elif signal == 'VerifyStatus':
Packit Service f1aff6
                self._abort = True
Packit Service f1aff6
                self._last_result = params[0]
Packit Service f1aff6
                self._verify_stopped = params[1]
Packit Service f1aff6
            else:
Packit Service f1aff6
                self._abort = True
Packit Service f1aff6
                self._last_result = 'Unexpected signal'
Packit Service f1aff6
Packit Service 8ebd8e
        self.g_signal_id = self.device.connect('g-signal', signal_cb)
Packit Service f1aff6
Packit Service 8ebd8e
    def tearDown(self):
Packit Service 8ebd8e
        self.polkitd_stop()
Packit Service 8ebd8e
        self.device.disconnect(self.g_signal_id)
Packit Service 8ebd8e
        self.device = None
Packit Service 8ebd8e
        self.manager = None
Packit Service f1aff6
Packit Service 8ebd8e
        super().tearDown()
Packit Service f1aff6
Packit Service 8ebd8e
    def wait_for_result(self, expected=None):
Packit Service f1aff6
        self._abort = False
Packit Service f1aff6
        while not self._abort:
Packit Service f1aff6
            ctx.iteration(True)
Packit Service f1aff6
Packit Service 8ebd8e
        self.assertTrue(self._abort)
Packit Service 8ebd8e
        self._abort = False
Packit Service 8ebd8e
Packit Service 8ebd8e
        if expected is not None:
Packit Service 8ebd8e
            self.assertEqual(self._last_result, expected)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def enroll_image(self, img, finger='right-index-finger', expected_result='enroll-completed'):
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', finger)
Packit Service 8ebd8e
Packit Service 8ebd8e
        stages = self.device.get_cached_property('num-enroll-stages').unpack()
Packit Service 8ebd8e
        for stage in range(stages):
Packit Service 8ebd8e
            self.send_image(img)
Packit Service 8ebd8e
            if stage < stages - 1:
Packit Service 8ebd8e
                self.wait_for_result('enroll-stage-passed')
Packit Service 8ebd8e
            else:
Packit Service 8ebd8e
                self.wait_for_result(expected_result)
Packit Service f1aff6
Packit Service f1aff6
        self.device.EnrollStop()
Packit Service 8ebd8e
        self.assertEqual(self._last_result, expected_result)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def enroll_multiple_images(self, images_override={}, return_index=-1):
Packit Service 8ebd8e
        enroll_map = {
Packit Service 8ebd8e
            'left-thumb': 'whorl',
Packit Service 8ebd8e
            'right-index-finger': 'arch',
Packit Service 8ebd8e
            'left-little-finger': 'loop-right',
Packit Service 8ebd8e
        }
Packit Service 8ebd8e
        enroll_map.update(images_override)
Packit Service 8ebd8e
Packit Service 8ebd8e
        for finger, print in enroll_map.items():
Packit Service 8ebd8e
            self.enroll_image(print, finger=finger)
Packit Service 8ebd8e
Packit Service 8ebd8e
        enrolled = self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
        self.assertCountEqual(enroll_map.keys(), enrolled)
Packit Service 8ebd8e
Packit Service 8ebd8e
        if return_index >= 0:
Packit Service 8ebd8e
            return enroll_map[enrolled[return_index]]
Packit Service 8ebd8e
Packit Service 8ebd8e
        return (enrolled, enroll_map)
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdManagerTests(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def setUp(self):
Packit Service 8ebd8e
        super().setUp()
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_manager_get_devices(self):
Packit Service 8ebd8e
        self.assertListEqual(self.manager.GetDevices(),
Packit Service 8ebd8e
            [ self.device.get_object_path() ])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_manager_get_default_device(self):
Packit Service 8ebd8e
        self.assertEqual(self.manager.GetDefaultDevice(),
Packit Service 8ebd8e
            self.device.get_object_path())
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdManagerPreStartTests(FPrintdTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_manager_get_no_devices(self):
Packit Service 8ebd8e
        os.environ['FP_DRIVERS_WHITELIST'] = 'hopefully_no_existing_driver'
Packit Service 8ebd8e
        self.daemon_start()
Packit Service 8ebd8e
        self.assertListEqual(self.manager.GetDevices(), [])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_manager_get_no_default_device(self):
Packit Service 8ebd8e
        os.environ['FP_DRIVERS_WHITELIST'] = 'hopefully_no_existing_driver'
Packit Service 8ebd8e
        self.daemon_start()
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoSuchDevice'):
Packit Service 8ebd8e
            self.manager.GetDefaultDevice()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_manager_get_devices_on_name_appeared(self):
Packit Service 8ebd8e
        self._appeared_name = None
Packit Service 8ebd8e
Packit Service 8ebd8e
        def on_name_appeared(connection, name, name_owner):
Packit Service 8ebd8e
            self._appeared_name = name
Packit Service 8ebd8e
Packit Service 8ebd8e
        def on_name_vanished(connection, name):
Packit Service 8ebd8e
            self._appeared_name = 'NAME_VANISHED'
Packit Service 8ebd8e
Packit Service 8ebd8e
        id = Gio.bus_watch_name_on_connection(self.dbus,
Packit Service 8ebd8e
            'net.reactivated.Fprint', Gio.BusNameWatcherFlags.NONE,
Packit Service 8ebd8e
            on_name_appeared, on_name_vanished)
Packit Service 8ebd8e
        self.addCleanup(Gio.bus_unwatch_name, id)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.daemon_start()
Packit Service 8ebd8e
        while not self._appeared_name:
Packit Service 8ebd8e
            ctx.iteration(True)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(self._appeared_name, 'net.reactivated.Fprint')
Packit Service 8ebd8e
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            appeared_device = self.dbus.call_sync(
Packit Service 8ebd8e
                'net.reactivated.Fprint',
Packit Service 8ebd8e
                '/net/reactivated/Fprint/Manager',
Packit Service 8ebd8e
                'net.reactivated.Fprint.Manager',
Packit Service 8ebd8e
                'GetDefaultDevice', None, None,
Packit Service 8ebd8e
                Gio.DBusCallFlags.NO_AUTO_START, 500, None)
Packit Service 8ebd8e
        except GLib.GError as e:
Packit Service 8ebd8e
            if 'net.reactivated.Fprint.Error.NoSuchDevice' in e.message:
Packit Service 8ebd8e
                self.skipTest("Need virtual_image device to run the test")
Packit Service 8ebd8e
            raise(e)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNotNone(appeared_device)
Packit Service 8ebd8e
        [dev_path] = appeared_device
Packit Service 8ebd8e
        self.assertTrue(dev_path.startswith('/net/reactivated/Fprint/Device/'))
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdVirtualDeviceTest(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_name_property(self):
Packit Service 8ebd8e
        self.assertEqual(self.device.get_cached_property('name').unpack(),
Packit Service 8ebd8e
            'Virtual image device for debugging')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_stages_property(self):
Packit Service 8ebd8e
        self.assertEqual(self.device.get_cached_property('num-enroll-stages').unpack(), 5)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_scan_type(self):
Packit Service 8ebd8e
        self.assertEqual(self.device.get_cached_property('scan-type').unpack(),
Packit Service 8ebd8e
            'swipe')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_allowed_claim_release_enroll(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
                                      'net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_allowed_claim_release_verify(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
                                      'net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_allowed_claim_current_user(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_allowed_list_enrolled_fingers_empty_user(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', ''), ['left-thumb'])
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', self.get_current_user()), ['left-thumb'])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_allowed_list_enrolled_fingers_current_user(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='right-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', ''), ['right-thumb'])
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', self.get_current_user()), ['right-thumb'])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_enroll_with_verify_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.enroll_image('whorl', finger='right-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_delete_with_verify_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_delete2_with_verify_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service f1aff6
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers2()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_verify_with_enroll_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_claim_current_user(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_multiple_claims(self):
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_always_allowed_release(self):
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_release(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_verify_start(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_verify_stop(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_enroll_start(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.EnrollStart('(s)', 'left-index-finger')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_enroll_stop(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.EnrollStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_delete_enrolled_fingers(self):
Packit Service 8ebd8e
        self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_delete_enrolled_fingers2(self):
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers2()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unclaimed_list_enrolled_fingers(self):
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_claim_device_open_fail(self):
Packit Service 8ebd8e
        os.rename(self.tmpdir, self.tmpdir + '-moved')
Packit Service 8ebd8e
        self.addCleanup(os.rename, self.tmpdir + '-moved', self.tmpdir)
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('Internal'):
Packit Service 8ebd8e
            self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_claim_from_other_client_is_released_when_vanished(self):
Packit Service 8ebd8e
        self.call_device_method_from_other_client('Claim', ['testuser'])
Packit Service 8ebd8e
        time.sleep(1)
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_claim_disconnect(self):
Packit Service 8ebd8e
        addr = os.environ['DBUS_SYSTEM_BUS_ADDRESS']
Packit Service 8ebd8e
Packit Service 8ebd8e
        # Get a separat bus connection
Packit Service 8ebd8e
        dbus = Gio.DBusConnection.new_for_address_sync(addr,
Packit Service 8ebd8e
            Gio.DBusConnectionFlags.MESSAGE_BUS_CONNECTION |
Packit Service 8ebd8e
            Gio.DBusConnectionFlags.AUTHENTICATION_CLIENT, None, None)
Packit Service 8ebd8e
        assert dbus.is_closed() == False
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
        dev_path = self.device.get_object_path()
Packit Service 8ebd8e
        dev = Gio.DBusProxy.new_sync(dbus,
Packit Service 8ebd8e
                                     Gio.DBusProxyFlags.DO_NOT_AUTO_START,
Packit Service 8ebd8e
                                     None,
Packit Service 8ebd8e
                                     'net.reactivated.Fprint',
Packit Service 8ebd8e
                                     dev_path,
Packit Service 8ebd8e
                                     'net.reactivated.Fprint.Device',
Packit Service 8ebd8e
                                     None)
Packit Service 8ebd8e
Packit Service 8ebd8e
        def call_done(obj, result, user_data):
Packit Service 8ebd8e
            # Ignore the callback (should be an error)
Packit Service 8ebd8e
            pass
Packit Service 8ebd8e
Packit Service 8ebd8e
        # Do an async call to claim and immediately close
Packit Service 8ebd8e
        dev.Claim('(s)', 'testuser', result_handler=call_done)
Packit Service 8ebd8e
Packit Service 8ebd8e
        # Ensure the call is on the wire, then close immediately
Packit Service 8ebd8e
        dbus.flush_sync()
Packit Service 8ebd8e
        dbus.close_sync()
Packit Service 8ebd8e
Packit Service 8ebd8e
        time.sleep(1)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_removal_during_enroll(self):
Packit Service 8ebd8e
        if not self._has_hotplug:
Packit Service 8ebd8e
            self.skipTest("libfprint is too old for hotplug")
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
                                      'net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'left-index-finger')
Packit Service 8ebd8e
Packit Service 8ebd8e
        # Now remove the device while we are enrolling, which will cause an error
Packit Service 8ebd8e
        self.send_remove()
Packit Service 8ebd8e
        self.wait_for_result(expected='enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
        # The device will still be there now until it is released
Packit Service 8ebd8e
        devices = self.manager.GetDevices()
Packit Service 8ebd8e
        self.assertIn(self.device.get_object_path(), devices)
Packit Service 8ebd8e
        with self.assertFprintError('Internal'):
Packit Service 8ebd8e
            self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        # And now it will be gone
Packit Service 8ebd8e
        devices = self.manager.GetDevices()
Packit Service 8ebd8e
        self.assertNotIn(self.device.get_object_path(), devices)
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdVirtualDeviceClaimedTest(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def setUp(self):
Packit Service 8ebd8e
        super().setUp()
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def tearDown(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            self.device.Release()
Packit Service 8ebd8e
        except GLib.GError as e:
Packit Service 8ebd8e
            if not 'net.reactivated.Fprint.Error.ClaimDevice' in e.message:
Packit Service 8ebd8e
                raise(e)
Packit Service 8ebd8e
        super().tearDown()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_wrong_finger_enroll_start(self):
Packit Service 8ebd8e
        with self.assertFprintError('InvalidFingername'):
Packit Service 8ebd8e
            self.device.EnrollStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_with_no_enrolled_prints(self):
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_verify_list_delete(self):
Packit Service 8ebd8e
        # This test can trigger a race in older libfprint, only run if we have
Packit Service 8ebd8e
        # hotplug support, which coincides with the fixed release.
Packit Service 8ebd8e
        if not self._has_hotplug:
Packit Service 8ebd8e
            self.skipTest("libfprint is too old for hotplug")
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'nottestuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertTrue(os.path.exists(os.path.join(self.state_dir, 'testuser/virtual_image/0/7')))
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'nottestuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', 'testuser'), ['right-index-finger'])
Packit Service f1aff6
Packit Service f1aff6
        # Finger is enrolled, try to verify it
Packit Service f1aff6
        self.device.VerifyStart('(s)', 'any')
Packit Service f1aff6
Packit Service f1aff6
        # Try a wrong print; will stop verification
Packit Service f1aff6
        self.send_image('tented_arch')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-no-match')
Packit Service f1aff6
Packit Service f1aff6
        self.device.VerifyStop()
Packit Service f1aff6
        self.device.VerifyStart('(s)', 'any')
Packit Service f1aff6
Packit Service f1aff6
        # Send a retry error (swipe too short); will not stop verification
Packit Service f1aff6
        self.send_retry()
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertFalse(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-swipe-too-short')
Packit Service f1aff6
Packit Service f1aff6
        # Try the correct print; will stop verification
Packit Service f1aff6
        self.send_image('whorl')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)', 'testuser'), ['right-index-finger'])
Packit Service f1aff6
Packit Service f1aff6
        # And delete the print(s) again
Packit Service f1aff6
        self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service f1aff6
Packit Service 8ebd8e
        self.assertFalse(os.path.exists(os.path.join(self.state_dir, 'testuser/virtual_image/0/7')))
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_delete2(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertTrue(os.path.exists(os.path.join(self.state_dir, 'testuser/virtual_image/0/7')))
Packit Service 8ebd8e
Packit Service 8ebd8e
        # And delete the print(s) again using the new API
Packit Service 8ebd8e
        self.device.DeleteEnrolledFingers2()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertFalse(os.path.exists(os.path.join(self.state_dir, 'testuser/virtual_image/0/7')))
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_invalid_storage_dir(self):
Packit Service 8ebd8e
        # Directory wil not exist yet
Packit Service 8ebd8e
        os.makedirs(self.state_dir, mode=0o500)
Packit Service 8ebd8e
        self.addCleanup(os.chmod, self.state_dir, mode=0o700)
Packit Service 8ebd8e
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            os.open(os.path.join(self.state_dir, "testfile"), os.O_CREAT | os.O_WRONLY)
Packit Service 8ebd8e
            self.skipTest('Permissions aren\'t respected (CI environment?)')
Packit Service 8ebd8e
        except PermissionError:
Packit Service 8ebd8e
            pass
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.enroll_image('whorl', expected_result='enroll-failed')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_invalid_storage_dir(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        os.chmod(self.state_dir, mode=0o000)
Packit Service 8ebd8e
        self.addCleanup(os.chmod, self.state_dir, mode=0o700)
Packit Service f1aff6
Packit Service 8ebd8e
        try:
Packit Service 8ebd8e
            os.open(os.path.join(self.state_dir, "testfile"), os.O_CREAT | os.O_WRONLY)
Packit Service 8ebd8e
            self.skipTest('Permissions aren\'t respected (CI environment?)')
Packit Service 8ebd8e
        except PermissionError:
Packit Service 8ebd8e
            pass
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_stop_cancels(self):
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'left-index-finger')
Packit Service 8ebd8e
        self.device.EnrollStop()
Packit Service 8ebd8e
        self.wait_for_result(expected='enroll-failed')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_stop_cancels(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
        self.wait_for_result(expected='verify-no-match')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_finger_stop_cancels(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_busy_device_release_on_enroll(self):
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'left-index-finger')
Packit Service f1aff6
Packit Service f1aff6
        self.device.Release()
Packit Service 8ebd8e
        self.wait_for_result(expected='enroll-failed')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_busy_device_release_on_verify(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-index-finger')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service f1aff6
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
        self.wait_for_result(expected='verify-no-match')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_busy_device_release_on_verify_finger(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-middle-finger')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-middle-finger')
Packit Service f1aff6
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
        self.wait_for_result(expected='verify-no-match')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_enroll_stop_not_started(self):
Packit Service 8ebd8e
        with self.assertFprintError('NoActionInProgress'):
Packit Service 8ebd8e
            self.device.EnrollStop()
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_stop_not_started(self):
Packit Service 8ebd8e
        with self.assertFprintError('NoActionInProgress'):
Packit Service 8ebd8e
            self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_finger_match(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-thumb')
Packit Service 8ebd8e
        self.send_image('whorl')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_finger_no_match(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-thumb')
Packit Service 8ebd8e
        self.send_image('tented_arch')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-no-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_finger_no_match_restart(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-thumb')
Packit Service 8ebd8e
        self.send_image('tented_arch')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-no-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
        # Immediately starting again after a no-match must work
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-thumb')
Packit Service 8ebd8e
        self.send_image('whorl')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_wrong_finger_match(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'left-toe')
Packit Service f1aff6
        self.send_image('whorl')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_wrong_finger_no_match(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='right-thumb')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'right-toe')
Packit Service 8ebd8e
        self.send_image('tented_arch')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-no-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_any_finger_match(self):
Packit Service 8ebd8e
        second_image = self.enroll_multiple_images(return_index=1)
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
        self.send_image(second_image)
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_any_finger_no_match(self):
Packit Service 8ebd8e
        enrolled, _map = self.enroll_multiple_images()
Packit Service 8ebd8e
        verify_image = 'tented_arch'
Packit Service 8ebd8e
        self.assertNotIn(verify_image, enrolled)
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
        self.send_image(verify_image)
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-no-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_finger_not_enrolled(self):
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'right-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_enroll_start(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.EnrollStart('(s)', 'right-index-finger')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_always_allowed_enroll_stop(self):
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'right-index-finger')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.EnrollStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_verify_start(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_always_allowed_verify_stop(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_list_enrolled_fingers_current_user(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_list_enrolled_fingers(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_list_enrolled_fingers_current_user(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service f1aff6
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', '')
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_delete_enrolled_fingers(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_unallowed_delete_enrolled_fingers2(self):
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([''])
Packit Service 8ebd8e
        with self.assertFprintError('PermissionDenied'):
Packit Service 8ebd8e
            self.device.DeleteEnrolledFingers2()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_delete_enrolled_fingers_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('DeleteEnrolledFingers', ['testuser'])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_release_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('Release')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_start_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('EnrollStart', ['left-index-finger'])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_start_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('VerifyStart', ['any'])
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_start_finger_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('VerifyStart', ['left-thumb'])
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdVirtualDeviceEnrollTests(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def setUp(self):
Packit Service 8ebd8e
        super().setUp()
Packit Service f1aff6
        self._abort = False
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'left-middle-finger')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def tearDown(self):
Packit Service 8ebd8e
        self.device.EnrollStop()
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
        super().tearDown()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def assertEnrollRetry(self, device_error, expected_error):
Packit Service 8ebd8e
        self.send_retry(retry_error=device_error)
Packit Service 8ebd8e
        self.wait_for_result(expected=expected_error)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def assertEnrollError(self, device_error, expected_error):
Packit Service 8ebd8e
        self.send_error(error=device_error)
Packit Service 8ebd8e
        self.wait_for_result(expected=expected_error)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_retry_general(self):
Packit Service 8ebd8e
        self.assertEnrollRetry(FPrint.DeviceRetry.GENERAL, 'enroll-retry-scan')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_retry_too_short(self):
Packit Service 8ebd8e
        self.assertEnrollRetry(FPrint.DeviceRetry.TOO_SHORT, 'enroll-swipe-too-short')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_retry_remove_finger(self):
Packit Service 8ebd8e
        self.assertEnrollRetry(FPrint.DeviceRetry.REMOVE_FINGER, 'enroll-remove-and-retry')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_enroll_retry_center_finger(self):
Packit Service 8ebd8e
        self.assertEnrollRetry(FPrint.DeviceRetry.CENTER_FINGER, 'enroll-finger-not-centered')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_enroll_error_general(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.GENERAL, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_not_supported(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.NOT_SUPPORTED, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_not_open(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.NOT_OPEN, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_already_open(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.ALREADY_OPEN, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_busy(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.BUSY, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_proto(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.PROTO, 'enroll-disconnected')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_data_invalid(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.DATA_INVALID, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_data_not_found(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.DATA_NOT_FOUND, 'enroll-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_error_data_full(self):
Packit Service 8ebd8e
        self.assertEnrollError(FPrint.DeviceError.DATA_FULL, 'enroll-data-full')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_start_during_enroll(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.EnrollStart('(s)', 'left-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_start_during_enroll(self):
Packit Service f1aff6
        self.device.EnrollStop()
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        self.device.EnrollStart('(s)', 'right-thumb')
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', 'any')
Packit Service f1aff6
Packit Service 8ebd8e
    def test_verify_stop_during_enroll(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.VerifyStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_stop_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('EnrollStop')
Packit Service f1aff6
Packit Service f1aff6
Packit Service 8ebd8e
class FPrintdVirtualDeviceVerificationTests(FPrintdVirtualDeviceBaseTest):
Packit Service f1aff6
Packit Service 8ebd8e
    @classmethod
Packit Service 8ebd8e
    def setUpClass(cls):
Packit Service 8ebd8e
        super().setUpClass()
Packit Service 8ebd8e
        cls.enroll_finger = 'left-middle-finger'
Packit Service 8ebd8e
        cls.verify_finger = cls.enroll_finger
Packit Service f1aff6
Packit Service 8ebd8e
    def setUp(self):
Packit Service 8ebd8e
        super().setUp()
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.enroll_image('whorl', finger=self.enroll_finger)
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', self.verify_finger)
Packit Service f1aff6
Packit Service 8ebd8e
    def tearDown(self):
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service f1aff6
        self.device.Release()
Packit Service 8ebd8e
        super().tearDown()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def assertVerifyRetry(self, device_error, expected_error):
Packit Service 8ebd8e
        self.send_retry(retry_error=device_error)
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertFalse(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, expected_error)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def assertVerifyError(self, device_error, expected_error):
Packit Service 8ebd8e
        self.send_error(error=device_error)
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, expected_error)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_retry_general(self):
Packit Service 8ebd8e
        self.assertVerifyRetry(FPrint.DeviceRetry.GENERAL, 'verify-retry-scan')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_retry_too_short(self):
Packit Service 8ebd8e
        self.assertVerifyRetry(FPrint.DeviceRetry.TOO_SHORT, 'verify-swipe-too-short')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_retry_remove_finger(self):
Packit Service 8ebd8e
        self.assertVerifyRetry(FPrint.DeviceRetry.REMOVE_FINGER, 'verify-remove-and-retry')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_retry_center_finger(self):
Packit Service 8ebd8e
        self.assertVerifyRetry(FPrint.DeviceRetry.CENTER_FINGER, 'verify-finger-not-centered')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_general(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.GENERAL, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_not_supported(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.NOT_SUPPORTED, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_not_open(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.NOT_OPEN, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_already_open(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.ALREADY_OPEN, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_busy(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.BUSY, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_proto(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.PROTO, 'verify-disconnected')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_data_invalid(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.DATA_INVALID, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_data_not_found(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.DATA_NOT_FOUND, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_error_data_full(self):
Packit Service 8ebd8e
        self.assertVerifyError(FPrint.DeviceError.DATA_FULL, 'verify-unknown-error')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_start_during_verify(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.VerifyStart('(s)', self.verify_finger)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_start_during_verify(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.EnrollStart('(s)', 'right-thumb')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_enroll_stop_during_verify(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.device.EnrollStop()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_verify_stop_from_other_client(self):
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.call_device_method_from_other_client('VerifyStop')
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdVirtualDeviceIdentificationTests(FPrintdVirtualDeviceVerificationTests):
Packit Service 8ebd8e
    '''This class will just repeat the tests of FPrintdVirtualDeviceVerificationTests
Packit Service 8ebd8e
    but with 'any' finger parameter (leading to an identification, when possible
Packit Service 8ebd8e
    under the hood).
Packit Service 8ebd8e
    '''
Packit Service 8ebd8e
Packit Service 8ebd8e
    @classmethod
Packit Service 8ebd8e
    def setUpClass(cls):
Packit Service 8ebd8e
        super().setUpClass()
Packit Service 8ebd8e
        cls.verify_finger = 'any'
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrindConcurrentPolkitRequestsTest(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    def wait_for_hanging_clients(self):
Packit Service 8ebd8e
        while not self._polkitd_obj.HaveHangingCalls():
Packit Service 8ebd8e
            pass
Packit Service 8ebd8e
        self.assertTrue(self._polkitd_obj.HaveHangingCalls())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def start_hanging_gdbus_claim(self, user='testuser'):
Packit Service 8ebd8e
        gdbus = self.gdbus_device_method_call_process('Claim', [user])
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
        self.wait_for_hanging_clients()
Packit Service 8ebd8e
        self.addCleanup(gdbus.kill)
Packit Service 8ebd8e
        return gdbus
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_new_claim_external_client(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll' ])
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHang(True)
Packit Service 8ebd8e
        self._polkitd_obj.SetDelay(0.5)
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHang(False)
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
        self._polkitd_obj.ReleaseHangingCalls()
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus.wait()
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            raise GLib.GError(gdbus.stdout.read())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_new_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll' ])
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHang(True)
Packit Service 8ebd8e
        self._polkitd_obj.SetDelay(0.5)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.call_device_method_async('Claim', '(s)', [''])
Packit Service 8ebd8e
        self.wait_for_hanging_clients()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHang(False)
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.ReleaseHangingCalls()
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            self.wait_for_device_reply()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_enroll_does_not_block_new_claim(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll' ])
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll'])
Packit Service 8ebd8e
        self._polkitd_obj.SetDelay(0.5)
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([''])
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
        self._polkitd_obj.ReleaseHangingCalls()
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus.wait()
Packit Service 8ebd8e
        with self.assertFprintError('AlreadyInUse'):
Packit Service 8ebd8e
            raise GLib.GError(gdbus.stdout.read())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_new_release(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed(['net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHang(True)
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.gdbus_device_method_call_process('Claim', ['testuser'])
Packit Service 8ebd8e
        self.addCleanup(gdbus.kill)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.wait_for_hanging_clients()
Packit Service 8ebd8e
        with self.assertFprintError('ClaimDevice'):
Packit Service 8ebd8e
            self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_list(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(self.device.ListEnrolledFingers('(s)',
Packit Service 8ebd8e
            self.get_current_user()), ['left-thumb'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_can_proceed_when_released(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([''])
Packit Service 8ebd8e
        self.device.Claim('(s)', 'testuser')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.ReleaseHangingCalls()
Packit Service 8ebd8e
        gdbus.wait()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertEqual(gdbus.returncode, 0)
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_empty_list(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        with self.assertFprintError('NoEnrolledPrints'):
Packit Service 8ebd8e
            self.device.ListEnrolledFingers('(s)', self.get_current_user())
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_hanging_claim_does_not_block_verification(self):
Packit Service 8ebd8e
        self._polkitd_obj.SetAllowed([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.enroll',
Packit Service 8ebd8e
            'net.reactivated.fprint.device.verify'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
        self.enroll_image('whorl', finger='left-thumb')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self._polkitd_obj.SimulateHangActions([
Packit Service 8ebd8e
            'net.reactivated.fprint.device.setusername'])
Packit Service 8ebd8e
Packit Service 8ebd8e
        gdbus = self.start_hanging_gdbus_claim()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Claim('(s)', '')
Packit Service 8ebd8e
        self.device.VerifyStart('(s)', 'any')
Packit Service 8ebd8e
        self.send_image('whorl')
Packit Service 8ebd8e
        self.wait_for_result()
Packit Service 8ebd8e
        self.assertTrue(self._verify_stopped)
Packit Service 8ebd8e
        self.assertEqual(self._last_result, 'verify-match')
Packit Service 8ebd8e
        self.device.VerifyStop()
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.assertIsNone(gdbus.poll())
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
class FPrintdUtilsTest(FPrintdVirtualDeviceBaseTest):
Packit Service 8ebd8e
Packit Service 8ebd8e
    @classmethod
Packit Service 8ebd8e
    def setUpClass(cls):
Packit Service 8ebd8e
        super().setUpClass()
Packit Service 8ebd8e
        utils = {
Packit Service 8ebd8e
            'delete': None,
Packit Service 8ebd8e
            'enroll': None,
Packit Service 8ebd8e
            'list': None,
Packit Service 8ebd8e
            'verify': None,
Packit Service 8ebd8e
        }
Packit Service 8ebd8e
Packit Service 8ebd8e
        for util in utils:
Packit Service 8ebd8e
            util_bin = 'fprintd-{}'.format(util)
Packit Service 8ebd8e
            if 'FPRINT_BUILD_DIR' in os.environ:
Packit Service 8ebd8e
                print('Testing local build')
Packit Service 8ebd8e
                build_dir = os.environ['FPRINT_BUILD_DIR']
Packit Service 8ebd8e
                path = os.path.join(build_dir, '../utils', util_bin)
Packit Service 8ebd8e
            elif 'UNDER_JHBUILD' in os.environ:
Packit Service 8ebd8e
                print('Testing JHBuild version')
Packit Service 8ebd8e
                jhbuild_prefix = os.environ['JHBUILD_PREFIX']
Packit Service 8ebd8e
                path = os.path.join(jhbuild_prefix, 'bin', util_bin)
Packit Service 8ebd8e
            else:
Packit Service 8ebd8e
                # Assume it is in path
Packit Service 8ebd8e
                utils[util] = util_bin
Packit Service 8ebd8e
                continue
Packit Service 8ebd8e
Packit Service 8ebd8e
            assert os.path.exists(path), 'failed to find {} in {}'.format(util, path)
Packit Service 8ebd8e
            utils[util] = path
Packit Service 8ebd8e
Packit Service 8ebd8e
        cls.utils = utils
Packit Service 8ebd8e
        cls.utils_proc = {}
Packit Service 8ebd8e
Packit Service 8ebd8e
    def util_start(self, name, args=[]):
Packit Service 8ebd8e
        env = os.environ.copy()
Packit Service 8ebd8e
        env['G_DEBUG'] = 'fatal-criticals'
Packit Service 8ebd8e
        env['STATE_DIRECTORY'] = self.state_dir
Packit Service 8ebd8e
        env['RUNTIME_DIRECTORY'] = self.run_dir
Packit Service 8ebd8e
Packit Service 8ebd8e
        argv = [self.utils[name]] + args
Packit Service 8ebd8e
        valgrind = os.getenv('VALGRIND')
Packit Service 8ebd8e
        if valgrind is not None:
Packit Service 8ebd8e
            argv.insert(0, 'valgrind')
Packit Service 8ebd8e
            argv.insert(1, '--leak-check=full')
Packit Service 8ebd8e
            if os.path.exists(valgrind):
Packit Service 8ebd8e
                argv.insert(2, '--suppressions=%s' % valgrind)
Packit Service 8ebd8e
            self.valgrind = True
Packit Service 8ebd8e
        self.utils_proc[name] = subprocess.Popen(argv,
Packit Service 8ebd8e
                                                 env=env,
Packit Service 8ebd8e
                                                 stdout=None,
Packit Service 8ebd8e
                                                 stderr=subprocess.STDOUT)
Packit Service 8ebd8e
        self.addCleanup(self.utils_proc[name].wait)
Packit Service 8ebd8e
        self.addCleanup(self.utils_proc[name].terminate)
Packit Service 8ebd8e
        return self.utils_proc[name]
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_vanished_client_operation_is_cancelled(self):
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
        self.enroll_image('whorl')
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
        verify = self.util_start('verify')
Packit Service 8ebd8e
        time.sleep(1)
Packit Service 8ebd8e
        verify.terminate()
Packit Service 8ebd8e
        self.assertLess(verify.wait(), 128)
Packit Service 8ebd8e
        time.sleep(1)
Packit Service 8ebd8e
Packit Service 8ebd8e
        self.device.Claim('(s)', self.get_current_user())
Packit Service 8ebd8e
        self.device.Release()
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_already_claimed_same_user_delete_enrolled_fingers(self):
Packit Service 8ebd8e
        self.device.DeleteEnrolledFingers('(s)', 'testuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
    def test_already_claimed_other_user_delete_enrolled_fingers(self):
Packit Service 8ebd8e
        self.device.DeleteEnrolledFingers('(s)', 'nottestuser')
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
Packit Service 8ebd8e
def list_tests():
Packit Service 8ebd8e
    import unittest_inspector
Packit Service 8ebd8e
    return unittest_inspector.list_tests(sys.modules[__name__])
Packit Service f1aff6
Packit Service f1aff6
if __name__ == '__main__':
Packit Service f1aff6
    if len(sys.argv) == 2 and sys.argv[1] == "list-tests":
Packit Service f1aff6
        for machine, human in list_tests():
Packit Service f1aff6
            print("%s %s" % (machine, human), end="\n")
Packit Service f1aff6
        sys.exit(0)
Packit Service f1aff6
Packit Service 8ebd8e
    prog = unittest.main(verbosity=2, exit=False)
Packit Service 8ebd8e
    if prog.result.errors or prog.result.failures:
Packit Service 8ebd8e
        sys.exit(1)
Packit Service 8ebd8e
Packit Service 8ebd8e
    # Translate to skip error
Packit Service 8ebd8e
    if prog.result.testsRun == len(prog.result.skipped):
Packit Service 8ebd8e
        sys.exit(77)
Packit Service 8ebd8e
Packit Service 8ebd8e
    sys.exit(0)