--skip-install Do not run any install steps. Just run tests.
You should provide GOPATH, GEMHOME, and VENVDIR options
from a previous invocation if you use this option.
+--only-install Run specific install step
WORKSPACE=path Arvados source tree to test.
CONFIGSRC=path Dir with api server config files to copy into source tree.
(If none given, leave config files alone in source tree.)
Restrict Python SDK tests to the given class
apps/workbench_test="TEST=test/integration/pipeline_instances_test.rb"
Restrict Workbench tests to the given file
+services/arv-git-httpd_test="-check.vv"
+ Show all log messages, even when tests pass (also works
+ with services/keepstore_test etc.)
ARVADOS_DEBUG=1
Print more debug messages
envvar=value Set \$envvar to value. Primarily useful for WORKSPACE,
Available tests:
apps/workbench
-apps/workbench_performance
+apps/workbench_benchmark
+apps/workbench_profile
doc
services/api
services/crunchstat
+services/dockercleaner
services/fuse
services/keepproxy
services/keepstore
services/nodemanager
+services/arv-git-httpd
sdk/cli
sdk/python
sdk/ruby
GITDIR=
GOPATH=
VENVDIR=
+VENV3DIR=
PYTHONPATH=
GEMHOME=
declare -A leave_temp
clear_temp() {
leaving=""
- for var in VENVDIR GOPATH GITDIR GEMHOME
+ for var in VENVDIR VENV3DIR GOPATH GITDIR GEMHOME
do
if [[ -z "${leave_temp[$var]}" ]]
then
done
fi
}
+
+exit_cleanly() {
+ trap - INT
+ rotate_logfile "$WORKSPACE/apps/workbench/log/" "test.log"
+ stop_services
+ rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
+ report_outcomes
+ clear_temp
+ exit ${#failures}
+}
+
+sanity_checks() {
+ # Make sure WORKSPACE is set
+ if ! [[ -n "$WORKSPACE" ]]; then
+ echo >&2 "$helpmessage"
+ echo >&2
+ echo >&2 "Error: WORKSPACE environment variable not set"
+ echo >&2
+ exit 1
+ fi
+
+ # Make sure virtualenv is installed
+ `virtualenv --help >/dev/null 2>&1`
+
+ if [[ "$?" != "0" ]]; then
+ echo >&2
+ echo >&2 "Error: virtualenv could not be found"
+ echo >&2
+ exit 1
+ fi
+
+ # Make sure go is installed
+ `go env >/dev/null 2>&1`
+
+ if [[ "$?" != "0" ]]; then
+ echo >&2
+ echo >&2 "Error: go could not be found"
+ echo >&2
+ exit 1
+ fi
+
+ # Make sure gcc is installed
+ `gcc --help >/dev/null 2>&1`
+
+ if [[ "$?" != "0" ]]; then
+ echo >&2
+ echo >&2 "Error: gcc could not be found"
+ echo >&2
+ exit 1
+ fi
+}
+
+rotate_logfile() {
+ # $BUILD_NUMBER is set by Jenkins if this script is being called as part of a Jenkins run
+ if [[ -f "$1/$2" ]]; then
+ THEDATE=`date +%Y%m%d%H%M%S`
+ mv "$1/$2" "$1/$THEDATE-$BUILD_NUMBER-$2"
+ gzip "$1/$THEDATE-$BUILD_NUMBER-$2"
+ fi
+}
+
declare -a failures
declare -A skip
declare -A testargs
+skip[apps/workbench_profile]=1
while [[ -n "$1" ]]
do
skip[$skipwhat]=1
;;
--only)
- only="$1"; shift
+ only="$1"; skip[$1]=""; shift
;;
--skip-install)
skip_install=1
;;
+ --only-install)
+ skip_install=1
+ only_install="$1"; shift
+ ;;
--leave-temp)
leave_temp[VENVDIR]=1
+ leave_temp[VENV3DIR]=1
leave_temp[GOPATH]=1
leave_temp[GEMHOME]=1
;;
+ --retry)
+ retry=1
+ ;;
*_test=*)
suite="${arg%%_test=*}"
args="${arg#*=}"
esac
done
-# Sanity check
-if ! [[ -n "$WORKSPACE" ]]; then
- echo >&2 "$helpmessage"
- echo >&2
- echo >&2 "Error: WORKSPACE environment variable not set"
- echo >&2
- exit 1
-fi
+start_api() {
+ echo 'Starting API server...'
+ cd "$WORKSPACE" \
+ && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \
+ && export ARVADOS_TEST_API_HOST="$ARVADOS_API_HOST" \
+ && export ARVADOS_TEST_API_INSTALLED="$$" \
+ && (env | egrep ^ARVADOS)
+}
+
+start_nginx_proxy_services() {
+ echo 'Starting keepproxy, arv-git-httpd, and nginx ssl proxy...'
+ cd "$WORKSPACE" \
+ && python sdk/python/tests/run_test_server.py start_keep_proxy \
+ && python sdk/python/tests/run_test_server.py start_arv-git-httpd \
+ && python sdk/python/tests/run_test_server.py start_nginx \
+ && export ARVADOS_TEST_PROXY_SERVICES=1
+}
+
+stop_services() {
+ if [[ -n "$ARVADOS_TEST_PROXY_SERVICES" ]]; then
+ unset ARVADOS_TEST_PROXY_SERVICES
+ cd "$WORKSPACE" \
+ && python sdk/python/tests/run_test_server.py stop_nginx \
+ && python sdk/python/tests/run_test_server.py stop_arv-git-httpd \
+ && python sdk/python/tests/run_test_server.py stop_keep_proxy
+ fi
+ if [[ -n "$ARVADOS_TEST_API_HOST" ]]; then
+ unset ARVADOS_TEST_API_HOST
+ cd "$WORKSPACE" \
+ && python sdk/python/tests/run_test_server.py stop
+ fi
+}
+
+interrupt() {
+ failures+=("($(basename $0) interrupted)")
+ exit_cleanly
+}
+trap interrupt INT
+
+sanity_checks
echo "WORKSPACE=$WORKSPACE"
find -name '*.pyc' -delete
# Set up temporary install dirs (unless existing dirs were supplied)
-for tmpdir in VENVDIR GOPATH GEMHOME
+for tmpdir in VENVDIR VENV3DIR GOPATH GEMHOME
do
if [[ -n "${!tmpdir}" ]]; then
leave_temp[$tmpdir]=1
virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
. "$VENVDIR/bin/activate"
+# When re-using $VENVDIR, upgrade any packages (except arvados) that are
+# already installed
+pip install --quiet --upgrade `pip freeze | grep -v arvados | cut -f1 -d=`
+
# Note: this must be the last time we change PATH, otherwise rvm will
# whine a lot.
setup_ruby_environment
fi
# Needed for run_test_server.py which is used by certain (non-Python) tests.
-pip install PyYAML
+echo "pip install -q PyYAML"
+pip install --quiet PyYAML || fatal "pip install PyYAML failed"
+
+# If Python 3 is available, set up its virtualenv in $VENV3DIR.
+# Otherwise, skip dependent tests.
+PYTHON3=$(which python3)
+if [ "0" = "$?" ]; then
+ virtualenv --python "$PYTHON3" --setuptools "$VENV3DIR" \
+ || fatal "python3 virtualenv $VENV3DIR failed"
+else
+ PYTHON3=
+ skip[services/dockercleaner]=1
+ cat >&2 <<EOF
+
+Warning: python3 could not be found
+services/dockercleaner install and tests will be skipped
+
+EOF
+fi
checkexit() {
- if [[ "$?" != "0" ]]; then
- title "!!!!!! $1 FAILED !!!!!!"
- failures+=("$1 (`timer`)")
+ if [[ "$1" != "0" ]]; then
+ title "!!!!!! $2 FAILED !!!!!!"
+ failures+=("$2 (`timer`)")
else
- successes+=("$1 (`timer`)")
+ successes+=("$2 (`timer`)")
fi
}
}
do_test() {
+ while ! do_test_once ${@} && [[ "$retry" == 1 ]]
+ do
+ read -p 'Try again? [Y/n] ' x
+ if [[ "$x" != "y" ]] && [[ "$x" != "" ]]
+ then
+ break
+ fi
+ done
+}
+
+do_test_once() {
if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
then
title "Running $1 tests"
timer_reset
if [[ "$2" == "go" ]]
then
- go test "git.curoverse.com/arvados.git/$1"
+ if [[ -n "${testargs[$1]}" ]]
+ then
+ # "go test -check.vv giturl" doesn't work, but this
+ # does:
+ cd "$WORKSPACE/$1" && go test ${testargs[$1]}
+ else
+ # The above form gets verbose even when testargs is
+ # empty, so use this form in such cases:
+ go test "git.curoverse.com/arvados.git/$1"
+ fi
elif [[ "$2" == "pip" ]]
then
- # Other test suites can depend on tests_require
- # dependencies of this package. For example, keepproxy runs
- # run_test_server.py, which depends on the yaml package,
- # which is in sdk/python's tests_require but not
- # install_requires, and therefore does not get installed by
- # setuptools until we run "setup.py test" *and* install the
- # .egg files that setup.py downloads.
- cd "$WORKSPACE/$1" \
- && python setup.py test ${testargs[$1]} \
- && (easy_install *.egg || true)
+ # $3 can name a path directory for us to use, including trailing
+ # slash; e.g., the bin/ subdirectory of a virtualenv.
+ cd "$WORKSPACE/$1" \
+ && "${3}python" setup.py test ${testargs[$1]}
elif [[ "$2" != "" ]]
then
"test_$2"
else
"test_$1"
fi
- checkexit "$1 tests"
+ result="$?"
+ checkexit $result "$1 tests"
title "End of $1 tests (`timer`)"
+ return $result
else
title "Skipping $1 tests"
fi
}
do_install() {
- if [[ -z "$skip_install" ]]
+ if [[ -z "$skip_install" || (-n "$only_install" && "$only_install" == "$1") ]]
then
title "Running $1 install"
timer_reset
go get -t "git.curoverse.com/arvados.git/$1"
elif [[ "$2" == "pip" ]]
then
+ # $3 can name a path directory for us to use, including trailing
+ # slash; e.g., the bin/ subdirectory of a virtualenv.
+
+ # Need to change to a different directory after creating
+ # the source dist package to avoid a pip bug.
+ # see https://arvados.org/issues/5766 for details.
+
+ # Also need to install twice, because if it belives the package is
+ # already installed, pip it won't install it. So the first "pip
+ # install" ensures that the dependencies are met, the second "pip
+ # install" ensures that we've actually install the local package
+ # we just built.
cd "$WORKSPACE/$1" \
- && python setup.py sdist rotate --keep=1 --match .tar.gz \
- && pip install --upgrade dist/*.tar.gz
+ && "${3}python" setup.py sdist rotate --keep=1 --match .tar.gz \
+ && cd "$WORKSPACE" \
+ && "${3}pip" install --quiet "$WORKSPACE/$1/dist"/*.tar.gz \
+ && "${3}pip" install --quiet --no-deps --ignore-installed "$WORKSPACE/$1/dist"/*.tar.gz
elif [[ "$2" != "" ]]
then
"install_$2"
else
"install_$1"
fi
- checkexit "$1 install"
+ checkexit $? "$1 install"
title "End of $1 install (`timer`)"
else
title "Skipping $1 install"
printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
}
+bundle_install_trylocal() {
+ (
+ set -e
+ echo "(Running bundle install --local. 'could not find package' messages are OK.)"
+ if ! bundle install --local --no-deployment; then
+ echo "(Running bundle install again, without --local.)"
+ bundle install --no-deployment
+ fi
+ bundle package --all
+ )
+}
+
install_doc() {
- cd "$WORKSPACE/doc"
- bundle install --no-deployment
- rm -rf .site
+ cd "$WORKSPACE/doc" \
+ && bundle_install_trylocal \
+ && rm -rf .site
}
do_install doc
install_ruby_sdk() {
with_test_gemset gem uninstall --force --all --executables arvados \
&& cd "$WORKSPACE/sdk/ruby" \
- && bundle install --no-deployment \
+ && bundle_install_trylocal \
&& gem build arvados.gemspec \
&& with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
}
install_cli() {
with_test_gemset gem uninstall --force --all --executables arvados-cli \
&& cd "$WORKSPACE/sdk/cli" \
- && bundle install --no-deployment \
+ && bundle_install_trylocal \
&& gem build arvados-cli.gemspec \
&& with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
}
do
do_install "$p" pip
done
+if [ -n "$PYTHON3" ]; then
+ do_install services/dockercleaner pip "$VENV3DIR/bin/"
+fi
install_apiserver() {
- cd "$WORKSPACE/services/api"
- export RAILS_ENV=test
- bundle install --no-deployment
+ cd "$WORKSPACE/services/api" \
+ && RAILS_ENV=test bundle_install_trylocal
rm -f config/environments/test.rb
cp config/environments/test.rb.example config/environments/test.rb
&& git add tmp \
&& git commit -m 'initial commit'
- # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
- # This assumes the current user is a postgresql superuser
- psql arvados_test -c "SELECT pg_terminate_backend (pg_stat_activity.procpid::int) FROM pg_stat_activity WHERE pg_stat_activity.datname = 'arvados_test';" 2>/dev/null
+ # Clear out any lingering postgresql connections to the test
+ # database, so that we can drop it. This assumes the current user
+ # is a postgresql superuser.
+ test_database=$(python -c "import yaml; print yaml.load(file('config/database.yml'))['test']['database']")
+ psql "$test_database" -c "SELECT pg_terminate_backend (pg_stat_activity.procpid::int) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$test_database';" 2>/dev/null
cd "$WORKSPACE/services/api" \
- && bundle exec rake db:drop \
- && bundle exec rake db:create \
- && bundle exec rake db:setup
+ && RAILS_ENV=test bundle exec rake db:drop \
+ && RAILS_ENV=test bundle exec rake db:setup \
+ && RAILS_ENV=test bundle exec rake db:fixtures:load
}
do_install services/api apiserver
declare -a gostuff
gostuff=(
+ services/arv-git-httpd
services/crunchstat
services/keepstore
services/keepproxy
install_workbench() {
cd "$WORKSPACE/apps/workbench" \
- && RAILS_ENV=test bundle install --no-deployment
+ && mkdir -p tmp/cache \
+ && RAILS_ENV=test bundle_install_trylocal
}
do_install apps/workbench workbench
test_doclinkchecker() {
- cd "$WORKSPACE/doc"
- # Make sure python-epydoc is installed or the next line won't do much good!
- ARVADOS_API_HOST=qr1hi.arvadosapi.com
- PYTHONPATH=$WORKSPACE/sdk/python/ bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/ arvados_workbench_host=workbench.$ARVADOS_API_HOST arvados_api_host=$ARVADOS_API_HOST
- unset ARVADOS_API_HOST
+ (
+ set -e
+ cd "$WORKSPACE/doc"
+ ARVADOS_API_HOST=qr1hi.arvadosapi.com
+ # Make sure python-epydoc is installed or the next line won't
+ # do much good!
+ PYTHONPATH=$WORKSPACE/sdk/python/ bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/ arvados_workbench_host=workbench.$ARVADOS_API_HOST arvados_api_host=$ARVADOS_API_HOST
+ )
}
do_test doc doclinkchecker
+stop_services
+
+test_apiserver() {
+ cd "$WORKSPACE/services/api" \
+ && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[services/api]}
+}
+do_test services/api apiserver
+
+# Shortcut for when we're only running apiserver tests. This saves a bit of time,
+# because we don't need to start up the api server for subsequent tests.
+if [ ! -z "$only" ] && [ "$only" == "services/api" ]; then
+ rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
+ exit_cleanly
+fi
+
+start_api
+
test_ruby_sdk() {
cd "$WORKSPACE/sdk/ruby" \
- && bundle install --no-deployment \
- && bundle exec rake test ${testargs[sdk/ruby]}
+ && bundle exec rake test TESTOPTS=-v ${testargs[sdk/ruby]}
}
do_test sdk/ruby ruby_sdk
test_cli() {
- title "Starting SDK CLI tests"
cd "$WORKSPACE/sdk/cli" \
- && bundle install --no-deployment \
&& mkdir -p /tmp/keep \
- && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test ${testargs[sdk/cli]}
+ && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test TESTOPTS=-v ${testargs[sdk/cli]}
}
do_test sdk/cli cli
-test_apiserver() {
- cd "$WORKSPACE/services/api"
- bundle exec rake test ${testargs[apiserver]}
-}
-do_test services/api apiserver
-
-# We must test sdk/python before testing services/keepproxy, because
-# keepproxy depends on sdk/python's test dependencies.
for p in "${pythonstuff[@]}"
do
do_test "$p" pip
done
+do_test services/dockercleaner pip "$VENV3DIR/bin/"
for g in "${gostuff[@]}"
do
done
test_workbench() {
- cd "$WORKSPACE/apps/workbench" \
- && bundle exec rake test ${testargs[workbench]}
+ start_nginx_proxy_services \
+ && cd "$WORKSPACE/apps/workbench" \
+ && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[apps/workbench]}
}
do_test apps/workbench workbench
-test_workbench_performance() {
- cd "$WORKSPACE/apps/workbench" \
- && bundle exec rake test:benchmark
+test_workbench_benchmark() {
+ start_nginx_proxy_services \
+ && cd "$WORKSPACE/apps/workbench" \
+ && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
}
-do_test apps/workbench_performance workbench_performance
+do_test apps/workbench_benchmark workbench_benchmark
-report_outcomes
-clear_temp
+test_workbench_profile() {
+ start_nginx_proxy_services \
+ && cd "$WORKSPACE/apps/workbench" \
+ && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
+}
+do_test apps/workbench_profile workbench_profile
-exit ${#failures}
+exit_cleanly