Fix QEMU command printing
1. Move the print command to before the fork, so the recipe can capture
the output when running the "start" sub-command.
2. Don't redirect stdout for the "start" command, so the output is
captured normally. Since this code was being shared with "run", a bit
of refactoring is required.
Also, I ran the simulation tests for ledger.py and magenta.py to verify
no regression, and their expectation files seemed to be out of date. So
those are updated.
Change-Id: Icc03c1d6281b892a09247babdedede2d1b5c350e
diff --git a/recipe_modules/qemu/api.py b/recipe_modules/qemu/api.py
index 602956c..20489b5 100644
--- a/recipe_modules/qemu/api.py
+++ b/recipe_modules/qemu/api.py
@@ -14,31 +14,9 @@
super(QemuApi, self).__init__(*args, **kwargs)
self._qemu_dir = None
- def ensure_qemu(self, version=None):
- with self.m.step.nest('ensure_qemu'):
- with self.m.step.context({'infra_step': True}):
- qemu_package = ('fuchsia/tools/qemu/%s' %
- self.m.cipd.platform_suffix())
- self._qemu_dir = self.m.path['start_dir'].join('cipd', 'qemu')
- self.m.cipd.ensure(
- self._qemu_dir, {qemu_package: version or 'latest'})
- return self._qemu_dir
-
- def qemu_executable(self, arch):
- return self.m.path.join(self._qemu_dir, 'bin', 'qemu-system-%s' % arch)
-
- @contextmanager
- def background_run(self, *args, **kwargs):
- try:
- self.run(*args, action='start', **kwargs)
- yield
- finally:
- self.m.step('stop qemu and read log',
- [self.resource('qemu.py'), 'stop', '--log'])
-
- def run(self, name, arch, kernel, smp=4, memory=2048, kvm=False, initrd=None,
- cmdline=None, netdev=None, devices=[], action='run',
- step_test_data=None):
+ def _get_command(self, action, arch, kernel, smp=4, memory=2048, kvm=False,
+ initrd=None, cmdline=None, netdev=None, devices=[]):
+ """Builds the command-line args for the run or start actions."""
cmd = [
self.resource('qemu.py'),
action,
@@ -55,13 +33,37 @@
cmd.extend(['--netdev', netdev])
for device in devices:
cmd.extend(['--device', device])
-
cmd.append(kernel)
+ return cmd
+
+ def ensure_qemu(self, version=None):
+ with self.m.step.nest('ensure_qemu'):
+ with self.m.step.context({'infra_step': True}):
+ qemu_package = ('fuchsia/tools/qemu/%s' %
+ self.m.cipd.platform_suffix())
+ self._qemu_dir = self.m.path['start_dir'].join('cipd', 'qemu')
+ self.m.cipd.ensure(
+ self._qemu_dir, {qemu_package: version or 'latest'})
+ return self._qemu_dir
+
+ def qemu_executable(self, arch):
+ return self.m.path.join(self._qemu_dir, 'bin', 'qemu-system-%s' % arch)
+
+ @contextmanager
+ def background_run(self, *args, **kwargs):
+ try:
+ self.m.step('start qemu', self._get_command('start', *args, **kwargs))
+ yield
+ finally:
+ self.m.step( 'stop qemu and read log',
+ [self.resource('qemu.py'), 'stop', '--log'])
+
+ def run(self, step_name, *args, **kwargs):
+ step_test_data = kwargs.pop('step_test_data', None)
return self.m.step(
- name,
- cmd,
+ step_name,
+ self._get_command('run', *args, **kwargs),
stdin=self.m.raw_io.input(''),
stdout=self.m.raw_io.output(),
step_test_data=step_test_data or
- (lambda: self.m.raw_io.test_api.stream_output('qemu'))
- )
+ (lambda: self.m.raw_io.test_api.stream_output('qemu')))
diff --git a/recipe_modules/qemu/resources/qemu.py b/recipe_modules/qemu/resources/qemu.py
index 2c0f435..1e86b5a 100755
--- a/recipe_modules/qemu/resources/qemu.py
+++ b/recipe_modules/qemu/resources/qemu.py
@@ -129,6 +129,8 @@
for device in args.device:
cmd.extend(['-device', device])
+ print ' '.join(cmd)
+
if args.command == 'start':
daemon = True
if os.fork() != 0:
@@ -138,7 +140,6 @@
daemon = False
stdout = sys.stdout
- print ' '.join(cmd)
qemu = subprocess.Popen(cmd, stdout=subprocess.PIPE)
flags = fcntl.fcntl(qemu.stdout, fcntl.F_GETFL)
fcntl.fcntl(qemu.stdout, fcntl.F_SETFL, flags | os.O_NONBLOCK)
diff --git a/recipes/fuchsia.expected/tests.json b/recipes/fuchsia.expected/tests.json
index bff4382d..bd27d9b 100644
--- a/recipes/fuchsia.expected/tests.json
+++ b/recipes/fuchsia.expected/tests.json
@@ -313,8 +313,7 @@
"e1000,netdev=net0",
"[START_DIR]/out/build-magenta/build-magenta-pc-x86-64/magenta.bin"
],
- "name": "run fuchsia",
- "stdout": "/path/to/tmp/"
+ "name": "start qemu"
},
{
"cmd": [
diff --git a/recipes/fuchsia.py b/recipes/fuchsia.py
index ca6ec94..436d926 100644
--- a/recipes/fuchsia.py
+++ b/recipes/fuchsia.py
@@ -146,7 +146,7 @@
netdev = 'user,id=net0,hostfwd=tcp::%d-:%d' % (
TEST_RUNNER_PORT, TEST_RUNNER_PORT)
- qemu = api.qemu.background_run('run fuchsia',
+ qemu = api.qemu.background_run(
qemu_arch,
magenta_image_path,
kvm=True,