Files
react-native/scripts/objc-test.sh
Héctor Ramos 8443487ad5 Avoid failing Obj-C tests when xcpretty is not installed (#24173)
Summary:
Fixes an issue where `scripts/objc-test-ios.sh` would fail if `xcpretty` is not installed. As this tool is not bundled with macOS, and it's not explicitly called out in our docs on testing, the script should not fail if it's not present.

In a related change, JUnit reports are written to a more sensible location when the script is run outside of Circle CI.

[iOS] [Fixed] - Fixed test script failure when xcpretty is not present
Pull Request resolved: https://github.com/facebook/react-native/pull/24173

Differential Revision: D14726101

Pulled By: hramos

fbshipit-source-id: 9f3081a75a4a262f55aef8498241fe7d1e04b931
2019-04-03 10:45:35 -07:00

128 lines
3.8 KiB
Bash
Executable File

#!/bin/bash
# Copyright (c) Facebook, Inc. and its affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
#
# Script used to run iOS and tvOS tests.
# Environment variables are used to configure what test to run.
# If not arguments are passed to the script, it will only compile
# the RNTester.
# If the script is called with a single argument "test", we'll
# also run the RNTester integration test (needs JS and packager).
# ./objc-test.sh test
SCRIPTS=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
ROOT=$(dirname "$SCRIPTS")
# Create cleanup handler
cleanup() {
EXIT=$?
set +e
if [ $EXIT -ne 0 ];
then
WATCHMAN_LOGS=/usr/local/Cellar/watchman/3.1/var/run/watchman/$USER.log
[ -f "$WATCHMAN_LOGS" ] && cat "$WATCHMAN_LOGS"
fi
# kill whatever is occupying port 8081 (packager)
lsof -i tcp:8081 | awk 'NR!=1 {print $2}' | xargs kill
# kill whatever is occupying port 5555 (web socket server)
lsof -i tcp:5555 | awk 'NR!=1 {print $2}' | xargs kill
}
# Wait for the package to start
waitForPackager() {
local -i max_attempts=60
local -i attempt_num=1
until curl -s http://localhost:8081/status | grep "packager-status:running" -q; do
if (( attempt_num == max_attempts )); then
echo "Packager did not respond in time. No more attempts left."
exit 1
else
(( attempt_num++ ))
echo "Packager did not respond. Retrying for attempt number $attempt_num..."
sleep 1
fi
done
echo "Packager is ready!"
}
runTests() {
xcodebuild \
-project "RNTester/RNTester.xcodeproj" \
-scheme "$SCHEME" \
-sdk "$SDK" \
-destination "$DESTINATION" \
-UseModernBuildSystem="$USE_MODERN_BUILD_SYSTEM" \
build test
}
buildProject() {
xcodebuild \
-project "RNTester/RNTester.xcodeproj" \
-scheme "$SCHEME" \
-sdk "$SDK" \
-UseModernBuildSystem="$USE_MODERN_BUILD_SYSTEM" \
build
}
xcprettyFormat() {
if [ "$CI" ]; then
# Circle CI expects JUnit reports to be available here
REPORTS_DIR="$HOME/react-native/reports"
else
THIS_DIR=$(cd -P "$(dirname "$(readlink "${BASH_SOURCE[0]}" || echo "${BASH_SOURCE[0]}")")" && pwd)
# Write reports to the react-native root dir
REPORTS_DIR="$THIS_DIR/../build/reports"
fi
xcpretty --report junit --output "$REPORTS_DIR/junit/$TEST_NAME/results.xml"
}
preloadBundles() {
# Preload the RNTesterApp bundle for better performance in integration tests
curl -s 'http://localhost:8081/RNTester/js/RNTesterApp.ios.bundle?platform=ios&dev=true' -o /dev/null
curl -s 'http://localhost:8081/RNTester/js/RNTesterApp.ios.bundle?platform=ios&dev=true&minify=false' -o /dev/null
curl -s 'http://localhost:8081/IntegrationTests/IntegrationTestsApp.bundle?platform=ios&dev=true' -o /dev/null
curl -s 'http://localhost:8081/IntegrationTests/RCTRootViewIntegrationTestApp.bundle?platform=ios&dev=true' -o /dev/null
}
main() {
cd "$ROOT" || exit
# If first argument is "test", actually start the packager and run tests.
# Otherwise, just build RNTester and exit
if [ "$1" = "test" ]; then
# Start the packager
yarn start --max-workers=1 || echo "Can't start packager automatically" &
# Start the WebSocket test server
open "./IntegrationTests/launchWebSocketServer.command" || echo "Can't start web socket server automatically"
waitForPackager
preloadBundles
# Build and run tests.
if [ -x "$(command -v xcpretty)" ]; then
runTests | xcprettyFormat && exit "${PIPESTATUS[0]}"
else
echo 'Warning: xcpretty is not installed. Install xcpretty to generate JUnit reports.'
runTests
fi
else
# Build without running tests.
if [ -x "$(command -v xcpretty)" ]; then
buildProject | xcprettyFormat && exit "${PIPESTATUS[0]}"
else
buildProject
fi
fi
}
trap cleanup EXIT
main "$@"