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