On 17.09.19 10:29, Max Reitz wrote: > On 17.09.19 10:18, Max Reitz wrote: >> On 13.09.19 20:30, John Snow wrote: >>> >>> >>> On 9/13/19 8:47 AM, Max Reitz wrote: >>>> On 20.08.19 23:32, John Snow wrote: >>>>> >>>>> >>>>> On 8/19/19 4:18 PM, Max Reitz wrote: >>>>>> null-aio may not be whitelisted. Skip all test cases that require it. >>>>>> >>>>>> Signed-off-by: Max Reitz >>>>>> --- >>>>>> tests/qemu-iotests/093 | 12 +++++++++--- >>>>>> 1 file changed, 9 insertions(+), 3 deletions(-) >>>>>> >>>>>> diff --git a/tests/qemu-iotests/093 b/tests/qemu-iotests/093 >>>>>> index 50c1e7f2ec..f03fa24a07 100755 >>>>>> --- a/tests/qemu-iotests/093 >>>>>> +++ b/tests/qemu-iotests/093 >>>>>> @@ -24,7 +24,7 @@ import iotests >>>>>> nsec_per_sec = 1000000000 >>>>>> >>>>>> class ThrottleTestCase(iotests.QMPTestCase): >>>>>> - test_img = "null-aio://" >>>>>> + test_driver = "null-aio" >>>>>> max_drives = 3 >>>>>> >>>>>> def blockstats(self, device): >>>>>> @@ -35,10 +35,14 @@ class ThrottleTestCase(iotests.QMPTestCase): >>>>>> return stat['rd_bytes'], stat['rd_operations'], stat['wr_bytes'], stat['wr_operations'] >>>>>> raise Exception("Device not found for blockstats: %s" % device) >>>>>> >>>>>> + def required_drivers(self): >>>>>> + return [self.test_driver] >>>>>> + >>>>>> + @iotests.skip_if_unsupported(required_drivers) >>>>> >>>>> Oh, I see why you're passing args[0] back to the callback now. Why not >>>>> just pass self.required_drivers and call it with no arguments instead? >>>>> >>>>> You can get a bound version that way that doesn't need additional >>>>> arguments, and then the callback is free to take generic callables of >>>>> any kind. >>>> >>>> Am I doing something wrong? >>>> >>>> I just get >>>> >>>> +Traceback (most recent call last): >>>> + File "093", line 26, in >>>> + class ThrottleTestCase(iotests.QMPTestCase): >>>> + File "093", line 41, in ThrottleTestCase >>>> + @iotests.skip_if_unsupported(self.required_drivers) >>>> +NameError: name 'self' is not defined >>>> >>>> this way. >>>> >>>> Max >>>> >>> What was I even talking about? :\ Well. >>> >>> I'd still like to define func_wrapper with a nod to the type constraint >>> it has: >>> >>> def func_wrapper(instance: iotests.QMPTestCase, *args, **kwargs): >>> [...] >>> >>> >>> Then, you'd write: >>> >>> if callable(required_formats): >>> fmts = required_formats(instance) >>> else: >>> fmts = required_formats >> >> Yep, that anyway. (Although I didn’t know about the “param: type” >> syntax and put that constraint in a comment instead. Thanks again :-)) > > Ah, but it isn’t a constraint, but just a “type hint” and the > interpreter doesn’t enforce it. How quaint. Oh, and they were introduced only in 3.5. Maybe that’s a tad too new. > Well, better than a comment anyway. So maybe not. Max