OLD | NEW |
1 #!/bin/bash | 1 #!/bin/bash |
2 | 2 |
3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. | 3 # Copyright (c) 2009 The Chromium OS Authors. All rights reserved. |
4 # Use of this source code is governed by a BSD-style license that can be | 4 # Use of this source code is governed by a BSD-style license that can be |
5 # found in the LICENSE file. | 5 # found in the LICENSE file. |
6 | 6 |
7 # Script to run client or server tests on a live remote image. | 7 # Script to run client or server tests on a live remote image. |
8 | 8 |
9 # Load common constants. This should be the first executable line. | 9 # Load common constants. This should be the first executable line. |
10 # The path to common.sh should be relative to your script's location. | 10 # The path to common.sh should be relative to your script's location. |
11 | 11 |
12 . "$(dirname $0)/common.sh" | 12 . "$(dirname $0)/common.sh" |
13 . "$(dirname $0)/autotest_lib.sh" | 13 . "$(dirname $0)/autotest_lib.sh" |
14 . "$(dirname $0)/remote_access.sh" | 14 . "$(dirname $0)/remote_access.sh" |
15 | 15 |
16 DEFAULT_OUTPUT_FILE=test-output-$(date '+%Y%m%d.%H%M%S') | |
17 | |
18 DEFINE_string build_desc "" "Build description used in database" | |
19 DEFINE_string chroot "${DEFAULT_CHROOT_DIR}" "alternate chroot location" c | 16 DEFINE_string chroot "${DEFAULT_CHROOT_DIR}" "alternate chroot location" c |
20 DEFINE_boolean cleanup ${FLAGS_FALSE} "Clean up temp directory" | 17 DEFINE_boolean cleanup ${FLAGS_FALSE} "Clean up temp directory" |
21 DEFINE_integer iterations 1 "Iterations to run every top level test" i | 18 DEFINE_integer iterations 1 "Iterations to run every top level test" i |
22 DEFINE_string machine_desc "" "Machine description used in database" | |
23 DEFINE_string output_file "${DEFAULT_OUTPUT_FILE}" "Test run output" o | |
24 DEFINE_string prepackaged_autotest "" "Use this prepackaged autotest dir" | 19 DEFINE_string prepackaged_autotest "" "Use this prepackaged autotest dir" |
25 DEFINE_string results_dir_root "" "alternate root results directory" | 20 DEFINE_string results_dir_root "" "alternate root results directory" |
26 DEFINE_boolean update_db ${FLAGS_FALSE} "Put results in autotest database" u | |
27 DEFINE_boolean verbose ${FLAGS_FALSE} "Show verbose autoserv output" v | 21 DEFINE_boolean verbose ${FLAGS_FALSE} "Show verbose autoserv output" v |
28 | 22 |
| 23 # Check if our stdout is a tty |
| 24 function is_a_tty() { |
| 25 local stdout=$(readlink /proc/$$/fd/1) |
| 26 [[ "${stdout#/dev/tty}" != "${stdout}" ]] && return 0 |
| 27 [[ "${stdout#/dev/pts}" != "${stdout}" ]] && return 0 |
| 28 return 1 |
| 29 } |
| 30 |
| 31 # Writes out text in specified color if stdout is a tty |
| 32 # Arguments: |
| 33 # $1 - color |
| 34 # $2 - text to color |
| 35 # $3 - text following colored text (default colored) |
| 36 # Returns: |
| 37 # None |
| 38 function echo_color() { |
| 39 local color=0 |
| 40 [[ "$1" == "red" ]] && color=31 |
| 41 [[ "$1" == "green" ]] && color=32 |
| 42 [[ "$1" == "yellow" ]] && color=33 |
| 43 if is_a_tty; then |
| 44 echo -e "\033[1;${color}m$2\033[0m$3" |
| 45 else |
| 46 echo "$2$3" |
| 47 fi |
| 48 } |
| 49 |
29 function cleanup() { | 50 function cleanup() { |
30 if [[ $FLAGS_cleanup -eq ${FLAGS_TRUE} ]]; then | 51 if [[ $FLAGS_cleanup -eq ${FLAGS_TRUE} ]]; then |
31 rm -rf "${TMP}" | 52 rm -rf "${TMP}" |
32 else | 53 else |
33 echo "Left temporary files at ${TMP}" | 54 echo ">>> Details stored under ${TMP}" |
34 fi | 55 fi |
35 cleanup_remote_access | 56 cleanup_remote_access |
36 } | 57 } |
37 | 58 |
38 # Returns an error if the test_result_file has text which indicates | 59 # Returns an error if the test_result_file has text which indicates |
39 # the test was not run successfully. | 60 # the test was not run successfully. |
40 # Arguments: | 61 # Arguments: |
41 # $1 - file name of autotest status for to check for success | 62 # $1 - file name of autotest status for to check for success |
42 # Returns: | 63 # Returns: |
43 # None | 64 # None |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
92 remote_sh grep CHROMEOS_RELEASE_BOARD /etc/lsb-release | 113 remote_sh grep CHROMEOS_RELEASE_BOARD /etc/lsb-release |
93 FLAGS_board=$(echo "${REMOTE_OUT}" | cut -d= -f2) | 114 FLAGS_board=$(echo "${REMOTE_OUT}" | cut -d= -f2) |
94 if [[ -z "${FLAGS_board}" ]]; then | 115 if [[ -z "${FLAGS_board}" ]]; then |
95 check_board | 116 check_board |
96 fi | 117 fi |
97 echo "Target reports board is ${FLAGS_board}" | 118 echo "Target reports board is ${FLAGS_board}" |
98 } | 119 } |
99 | 120 |
100 | 121 |
101 function main() { | 122 function main() { |
102 assert_outside_chroot | |
103 | |
104 cd $(dirname "$0") | 123 cd $(dirname "$0") |
105 | 124 |
106 FLAGS "$@" || exit 1 | 125 FLAGS "$@" || exit 1 |
107 | 126 |
108 if [[ -z "${FLAGS_ARGV}" ]]; then | 127 if [[ -z "${FLAGS_ARGV}" ]]; then |
109 echo "Please specify tests to run, like:" | 128 echo "Please specify tests to run. For example:" |
110 echo " $0 --remote=MyMachine SystemBootPerf" | 129 echo " $0 --remote=MyMachine BootPerfServer" |
111 exit 1 | 130 exit 1 |
112 fi | 131 fi |
113 | 132 |
114 set -e | 133 set -e |
115 | 134 |
116 # Set global TMP for remote_access.sh's sake | 135 # Set global TMP for remote_access.sh's sake |
117 TMP=$(mktemp -d /tmp/run_remote_tests.XXXX) | 136 TMP=$(mktemp -d /tmp/run_remote_tests.XXXX) |
118 | 137 |
119 rm -f "${FLAGS_output_file}" | |
120 | |
121 trap cleanup EXIT | 138 trap cleanup EXIT |
122 | 139 |
123 remote_access_init | 140 remote_access_init |
124 | 141 |
125 local autotest_dir="" | 142 local autotest_dir="" |
126 if [[ -z "${FLAGS_prepackaged_autotest}" ]]; then | 143 if [[ -z "${FLAGS_prepackaged_autotest}" ]]; then |
127 learn_board | 144 learn_board |
128 # Always copy into installed autotest directory. This way if a user | 145 # Always copy into installed autotest directory. This way if a user |
129 # is just modifying scripts, they take effect without having to wait | 146 # is just modifying scripts, they take effect without having to wait |
130 # for the laborious build_autotest.sh command. | 147 # for the laborious build_autotest.sh command. |
131 local original="${GCLIENT_ROOT}/src/third_party/autotest/files" | 148 local original="${GCLIENT_ROOT}/src/third_party/autotest/files" |
132 autotest_dir="${FLAGS_chroot}/build/${FLAGS_board}/usr/local/autotest" | 149 autotest_dir="/build/${FLAGS_board}/usr/local/autotest" |
| 150 if [[ ${INSIDE_CHROOT} -eq 0 ]]; then |
| 151 autotest_dir="${FLAGS_chroot}/${autotest_dir}" |
| 152 fi |
133 update_chroot_autotest "${original}" "${autotest_dir}" | 153 update_chroot_autotest "${original}" "${autotest_dir}" |
134 else | 154 else |
135 autotest_dir="${FLAGS_prepackaged_autotest}" | 155 autotest_dir="${FLAGS_prepackaged_autotest}" |
136 fi | 156 fi |
137 | 157 |
138 local parse_cmd="${autotest_dir}/tko/parse.py" | |
139 | |
140 if [[ ${FLAGS_update_db} -eq ${FLAGS_TRUE} && ! -x "${parse_cmd}" ]]; then | |
141 echo "Cannot find parser ${parse_cmd}" | |
142 exit 1 | |
143 fi | |
144 | |
145 local autoserv="${autotest_dir}/server/autoserv" | 158 local autoserv="${autotest_dir}/server/autoserv" |
146 | 159 |
147 local control_files_to_run="" | 160 local control_files_to_run="" |
148 | 161 |
149 # Now search for tests which unambiguously include the given identifier | 162 # Now search for tests which unambiguously include the given identifier |
150 local search_path=$(echo ${autotest_dir}/{client,server}/{tests,site_tests}) | 163 local search_path=$(echo ${autotest_dir}/{client,server}/{tests,site_tests}) |
151 for test_request in $FLAGS_ARGV; do | 164 for test_request in $FLAGS_ARGV; do |
152 test_request=$(remove_quotes "${test_request}") | 165 test_request=$(remove_quotes "${test_request}") |
153 ! finds=$(find ${search_path} -maxdepth 2 -type f -name control\* | \ | 166 ! finds=$(find ${search_path} -maxdepth 2 -type f -name control\* | \ |
154 egrep "${test_request}") | 167 egrep "${test_request}") |
155 if [[ -z "${finds}" ]]; then | 168 if [[ -z "${finds}" ]]; then |
156 echo "Can not find match for ${test_request}" | 169 echo_color "red" ">>> Cannot find match for \"${test_request}\"" |
| 170 FLAGS_cleanup=${FLAGS_TRUE} |
157 exit 1 | 171 exit 1 |
158 fi | 172 fi |
159 local matches=$(echo "${finds}" | wc -l) | 173 local matches=$(echo "${finds}" | wc -l) |
160 if [[ ${matches} -gt 1 ]]; then | 174 if [[ ${matches} -gt 1 ]]; then |
161 echo "${test_request} is ambiguous:" | 175 echo "" |
162 echo "${finds}" | 176 echo_color "red" \ |
| 177 ">>> \"${test_request}\" is ambiguous. These control file paths match:" |
| 178 for FIND in ${finds}; do |
| 179 echo_color "red" " * " "${FIND}" |
| 180 done |
| 181 echo "" |
| 182 echo ">>> Disambiguate by copy-and-pasting the whole path above" \ |
| 183 "instead of passing \"${test_request}\"." |
| 184 FLAGS_cleanup=${FLAGS_TRUE} |
163 exit 1 | 185 exit 1 |
164 fi | 186 fi |
165 for i in $(seq 1 $FLAGS_iterations); do | 187 for i in $(seq 1 $FLAGS_iterations); do |
166 control_files_to_run="${control_files_to_run} '${finds}'" | 188 control_files_to_run="${control_files_to_run} '${finds}'" |
167 done | 189 done |
168 done | 190 done |
169 | 191 |
170 echo "Running the following control files: ${control_files_to_run}" | 192 echo "" |
171 | 193 echo_color "yellow" ">>> Running the following control files:" |
172 # Set the default machine description to the machine's IP | 194 for CONTROL_FILE in ${control_files_to_run}; do |
173 if [[ -z "${FLAGS_machine_desc}" ]]; then | 195 echo_color "yellow" " * " "${CONTROL_FILE}" |
174 FLAGS_machine_desc="${FLAGS_remote}" | 196 done |
175 fi | |
176 | 197 |
177 if [[ -z "${FLAGS_results_dir_root}" ]]; then | 198 if [[ -z "${FLAGS_results_dir_root}" ]]; then |
178 FLAGS_results_dir_root="${TMP}" | 199 FLAGS_results_dir_root="${TMP}" |
179 fi | 200 fi |
180 | 201 |
181 mkdir -p "${FLAGS_results_dir_root}" | 202 mkdir -p "${FLAGS_results_dir_root}" |
182 | 203 |
183 for control_file in ${control_files_to_run}; do | 204 for control_file in ${control_files_to_run}; do |
184 # Assume a line starts with TEST_TYPE = | 205 # Assume a line starts with TEST_TYPE = |
185 control_file=$(remove_quotes "${control_file}") | 206 control_file=$(remove_quotes "${control_file}") |
186 local type=$(egrep '^\s*TEST_TYPE\s*=' "${control_file}" | head -1) | 207 local type=$(egrep '^[[:space:]]*TEST_TYPE[[:space:]]*=' "${control_file}" \ |
| 208 | head -1) |
| 209 if [[ -z "${type}" ]]; then |
| 210 echo_color "red" ">>> Unable to find TEST_TYPE line in ${control_file}" |
| 211 exit 1 |
| 212 fi |
187 type=$(python -c "${type}; print TEST_TYPE.lower()") | 213 type=$(python -c "${type}; print TEST_TYPE.lower()") |
188 local option | 214 local option |
189 if [ "${type}" == "client" ]; then | 215 if [ "${type}" == "client" ]; then |
190 option="-c" | 216 option="-c" |
191 elif [ "${type}" == "server" ]; then | 217 elif [ "${type}" == "server" ]; then |
192 option="-s" | 218 option="-s" |
193 else | 219 else |
194 echo "Unknown type of test (${type}) in ${control_file}" | 220 echo_color "red" ">>> Unknown type of test (${type}) in ${control_file}" |
195 exit 1 | 221 exit 1 |
196 fi | 222 fi |
197 echo "Running ${type} test ${control_file}" | 223 echo "" |
| 224 echo_color "yellow" ">>> Running ${type} test " ${control_file} |
198 local short_name=$(basename $(dirname "${control_file}")) | 225 local short_name=$(basename $(dirname "${control_file}")) |
199 local start_time=$(date '+%s') | 226 local results_dir_name="${short_name}" |
200 local results_dir_name="${short_name},${FLAGS_machine_desc},${start_time}" | |
201 local results_dir="${FLAGS_results_dir_root}/${results_dir_name}" | 227 local results_dir="${FLAGS_results_dir_root}/${results_dir_name}" |
202 rm -rf "${results_dir}" | 228 rm -rf "${results_dir}" |
203 local verbose="" | 229 local verbose="" |
204 if [[ ${FLAGS_verbose} -eq $FLAGS_TRUE ]]; then | 230 if [[ ${FLAGS_verbose} -eq $FLAGS_TRUE ]]; then |
205 verbose="--verbose" | 231 verbose="--verbose" |
206 fi | 232 fi |
207 | 233 |
208 ${autoserv} -m "${FLAGS_remote}" "${option}" "${control_file}" \ | 234 ${autoserv} -m "${FLAGS_remote}" "${option}" "${control_file}" \ |
209 -r "${results_dir}" ${verbose} | 235 -r "${results_dir}" ${verbose} |
210 local test_status="${results_dir}/status.log" | 236 local test_status="${results_dir}/status.log" |
211 local test_result_dir="${results_dir}/${short_name}" | 237 local test_result_dir="${results_dir}/${short_name}" |
212 local keyval_file="${test_result_dir}/results/keyval" | 238 local keyval_file="${test_result_dir}/results/keyval" |
| 239 echo "" |
213 if is_successful_test "${test_status}"; then | 240 if is_successful_test "${test_status}"; then |
214 echo "${control_file} succeeded." | tee -a "${FLAGS_output_file}" | 241 echo_color "green" ">>> SUCCESS: ${control_file}" |
215 if [[ -f "${keyval_file}" ]]; then | 242 if [[ -f "${keyval_file}" ]]; then |
216 echo "Keyval was:" | tee -a "${FLAGS_output_file}" | 243 echo ">>> Keyval was:" |
217 cat "${keyval_file}" | tee -a "${FLAGS_output_file}" | 244 cat "${keyval_file}" |
218 fi | 245 fi |
219 else | 246 else |
220 echo "${control_file} failed:" | tee -a "${FLAGS_output_file}" | 247 echo_color "red" ">>> FAILED: ${control_file}" |
221 cat "${test_status}" | tee -a "${FLAGS_output_file}" | 248 cat "${test_status}" |
222 # Leave around output directory if the test failed. | |
223 FLAGS_cleanup=${FLAGS_FALSE} | |
224 fi | 249 fi |
225 local end_time=$(date '+%s') | 250 local end_time=$(date '+%s') |
226 | |
227 # Update the database with results. | |
228 if [[ ${FLAGS_update_db} -eq ${FLAGS_TRUE} ]]; then | |
229 add_test_attribute "${results_dir}" machine-desc "${FLAGS_machine_desc}" | |
230 add_test_attribute "${results_dir}" build-desc "${FLAGS_build_desc}" | |
231 add_test_attribute "${results_dir}" server-start-time "${start_time}" | |
232 add_test_attribute "${results_dir}" server-end-time "${end_time}" | |
233 if ! "${parse_cmd}" -o "${results_dir}"; then | |
234 echo "Parse failed." | tee -a "${FLAGS_output_file}" | |
235 FLAGS_cleanup=${FLAGS_FALSE} | |
236 fi | |
237 fi | |
238 done | 251 done |
239 | |
240 echo "Output stored to ${FLAGS_output_file}" | |
241 } | 252 } |
242 | 253 |
243 main $@ | 254 main $@ |
OLD | NEW |