From 29b904b93d5b990a600a8dafbab5a6036744e8db Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Thu, 2 Sep 2021 13:32:57 +0200 Subject: [PATCH] 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 --- tests/meson.build | 30 +++- tests/test-device-fake.h | 10 +- tests/test-fpi-device.c | 163 +++++++++++++----- tests/tod-drivers/README.md | 4 + .../libdevice-fake-tod-driver-x86_64.so | Bin 52832 -> 0 bytes ...ice-fake-tod-test-driver-v1+1.90-x86_64.so | Bin 0 -> 44720 bytes ...ice-fake-tod-test-driver-v1+1.94-x86_64.so | Bin 0 -> 42784 bytes 7 files changed, 152 insertions(+), 55 deletions(-) delete mode 100755 tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.90/libdevice-fake-tod-test-driver-v1+1.90-x86_64.so create mode 100755 tests/tod-drivers/tod-x86_64-v1+1.94/libdevice-fake-tod-test-driver-v1+1.94-x86_64.so 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 822f417c3de78c27ce9f28f58f2dd20cedf0a69a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 52832 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 Lh9Mh+4P^fZ53gp4 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 0000000000000000000000000000000000000000..b7cc06e59f127a4bb54c9af3702189fe091aae27 GIT binary patch literal 44720 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 bupPQxjS3*6ZAasnc78@eS7cSl0*(I(YH<)# literal 0 HcmV?d00001 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 0000000000000000000000000000000000000000..c370fc2128bbe37b3b1692e7da5ed2642bf3eb55 GIT binary patch literal 42784 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 literal 0 HcmV?d00001