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. Well, better than a comment anyway. Max