6263: Generate Go coverage reports in $WORKSPACE/tmp/coverage-*
[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     unset result
462     if [[ -z "${skip[$1]}" ]] && ( [[ -z "$only" ]] || [[ "$only" == "$1" ]] )
463     then
464         title "Running $1 tests"
465         timer_reset
466         if [[ "$2" == "go" ]]
467         then
468             covername="coverage-$(echo "$1" | sed -e 's/\//_/g')"
469             coverflags=("-covermode=count" "-coverprofile=$WORKSPACE/tmp/.$covername.tmp")
470             if [[ -n "${testargs[$1]}" ]]
471             then
472                 # "go test -check.vv giturl" doesn't work, but this
473                 # does:
474                 cd "$WORKSPACE/$1" && go test ${coverflags[@]} ${testargs[$1]}
475             else
476                 # The above form gets verbose even when testargs is
477                 # empty, so use this form in such cases:
478                 go test ${coverflags[@]} "git.curoverse.com/arvados.git/$1"
479             fi
480             result="$?"
481             go tool cover -html="$WORKSPACE/tmp/.$covername.tmp" -o "$WORKSPACE/tmp/$covername.html"
482             rm "$WORKSPACE/tmp/.$covername.tmp"
483         elif [[ "$2" == "pip" ]]
484         then
485             # $3 can name a path directory for us to use, including trailing
486             # slash; e.g., the bin/ subdirectory of a virtualenv.
487             cd "$WORKSPACE/$1" \
488                 && "${3}python" setup.py test ${testargs[$1]}
489         elif [[ "$2" != "" ]]
490         then
491             "test_$2"
492         else
493             "test_$1"
494         fi
495         result=${result:-$?}
496         checkexit $result "$1 tests"
497         title "End of $1 tests (`timer`)"
498         return $result
499     else
500         title "Skipping $1 tests"
501     fi
502 }
503
504 do_install() {
505     if [[ -z "$skip_install" || (-n "$only_install" && "$only_install" == "$1") ]]
506     then
507         title "Running $1 install"
508         timer_reset
509         if [[ "$2" == "go" ]]
510         then
511             go get -t "git.curoverse.com/arvados.git/$1"
512         elif [[ "$2" == "pip" ]]
513         then
514             # $3 can name a path directory for us to use, including trailing
515             # slash; e.g., the bin/ subdirectory of a virtualenv.
516
517             # Need to change to a different directory after creating
518             # the source dist package to avoid a pip bug.
519             # see https://arvados.org/issues/5766 for details.
520
521             # Also need to install twice, because if it believes the package is
522             # already installed, pip it won't install it.  So the first "pip
523             # install" ensures that the dependencies are met, the second "pip
524             # install" ensures that we've actually installed the local package
525             # we just built.
526             cd "$WORKSPACE/$1" \
527                 && "${3}python" setup.py sdist rotate --keep=1 --match .tar.gz \
528                 && cd "$WORKSPACE" \
529                 && "${3}pip" install --quiet "$WORKSPACE/$1/dist"/*.tar.gz \
530                 && "${3}pip" install --quiet --no-deps --ignore-installed "$WORKSPACE/$1/dist"/*.tar.gz
531         elif [[ "$2" != "" ]]
532         then
533             "install_$2"
534         else
535             "install_$1"
536         fi
537         checkexit $? "$1 install"
538         title "End of $1 install (`timer`)"
539     else
540         title "Skipping $1 install"
541     fi
542 }
543
544 title () {
545     txt="********** $1 **********"
546     printf "\n%*s%s\n\n" $((($COLUMNS-${#txt})/2)) "" "$txt"
547 }
548
549 bundle_install_trylocal() {
550     (
551         set -e
552         echo "(Running bundle install --local. 'could not find package' messages are OK.)"
553         if ! bundle install --local --no-deployment; then
554             echo "(Running bundle install again, without --local.)"
555             bundle install --no-deployment
556         fi
557         bundle package --all
558     )
559 }
560
561 install_doc() {
562     cd "$WORKSPACE/doc" \
563         && bundle_install_trylocal \
564         && rm -rf .site
565 }
566 do_install doc
567
568 install_gem() {
569     gemname=$1
570     srcpath=$2
571     with_test_gemset gem_uninstall_if_exists "$gemname" \
572         && cd "$WORKSPACE/$srcpath" \
573         && bundle_install_trylocal \
574         && gem build "$gemname.gemspec" \
575         && with_test_gemset gem install --no-ri --no-rdoc $(ls -t "$gemname"-*.gem|head -n1)
576 }
577
578 install_ruby_sdk() {
579     install_gem arvados sdk/ruby
580 }
581 do_install sdk/ruby ruby_sdk
582
583 install_perl_sdk() {
584     cd "$WORKSPACE/sdk/perl" \
585         && perl Makefile.PL INSTALL_BASE="$PERLINSTALLBASE" \
586         && make install INSTALLDIRS=perl
587 }
588 do_install sdk/perl perl_sdk
589
590 install_cli() {
591     install_gem arvados-cli sdk/cli
592 }
593 do_install sdk/cli cli
594
595 install_login-sync() {
596     install_gem arvados-login-sync services/login-sync
597 }
598 do_install services/login-sync login-sync
599
600 # Install the Python SDK early. Various other test suites (like
601 # keepproxy) bring up run_test_server.py, which imports the arvados
602 # module. We can't actually *test* the Python SDK yet though, because
603 # its own test suite brings up some of those other programs (like
604 # keepproxy).
605 declare -a pythonstuff
606 pythonstuff=(
607     sdk/pam
608     sdk/python
609     services/fuse
610     services/nodemanager
611     )
612 for p in "${pythonstuff[@]}"
613 do
614     do_install "$p" pip
615 done
616 if [ -n "$PYTHON3" ]; then
617     do_install services/dockercleaner pip "$VENV3DIR/bin/"
618 fi
619
620 install_apiserver() {
621     cd "$WORKSPACE/services/api" \
622         && RAILS_ENV=test bundle_install_trylocal
623
624     rm -f config/environments/test.rb
625     cp config/environments/test.rb.example config/environments/test.rb
626
627     if [ -n "$CONFIGSRC" ]
628     then
629         for f in database.yml application.yml
630         do
631             cp "$CONFIGSRC/$f" config/ || fatal "$f"
632         done
633     fi
634
635     # Fill in a random secret_token and blob_signing_key for testing
636     SECRET_TOKEN=`echo 'puts rand(2**512).to_s(36)' |ruby`
637     BLOB_SIGNING_KEY=`echo 'puts rand(2**512).to_s(36)' |ruby`
638
639     sed -i'' -e "s:SECRET_TOKEN:$SECRET_TOKEN:" config/application.yml
640     sed -i'' -e "s:BLOB_SIGNING_KEY:$BLOB_SIGNING_KEY:" config/application.yml
641
642     # Set up empty git repo (for git tests)
643     GITDIR=$(mktemp -d)
644     sed -i'' -e "s:/var/cache/git:$GITDIR:" config/application.default.yml
645
646     rm -rf $GITDIR
647     mkdir -p $GITDIR/test
648     cd $GITDIR/test \
649         && git init \
650         && git config user.email "jenkins@ci.curoverse.com" \
651         && git config user.name "Jenkins, CI" \
652         && touch tmp \
653         && git add tmp \
654         && git commit -m 'initial commit'
655
656     # Clear out any lingering postgresql connections to the test
657     # database, so that we can drop it. This assumes the current user
658     # is a postgresql superuser.
659     cd "$WORKSPACE/services/api" \
660         && test_database=$(python -c "import yaml; print yaml.load(file('config/database.yml'))['test']['database']") \
661         && 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
662
663     cd "$WORKSPACE/services/api" \
664         && RAILS_ENV=test bundle exec rake db:drop \
665         && RAILS_ENV=test bundle exec rake db:setup \
666         && RAILS_ENV=test bundle exec rake db:fixtures:load
667 }
668 do_install services/api apiserver
669
670 declare -a gostuff
671 gostuff=(
672     services/arv-git-httpd
673     services/crunchstat
674     services/keepstore
675     services/keepproxy
676     services/datamanager/summary
677     services/datamanager/collection
678     sdk/go/arvadosclient
679     sdk/go/keepclient
680     sdk/go/streamer
681     )
682 for g in "${gostuff[@]}"
683 do
684     do_install "$g" go
685 done
686
687 install_workbench() {
688     cd "$WORKSPACE/apps/workbench" \
689         && mkdir -p tmp/cache \
690         && RAILS_ENV=test bundle_install_trylocal
691 }
692 do_install apps/workbench workbench
693
694 test_doclinkchecker() {
695     (
696         set -e
697         cd "$WORKSPACE/doc"
698         ARVADOS_API_HOST=qr1hi.arvadosapi.com
699         # Make sure python-epydoc is installed or the next line won't
700         # do much good!
701         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
702     )
703 }
704 do_test doc doclinkchecker
705
706 stop_services
707
708 test_apiserver() {
709     cd "$WORKSPACE/services/api" \
710         && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[services/api]}
711 }
712 do_test services/api apiserver
713
714 # Shortcut for when we're only running apiserver tests. This saves a bit of time,
715 # because we don't need to start up the api server for subsequent tests.
716 if [ ! -z "$only" ] && [ "$only" == "services/api" ]; then
717   rotate_logfile "$WORKSPACE/services/api/log/" "test.log"
718   exit_cleanly
719 fi
720
721 start_api
722
723 test_ruby_sdk() {
724     cd "$WORKSPACE/sdk/ruby" \
725         && bundle exec rake test TESTOPTS=-v ${testargs[sdk/ruby]}
726 }
727 do_test sdk/ruby ruby_sdk
728
729 test_cli() {
730     cd "$WORKSPACE/sdk/cli" \
731         && mkdir -p /tmp/keep \
732         && KEEP_LOCAL_STORE=/tmp/keep bundle exec rake test TESTOPTS=-v ${testargs[sdk/cli]}
733 }
734 do_test sdk/cli cli
735
736 test_login-sync() {
737     cd "$WORKSPACE/services/login-sync" \
738         && bundle exec rake test TESTOPTS=-v ${testargs[services/login-sync]}
739 }
740 do_test services/login-sync login-sync
741
742 for p in "${pythonstuff[@]}"
743 do
744     do_test "$p" pip
745 done
746 do_test services/dockercleaner pip "$VENV3DIR/bin/"
747
748 for g in "${gostuff[@]}"
749 do
750     do_test "$g" go
751 done
752
753 test_workbench() {
754     start_nginx_proxy_services \
755         && cd "$WORKSPACE/apps/workbench" \
756         && RAILS_ENV=test bundle exec rake test TESTOPTS=-v ${testargs[apps/workbench]}
757 }
758 do_test apps/workbench workbench
759
760 test_workbench_benchmark() {
761     start_nginx_proxy_services \
762         && cd "$WORKSPACE/apps/workbench" \
763         && RAILS_ENV=test bundle exec rake test:benchmark ${testargs[apps/workbench_benchmark]}
764 }
765 do_test apps/workbench_benchmark workbench_benchmark
766
767 test_workbench_profile() {
768     start_nginx_proxy_services \
769         && cd "$WORKSPACE/apps/workbench" \
770         && RAILS_ENV=test bundle exec rake test:profile ${testargs[apps/workbench_profile]}
771 }
772 do_test apps/workbench_profile workbench_profile
773
774 exit_cleanly