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_test.rb"
25 Restrict apiserver tests to the given file
26 python_sdk_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
71 if [[ -f /etc/profile.d/rvm.sh ]]
73 source /etc/profile.d/rvm.sh
79 for var in VENVDIR GOPATH GITDIR GEMHOME
81 if [[ -z "${leave_temp[$var]}" ]]
88 leaving+=" $var=\"${!var}\""
91 if [[ -n "$leaving" ]]; then
92 echo "Leaving behind temp dirs: $leaving"
98 echo >&2 "Fatal: $* in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]}"
103 for x in "${successes[@]}"
108 if [[ ${#failures[@]} == 0 ]]
110 echo "All test suites passed."
112 echo "Failures (${#failures[@]}):"
113 for x in "${failures[@]}"
122 # Always skip CLI tests. They don't know how to use run_test_server.py.
125 # Skip Node Manager tests. Because these tests are multithreaded, their
126 # performance is a little unpredictable, and Jenkins regularly has trouble
127 # with them. Brett has a plan for making them more robust, but it's going
128 # to take a little time to implement. -2014-10-10
136 echo >&2 "$helpmessage"
151 leave_temp[VENVDIR]=1
153 leave_temp[GEMHOME]=1
156 eval $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
159 echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
166 echo "WORKSPACE=$WORKSPACE"
167 [[ -n "$WORKSPACE" ]] || fatal "WORKSPACE not set"
169 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
170 # Jenkins expects us to use this by default.
171 CONFIGSRC="$HOME/arvados-api-server"
174 # Set up temporary install dirs (unless existing dirs were supplied)
175 for tmpdir in VENVDIR GOPATH GEMHOME
177 if [[ -n "${!tmpdir}" ]]; then
178 leave_temp[$tmpdir]=1
180 eval $tmpdir=$(mktemp -d)
183 PATH="$GEMHOME/.gem/ruby/2.1.0/bin:$PATH"
185 mkdir -p "$GOPATH/src/git.curoverse.com"
186 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
187 || fatal "symlink failed"
189 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
190 . "$VENVDIR/bin/activate"
193 if [[ "$?" != "0" ]]; then
194 title "!!!!!! $1 FAILED !!!!!!"
195 failures+=("$1 (`timer`)")
197 successes+=("$1 (`timer`)")
206 echo -n "$(($SECONDS - $t0))s"
210 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
212 title "Running $1 tests"
214 if [[ "$2" == "go" ]]
216 go test "git.curoverse.com/arvados.git/$1"
221 title "End of $1 tests (`timer`)"
223 title "Skipping $1 tests"
228 if [[ -z "$skip_install" ]]
230 title "Running $1 install"
232 if [[ "$2" == "go" ]]
234 go get -t "git.curoverse.com/arvados.git/$1"
238 checkexit "$1 install"
239 title "End of $1 install (`timer`)"
241 title "Skipping $1 install"
246 txt="********** $1 **********"
247 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
252 HOME="$GEMHOME" bundle install --no-deployment
254 # Make sure python-epydoc is installed or the next line won't do much good!
255 ARVADOS_API_HOST=qr1hi.arvadosapi.com
256 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
257 unset ARVADOS_API_HOST
262 cd "$WORKSPACE/sdk/ruby" \
263 && HOME="$GEMHOME" bundle install --no-deployment \
264 && gem build arvados.gemspec \
265 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
270 cd "$WORKSPACE/sdk/cli" \
271 && gem build arvados-cli.gemspec \
272 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
276 install_python_sdk() {
277 # Install the Python SDK early. Various other test suites (like
278 # keepproxy) bring up run_test_server.py, which imports the arvados
279 # module. We can't actually *test* the Python SDK yet though, because
280 # its own test suite brings up some of those other programs (like
283 cd "$WORKSPACE/sdk/python" \
284 && python setup.py sdist rotate --keep=1 --match .tar.gz \
285 && pip install dist/arvados-python-client-0.1.*.tar.gz
287 do_install python_sdk
290 cd "$WORKSPACE/services/fuse" \
291 && python setup.py sdist rotate --keep=1 --match .tar.gz \
292 && pip install dist/arvados_fuse-0.1.*.tar.gz
296 install_apiserver() {
297 cd "$WORKSPACE/services/api"
298 export RAILS_ENV=test
299 HOME="$GEMHOME" bundle install --no-deployment
301 rm -f config/environments/test.rb
302 cp config/environments/test.rb.example config/environments/test.rb
304 if [ -n "$CONFIGSRC" ]
306 for f in database.yml application.yml
308 cp "$CONFIGSRC/$f" config/ || fatal "$f"
312 # Fill in a random secret_token and blob_signing_key for testing
313 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
314 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
316 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
317 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
319 # Set up empty git repo (for git tests)
321 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
324 mkdir -p $GITDIR/test
327 && git config user.email "jenkins@ci.curoverse.com" \
328 && git config user.name "Jenkins, CI" \
331 && git commit -m 'initial commit'
333 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
334 # This assumes the current user is a postgresql superuser
335 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
337 cd "$WORKSPACE/services/api" \
338 && HOME="$GEMHOME" bundle exec rake db:drop \
339 && HOME="$GEMHOME" bundle exec rake db:create \
340 && HOME="$GEMHOME" bundle exec rake db:setup
352 for g in "${gostuff[@]}"
357 test_doclinkchecker() {
359 HOME="$GEMHOME" bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
361 do_test doclinkchecker
364 cd "$WORKSPACE/sdk/ruby" \
365 && HOME="$GEMHOME" bundle install --no-deployment \
366 && HOME="$GEMHOME" bundle exec rake test
371 title "Starting SDK CLI tests"
372 cd "$WORKSPACE/sdk/cli" \
373 && HOME="$GEMHOME" bundle install --no-deployment \
374 && mkdir -p /tmp/keep \
375 && KEEP_LOCAL_STORE=/tmp/keep HOME="$GEMHOME" bundle exec rake test $cli_test
380 cd "$WORKSPACE/services/api"
381 HOME="$GEMHOME" bundle exec rake test $apiserver_test
386 # Python SDK. We test this before testing keepproxy: keepproxy runs
387 # run_test_server.py, which depends on the yaml package, which is in
388 # tests_require but not install_requires, and therefore does not get
389 # installed by setuptools until we run "setup.py test" *and* install
390 # the .egg files that setup.py downloads.
392 cd "$WORKSPACE/sdk/python" \
393 && python setup.py test $python_sdk_test
401 # Install test dependencies here too, in case run_test_server needs them.
402 cd "$WORKSPACE/services/fuse" \
403 && python setup.py test $fuse_test
411 cd "$WORKSPACE/services/nodemanager" && python setup.py test
415 for g in "${gostuff[@]}"
421 cd "$WORKSPACE/apps/workbench" \
422 && HOME="$GEMHOME" bundle install --no-deployment \
423 && HOME="$GEMHOME" bundle exec rake test $workbench_test