#!/bin/bash # # Helper to run the pods tests. set -eu readonly ScriptDir=$(dirname "$(echo $0 | sed -e "s,^\([^/]\),$(pwd)/\1,")") printUsage() { NAME=$(basename "${0}") cat << EOF usage: ${NAME} [OPTIONS] This script runs some test to check the CocoaPods integration. OPTIONS: General: -h, --help Show this message --skip-static Skip the static based pods tests. --skip-framework Skip the framework based pods tests. --skip-ios Skip the iOS pods tests. --skip-osx Skip the OS X pods tests. EOF } TEST_MODES=( "static" "framework" ) TEST_NAMES=( "iOSCocoaPodsTester" "OSXCocoaPodsTester" ) while [[ $# != 0 ]]; do case "${1}" in -h | --help ) printUsage exit 0 ;; --skip-static ) TEST_MODES=(${TEST_MODES[@]/static}) ;; --skip-framework ) TEST_MODES=(${TEST_MODES[@]/framework}) ;; --skip-ios ) TEST_NAMES=(${TEST_NAMES[@]/iOSCocoaPodsTester}) ;; --skip-osx ) TEST_NAMES=(${TEST_NAMES[@]/OSXCocoaPodsTester}) ;; -*) echo "ERROR: Unknown option: ${1}" 1>&2 printUsage exit 1 ;; *) echo "ERROR: Unknown argument: ${1}" 1>&2 printUsage exit 1 ;; esac shift done # Sanity check. if [[ "${#TEST_NAMES[@]}" == 0 ]] ; then echo "ERROR: Need to run at least iOS or OS X tests." 1>&2 exit 2 fi if [[ "${#TEST_MODES[@]}" == 0 ]] ; then echo "ERROR: Need to run at least static or frameworks tests." 1>&2 exit 2 fi header() { echo "" echo "========================================================================" echo " ${@}" echo "========================================================================" echo "" } # Cleanup hook for do_test, assumes directory is correct. cleanup() { local TEST_NAME="$1" echo "Cleaning up..." # Generally don't let things fail, and eat common stdout, but let stderr show # incase something does hiccup. xcodebuild -workspace "${TEST_NAME}.xcworkspace" -scheme "${TEST_NAME}" clean > /dev/null || true pod deintegrate > /dev/null || true # Flush the cache so nothing is left behind. pod cache clean --all || true # Delete the files left after pod deintegrate. rm -f Podfile.lock || true rm -rf "${TEST_NAME}.xcworkspace" || true git checkout -- "${TEST_NAME}.xcodeproj" || true # Remove the Podfile that was put in place. rm -f Podfile || true } do_test() { local TEST_NAME="$1" local TEST_MODE="$2" header "${TEST_NAME}" - Mode: "${TEST_MODE}" cd "${ScriptDir}/${TEST_NAME}" # Hook in cleanup for any failures. trap "cleanup ${TEST_NAME}" EXIT # Ensure nothing is cached by pods to start with that could throw things off. pod cache clean --all # Put the right Podfile in place. cp -f "Podfile-${TEST_MODE}" "Podfile" xcodebuild_args=( "-workspace" "${TEST_NAME}.xcworkspace" "-scheme" "${TEST_NAME}" ) # For iOS, if the SDK is not provided it tries to use iphoneos, and the test # fail on Travis since those machines don't have a Code Signing identity. if [[ "${TEST_NAME}" == iOS* ]] ; then # Apparently the destination flag is required to avoid "Unsupported architecture" # errors. xcodebuild_args+=( -sdk iphonesimulator ONLY_ACTIVE_ARCH=NO -destination "platform=iOS Simulator,name=iPad 2,OS=9.3" ) fi # Do the work! pod install --verbose xcodebuild "${xcodebuild_args[@]}" build # Clear the hook and manually run cleanup. trap - EXIT cleanup "${TEST_NAME}" } # Run the tests. for TEST_NAME in "${TEST_NAMES[@]}" ; do for TEST_MODE in "${TEST_MODES[@]}" ; do do_test "${TEST_NAME}" "${TEST_MODE}" done done