6781: Add arvados-login-sync.
[arvados-dev.git] / jenkins / run-tests.sh
1 #!/bin/bash
2
3 read -rd "\000" helpmessage <<EOF
4 $(basename $0): Install and test Arvados components.
5
6 Exit non-zero if any tests fail.
7
8 Syntax:
9         $(basename $0) WORKSPACE=/path/to/arvados [options]
10
11 Options:
12
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 --only-install Run specific install step
22 WORKSPACE=path Arvados source tree to test.
23 CONFIGSRC=path Dir with api server config files to copy into source tree.
24                (If none given, leave config files alone in source tree.)
25 services/api_test="TEST=test/functional/arvados/v1/collections_controller_test.rb"
26                Restrict apiserver tests to the given file
27 sdk/python_test="--test-suite test.test_keep_locator"
28                Restrict Python SDK tests to the given class
29 apps/workbench_test="TEST=test/integration/pipeline_instances_test.rb"
30                Restrict Workbench tests to the given file
31 services/arv-git-httpd_test="-check.vv"
32                Show all log messages, even when tests pass (also works
33                with services/keepstore_test etc.)
34 ARVADOS_DEBUG=1
35                Print more debug messages
36 envvar=value   Set \$envvar to value. Primarily useful for WORKSPACE,
37                *_test, and other examples shown above.
38
39 Assuming --skip-install is not given, all components are installed
40 into \$GOPATH, \$VENDIR, and \$GEMHOME before running any tests. Many
41 test suites depend on other components being installed, and installing
42 everything tends to be quicker than debugging dependencies.
43
44 As a special concession to the current CI server config, CONFIGSRC
45 defaults to $HOME/arvados-api-server if that directory exists.
46
47 More information and background:
48
49 https://arvados.org/projects/arvados/wiki/Running_tests
50
51 Available tests:
52
53 apps/workbench
54 apps/workbench_benchmark
55 apps/workbench_profile
56 doc
57 services/api
58 services/crunchstat
59 services/dockercleaner
60 services/fuse
61 services/keepproxy
62 services/keepstore
63 services/login-sync
64 services/nodemanager
65 services/arv-git-httpd
66 sdk/cli
67 sdk/pam
68 sdk/python
69 sdk/ruby
70 sdk/go/arvadosclient
71 sdk/go/keepclient
72 sdk/go/streamer
73
74 EOF
75
76 # First make sure to remove any ARVADOS_ variables from the calling
77 # environment that could interfere with the tests.
78 unset $(env | cut -d= -f1 | grep \^ARVADOS_)
79
80 # Reset other variables that could affect our [tests'] behavior by
81 # accident.
82 GITDIR=
83 GOPATH=
84 VENVDIR=
85 VENV3DIR=
86 PYTHONPATH=
87 GEMHOME=
88 PERLINSTALLBASE=
89
90 COLUMNS=80
91
92 leave_temp=
93 skip_install=
94
95 declare -A leave_temp
96 clear_temp() {
97     leaving=""
98     for var in VENVDIR VENV3DIR GOPATH GITDIR GEMHOME PERLINSTALLBASE
99     do
100         if [[ -z "${leave_temp[$var]}" ]]
101         then
102             if [[ -n "${!var}" ]]
103             then
104                 rm -rf "${!var}"
105             fi
106         else
107             leaving+=" $var=\"${!var}\""
108         fi
109     done
110     if [[ -n "$leaving" ]]; then
111         echo "Leaving behind temp dirs: $leaving"
112     fi
113 }
114
115 fatal() {
116     clear_temp
117     echo >&2 "Fatal: $* (encountered in ${FUNCNAME[1]} at ${BASH_SOURCE[1]} line ${BASH_LINENO[0]})"
118     exit 1
119 }
120
121 report_outcomes() {
122     for x in "${successes[@]}"
123     do
124         echo "Pass: $x"
125     done
126
127     if [[ ${#failures[@]} == 0 ]]
128     then
129         echo "All test suites passed."
130     else
131         echo "Failures (${#failures[@]}):"
132         for x in "${failures[@]}"
133         do
134             echo "Fail: $x"
135         done
136     fi
137 }
138
139 exit_cleanly() {
140     trap - INT
141     create-plot-data-from-log.sh $BUILD_NUMBER "$WORKSPACE/apps/workbench/log/test.log" "$WORKSPACE/apps/workbench/log/"
142     rotate_logfile "$WORKSPACE/apps/workbench/log/" "test.log"
143     stop_services
144     rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
145     report_outcomes
146     clear_temp
147     exit ${#failures}
148 }
149
150 sanity_checks() {
151     ( [[ -n "$WORKSPACE" ]] && [[ -d "$WORKSPACE/services" ]] ) \
152         || fatal "WORKSPACE environment variable not set to a source directory (see: $0 --help)"
153     echo Checking dependencies:
154     echo -n 'virtualenv: '
155     virtualenv --version \
156         || fatal "No virtualenv. Try: apt-get install virtualenv"
157     echo -n 'go: '
158     go version \
159         || fatal "No go binary. See http://golang.org/doc/install"
160     echo -n 'gcc: '
161     gcc --version | egrep ^gcc \
162         || fatal "No gcc. Try: apt-get install build-essential"
163     echo -n 'fuse.h: '
164     find /usr/include -wholename '*fuse/fuse.h' \
165         || fatal "No fuse/fuse.h. Try: apt-get install libfuse-dev"
166     echo -n 'pyconfig.h: '
167     find /usr/include -name pyconfig.h | egrep --max-count=1 . \
168         || fatal "No pyconfig.h. Try: apt-get install python-dev"
169     echo -n 'nginx: '
170     PATH="$PATH:/sbin:/usr/sbin:/usr/local/sbin" nginx -v \
171         || fatal "No nginx. Try: apt-get install nginx"
172     echo -n 'perl: '
173     perl -v | grep version \
174         || fatal "No perl. Try: apt-get install perl"
175     for mod in ExtUtils::MakeMaker JSON LWP Net::SSL; do
176         echo -n "perl $mod: "
177         perl -e "use $mod; print \"\$$mod::VERSION\\n\"" \
178             || fatal "No $mod. Try: apt-get install perl-modules libcrypt-ssleay-perl libjson-perl"
179     done
180 }
181
182 rotate_logfile() {
183   # i.e.  rotate_logfile "$WORKSPACE/apps/workbench/log/" "test.log"
184   # $BUILD_NUMBER is set by Jenkins if this script is being called as part of a Jenkins run
185   if [[ -f "$1/$2" ]]; then
186     THEDATE=`date +%Y%m%d%H%M%S`
187     mv "$1/$2" "$1/$THEDATE-$BUILD_NUMBER-$2"
188     gzip "$1/$THEDATE-$BUILD_NUMBER-$2"
189   fi
190 }
191
192 declare -a failures
193 declare -A skip
194 declare -A testargs
195 skip[apps/workbench_profile]=1
196
197 while [[ -n "$1" ]]
198 do
199     arg="$1"; shift
200     case "$arg" in
201         --help)
202             echo >&2 "$helpmessage"
203             echo >&2
204             exit 1
205             ;;
206         --skip)
207             skipwhat="$1"; shift
208             skip[$skipwhat]=1
209             ;;
210         --only)
211             only="$1"; skip[$1]=""; shift
212             ;;
213         --skip-install)
214             skip_install=1
215             ;;
216         --only-install)
217             skip_install=1
218             only_install="$1"; shift
219             ;;
220         --leave-temp)
221             leave_temp[VENVDIR]=1
222             leave_temp[VENV3DIR]=1
223             leave_temp[GOPATH]=1
224             leave_temp[GEMHOME]=1
225             leave_temp[PERLINSTALLBASE]=1
226             ;;
227         --retry)
228             retry=1
229             ;;
230         *_test=*)
231             suite="${arg%%_test=*}"
232             args="${arg#*=}"
233             testargs["$suite"]="$args"
234             ;;
235         *=*)
236             eval export $(echo $arg | cut -d= -f1)=\"$(echo $arg | cut -d= -f2-)\"
237             ;;
238         *)
239             echo >&2 "$0: Unrecognized option: '$arg'. Try: $0 --help"
240             exit 1
241             ;;
242     esac
243 done
244
245 start_api() {
246     echo 'Starting API server...'
247     cd "$WORKSPACE" \
248         && eval $(python sdk/python/tests/run_test_server.py start --auth admin) \
249         && export ARVADOS_TEST_API_HOST="$ARVADOS_API_HOST" \
250         && export ARVADOS_TEST_API_INSTALLED="$$" \
251         && (env | egrep ^ARVADOS)
252 }
253
254 start_nginx_proxy_services() {
255     echo 'Starting keepproxy, arv-git-httpd, and nginx ssl proxy...'
256     cd "$WORKSPACE" \
257         && python sdk/python/tests/run_test_server.py start_keep_proxy \
258         && python sdk/python/tests/run_test_server.py start_arv-git-httpd \
259         && python sdk/python/tests/run_test_server.py start_nginx \
260         && export ARVADOS_TEST_PROXY_SERVICES=1
261 }
262
263 stop_services() {
264     if [[ -n "$ARVADOS_TEST_PROXY_SERVICES" ]]; then
265         unset ARVADOS_TEST_PROXY_SERVICES
266         cd "$WORKSPACE" \
267             && python sdk/python/tests/run_test_server.py stop_nginx \
268             && python sdk/python/tests/run_test_server.py stop_arv-git-httpd \
269             && python sdk/python/tests/run_test_server.py stop_keep_proxy
270     fi
271     if [[ -n "$ARVADOS_TEST_API_HOST" ]]; then
272         unset ARVADOS_TEST_API_HOST
273         cd "$WORKSPACE" \
274             && python sdk/python/tests/run_test_server.py stop
275     fi
276 }
277
278 interrupt() {
279     failures+=("($(basename $0) interrupted)")
280     exit_cleanly
281 }
282 trap interrupt INT
283
284 sanity_checks
285
286 echo "WORKSPACE=$WORKSPACE"
287
288 if [[ -z "$CONFIGSRC" ]] && [[ -d "$HOME/arvados-api-server" ]]; then
289     # Jenkins expects us to use this by default.
290     CONFIGSRC="$HOME/arvados-api-server"
291 fi
292
293 # Clean up .pyc files that may exist in the workspace
294 cd "$WORKSPACE"
295 find -name '*.pyc' -delete
296
297 # Set up temporary install dirs (unless existing dirs were supplied)
298 for tmpdir in VENVDIR VENV3DIR GOPATH GEMHOME PERLINSTALLBASE
299 do
300     if [[ -n "${!tmpdir}" ]]; then
301         leave_temp[$tmpdir]=1
302         mkdir -p "${!tmpdir}"
303     else
304         eval "$tmpdir"='$(mktemp -d)'
305     fi
306 done
307
308 setup_ruby_environment() {
309     if [[ -s "$HOME/.rvm/scripts/rvm" ]] ; then
310       source "$HOME/.rvm/scripts/rvm"
311       using_rvm=true
312     elif [[ -s "/usr/local/rvm/scripts/rvm" ]] ; then
313       source "/usr/local/rvm/scripts/rvm"
314       using_rvm=true
315     else
316       using_rvm=false
317     fi
318
319     if [[ "$using_rvm" == true ]]; then
320         # If rvm is in use, we can't just put separate "dependencies"
321         # and "gems-under-test" paths to GEM_PATH: passenger resets
322         # the environment to the "current gemset", which would lose
323         # our GEM_PATH and prevent our test suites from running ruby
324         # programs (for example, the Workbench test suite could not
325         # boot an API server or run arv). Instead, we have to make an
326         # rvm gemset and use it for everything.
327
328         [[ `type rvm | head -n1` == "rvm is a function" ]] \
329             || fatal 'rvm check'
330
331         # Put rvm's favorite path back in first place (overriding
332         # virtualenv, which just put itself there). Ignore rvm's
333         # complaint about not being in first place already.
334         rvm use @default 2>/dev/null
335
336         # Create (if needed) and switch to an @arvados-tests
337         # gemset. (Leave the choice of ruby to the caller.)
338         rvm use @arvados-tests --create \
339             || fatal 'rvm gemset setup'
340
341         rvm env
342     else
343         # When our "bundle install"s need to install new gems to
344         # satisfy dependencies, we want them to go where "gem install
345         # --user-install" would put them. (However, if the caller has
346         # already set GEM_HOME, we assume that's where dependencies
347         # should be installed, and we should leave it alone.)
348
349         if [ -z "$GEM_HOME" ]; then
350             user_gempath="$(gem env gempath)"
351             export GEM_HOME="${user_gempath%%:*}"
352         fi
353         PATH="$(gem env gemdir)/bin:$PATH"
354
355         # When we build and install our own gems, we install them in our
356         # $GEMHOME tmpdir, and we want them to be at the front of GEM_PATH and
357         # PATH so integration tests prefer them over other versions that
358         # happen to be installed in $user_gempath, system dirs, etc.
359
360         tmpdir_gem_home="$(env - PATH="$PATH" HOME="$GEMHOME" gem env gempath | cut -f1 -d:)"
361         PATH="$tmpdir_gem_home/bin:$PATH"
362         export GEM_PATH="$tmpdir_gem_home:$(gem env gempath)"
363
364         echo "Will install dependencies to $(gem env gemdir)"
365         echo "Will install arvados gems to $tmpdir_gem_home"
366         echo "Gem search path is GEM_PATH=$GEM_PATH"
367     fi
368 }
369
370 with_test_gemset() {
371     if [[ "$using_rvm" == true ]]; then
372         "$@"
373     else
374         GEM_HOME="$tmpdir_gem_home" GEM_PATH="$tmpdir_gem_home" "$@"
375     fi
376 }
377
378 gem_uninstall_if_exists() {
379     if gem list "$1\$" | egrep '^\w'; then
380         gem uninstall --force --all --executables "$1"
381     fi
382 }
383
384 export PERLINSTALLBASE
385 export PERLLIB="$PERLINSTALLBASE/lib/perl5:${PERLLIB:+$PERLLIB}"
386
387 export GOPATH
388 mkdir -p "$GOPATH/src/git.curoverse.com"
389 ln -sfn "$WORKSPACE" "$GOPATH/src/git.curoverse.com/arvados.git" \
390     || fatal "symlink failed"
391
392 virtualenv --setuptools "$VENVDIR" || fatal "virtualenv $VENVDIR failed"
393 . "$VENVDIR/bin/activate"
394
395 if (pip install setuptools | grep setuptools-0) || [ "$($VENVDIR/bin/easy_install --version | cut -d\  -f2 | cut -d. -f1)" -lt 18 ]; then
396     pip install --upgrade setuptools
397 fi
398
399 # Note: this must be the last time we change PATH, otherwise rvm will
400 # whine a lot.
401 setup_ruby_environment
402
403 echo "PATH is $PATH"
404
405 if ! which bundler >/dev/null
406 then
407     gem install --user-install bundler || fatal 'Could not install bundler'
408 fi
409
410 # Needed for run_test_server.py which is used by certain (non-Python) tests.
411 pip freeze 2>/dev/null | egrep ^PyYAML= \
412     || pip install PyYAML >/dev/null \
413     || fatal "pip install PyYAML failed"
414
415 # If Python 3 is available, set up its virtualenv in $VENV3DIR.
416 # Otherwise, skip dependent tests.
417 PYTHON3=$(which python3)
418 if [ "0" = "$?" ]; then
419     virtualenv --python "$PYTHON3" --setuptools "$VENV3DIR" \
420         || fatal "python3 virtualenv $VENV3DIR failed"
421 else
422     PYTHON3=
423     skip[services/dockercleaner]=1
424     cat >&2 <<EOF
425
426 Warning: python3 could not be found
427 services/dockercleaner install and tests will be skipped
428
429 EOF
430 fi
431
432 checkexit() {
433     if [[ "$1" != "0" ]]; then
434         title "!!!!!! $2 FAILED !!!!!!"
435         failures+=("$2 (`timer`)")
436     else
437         successes+=("$2 (`timer`)")
438     fi
439 }
440
441 timer_reset() {
442     t0=$SECONDS
443 }
444
445 timer() {
446     echo -n "$(($SECONDS - $t0))s"
447 }
448
449 do_test() {
450     while ! do_test_once ${@} && [[ "$retry" == 1 ]]
451     do
452         read -p 'Try again? [Y/n] ' x
453         if [[ "$x" != "y" ]] && [[ "$x" != "" ]]
454         then
455             break
456         fi
457     done
458 }
459
460 do_test_once() {
461     if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
462     then
463         title "Running $1 tests"
464         timer_reset
465         if [[ "$2" == "go" ]]
466         then
467             if [[ -n "${testargs[$1]}" ]]
468             then
469                 # "go test -check.vv giturl" doesn't work, but this
470                 # does:
471                 cd "$WORKSPACE/$1" && go test ${testargs[$1]}
472             else
473                 # The above form gets verbose even when testargs is
474                 # empty, so use this form in such cases:
475                 go test "git.curoverse.com/arvados.git/$1"
476             fi
477         elif [[ "$2" == "pip" ]]
478         then
479             # $3 can name a path directory for us to use, including trailing
480             # slash; e.g., the bin/ subdirectory of a virtualenv.
481             cd "$WORKSPACE/$1" \
482                 && "${3}python" setup.py test ${testargs[$1]}
483         elif [[ "$2" != "" ]]
484         then
485             "test_$2"
486         else
487             "test_$1"
488         fi
489         result="$?"
490         checkexit $result "$1 tests"
491         title "End of $1 tests (`timer`)"
492         return $result
493     else
494         title "Skipping $1 tests"
495     fi
496 }
497
498 do_install() {
499     if [[ -z "$skip_install" || (-n "$only_install" && "$only_install" == "$1") ]]
500     then
501         title "Running $1 install"
502         timer_reset
503         if [[ "$2" == "go" ]]
504         then
505             go get -t "git.curoverse.com/arvados.git/$1"
506         elif [[ "$2" == "pip" ]]
507         then
508             # $3 can name a path directory for us to use, including trailing
509             # slash; e.g., the bin/ subdirectory of a virtualenv.
510
511             # Need to change to a different directory after creating
512             # the source dist package to avoid a pip bug.
513             # see https://arvados.org/issues/5766 for details.
514
515             # Also need to install twice, because if it believes the package is
516             # already installed, pip it won't install it.  So the first "pip
517             # install" ensures that the dependencies are met, the second "pip
518             # install" ensures that we've actually installed the local package
519             # we just built.
520             cd "$WORKSPACE/$1" \
521                 && "${3}python" setup.py sdist rotate --keep=1 --match .tar.gz \
522                 && cd "$WORKSPACE" \
523                 && "${3}pip" install --quiet "$WORKSPACE/$1/dist"/*.tar.gz \
524                 && "${3}pip" install --quiet --no-deps --ignore-installed "$WORKSPACE/$1/dist"/*.tar.gz
525         elif [[ "$2" != "" ]]
526         then
527             "install_$2"
528         else
529             "install_$1"
530         fi
531         checkexit $? "$1 install"
532         title "End of $1 install (`timer`)"
533     else
534         title "Skipping $1 install"
535     fi
536 }
537
538 title () {
539     txt="********** $1 **********"
540     printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
541 }
542
543 bundle_install_trylocal() {
544     (
545         set -e
546         echo "(Running bundle install --local. 'could not find package' messages are OK.)"
547         if ! bundle install --local --no-deployment; then
548             echo "(Running bundle install again, without --local.)"
549             bundle install --no-deployment
550         fi
551         bundle package --all
552     )
553 }
554
555 install_doc() {
556     cd "$WORKSPACE/doc" \
557         && bundle_install_trylocal \
558         && rm -rf .site
559 }
560 do_install doc
561
562 install_gem() {
563     gemname=$1
564     srcpath=$2
565     with_test_gemset gem_uninstall_if_exists "$gemname" \
566         && cd "$WORKSPACE/$srcpath" \
567         && bundle_install_trylocal \
568         && gem build "$gemname.gemspec" \
569         && with_test_gemset gem install --no-ri --no-rdoc $(ls -t "$gemname"-*.gem|head -n1)
570 }
571
572 install_ruby_sdk() {
573     install_gem arvados sdk/ruby
574 }
575 do_install sdk/ruby ruby_sdk
576
577 install_perl_sdk() {
578     cd "$WORKSPACE/sdk/perl" \
579         && perl Makefile.PL INSTALL_BASE="$PERLINSTALLBASE" \
580         && make install INSTALLDIRS=perl
581 }
582 do_install sdk/perl perl_sdk
583
584 install_cli() {
585     install_gem arvados-cli sdk/cli
586 }
587 do_install sdk/cli cli
588
589 install_login-sync() {
590     install_gem arvados-login-sync services/login-sync
591 }
592 do_install services/login-sync login-sync
593
594 # Install the Python SDK early. Various other test suites (like
595 # keepproxy) bring up run_test_server.py, which imports the arvados
596 # module. We can't actually *test* the Python SDK yet though, because
597 # its own test suite brings up some of those other programs (like
598 # keepproxy).
599 declare -a pythonstuff
600 pythonstuff=(
601     sdk/pam
602     sdk/python
603     services/fuse
604     services/nodemanager
605     )
606 for p in "${pythonstuff[@]}"
607 do
608     do_install "$p" pip
609 done
610 if [ -n "$PYTHON3" ]; then
611     do_install services/dockercleaner pip "$VENV3DIR/bin/"
612 fi
613
614 install_apiserver() {
615     cd "$WORKSPACE/services/api" \
616         && RAILS_ENV=test bundle_install_trylocal
617
618     rm -f config/environments/test.rb
619     cp config/environments/test.rb.example config/environments/test.rb
620
621     if [ -n "$CONFIGSRC" ]
622     then
623         for f in database.yml application.yml
624         do
625             cp "$CONFIGSRC/$f" config/ || fatal "$f"
626         done
627     fi
628
629     # Fill in a random secret_token and blob_signing_key for testing
630     SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
631     BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
632
633     sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
634     sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
635
636     # Set up empty git repo (for git tests)
637     GITDIR=$(mktemp -d)
638     sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
639
640     rm -rf $GITDIR
641     mkdir -p $GITDIR/test
642     cd $GITDIR/test \
643         && git init \
644         && git config user.email "jenkins@ci.curoverse.com" \
645         && git config user.name "Jenkins, CI" \
646         && touch tmp \
647         && git add tmp \
648         && git commit -m 'initial commit'
649
650     # Clear out any lingering postgresql connections to the test
651     # database, so that we can drop it. This assumes the current user
652     # is a postgresql superuser.
653     cd "$WORKSPACE/services/api" \
654         && test_database=$(python -c "import yaml; print yaml.load(file('config/database.yml'))['test']['database']") \
655         && psql "$test_database" -c "SELECT pg_terminate_backend (pg_stat_activity.procpid::int) FROM pg_stat_activity WHERE pg_stat_activity.datname = '$test_database';" 2>/dev/null
656
657     cd "$WORKSPACE/services/api" \
658         && RAILS_ENV=test bundle exec rake db:drop \
659         && RAILS_ENV=test bundle exec rake db:setup \
660         && RAILS_ENV=test bundle exec rake db:fixtures:load
661 }
662 do_install services/api apiserver
663
664 declare -a gostuff
665 gostuff=(
666     services/arv-git-httpd
667     services/crunchstat
668     services/keepstore
669     services/keepproxy
670     services/datamanager/summary
671     services/datamanager/collection
672     sdk/go/arvadosclient
673     sdk/go/keepclient
674     sdk/go/streamer
675     )
676 for g in "${gostuff[@]}"
677 do
678     do_install "$g" go
679 done
680
681 install_workbench() {
682     cd "$WORKSPACE/apps/workbench" \
683         && mkdir -p tmp/cache \
684         && RAILS_ENV=test bundle_install_trylocal
685 }
686 do_install apps/workbench workbench
687
688 test_doclinkchecker() {
689     (
690         set -e
691         cd "$WORKSPACE/doc"
692         ARVADOS_API_HOST=qr1hi.arvadosapi.com
693         # Make sure python-epydoc is installed or the next line won't
694         # do much good!
695         PYTHONPATH=$WORKSPACE/sdk/python/ bundle exec rake linkchecker baseurl=file://$WORKSPACE/doc/.site/ arvados_workbench_host=https://workbench.$ARVADOS_API_HOST arvados_api_host=$ARVADOS_API_HOST
696     )
697 }
698 do_test doc doclinkchecker
699
700 stop_services
701
702 test_apiserver() {
703     cd "$WORKSPACE/services/api" \
704         && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[services/api]}
705 }
706 do_test services/api apiserver
707
708 # Shortcut for when we're only running apiserver tests. This saves a bit of time,
709 # because we don't need to start up the api server for subsequent tests.
710 if [ ! -z "$only" ] && [ "$only" == "services/api" ]; then
711   rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
712   exit_cleanly
713 fi
714
715 start_api
716
717 test_ruby_sdk() {
718     cd "$WORKSPACE/sdk/ruby" \
719         && bundle exec rake test TESTOPTS=-v ${testargs[sdk/ruby]}
720 }
721 do_test sdk/ruby ruby_sdk
722
723 test_cli() {
724     cd "$WORKSPACE/sdk/cli" \
725         && mkdir -p /tmp/keep \
726         && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test TESTOPTS=-v ${testargs[sdk/cli]}
727 }
728 do_test sdk/cli cli
729
730 test_login-sync() {
731     cd "$WORKSPACE/services/login-sync" \
732         && bundle exec rake test TESTOPTS=-v ${testargs[services/login-sync]}
733 }
734 do_test services/login-sync login-sync
735
736 for p in "${pythonstuff[@]}"
737 do
738     do_test "$p" pip
739 done
740 do_test services/dockercleaner pip "$VENV3DIR/bin/"
741
742 for g in "${gostuff[@]}"
743 do
744     do_test "$g" go
745 done
746
747 test_workbench() {
748     start_nginx_proxy_services \
749         && cd "$WORKSPACE/apps/workbench" \
750         && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[apps/workbench]}
751 }
752 do_test apps/workbench workbench
753
754 test_workbench_benchmark() {
755     start_nginx_proxy_services \
756         && cd "$WORKSPACE/apps/workbench" \
757         && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
758 }
759 do_test apps/workbench_benchmark workbench_benchmark
760
761 test_workbench_profile() {
762     start_nginx_proxy_services \
763         && cd "$WORKSPACE/apps/workbench" \
764         && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
765 }
766 do_test apps/workbench_profile workbench_profile
767
768 exit_cleanly