# Exit non-zero if any tests fail.
#
# Arguments:
-# --skip FOO Do not test the FOO component.
-# --only FOO Do not test anything except the FOO component.
+# --skip FOO Do not test the FOO component.
+# --only FOO Do not test anything except the FOO component.
+# WORKSPACE=path Arvados source tree to test.
+# CONFIGSRC=path Dir with api server config files to copy into source tree.
+# envvar=value Set $envvar to value
#
# Regardless of which components are tested, install all components in
# the usual sequence. (Many test suites depend on other components
# being installed.)
#
+# To run a specific Ruby test, set $workbench_test, $apiserver_test or
+# $cli_test on the command line:
#
+# $ run-tests.sh --only workbench workbench_test=TEST=test/integration/pipeline_instances_test.rb
+#
+#
+# To run a specific Python test set $python_sdk_test or $fuse_test.
+#
+# $ run-tests.sh --only python_sdk python_sdk_test="--test-suite tests.test_keep_locator"
+#
+#
+# You can also pass "export ARVADOS_DEBUG=1" to enable additional debugging output:
+#
+# $ run-tests.sh "export ARVADOS_DEBUG=1"
+#
+#
+# Finally, you can skip the installation steps on subsequent runs this way:
+#
+## First run
+# $ run-tests.sh --leave-temp
+#
+## Subsequent runs: record the values of VENVDIR and GOPATH from the first run, and
+# provide them on the command line in subsequent runs:
+#
+# $ run-tests.sh --skip-install VENVDIR="/tmp/tmp.y3tsTmigio" GOPATH="/tmp/tmp.3r4sSA9F3l"
+
+
# First make sure to remove any ARVADOS_ variables from the calling environment
# that could interfer with the tests.
unset $(env | cut -d= -f1 | grep \^ARVADOS_)
COLUMNS=80
-export GOPATH=$(mktemp -d)
-VENVDIR=$(mktemp -d)
+GITDIR=
+GOPATH=
+VENVDIR=
+PYTHONPATH=
+cli_test=
+workbench_test=
+apiserver_test=
+python_sdk_test=
+ruby_sdk_test=
+fuse_test=
+leave_temp=
+skip_install=
+
+if [[ -f /etc/profile.d/rvm.sh ]]
+then
+ source /etc/profile.d/rvm.sh
+fi
-source /etc/profile.d/rvm.sh
+declare -A leave_temp
+clear_temp() {
+ leaving=""
+ for var in VENVDIR GOPATH GITDIR
+ do
+ if [[ -z "${leave_temp[$var]}" ]]
+ then
+ if [[ -n "${!var}" ]]
+ then
+ rm -rf "${!var}"
+ fi
+ else
+ leaving+=" $var=\"${!var}\""
+ fi
+ done
+ if [[ -z "$leaving" ]]; then
+ echo "Leaving behind temp dirs: $leaving"
+ fi
+}
fatal() {
clear_temp
exit 1
}
-# Sanity check
-echo "WORKSPACE=$WORKSPACE"
-[[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
-
-# Set up temporary install dirs
-mkdir -p "$GOPATH/src/git.curoverse.com"
-ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
- || fatal "symlink failed"
-
-virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
-PATH="$VENVDIR/bin:$PATH"
-
declare -a failures
declare -A skip
--only)
only="$1"; shift
;;
+ --skip-install)
+ skip_install=1
+ ;;
+ --leave-temp)
+ leave_temp[VENVDIR]=1
+ leave_temp[GOPATH]=1
+ ;;
+ *=*)
+ eval $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
+ ;;
*)
echo >&2 "$0: Unrecognized option: '$arg'"
exit 1
esac
done
+# Sanity check
+echo "WORKSPACE=$WORKSPACE"
+[[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
+
+if [[ -n "$CONFIGSRC" ]]; then
+ if [[ -d "$HOME/arvados-api-server" ]]; then
+ # Jenkins expects us to use this by default.
+ CONFIGSRC="$HOME/arvados-api-server"
+ fi
+fi
+
+# Set up temporary install dirs (unless existing dirs were supplied)
+if [[ -n "$VENVDIR" ]]; then
+ leave_temp[VENVDIR]=1
+else
+ VENVDIR=$(mktemp -d)
+fi
+if [[ -n "$GOPATH" ]]; then
+ leave_temp[GOPATH]=1
+else
+ GOPATH=$(mktemp -d)
+fi
+export GOPATH
+mkdir -p "$GOPATH/src/git.curoverse.com"
+ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
+ || fatal "symlink failed"
+
+virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
+PATH="$VENVDIR/bin:$PATH"
+
checkexit() {
if [[ "$?" != "0" ]]; then
title "!!!!!! $1 FAILED !!!!!!"
}
do_install() {
- title "Running $1 install"
- timer_reset
- if [[ "$2" == "go" ]]
+ if [[ -z "$skip_install" ]]
then
- go get -t "git.curoverse.com/arvados.git/$1"
+ title "Running $1 install"
+ timer_reset
+ if [[ "$2" == "go" ]]
+ then
+ go get -t "git.curoverse.com/arvados.git/$1"
+ else
+ "install_$1"
+ fi
+ checkexit "$1 install"
+ title "End of $1 install (`timer`)"
else
- "install_$1"
+ title "Skipping $1 install"
fi
- checkexit "$1 install"
- title "End of $1 install (`timer`)"
}
title () {
printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
}
-clear_temp() {
- for t in "$VENVDIR" "$GOPATH"
- do
- if [[ -n "$t" ]]
- then
- rm -rf "$t"
- fi
- done
-}
-
test_docs() {
cd "$WORKSPACE/doc"
- bundle install --deployment
+ bundle install --no-deployment
rm -rf .site
# Make sure python-epydoc is installed or the next line won't do much good!
ARVADOS_API_HOST=qr1hi.arvadosapi.com
}
do_test doclinkchecker
+test_ruby_sdk() {
+ cd "$WORKSPACE/sdk/ruby" \
+ && bundle install --no-deployment \
+ && bundle exec rake test
+}
+do_test ruby_sdk
+
+install_ruby_sdk() {
+ cd "$WORKSPACE/sdk/ruby" \
+ && gem build arvados.gemspec \
+ && gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
+}
+do_install ruby_sdk
+
+install_cli() {
+ cd "$WORKSPACE/sdk/cli" \
+ && gem build arvados-cli.gemspec \
+ && gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
+}
+do_install cli
+
+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 $cli_test
+}
+do_test cli
+
install_apiserver() {
cd "$WORKSPACE/services/api"
- bundle install --deployment
+ bundle install --no-deployment
rm -f config/environments/test.rb
cp config/environments/test.rb.example config/environments/test.rb
- cp $HOME/arvados-api-server/database.yml config/ || fatal "database.yml"
- cp $HOME/arvados-api-server/application.yml config/ || fatal "application.yml"
+ if [ -n "$CONFIGSRC" ]
+ then
+ for f in database.yml application.yml
+ do
+ cp "$CONFIGSRC/$f" config/ || fatal "$f"
+ done
+ fi
# Fill in a random secret_token and blob_signing_key for testing
SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
export RAILS_ENV=test
# Set up empty git repo (for git tests)
- GITDIR="$WORKSPACE/tmpgit"
+ GITDIR=$(mktemp -d)
sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
rm -rf $GITDIR
&& 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
+
cd "$WORKSPACE/services/api" \
&& bundle exec rake db:drop \
&& bundle exec rake db:create \
test_apiserver() {
cd "$WORKSPACE/services/api"
- bundle exec rake test
+ bundle exec rake test $apiserver_test
}
do_test apiserver
-install_cli() {
- cd "$WORKSPACE/sdk/cli"
- bundle install --deployment
-}
-do_install cli
-
declare -a gostuff
gostuff=(
services/keepstore
# the .egg files that setup.py downloads.
cd "$WORKSPACE/sdk/python" \
- && python setup.py test
+ && python setup.py test $python_sdk_test
r=$?
easy_install *.egg
return $r
test_fuse() {
# Install test dependencies here too, in case run_test_server needs them.
cd "$WORKSPACE/services/fuse" \
- && python setup.py test
+ && python setup.py test $fuse_test
r=$?
easy_install *.egg
return $r
test_workbench() {
cd "$WORKSPACE/apps/workbench" \
- && bundle install --deployment \
- && bundle exec rake test
+ && bundle install --no-deployment \
+ && bundle exec rake test $workbench_test
}
do_test workbench
-test_cli() {
- title "Starting SDK CLI tests"
- cd "$WORKSPACE/sdk/cli" \
- && bundle install --deployment \
- && mkdir -p /tmp/keep \
- && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test
-}
-do_test cli
-
clear_temp
for x in "${successes[@]}"