#!/usr/bin/env python # Copyright (c) 2013 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. from cStringIO import StringIO import pexpect import signal import sys import time TIMEOUT=10 RESULT_ID_TIMEOUT = 0 RESULT_ID_PASS = 1 RESULT_ID_FAIL = 2 RESULT_ID_EOF = 3 EXPECT_LIST = [pexpect.TIMEOUT, 'Pass!', 'Fail!', pexpect.EOF] class Tee(object): def __init__(self, target): self._target = target def write(self, data): sys.stdout.write(data) self._target.write(data) def flush(self): sys.stdout.flush() self._target.flush() def RunOnce(test_name, log): child = pexpect.spawn('build/host/{0}/{0}.exe'.format(test_name), timeout=TIMEOUT) child.logfile = log try: return child.expect(EXPECT_LIST) finally: if child.isalive(): child.kill(signal.SIGTERM) child.read() log = StringIO() tee_log = Tee(log) test_name = sys.argv[1] start_time = time.time() result_id = RunOnce(test_name, tee_log) elapsed_time = time.time() - start_time if result_id == RESULT_ID_TIMEOUT: sys.stderr.write('Test %s timed out after %d seconds!\n' % (test_name, TIMEOUT)) failed = True elif result_id == RESULT_ID_PASS: sys.stderr.write('Test %s passed! (%.3f seconds)\n' % (test_name, elapsed_time)) failed = False elif result_id == RESULT_ID_FAIL: sys.stderr.write('Test %s failed! (%.3f seconds)\n' % (test_name, elapsed_time)) failed = True elif result_id == RESULT_ID_EOF: sys.stderr.write('Test %s terminated unexpectedly! (%.3f seconds)\n' % (test_name, elapsed_time)) failed = True if failed: sys.stderr.write('\n====== Emulator output ======\n') sys.stderr.write(log.getvalue()) sys.stderr.write('\n=============================\n') sys.exit(1) else: sys.exit(0)