[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [RFC 5/6] device-crash-test: Basic device_add support
From: |
Eduardo Habkost |
Subject: |
[Qemu-devel] [RFC 5/6] device-crash-test: Basic device_add support |
Date: |
Tue, 26 Sep 2017 20:07:08 -0300 |
Add a 'method' testcase argument that will test the device using
device_add instead of -device. A new device_add_error whitelist
key is now supported, to catch device_add errors.
Signed-off-by: Eduardo Habkost <address@hidden>
---
scripts/device-crash-test | 38 +++++++++++++++++++++++++++++++++-----
1 file changed, 33 insertions(+), 5 deletions(-)
diff --git a/scripts/device-crash-test b/scripts/device-crash-test
index 4c23ffa449..1245e214a0 100755
--- a/scripts/device-crash-test
+++ b/scripts/device-crash-test
@@ -35,7 +35,7 @@ import argparse
from itertools import chain
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'scripts'))
-from qemu import QEMUMachine
+from qemu import QEMUMachine, MonitorResponseError
logger = logging.getLogger('device-crash-test')
dbg = logger.debug
@@ -203,6 +203,11 @@ ERROR_WHITELIST = [
{'log':r"core 0 already populated"},
{'log':r"could not find stage1 bootloader"},
+ {'exitcode':None, 'device_add_error':r"^Bus '[\w.-]+' does not support
hotplugging$"},
+ {'exitcode':None, 'device_add_error':r"^No '[\w-]+' bus found for device
'[\w-]+'$"},
+ # There are too many ways device_add can fail, ignore all of them as long
as QEMU doesn't crash:
+ {'exitcode':None, 'device_add_error':r".+"},
+
# other exitcode=1 failures not listed above will just generate INFO
messages:
{'exitcode':1, 'loglevel':logging.INFO},
@@ -290,7 +295,10 @@ def whitelistResultMatch(wl, r):
r.get('exitcode') == wl.get('exitcode', 1)) and
('log' not in wl or
('log' in r and
- re.search(wl['log'], r['log'], re.MULTILINE))))
+ re.search(wl['log'], r['log'], re.MULTILINE))) and
+ ('device_add_error' not in wl or
+ ('device_add_error' in r and
+ re.search(wl['device_add_error'], r['device_add_error']))))
def checkResultWhitelist(r):
@@ -339,6 +347,7 @@ class QemuBinaryInfo(object):
self.alldevs = set(qomListTypeNames(vm, implements=devtype,
abstract=False))
self.dev_info = dict((t, vm.command('query-device-type',
typename=t)) for t in self.alldevs)
self.user_devs = set(d for d in self.alldevs if
self.dev_info[d]['user-creatable'])
+ self.hotpluggable_devs = set(d for d in self.alldevs if
self.dev_info[d]['hotpluggable'])
self.machines = list(m['name'] for m in
vm.command('query-machines'))
self.kvm_available = vm.command('query-kvm')['enabled']
finally:
@@ -391,11 +400,14 @@ def checkOneCase(args, testcase):
accel = testcase['accel']
machine = testcase['machine']
device = testcase['device']
+ method = testcase['method']
+ assert method in ['-device', 'device_add']
dbg("will test: %r", testcase)
- args = ['-S', '-machine', '%s,accel=%s' % (machine, accel),
- '-device', qemuOptsEscape(device)]
+ args = ['-S', '-machine', '%s,accel=%s' % (machine, accel)]
+ if method == '-device':
+ args.extend(['-device', qemuOptsEscape(device)])
cmdline = ' '.join([binary] + args)
dbg("will launch QEMU: %s", cmdline)
vm = QEMUMachine(binary=binary, args=args)
@@ -405,6 +417,12 @@ def checkOneCase(args, testcase):
try:
vm.launch()
+ if method == 'device_add':
+ dbg('running device_add %s', device)
+ try:
+ vm.command('device_add', driver=device)
+ except MonitorResponseError, e:
+ r['device_add_error'] = e.reply['error']['desc']
except KeyboardInterrupt:
raise
except:
@@ -434,14 +452,22 @@ def machinesToTest(args, testcase):
return getBinaryInfo(args, testcase['binary']).machines
+def plugMethods(args, testcase):
+ return ['-device', 'device_add']
+
+
def devicesToTest(args, testcase):
- return getBinaryInfo(args, testcase['binary']).user_devs
+ if testcase['method'] == 'device_add':
+ return getBinaryInfo(args, testcase['binary']).hotpluggable_devs
+ else:
+ return getBinaryInfo(args, testcase['binary']).user_devs
TESTCASE_VARIABLES = [
('binary', binariesToTest),
('accel', accelsToTest),
('machine', machinesToTest),
+ ('method', plugMethods),
('device', devicesToTest),
]
@@ -494,6 +520,8 @@ def logResult(f, level):
logger.log(level, "cmdline: %s", f['cmdline'])
for l in f.get('log', '').strip().split('\n'):
logger.log(level, "log: %s", l)
+ if 'device_add_error' in f:
+ logger.log(level, "device_add error: %s", f['device_add_error'])
logger.log(level, "exit code: %r", f.get('exitcode'))
if 'exc_traceback' in f:
logger.log(level, "exception:")
--
2.13.5
- [Qemu-devel] [RFC 0/6] device-crash-test: device_add test mode, Eduardo Habkost, 2017/09/26
- [Qemu-devel] [RFC 1/6] device-crash-test: Make whitelist code a bit more flexible, Eduardo Habkost, 2017/09/26
- [Qemu-devel] [RFC 2/6] device-crash-test: Log detailed info on success too, Eduardo Habkost, 2017/09/26
- [Qemu-devel] [RFC 4/6] device-crash-test: Exit immediately on fatal failures on quick mode, Eduardo Habkost, 2017/09/26
- [Qemu-devel] [RFC 3/6] device-crash-test: Allow checkOneCase() to report multiple results, Eduardo Habkost, 2017/09/26
- [Qemu-devel] [RFC 5/6] device-crash-test: Basic device_add support,
Eduardo Habkost <=
- [Qemu-devel] [RFC 6/6] device-crash-test: Multi-device device_add test, Eduardo Habkost, 2017/09/26