blob: ba98c83e40f563373fcd3cd7910ba757c2827a6a [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
Chih-Yu Huang8c76e302016-02-18 19:03:55 +08007import logging
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +08008import os
9import sys
10import tempfile
11import time
12import unittest
13
14WORKING_DIR = os.path.dirname(os.path.realpath(__file__))
15
16
17def PassMessage(message):
18 print '\033[22;32m%s\033[22;0m' % message
19
20
21def FailMessage(message):
22 print '\033[22;31m%s\033[22;0m' % message
23
24
25def LogFilePath(dir_name, filename):
26 return os.path.join(dir_name, filename.replace('/', '_') + '.log')
27
28
29def main(argv):
Chih-Yu Huang8c76e302016-02-18 19:03:55 +080030 logging.disable(logging.CRITICAL) # Ignore all logging output from unittest.
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080031 temp_dir = tempfile.mkdtemp()
32 total_tests = 0
33 passed_tests = 0
34 failed_tests = []
35 for filename in argv[1:]:
36 if not os.path.isfile(filename):
37 FailMessage('File is not found: %s' % filename)
38 continue
39 if not filename.endswith('.py'):
40 FailMessage('File is not python file: %s' % filename)
41 continue
42 filename = os.path.relpath(filename, WORKING_DIR)
43 module_name = filename[:-3].replace('/', '.')
44
45 suite = unittest.defaultTestLoader.loadTestsFromName(module_name)
46 start_time = time.time()
47 log_file = LogFilePath(temp_dir, filename)
48 result = unittest.TextTestRunner(stream=open(log_file, 'w')).run(suite)
49 duration = time.time() - start_time
50 if result.wasSuccessful():
51 PassMessage('*** PASS [%.2f s] %s' % (duration, filename))
52 passed_tests += 1
53 else:
54 FailMessage('*** FAIL [%.2f s] %s' % (duration, filename))
55 failed_tests.append(filename)
56 total_tests += 1
57
58 print '%d/%d tests passed' % (passed_tests, total_tests)
59 if failed_tests:
60 print ''
61 print 'Logs of %d failed tests:' % len(failed_tests)
62 for failed_test in failed_tests:
63 FailMessage(LogFilePath(temp_dir, failed_test))
64 print 'To re-test failed unittests, run:'
65 print 'make test UNITTEST_WHITELIST="%s"' % ' '.join(failed_tests)
66
67
68if __name__ == '__main__':
69 main(sys.argv)