xref: /aosp_15_r20/external/googletest/run_tests.py (revision 481dde660366d6f317d242b6974ef1b20adb843c)
1*481dde66SAndroid Build Coastguard Worker#!/usr/bin/env python
2*481dde66SAndroid Build Coastguard Worker#
3*481dde66SAndroid Build Coastguard Worker# Copyright (C) 2016 The Android Open Source Project
4*481dde66SAndroid Build Coastguard Worker#
5*481dde66SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
6*481dde66SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
7*481dde66SAndroid Build Coastguard Worker# You may obtain a copy of the License at
8*481dde66SAndroid Build Coastguard Worker#
9*481dde66SAndroid Build Coastguard Worker#      http://www.apache.org/licenses/LICENSE-2.0
10*481dde66SAndroid Build Coastguard Worker#
11*481dde66SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
12*481dde66SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
13*481dde66SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14*481dde66SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
15*481dde66SAndroid Build Coastguard Worker# limitations under the License.
16*481dde66SAndroid Build Coastguard Worker#
17*481dde66SAndroid Build Coastguard Worker"""Runs all tests for gtest/gmock."""
18*481dde66SAndroid Build Coastguard Workerimport argparse
19*481dde66SAndroid Build Coastguard Workerimport logging
20*481dde66SAndroid Build Coastguard Workerimport os
21*481dde66SAndroid Build Coastguard Workerimport sys
22*481dde66SAndroid Build Coastguard Worker
23*481dde66SAndroid Build Coastguard Worker
24*481dde66SAndroid Build Coastguard Worker# pylint: disable=design
25*481dde66SAndroid Build Coastguard Worker
26*481dde66SAndroid Build Coastguard Worker
27*481dde66SAndroid Build Coastguard Workerdef logger():
28*481dde66SAndroid Build Coastguard Worker    """Return the default logger for the module."""
29*481dde66SAndroid Build Coastguard Worker    return logging.getLogger(__name__)
30*481dde66SAndroid Build Coastguard Worker
31*481dde66SAndroid Build Coastguard Worker
32*481dde66SAndroid Build Coastguard Workerdef call(cmd, *args, **kwargs):
33*481dde66SAndroid Build Coastguard Worker    """Proxy for subprocess.call with logging."""
34*481dde66SAndroid Build Coastguard Worker    import subprocess
35*481dde66SAndroid Build Coastguard Worker    logger().info('call `%s`', ' '.join(cmd))
36*481dde66SAndroid Build Coastguard Worker    return subprocess.call(cmd, *args, **kwargs)
37*481dde66SAndroid Build Coastguard Worker
38*481dde66SAndroid Build Coastguard Worker
39*481dde66SAndroid Build Coastguard Workerdef parse_args():
40*481dde66SAndroid Build Coastguard Worker    "Parse and return command line arguments."""
41*481dde66SAndroid Build Coastguard Worker    parser = argparse.ArgumentParser()
42*481dde66SAndroid Build Coastguard Worker    parser.add_argument('--host', action='store_true')
43*481dde66SAndroid Build Coastguard Worker    parser.add_argument('-v', '--verbose', action='store_true')
44*481dde66SAndroid Build Coastguard Worker    return parser.parse_args()
45*481dde66SAndroid Build Coastguard Worker
46*481dde66SAndroid Build Coastguard Worker
47*481dde66SAndroid Build Coastguard Workerdef main():
48*481dde66SAndroid Build Coastguard Worker    "Program entry point."""
49*481dde66SAndroid Build Coastguard Worker    args = parse_args()
50*481dde66SAndroid Build Coastguard Worker    log_level = logging.INFO
51*481dde66SAndroid Build Coastguard Worker    if args.verbose:
52*481dde66SAndroid Build Coastguard Worker        log_level = logging.DEBUG
53*481dde66SAndroid Build Coastguard Worker    logging.basicConfig(level=log_level)
54*481dde66SAndroid Build Coastguard Worker
55*481dde66SAndroid Build Coastguard Worker    if args.host:
56*481dde66SAndroid Build Coastguard Worker        test_location = os.path.join(os.environ['ANDROID_HOST_OUT'], 'nativetest64')
57*481dde66SAndroid Build Coastguard Worker    else:
58*481dde66SAndroid Build Coastguard Worker        data_dir = os.path.join(os.environ['OUT'], 'data')
59*481dde66SAndroid Build Coastguard Worker        test_location = os.path.join(data_dir, 'nativetest64')
60*481dde66SAndroid Build Coastguard Worker        if not os.path.exists(test_location):
61*481dde66SAndroid Build Coastguard Worker            test_location = os.path.join(data_dir, 'nativetest')
62*481dde66SAndroid Build Coastguard Worker
63*481dde66SAndroid Build Coastguard Worker    num_tests = 0
64*481dde66SAndroid Build Coastguard Worker    failures = []
65*481dde66SAndroid Build Coastguard Worker    for test_dir in ['gtest_tests', 'gtest_ndk_tests', 'gmock_tests']:
66*481dde66SAndroid Build Coastguard Worker        test_dir = os.path.join(test_location, test_dir)
67*481dde66SAndroid Build Coastguard Worker        if not os.path.isdir(test_dir):
68*481dde66SAndroid Build Coastguard Worker            logger().debug('Skipping %s', test_dir)
69*481dde66SAndroid Build Coastguard Worker            continue
70*481dde66SAndroid Build Coastguard Worker
71*481dde66SAndroid Build Coastguard Worker        logger().debug('Scanning %s for tests', test_dir)
72*481dde66SAndroid Build Coastguard Worker        for test in os.listdir(test_dir):
73*481dde66SAndroid Build Coastguard Worker            if not test.startswith('gtest') and not test.startswith('gmock'):
74*481dde66SAndroid Build Coastguard Worker                logger().debug('Skipping %s', test)
75*481dde66SAndroid Build Coastguard Worker                continue
76*481dde66SAndroid Build Coastguard Worker            num_tests += 1
77*481dde66SAndroid Build Coastguard Worker
78*481dde66SAndroid Build Coastguard Worker            if args.host:
79*481dde66SAndroid Build Coastguard Worker                cmd = [os.path.join(test_dir, test)]
80*481dde66SAndroid Build Coastguard Worker                if call(cmd) != 0:
81*481dde66SAndroid Build Coastguard Worker                    failures.append(test)
82*481dde66SAndroid Build Coastguard Worker            else:
83*481dde66SAndroid Build Coastguard Worker                device_dir = test_dir.replace(os.environ['OUT'], '')
84*481dde66SAndroid Build Coastguard Worker                cmd = ['adb', 'shell', 'cd {} && ./{}'.format(device_dir, test)]
85*481dde66SAndroid Build Coastguard Worker                if call(cmd) != 0:
86*481dde66SAndroid Build Coastguard Worker                    failures.append(test)
87*481dde66SAndroid Build Coastguard Worker
88*481dde66SAndroid Build Coastguard Worker    if num_tests == 0:
89*481dde66SAndroid Build Coastguard Worker        logger().error('No tests found!')
90*481dde66SAndroid Build Coastguard Worker        sys.exit(1)
91*481dde66SAndroid Build Coastguard Worker
92*481dde66SAndroid Build Coastguard Worker    num_failures = len(failures)
93*481dde66SAndroid Build Coastguard Worker    num_passes = num_tests - num_failures
94*481dde66SAndroid Build Coastguard Worker    logger().info('%d/%d tests passed', num_passes, num_tests)
95*481dde66SAndroid Build Coastguard Worker    if len(failures) > 0:
96*481dde66SAndroid Build Coastguard Worker        logger().error('Failures:\n%s', '\n'.join(failures))
97*481dde66SAndroid Build Coastguard Worker    else:
98*481dde66SAndroid Build Coastguard Worker        logger().info('All tests passed!')
99*481dde66SAndroid Build Coastguard Worker    sys.exit(num_failures)
100*481dde66SAndroid Build Coastguard Worker
101*481dde66SAndroid Build Coastguard Worker
102*481dde66SAndroid Build Coastguard Workerif __name__ == '__main__':
103*481dde66SAndroid Build Coastguard Worker    main()
104