diff --git a/tests/meson.build b/tests/meson.build index 7106ff58..c3fa4f7a 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -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, diff --git a/tests/test-device-fake.h b/tests/test-device-fake.h index e3782e34..7e14b478 100644 --- a/tests/test-device-fake.h +++ b/tests/test-device-fake.h @@ -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; }; diff --git a/tests/test-fpi-device.c b/tests/test-fpi-device.c index c01456a3..deea3f16 100644 --- a/tests/test-fpi-device.c +++ b/tests/test-fpi-device.c @@ -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 " diff --git a/tests/tod-drivers/README.md b/tests/tod-drivers/README.md index 3afec6dd..a1b27de9 100644 --- a/tests/tod-drivers/README.md +++ b/tests/tod-drivers/README.md @@ -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. diff --git a/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so b/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so deleted file mode 100755 index 822f417c..00000000 Binary files a/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so and /dev/null differ diff --git a/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so new file mode 100755 index 00000000..b7cc06e5 Binary files /dev/null and b/tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so differ diff --git a/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so new file mode 100755 index 00000000..c370fc21 Binary files /dev/null and b/tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so differ