Bläddra i källkod

(refactor) Cleanup Journey Test script.

John S. Ryan 10 år sedan
förälder
incheckning
c85d0a34e2
1 ändrade filer med 153 tillägg och 143 borttagningar
  1. 153
    143
      bin/journey-test.sh

+ 153
- 143
bin/journey-test.sh Visa fil

@@ -1,79 +1,67 @@
1
-#!/bin/bash
2
-SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
3
-EXECPATH=$PWD
4
-XAPI_PID=""
5
-
6
-# Makes CI output easier to read
7
-TERM=dumb
1
+#!/usr/bin/env bash
8 2
 
9
-function on_exit() {
3
+on_exit() {
10 4
   echo ">>> on_exit()"
11
-  if [ "$XAPI_PID" != "" ] ; then
12
-    kill $XAPI_PID
13
-    echo "Stopped X-API (pid=${XAPI_PID})"
5
+  if [[ "$xapi_pid" != "" ]] ; then
6
+    kill $xapi_pid
7
+    echo "stopped x-api (pid=${xapi_pid})"
14 8
   fi
15 9
   cd $EXECPATH
16 10
   echo "<<< on_exit()"
17 11
 }
18 12
 
19
-assert_gradle_installed() {
20
-  echo ">>> assert_gradle_installed()"
21
-  which gradle >/dev/null
22
-  if [ $? != 0 ]; then
23
-    echo "Gradle not found.  This the Java build tool and is required."
24
-    echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
25
-    echo "PATH=${PATH}"
26
-    echo "aborting."
27
-    exit 1
28
-  fi
29
-  echo "<<< assert_gradle_installed()"
30
-}
13
+assert_installed() {
14
+  local binary=$1
15
+  echo ">>> assert_installed(binary=\"${binary}\")"
31 16
 
32
-assert_jq_installed() {
33
-  echo ">>> assert_jq_installed()"
34
-  which jq >/dev/null
35
-  if [ $? != 0 ]; then
36
-    echo "jq not found.  This utility is used to parse the config.json file and is required."
17
+  if [[ "`which $binary`" == "" ]]; then
18
+    echo "${binary} not found; it is required to perform this test."
37 19
     echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
38 20
     echo "PATH=${PATH}"
39 21
     echo "aborting."
40 22
     exit 1
41 23
   fi
42
-  echo "<<< assert_jq_installed()"
24
+  echo "<<< assert_installed()"
43 25
 }
44 26
 
45
-assert_required_ruby_installed() {
46
-  echo ">>> assert_required_ruby_installed(\"$1\")"
47
-  local RUBY_APP_HOME="$1"
27
+assert_ruby_installed() {
28
+  local ruby_app_home="$1"
29
+  echo ">>> assert_ruby_installed(ruby_app_home=\"${ruby_app_home}\")"
48 30
 
49
-  pushd "${RUBY_APP_HOME}" >/dev/null
50
-  local CURRENT_RUBY_VER=`ruby --version | egrep --only-matching "[0-9]+\.[0-9]+\.[0-9]+"`
51
-  local EXPECTED_RUBY_VER=`cat Gemfile | awk -F\' '/ruby /{print $2}'`
52
-  popd >/dev/null
53
-  if [ "$EXPECTED_RUBY_VER" != "" -a "$CURRENT_RUBY_VER" != "$EXPECTED_RUBY_VER" ]; then
54
-    echo "${RUBY_APP_HOME} requires Ruby ${EXPECTED_RUBY_VER}; current Ruby version is ${CURRENT_RUBY_VER}."
31
+  pushd "${ruby_app_home}"
32
+  local current_ruby_ver=`ruby --version | egrep --only-matching "[0-9]+\.[0-9]+\.[0-9]+"`
33
+  local expected_ruby_ver=`cat Gemfile | awk -F\' '/ruby /{print $2}'`
34
+  popd
35
+  if [[ "${expected_ruby_ver}" != "" && "${current_ruby_ver}" != "${expected_ruby_ver}" ]]; then
36
+    echo "${ruby_app_home} requires Ruby ${expected_ruby_ver}; current Ruby version is ${current_ruby_ver}."
55 37
     echo -e "Ruby used: `which ruby`.\n"
56 38
     echo -e "Have you completed the setup instructions at https://github.com/exercism/xjava ?\n"
57 39
     echo "PATH=${PATH}"
58 40
     echo "aborting."
59 41
     exit 1
60 42
   fi
61
-  echo "<<< assert_required_ruby_installed()"
43
+  echo "<<< assert_ruby_installed()"
62 44
 }
63 45
 
64
-clean_build() {
65
-  echo ">>> clean_build(\"$1\", \"$2\")"
66
-  local REPO_ROOT="$1"
67
-  local BUILD_DIR="$2"
46
+clean() {
47
+  local build_dir="$1"
48
+  echo ">>> clean(build_dir=\"${build_dir}\")"
49
+
50
+  # empty, absolute path, or parent reference are considered dangerous to rm -rf against.
51
+  if [[ "${build_dir}" == "" || ${build_dir} =~ ^/ || ${build_dir} =~ \.\. ]] ; then
52
+    echo "Value for build_dir looks dangerous.  Aborting."
53
+    exit 1
54
+  fi
68 55
 
69
-  if [ -d "$BUILD_DIR" ] ; then
70
-    echo "Cleaning journey script build (${BUILD_DIR})."
71
-    rm -rf "$BUILD_DIR"
56
+  local build_path=$( pwd )/${build_dir}
57
+  if [[ -d "${build_path}" ]] ; then
58
+    echo "Cleaning journey script build output directory (${build_path})."
59
+    rm -rf "${build_path}"
72 60
   fi
73
-  pushd ${REPO_ROOT}/exercises > /dev/null
61
+  cd exercises
74 62
   gradle clean
75
-  popd > /dev/null
76
-  echo "<<< clean_build()"
63
+  cd ..
64
+  echo "<<< clean()"
77 65
 }
78 66
 
79 67
 get_operating_system() {
@@ -102,158 +90,180 @@ get_cpu_architecture() {
102 90
   esac
103 91
 }
104 92
 
105
-fetch_exercism_cli() {
106
-  echo ">>> fetch_exercism_cli(\"$1\", \"$2\", \"$3\")"
107
-  local OS="$1"
108
-  local ARCH="$2"
109
-  local EXERCISM_HOME="$3"
93
+download_exercism_cli() {
94
+  local os="$1"
95
+  local arch="$2"
96
+  local exercism_home="$3"
97
+  echo ">>> download_exercism_cli(os=\"${os}\", arch=\"${arch}\", exercism_home=\"${exercism_home}\")"
98
+
99
+  local CLI_RELEASES=https://github.com/exercism/cli/releases
110 100
 
111
-  local LATEST=https://github.com/exercism/cli/releases/latest
101
+  local latest=${CLI_RELEASES}/latest
112 102
   # "curl..." :: HTTP 302 headers, including "Location" -- URL to redirect to.
113 103
   # "awk..." :: pluck last path segment from "Location" (i.e. the version number)
114
-  local VERSION="$(curl --head --silent $LATEST | awk -v FS=/ '/Location:/{print $NF}' | tr -d '\r')"
115
-  local CLI_URL=https://github.com/exercism/cli/releases/download/${VERSION}/exercism-${OS}-${ARCH}.tgz
104
+  local version="$(curl --head --silent ${latest} | awk -v FS=/ '/Location:/{print $NF}' | tr -d '\r')"
105
+  local download_url=${CLI_RELEASES}/download/${version}/exercism-${os}-${arch}.tgz
116 106
 
117
-  mkdir -p ${EXERCISM_HOME}
118
-  curl -s --location ${CLI_URL} | tar xz -C ${EXERCISM_HOME}
119
-  echo "<<< fetch_exercism_cli()"
107
+  mkdir -p ${exercism_home}
108
+  curl -s --location ${download_url} | tar xz -C ${exercism_home}
109
+  echo "<<< download_exercism_cli()"
120 110
 }
121 111
 
122
-fetch_x_api() {
123
-  echo ">>> fetch_x_api(\"$1\")"
124
-  local XAPI_HOME="$1"
112
+git_clone() {
113
+  local repo_name="$1"
114
+  local dest_path="$2"
115
+  echo ">>> git_clone(repo_name=\"${repo_name}\", dest_path=\"${dest_path}\")"
125 116
 
126
-  git clone https://github.com/exercism/x-api ${XAPI_HOME}
117
+  git clone https://github.com/exercism/${repo_name} ${dest_path}
127 118
 
128
-  echo "<<< fetch_x_api()"
119
+  echo "<<< git_clone()"
129 120
 }
130 121
 
131
-fetch_trackler() {
132
-  echo ">>> fetch_trackler(\"$1\")"
133
-  local TRACKLER_HOME="$1"
122
+make_local_trackler() {
123
+  local trackler="$1"
124
+  echo ">>> make_local_trackler(trackler=\"${trackler}\")"
134 125
 
135
-  git clone https://github.com/exercism/trackler ${TRACKLER_HOME}
136
-
137
-  echo "<<< fetch_trackler()"
138
-}
139
-
140
-build_trackler() {
141
-  echo ">>> build_trackler(\"$1\")"
142
-  local TRACKLER_HOME="$1"
143
-
144
-  pushd ${TRACKLER_HOME} >/dev/null
126
+  local xjava=$( pwd )
127
+  pushd ${trackler}
145 128
   git submodule init -- common
146 129
   git submodule update
130
+
131
+  # Bake in local copy of xjava; this is what we are testing.
147 132
   rmdir tracks/java
148 133
   mkdir -p tracks/java/exercises
149
-  cp $REPO_ROOT/config.json tracks/java
150
-  cp -r $REPO_ROOT/exercises tracks/java
134
+  cp ${xjava}/config.json tracks/java
135
+  cp -r ${xjava}/exercises tracks/java
151 136
 
152 137
   gem install bundler
153 138
   bundle install
154 139
   gem build trackler.gemspec
140
+
141
+  # Make *this* the gem that x-api uses when we build x-api.
155 142
   gem install --local trackler-*.gem
156 143
 
157 144
   popd > /dev/null
158
-  echo "<<< build_trackler()"
145
+  echo "<<< make_local_trackler()"
159 146
 }
160 147
 
161 148
 start_x_api() {
162
-  echo ">>> start_x_api(\"$1\")"
163
-  local XAPI_HOME="$1"
149
+  local xapi_home="$1"
150
+  echo ">>> start_x_api(xapi_home=\"${xapi_home}\")"
164 151
 
165
-  pushd $XAPI_HOME >/dev/null
152
+  pushd $xapi_home
166 153
 
167 154
   gem install bundler
168 155
   bundle install
169 156
   RACK_ENV=development rackup &
170
-  XAPI_PID=$!
157
+  xapi_pid=$!
171 158
   sleep 5
172 159
 
173
-  echo "X-API is running (pid=${XAPI_PID})."
160
+  echo "x-api is running (pid=${xapi_pid})."
174 161
 
175 162
   popd > /dev/null
176 163
   echo "<<< start_x_api()"
177 164
 }
178 165
 
179 166
 configure_exercism_cli() {
180
-  echo ">>> configure_exercism_cli(\"$1\", \"$2\", $3)"
181
-  local EXERCISM_HOME="$1"
182
-  local EXERCISM_CONFIGFILE="$2"
183
-  local XAPI_PORT=$3
184
-  local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
185
-
186
-  mkdir -p "${EXERCISM_HOME}"
187
-  pushd "${EXERCISM_HOME}" >/dev/null
188
-  $EXERCISM configure --dir="${EXERCISM_HOME}"
189
-  $EXERCISM configure --api http://localhost:${XAPI_PORT}
190
-  $EXERCISM debug
191
-  popd >/dev/null
167
+  local exercism_home="$1"
168
+  local exercism_configfile="$2"
169
+  local xapi_port=$3
170
+  echo ">>> configure_exercism_cli(exercism_home=\"${exercism_home}\", exercism_configfile=\"${exercism_configfile}\", xapi_port=${xapi_port})"
171
+  local exercism="./exercism --config ${exercism_configfile}"
172
+
173
+  mkdir -p "${exercism_home}"
174
+  pushd "${exercism_home}"
175
+  $exercism configure --dir="${exercism_home}"
176
+  $exercism configure --api http://localhost:${xapi_port}
177
+  $exercism debug
178
+  popd
192 179
 
193 180
   echo "<<< configure_exercism_cli()"
194 181
 }
195 182
 
196 183
 solve_all_exercises() {
197
-  echo ">>> solve_all_exercises(\"$1\", \"$2\")"
198
-
199
-  local EXERCISM_HOME="$1"
200
-  local EXERCISM_CONFIGFILE="$2"
201
-
202
-  local EXERCISM="./exercism --config ${EXERCISM_CONFIGFILE}"
203
-  local EXERCISES=`cat config.json | jq '.problems []' --raw-output`
204
-  local TOTAL_EXERCISES=`cat config.json | jq '.problems | length'`
205
-  local CURRENT_EXERCISE_NUMBER=1
206
-  local TEMPFILE="${TMPDIR:-/tmp}/journey-test.sh-unignore_all_tests.txt"
207
-
208
-  pushd ${EXERCISM_HOME} >/dev/null
209
-  for EXERCISE in $EXERCISES; do
210
-    echo ''
211
-    echo '****' Testing $EXERCISE '('$CURRENT_EXERCISE_NUMBER / $TOTAL_EXERCISES') ****'
212
-    echo ''
213
-    $EXERCISM fetch java $EXERCISE
214
-    cp -R -H $REPO_ROOT/exercises/$EXERCISE/src/example/java/* $EXERCISM_HOME/java/$EXERCISE/src/main/java/
215
-    pushd $EXERCISM_HOME/java/$EXERCISE/ >/dev/null
216
-    for TESTFILE in `find . -name "*Test.java"`; do
217
-      sed 's/@Ignore//' $TESTFILE > "$TEMPFILE" && mv "$TEMPFILE" "$TESTFILE"
184
+  local exercism_exercises_dir="$1"
185
+  local exercism_configfile="$2"
186
+  echo ">>> solve_all_exercises(exercism_exercises_dir=\"${exercism_exercises_dir}\", exercism_configfile=\"${exercism_configfile}\")"
187
+
188
+  local xjava=$( pwd )
189
+  local exercism_cli="./exercism --config ${exercism_configfile}"
190
+  local exercises=`cat config.json | jq '.problems []' --raw-output`
191
+  local total_exercises=`cat config.json | jq '.problems | length'`
192
+  local current_exercise_number=1
193
+  local tempfile="${TMPDIR:-/tmp}/journey-test.sh-unignore_all_tests.txt"
194
+
195
+  pushd ${exercism_exercises_dir}
196
+  for exercise in $exercises; do
197
+    echo -e "\n\n"
198
+    echo "=================================================="
199
+    echo "${current_exercise_number} of ${total_exercises} -- ${exercise}"
200
+    echo "=================================================="
201
+
202
+    ${exercism_cli} fetch java $exercise
203
+    cp -R -H ${xjava}/exercises/${exercise}/src/example/java/* ${exercism_exercises_dir}/java/${exercise}/src/main/java/
204
+
205
+    pushd ${exercism_exercises_dir}/java/${exercise}
206
+    # Ensure we run all the tests (as delivered, all but the first is @Ignore'd)
207
+    for testfile in `find . -name "*Test.java"`; do
208
+      sed 's/@Ignore//' ${testfile} > "${tempfile}" && mv "${tempfile}" "${testfile}"
218 209
     done
219 210
     gradle test
220
-    popd >/dev/null
211
+    popd
221 212
 
222
-    CURRENT_EXERCISE_NUMBER=$((CURRENT_EXERCISE_NUMBER + 1))
213
+    current_exercise_number=$((current_exercise_number + 1))
223 214
   done
224
-  popd >/dev/null
215
+  popd
225 216
 }
226 217
 
227 218
 main() {
228
-  # allow all functions to assume current working directory is repository root.
219
+  # all functions assume current working directory is repository root.
229 220
   cd "${SCRIPTPATH}/.."
230 221
 
231
-  local REPO_ROOT="${PWD}"
232
-  local BUILD_DIR="${REPO_ROOT}/build"
233
-  local XAPI_HOME="${BUILD_DIR}/x-api"
234
-  local TRACKLER_HOME="${BUILD_DIR}/trackler"
235
-  local EXERCISM_HOME="${BUILD_DIR}/exercism"
236
-  local EXERCISM_CONFIGFILE=".journey-test.exercism.json"
237
-  local XAPI_PORT=9292
238
-
239
-  assert_gradle_installed
240
-  assert_jq_installed
241
-  clean_build "${REPO_ROOT}" "${BUILD_DIR}"
242
-  fetch_exercism_cli $(get_operating_system) $(get_cpu_architecture) "${EXERCISM_HOME}"
243
-  fetch_x_api "${XAPI_HOME}"
244
-  fetch_trackler "${TRACKLER_HOME}"
245
-  assert_required_ruby_installed "${XAPI_HOME}"
246
-  assert_required_ruby_installed "${TRACKLER_HOME}"
247
-  build_trackler "${TRACKLER_HOME}"
248
-  start_x_api "${XAPI_HOME}"
249
-  configure_exercism_cli "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}" "${XAPI_PORT}"
250
-  solve_all_exercises "${EXERCISM_HOME}" "${EXERCISM_CONFIGFILE}"
222
+  local xjava=$( pwd )
223
+  local build_dir="build"
224
+  local build_path="${xjava}/${build_dir}"
225
+
226
+  local xapi_home="${build_path}/x-api"
227
+  local trackler_home="${build_path}/trackler"
228
+  local exercism_home="${build_path}/exercism"
229
+
230
+  local exercism_configfile=".journey-test.exercism.json"
231
+  local xapi_port=9292
232
+
233
+  # fail fast if required binaries are not installed.
234
+  assert_installed "gradle"
235
+  assert_installed "jq"
236
+
237
+  clean "${build_dir}"
238
+
239
+  # Make a version of trackler that includes the source from this repo.
240
+  git_clone "trackler" "${trackler_home}"
241
+  assert_ruby_installed "${trackler_home}"
242
+  make_local_trackler "${trackler_home}"
243
+
244
+  # Stand-up a local instance of x-api so we can fetch the exercises through it.
245
+  git_clone "x-api" "${xapi_home}"
246
+  assert_ruby_installed "${xapi_home}"
247
+  start_x_api "${xapi_home}"
248
+
249
+  # Create a CLI install and config just for this build; this script does not use your CLI install.
250
+  download_exercism_cli $(get_operating_system) $(get_cpu_architecture) "${exercism_home}"
251
+  configure_exercism_cli "${exercism_home}" "${exercism_configfile}" "${xapi_port}"
252
+
253
+  solve_all_exercises "${exercism_home}" "${exercism_configfile}"
251 254
 }
252 255
 
253 256
 ##########################################################################
254 257
 # Execution begins here...
255 258
 
259
+# If any command fails, fail the script.
256 260
 set -e
261
+SCRIPTPATH=$( pushd `dirname $0` > /dev/null && pwd && popd > /dev/null )
262
+EXECPATH=$( pwd )
263
+# Make output easier to read in CI
264
+TERM=dumb
265
+
266
+xapi_pid=""
257 267
 trap on_exit EXIT
258 268
 main
259 269