#!/bin/bash # RunIPhoneUnitTest.sh # Copyright 2008 Google Inc. # # Licensed under the Apache License, Version 2.0 (the "License"); you may not # use this file except in compliance with the License. You may obtain a copy # of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, WITHOUT # WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the # License for the specific language governing permissions and limitations under # the License. # # Runs all unittests through the iPhone simulator. We don't handle running them # on the device. To run on the device just choose "run". set -o errexit set -o nounset # Uncomment the next line to trace execution. #set -o verbose # Controlling environment variables: # GTM_DISABLE_ZOMBIES - # Set to a non-zero value to turn on zombie checks. You will probably # want to turn this off if you enable leaks. GTM_DISABLE_ZOMBIES=${GTM_DISABLE_ZOMBIES:=1} # GTM_DISABLE_TERMINATION # Set to a non-zero value so that the app doesn't terminate when it's finished # running tests. This is useful when using it with external tools such # as Instruments. # GTM_REMOVE_GCOV_DATA # Before starting the test, remove any *.gcda files for the current run so # you won't get errors when the source file has changed and the data can't # be merged. # GTM_REMOVE_GCOV_DATA=${GTM_REMOVE_GCOV_DATA:=0} # GTM_DISABLE_USERDIR_SETUP # Controls whether or not CFFIXED_USER_HOME is erased and set up from scratch # for you each time the script is run. In some cases you may have a wrapper # script calling this one that takes care of that for us so you can set up # a certain user configuration. GTM_DISABLE_USERDIR_SETUP=${GTM_DISABLE_USERDIR_SETUP:=0} # GTM_DISABLE_IPHONE_LAUNCH_DAEMONS # Controls whether or not we launch up the iPhone Launch Daemons before # we start testing. You need Launch Daemons to test anything that interacts # with security. Note that it is OFF by default. Set # GTM_DISABLE_IPHONE_LAUNCH_DAEMONS=0 before calling this script # to turn it on. GTM_DISABLE_IPHONE_LAUNCH_DAEMONS=${GTM_DISABLE_IPHONE_LAUNCH_DAEMONS:=1} # GTM_TEST_AFTER_BUILD # When set to 1, tests are run only when TEST_AFTER_BUILD is set to "YES". # This can be used to have tests run as an after build step when running # from the command line, but not when running from within XCode. GTM_USE_TEST_AFTER_BUILD=${GTM_USE_TEST_AFTER_BUILD:=0} ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")") ScriptName=$(basename "$0") ThisScript="${ScriptDir}/${ScriptName}" XCODE_VERSION_MINOR=${XCODE_VERSION_MINOR:=0000} GTMXcodeNote() { echo "${ThisScript}:${1}: note: GTM ${2}" } GTMXcodeError() { echo "${ThisScript}:${1}: error: GTM ${2}" } # Creates a file containing the plist for the securityd daemon and prints the # filename to stdout. GTMCreateLaunchDaemonPlist() { local plist_file plist_file="$TMPDIR/securityd.$$.plist" echo $plist_file # Create the plist file with PlistBuddy. /usr/libexec/PlistBuddy \ -c "Add :Label string RunIPhoneLaunchDaemons" \ -c "Add :ProgramArguments array" \ -c "Add :ProgramArguments: string \"$IPHONE_SIMULATOR_ROOT/usr/libexec/securityd\"" \ -c "Add :EnvironmentVariables dict" \ -c "Add :EnvironmentVariables:DYLD_ROOT_PATH string \"$IPHONE_SIMULATOR_ROOT\"" \ -c "Add :EnvironmentVariables:IPHONE_SIMULATOR_ROOT string \"$IPHONE_SIMULATOR_ROOT\"" \ -c "Add :EnvironmentVariables:CFFIXED_USER_HOME string \"$CFFIXED_USER_HOME\"" \ -c "Add :MachServices dict" \ -c "Add :MachServices:com.apple.securityd bool YES" "$plist_file" > /dev/null } if [[ "$GTM_USE_TEST_AFTER_BUILD" == 1 && "$TEST_AFTER_BUILD" == "NO" ]]; then GTMXcodeNote ${LINENO} "Skipping running of unittests since TEST_AFTER_BUILD=NO." elif [ "$PLATFORM_NAME" == "iphonesimulator" ]; then # Xcode 4.5 changed how simulator app can be run. The way this script has # been working results in them now just logging a message and calling exit(0) # from Apple code. Report the error that the tests aren't going to work. if [[ "${XCODE_VERSION_MINOR}" -ge "0450" ]]; then GTMXcodeError ${LINENO} \ "Unit testing process not supported on Xcode >= 4.5 (${XCODE_VERSION_MINOR}). Use RuniOSUnitTestsUnderSimulator.sh." exit 1 fi # We kill the iPhone simulator because otherwise we run into issues where # the unittests fail becuase the simulator is currently running, and # at this time the iPhone SDK won't allow two simulators running at the same # time. set +e /usr/bin/killall "iPhone Simulator" set -e if [ $GTM_REMOVE_GCOV_DATA -ne 0 ]; then if [ "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" != "-" ]; then if [ -d "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" ]; then GTMXcodeNote ${LINENO} "Removing any .gcda files" (cd "${OBJECT_FILE_DIR}-${CURRENT_VARIANT}" && \ find . -type f -name "*.gcda" -print0 | xargs -0 rm -f ) fi fi fi export DYLD_ROOT_PATH="$SDKROOT" export DYLD_FRAMEWORK_PATH="$CONFIGURATION_BUILD_DIR" export IPHONE_SIMULATOR_ROOT="$SDKROOT" export CFFIXED_USER_HOME="$TEMP_FILES_DIR/iPhone Simulator User Dir" # See http://developer.apple.com/technotes/tn2004/tn2124.html for an # explanation of these environment variables. # NOTE: any setup work is done before turning on the environment variables # to avoid having the setup work also get checked by what the variables # enabled. if [ $GTM_DISABLE_USERDIR_SETUP -eq 0 ]; then # Cleanup user home directory if [ -d "$CFFIXED_USER_HOME" ]; then rm -rf "$CFFIXED_USER_HOME" fi mkdir "$CFFIXED_USER_HOME" mkdir "$CFFIXED_USER_HOME/Documents" mkdir -p "$CFFIXED_USER_HOME/Library/Caches" fi if [ $GTM_DISABLE_IPHONE_LAUNCH_DAEMONS -eq 0 ]; then # Remove any instance of RunIPhoneLaunchDaemons left running in the case the # 'trap' below fails. We first must check for RunIPhoneLaunchDaemons' # presence as 'launchctl remove' will kill this script if run from within an # Xcode build. launchctl list | grep RunIPhoneLaunchDaemons && launchctl remove RunIPhoneLaunchDaemons # If we want to test anything that interacts with the keychain, we need # securityd up and running. LAUNCH_DAEMON_PLIST="$(GTMCreateLaunchDaemonPlist)" launchctl load $LAUNCH_DAEMON_PLIST rm $LAUNCH_DAEMON_PLIST # No matter how we exit, we want to shut down our launchctl job. trap "launchctl remove RunIPhoneLaunchDaemons" INT TERM EXIT fi if [ $GTM_DISABLE_ZOMBIES -eq 0 ]; then GTMXcodeNote ${LINENO} "Enabling zombies" export CFZombieLevel=3 export NSZombieEnabled=YES fi export MallocScribble=YES export MallocPreScribble=YES export MallocGuardEdges=YES export MallocStackLogging=YES export NSAutoreleaseFreedObjectCheckEnabled=YES # Turn on the mostly undocumented OBJC_DEBUG stuff. export OBJC_DEBUG_FRAGILE_SUPERCLASSES=YES export OBJC_DEBUG_UNLOAD=YES # Turned off due to the amount of false positives from NS classes. # export OBJC_DEBUG_FINALIZERS=YES export OBJC_DEBUG_NIL_SYNC=YES export OBJC_PRINT_REPLACED_METHODS=YES # Start our app. "$TARGET_BUILD_DIR/$EXECUTABLE_PATH" -RegisterForSystemEvents else GTMXcodeNote ${LINENO} "Skipping running of unittests for device build." fi exit 0