Skip to content

Commit d50974c

Browse files
committed
qemudriver: Support interactions via monitor_command before spinning off the instance.
Signed-off-by: Joschka Seydell <[email protected]>
1 parent 91235cb commit d50974c

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

doc/configuration.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2867,6 +2867,10 @@ The QEMUDriver also requires the specification of:
28672867
specify the build device tree
28682868
- a path key, this is the path to the rootfs
28692869

2870+
To allow interactions with a prepared, not yet started QEMU instance, the ``prepare()`` method
2871+
can be explicitly called, after which ``monitor_command(...)`` can be run before eventually
2872+
releasing the CPU(s) via ``on()``.
2873+
28702874
SigrokDriver
28712875
~~~~~~~~~~~~
28722876
The :any:`SigrokDriver` uses a `SigrokDevice`_ resource to record samples and provides

labgrid/driver/qemudriver.py

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -259,9 +259,9 @@ def on_deactivate(self):
259259
shutil.rmtree(self._tempdir)
260260

261261
@step()
262-
def on(self):
263-
"""Start the QEMU subprocess, accept the unix socket connection and
264-
afterwards start the emulator using a QMP Command"""
262+
def prepare(self):
263+
"""Start the QEMU subprocess and accept the unix socket connection
264+
if not already prepared."""
265265
if self.status:
266266
return
267267
self.logger.debug("Starting with: %s", self._cmd)
@@ -287,7 +287,14 @@ def on(self):
287287

288288
# Restore port forwards
289289
for v in self._forwarded_ports.values():
290-
self._add_port_forward(*v)
290+
self._add_port_forward(*v)
291+
292+
@step()
293+
def on(self):
294+
"""Prepare the instance (only if not done already) and start the emulator
295+
using a QMP Command"""
296+
if not self._child:
297+
self.prepare()
291298

292299
self.monitor_command("cont")
293300

tests/test_qemudriver.py

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import pytest
22

33
from labgrid.driver import QEMUDriver
4+
from labgrid.driver.exception import ExecutionError
45
from labgrid import Environment
56

67
@pytest.fixture
@@ -61,6 +62,12 @@ def qemu_mock(mocker):
6162
socket_mock = mocker.patch('socket.socket')
6263
socket_mock.return_value.accept.return_value = mocker.MagicMock(), ''
6364

65+
@pytest.fixture
66+
def qemu_qmp_mock(mocker):
67+
monitor_mock = mocker.patch('labgrid.driver.qemudriver.QMPMonitor')
68+
monitor_mock.return_value.execute.return_value = {'return': {}}
69+
return monitor_mock
70+
6471
@pytest.fixture
6572
def qemu_version_mock(mocker):
6673
run_mock = mocker.patch('subprocess.run')
@@ -91,6 +98,27 @@ def test_qemu_on_off(qemu_target, qemu_driver, qemu_mock, qemu_version_mock):
9198

9299
qemu_target.deactivate(qemu_driver)
93100

101+
def test_qemu_prepare(qemu_target, qemu_driver, qemu_mock, qemu_version_mock):
102+
qemu_target.activate(qemu_driver)
103+
104+
qemu_driver.prepare()
105+
qemu_driver.on()
106+
107+
def test_qemu_monitor_command_without_prepare(qemu_target, qemu_driver, qemu_mock, qemu_version_mock, qemu_qmp_mock):
108+
qemu_target.activate(qemu_driver)
109+
110+
with pytest.raises(ExecutionError):
111+
qemu_driver.monitor_command("info")
112+
qemu_qmp_mock.assert_not_called()
113+
114+
def test_qemu_prepare_with_monitor_command(qemu_target, qemu_driver, qemu_mock, qemu_version_mock, qemu_qmp_mock):
115+
qemu_target.activate(qemu_driver)
116+
117+
qemu_driver.prepare()
118+
qemu_driver.monitor_command("info")
119+
qemu_qmp_mock.assert_called_once()
120+
qemu_qmp_mock.return_value.execute.assert_called_with("info", {})
121+
94122
def test_qemu_read_write(qemu_target, qemu_driver, qemu_mock, qemu_version_mock):
95123
qemu_target.activate(qemu_driver)
96124

0 commit comments

Comments
 (0)