From 5920931c149ad49fedeae26cd4dbad703ada5673 Mon Sep 17 00:00:00 2001 From: Bastian Krause Date: Tue, 21 Jun 2022 16:20:00 +0200 Subject: [PATCH 1/2] driver/qemudriver: let _read() handle max_size kwarg f5226ed3 ("implement 'max_size' in serialdriver read") introduced a new kwarg in ConsoleExpectMixin which is passed through to the driver's internal _read() method. The QEMUDriver was not adjusted accordingly, so do that now. Fixes: f5226ed3 ("implement 'max_size' in serialdriver read") Signed-off-by: Bastian Krause --- labgrid/driver/qemudriver.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/labgrid/driver/qemudriver.py b/labgrid/driver/qemudriver.py index 94ec64896..f071e62be 100644 --- a/labgrid/driver/qemudriver.py +++ b/labgrid/driver/qemudriver.py @@ -231,13 +231,15 @@ def monitor_command(self, command): "Can't use monitor command on non-running target") return self.qmp.execute(command) - def _read(self, size=1, timeout=10): + def _read(self, size=1, timeout=10, max_size=None): ready, _, _ = select.select([self._clientsocket], [], [], timeout) if ready: # Collect some more data time.sleep(0.01) # Always read a page, regardless of size - res = self._clientsocket.recv(4096) + size = 4096 + size = min(max_size, size) if max_size else size + res = self._clientsocket.recv(size) else: raise TIMEOUT(f"Timeout of {timeout:.2f} seconds exceeded") return res From cde4e2a35ed471fad769ef4bf75bf4d062e9e1d8 Mon Sep 17 00:00:00 2001 From: Bastian Krause Date: Tue, 21 Jun 2022 16:29:21 +0200 Subject: [PATCH 2/2] tests/qemudriver: add on/off and read/write tests Signed-off-by: Bastian Krause --- tests/test_qemudriver.py | 37 +++++++++++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/tests/test_qemudriver.py b/tests/test_qemudriver.py index d476cb1ed..d94032ca9 100644 --- a/tests/test_qemudriver.py +++ b/tests/test_qemudriver.py @@ -41,9 +41,46 @@ def qemu_driver(qemu_target): rootfs='rootfs') return q +@pytest.fixture +def qemu_mock(mocker): + popen_mock = mocker.patch('subprocess.Popen') + popen_mock.return_value.wait.return_value = 0 + popen_mock.return_value.stdout.readline.return_value = b""" + { + "QMP": { + "version": {} + }, + "return": {} + } + """ + + select_mock = mocker.patch('select.select') + select_mock.return_value = True, None, None + + socket_mock = mocker.patch('socket.socket') + socket_mock.return_value.accept.return_value = mocker.MagicMock(), '' + def test_qemu_instance(qemu_target, qemu_driver): assert (isinstance(qemu_driver, QEMUDriver)) def test_qemu_activate_deactivate(qemu_target, qemu_driver): qemu_target.activate(qemu_driver) qemu_target.deactivate(qemu_driver) + +def test_qemu_on_off(qemu_target, qemu_driver, qemu_mock): + qemu_target.activate(qemu_driver) + + qemu_driver.on() + qemu_driver.off() + + qemu_target.deactivate(qemu_driver) + +def test_qemu_read_write(qemu_target, qemu_driver, qemu_mock): + qemu_target.activate(qemu_driver) + + qemu_driver.on() + qemu_driver.read() + qemu_driver.read(max_size=10) + qemu_driver.write(b'abc') + + qemu_target.deactivate(qemu_driver)