|  | #!/usr/bin/python | 
|  | # Copyright 2016 The Chromium Authors. All rights reserved. | 
|  | # Use of this source code is governed by a BSD-style license that can be | 
|  | # found in the LICENSE file. | 
|  |  | 
|  | """Run a test. | 
|  |  | 
|  | Sample usage: | 
|  | ./run.py \ | 
|  | -a src/xcodebuild/Release-iphoneos/base_unittests.app \ | 
|  | -o /tmp/out \ | 
|  | -p iPhone 5s \ | 
|  | -v 9.3 | 
|  |  | 
|  | Installs base_unittests.app in an iPhone 5s simulator running iOS 9.3, | 
|  | runs it, and captures all test data in /tmp/out. | 
|  | """ | 
|  |  | 
|  | import argparse | 
|  | import json | 
|  | import os | 
|  | import sys | 
|  | import traceback | 
|  |  | 
|  | import test_runner | 
|  |  | 
|  |  | 
|  | def main(args, test_args): | 
|  | summary = {} | 
|  | tr = None | 
|  |  | 
|  | if not os.path.exists(args.out_dir): | 
|  | os.makedirs(args.out_dir) | 
|  |  | 
|  | try: | 
|  | if args.iossim and args.platform and args.version: | 
|  | tr = test_runner.SimulatorTestRunner( | 
|  | args.app, | 
|  | args.iossim, | 
|  | args.platform, | 
|  | args.version, | 
|  | args.xcode_version, | 
|  | args.out_dir, | 
|  | env_vars=args.env_var, | 
|  | test_args=test_args, | 
|  | xctest=args.xctest, | 
|  | ) | 
|  | else: | 
|  | tr = test_runner.DeviceTestRunner( | 
|  | args.app, | 
|  | args.xcode_version, | 
|  | args.out_dir, | 
|  | env_vars=args.env_var, | 
|  | test_args=test_args, | 
|  | xctest=args.xctest, | 
|  | ) | 
|  |  | 
|  | return 0 if tr.launch() else 1 | 
|  | except test_runner.TestRunnerError as e: | 
|  | sys.stderr.write(traceback.format_exc()) | 
|  | summary['step_text'] = '%s%s' % ( | 
|  | e.__class__.__name__, ': %s' % e.args[0] if e.args else '') | 
|  |  | 
|  | # test_runner.Launch returns 0 on success, 1 on failure, so return 2 | 
|  | # on exception to distinguish between a test failure, and a failure | 
|  | # to launch the test at all. | 
|  | return 2 | 
|  | finally: | 
|  | if tr: | 
|  | summary['logs'] = tr.logs | 
|  |  | 
|  | with open(os.path.join(args.out_dir, 'summary.json'), 'w') as f: | 
|  | json.dump(summary, f) | 
|  | if tr: | 
|  | with open(os.path.join(args.out_dir, 'full_results.json'), 'w') as f: | 
|  | json.dump(tr.test_results, f) | 
|  |  | 
|  |  | 
|  | if __name__ == '__main__': | 
|  | parser = argparse.ArgumentParser() | 
|  |  | 
|  | parser.add_argument( | 
|  | '-a', | 
|  | '--app', | 
|  | help='Compiled .app to run.', | 
|  | metavar='app', | 
|  | required=True, | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-e', | 
|  | '--env-var', | 
|  | action='append', | 
|  | help='Environment variable to pass to the test itself.', | 
|  | metavar='ENV=val', | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-i', | 
|  | '--iossim', | 
|  | help='Compiled iossim to run the app on.', | 
|  | metavar='iossim', | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-j', | 
|  | '--args-json', | 
|  | default='{}', | 
|  | help='Specify "env_var": [...] and "test_args": [...] using a JSON dict.', | 
|  | metavar='{}', | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-o', | 
|  | '--out-dir', | 
|  | help='Directory to store all test data in.', | 
|  | metavar='dir', | 
|  | required=True, | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-p', | 
|  | '--platform', | 
|  | help='Platform to simulate.', | 
|  | metavar='sim', | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-v', | 
|  | '--version', | 
|  | help='Version of iOS the simulator should run.', | 
|  | metavar='ver', | 
|  | ) | 
|  | parser.add_argument( | 
|  | '-x', | 
|  | '--xcode-version', | 
|  | help='Version of Xcode to use.', | 
|  | metavar='ver', | 
|  | required=True, | 
|  | ) | 
|  | parser.add_argument( | 
|  | '--xctest', | 
|  | action='store_true', | 
|  | help='Whether or not the given app should be run as an XCTest.', | 
|  | ) | 
|  |  | 
|  | args, test_args = parser.parse_known_args() | 
|  | if args.iossim or args.platform or args.version: | 
|  | # If any of --iossim, --platform, or --version | 
|  | # are specified then they must all be specified. | 
|  | if not (args.iossim and args.platform and args.version): | 
|  | parser.error( | 
|  | 'must specify all or none of -i/--iossim, -p/--platform, -v/--version') | 
|  |  | 
|  | args_json = json.loads(args.args_json) | 
|  | args.env_var = args.env_var or [] | 
|  | args.env_var.extend(args_json.get('env_var', [])) | 
|  | args.xctest = args_json.get('xctest', args.xctest) | 
|  | test_args.extend(args_json.get('test_args', [])) | 
|  |  | 
|  | sys.exit(main(args, test_args)) |