2015-12-17 20:42:02 +00:00
#!/bin/bash
2015-12-16 02:02:20 +00:00
set -o pipefail
set -e
2016-08-19 17:06:45 +00:00
export TEST_SCRIPT = 1
export NPM_CONFIG_PROGRESS = false
2016-12-22 18:02:15 +00:00
TARGET = $1
CONFIGURATION = ${ 2 :- Release }
2017-03-16 11:15:20 +00:00
if echo $CONFIGURATION | grep -i " ^Debug $" > /dev/null ; then
CONFIGURATION = "Debug"
fi
2016-12-22 18:02:15 +00:00
IOS_SIM_DEVICE = ${ IOS_SIM_DEVICE :- } # use preferentially, otherwise will be set and re-exported
ios_sim_default_device_type = ${ IOS_SIM_DEVICE_TYPE :- iPhone 5s }
ios_sim_default_ios_version = ${ IOS_SIM_OS :- iOS 10.1 }
2017-02-06 10:33:14 +00:00
ACCEPTED_LICENSES = 'MIT, ISC, BSD, Apache-2.0, BSD-2-Clause, BSD-3-Clause, WTFPL, Unlicense, (MIT AND CC-BY-3.0)'
2016-01-27 00:12:26 +00:00
PATH = " /opt/android-sdk-linux/platform-tools: $PATH "
SRCROOT = $( cd " $( dirname " $0 " ) /.. " && pwd )
2017-01-02 12:35:45 +00:00
XCPRETTY = $( which xcpretty || true )
2016-12-22 18:02:15 +00:00
CI_RUN = false
if [ -n " ${ JENKINS_HOME } " ] ; then
CI_RUN = true
fi
2016-01-22 21:32:56 +00:00
2016-01-27 00:12:26 +00:00
# Start current working directory at the root of the project.
cd " $SRCROOT "
2016-04-19 23:57:52 +00:00
# Add node_modules to PATH just in case we weren't called from `npm test`
PATH = " $PWD /node_modules/.bin: $PATH "
2016-03-02 23:47:51 +00:00
if [ [ $TARGET = *-android ] ] ; then
# Inform the prepublish script to build Android modules.
export REALM_BUILD_ANDROID = 1
2016-01-22 21:30:16 +00:00
fi
2015-12-16 02:02:20 +00:00
2016-11-09 00:47:20 +00:00
SERVER_PID = 0
2016-01-27 00:12:26 +00:00
PACKAGER_OUT = " $SRCROOT /packager_out.txt "
LOGCAT_OUT = " $SRCROOT /logcat_out.txt "
2016-11-09 00:47:20 +00:00
download_server( ) {
sh ./scripts/download-object-server.sh
}
start_server( ) {
sh ./object-server-for-testing/start-object-server.command &
SERVER_PID = $!
}
stop_server( ) {
2017-01-02 12:35:45 +00:00
if [ [ ${ SERVER_PID } -gt 0 ] ] ; then
2016-12-07 12:28:05 +00:00
kill -9 ${ SERVER_PID }
2016-11-09 00:47:20 +00:00
fi
}
2016-12-22 18:02:15 +00:00
startedSimulator = false
log_temp =
test_temp_dir =
2016-01-27 00:12:26 +00:00
cleanup( ) {
2016-11-09 00:47:20 +00:00
# Kill started object server
2016-12-22 18:02:15 +00:00
stop_server || true
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# Quit Simulator.app to give it a chance to go down gracefully
if $startedSimulator ; then
osascript -e 'tell app "Simulator" to quit without saving' || true
sleep 0.25 # otherwise the pkill following will get it too early
fi
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# Kill all child processes.
pkill -9 -P $$ || true
2016-11-09 00:47:20 +00:00
# Kill react native packager
2017-01-04 14:07:25 +00:00
pkill -x node || true
2016-01-27 00:12:26 +00:00
rm -f " $PACKAGER_OUT " " $LOGCAT_OUT "
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# Cleanup temp files
if [ -n " $log_temp " ] && [ -e " $log_temp " ] ; then
rm " $log_temp " || true
fi
if [ -n " $test_temp_dir " ] && [ -e " $test_temp_dir " ] ; then
rm -rf " $test_temp_dir " || true
fi
2016-01-27 00:12:26 +00:00
}
open_chrome( ) {
local dir
for dir in " $HOME /Applications " "/Applications" ; do
if [ -d " $dir /Google Chrome.app " ] ; then
open " $dir /Google Chrome.app "
break
fi
2015-12-17 18:56:08 +00:00
done
}
2016-01-27 00:12:26 +00:00
start_packager( ) {
2016-03-16 20:30:06 +00:00
watchman watch-del-all || true
2016-02-02 22:52:15 +00:00
./node_modules/react-native/packager/packager.sh | tee " $PACKAGER_OUT " &
2016-01-27 00:12:26 +00:00
while :; do
if grep -Fxq "React packager ready." " $PACKAGER_OUT " ; then
break
else
echo "Waiting for packager."
sleep 2
fi
done
2016-01-26 20:23:26 +00:00
}
2016-05-13 23:30:57 +00:00
xctest( ) {
2016-12-22 18:02:15 +00:00
setup_ios_simulator
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Wait until the simulator is fully booted by waiting for it to launch SpringBoard
printf "Waiting for springboard to ensure device is ready..."
xcrun simctl launch " $IOS_SIM_DEVICE " com.apple.springboard 1>/dev/null 2>/dev/null || true
echo " done"
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Run the build and test
2016-08-19 17:06:45 +00:00
if [ -n " $XCPRETTY " ] ; then
2017-01-02 12:35:45 +00:00
log_temp = $( mktemp build.log.XXXXXX)
2016-12-22 18:02:15 +00:00
if [ -e " $log_temp " ] ; then
rm " $log_temp "
fi
xcrun xcodebuild -scheme " $1 " -configuration " $CONFIGURATION " -sdk iphonesimulator -destination name = "iPhone 5s" build test 2>& 1 | tee " $log_temp " | " $XCPRETTY " -c --no-utf --report junit --output build/reports/junit.xml || {
2016-11-22 00:48:03 +00:00
EXITCODE = $?
2017-01-02 12:35:45 +00:00
printf "*** Xcode Failure (exit code %s). The full xcode log follows: ***\n\n" " $EXITCODE "
2016-12-22 18:02:15 +00:00
cat " $log_temp "
2016-11-22 00:48:03 +00:00
printf "\n\n*** End Xcode Failure ***\n"
exit $EXITCODE
2016-11-10 18:06:48 +00:00
}
2016-12-22 18:02:15 +00:00
rm " $log_temp "
2016-08-19 17:06:45 +00:00
else
2016-12-22 18:02:15 +00:00
xcrun xcodebuild -scheme " $1 " -configuration " $CONFIGURATION " -sdk iphonesimulator -destination id = " $IOS_SIM_DEVICE " build test || {
2016-11-22 00:48:03 +00:00
EXITCODE = $?
echo " *** Failure (exit code $EXITCODE ). *** "
exit $EXITCODE
2016-12-22 18:02:15 +00:00
}
fi
}
setup_ios_simulator( ) {
# - Ensure one version of xcode is chosen by all tools
if [ [ -z " $DEVELOPER_DIR " ] ] ; then
2017-01-02 12:35:45 +00:00
DEV_DIR = " $( xcode-select -p) "
export DEVELOPER_DIR = $DEV_DIR
2016-12-22 18:02:15 +00:00
fi
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# -- Ensure that the simulator is ready
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
if [ $CI_RUN = = true ] ; then
# - Kill the Simulator to ensure we are running the correct one, only when running in CI
echo " Resetting simulator using toolchain from: $DEVELOPER_DIR "
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# Quit Simulator.app to give it a chance to go down gracefully
local deadline = $(( SECONDS+5))
while pgrep -qx Simulator && [ $SECONDS -lt $deadline ] ; do
osascript -e 'tell app "Simulator" to quit without saving' || true
2017-01-02 12:35:45 +00:00
sleep 0.25 # otherwise the pkill following will get it too early
2016-12-22 18:02:15 +00:00
done
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# stop CoreSimulatorService
launchctl remove com.apple.CoreSimulator.CoreSimulatorService 2>/dev/null || true
sleep 0.25 # launchtl can take a small moment to kill services
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# kill them with fire
while pgrep -qx Simulator com.apple.CoreSimulator.CoreSimulatorService; do
pkill -9 -x Simulator com.apple.CoreSimulator.CoreSimulatorService || true
sleep 0.05
done
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Prod `simctl` a few times as sometimes it fails the first couple of times after switching XCode vesions
local deadline = $(( SECONDS+5))
2017-01-02 12:35:45 +00:00
while [ -z " $( xcrun simctl list devices 2>/dev/null) " ] && [ $SECONDS -lt $deadline ] ; do
2016-12-22 18:02:15 +00:00
: # nothing to see here, will stop cycling on the first successful run
done
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Choose a device, if it has not already been chosen
local deadline = $(( SECONDS+5))
while [ -z " $IOS_SIM_DEVICE " ] && [ $SECONDS -lt $deadline ] ; do
2017-01-02 12:35:45 +00:00
IOS_DEVICE = $( ruby -rjson -e " puts JSON.parse(%x{xcrun simctl list devices --json})['devices'].each{|os,group| group.each{|dev| dev['os'] = os}}.flat_map{|x| x[1]}.select{|x| x['availability'] == '(available)'}.each{|x| x['score'] = (x['name'] == ' $ios_sim_default_device_type ' ? 1 : 0) + (x['os'] == ' $ios_sim_default_ios_version ' ? 1 : 0)}.sort_by!{|x| [x['score'], x['name']]}.reverse![0]['udid'] " )
export IOS_SIM_DEVICE = $IOS_DEVICE
2016-12-22 18:02:15 +00:00
done
if [ -z " $IOS_SIM_DEVICE " ] ; then
echo "*** Failed to determine the iOS Simulator device to use ***"
exit 1
fi
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Reset the device we will be using if running in CI
xcrun simctl shutdown " $IOS_SIM_DEVICE " 1>/dev/null 2>/dev/null || true # sometimes simctl gets confused
xcrun simctl erase " $IOS_SIM_DEVICE "
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Start the target in Simulator.app
# Note: as of Xcode 7.3.1 `simctl` can not completely boot a simulator, specifically it can not bring up backboard, so GUI apps can not run.
# This is fixed in version 8 of Xcode, but we still need the compatibility
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
" $DEVELOPER_DIR /Applications/Simulator.app/Contents/MacOS/Simulator " -CurrentDeviceUDID " $IOS_SIM_DEVICE " & # will get killed with all other children at exit
startedSimulator = true
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
else
# - ensure that the simulator is running on a developer's workstation
open " $DEVELOPER_DIR /Applications/Simulator.app "
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# - Select the first device booted in the simulator, since it will boot something for us
local deadline = $(( SECONDS+10))
while [ -z " $IOS_SIM_DEVICE " ] && [ $SECONDS -lt $deadline ] ; do
2017-01-02 12:35:45 +00:00
IOS_DEVICE = $( ruby -rjson -e "puts JSON.parse(%x{xcrun simctl list devices --json})['devices'].each{|os,group| group.each{|dev| dev['os'] = os}}.flat_map{|x| x[1]}.select{|x| x['state'] == 'Booted'}[0]['udid']" )
export IOS_SIM_DEVICE = $IOS_DEVICE
2016-12-22 18:02:15 +00:00
done
if [ -z " $IOS_SIM_DEVICE " ] ; then
echo "*** Failed to determine the iOS Simulator device in use ***"
exit 1
fi
2016-08-19 17:06:45 +00:00
fi
2017-01-02 12:35:45 +00:00
2016-12-22 18:02:15 +00:00
# Wait until the boot completes
2017-01-02 12:35:45 +00:00
printf " waiting for simulator (%s) to boot..." " $IOS_SIM_DEVICE "
2017-01-03 09:16:19 +00:00
until ruby -rjson -e "exit JSON.parse(%x{xcrun simctl list devices --json})['devices'].flat_map { |d| d[1] }.any? { |d| d['availability'] == '(available)' && d['state'] == 'Booted' }" ; do
2016-12-22 18:02:15 +00:00
sleep 0.25
done
echo " done"
echo "It will take some time before the simulator is fully ready, continuing on to other work"
2016-01-27 00:12:26 +00:00
}
# Cleanup now and also cleanup when this script exits.
cleanup
trap cleanup EXIT
2015-12-16 02:02:20 +00:00
2016-02-19 10:53:10 +00:00
# Use a consistent version of Node if possible.
2017-01-11 17:22:41 +00:00
if [ -f " $NVM_DIR /nvm.sh " ] ; then
. " $NVM_DIR /nvm.sh "
elif [ -x " $( command -v brew) " ] && [ -f " $( brew --prefix nvm) /nvm.sh " ] ; then
# we must be on mac and nvm was installed with brew
# TODO: change the mac slaves to use manual nvm installation
. " $( brew --prefix nvm) /nvm.sh "
2016-02-19 10:53:10 +00:00
fi
2017-01-11 17:22:41 +00:00
[ [ " $( command -v nvm) " ] ] && nvm use 6.5.0 || true
2016-02-19 10:53:10 +00:00
2016-11-11 07:11:31 +00:00
# Remove cached packages
rm -rf ~/.yarn-cache/npm-realm-*
2016-01-27 00:12:26 +00:00
case " $TARGET " in
2017-08-14 08:30:03 +00:00
"check-environment" )
npm run check-environment
; ;
2016-03-02 23:16:22 +00:00
"eslint" )
2017-03-27 12:38:46 +00:00
[ [ $CONFIGURATION = = 'Debug' ] ] && exit 0
2017-03-22 12:01:09 +00:00
npm run eslint
2016-03-02 23:16:22 +00:00
; ;
2016-11-17 15:55:02 +00:00
"eslint-ci" )
[ [ $CONFIGURATION = = 'Debug' ] ] && exit 0
npm install
./node_modules/.bin/eslint -f checkstyle . > eslint.xml || true
; ;
2017-02-06 10:33:14 +00:00
"license-check" )
2017-03-27 12:38:46 +00:00
[ [ $CONFIGURATION = = 'Debug' ] ] && exit 0
2017-03-22 12:01:09 +00:00
npm run license-check
2017-02-06 10:33:14 +00:00
; ;
2016-02-12 10:47:08 +00:00
"jsdoc" )
2016-03-17 00:49:20 +00:00
[ [ $CONFIGURATION = = 'Debug' ] ] && exit 0
2016-02-12 10:47:08 +00:00
npm run jsdoc
; ;
2016-01-27 00:12:26 +00:00
"react-tests" )
2017-08-14 08:30:03 +00:00
npm run check-environment
2017-01-31 13:07:29 +00:00
download_server
start_server
2015-12-16 02:02:20 +00:00
pushd tests/react-test-app
2016-11-11 07:55:26 +00:00
npm install
2016-01-27 00:12:26 +00:00
open_chrome
2015-12-17 18:56:08 +00:00
start_packager
2016-01-22 23:23:27 +00:00
2016-03-23 20:20:05 +00:00
pushd ios
2016-12-22 18:02:15 +00:00
xctest ReactTestApp
2017-01-31 13:07:29 +00:00
stop_server
2016-01-27 00:12:26 +00:00
; ;
"react-example" )
2017-08-14 08:30:03 +00:00
npm run check-environment
2015-12-16 02:02:20 +00:00
pushd examples/ReactExample
2016-01-27 00:12:26 +00:00
2016-02-19 10:28:59 +00:00
npm install
2016-02-16 08:37:10 +00:00
open_chrome
2015-12-17 18:56:08 +00:00
start_packager
2016-01-22 23:27:17 +00:00
pushd ios
2016-12-22 18:02:15 +00:00
xctest ReactExample
2016-01-27 00:12:26 +00:00
; ;
"react-tests-android" )
2017-08-14 08:30:03 +00:00
npm run check-environment
2017-02-02 01:41:27 +00:00
if [ " $( uname) " = 'Darwin' ] ; then
download_server
start_server
fi
2016-03-17 00:49:20 +00:00
[ [ $CONFIGURATION = = 'Debug' ] ] && exit 0
2016-11-18 22:00:30 +00:00
XCPRETTY = ''
2016-02-08 19:16:18 +00:00
2016-01-22 20:15:38 +00:00
pushd tests/react-test-app
npm install
2016-01-22 23:23:27 +00:00
2016-12-20 19:01:45 +00:00
echo "Resetting logcat"
2016-02-02 22:52:15 +00:00
# Despite the docs claiming -c to work, it doesn't, so `-T 1` alleviates that.
2016-01-27 00:12:26 +00:00
adb logcat -c
2016-02-02 22:52:15 +00:00
adb logcat -T 1 | tee " $LOGCAT_OUT " &
2016-01-27 00:12:26 +00:00
2016-12-20 19:01:45 +00:00
./run-android.sh
echo "Start listening for Test completion"
2016-01-27 00:12:26 +00:00
while :; do
if grep -q "__REALM_REACT_ANDROID_TESTS_COMPLETED__" " $LOGCAT_OUT " ; then
break
else
echo "Waiting for tests."
sleep 2
fi
2016-01-22 23:23:27 +00:00
done
2016-01-22 20:15:38 +00:00
2016-02-02 22:52:15 +00:00
rm -f tests.xml
adb pull /sdcard/tests.xml .
2016-01-27 00:12:26 +00:00
2016-02-02 22:52:15 +00:00
# Stop running child processes before printing results.
cleanup
2016-01-26 21:10:23 +00:00
echo "********* TESTS COMPLETED *********" ;
2016-01-27 00:12:26 +00:00
echo " ********* File location: $( pwd ) /tests.xml ********* " ;
2016-02-02 22:52:15 +00:00
cat tests.xml
2017-02-02 01:41:27 +00:00
2016-01-27 00:12:26 +00:00
; ;
2016-04-19 21:10:10 +00:00
"node" )
2017-08-14 08:30:03 +00:00
npm run check-environment
2016-11-10 13:42:58 +00:00
if [ " $( uname) " = 'Darwin' ] ; then
download_server
start_server
npm_tests_cmd = "npm run test"
2016-11-15 12:49:41 +00:00
npm install --build-from-source --realm_enable_sync
2016-11-10 13:42:58 +00:00
else
2017-03-30 08:24:46 +00:00
npm_tests_cmd = "npm run test"
2016-11-15 12:49:41 +00:00
npm install --build-from-source
2016-11-10 13:42:58 +00:00
fi
2016-10-11 20:30:39 +00:00
2016-05-13 23:30:57 +00:00
# Change to a temp directory.
cd " $( mktemp -q -d -t realm.node.XXXXXX) "
2016-12-22 18:02:15 +00:00
test_temp_dir = $PWD # set it to be cleaned at exit
2016-04-19 21:10:10 +00:00
2016-10-04 22:02:51 +00:00
pushd " $SRCROOT /tests "
npm install
2017-01-02 12:35:45 +00:00
eval " $npm_tests_cmd "
2016-10-04 22:02:51 +00:00
popd
2016-11-09 00:47:20 +00:00
stop_server
2016-04-19 21:10:10 +00:00
; ;
2017-08-11 08:30:57 +00:00
"electron" )
if [ " $( uname) " = 'Darwin' ] ; then
download_server
start_server
fi
# Change to a temp directory - because this is what is done for node - but we pushd right after?
cd " $( mktemp -q -d -t realm.electron.XXXXXX) "
test_temp_dir = $PWD # set it to be cleaned at exit
pushd " $SRCROOT /tests/electron "
if [ " $( uname) " = 'Darwin' ] ; then
npm install --build-from-source --realm_enable_sync
else
npm install --build-from-source
fi
# npm test -- --filter=ListTests
# npm test -- --filter=LinkingObjectsTests
# npm test -- --filter=ObjectTests
# npm test -- --filter=RealmTests
# npm test -- --filter=ResultsTests
# npm test -- --filter=QueryTests
# npm test -- --filter=MigrationTests
# npm test -- --filter=EncryptionTests
# npm test -- --filter=UserTests
# npm test -- --filter=SessionTests
# npm test -- --filter=GarbageCollectionTests
# npm test -- --filter=AsyncTests
npm test -- --process= main
npm test -- --process= render
popd
if [ " $( uname) " = 'Darwin' ] ; then
stop_server
fi
; ;
2016-08-10 13:47:55 +00:00
"test-runners" )
2017-08-14 08:30:03 +00:00
npm run check-environment
2017-01-03 10:32:30 +00:00
# Create a fake realm module that points to the source root so that test-runner tests can require('realm')
2016-10-11 20:30:39 +00:00
npm install --build-from-source
2017-03-22 12:01:09 +00:00
npm run test-runners
2016-08-10 13:47:55 +00:00
; ;
2017-08-30 11:09:40 +00:00
"all" )
# Run all tests that must pass before publishing.
for test in eslint license-check react-example react-tests-android react-tests; do
for configuration in Debug Release; do
echo " RUNNING TEST: $test ( $configuration ) "
echo '----------------------------------------'
npm test " $test " " $configuration " || die " Test Failed: $test ( $configuration ) "
echo
done
done
; ;
2016-03-03 22:58:05 +00:00
"object-store" )
pushd src/object-store
2017-01-02 12:35:45 +00:00
cmake -DCMAKE_BUILD_TYPE= " $CONFIGURATION " .
2016-03-03 22:58:05 +00:00
make run-tests
2016-04-19 21:10:10 +00:00
; ;
2016-10-04 22:02:51 +00:00
"download-object-server" )
2017-01-02 12:35:45 +00:00
# shellcheck disable=SC1091
2016-10-04 22:02:51 +00:00
. dependencies.list
object_server_bundle = " realm-object-server-bundled_node_darwin- $REALM_OBJECT_SERVER_VERSION .tar.gz "
curl -f -L " https://static.realm.io/downloads/object-server/ $object_server_bundle " -o " $object_server_bundle "
rm -rf tests/sync-bundle
mkdir -p tests/sync-bundle
tar -C tests/sync-bundle -xf " $object_server_bundle "
rm " $object_server_bundle "
echo -e "enterprise:\n skip_setup: true\n" >> "tests/sync-bundle/object-server/configuration.yml"
touch "tests/sync-bundle/object-server/do_not_open_browser"
; ;
"object-server-integration" )
2016-11-09 16:28:47 +00:00
echo -e "yes\n" | ./tests/sync-bundle/reset-server-realms.command
2016-10-04 22:02:51 +00:00
pushd " $SRCROOT /tests "
npm install
2016-11-09 20:50:19 +00:00
npm run test-sync-integration
2016-10-04 22:02:51 +00:00
popd
; ;
2016-01-27 00:12:26 +00:00
*)
2015-12-17 02:14:14 +00:00
echo " Invalid target ' ${ TARGET } ' "
2016-01-27 00:12:26 +00:00
exit 1
esac