scripts/test.d/browser
#! /usr/bin/env bash
#
# Runs browser tests
#
# Usage:
# {{go}} {{cmd}} [--coverage] [--single-run]
#
# Options:
# --coverage Collect test coverage data using istanbul
# --single-run Run tests using PhantomJS
declare TEST_BROWSER_HELPER_DIR='public/tests/generated'
declare TEST_BROWSER_HELPER_INPUT='tests/helpers/browser.js'
declare TEST_BROWSER_COVERAGE_FILE="$_GO_ROOTDIR/.coverage/browser.json"
declare TEST_BROWSER_COVERAGE_MIDDLEWARE="$_GO_ROOTDIR/tests/helpers/coverage-middleware.js"
_test_browser_tab_completion() {
local word_index="$1"
shift
local args=("$@")
local word="${args[$word_index]}"
if [[ "$word_index" -gt '1' ]]; then
return 1
fi
@go.compgen -W '--coverage --single-run' -- "$word"
}
_test_browser_create_bundle() {
local helper_dir="$TEST_BROWSER_HELPER_DIR"
local bundle="$helper_dir/index.js"
if [[ ! -d "$helper_dir" ]] && ! mkdir -p "$helper_dir"; then
@go.printf 'Failed to create directory: %s\n' "$helper_dir" >&2
return 1
fi
browserify "$TEST_BROWSER_HELPER_INPUT" >"$bundle"
if [[ "$?" -ne '0' ]]; then
@go.printf 'Browserify failed to create: %s\n' "$bundle" >&2
exit 1
fi
}
_test_browser_run_tests() {
if ! _test_browser_create_bundle; then
return 1
fi
if [[ "$OSTYPE" == 'msys' ]]; then
export MSYS_NO_PATHCONV='true'
export MSYS2_ARG_CONV_EXCL='*'
fi
if [[ "$__single_run" == 'true' ]]; then
_test_browser_run_in_headless_browsers
else
_test_browser_run_in_browser
fi
}
_test_browser_run_in_browser() {
local test_args=('--open=/tests/')
if [[ "$__coverage_run" == 'true' ]]; then
test_args+=("--middleware=$TEST_BROWSER_COVERAGE_MIDDLEWARE")
fi
live-server "${test_args[@]}" public/
}
_test_browser_run_in_headless_browsers() {
local port
local test_server_url
local sleep_seconds='1'
local server_pid
local result='0'
port="$(tests/helpers/pick-unused-port)"
if [[ "$?" -ne '0' ]]; then
@go.printf 'Failed to pick an unused port.\n' >&2
return 1
fi
test_server_url="http://localhost:${port}"
set -m
COVERAGE_RUN="$__coverage_run" \
"$_GO_ROOTDIR/tests/helpers/browser-test-server" "$port" &
if [[ "$?" -ne '0' ]]; then
@go.printf 'Failed to launch live-server on port %d.\n' "$port" >&2
return 1
elif [[ -n "$CI" ]]; then
# live-server needs a little extra time on Travis.
sleep_seconds='3'
fi
sleep "$sleep_seconds"
server_pid="$!"
if ! _test_browser_run_in_chrome_headless; then
result='1'
fi
if ! _test_browser_run_in_phantomjs; then
result='1'
fi
_test_browser_download_coverage
kill -INT "$server_pid"
set +m
return "$result"
}
_test_browser_run_in_chrome_headless() {
local node_version="$(node --version)"
local major_version
if [[ "$node_version" =~ ^v([0-9]+)\.[0-9]+\.[0-9]+ ]]; then
major_version="${BASH_REMATCH[1]}"
fi
if [[ "$major_version" -lt '8' ]]; then
@go.log INFO "Skipping headless Chrome run on Node ${node_version}," \
"since mocha-chrome isn't supported before v8.0.0."
return
fi
@go.log INFO 'Running browser tests in headless Chrome'
# See https://docs.travis-ci.com/user/chrome#Sandboxing for details on why
# sandboxing is disabled.
mocha-chrome --chrome-flags '["--no-sandbox"]' --reporter spec \
"$test_server_url/tests/"
}
_test_browser_run_in_phantomjs() {
@go.log INFO 'Running browser tests in PhantomJS'
phantomjs node_modules/mocha-phantomjs-core/mocha-phantomjs-core.js \
"$test_server_url/tests/" 'spec' "{ \"useColors\": true }"
}
_test_browser_download_coverage() {
if [[ -z "$__coverage_run" ]]; then
return
elif ! mkdir -p "${TEST_BROWSER_COVERAGE_FILE%/*}"; then
@go.log WARN 'Failed to create coverage data directory.'
elif ! command -v curl >/dev/null; then
@go.log WARN 'curl must be installed to download coverage data.'
elif ! curl "$test_server_url/coverage.json" \
-s -o "$TEST_BROWSER_COVERAGE_FILE"; then
@go.log WARN 'Failed to download coverage data.'
fi
}
_test_browser() {
local arg
local __coverage_run
local __single_run="${__TEST_ALL:+true}"
local result=0
while [[ "$#" -ne '0' ]]; do
arg="$1"
shift
case "$arg" in
--complete)
# Tab completions
_test_browser_tab_completion "$@"
return
;;
--coverage)
__coverage_run='true'
. "$_GO_USE_MODULES" 'coverage'
if [[ -z "$__TEST_ALL" ]]; then
rm -f "$CL_COVERAGE_DATADIR"/*.json
fi
;;
--single-run)
__single_run='true'
;;
*)
@go.printf 'Unknown argument: %s\n' "$1" >&2
return 1
;;
esac
done
_test_browser_run_tests
result="$?"
if [[ "$__coverage_run" == 'true' && "$__single_run" == 'true' &&
-z "$__TEST_ALL" ]] && ! cl.generate_coverage_report; then
result='1'
fi
return "$result"
}
_test_browser "$@"