qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Qemu-devel] [PATCH 2/3] iotests: ask QEMU for supported formats


From: Andrey Shinkevich
Subject: Re: [Qemu-devel] [PATCH 2/3] iotests: ask QEMU for supported formats
Date: Wed, 6 Mar 2019 17:59:03 +0000


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 <address@hidden>
>> Suggested-by: Vladimir Sementsov-Ogievskiy <address@hidden>
>> Signed-off-by: Andrey Shinkevich <address@hidden>
>> ---
>>   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 <address@hidden>"

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):
> 

reply via email to

[Prev in Thread] Current Thread [Next in Thread]