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,