#!/bin/bash set -e -o pipefail # Workaround for Travis CI cookbook https://github.com/travis-ci/travis-ci/issues/4862, # where $PATH will be extended with relative paths to the NPM binaries. PATH=`echo $PATH | sed -e 's/:\.\/node_modules\/\.bin//'` TUNNEL_FILE="BrowserStackLocal-linux-x64.zip" TUNNEL_URL="https://www.browserstack.com/browserstack-local/$TUNNEL_FILE" TUNNEL_DIR="/tmp/browserstack-tunnel" TUNNEL_LOG="$LOGS_DIR/browserstack-tunnel.log" BROWSER_STACK_ACCESS_KEY=`echo $BROWSER_STACK_ACCESS_KEY | rev` # Cleanup and create the folder structure for the tunnel connector. rm -rf $TUNNEL_DIR $BROWSER_PROVIDER_READY_FILE mkdir -p $TUNNEL_DIR touch $TUNNEL_LOG cd $TUNNEL_DIR # Download the browserstack local binaries. curl $TUNNEL_URL -o $TUNNEL_FILE 2> /dev/null 1> /dev/null # Extract the browserstack local binaries from the tarball. mkdir -p browserstack-tunnel unzip -q $TUNNEL_FILE -d browserstack-tunnel # Cleanup the download directory. rm $TUNNEL_FILE ARGS="" # Set tunnel-id only on Travis, to make local testing easier. if [ ! -z "$TRAVIS_JOB_ID" ]; then ARGS="$ARGS --local-identifier $TRAVIS_JOB_ID" fi echo "Starting Browserstack Local in the background, logging into:" echo " $TUNNEL_LOG" echo " ---" echo " $ARGS" # Extension to the BrowserStackLocal binaries, because those can't create a readyfile. function create_ready_file { # To be able to exit the tail properly we need to have a sub shell spawned, which is # used to track the state of tail. { sleep 120; touch $BROWSER_PROVIDER_ERROR_FILE; } & TIMER_PID=$! # Disown the background process, because we don't want to show any messages when killing # the timer. disown # When the tail recognizes the `Ctrl-C` log message the BrowserStack Tunnel is up. { tail -n0 -f $TUNNEL_LOG --pid $TIMER_PID | { sed '/Ctrl/q' && kill -9 $TIMER_PID; }; } &> /dev/null echo echo "BrowserStack Tunnel ready" touch $BROWSER_PROVIDER_READY_FILE } browserstack-tunnel/BrowserStackLocal -k $BROWSER_STACK_ACCESS_KEY $ARGS &>> $TUNNEL_LOG & # Wait for the tunnel to be ready and create the readyfile with the Browserstack PID create_ready_file &