|
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)
|