check-block: replace -makecheck with TAP output

Let "meson test" take care of showing the results of the individual tests,
consistently with other output from "make check V=1".

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
staging
Paolo Bonzini 2022-01-07 13:18:11 +01:00
parent 18c1cdd21d
commit d316859f4e
5 changed files with 48 additions and 44 deletions

View File

@ -14,8 +14,8 @@ else
fi
skip() {
echo "$*"
exit 77
echo "1..0 #SKIP $*"
exit 0
}
if grep -q "CONFIG_GPROF=y" config-host.mak 2>/dev/null ; then
@ -79,7 +79,7 @@ JOBS=$(echo "$MAKEFLAGS" | sed -n 's/\(^\|.* \)-j\([0-9]\+\)\( .*\|$\)/-j \2/p')
ret=0
for fmt in $format_list ; do
${PYTHON} ./check $JOBS -makecheck -$fmt $group || ret=1
${PYTHON} ./check $JOBS -tap -$fmt $group || ret=1
done
exit $ret

View File

@ -32,8 +32,6 @@ def make_argparser() -> argparse.ArgumentParser:
p.add_argument('-n', '--dry-run', action='store_true',
help='show me, do not run tests')
p.add_argument('-makecheck', action='store_true',
help='pretty print output for make check')
p.add_argument('-j', dest='jobs', type=int, default=1,
help='run tests in multiple parallel jobs')
@ -53,6 +51,8 @@ def make_argparser() -> argparse.ArgumentParser:
p.add_argument('--color', choices=['on', 'off', 'auto'],
default='auto', help="use terminal colors. The default "
"'auto' value means use colors if terminal stdout detected")
p.add_argument('-tap', action='store_true',
help='produce TAP output')
g_env = p.add_argument_group('test environment options')
mg = g_env.add_mutually_exclusive_group()
@ -164,7 +164,7 @@ if __name__ == '__main__':
if args.dry_run:
print('\n'.join(tests))
else:
with TestRunner(env, makecheck=args.makecheck,
with TestRunner(env, tap=args.tap,
color=args.color) as tr:
paths = [os.path.join(env.source_iotests, t) for t in tests]
ok = tr.run_tests(paths, args.jobs)

View File

@ -22,6 +22,7 @@ if have_tools and targetos != 'windows'
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)

View File

@ -287,21 +287,21 @@ class TestEnv(ContextManager['TestEnv']):
def __exit__(self, exc_type: Any, exc_value: Any, traceback: Any) -> None:
self.close()
def print_env(self) -> None:
def print_env(self, prefix: str = '') -> None:
template = """\
QEMU -- "{QEMU_PROG}" {QEMU_OPTIONS}
QEMU_IMG -- "{QEMU_IMG_PROG}" {QEMU_IMG_OPTIONS}
QEMU_IO -- "{QEMU_IO_PROG}" {QEMU_IO_OPTIONS}
QEMU_NBD -- "{QEMU_NBD_PROG}" {QEMU_NBD_OPTIONS}
IMGFMT -- {IMGFMT}{imgopts}
IMGPROTO -- {IMGPROTO}
PLATFORM -- {platform}
TEST_DIR -- {TEST_DIR}
SOCK_DIR -- {SOCK_DIR}
GDB_OPTIONS -- {GDB_OPTIONS}
VALGRIND_QEMU -- {VALGRIND_QEMU}
PRINT_QEMU_OUTPUT -- {PRINT_QEMU}
"""
{prefix}QEMU -- "{QEMU_PROG}" {QEMU_OPTIONS}
{prefix}QEMU_IMG -- "{QEMU_IMG_PROG}" {QEMU_IMG_OPTIONS}
{prefix}QEMU_IO -- "{QEMU_IO_PROG}" {QEMU_IO_OPTIONS}
{prefix}QEMU_NBD -- "{QEMU_NBD_PROG}" {QEMU_NBD_OPTIONS}
{prefix}IMGFMT -- {IMGFMT}{imgopts}
{prefix}IMGPROTO -- {IMGPROTO}
{prefix}PLATFORM -- {platform}
{prefix}TEST_DIR -- {TEST_DIR}
{prefix}SOCK_DIR -- {SOCK_DIR}
{prefix}GDB_OPTIONS -- {GDB_OPTIONS}
{prefix}VALGRIND_QEMU -- {VALGRIND_QEMU}
{prefix}PRINT_QEMU_OUTPUT -- {PRINT_QEMU}
{prefix}"""
args = collections.defaultdict(str, self.get_env())
@ -310,5 +310,5 @@ PRINT_QEMU_OUTPUT -- {PRINT_QEMU}
u = os.uname()
args['platform'] = f'{u.sysname}/{u.machine} {u.nodename} {u.release}'
args['prefix'] = prefix
print(template.format_map(args))

View File

@ -152,10 +152,10 @@ class TestRunner(ContextManager['TestRunner']):
return results
def __init__(self, env: TestEnv, makecheck: bool = False,
def __init__(self, env: TestEnv, tap: bool = False,
color: str = 'auto') -> None:
self.env = env
self.makecheck = makecheck
self.tap = tap
self.last_elapsed = LastElapsedTime('.last-elapsed-cache', env)
assert color in ('auto', 'on', 'off')
@ -185,13 +185,16 @@ class TestRunner(ContextManager['TestRunner']):
""" Print short test info before/after test run """
test = os.path.basename(test)
if self.makecheck and status != '...':
if status and status != 'pass':
status = f' [{status}]'
else:
status = ''
if test_field_width is None:
test_field_width = 8
print(f' TEST iotest-{self.env.imgfmt}: {test}{status}')
if self.tap:
if status == 'pass':
print(f'ok {self.env.imgfmt} {test}')
elif status == 'fail':
print(f'not ok {self.env.imgfmt} {test}')
elif status == 'not run':
print(f'ok {self.env.imgfmt} {test} # SKIP')
return
if lasttime:
@ -343,7 +346,7 @@ class TestRunner(ContextManager['TestRunner']):
last_el = self.last_elapsed.get(test)
start = datetime.datetime.now().strftime('%H:%M:%S')
if not self.makecheck:
if not self.tap:
self.test_print_one_line(test=test,
test_field_width=test_field_width,
status = 'started' if mp else '...',
@ -372,7 +375,9 @@ class TestRunner(ContextManager['TestRunner']):
notrun = []
casenotrun = []
if not self.makecheck:
if self.tap:
self.env.print_env('# ')
else:
self.env.print_env()
test_field_width = max(len(os.path.basename(t)) for t in tests) + 2
@ -398,8 +403,6 @@ class TestRunner(ContextManager['TestRunner']):
if res.status == 'fail':
failed.append(name)
if self.makecheck:
self.env.print_env()
if res.diff:
print('\n'.join(res.diff))
elif res.status == 'not run':
@ -412,16 +415,16 @@ class TestRunner(ContextManager['TestRunner']):
if res.interrupted:
break
if notrun:
print('Not run:', ' '.join(notrun))
if not self.tap:
if notrun:
print('Not run:', ' '.join(notrun))
if casenotrun:
print('Some cases not run in:', ' '.join(casenotrun))
if casenotrun:
print('Some cases not run in:', ' '.join(casenotrun))
if failed:
print('Failures:', ' '.join(failed))
print(f'Failed {len(failed)} of {n_run} iotests')
return False
else:
print(f'Passed all {n_run} iotests')
return True
if failed:
print('Failures:', ' '.join(failed))
print(f'Failed {len(failed)} of {n_run} iotests')
else:
print(f'Passed all {n_run} iotests')
return not failed