blob: ed412c027b1d4b8cdb86fa484e1eaff46e4f9ba9 [file] [log] [blame]
#!/bin/bash
#
# RunMacOSUnitTests.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.
#
# Run the unit tests in this test bundle.
# Set up some env variables to make things as likely to crash as possible.
# See http://developer.apple.com/technotes/tn2004/tn2124.html for details.
#
set -o errexit
set -o nounset
# Uncomment the next line to trace execution.
#set -o verbose
# Required to make Xcode 6 actually run tests.
export TEST_AFTER_BUILD=YES
# 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:=0}
# GTM_DO_NOT_REMOVE_GCOV_DATA
# By default before starting the test, we remove any *.gcda files for the
# current project build configuration so you won't get errors when a source
# file has changed and the gcov data can't be merged.
# We remove all the gcda files for the current configuration for the entire
# project so that if you are building a test bundle to test another separate
# bundle we make sure to clean up the files for the test bundle and the bundle
# that you are testing.
# If you DO NOT want this to occur, set GTM_DO_NOT_REMOVE_GCOV_DATA to a
# non-zero value.
GTM_DO_NOT_REMOVE_GCOV_DATA=${GTM_DO_NOT_REMOVE_GCOV_DATA:=0}
# GTM_REMOVE_TARGET_GCOV_ONLY
# By default all *.gcda files are removed form the project. Setting this to
# 1 causes only the *.gcda files for the target to be removed.
# If GTM_DO_NOT_REMOVE_GCOV_DATA is set, this has no effect.
GTM_REMOVE_TARGET_GCOV_ONLY=${GTM_REMOVE_TARGET_GCOV_ONLY:=0}
# GTM_ONE_TEST_AT_A_TIME
# By default your tests run how ever parallel your projects/targets are
# setup. Setting this to 1 will cause only one to run at a time, this is
# useful if you are doing UI tests with the helper that controls the
# colorsync profile, or any other machine wide state.
GTM_ONE_TEST_AT_A_TIME=${GTM_ONE_TEST_AT_A_TIME:=0}
ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")")
ScriptName=$(basename "$0")
ThisScript="${ScriptDir}/${ScriptName}"
GTMXcodeNote() {
echo ${ThisScript}:${1}: note: GTM ${2}
}
# Helper that works like the linux flock util, so you can run something, but
# have only one run at a time.
MaybeFlock() {
if [ $GTM_ONE_TEST_AT_A_TIME -ne 0 ]; then
GTMXcodeNote ${LINENO} "Serializing test execution."
python -c "import fcntl, subprocess, sys
file = open('$TMPDIR/GTM_one_test_at_a_time', 'a')
fcntl.flock(file.fileno(), fcntl.LOCK_EX)
sys.exit(subprocess.call(sys.argv[1:]))" "${@}"
else
GTMXcodeNote ${LINENO} "Allowing parallel test execution."
"${@}"
fi
}
SetMemoryVariables() {
# Jack up some memory stress so we can catch more bugs.
# This is done via a helper so it can be invoked in two places at the
# last possible moment to avoid the variables causing tracing from other
# processes that are invoked along the way.
if [ $GTM_DISABLE_ZOMBIES -eq 0 ]; then
GTMXcodeNote ${LINENO} "Enabling zombies"
# CFZombieLevel disabled because it doesn't play well with the
# security framework
# export CFZombieLevel=3
export NSZombieEnabled=YES
fi
export MallocScribble=YES
export MallocPreScribble=YES
export MallocGuardEdges=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
}
if [ ! $GTM_DO_NOT_REMOVE_GCOV_DATA ]; then
GTM_GCOV_CLEANUP_DIR="${CONFIGURATION_TEMP_DIR}"
if [ $GTM_REMOVE_TARGET_GCOV_ONLY ]; then
GTM_GCOV_CLEANUP_DIR="${OBJECT_FILE_DIR}-${CURRENT_VARIANT}"
fi
if [ "${GTM_GCOV_CLEANUP_DIR}" != "-" ]; then
if [ -d "${GTM_GCOV_CLEANUP_DIR}" ]; then
GTMXcodeNote ${LINENO} "Removing gcov data files from ${GTM_GCOV_CLEANUP_DIR}"
(cd "${GTM_GCOV_CLEANUP_DIR}" && \
find . -type f -name "*.gcda" -print0 | xargs -0 rm -f )
fi
fi
fi
SetMemoryVariables
MaybeFlock "${SYSTEM_DEVELOPER_DIR}/Tools/RunTargetUnitTests"