On 06/03/2019 17:51, Kevin Wolf wrote: > Am 04.03.2019 um 11:08 hat Andrey Shinkevich geschrieben: >> Supported formats listed by 'qemu' may differ from those listed by >> 'qemu-img' due to whitelists. Some test cases require specific formats >> that may be used with qemu. They can be inquired directly by running >> 'qemu -drive format=help'. The response takes whitelists into account. >> The method supported_formats() serves for that. The method decorator >> skip_if_unsupported() checks if all requested formats are whitelisted. >> If not, the test case will be skipped. That has been implemented in >> the 'check' file in the way similar to the 'test notrun' mechanism. >> >> Suggested-by: Roman Kagan <[email protected]> >> Suggested-by: Vladimir Sementsov-Ogievskiy <[email protected]> >> Signed-off-by: Andrey Shinkevich <[email protected]> >> --- >> tests/qemu-iotests/check | 16 +++++++++++++- >> tests/qemu-iotests/iotests.py | 50 >> +++++++++++++++++++++++++++++++++++++++++++ >> 2 files changed, 65 insertions(+), 1 deletion(-) >> >> diff --git a/tests/qemu-iotests/check b/tests/qemu-iotests/check >> index 895e1e3..b9d539c 100755 >> --- a/tests/qemu-iotests/check >> +++ b/tests/qemu-iotests/check >> @@ -25,6 +25,7 @@ try=0 >> n_bad=0 >> bad="" >> notrun="" >> +casenotrun="" >> interrupt=true >> >> # by default don't output timestamps >> @@ -664,6 +665,11 @@ END { if (NR > 0) { >> echo "Not run:$notrun" >> echo "Not run:$notrun" >>check.log >> fi >> + if [ ! -z "$casenotrun" ] >> + then >> + echo "Some cases not run in:$casenotrun" >> + echo "Some cases not run in:$casenotrun" >>check.log >> + fi >> if [ ! -z "$n_bad" -a $n_bad != 0 ] >> then >> echo "Failures:$bad" >> @@ -743,6 +749,10 @@ do >> printf " " # prettier output with timestamps. >> fi >> rm -f core $seq.notrun >> + if [ -f $seq.casenotrun ] >> + then >> + rm -f $seq.casenotrun >> + fi >> >> start=$(_wallclock) >> $timestamp && printf %s " [$(date "+%T")]" >> @@ -823,7 +833,11 @@ do >> fi >> fi >> fi >> - >> + if [ -f $seq.casenotrun ] >> + then >> + cat $seq.casenotrun >> + casenotrun="$casenotrun $seq" >> + fi >> fi >> >> # come here for each test, except when $showme is true >> diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py >> index b461f53..8fe1620 100644 >> --- a/tests/qemu-iotests/iotests.py >> +++ b/tests/qemu-iotests/iotests.py >> @@ -728,6 +728,56 @@ def verify_quorum(): >> if not supports_quorum(): >> notrun('quorum support missing') >> >> +def qemu_pipe(*args): >> + '''Run qemu with an option to print something and exit (e.g. a help >> option), >> + and return its output''' >> + args = [qemu_prog] + qemu_opts + list(args) >> + subp = subprocess.Popen(args, stdout=subprocess.PIPE, >> + stderr=subprocess.STDOUT) >> + exitcode = subp.wait() >> + if exitcode < 0: >> + sys.stderr.write('qemu received signal %i: %s\n' % (-exitcode, >> + ' '.join(args))) >> + return subp.communicate()[0] >> + >> +def supported_formats(read_only=False): >> + '''Set 'read_only' to True to check ro-whitelist >> + Otherwise, rw-whitelist is checked''' >> + format_message = qemu_pipe("-drive", "format=help") >> + available = [] >> + >> + if read_only: >> + # Check read-only whitelist >> + available = format_message.splitlines()[1].split(":")[1].split() >> + else: >> + # Check read-write whitelist >> + available = format_message.splitlines()[0].split(":")[1].split() >> + >> + return available > > With Python 3: > > +====================================================================== > +ERROR: testBlkVerify (__main__.TestBlockdevDel) > +---------------------------------------------------------------------- > +Traceback (most recent call last): > + File "/home/kwolf/source/qemu/tests/qemu-iotests/iotests.py", line 800, in > func_wrapper > + set(supported_formats(read_only))) > + File "/home/kwolf/source/qemu/tests/qemu-iotests/iotests.py", line 782, in > supported_formats > + available = format_message.splitlines()[0].split(":")[1].split() > +TypeError: a bytes-like object is required, not 'str' > + > +====================================================================== > +ERROR: testQuorum (__main__.TestBlockdevDel) > +---------------------------------------------------------------------- > +Traceback (most recent call last): > + File "/home/kwolf/source/qemu/tests/qemu-iotests/iotests.py", line 800, in > func_wrapper > + set(supported_formats(read_only))) > + File "/home/kwolf/source/qemu/tests/qemu-iotests/iotests.py", line 782, in > supported_formats > + available = format_message.splitlines()[0].split(":")[1].split() > +TypeError: a bytes-like object is required, not 'str' > + > > This fixes it for me (the first hunk is actually a bonus which fixes a > preexisting bug, which somehow meant that the reason was not printed): > > diff --git a/tests/qemu-iotests/iotests.py b/tests/qemu-iotests/iotests.py > index e6ae4e91b7..b41ac4be51 100644 > --- a/tests/qemu-iotests/iotests.py > +++ b/tests/qemu-iotests/iotests.py > @@ -712,7 +712,7 @@ def notrun(reason): > # Each test in qemu-iotests has a number ("seq") > seq = os.path.basename(sys.argv[0]) > > - open('%s/%s.notrun' % (output_dir, seq), 'wb').write(reason + '\n') > + open('%s/%s.notrun' % (output_dir, seq), 'wt').write(reason + '\n') > print('%s not run: %s' % (seq, reason)) > sys.exit(0) >
Thanks a lot. I am going to add the fix above as a separate patch in v3 with "Signed-off-by: Kevin Wolf <[email protected]>" Andrey > @@ -761,7 +761,8 @@ def qemu_pipe(*args): > and return its output''' > args = [qemu_prog] + qemu_opts + list(args) > subp = subprocess.Popen(args, stdout=subprocess.PIPE, > - stderr=subprocess.STDOUT) > + stderr=subprocess.STDOUT, > + universal_newlines=True) > exitcode = subp.wait() > if exitcode < 0: > sys.stderr.write('qemu received signal %i: %s\n' % (-exitcode, > @@ -788,7 +789,7 @@ def case_notrun(reason): > # Each test in qemu-iotests has a number ("seq") > seq = os.path.basename(sys.argv[0]) > > - open('%s/%s.casenotrun' % (output_dir, seq), 'ab').write( > + open('%s/%s.casenotrun' % (output_dir, seq), 'at').write( > ' [case not run] ' + reason + '\n') > > def skip_if_unsupported(required_formats=[], read_only=False): >
