diff options
author | Kevin Brothaler <admin@digipom.com> | 2017-01-16 13:06:25 -0400 |
---|---|---|
committer | Digipom Inc <admin@digipom.com> | 2017-01-17 14:47:08 -0400 |
commit | c8a4d214eb071627526896921e86aa87441cc2d0 (patch) | |
tree | 31d4b9b86c4494d070243e4c8ae904b4bfaad87a /ci/ios | |
parent | 6ec4f81a3852797410b80296d3afd61f2b255a36 (diff) | |
download | rust-libc-c8a4d214eb071627526896921e86aa87441cc2d0.tar.gz |
Run the unit tests on the iOS simulator for x86_64-apple-ios
Diffstat (limited to 'ci/ios')
-rwxr-xr-x | ci/ios/deploy_and_run_x86_64_binary_on_ios_simulator.py | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/ci/ios/deploy_and_run_x86_64_binary_on_ios_simulator.py b/ci/ios/deploy_and_run_x86_64_binary_on_ios_simulator.py new file mode 100755 index 0000000000..07be5b30b4 --- /dev/null +++ b/ci/ios/deploy_and_run_x86_64_binary_on_ios_simulator.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python +# +# Copyright 2017 The Rust Project Developers. See the COPYRIGHT +# file at the top-level directory of this distribution and at +# http://rust-lang.org/COPYRIGHT. +# +# Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or +# http://www.apache.org/licenses/LICENSE-2.0> or the MIT license +# <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your +# option. This file may not be copied, modified, or distributed +# except according to those terms. +# +# This is a script to deploy and execute a binary on an x86-64 iOS simulator. +# The primary use of this is to be able to run unit tests on the simulator and retrieve the results. +# +# To do this through Cargo instead, use Dinghy (https://github.com/snipsco/dinghy): +# cargo dinghy install, then cargo dinghy test. + +import os.path +import subprocess +import sys +import time + +# Step one: Wrap as an app +def package_as_simulator_app(crate_name, test_binary_path): + print 'Packaging simulator app' + subprocess.call(['rm', '-rf', 'ios_simulator_app']) + subprocess.check_call(['mkdir', 'ios_simulator_app']) + subprocess.check_call(['cp', test_binary_path, 'ios_simulator_app/' + crate_name]) + f = open('ios_simulator_app/Info.plist', 'w') + f.write('<?xml version="1.0" encoding="UTF-8"?>\n' + '<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">\n' + '<plist version="1.0">\n' + ' <dict>\n' + ' <key>CFBundleExecutable</key>\n' + ' <string>' + crate_name + '</string>\n' + ' <key>CFBundleIdentifier</key>\n' + ' <string>com.rust.unittests</string>\n' + ' <key>UIRequiredDeviceCapabilities</key>\n' + ' <array>\n' + ' <string>x86_64</string>\n' + ' </array>\n' + ' </dict>\n' + '</plist>\n') + +# Step two: Start the iOS simulator +def start_simulator(): + print 'Looking for iOS simulator' + xcrun_list = subprocess.Popen(['xcrun', 'simctl', 'list'], stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) + simulator_exists = False + simulator_booted = False + found_rust_sim = False + for line in xcrun_list.stdout: + if "rust_ios" in line: + if found_rust_sim == True: + raise Exception("Duplicate rust_ios simulators found. Please double-check xcrun simctl list.") + simulator_exists = True + simulator_booted = "(Booted)" in line + found_rust_sim = True + + if simulator_exists == False: + print 'Creating iOS simulator' + subprocess.check_output(['xcrun', 'simctl', 'create', 'rust_ios', 'com.apple.CoreSimulator.SimDeviceType.iPhone-SE', 'com.apple.CoreSimulator.SimRuntime.iOS-10-2']) + elif simulator_booted == True: + print 'Shutting down already-booted simulator' + subprocess.call(['xcrun', 'simctl', 'shutdown', 'rust_ios']) + + print 'Starting iOS simulator' + # We can't uninstall the app (if present) as that will hang if the simulator isn't completely booted; just erase the simulator instead. + subprocess.check_call(['xcrun', 'simctl', 'erase', 'rust_ios']) + subprocess.check_call(['xcrun', 'simctl', 'boot', 'rust_ios']) + +# Step three: Install the app +def install_app_to_simulator(): + print 'Installing app to simulator' + subprocess.check_call(['xcrun', 'simctl', 'install', 'booted', 'ios_simulator_app/']) + +# Step four: Run the app +def run_app_on_simulator(): + print 'Running app' + try: + test_run = subprocess.Popen(['xcrun', 'simctl', 'launch', '--console', 'booted', 'com.rust.unittests'], stdout=subprocess.PIPE, bufsize=1, universal_newlines=True) + test_run_failed = False + for line in test_run.stdout: + sys.stdout.write(line) + if test_run_failed == False: + test_run_failed = 'test result: FAILED.' in line + + sys.stdout.flush() + if test_run_failed == True: + raise Exception('Some tests failed') + finally: + print 'Shutting down simulator' + subprocess.call(['xcrun', 'simctl', 'shutdown', 'rust_ios']) + +# Run all steps in sequence +# TODO 1: Use a /tmp place for the app instead of current dir? +def main(): + if len(sys.argv) != 2: + print 'usage: ' + os.path.basename(sys.argv[0]) + ' executable' + sys.exit(-1) + + crate_name = os.path.basename(sys.argv[1]) + test_binary_path = sys.argv[1] + + package_as_simulator_app(crate_name, test_binary_path) + start_simulator() + install_app_to_simulator() + run_app_on_simulator() + +# Entry point +if __name__ == '__main__': + main()
\ No newline at end of file |