blob: 181e3b301064f12718cf967dff7f178e18faf0e2 [file] [log] [blame]
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +08001#!/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
7import os
8import sys
9import tempfile
10import time
11import unittest
12
13WORKING_DIR = os.path.dirname(os.path.realpath(__file__))
14
15
16def PassMessage(message):
17 print '\033[22;32m%s\033[22;0m' % message
18
19
20def FailMessage(message):
21 print '\033[22;31m%s\033[22;0m' % message
22
23
24def LogFilePath(dir_name, filename):
25 return os.path.join(dir_name, filename.replace('/', '_') + '.log')
26
27
28def 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
66if __name__ == '__main__':
67 main(sys.argv)