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"
194 # Needed for run_test_server.py which is used by certain (non-Python) tests.
198 if [[ "$?" != "0" ]]; then
199 title "!!!!!! $1 FAILED !!!!!!"
200 failures+=("$1 (`timer`)")
202 successes+=("$1 (`timer`)")
211 echo -n "$(($SECONDS - $t0))s"
215 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
217 title "Running $1 tests"
219 if [[ "$2" == "go" ]]
221 go test "git.curoverse.com/arvados.git/$1"
222 elif [[ "$2" == "pip" ]]
224 # Other test suites can depend on tests_require
225 # dependencies of this package. For example, keepproxy runs
226 # run_test_server.py, which depends on the yaml package,
227 # which is in sdk/python's tests_require but not
228 # install_requires, and therefore does not get installed by
229 # setuptools until we run "setup.py test" *and* install the
230 # .egg files that setup.py downloads.
232 && HOME="$GEMHOME" python setup.py test ${testargs[$1]} \
233 && (easy_install *.egg || true)
238 title "End of $1 tests (`timer`)"
240 title "Skipping $1 tests"
245 if [[ -z "$skip_install" ]]
247 title "Running $1 install"
249 if [[ "$2" == "go" ]]
251 go get -t "git.curoverse.com/arvados.git/$1"
252 elif [[ "$2" == "pip" ]]
255 && python setup.py sdist rotate --keep=1 --match .tar.gz \
256 && pip install --upgrade dist/*.tar.gz
260 checkexit "$1 install"
261 title "End of $1 install (`timer`)"
263 title "Skipping $1 install"
268 txt="********** $1 **********"
269 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
274 HOME="$GEMHOME" bundle install --no-deployment
276 # Make sure python-epydoc is installed or the next line won't do much good!
277 ARVADOS_API_HOST=qr1hi.arvadosapi.com
278 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
279 unset ARVADOS_API_HOST
284 cd "$WORKSPACE/sdk/ruby" \
285 && HOME="$GEMHOME" bundle install --no-deployment \
286 && gem build arvados.gemspec \
287 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
292 cd "$WORKSPACE/sdk/cli" \
293 && gem build arvados-cli.gemspec \
294 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
298 # Install the Python SDK early. Various other test suites (like
299 # keepproxy) bring up run_test_server.py, which imports the arvados
300 # module. We can't actually *test* the Python SDK yet though, because
301 # its own test suite brings up some of those other programs (like
303 declare -a pythonstuff
309 for p in "${pythonstuff[@]}"
314 install_apiserver() {
315 cd "$WORKSPACE/services/api"
316 export RAILS_ENV=test
317 HOME="$GEMHOME" bundle install --no-deployment
319 rm -f config/environments/test.rb
320 cp config/environments/test.rb.example config/environments/test.rb
322 if [ -n "$CONFIGSRC" ]
324 for f in database.yml application.yml
326 cp "$CONFIGSRC/$f" config/ || fatal "$f"
330 # Fill in a random secret_token and blob_signing_key for testing
331 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
332 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
334 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
335 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
337 # Set up empty git repo (for git tests)
339 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
342 mkdir -p $GITDIR/test
345 && git config user.email "jenkins@ci.curoverse.com" \
346 && git config user.name "Jenkins, CI" \
349 && git commit -m 'initial commit'
351 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
352 # This assumes the current user is a postgresql superuser
353 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
355 cd "$WORKSPACE/services/api" \
356 && HOME="$GEMHOME" bundle exec rake db:drop \
357 && HOME="$GEMHOME" bundle exec rake db:create \
358 && HOME="$GEMHOME" bundle exec rake db:setup
371 for g in "${gostuff[@]}"
376 test_doclinkchecker() {
378 HOME="$GEMHOME" bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
380 do_test doclinkchecker
383 cd "$WORKSPACE/sdk/ruby" \
384 && HOME="$GEMHOME" bundle install --no-deployment \
385 && HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/ruby]}
390 title "Starting SDK CLI tests"
391 cd "$WORKSPACE/sdk/cli" \
392 && HOME="$GEMHOME" bundle install --no-deployment \
393 && mkdir -p /tmp/keep \
394 && KEEP_LOCAL_STORE=/tmp/keep HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/cli]}
399 cd "$WORKSPACE/services/api"
400 HOME="$GEMHOME" bundle exec rake test ${testargs[apiserver]}
404 # We must test sdk/python before testing services/keepproxy, because
405 # keepproxy depends on sdk/python's test dependencies.
406 for p in "${pythonstuff[@]}"
411 for g in "${gostuff[@]}"
417 cd "$WORKSPACE/apps/workbench" \
418 && HOME="$GEMHOME" bundle install --no-deployment \
419 && HOME="$GEMHOME" bundle exec rake test ${testargs[workbench]}