| #!/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) |