mirror of
https://gitlab.freedesktop.org/libfprint/libfprint.git
synced 2026-06-11 02:28:05 +00:00
tests: Add versions check on TOD drivers based on their IDs
Recompile tod drivers using libfprint-tod-test-drivers project [1] so that we don't have to reorder the private driver structure, plus use a versioned driver ID and parse it to check whether a feature is supported for such TOD test driver. https://gitlab.freedesktop.org/3v1n0/libfprint-tod-test-drivers
This commit is contained in:
+23
-7
@@ -239,15 +239,21 @@ if valgrind.found()
|
||||
endif
|
||||
|
||||
if get_option('tod')
|
||||
tod_test_driver_name = 'fake_test_dev_tod'
|
||||
tod_envs = envs
|
||||
tod_envs.set('FP_TOD_KEEP_MODULES_OPEN', 'TRUE')
|
||||
tod_envs.set('FP_VIRTUAL_FAKE_DEVICE', 'yes')
|
||||
tod_envs.set('FP_TOD_TEST_DRIVER_NAME', 'fake_test_dev_tod')
|
||||
tod_envs.set('FP_TOD_TEST_DRIVER_NAME', tod_test_driver_name)
|
||||
tod_envs.prepend('LD_LIBRARY_PATH',
|
||||
meson.build_root() / 'libfprint',
|
||||
meson.build_root() / 'libfprint' / 'tod')
|
||||
tod_c_args = [
|
||||
'-DTEST_TOD_DRIVER=1',
|
||||
'-DTOD_CURRENT_VERSION=@0@'.format(tod_soversion),
|
||||
'-DTOD_CURRENT_SUBVERSION="@0@.@1@"'.format(
|
||||
meson.project_version().split('.')[0],
|
||||
meson.project_version().split('.')[1],
|
||||
),
|
||||
]
|
||||
|
||||
fake_driver = shared_module('device-fake-tod-driver',
|
||||
@@ -294,19 +300,29 @@ if get_option('tod')
|
||||
]
|
||||
|
||||
tod_dirs = {
|
||||
'fake_test_dev_tod_current': meson.current_build_dir(),
|
||||
tod_test_driver_name + '_current': meson.current_build_dir(),
|
||||
}
|
||||
|
||||
if host_machine.cpu_family() == 'x86_64'
|
||||
tod_dirs += {
|
||||
'fake_test_dev_tod_v1': meson.current_source_dir() / 'tod-drivers',
|
||||
}
|
||||
tod_test_versions = [
|
||||
'v1+1.90',
|
||||
'v1+1.94'
|
||||
]
|
||||
|
||||
foreach tod_version: tod_test_versions
|
||||
tod_dirs += {
|
||||
tod_test_driver_name + '_' + tod_version:
|
||||
meson.current_source_dir() / 'tod-drivers' / '-'.join([
|
||||
'tod', host_machine.cpu_family(), tod_version
|
||||
])
|
||||
}
|
||||
endforeach
|
||||
endif
|
||||
|
||||
foreach test_name: tod_unit_tests
|
||||
basename = 'test-' + test_name
|
||||
sufix = test_name.endswith('-tod') ? '' : '-tod'
|
||||
test_name = test_name + sufix
|
||||
tod_test_name = test_name + sufix
|
||||
test_exe = executable(basename + sufix,
|
||||
sources: basename + '.c',
|
||||
dependencies: libfprint_private_dep,
|
||||
@@ -323,7 +339,7 @@ if get_option('tod')
|
||||
tod_test_envs.set('FP_TOD_DRIVERS_DIR', tod_dir)
|
||||
tod_test_envs.set('FP_TOD_TEST_DRIVER_NAME', tod_driver)
|
||||
|
||||
test(test_name + '-' + tod_driver,
|
||||
test(tod_test_name + '-' + tod_driver,
|
||||
test_exe,
|
||||
suite: ['unit-tests', 'tod', tod_driver],
|
||||
env: tod_test_envs,
|
||||
|
||||
@@ -32,6 +32,8 @@ struct _FpiDeviceFake
|
||||
gpointer last_called_function;
|
||||
gboolean return_action_error;
|
||||
|
||||
GCancellable *ext_cancellable;
|
||||
|
||||
GError *ret_error;
|
||||
FpPrint *ret_print;
|
||||
FpPrint *ret_match;
|
||||
@@ -39,14 +41,12 @@ struct _FpiDeviceFake
|
||||
FpImage *ret_image;
|
||||
GPtrArray *ret_list;
|
||||
|
||||
gpointer action_data;
|
||||
gpointer user_data;
|
||||
|
||||
GCancellable *ext_cancellable;
|
||||
|
||||
GError *ret_suspend;
|
||||
GError *ret_resume;
|
||||
|
||||
gpointer action_data;
|
||||
gpointer user_data;
|
||||
|
||||
FpDeviceFeature probe_features_update;
|
||||
FpDeviceFeature probe_features_value;
|
||||
};
|
||||
|
||||
+120
-43
@@ -46,24 +46,101 @@ fpt_context_device_driver_get_type (void)
|
||||
return G_TYPE_FROM_CLASS (FP_DEVICE_GET_CLASS (tctx->device));
|
||||
}
|
||||
|
||||
static int
|
||||
tod_get_version (FpDeviceClass *device_class,
|
||||
const char **sub_version)
|
||||
{
|
||||
g_autofree char *tod_version = NULL;
|
||||
const char *tod_version_info;
|
||||
const char *tod_subversion_info;
|
||||
|
||||
g_debug ("Getting TOD version for driver '%s'", device_class->id);
|
||||
g_assert_true (g_str_has_prefix (device_class->id, "fake_test_dev_tod"));
|
||||
|
||||
tod_version_info = device_class->id + sizeof ("fake_test_dev_tod");
|
||||
g_debug ("Tod version info is '%s'", tod_version_info);
|
||||
g_assert (*tod_version_info != '\0');
|
||||
|
||||
if (sub_version)
|
||||
*sub_version = NULL;
|
||||
|
||||
if (g_str_equal (tod_version_info, "current"))
|
||||
{
|
||||
*sub_version = TOD_CURRENT_SUBVERSION;
|
||||
return TOD_CURRENT_VERSION;
|
||||
}
|
||||
|
||||
g_assert_true (g_str_has_prefix (device_class->id, "fake_test_dev_tod_v"));
|
||||
|
||||
tod_version_info = device_class->id + sizeof ("fake_test_dev_tod_v") - 1;
|
||||
tod_subversion_info = strchr (tod_version_info, '+');
|
||||
g_assert_nonnull (tod_subversion_info);
|
||||
g_assert (*tod_subversion_info != '\0');
|
||||
|
||||
tod_version = g_strndup (tod_version_info,
|
||||
tod_subversion_info - tod_version_info);
|
||||
tod_subversion_info += 1;
|
||||
|
||||
g_debug ("Tod version is '%s', subversion '%s'",
|
||||
tod_version, tod_subversion_info);
|
||||
|
||||
g_assert_nonnull (tod_version);
|
||||
g_assert (*tod_version != '\0');
|
||||
g_assert (*tod_subversion_info != '\0');
|
||||
|
||||
if (sub_version)
|
||||
*sub_version = tod_subversion_info;
|
||||
|
||||
return atoi (tod_version);
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static gboolean
|
||||
tod_is_v1_class (FpDeviceClass *device_class)
|
||||
tod_check_version (FpDeviceClass *device_class,
|
||||
int tod_version,
|
||||
const char *tod_subversion)
|
||||
{
|
||||
#ifdef TEST_TOD_DRIVER
|
||||
return g_str_has_suffix (device_class->id, "_tod_v1");
|
||||
g_auto(GStrv) versions = NULL;
|
||||
g_auto(GStrv) wanted_versions = NULL;
|
||||
int version;
|
||||
const char *sub_version;
|
||||
|
||||
version = tod_get_version (device_class, &sub_version);
|
||||
|
||||
if (version != tod_version)
|
||||
return FALSE;
|
||||
|
||||
if (!tod_subversion)
|
||||
return TRUE;
|
||||
|
||||
versions = g_strsplit (sub_version, ".", -1);
|
||||
g_assert_cmpuint (g_strv_length (versions), ==, 2);
|
||||
|
||||
wanted_versions = g_strsplit (tod_subversion, ".", -1);
|
||||
g_assert_cmpuint (g_strv_length (wanted_versions), ==, 2);
|
||||
|
||||
if (atoi (wanted_versions[0]) > atoi (versions[0]))
|
||||
return FALSE;
|
||||
|
||||
if (atoi (wanted_versions[1]) > atoi (versions[1]))
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
|
||||
#endif
|
||||
return FALSE;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static gboolean
|
||||
tod_is_v1_device (FpDevice *device)
|
||||
tod_check_device_version (FpDevice *device_class,
|
||||
int tod_version,
|
||||
const char *tod_subversion)
|
||||
{
|
||||
#ifdef TEST_TOD_DRIVER
|
||||
return tod_is_v1_class (FP_DEVICE_GET_CLASS (device));
|
||||
#endif
|
||||
return FALSE;
|
||||
return tod_check_version (FP_DEVICE_GET_CLASS (device_class),
|
||||
tod_version,
|
||||
tod_subversion);
|
||||
}
|
||||
|
||||
/* Utility functions */
|
||||
@@ -557,9 +634,9 @@ test_driver_features_probe_updates (void)
|
||||
FpDeviceClass *dev_class = FP_DEVICE_GET_CLASS (device);
|
||||
FpiDeviceFake *fake_dev;
|
||||
|
||||
if (tod_is_v1_device (device))
|
||||
if (!tod_check_device_version (device, 1, "1.92"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.92");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -616,7 +693,7 @@ test_driver_initial_features (void)
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_device (device))
|
||||
if (tod_check_device_version (device, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -633,7 +710,7 @@ test_driver_initial_features (void)
|
||||
g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE));
|
||||
g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_LIST));
|
||||
g_assert_true (fp_device_has_feature (device, FP_DEVICE_FEATURE_STORAGE_DELETE));
|
||||
if (!tod_is_v1_device (device))
|
||||
if (tod_check_device_version (device, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -646,8 +723,8 @@ test_driver_initial_features (void)
|
||||
FP_DEVICE_FEATURE_STORAGE |
|
||||
FP_DEVICE_FEATURE_STORAGE_LIST |
|
||||
FP_DEVICE_FEATURE_STORAGE_DELETE |
|
||||
(tod_is_v1_device (device) ?
|
||||
0 : FP_DEVICE_FEATURE_STORAGE_CLEAR));
|
||||
(tod_check_device_version (device, 1, "1.92") ?
|
||||
FP_DEVICE_FEATURE_STORAGE_CLEAR : 0));
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -694,7 +771,7 @@ test_driver_initial_features_no_capture (void)
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -718,7 +795,7 @@ test_driver_initial_features_no_verify (void)
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -742,7 +819,7 @@ test_driver_initial_features_no_identify (void)
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -766,7 +843,7 @@ test_driver_initial_features_no_storage (void)
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -787,13 +864,13 @@ test_driver_initial_features_no_list (void)
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_IDENTIFY);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_VERIFY);
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_DUPLICATES_CHECK);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -817,7 +894,7 @@ test_driver_initial_features_no_delete (void)
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE);
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_LIST);
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_DELETE);
|
||||
if (!tod_is_v1_class (dev_class))
|
||||
if (tod_check_version (dev_class, 1, "1.92"))
|
||||
g_assert_true (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
else
|
||||
g_assert_false (dev_class->features & FP_DEVICE_FEATURE_STORAGE_CLEAR);
|
||||
@@ -2057,9 +2134,9 @@ test_driver_identify_suspend_continues (void)
|
||||
FpiDeviceFake *fake_dev;
|
||||
FpPrint *expected_matched;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2129,9 +2206,9 @@ test_driver_identify_suspend_succeeds (void)
|
||||
FpiDeviceFake *fake_dev;
|
||||
FpPrint *expected_matched;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2197,9 +2274,9 @@ test_driver_identify_suspend_busy_error (void)
|
||||
FpiDeviceFake *fake_dev;
|
||||
FpPrint *expected_matched;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2260,9 +2337,9 @@ test_driver_identify_suspend_while_idle (void)
|
||||
g_autoptr(GError) error = NULL;
|
||||
FpiDeviceFake *fake_dev;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2310,9 +2387,9 @@ test_driver_identify_warmup_cooldown (void)
|
||||
FpiDeviceFake *fake_dev;
|
||||
gint64 start_time;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2614,9 +2691,9 @@ test_driver_clear_storage (void)
|
||||
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||
gboolean ret;
|
||||
|
||||
if (tod_is_v1_device (device))
|
||||
if (!tod_check_device_version (device, 1, "1.92"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.92");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2635,9 +2712,9 @@ test_driver_clear_storage_error (void)
|
||||
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||
gboolean ret;
|
||||
|
||||
if (tod_is_v1_device (device))
|
||||
if (!tod_check_device_version (device, 1, "1.92"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.92");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2747,9 +2824,9 @@ test_driver_critical (void)
|
||||
void (*orig_verify) (FpDevice *device) = dev_class->verify;
|
||||
FpiDeviceFake *fake_dev = FPI_DEVICE_FAKE (device);
|
||||
|
||||
if (tod_is_v1_device (device))
|
||||
if (!tod_check_device_version (device, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2961,9 +3038,9 @@ test_driver_action_is_cancelled_open (void)
|
||||
g_autoptr(GError) error = NULL;
|
||||
FpiDeviceFake *fake_dev;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -2987,9 +3064,9 @@ test_driver_action_internally_cancelled_open (void)
|
||||
g_autoptr(GError) error = NULL;
|
||||
FpiDeviceFake *fake_dev;
|
||||
|
||||
if (tod_is_v1_class (dev_class))
|
||||
if (!tod_check_version (dev_class, 1, "1.94"))
|
||||
{
|
||||
g_test_skip ("Feature not supported by TODv1 interface");
|
||||
g_test_skip ("Feature not supported by TODv1 versions before 1.94");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -3142,7 +3219,7 @@ test_driver_action_error_all (void)
|
||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_DATA_INVALID);
|
||||
g_clear_error (&error);
|
||||
|
||||
if (!tod_is_v1_device (device))
|
||||
if (tod_check_device_version (device, 1, "1.92"))
|
||||
{
|
||||
fake_dev->ret_error = fpi_device_error_new (FP_DEVICE_ERROR_DATA_INVALID);
|
||||
g_assert_false (fp_device_clear_storage_sync (device, NULL, &error));
|
||||
@@ -3256,7 +3333,7 @@ test_driver_action_error_fallback_all (void)
|
||||
g_assert_error (error, FP_DEVICE_ERROR, FP_DEVICE_ERROR_GENERAL);
|
||||
g_clear_error (&error);
|
||||
|
||||
if (!tod_is_v1_device (device))
|
||||
if (tod_check_device_version (device, 1, "1.92"))
|
||||
{
|
||||
g_test_expect_message (G_LOG_DOMAIN, G_LOG_LEVEL_WARNING,
|
||||
"*Device failed to pass an error to generic action "
|
||||
|
||||
@@ -7,3 +7,7 @@ test-device-fake) built using the minimum libfprint TOD we want to support.
|
||||
|
||||
In this way the library is loaded during tests and tested for all the upstream
|
||||
tests and particularly test-fpi-device.
|
||||
|
||||
Such binaries are compiled (for each platform) using the [libfprint TOD test
|
||||
drivers](https://gitlab.freedesktop.org/3v1n0/libfprint-tod-test-drivers)
|
||||
project, per each supported version.
|
||||
|
||||
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Reference in New Issue
Block a user