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 apiserver_test="TEST=test/functional/arvados/v1/collections_test.rb"
24 Restrict apiserver tests to the given file
25 python_sdk_test="--test-suite test.test_keep_locator"
26 Restrict Python SDK tests to the given class
27 workbench_test="TEST=test/integration/pipeline_instances_test.rb"
28 Restrict Workbench tests to the given file
30 Print more debug messages
31 envvar=value Set \$envvar to value. Primarily useful for WORKSPACE,
32 *_test, and other examples shown above.
34 Assuming --skip-install is not given, all components are installed
35 into \$GOPATH, \$VENDIR, and \$GEMHOME before running any tests. Many
36 test suites depend on other components being installed, and installing
37 everything tends to be quicker than debugging dependencies.
39 More information and background:
41 https://arvados.org/projects/arvados/wiki/Running_tests
44 # First make sure to remove any ARVADOS_ variables from the calling
45 # environment that could interfere with the tests.
46 unset $(env | cut -d= -f1 | grep \^ARVADOS_)
48 # Reset other variables that could affect our [tests'] behavior by
67 if [[ -f /etc/profile.d/rvm.sh ]]
69 source /etc/profile.d/rvm.sh
75 for var in VENVDIR GOPATH GITDIR GEMHOME
77 if [[ -z "${leave_temp[$var]}" ]]
84 leaving+=" $var=\"${!var}\""
87 if [[ -z "$leaving" ]]; then
88 echo "Leaving behind temp dirs: $leaving"
94 echo >&2 "Fatal: $* in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]}"
99 for x in "${successes[@]}"
104 if [[ ${#failures[@]} == 0 ]]
106 echo "All test suites passed."
108 echo "Failures (${#failures[@]}):"
109 for x in "${failures[@]}"
118 # Always skip CLI tests. They don't know how to use run_test_server.py.
126 echo >&2 "$helpmessage"
141 leave_temp[VENVDIR]=1
143 leave_temp[GEMHOME]=1
146 eval $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
149 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
156 echo "WORKSPACE=$WORKSPACE"
157 [[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
159 if [[ -n "$CONFIGSRC" ]]; then
160 if [[ -d "$HOME/arvados-api-server" ]]; then
161 # Jenkins expects us to use this by default.
162 CONFIGSRC="$HOME/arvados-api-server"
166 # Set up temporary install dirs (unless existing dirs were supplied)
167 for tmpdir in VENVDIR GOPATH GEMHOME
169 if [[ -n "${!tmpdir}" ]]; then
170 leave_temp[$tmpdir]=1
172 eval $tmpdir=$(mktemp -d)
175 PATH="$GEMHOME/.gem/ruby/2.1.0/bin:$PATH"
177 mkdir -p "$GOPATH/src/git.curoverse.com"
178 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
179 || fatal "symlink failed"
181 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
182 PATH="$VENVDIR/bin:$PATH"
185 if [[ "$?" != "0" ]]; then
186 title "!!!!!! $1 FAILED !!!!!!"
187 failures+=("$1 (`timer`)")
189 successes+=("$1 (`timer`)")
198 echo -n "$(($SECONDS - $t0))s"
202 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
204 title "Running $1 tests"
206 if [[ "$2" == "go" ]]
208 go test "git.curoverse.com/arvados.git/$1"
213 title "End of $1 tests (`timer`)"
215 title "Skipping $1 tests"
220 if [[ -z "$skip_install" ]]
222 title "Running $1 install"
224 if [[ "$2" == "go" ]]
226 go get -t "git.curoverse.com/arvados.git/$1"
230 checkexit "$1 install"
231 title "End of $1 install (`timer`)"
233 title "Skipping $1 install"
238 txt="********** $1 **********"
239 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
244 HOME="$GEMHOME" bundle install --no-deployment
246 # Make sure python-epydoc is installed or the next line won't do much good!
247 ARVADOS_API_HOST=qr1hi.arvadosapi.com
248 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
249 unset ARVADOS_API_HOST
254 cd "$WORKSPACE/sdk/ruby" \
255 && HOME="$GEMHOME" bundle install --no-deployment \
256 && gem build arvados.gemspec \
257 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
262 cd "$WORKSPACE/sdk/cli" \
263 && gem build arvados-cli.gemspec \
264 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
268 install_python_sdk() {
269 # Install the Python SDK early. Various other test suites (like
270 # keepproxy) bring up run_test_server.py, which imports the arvados
271 # module. We can't actually *test* the Python SDK yet though, because
272 # its own test suite brings up some of those other programs (like
275 cd "$WORKSPACE/sdk/python" \
276 && python setup.py egg_info -b ".$(git log --first-parent --format=format:%ci.%h -n1 . | tr -dc 0-9a-f. | cut -c 1-14,19-)" sdist rotate --keep=1 --match .tar.gz \
277 && pip install dist/arvados-python-client-0.1.*.tar.gz
279 do_install python_sdk
282 cd "$WORKSPACE/services/fuse" \
283 && python setup.py egg_info -b ".$(git log --first-parent --format=format:%ci.%h -n1 . | tr -dc 0-9a-f. | cut -c 1-14,19-)" sdist rotate --keep=1 --match .tar.gz \
284 && pip install dist/arvados_fuse-0.1.*.tar.gz
288 install_apiserver() {
289 cd "$WORKSPACE/services/api"
290 export RAILS_ENV=test
291 HOME="$GEMHOME" bundle install --no-deployment
293 rm -f config/environments/test.rb
294 cp config/environments/test.rb.example config/environments/test.rb
296 if [ -n "$CONFIGSRC" ]
298 for f in database.yml application.yml
300 cp "$CONFIGSRC/$f" config/ || fatal "$f"
304 # Fill in a random secret_token and blob_signing_key for testing
305 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
306 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
308 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
309 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
311 # Set up empty git repo (for git tests)
313 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
316 mkdir -p $GITDIR/test
319 && git config user.email "jenkins@ci.curoverse.com" \
320 && git config user.name "Jenkins, CI" \
323 && git commit -m 'initial commit'
325 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
326 # This assumes the current user is a postgresql superuser
327 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
329 cd "$WORKSPACE/services/api" \
330 && HOME="$GEMHOME" bundle exec rake db:drop \
331 && HOME="$GEMHOME" bundle exec rake db:create \
332 && HOME="$GEMHOME" bundle exec rake db:setup
344 for g in "${gostuff[@]}"
349 test_doclinkchecker() {
351 HOME="$GEMHOME" bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
353 do_test doclinkchecker
356 cd "$WORKSPACE/sdk/ruby" \
357 && HOME="$GEMHOME" bundle install --no-deployment \
358 && HOME="$GEMHOME" bundle exec rake test
363 title "Starting SDK CLI tests"
364 cd "$WORKSPACE/sdk/cli" \
365 && HOME="$GEMHOME" bundle install --no-deployment \
366 && mkdir -p /tmp/keep \
367 && KEEP_LOCAL_STORE=/tmp/keep HOME="$GEMHOME" bundle exec rake test $cli_test
372 cd "$WORKSPACE/services/api"
373 HOME="$GEMHOME" bundle exec rake test $apiserver_test
378 # Python SDK. We test this before testing keepproxy: keepproxy runs
379 # run_test_server.py, which depends on the yaml package, which is in
380 # tests_require but not install_requires, and therefore does not get
381 # installed by setuptools until we run "setup.py test" *and* install
382 # the .egg files that setup.py downloads.
384 cd "$WORKSPACE/sdk/python" \
385 && python setup.py test $python_sdk_test
393 # Install test dependencies here too, in case run_test_server needs them.
394 cd "$WORKSPACE/services/fuse" \
395 && python setup.py test $fuse_test
402 for g in "${gostuff[@]}"
408 cd "$WORKSPACE/apps/workbench" \
409 && HOME="$GEMHOME" bundle install --no-deployment \
410 && HOME="$GEMHOME" bundle exec rake test $workbench_test