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"
190 only="$1"; skip[$1]=""; shift
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.
328 pip install PyYAML || fatal "pip install PyYAML failed"
330 # Needed for python-daemon 2.0.2, which breaks otherwise with
331 # "ImportError: No module named docutils.core"
332 pip install docutils || fatal "pip install docutils failed"
335 if [[ "$?" != "0" ]]; then
336 title "!!!!!! $1 FAILED !!!!!!"
337 failures+=("$1 (`timer`)")
339 successes+=("$1 (`timer`)")
348 echo -n "$(($SECONDS - $t0))s"
352 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
354 title "Running $1 tests"
356 if [[ "$2" == "go" ]]
358 go test ${testargs[$1]} "git.curoverse.com/arvados.git/$1"
359 elif [[ "$2" == "pip" ]]
362 && python setup.py test ${testargs[$1]}
363 elif [[ "$2" != "" ]]
370 title "End of $1 tests (`timer`)"
372 title "Skipping $1 tests"
377 if [[ -z "$skip_install" ]]
379 title "Running $1 install"
381 if [[ "$2" == "go" ]]
383 go get -t "git.curoverse.com/arvados.git/$1"
384 elif [[ "$2" == "pip" ]]
387 && python setup.py sdist rotate --keep=1 --match .tar.gz \
388 && pip install --upgrade dist/*.tar.gz
389 elif [[ "$2" != "" ]]
395 checkexit "$1 install"
396 title "End of $1 install (`timer`)"
398 title "Skipping $1 install"
403 txt="********** $1 **********"
404 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
409 bundle install --no-deployment
415 with_test_gemset gem uninstall --force --all --executables arvados \
416 && cd "$WORKSPACE/sdk/ruby" \
417 && bundle install --no-deployment \
418 && gem build arvados.gemspec \
419 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
421 do_install sdk/ruby ruby_sdk
424 with_test_gemset gem uninstall --force --all --executables arvados-cli \
425 && cd "$WORKSPACE/sdk/cli" \
426 && bundle install --no-deployment \
427 && gem build arvados-cli.gemspec \
428 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
430 do_install sdk/cli cli
432 # Install the Python SDK early. Various other test suites (like
433 # keepproxy) bring up run_test_server.py, which imports the arvados
434 # module. We can't actually *test* the Python SDK yet though, because
435 # its own test suite brings up some of those other programs (like
437 declare -a pythonstuff
443 for p in "${pythonstuff[@]}"
448 install_apiserver() {
449 cd "$WORKSPACE/services/api"
450 RAILS_ENV=test bundle install --no-deployment
452 rm -f config/environments/test.rb
453 cp config/environments/test.rb.example config/environments/test.rb
455 if [ -n "$CONFIGSRC" ]
457 for f in database.yml application.yml
459 cp "$CONFIGSRC/$f" config/ || fatal "$f"
463 # Fill in a random secret_token and blob_signing_key for testing
464 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
465 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
467 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
468 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
470 # Set up empty git repo (for git tests)
472 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
475 mkdir -p $GITDIR/test
478 && git config user.email "jenkins@ci.curoverse.com" \
479 && git config user.name "Jenkins, CI" \
482 && git commit -m 'initial commit'
484 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
485 # This assumes the current user is a postgresql superuser
486 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
488 cd "$WORKSPACE/services/api" \
489 && RAILS_ENV=test bundle exec rake db:drop \
490 && RAILS_ENV=test bundle exec rake db:setup \
491 && RAILS_ENV=test bundle exec rake db:fixtures:load
493 do_install services/api apiserver
504 for g in "${gostuff[@]}"
509 install_workbench() {
510 cd "$WORKSPACE/apps/workbench" \
511 && RAILS_ENV=test bundle install --no-deployment
513 do_install apps/workbench workbench
515 test_doclinkchecker() {
517 # Make sure python-epydoc is installed or the next line won't do much good!
518 ARVADOS_API_HOST=qr1hi.arvadosapi.com
519 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
520 unset ARVADOS_API_HOST
522 do_test doc doclinkchecker
525 cd "$WORKSPACE/sdk/ruby" \
526 && bundle install --no-deployment \
527 && bundle exec rake test ${testargs[sdk/ruby]}
529 do_test sdk/ruby ruby_sdk
532 cd "$WORKSPACE/sdk/cli" \
533 && bundle install --no-deployment \
534 && mkdir -p /tmp/keep \
535 && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test ${testargs[sdk/cli]}
540 cd "$WORKSPACE/services/api"
541 RAILS_ENV=test bundle exec rake test ${testargs[services/api]}
543 do_test services/api apiserver
545 for p in "${pythonstuff[@]}"
550 for g in "${gostuff[@]}"
556 cd "$WORKSPACE/apps/workbench" \
557 && RAILS_ENV=test bundle exec rake test ${testargs[apps/workbench]}
559 do_test apps/workbench workbench
561 test_workbench_benchmark() {
562 cd "$WORKSPACE/apps/workbench" \
563 && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
565 do_test apps/workbench_benchmark workbench_benchmark
567 test_workbench_profile() {
568 cd "$WORKSPACE/apps/workbench" \
569 && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
571 do_test apps/workbench_profile workbench_profile