On 08.02.22 11:13, Thomas Huth wrote:
We can get a nicer progress indication if we add the iotests
individually via the 'check' script instead of going through
the check-block.sh wrapper.
For this, we have to add some of the sanity checks that have
originally been done in the tests/check-block.sh script (whether
"bash" is available or whether CFLAGS contain -fsanitize switches)
to the meson.build file now, and add the environment variables
that have been set up by the tests/check-block.sh script before.
Signed-off-by: Thomas Huth <th...@redhat.com>
---
tests/qemu-iotests/meson.build | 45 ++++++++++++++++++++++++++++------
1 file changed, 37 insertions(+), 8 deletions(-)
diff --git a/tests/qemu-iotests/meson.build b/tests/qemu-iotests/meson.build
index e1832c90e0..5a6ccd35d8 100644
--- a/tests/qemu-iotests/meson.build
+++ b/tests/qemu-iotests/meson.build
@@ -1,9 +1,29 @@
-if not have_tools or targetos == 'windows'
+if not have_tools or targetos == 'windows' or \
+ config_host.has_key('CONFIG_GPROF')
subdir_done()
endif
+bash = find_program('bash', required: false)
+if not bash.found() or \
+ run_command(bash, ['--version']).stdout().contains('GNU bash, version 3')
Instead of me asking about where the LANG=C is, or me lamenting that we
could test very simply for [123] before and can no longer now... Can we
not just do `find_program('bash', required: false, version: '>= 4.0')`?
+ message('bash >= v4.0 not available ==> Disabled the qemu-iotests.')
+ subdir_done()
+endif
+
+foreach cflag: config_host['QEMU_CFLAGS'].split()
+ if cflag.startswith('-fsanitize') and \
+ not cflag.contains('safe-stack') and not cflag.contains('cfi-icall')
+ message('Sanitizers are enabled ==> Disabled the qemu-iotests.')
+ subdir_done()
+ endif
+endforeach
+
qemu_iotests_binaries = [qemu_img, qemu_io, qemu_nbd, qsd]
-qemu_iotests_env = {'PYTHON': python.full_path()}
+qemu_iotests_env = {
+ 'PYTHON': python.full_path(),
+ 'PYTHONUTF8': '1',
+ 'QEMU_CHECK_BLOCK_AUTO': '1'
+}
qemu_iotests_formats = {
'qcow2': 'quick',
'raw': 'slow',
@@ -18,16 +38,25 @@ foreach k, v : emulators
endif
endforeach
+check_script = find_program(meson.current_build_dir() / 'check')
+iotests = run_command(python, [check_script.full_path(), '-g', 'auto', '-n'],
+ check: true).stdout().strip().replace('tests/',
'').split('\n')
+
foreach format, speed: qemu_iotests_formats
if speed == 'quick'
suites = 'block'
else
suites = ['block-' + speed, speed]
endif
- test('qemu-iotests ' + format, sh, args: [files('../check-block.sh'),
format],
- depends: qemu_iotests_binaries, env: qemu_iotests_env,
- protocol: 'tap',
- suite: suites,
- timeout: 0,
- is_parallel: false)
+ foreach tst: iotests
+ test('iotest-' + format + '-' + tst,
+ python, args: [check_script.full_path(), '-tap', '-' + format, tst],
+ depends: qemu_iotests_binaries,
+ env: qemu_iotests_env + \
+ { 'TEST_DIR':
+ meson.current_build_dir() / 'scratch' / format + '-' + tst },
+ protocol: 'tap',
+ suite: suites,
+ timeout: 0)
So as far I understand you’d like to have meson run the iotests in
parallel this way. I don’t actually think that’s safely possible for
multiple formats at once, because a test’s output is always written into
`${build_dir}/tests/qemu-iotests/${seq}.out.bad`; so if you run e.g.
test 001 both with raw and qcow2 simultaneously, then they can get in
each other’s way.
(In my test branch, I have
https://gitlab.com/hreitz/qemu/-/commit/f3110b1eeb93d02aeadc5c8b807594cfa10a6aad
for this – maybe I should send something like this in a more refined
form to the list some time...)
As a minor note, the `check` script has recently received a `-j`
argument for parallel execution. Kind of a shame that we wouldn’t be
able to use it here, but that’s how it is, I suppose.
Hanna