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[@]}"
131 rotate_logfile "$WORKSPACE/apps/workbench/log/" "test.log"
133 rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
140 # Make sure WORKSPACE is set
141 if ! [[ -n "$WORKSPACE" ]]; then
142 echo >&2 "$helpmessage"
144 echo >&2 "Error: WORKSPACE environment variable not set"
149 # Make sure virtualenv is installed
150 `virtualenv --help >/dev/null 2>&1`
152 if [[ "$?" != "0" ]]; then
154 echo >&2 "Error: virtualenv could not be found"
159 # Make sure go is installed
160 `go env >/dev/null 2>&1`
162 if [[ "$?" != "0" ]]; then
164 echo >&2 "Error: go could not be found"
169 # Make sure gcc is installed
170 `gcc --help >/dev/null 2>&1`
172 if [[ "$?" != "0" ]]; then
174 echo >&2 "Error: gcc could not be found"
181 # $BUILD_NUMBER is set by Jenkins if this script is being called as part of a Jenkins run
182 if [[ -f "$1/$2" ]]; then
183 THEDATE=`date +%Y%m%d%H%M%S`
184 mv "$1/$2" "$1/$THEDATE-$BUILD_NUMBER-$2"
185 gzip "$1/$THEDATE-$BUILD_NUMBER-$2"
192 skip[apps/workbench_profile]=1
199 echo >&2 "$helpmessage"
208 only="$1"; skip[$1]=""; shift
214 leave_temp[VENVDIR]=1
216 leave_temp[GEMHOME]=1
219 suite="${arg%%_test=*}"
221 testargs["$suite"]="$args"
224 eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
227 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
234 echo 'Starting API server...'
236 && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \
237 && export ARVADOS_TEST_API_HOST="$ARVADOS_API_HOST" \
238 && export ARVADOS_TEST_API_INSTALLED="$$" \
239 && (env | egrep ^ARVADOS)
243 if [[ -n "$ARVADOS_TEST_API_HOST" ]]; then
244 unset ARVADOS_TEST_API_HOST
246 && python sdk/python/tests/run_test_server.py stop
251 failures+=("($(basename $0) interrupted)")
258 echo "WORKSPACE=$WORKSPACE"
260 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
261 # Jenkins expects us to use this by default.
262 CONFIGSRC="$HOME/arvados-api-server"
265 # Clean up .pyc files that may exist in the workspace
267 find -name '*.pyc' -delete
269 # Set up temporary install dirs (unless existing dirs were supplied)
270 for tmpdir in VENVDIR GOPATH GEMHOME
272 if [[ -n "${!tmpdir}" ]]; then
273 leave_temp[$tmpdir]=1
275 eval $tmpdir=$(mktemp -d)
279 setup_ruby_environment() {
280 if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
281 source "$HOME/.rvm/scripts/rvm"
283 elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
284 source "/usr/local/rvm/scripts/rvm"
290 if [[ "$using_rvm" == true ]]; then
291 # If rvm is in use, we can't just put separate "dependencies"
292 # and "gems-under-test" paths to GEM_PATH: passenger resets
293 # the environment to the "current gemset", which would lose
294 # our GEM_PATH and prevent our test suites from running ruby
295 # programs (for example, the Workbench test suite could not
296 # boot an API server or run arv). Instead, we have to make an
297 # rvm gemset and use it for everything.
299 [[ `type rvm | head -n1` == "rvm is a function" ]] \
302 # Put rvm's favorite path back in first place (overriding
303 # virtualenv, which just put itself there). Ignore rvm's
304 # complaint about not being in first place already.
305 rvm use @default 2>/dev/null
307 # Create (if needed) and switch to an @arvados-tests
308 # gemset. (Leave the choice of ruby to the caller.)
309 rvm use @arvados-tests --create \
310 || fatal 'rvm gemset setup'
314 # When our "bundle install"s need to install new gems to
315 # satisfy dependencies, we want them to go where "gem install
316 # --user-install" would put them. (However, if the caller has
317 # already set GEM_HOME, we assume that's where dependencies
318 # should be installed, and we should leave it alone.)
320 if [ -z "$GEM_HOME" ]; then
321 user_gempath="$(gem env gempath)"
322 export GEM_HOME="${user_gempath%%:*}"
324 PATH="$(gem env gemdir)/bin:$PATH"
326 # When we build and install our own gems, we install them in our
327 # $GEMHOME tmpdir, and we want them to be at the front of GEM_PATH and
328 # PATH so integration tests prefer them over other versions that
329 # happen to be installed in $user_gempath, system dirs, etc.
331 tmpdir_gem_home="$(env - PATH="$PATH" HOME="$GEMHOME" gem env gempath | cut -f1 -d:)"
332 PATH="$tmpdir_gem_home/bin:$PATH"
333 export GEM_PATH="$tmpdir_gem_home:$(gem env gempath)"
335 echo "Will install dependencies to $(gem env gemdir)"
336 echo "Will install arvados gems to $tmpdir_gem_home"
337 echo "Gem search path is GEM_PATH=$GEM_PATH"
342 if [[ "$using_rvm" == true ]]; then
345 GEM_HOME="$tmpdir_gem_home" "$@"
350 mkdir -p "$GOPATH/src/git.curoverse.com"
351 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
352 || fatal "symlink failed"
354 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
355 . "$VENVDIR/bin/activate"
357 # Note: this must be the last time we change PATH, otherwise rvm will
359 setup_ruby_environment
363 if ! which bundler >/dev/null
365 gem install --user-install bundler || fatal 'Could not install bundler'
368 # Needed for run_test_server.py which is used by certain (non-Python) tests.
369 echo "pip install -q PyYAML"
370 pip install -q PyYAML || fatal "pip install PyYAML failed"
373 if [[ "$?" != "0" ]]; then
374 title "!!!!!! $1 FAILED !!!!!!"
375 failures+=("$1 (`timer`)")
377 successes+=("$1 (`timer`)")
386 echo -n "$(($SECONDS - $t0))s"
390 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
392 title "Running $1 tests"
394 if [[ "$2" == "go" ]]
396 go test ${testargs[$1]} "git.curoverse.com/arvados.git/$1"
397 elif [[ "$2" == "pip" ]]
400 && python setup.py test ${testargs[$1]}
401 elif [[ "$2" != "" ]]
408 title "End of $1 tests (`timer`)"
410 title "Skipping $1 tests"
415 if [[ -z "$skip_install" ]]
417 title "Running $1 install"
419 if [[ "$2" == "go" ]]
421 go get -t "git.curoverse.com/arvados.git/$1"
422 elif [[ "$2" == "pip" ]]
425 && python setup.py sdist rotate --keep=1 --match .tar.gz \
426 && pip install -q --upgrade dist/*.tar.gz
427 elif [[ "$2" != "" ]]
433 checkexit "$1 install"
434 title "End of $1 install (`timer`)"
436 title "Skipping $1 install"
441 txt="********** $1 **********"
442 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
445 bundle_install_trylocal() {
448 echo "(Running bundle install --local. 'could not find package' messages are OK.)"
449 if ! bundle install --local --no-deployment; then
450 echo "(Running bundle install again, without --local.)"
451 bundle install --no-deployment
458 cd "$WORKSPACE/doc" \
459 && bundle_install_trylocal \
465 with_test_gemset gem uninstall --force --all --executables arvados \
466 && cd "$WORKSPACE/sdk/ruby" \
467 && bundle_install_trylocal \
468 && gem build arvados.gemspec \
469 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
471 do_install sdk/ruby ruby_sdk
474 with_test_gemset gem uninstall --force --all --executables arvados-cli \
475 && cd "$WORKSPACE/sdk/cli" \
476 && bundle_install_trylocal \
477 && gem build arvados-cli.gemspec \
478 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
480 do_install sdk/cli cli
482 # Install the Python SDK early. Various other test suites (like
483 # keepproxy) bring up run_test_server.py, which imports the arvados
484 # module. We can't actually *test* the Python SDK yet though, because
485 # its own test suite brings up some of those other programs (like
487 declare -a pythonstuff
493 for p in "${pythonstuff[@]}"
498 install_apiserver() {
499 cd "$WORKSPACE/services/api" \
500 && RAILS_ENV=test bundle_install_trylocal
502 rm -f config/environments/test.rb
503 cp config/environments/test.rb.example config/environments/test.rb
505 if [ -n "$CONFIGSRC" ]
507 for f in database.yml application.yml
509 cp "$CONFIGSRC/$f" config/ || fatal "$f"
513 # Fill in a random secret_token and blob_signing_key for testing
514 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
515 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
517 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
518 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
520 # Set up empty git repo (for git tests)
522 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
525 mkdir -p $GITDIR/test
528 && git config user.email "jenkins@ci.curoverse.com" \
529 && git config user.name "Jenkins, CI" \
532 && git commit -m 'initial commit'
534 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
535 # This assumes the current user is a postgresql superuser
536 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
538 cd "$WORKSPACE/services/api" \
539 && RAILS_ENV=test bundle exec rake db:drop \
540 && RAILS_ENV=test bundle exec rake db:setup \
541 && RAILS_ENV=test bundle exec rake db:fixtures:load
543 do_install services/api apiserver
547 services/arv-git-httpd
555 for g in "${gostuff[@]}"
560 install_workbench() {
561 cd "$WORKSPACE/apps/workbench" \
562 && mkdir -p tmp/cache \
563 && RAILS_ENV=test bundle_install_trylocal
565 do_install apps/workbench workbench
567 test_doclinkchecker() {
571 ARVADOS_API_HOST=qr1hi.arvadosapi.com
572 # Make sure python-epydoc is installed or the next line won't
574 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
577 do_test doc doclinkchecker
582 cd "$WORKSPACE/services/api" \
583 && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[services/api]}
585 do_test services/api apiserver
587 # Shortcut for when we're only running apiserver tests. This saves a bit of time,
588 # because we don't need to start up the api server for subsequent tests.
589 if [ ! -z "$only" ] && [ "$only" == "services/api" ]; then
590 rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
597 cd "$WORKSPACE/sdk/ruby" \
598 && bundle exec rake test TESTOPTS=-v ${testargs[sdk/ruby]}
600 do_test sdk/ruby ruby_sdk
603 cd "$WORKSPACE/sdk/cli" \
604 && mkdir -p /tmp/keep \
605 && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test TESTOPTS=-v ${testargs[sdk/cli]}
609 for p in "${pythonstuff[@]}"
614 for g in "${gostuff[@]}"
620 cd "$WORKSPACE/apps/workbench" \
621 && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[apps/workbench]}
623 do_test apps/workbench workbench
625 test_workbench_benchmark() {
626 cd "$WORKSPACE/apps/workbench" \
627 && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
629 do_test apps/workbench_benchmark workbench_benchmark
631 test_workbench_profile() {
632 cd "$WORKSPACE/apps/workbench" \
633 && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
635 do_test apps/workbench_profile workbench_profile