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
65 if [[ -f /etc/profile.d/rvm.sh ]]
67 source /etc/profile.d/rvm.sh
73 for var in VENVDIR GOPATH GITDIR GEMHOME
75 if [[ -z "${leave_temp[$var]}" ]]
82 leaving+=" $var=\"${!var}\""
85 if [[ -n "$leaving" ]]; then
86 echo "Leaving behind temp dirs: $leaving"
92 echo >&2 "Fatal: $* in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]}"
97 for x in "${successes[@]}"
102 if [[ ${#failures[@]} == 0 ]]
104 echo "All test suites passed."
106 echo "Failures (${#failures[@]}):"
107 for x in "${failures[@]}"
122 echo >&2 "$helpmessage"
137 leave_temp[VENVDIR]=1
139 leave_temp[GEMHOME]=1
142 suite="${arg%%_test=*}"
144 testargs["$suite"]="$args"
147 eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
150 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
157 if ! [[ -n "$WORKSPACE" ]]; then
158 echo >&2 "$helpmessage"
160 echo >&2 "Error: WORKSPACE environment variable not set"
165 echo "WORKSPACE=$WORKSPACE"
167 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
168 # Jenkins expects us to use this by default.
169 CONFIGSRC="$HOME/arvados-api-server"
172 # Clean up .pyc files that may exist in the workspace
174 find -name '*.pyc' -delete
176 # Set up temporary install dirs (unless existing dirs were supplied)
177 for tmpdir in VENVDIR GOPATH GEMHOME
179 if [[ -n "${!tmpdir}" ]]; then
180 leave_temp[$tmpdir]=1
182 eval $tmpdir=$(mktemp -d)
185 PATH="$GEMHOME/.gem/ruby/2.1.0/bin:$PATH"
187 mkdir -p "$GOPATH/src/git.curoverse.com"
188 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
189 || fatal "symlink failed"
191 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
192 . "$VENVDIR/bin/activate"
195 if [[ "$?" != "0" ]]; then
196 title "!!!!!! $1 FAILED !!!!!!"
197 failures+=("$1 (`timer`)")
199 successes+=("$1 (`timer`)")
208 echo -n "$(($SECONDS - $t0))s"
212 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
214 title "Running $1 tests"
216 if [[ "$2" == "go" ]]
218 go test "git.curoverse.com/arvados.git/$1"
219 elif [[ "$2" == "pip" ]]
221 # Other test suites can depend on tests_require
222 # dependencies of this package. For example, keepproxy runs
223 # run_test_server.py, which depends on the yaml package,
224 # which is in sdk/python's tests_require but not
225 # install_requires, and therefore does not get installed by
226 # setuptools until we run "setup.py test" *and* install the
227 # .egg files that setup.py downloads.
229 && HOME="$GEMHOME" python setup.py test ${testargs[$1]} \
230 && easy_install *.egg
235 title "End of $1 tests (`timer`)"
237 title "Skipping $1 tests"
242 if [[ -z "$skip_install" ]]
244 title "Running $1 install"
246 if [[ "$2" == "go" ]]
248 go get -t "git.curoverse.com/arvados.git/$1"
249 elif [[ "$2" == "pip" ]]
252 && python setup.py sdist rotate --keep=1 --match .tar.gz \
253 && pip install --upgrade dist/*.tar.gz
257 checkexit "$1 install"
258 title "End of $1 install (`timer`)"
260 title "Skipping $1 install"
265 txt="********** $1 **********"
266 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
271 HOME="$GEMHOME" bundle install --no-deployment
273 # Make sure python-epydoc is installed or the next line won't do much good!
274 ARVADOS_API_HOST=qr1hi.arvadosapi.com
275 PYTHONPATH=$WORKSPACE/sdk/python/ HOME="$GEMHOME" bundle exec rake generate baseurl=file://$WORKSPACE/doc/.site/ arvados_workbench_host=workbench.$ARVADOS_API_HOST arvados_api_host=$ARVADOS_API_HOST
276 unset ARVADOS_API_HOST
281 cd "$WORKSPACE/sdk/ruby" \
282 && HOME="$GEMHOME" bundle install --no-deployment \
283 && gem build arvados.gemspec \
284 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
289 cd "$WORKSPACE/sdk/cli" \
290 && gem build arvados-cli.gemspec \
291 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
295 # Install the Python SDK early. Various other test suites (like
296 # keepproxy) bring up run_test_server.py, which imports the arvados
297 # module. We can't actually *test* the Python SDK yet though, because
298 # its own test suite brings up some of those other programs (like
300 declare -a pythonstuff
306 for p in "${pythonstuff[@]}"
311 install_apiserver() {
312 cd "$WORKSPACE/services/api"
313 export RAILS_ENV=test
314 HOME="$GEMHOME" bundle install --no-deployment
316 rm -f config/environments/test.rb
317 cp config/environments/test.rb.example config/environments/test.rb
319 if [ -n "$CONFIGSRC" ]
321 for f in database.yml application.yml
323 cp "$CONFIGSRC/$f" config/ || fatal "$f"
327 # Fill in a random secret_token and blob_signing_key for testing
328 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
329 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
331 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
332 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
334 # Set up empty git repo (for git tests)
336 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
339 mkdir -p $GITDIR/test
342 && git config user.email "jenkins@ci.curoverse.com" \
343 && git config user.name "Jenkins, CI" \
346 && git commit -m 'initial commit'
348 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
349 # This assumes the current user is a postgresql superuser
350 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
352 cd "$WORKSPACE/services/api" \
353 && HOME="$GEMHOME" bundle exec rake db:drop \
354 && HOME="$GEMHOME" bundle exec rake db:create \
355 && HOME="$GEMHOME" bundle exec rake db:setup
368 for g in "${gostuff[@]}"
373 test_doclinkchecker() {
375 HOME="$GEMHOME" bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
377 do_test doclinkchecker
380 cd "$WORKSPACE/sdk/ruby" \
381 && HOME="$GEMHOME" bundle install --no-deployment \
382 && HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/ruby]}
387 title "Starting SDK CLI tests"
388 cd "$WORKSPACE/sdk/cli" \
389 && HOME="$GEMHOME" bundle install --no-deployment \
390 && mkdir -p /tmp/keep \
391 && KEEP_LOCAL_STORE=/tmp/keep HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/cli]}
396 cd "$WORKSPACE/services/api"
397 HOME="$GEMHOME" bundle exec rake test ${testargs[apiserver]}
401 # We must test sdk/python before testing services/keepproxy, because
402 # keepproxy depends on sdk/python's test dependencies.
403 for p in "${pythonstuff[@]}"
408 for g in "${gostuff[@]}"
414 cd "$WORKSPACE/apps/workbench" \
415 && HOME="$GEMHOME" bundle install --no-deployment \
416 && HOME="$GEMHOME" bundle exec rake test ${testargs[workbench]}