diff options
author | Ahmad Fatoum <a.fatoum@pengutronix.de> | 2023-06-19 11:52:39 +0200 |
---|---|---|
committer | Sascha Hauer <s.hauer@pengutronix.de> | 2023-06-26 11:55:32 +0200 |
commit | 524e6aab982ea79f8ca13c69e37c217b15e88dbc (patch) | |
tree | 46838a728c85f361298c445bd0b845e6e18dce84 /test | |
parent | e4e427fcadf082e5382de82e62f2fa3938732bdb (diff) | |
download | barebox-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.py | 70 | ||||
-rw-r--r-- | test/strategy.py | 6 |
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) |