3 read -rd "\000" helpmessage <<EOF
4 $(basename $0): Install and test Arvados components.
6 Exit non-zero if any tests fail.
9 $(basename $0) WORKSPACE=/path/to/arvados [options]
13 --skip FOO Do not test the FOO component.
14 --only FOO Do not test anything except the FOO component.
15 --leave-temp Do not remove GOPATH, virtualenv, and other temp dirs at exit.
16 Instead, show which directories were used this time so they
17 can be reused in subsequent invocations.
18 --skip-install Do not run any install steps. Just run tests.
19 You should provide GOPATH, GEMHOME, and VENVDIR options
20 from a previous invocation if you use this option.
21 WORKSPACE=path Arvados source tree to test.
22 CONFIGSRC=path Dir with api server config files to copy into source tree.
23 (If none given, leave config files alone in source tree.)
24 services/api_test="TEST=test/functional/arvados/v1/collections_controller_test.rb"
25 Restrict apiserver tests to the given file
26 sdk/python_test="--test-suite test.test_keep_locator"
27 Restrict Python SDK tests to the given class
28 apps/workbench_test="TEST=test/integration/pipeline_instances_test.rb"
29 Restrict Workbench tests to the given file
31 Print more debug messages
32 envvar=value Set \$envvar to value. Primarily useful for WORKSPACE,
33 *_test, and other examples shown above.
35 Assuming --skip-install is not given, all components are installed
36 into \$GOPATH, \$VENDIR, and \$GEMHOME before running any tests. Many
37 test suites depend on other components being installed, and installing
38 everything tends to be quicker than debugging dependencies.
40 As a special concession to the current CI server config, CONFIGSRC
41 defaults to $HOME/arvados-api-server if that directory exists.
43 More information and background:
45 https://arvados.org/projects/arvados/wiki/Running_tests
50 apps/workbench_benchmark
51 apps/workbench_profile
68 # First make sure to remove any ARVADOS_ variables from the calling
69 # environment that could interfere with the tests.
70 unset $(env | cut -d= -f1 | grep \^ARVADOS_)
72 # Reset other variables that could affect our [tests'] behavior by
88 for var in VENVDIR GOPATH GITDIR GEMHOME
90 if [[ -z "${leave_temp[$var]}" ]]
97 leaving+=" $var=\"${!var}\""
100 if [[ -n "$leaving" ]]; then
101 echo "Leaving behind temp dirs: $leaving"
107 echo >&2 "Fatal: $* in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]}"
112 for x in "${successes[@]}"
117 if [[ ${#failures[@]} == 0 ]]
119 echo "All test suites passed."
121 echo "Failures (${#failures[@]}):"
122 for x in "${failures[@]}"
130 # Make sure WORKSPACE is set
131 if ! [[ -n "$WORKSPACE" ]]; then
132 echo >&2 "$helpmessage"
134 echo >&2 "Error: WORKSPACE environment variable not set"
139 # Make sure virtualenv is installed
140 `virtualenv --help >/dev/null 2>&1`
142 if [[ "$?" != "0" ]]; then
144 echo >&2 "Error: virtualenv could not be found"
149 # Make sure go is installed
150 `go env >/dev/null 2>&1`
152 if [[ "$?" != "0" ]]; then
154 echo >&2 "Error: go could not be found"
159 # Make sure gcc is installed
160 `gcc --help >/dev/null 2>&1`
162 if [[ "$?" != "0" ]]; then
164 echo >&2 "Error: gcc could not be found"
172 # $BUILD_NUMBER is set by Jenkins if this script is being called as part of a Jenkins run
173 if [[ -f "$1/$2" ]]; then
174 THEDATE=`date +%Y%m%d%H%M%S`
175 mv "$1/$2" "$1/$THEDATE-$BUILD_NUMBER-$2"
176 gzip "$1/$THEDATE-$BUILD_NUMBER-$2"
183 skip[apps/workbench_profile]=1
190 echo >&2 "$helpmessage"
199 only="$1"; skip[$1]=""; shift
205 leave_temp[VENVDIR]=1
207 leave_temp[GEMHOME]=1
210 suite="${arg%%_test=*}"
212 testargs["$suite"]="$args"
215 eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
218 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
226 echo "WORKSPACE=$WORKSPACE"
228 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
229 # Jenkins expects us to use this by default.
230 CONFIGSRC="$HOME/arvados-api-server"
233 # Clean up .pyc files that may exist in the workspace
235 find -name '*.pyc' -delete
237 # Set up temporary install dirs (unless existing dirs were supplied)
238 for tmpdir in VENVDIR GOPATH GEMHOME
240 if [[ -n "${!tmpdir}" ]]; then
241 leave_temp[$tmpdir]=1
243 eval $tmpdir=$(mktemp -d)
247 setup_ruby_environment() {
248 if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
249 source "$HOME/.rvm/scripts/rvm"
251 elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
252 source "/usr/local/rvm/scripts/rvm"
258 if [[ "$using_rvm" == true ]]; then
259 # If rvm is in use, we can't just put separate "dependencies"
260 # and "gems-under-test" paths to GEM_PATH: passenger resets
261 # the environment to the "current gemset", which would lose
262 # our GEM_PATH and prevent our test suites from running ruby
263 # programs (for example, the Workbench test suite could not
264 # boot an API server or run arv). Instead, we have to make an
265 # rvm gemset and use it for everything.
267 [[ `type rvm | head -n1` == "rvm is a function" ]] \
270 # Put rvm's favorite path back in first place (overriding
271 # virtualenv, which just put itself there). Ignore rvm's
272 # complaint about not being in first place already.
273 rvm use @default 2>/dev/null
275 # Create (if needed) and switch to an @arvados-tests
276 # gemset. (Leave the choice of ruby to the caller.)
277 rvm use @arvados-tests --create \
278 || fatal 'rvm gemset setup'
282 # When our "bundle install"s need to install new gems to
283 # satisfy dependencies, we want them to go where "gem install
284 # --user-install" would put them. (However, if the caller has
285 # already set GEM_HOME, we assume that's where dependencies
286 # should be installed, and we should leave it alone.)
288 if [ -z "$GEM_HOME" ]; then
289 user_gempath="$(gem env gempath)"
290 export GEM_HOME="${user_gempath%%:*}"
292 PATH="$(gem env gemdir)/bin:$PATH"
294 # When we build and install our own gems, we install them in our
295 # $GEMHOME tmpdir, and we want them to be at the front of GEM_PATH and
296 # PATH so integration tests prefer them over other versions that
297 # happen to be installed in $user_gempath, system dirs, etc.
299 tmpdir_gem_home="$(env - PATH="$PATH" HOME="$GEMHOME" gem env gempath | cut -f1 -d:)"
300 PATH="$tmpdir_gem_home/bin:$PATH"
301 export GEM_PATH="$tmpdir_gem_home:$(gem env gempath)"
303 echo "Will install dependencies to $(gem env gemdir)"
304 echo "Will install arvados gems to $tmpdir_gem_home"
305 echo "Gem search path is GEM_PATH=$GEM_PATH"
310 if [[ "$using_rvm" == true ]]; then
313 GEM_HOME="$tmpdir_gem_home" "$@"
318 mkdir -p "$GOPATH/src/git.curoverse.com"
319 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
320 || fatal "symlink failed"
322 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
323 . "$VENVDIR/bin/activate"
325 # Note: this must be the last time we change PATH, otherwise rvm will
327 setup_ruby_environment
331 if ! which bundler >/dev/null
333 gem install --user-install bundler || fatal 'Could not install bundler'
336 # Needed for run_test_server.py which is used by certain (non-Python) tests.
337 pip install PyYAML || fatal "pip install PyYAML failed"
340 if [[ "$?" != "0" ]]; then
341 title "!!!!!! $1 FAILED !!!!!!"
342 failures+=("$1 (`timer`)")
344 successes+=("$1 (`timer`)")
353 echo -n "$(($SECONDS - $t0))s"
357 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
359 title "Running $1 tests"
361 if [[ "$2" == "go" ]]
363 go test ${testargs[$1]} "git.curoverse.com/arvados.git/$1"
364 elif [[ "$2" == "pip" ]]
367 && python setup.py test ${testargs[$1]}
368 elif [[ "$2" != "" ]]
375 title "End of $1 tests (`timer`)"
377 title "Skipping $1 tests"
382 if [[ -z "$skip_install" ]]
384 title "Running $1 install"
386 if [[ "$2" == "go" ]]
388 go get -t "git.curoverse.com/arvados.git/$1"
389 elif [[ "$2" == "pip" ]]
392 && python setup.py sdist rotate --keep=1 --match .tar.gz \
393 && pip install --upgrade dist/*.tar.gz
394 elif [[ "$2" != "" ]]
400 checkexit "$1 install"
401 title "End of $1 install (`timer`)"
403 title "Skipping $1 install"
408 txt="********** $1 **********"
409 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
412 bundle_install_trylocal() {
415 echo "(Running bundle install --local. 'could not find package' messages are OK.)"
416 if ! bundle install --local --no-deployment; then
417 echo "(Running bundle install again, without --local.)"
418 bundle install --no-deployment
425 cd "$WORKSPACE/doc" \
426 && bundle_install_trylocal \
432 with_test_gemset gem uninstall --force --all --executables arvados \
433 && cd "$WORKSPACE/sdk/ruby" \
434 && bundle_install_trylocal \
435 && gem build arvados.gemspec \
436 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
438 do_install sdk/ruby ruby_sdk
441 with_test_gemset gem uninstall --force --all --executables arvados-cli \
442 && cd "$WORKSPACE/sdk/cli" \
443 && bundle_install_trylocal \
444 && gem build arvados-cli.gemspec \
445 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
447 do_install sdk/cli cli
449 # Install the Python SDK early. Various other test suites (like
450 # keepproxy) bring up run_test_server.py, which imports the arvados
451 # module. We can't actually *test* the Python SDK yet though, because
452 # its own test suite brings up some of those other programs (like
454 declare -a pythonstuff
460 for p in "${pythonstuff[@]}"
465 install_apiserver() {
466 cd "$WORKSPACE/services/api" \
467 && RAILS_ENV=test bundle_install_trylocal
469 rm -f config/environments/test.rb
470 cp config/environments/test.rb.example config/environments/test.rb
472 if [ -n "$CONFIGSRC" ]
474 for f in database.yml application.yml
476 cp "$CONFIGSRC/$f" config/ || fatal "$f"
480 # Fill in a random secret_token and blob_signing_key for testing
481 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
482 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
484 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
485 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
487 # Set up empty git repo (for git tests)
489 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
492 mkdir -p $GITDIR/test
495 && git config user.email "jenkins@ci.curoverse.com" \
496 && git config user.name "Jenkins, CI" \
499 && git commit -m 'initial commit'
501 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
502 # This assumes the current user is a postgresql superuser
503 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
505 cd "$WORKSPACE/services/api" \
506 && RAILS_ENV=test bundle exec rake db:drop \
507 && RAILS_ENV=test bundle exec rake db:setup \
508 && RAILS_ENV=test bundle exec rake db:fixtures:load
510 do_install services/api apiserver
521 for g in "${gostuff[@]}"
526 install_workbench() {
527 cd "$WORKSPACE/apps/workbench" \
528 && RAILS_ENV=test bundle_install_trylocal
530 do_install apps/workbench workbench
533 echo 'Starting API server...'
535 && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \
536 && export ARVADOS_TEST_API_HOST="$ARVADOS_API_HOST" \
537 && export ARVADOS_TEST_API_INSTALLED="$$" \
538 && (env | egrep ^ARVADOS)
542 unset ARVADOS_TEST_API_HOST
544 && python sdk/python/tests/run_test_server.py stop
547 test_doclinkchecker() {
551 ARVADOS_API_HOST=qr1hi.arvadosapi.com
552 # Make sure python-epydoc is installed or the next line won't
554 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
557 do_test doc doclinkchecker
562 cd "$WORKSPACE/services/api" \
563 && RAILS_ENV=test bundle exec rake test ${testargs[services/api]}
565 do_test services/api apiserver
570 cd "$WORKSPACE/sdk/ruby" \
571 && bundle exec rake test ${testargs[sdk/ruby]}
573 do_test sdk/ruby ruby_sdk
576 cd "$WORKSPACE/sdk/cli" \
577 && mkdir -p /tmp/keep \
578 && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test ${testargs[sdk/cli]}
582 for p in "${pythonstuff[@]}"
587 for g in "${gostuff[@]}"
593 cd "$WORKSPACE/apps/workbench" \
594 && RAILS_ENV=test bundle exec rake test ${testargs[apps/workbench]}
596 do_test apps/workbench workbench
598 test_workbench_benchmark() {
599 cd "$WORKSPACE/apps/workbench" \
600 && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
602 do_test apps/workbench_benchmark workbench_benchmark
604 test_workbench_profile() {
605 cd "$WORKSPACE/apps/workbench" \
606 && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
608 do_test apps/workbench_profile workbench_profile
610 rotate_logfile "$WORKSPACE/apps/workbench/log/" "test.log"
613 rotate_logfile "$WORKSPACE/services/api/log/" "test.log"