blob: 48eef53c7205a542cc3352bcbddd236076038b79 [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
cyuehdbaec982019-12-09 13:20:38 +08007from __future__ import print_function
8
Chih-Yu Huang8c76e302016-02-18 19:03:55 +08009import logging
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080010import os
11import sys
12import tempfile
13import time
14import unittest
15
16WORKING_DIR = os.path.dirname(os.path.realpath(__file__))
17
18
19def PassMessage(message):
cyuehdbaec982019-12-09 13:20:38 +080020 print('\033[22;32m%s\033[22;0m' % message)
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080021
22
23def FailMessage(message):
cyuehdbaec982019-12-09 13:20:38 +080024 print('\033[22;31m%s\033[22;0m' % message)
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080025
26
27def LogFilePath(dir_name, filename):
28 return os.path.join(dir_name, filename.replace('/', '_') + '.log')
29
30
31def main(argv):
Chih-Yu Huang8c76e302016-02-18 19:03:55 +080032 logging.disable(logging.CRITICAL) # Ignore all logging output from unittest.
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080033 temp_dir = tempfile.mkdtemp()
34 total_tests = 0
35 passed_tests = 0
36 failed_tests = []
37 for filename in argv[1:]:
38 if not os.path.isfile(filename):
39 FailMessage('File is not found: %s' % filename)
40 continue
41 if not filename.endswith('.py'):
42 FailMessage('File is not python file: %s' % filename)
43 continue
44 filename = os.path.relpath(filename, WORKING_DIR)
45 module_name = filename[:-3].replace('/', '.')
46
47 suite = unittest.defaultTestLoader.loadTestsFromName(module_name)
48 start_time = time.time()
49 log_file = LogFilePath(temp_dir, filename)
cyuehdbaec982019-12-09 13:20:38 +080050 with open(log_file, 'w') as stream:
51 result = unittest.TextTestRunner(stream=stream).run(suite)
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080052 duration = time.time() - start_time
53 if result.wasSuccessful():
54 PassMessage('*** PASS [%.2f s] %s' % (duration, filename))
55 passed_tests += 1
56 else:
57 FailMessage('*** FAIL [%.2f s] %s' % (duration, filename))
58 failed_tests.append(filename)
59 total_tests += 1
60
cyuehdbaec982019-12-09 13:20:38 +080061 print('%d/%d tests passed' % (passed_tests, total_tests))
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080062 if failed_tests:
cyuehdbaec982019-12-09 13:20:38 +080063 print('')
64 print('Logs of %d failed tests:' % len(failed_tests))
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080065 for failed_test in failed_tests:
66 FailMessage(LogFilePath(temp_dir, failed_test))
cyuehdbaec982019-12-09 13:20:38 +080067 print('To re-test failed unittests, run:')
68 print('make test UNITTEST_WHITELIST="%s"' % ' '.join(failed_tests))
Chih-Yu Huang08c6e9d2015-11-25 19:06:07 +080069
70
71if __name__ == '__main__':
72 main(sys.argv)