Chih-Yu Huang | 08c6e9d | 2015-11-25 19:06:07 +0800 | [diff] [blame] | 1 | #!/usr/bin/python |
| 2 | # -*- coding: utf-8 -*- |
| 3 | # Copyright 2015 The Chromium OS Authors. All rights reserved. |
| 4 | # Use of this source code is governed by a BSD-style license that can be |
| 5 | # found in the LICENSE file. |
| 6 | |
| 7 | import os |
| 8 | import sys |
| 9 | import tempfile |
| 10 | import time |
| 11 | import unittest |
| 12 | |
| 13 | WORKING_DIR = os.path.dirname(os.path.realpath(__file__)) |
| 14 | |
| 15 | |
| 16 | def PassMessage(message): |
| 17 | print '\033[22;32m%s\033[22;0m' % message |
| 18 | |
| 19 | |
| 20 | def FailMessage(message): |
| 21 | print '\033[22;31m%s\033[22;0m' % message |
| 22 | |
| 23 | |
| 24 | def LogFilePath(dir_name, filename): |
| 25 | return os.path.join(dir_name, filename.replace('/', '_') + '.log') |
| 26 | |
| 27 | |
| 28 | def main(argv): |
| 29 | temp_dir = tempfile.mkdtemp() |
| 30 | total_tests = 0 |
| 31 | passed_tests = 0 |
| 32 | failed_tests = [] |
| 33 | for filename in argv[1:]: |
| 34 | if not os.path.isfile(filename): |
| 35 | FailMessage('File is not found: %s' % filename) |
| 36 | continue |
| 37 | if not filename.endswith('.py'): |
| 38 | FailMessage('File is not python file: %s' % filename) |
| 39 | continue |
| 40 | filename = os.path.relpath(filename, WORKING_DIR) |
| 41 | module_name = filename[:-3].replace('/', '.') |
| 42 | |
| 43 | suite = unittest.defaultTestLoader.loadTestsFromName(module_name) |
| 44 | start_time = time.time() |
| 45 | log_file = LogFilePath(temp_dir, filename) |
| 46 | result = unittest.TextTestRunner(stream=open(log_file, 'w')).run(suite) |
| 47 | duration = time.time() - start_time |
| 48 | if result.wasSuccessful(): |
| 49 | PassMessage('*** PASS [%.2f s] %s' % (duration, filename)) |
| 50 | passed_tests += 1 |
| 51 | else: |
| 52 | FailMessage('*** FAIL [%.2f s] %s' % (duration, filename)) |
| 53 | failed_tests.append(filename) |
| 54 | total_tests += 1 |
| 55 | |
| 56 | print '%d/%d tests passed' % (passed_tests, total_tests) |
| 57 | if failed_tests: |
| 58 | print '' |
| 59 | print 'Logs of %d failed tests:' % len(failed_tests) |
| 60 | for failed_test in failed_tests: |
| 61 | FailMessage(LogFilePath(temp_dir, failed_test)) |
| 62 | print 'To re-test failed unittests, run:' |
| 63 | print 'make test UNITTEST_WHITELIST="%s"' % ' '.join(failed_tests) |
| 64 | |
| 65 | |
| 66 | if __name__ == '__main__': |
| 67 | main(sys.argv) |