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)
186 # When our "bundle install"s need to install new gems to satisfy
187 # dependencies, we want them to go where "gem install --user-install"
188 # would put them. This could be ~/.gem/..., or something rvm has set
189 # up. We don't want to install them to our GEMHOME tmpdir, though:
190 # that would mean re-downloading all dependencies each time we run
191 # tests with clean tmpdirs. The first dir in `gem env gempath` seems
192 # to give us this dir. (Note: this is a no-op if rvm is in use.)
193 user_gempath="$(gem env gempath)"
194 export GEM_HOME="${user_gempath%%:*}"
195 PATH="$(gem env gemdir)/bin:$PATH"
197 # Wherever "HOME=$GEMHOME gem install --user-install" installs stuff
198 # to, we want its bin to be in our PATH. (Normally, this gempath is
199 # inside our nice clean $GEMHOME, which means we can install the
200 # current version there and expect integration tests to find it before
201 # finding any other versions that happen to be installed
202 # somewhere. But if rvm is enforcing its own idea where gempath should
203 # go, we'll just assume rvm has been set up correctly rather than
205 tmpdir_gempath="$(HOME="$GEMHOME" gem env gempath)"
206 PATH="${tmpdir_gempath%%:*}/bin:$PATH"
208 if ! which bundler >/dev/null
210 gem install --user-install bundler || fatal 'Could not install bundler'
214 mkdir -p "$GOPATH/src/git.curoverse.com"
215 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
216 || fatal "symlink failed"
218 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
219 . "$VENVDIR/bin/activate"
221 # Needed for run_test_server.py which is used by certain (non-Python) tests.
225 if [[ "$?" != "0" ]]; then
226 title "!!!!!! $1 FAILED !!!!!!"
227 failures+=("$1 (`timer`)")
229 successes+=("$1 (`timer`)")
238 echo -n "$(($SECONDS - $t0))s"
242 if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
244 title "Running $1 tests"
246 if [[ "$2" == "go" ]]
248 go test "git.curoverse.com/arvados.git/$1"
249 elif [[ "$2" == "pip" ]]
251 # Other test suites can depend on tests_require
252 # dependencies of this package. For example, keepproxy runs
253 # run_test_server.py, which depends on the yaml package,
254 # which is in sdk/python's tests_require but not
255 # install_requires, and therefore does not get installed by
256 # setuptools until we run "setup.py test" *and* install the
257 # .egg files that setup.py downloads.
259 && HOME="$GEMHOME" python setup.py test ${testargs[$1]} \
260 && (easy_install *.egg || true)
265 title "End of $1 tests (`timer`)"
267 title "Skipping $1 tests"
272 if [[ -z "$skip_install" ]]
274 title "Running $1 install"
276 if [[ "$2" == "go" ]]
278 go get -t "git.curoverse.com/arvados.git/$1"
279 elif [[ "$2" == "pip" ]]
282 && python setup.py sdist rotate --keep=1 --match .tar.gz \
283 && pip install --upgrade dist/*.tar.gz
287 checkexit "$1 install"
288 title "End of $1 install (`timer`)"
290 title "Skipping $1 install"
295 txt="********** $1 **********"
296 printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
301 HOME="$GEMHOME" bundle install --no-deployment
303 # Make sure python-epydoc is installed or the next line won't do much good!
304 ARVADOS_API_HOST=qr1hi.arvadosapi.com
305 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
306 unset ARVADOS_API_HOST
311 cd "$WORKSPACE/sdk/ruby" \
312 && HOME="$GEMHOME" bundle install --no-deployment \
313 && HOME="$GEMHOME" gem build arvados.gemspec \
314 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-*.gem|head -n1`
319 cd "$WORKSPACE/sdk/cli" \
320 && HOME="$GEMHOME" bundle install --no-deployment \
321 && HOME="$GEMHOME" gem build arvados-cli.gemspec \
322 && HOME="$GEMHOME" gem install --user-install --no-ri --no-rdoc `ls -t arvados-cli-*.gem|head -n1`
326 # Install the Python SDK early. Various other test suites (like
327 # keepproxy) bring up run_test_server.py, which imports the arvados
328 # module. We can't actually *test* the Python SDK yet though, because
329 # its own test suite brings up some of those other programs (like
331 declare -a pythonstuff
337 for p in "${pythonstuff[@]}"
342 install_apiserver() {
343 cd "$WORKSPACE/services/api"
344 export RAILS_ENV=test
345 HOME="$GEMHOME" bundle install --no-deployment
347 rm -f config/environments/test.rb
348 cp config/environments/test.rb.example config/environments/test.rb
350 if [ -n "$CONFIGSRC" ]
352 for f in database.yml application.yml
354 cp "$CONFIGSRC/$f" config/ || fatal "$f"
358 # Fill in a random secret_token and blob_signing_key for testing
359 SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
360 BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
362 sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
363 sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
365 # Set up empty git repo (for git tests)
367 sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
370 mkdir -p $GITDIR/test
373 && git config user.email "jenkins@ci.curoverse.com" \
374 && git config user.name "Jenkins, CI" \
377 && git commit -m 'initial commit'
379 # Clear out any lingering postgresql connections to arvados_test, so that we can drop it
380 # This assumes the current user is a postgresql superuser
381 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
383 cd "$WORKSPACE/services/api" \
384 && HOME="$GEMHOME" bundle exec rake db:drop \
385 && HOME="$GEMHOME" bundle exec rake db:create \
386 && HOME="$GEMHOME" bundle exec rake db:setup
399 for g in "${gostuff[@]}"
404 test_doclinkchecker() {
406 HOME="$GEMHOME" bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/
408 do_test doclinkchecker
411 cd "$WORKSPACE/sdk/ruby" \
412 && HOME="$GEMHOME" bundle install --no-deployment \
413 && HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/ruby]}
418 title "Starting SDK CLI tests"
419 cd "$WORKSPACE/sdk/cli" \
420 && HOME="$GEMHOME" bundle install --no-deployment \
421 && mkdir -p /tmp/keep \
422 && KEEP_LOCAL_STORE=/tmp/keep HOME="$GEMHOME" bundle exec rake test ${testargs[sdk/cli]}
427 cd "$WORKSPACE/services/api"
428 HOME="$GEMHOME" bundle exec rake test ${testargs[apiserver]}
432 # We must test sdk/python before testing services/keepproxy, because
433 # keepproxy depends on sdk/python's test dependencies.
434 for p in "${pythonstuff[@]}"
439 for g in "${gostuff[@]}"
445 cd "$WORKSPACE/apps/workbench" \
446 && HOME="$GEMHOME" bundle install --no-deployment \
447 && HOME="$GEMHOME" bundle exec rake test ${testargs[workbench]}