From 80cf417b3060e7d21e0b895f28ae82dbaf32763d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Marco=20Trevisan=20=28Trevi=C3=B1o=29?= Date: Fri, 4 Dec 2020 02:08:59 +0100 Subject: [PATCH] tests: Check if loading a pre-built binary keep working with libfprint The libfprint tod fake library is built using using libtod v1.90.1+tod1 and we need to ensure that it will continue working until we won't change ABI/API. --- tests/meson.build | 36 +++++++++++++----- tests/test-device-fake.c | 2 +- tests/tod-drivers/README.md | 9 +++++ .../libdevice-fake-tod-driver-x86_64.so | Bin 0 -> 52832 bytes 4 files changed, 37 insertions(+), 10 deletions(-) create mode 100644 tests/tod-drivers/README.md create mode 100755 tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so diff --git a/tests/meson.build b/tests/meson.build index 0c900fb0..144c4180 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -196,11 +196,10 @@ endif if get_option('tod') tod_envs = envs - tod_envs.set('FP_TOD_DRIVERS_DIR', meson.current_build_dir()) tod_envs.set('FP_TOD_KEEP_MODULES_OPEN', 'TRUE') tod_envs.set('FP_VIRTUAL_FAKE_DEVICE', 'yes') - tod_envs.append('FP_DRIVERS_WHITELIST', 'fake_test_dev_tod') tod_envs.set('FP_TOD_TEST_DRIVER_NAME', 'fake_test_dev_tod') + tod_envs.prepend('LD_LIBRARY_PATH', meson.build_root() / 'libfprint/tod') tod_c_args = [ '-DTEST_TOD_DRIVER=1', ] @@ -233,6 +232,17 @@ if get_option('tod') 'fpi-device', ] + tod_dirs = { + 'fake_test_dev_tod_current': meson.current_build_dir(), + } + + machine = run_command(meson.get_compiler('c'), '-dumpmachine').stdout().strip() + if machine.startswith('x86_64-') + tod_dirs += { + 'fake_test_dev_tod_v1': meson.current_source_dir() / 'tod-drivers', + } + endif + foreach test_name: tod_unit_tests basename = 'test-' + test_name sufix = test_name.endswith('-tod') ? '' : '-tod' @@ -246,12 +256,20 @@ if get_option('tod') ], link_with: test_utils_tod, ) - test(test_name, - find_program('test-runner.sh'), - suite: ['unit-tests', 'tod'], - args: [test_exe], - env: tod_envs, - depends: fake_driver, - ) + + foreach tod_driver, tod_dir : tod_dirs + tod_test_envs = tod_envs + tod_test_envs.prepend('FP_DRIVERS_WHITELIST', tod_driver) + 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, + find_program('test-runner.sh'), + suite: ['unit-tests', 'tod', tod_driver], + args: [test_exe], + env: tod_test_envs, + depends: fake_driver, + ) + endforeach endforeach endif diff --git a/tests/test-device-fake.c b/tests/test-device-fake.c index 84b63b70..52b0835e 100644 --- a/tests/test-device-fake.c +++ b/tests/test-device-fake.c @@ -19,7 +19,7 @@ */ #ifdef TEST_TOD_DRIVER -#define FP_COMPONENT "fake_test_dev_tod" +#define FP_COMPONENT "fake_test_dev_tod_current" #else #define FP_COMPONENT "fake_test_dev" #endif diff --git a/tests/tod-drivers/README.md b/tests/tod-drivers/README.md new file mode 100644 index 00000000..3afec6dd --- /dev/null +++ b/tests/tod-drivers/README.md @@ -0,0 +1,9 @@ +# TOD drivers to use for testing + +This directory is used by the test-suite to load and verify pre-built drivers. + +For main testing this directory should contain the "fake_test_dev" driver (AKA +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. diff --git a/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so b/tests/tod-drivers/libdevice-fake-tod-driver-x86_64.so new file mode 100755 index 0000000000000000000000000000000000000000..822f417c3de78c27ce9f28f58f2dd20cedf0a69a GIT binary patch literal 52832 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 Lh9Mh+4P^fZ53gp4 literal 0 HcmV?d00001