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"
174 skip[apps/workbench_profile]=1
181 echo >&2 "$helpmessage"
196 leave_temp[VENVDIR]=1
198 leave_temp[GEMHOME]=1
201 suite="${arg%%_test=*}"
203 testargs["$suite"]="$args"
206 eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
209 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
217 echo "WORKSPACE=$WORKSPACE"
219 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
220 # Jenkins expects us to use this by default.
221 CONFIGSRC="$HOME/arvados-api-server"
224 # Clean up .pyc files that may exist in the workspace
226 find -name '*.pyc' -delete
228 # Set up temporary install dirs (unless existing dirs were supplied)
229 for tmpdir in VENVDIR GOPATH GEMHOME
231 if [[ -n "${!tmpdir}" ]]; then
232 leave_temp[$tmpdir]=1
234 eval $tmpdir=$(mktemp -d)
238 setup_ruby_environment() {
239 if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
240 source "$HOME/.rvm/scripts/rvm"
242 elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
243 source "/usr/local/rvm/scripts/rvm"
249 if [[ "$using_rvm" == true ]]; then
250 # If rvm is in use, we can't just put separate "dependencies"
251 # and "gems-under-test" paths to GEM_PATH: passenger resets
252 # the environment to the "current gemset", which would lose
253 # our GEM_PATH and prevent our test suites from running ruby
254 # programs (for example, the Workbench test suite could not
255 # boot an API server or run arv). Instead, we have to make an
256 # rvm gemset and use it for everything.
258 [[ `type rvm | head -n1` == "rvm is a function" ]] \
261 # Put rvm's favorite path back in first place (overriding
262 # virtualenv, which just put itself there). Ignore rvm's
263 # complaint about not being in first place already.
264 rvm use @default 2>/dev/null
266 # Create (if needed) and switch to an @arvados-tests
267 # gemset. (Leave the choice of ruby to the caller.)
268 rvm use @arvados-tests --create \
269 || fatal 'rvm gemset setup'
273 # When our "bundle install"s need to install new gems to
274 # satisfy dependencies, we want them to go where "gem install
275 # --user-install" would put them. (However, if the caller has
276 # already set GEM_HOME, we assume that's where dependencies
277 # should be installed, and we should leave it alone.)
279 if [ -z "$GEM_HOME" ]; then
280 user_gempath="$(gem env gempath)"
281 export GEM_HOME="${user_gempath%%:*}"
283 PATH="$(gem env gemdir)/bin:$PATH"
285 # When we build and install our own gems, we install them in our
286 # $GEMHOME tmpdir, and we want them to be at the front of GEM_PATH and
287 # PATH so integration tests prefer them over other versions that
288 # happen to be installed in $user_gempath, system dirs, etc.
290 tmpdir_gem_home="$(env - PATH="$PATH" HOME="$GEMHOME" gem env gempath | cut -f1 -d:)"
291 PATH="$tmpdir_gem_home/bin:$PATH"
292 export GEM_PATH="$tmpdir_gem_home:$(gem env gempath)"
294 echo "Will install dependencies to $(gem env gemdir)"
295 echo "Will install arvados gems to $tmpdir_gem_home"
296 echo "Gem search path is GEM_PATH=$GEM_PATH"
301 if [[ "$using_rvm" == true ]]; then
304 GEM_HOME="$tmpdir_gem_home" "$@"
309 mkdir -p "$GOPATH/src/git.curoverse.com"
310 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
311 || fatal "symlink failed"
313 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
314 . "$VENVDIR/bin/activate"
316 # Note: this must be the last time we change PATH, otherwise rvm will
318 setup_ruby_environment
322 if ! which bundler >/dev/null
324 gem install --user-install bundler || fatal 'Could not install bundler'
327 # Needed for run_test_server.py which is used by certain (non-Python) tests.
331 if [[ "$?" != "0" ]]; then
332 title "!!!!!! $1 FAILED !!!!!!"
333 failures+=("$1 (`timer`)")
335 successes+=("$1 (`timer`)")
344 echo -n "$(($SECONDS - $t0))s"
348 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
350 title "Running $1 tests"
352 if [[ "$2" == "go" ]]
354 go test ${testargs[$1]} "git.curoverse.com/arvados.git/$1"
355 elif [[ "$2" == "pip" ]]
357 # Other test suites can depend on tests_require
358 # dependencies of this package. For example, keepproxy runs
359 # run_test_server.py, which depends on the yaml package,
360 # which is in sdk/python's tests_require but not
361 # install_requires, and therefore does not get installed by
362 # setuptools until we run "setup.py test" *and* install the
363 # .egg files that setup.py downloads.
365 && python setup.py test ${testargs[$1]} \
366 && (easy_install *.egg || true)
367 elif [[ "$2" != "" ]]
374 title "End of $1 tests (`timer`)"
376 title "Skipping $1 tests"
381 if [[ -z "$skip_install" ]]
383 title "Running $1 install"
385 if [[ "$2" == "go" ]]
387 go get -t "git.curoverse.com/arvados.git/$1"
388 elif [[ "$2" == "pip" ]]
391 && python setup.py sdist rotate --keep=1 --match .tar.gz \
392 && pip install --upgrade dist/*.tar.gz
393 elif [[ "$2" != "" ]]
399 checkexit "$1 install"
400 title "End of $1 install (`timer`)"
402 title "Skipping $1 install"
407 txt="********** $1 **********"
408 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
413 bundle install --no-deployment
419 with_test_gemset gem uninstall --force --all --executables arvados \
420 && cd "$WORKSPACE/sdk/ruby" \
421 && bundle install --no-deployment \
422 && gem build arvados.gemspec \
423 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
425 do_install sdk/ruby ruby_sdk
428 with_test_gemset gem uninstall --force --all --executables arvados-cli \
429 && cd "$WORKSPACE/sdk/cli" \
430 && bundle install --no-deployment \
431 && gem build arvados-cli.gemspec \
432 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
434 do_install sdk/cli cli
436 # Install the Python SDK early. Various other test suites (like
437 # keepproxy) bring up run_test_server.py, which imports the arvados
438 # module. We can't actually *test* the Python SDK yet though, because
439 # its own test suite brings up some of those other programs (like
441 declare -a pythonstuff
447 for p in "${pythonstuff[@]}"
452 install_apiserver() {
453 cd "$WORKSPACE/services/api"
454 RAILS_ENV=test bundle install --no-deployment
456 rm -f config/environments/test.rb
457 cp config/environments/test.rb.example config/environments/test.rb
459 if [ -n "$CONFIGSRC" ]
461 for f in database.yml application.yml
463 cp "$CONFIGSRC/$f" config/ || fatal "$f"
467 # Fill in a random secret_token and blob_signing_key for testing
468 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
469 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
471 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
472 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
474 # Set up empty git repo (for git tests)
476 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
479 mkdir -p $GITDIR/test
482 && git config user.email "jenkins@ci.curoverse.com" \
483 && git config user.name "Jenkins, CI" \
486 && git commit -m 'initial commit'
488 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
489 # This assumes the current user is a postgresql superuser
490 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
492 cd "$WORKSPACE/services/api" \
493 && RAILS_ENV=test bundle exec rake db:drop \
494 && RAILS_ENV=test bundle exec rake db:setup \
495 && RAILS_ENV=test bundle exec rake db:fixtures:load
497 do_install services/api apiserver
508 for g in "${gostuff[@]}"
513 install_workbench() {
514 cd "$WORKSPACE/apps/workbench" \
515 && RAILS_ENV=test bundle install --no-deployment
517 do_install apps/workbench workbench
519 test_doclinkchecker() {
521 # Make sure python-epydoc is installed or the next line won't do much good!
522 ARVADOS_API_HOST=qr1hi.arvadosapi.com
523 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
524 unset ARVADOS_API_HOST
526 do_test doc doclinkchecker
529 cd "$WORKSPACE/sdk/ruby" \
530 && bundle install --no-deployment \
531 && bundle exec rake test ${testargs[sdk/ruby]}
533 do_test sdk/ruby ruby_sdk
536 cd "$WORKSPACE/sdk/cli" \
537 && bundle install --no-deployment \
538 && mkdir -p /tmp/keep \
539 && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test ${testargs[sdk/cli]}
544 cd "$WORKSPACE/services/api"
545 RAILS_ENV=test bundle exec rake test ${testargs[services/api]}
547 do_test services/api apiserver
549 # We must test sdk/python before testing services/keepproxy, because
550 # keepproxy depends on sdk/python's test dependencies.
551 for p in "${pythonstuff[@]}"
556 for g in "${gostuff[@]}"
562 cd "$WORKSPACE/apps/workbench" \
563 && RAILS_ENV=test bundle exec rake test ${testargs[apps/workbench]}
565 do_test apps/workbench workbench
567 test_workbench_benchmark() {
568 cd "$WORKSPACE/apps/workbench" \
569 && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
571 do_test apps/workbench_benchmark workbench_benchmark
573 test_workbench_profile() {
574 cd "$WORKSPACE/apps/workbench" \
575 && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
577 do_test apps/workbench_profile workbench_profile