# Copyright 2016 The Chromium OS Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import contextlib import dbus import logging import os import subprocess from autotest_lib.client.bin import test, utils from autotest_lib.client.common_lib import autotemp, error from autotest_lib.client.common_lib.cros import dbus_send class vm_CrosVmStart(test.test): """Tests crosvm.""" version = 1 BUS_NAME = 'org.chromium.ComponentUpdaterService' BUS_PATH = '/org/chromium/ComponentUpdaterService' BUS_INTERFACE = 'org.chromium.ComponentUpdaterService' LOAD_COMPONENT = 'LoadComponent' TERMINA_COMPONENT_NAME = 'cros-termina' USER = 'chronos' def _load_component(self, name): args = [dbus.String(name)] return dbus_send.dbus_send( self.BUS_NAME, self.BUS_INTERFACE, self.BUS_PATH, self.LOAD_COMPONENT, timeout_seconds=60, user=self.USER, args=args).response def run_once(self): """ Runs a basic test to see if crosvm starts. """ mnt_path = self._load_component(self.TERMINA_COMPONENT_NAME) if not mnt_path: raise error.TestError('Component Updater LoadComponent failed') kernel_path = mnt_path + '/vm_kernel' rootfs_path = mnt_path + '/vm_rootfs.img' crosvm_socket_path = '/tmp/vm_CrosVmStart.sock' # Running /bin/ls as init causes the VM to exit immediately, crosvm # will have a successful exit code. cmd = ['/usr/bin/crosvm', 'run', '-c', '1', '-m', '1024', '--disk', rootfs_path, '--socket', crosvm_socket_path, '-p', 'init=/bin/bash root=/dev/vda ro', kernel_path] proc = subprocess.Popen(cmd) if proc.pid <= 0: raise error.TestFail('Failed: crosvm did not start.') # Tell the VM to stop. stop_cmd = ['/usr/bin/crosvm', 'stop', '--socket', crosvm_socket_path] stop_proc = subprocess.Popen(cmd) if stop_proc.pid <= 0: raise error.TestFail('Failed: crosvm stop command failed.') stop_proc.wait(); if stop_proc.returncode == None: raise error.TestFail('Failed: crosvm stop did not exit.') if stop_proc.returncode != 0: raise error.TestFail('Failed: crosvm stop returned an error %d.' % stop_proc.returncode) # Wait for the VM to exit. proc.wait() if proc.returncode == None: raise error.TestFail('Failed: crosvm did not exit.') if proc.returncode != 0: raise error.TestFail('Failed: crosvm returned an error %d.' % proc.returncode)