summaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorAhmad Fatoum <a.fatoum@pengutronix.de>2023-06-19 11:52:39 +0200
committerSascha Hauer <s.hauer@pengutronix.de>2023-06-26 11:55:32 +0200
commit524e6aab982ea79f8ca13c69e37c217b15e88dbc (patch)
tree46838a728c85f361298c445bd0b845e6e18dce84 /test
parente4e427fcadf082e5382de82e62f2fa3938732bdb (diff)
downloadbarebox-524e6aab982ea79f8ca13c69e37c217b15e88dbc.tar.gz
barebox-524e6aab982ea79f8ca13c69e37c217b15e88dbc.tar.xz
test: add support for passing devices on command line
The test/emulate.pl script support a number of options to create RNG, block and console devices for use inside Qemu. In preparation for phasing out the perl script, add these as pytest options. These currently fix up options into the QEMUDriver extra_args key, but the intention is to move the logic into upstream QEMUDriver over time. Signed-off-by: Ahmad Fatoum <a.fatoum@pengutronix.de> Link: https://lore.barebox.org/20230619095240.4168216-5-a.fatoum@pengutronix.de Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
Diffstat (limited to 'test')
-rw-r--r--test/conftest.py70
-rw-r--r--test/strategy.py6
2 files changed, 76 insertions, 0 deletions
diff --git a/test/conftest.py b/test/conftest.py
index 794574799f..2bca3c37e5 100644
--- a/test/conftest.py
+++ b/test/conftest.py
@@ -33,3 +33,73 @@ def pytest_addoption(parser):
parser.addoption('--dry-run', action='store_const', const='qemu_dry_run',
dest='lg_initial_state',
help=('(for debugging) skip tests and just print Qemu command line'))
+ parser.addoption('--rng', action='count', dest='qemu_rng',
+ help=('instantiate Virt I/O random number generator'))
+ parser.addoption('--console', action='count', dest='qemu_console', default=0,
+ help=('Pass an extra console (Virt I/O or ns16550_pci) to emulated barebox'))
+ parser.addoption('--blk', action='append', dest='qemu_block',
+ default=[], metavar="FILE",
+ help=('Pass block device to emulated barebox. Can be specified more than once'))
+ parser.addoption('--qemu', action='append', dest='qemu_arg',
+ default=[], metavar="option",
+ help=('Pass option to QEMU as is'))
+
+@pytest.fixture(scope="session")
+def strategy(request, target, pytestconfig):
+ try:
+ strategy = target.get_driver("Strategy")
+ except NoDriverFoundError as e:
+ pytest.exit(e)
+
+ try:
+ features = target.env.config.data["targets"]["main"]["features"]
+ except KeyError:
+ features = []
+
+ virtio = None
+
+ if "virtio-mmio" in features:
+ virtio = "device"
+ if "virtio-pci" in features:
+ virtio = "pci,disable-legacy=on,disable-modern=off"
+ features.append("pci")
+
+ if virtio and pytestconfig.option.qemu_rng:
+ for i in range(pytestconfig.option.qemu_rng):
+ strategy.append_qemu_args("-device", f"virtio-rng-{virtio}")
+
+ for i in range(pytestconfig.option.qemu_console):
+ if virtio and i == 0:
+ strategy.append_qemu_args(
+ "-device", f"virtio-serial-{virtio}",
+ "-chardev", f"pty,id=virtcon{i}",
+ "-device", f"virtconsole,chardev=virtcon{i},name=console.virtcon{i}"
+ )
+ continue
+
+ # ns16550 serial driver only works with x86 so far
+ if 'pci' in features:
+ strategy.append_qemu_args(
+ "-chardev", f"pty,id=pcicon{i}",
+ "-device", f"pci-serial,chardev=pcicon{i}"
+ )
+ else:
+ pytest.exit("barebox currently supports only a single extra virtio console\n", 1)
+
+ for i, blk in enumerate(pytestconfig.option.qemu_block):
+ if virtio:
+ strategy.append_qemu_args(
+ "-drive", f"if=none,file={blk},format=raw,id=hd{i}",
+ "-device", f"virtio-blk-{virtio},drive=hd{i}"
+ )
+ else:
+ pytest.exit("--blk unsupported for target\n", 1)
+
+ for arg in pytestconfig.option.qemu_arg:
+ strategy.append_qemu_args(arg)
+
+ state = request.config.option.lg_initial_state
+ if state is not None:
+ strategy.force(state)
+
+ return strategy
diff --git a/test/strategy.py b/test/strategy.py
index 65cdae4fbf..8aa58151f6 100644
--- a/test/strategy.py
+++ b/test/strategy.py
@@ -122,6 +122,12 @@ class BareboxTestStrategy(Strategy):
self.target.env.config.data["tools"][self.qemu.qemu_bin] = \
shutil.which(self.qemu.qemu_bin)
+ def append_qemu_args(self, *args):
+ if self.qemu is None:
+ pytest.exit('Qemu option supplied for non-Qemu target')
+ for arg in args:
+ self.console.extra_args += " " + arg
+
def quote_cmd(cmd):
quoted = map(lambda s : s if s.find(" ") == -1 else "'" + s + "'", cmd)
return " ".join(quoted)