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 apiserver_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 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
48 # First make sure to remove any ARVADOS_ variables from the calling
49 # environment that could interfere with the tests.
50 unset $(env | cut -d= -f1 | grep \^ARVADOS_)
52 # Reset other variables that could affect our [tests'] behavior by
68 for var in VENVDIR GOPATH GITDIR GEMHOME
70 if [[ -z "${leave_temp[$var]}" ]]
77 leaving+=" $var=\"${!var}\""
80 if [[ -n "$leaving" ]]; then
81 echo "Leaving behind temp dirs: $leaving"
87 echo >&2 "Fatal: $* in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]}"
92 for x in "${successes[@]}"
97 if [[ ${#failures[@]} == 0 ]]
99 echo "All test suites passed."
101 echo "Failures (${#failures[@]}):"
102 for x in "${failures[@]}"
117 echo >&2 "$helpmessage"
132 leave_temp[VENVDIR]=1
134 leave_temp[GEMHOME]=1
137 suite="${arg%%_test=*}"
139 testargs["$suite"]="$args"
142 eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
145 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
152 if ! [[ -n "$WORKSPACE" ]]; then
153 echo >&2 "$helpmessage"
155 echo >&2 "Error: WORKSPACE environment variable not set"
160 echo "WORKSPACE=$WORKSPACE"
162 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
163 # Jenkins expects us to use this by default.
164 CONFIGSRC="$HOME/arvados-api-server"
167 # Clean up .pyc files that may exist in the workspace
169 find -name '*.pyc' -delete
171 # Set up temporary install dirs (unless existing dirs were supplied)
172 for tmpdir in VENVDIR GOPATH GEMHOME
174 if [[ -n "${!tmpdir}" ]]; then
175 leave_temp[$tmpdir]=1
177 eval $tmpdir=$(mktemp -d)
181 setup_ruby_environment() {
182 if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
183 source "$HOME/.rvm/scripts/rvm"
185 elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
186 source "/usr/local/rvm/scripts/rvm"
192 if [[ "$using_rvm" == true ]]; then
193 # If rvm is in use, we can't just put separate "dependencies"
194 # and "gems-under-test" paths to GEM_PATH: passenger resets
195 # the environment to the "current gemset", which would lose
196 # our GEM_PATH and prevent our test suites from running ruby
197 # programs (for example, the Workbench test suite could not
198 # boot an API server or run arv). Instead, we have to make an
199 # rvm gemset and use it for everything.
201 [[ `type rvm | head -n1` == "rvm is a function" ]] \
204 # Put rvm's favorite path back in first place (overriding
205 # virtualenv, which just put itself there). Ignore rvm's
206 # complaint about not being in first place already.
207 rvm use @default 2>/dev/null
209 # Create (if needed) and switch to an @arvados-tests
210 # gemset. (Leave the choice of ruby to the caller.)
211 rvm use @arvados-tests --create \
212 || fatal 'rvm gemset setup'
216 # Remove previously installed versions of our own gems. This
217 # ensures the test suites only have access to [a] published
218 # gems and [b] the gems we build and install right now --
219 # never unpublished gems left over from previous builds.
220 gem uninstall --all --executables arvados arvados-cli \
221 || fatal 'clean arvados gems'
223 echo "RVM not found. Will install gems-under-test into \"$GEM_HOME\"."
225 # When our "bundle install"s need to install new gems to satisfy
226 # dependencies, we want them to go where "gem install --user-install"
227 # would put them. If rvm is in use (or something else has set
228 # GEM_HOME) we assume "bundle install" already does something
231 if [ -z "$GEM_HOME" ]; then
232 user_gempath="$(gem env gempath)"
233 export GEM_HOME="${user_gempath%%:*}"
235 PATH="$(gem env gemdir)/bin:$PATH"
237 # When we build and install our own gems, we install them in our
238 # $GEMHOME tmpdir, and we want them to be at the front of GEM_PATH and
239 # PATH so integration tests prefer them over other versions that
240 # happen to be installed in $user_gempath, system dirs, etc.
242 tmpdir_gem_home="$(env - PATH="$PATH" HOME="$GEMHOME" gem env gempath | cut -f1 -d:)"
243 PATH="${tmpdir_gem_home%%:*}/bin:$PATH"
244 export GEM_PATH="$tmpdir_gem_home:$(gem env gempath)"
246 echo "Will install dependencies to $GEM_HOME"
247 echo "Will install arvados gems to $tmpdir_gem_home"
248 echo "Gem search path is GEM_PATH=$GEM_PATH"
252 if [[ "$using_rvm" == true ]]; then
255 GEM_HOME="$tmpdir_gem_home" "$@"
260 mkdir -p "$GOPATH/src/git.curoverse.com"
261 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
262 || fatal "symlink failed"
264 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
265 . "$VENVDIR/bin/activate"
267 # Note: this must be the last time we change PATH, otherwise rvm will
269 setup_ruby_environment
273 if ! which bundler >/dev/null
275 gem install --user-install bundler || fatal 'Could not install bundler'
278 # Needed for run_test_server.py which is used by certain (non-Python) tests.
282 if [[ "$?" != "0" ]]; then
283 title "!!!!!! $1 FAILED !!!!!!"
284 failures+=("$1 (`timer`)")
286 successes+=("$1 (`timer`)")
295 echo -n "$(($SECONDS - $t0))s"
299 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
301 title "Running $1 tests"
303 if [[ "$2" == "go" ]]
305 go test "git.curoverse.com/arvados.git/$1"
306 elif [[ "$2" == "pip" ]]
308 # Other test suites can depend on tests_require
309 # dependencies of this package. For example, keepproxy runs
310 # run_test_server.py, which depends on the yaml package,
311 # which is in sdk/python's tests_require but not
312 # install_requires, and therefore does not get installed by
313 # setuptools until we run "setup.py test" *and* install the
314 # .egg files that setup.py downloads.
316 && python setup.py test ${testargs[$1]} \
317 && (easy_install *.egg || true)
322 title "End of $1 tests (`timer`)"
324 title "Skipping $1 tests"
329 if [[ -z "$skip_install" ]]
331 title "Running $1 install"
333 if [[ "$2" == "go" ]]
335 go get -t "git.curoverse.com/arvados.git/$1"
336 elif [[ "$2" == "pip" ]]
339 && python setup.py sdist rotate --keep=1 --match .tar.gz \
340 && pip install --upgrade dist/*.tar.gz
344 checkexit "$1 install"
345 title "End of $1 install (`timer`)"
347 title "Skipping $1 install"
352 txt="********** $1 **********"
353 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
358 bundle install --no-deployment
360 # Make sure python-epydoc is installed or the next line won't do much good!
361 ARVADOS_API_HOST=qr1hi.arvadosapi.com
362 PYTHONPATH=$WORKSPACE/sdk/python/ bundle exec rake generate baseurl=file://$WORKSPACE/doc/.site/ arvados_workbench_host=workbench.$ARVADOS_API_HOST arvados_api_host=$ARVADOS_API_HOST
363 unset ARVADOS_API_HOST
368 cd "$WORKSPACE/sdk/ruby" \
369 && bundle install --no-deployment \
370 && gem build arvados.gemspec \
371 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
376 cd "$WORKSPACE/sdk/cli" \
377 && bundle install --no-deployment \
378 && gem build arvados-cli.gemspec \
379 && with_test_gemset gem install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
383 # Install the Python SDK early. Various other test suites (like
384 # keepproxy) bring up run_test_server.py, which imports the arvados
385 # module. We can't actually *test* the Python SDK yet though, because
386 # its own test suite brings up some of those other programs (like
388 declare -a pythonstuff
394 for p in "${pythonstuff[@]}"
399 install_apiserver() {
400 cd "$WORKSPACE/services/api"
401 export RAILS_ENV=test
402 bundle install --no-deployment
404 rm -f config/environments/test.rb
405 cp config/environments/test.rb.example config/environments/test.rb
407 if [ -n "$CONFIGSRC" ]
409 for f in database.yml application.yml
411 cp "$CONFIGSRC/$f" config/ || fatal "$f"
415 # Fill in a random secret_token and blob_signing_key for testing
416 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
417 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
419 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
420 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
422 # Set up empty git repo (for git tests)
424 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
427 mkdir -p $GITDIR/test
430 && git config user.email "jenkins@ci.curoverse.com" \
431 && git config user.name "Jenkins, CI" \
434 && git commit -m 'initial commit'
436 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
437 # This assumes the current user is a postgresql superuser
438 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
440 cd "$WORKSPACE/services/api" \
441 && bundle exec rake db:drop \
442 && bundle exec rake db:create \
443 && bundle exec rake db:setup
456 for g in "${gostuff[@]}"
461 install_workbench() {
462 cd "$WORKSPACE/apps/workbench" \
463 && RAILS_ENV=test bundle install --no-deployment
467 test_doclinkchecker() {
469 bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
471 do_test doclinkchecker
474 cd "$WORKSPACE/sdk/ruby" \
475 && bundle install --no-deployment \
476 && bundle exec rake test ${testargs[sdk/ruby]}
481 title "Starting SDK CLI tests"
482 cd "$WORKSPACE/sdk/cli" \
483 && bundle install --no-deployment \
484 && mkdir -p /tmp/keep \
485 && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test ${testargs[sdk/cli]}
490 cd "$WORKSPACE/services/api"
491 bundle exec rake test ${testargs[apiserver]}
495 # We must test sdk/python before testing services/keepproxy, because
496 # keepproxy depends on sdk/python's test dependencies.
497 for p in "${pythonstuff[@]}"
502 for g in "${gostuff[@]}"
508 cd "$WORKSPACE/apps/workbench" \
509 && bundle exec rake test ${testargs[workbench]}
513 test_workbench_performance() {
514 cd "$WORKSPACE/apps/workbench" \
515 && bundle exec rake test:benchmark
517 do_test workbench_performance