| Index: src/scripts/run_remote_tests.sh
|
| diff --git a/src/scripts/run_remote_tests.sh b/src/scripts/run_remote_tests.sh
|
| new file mode 100755
|
| index 0000000000000000000000000000000000000000..62e873b407244f375656106837d12f691899f3ea
|
| --- /dev/null
|
| +++ b/src/scripts/run_remote_tests.sh
|
| @@ -0,0 +1,178 @@
|
| +#!/bin/bash
|
| +
|
| +# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
|
| +# Use of this source code is governed by a BSD-style license that can be
|
| +# found in the LICENSE file.
|
| +
|
| +# Script to run client or server tests on a live remote image.
|
| +
|
| +# Load common constants. This should be the first executable line.
|
| +# The path to common.sh should be relative to your script's location.
|
| +
|
| +. "$(dirname $0)/common.sh"
|
| +. "$(dirname $0)/remote_access.sh"
|
| +
|
| +DEFAULT_OUTPUT_FILE=test-output-$(date '+%Y%m%d.%H%M%S')
|
| +
|
| +DEFINE_boolean cleanup ${FLAGS_TRUE} "Clean up temp directory"
|
| +DEFINE_integer iterations 1 "Iterations to run every top level test" i
|
| +DEFINE_string output_file "${DEFAULT_OUTPUT_FILE}" "Test run output" o
|
| +DEFINE_boolean verbose ${FLAGS_FALSE} "Show verbose autoserv output" v
|
| +DEFINE_boolean update_db ${FLAGS_FALSE} "Put results in autotest database" u
|
| +DEFINE_string machine_desc "" "Machine description used in database"
|
| +
|
| +function cleanup() {
|
| + if [[ $FLAGS_cleanup -eq ${FLAGS_TRUE} ]]; then
|
| + rm -rf "${TMP}"
|
| + else
|
| + echo "Left temporary files at ${TMP}"
|
| + fi
|
| +}
|
| +
|
| +# Returns an error if the test_result_file has text which indicates
|
| +# the test was not run successfully.
|
| +# Arguments:
|
| +# $1 - file name of autotest status for to check for success
|
| +# Returns:
|
| +# None
|
| +function is_successful_test() {
|
| + local file="$1"
|
| + # To be successful, must not have FAIL or BAD in the file.
|
| + if egrep -q "(BAD|FAIL)" "${file}"; then
|
| + return 1
|
| + fi
|
| + # To be successful, must have GOOD in the file.
|
| + if ! grep -q GOOD "${file}"; then
|
| + return 1
|
| + fi
|
| + return 0
|
| +}
|
| +
|
| +# Removes single quotes around parameter
|
| +# Arguments:
|
| +# $1 - string which optionally has surrounding quotes
|
| +# Returns:
|
| +# None, but prints the string without quotes.
|
| +function remove_quotes() {
|
| + echo "$1" | sed -e "s/^'//; s/'$//"
|
| +}
|
| +
|
| +function main() {
|
| + assert_outside_chroot
|
| +
|
| + cd $(dirname "$0")
|
| +
|
| + FLAGS "$@" || exit 1
|
| +
|
| + if [[ -z "${FLAGS_ARGV}" ]]; then
|
| + echo "Please specify tests to run, like:"
|
| + echo " $0 --remote=MyMachine SystemBootPerf"
|
| + exit 1
|
| + fi
|
| +
|
| + local parse_cmd="$(dirname $0)/../third_party/autotest/files/tko/parse.py"
|
| +
|
| + if [[ ${FLAGS_update_db} -eq ${FLAGS_TRUE} && ! -x "${parse_cmd}" ]]; then
|
| + echo "Cannot find parser ${parse_cmd}"
|
| + exit 1
|
| + fi
|
| +
|
| + set -e
|
| +
|
| + # Set global TMP for remote_access.sh's sake
|
| + TMP=$(mktemp -d /tmp/run_remote_tests.XXXX)
|
| +
|
| + rm -f "${FLAGS_output_file}"
|
| +
|
| + trap cleanup EXIT
|
| +
|
| + cp -r "${SRC_ROOT}/third_party/autotest/files" "${TMP}/autotest"
|
| +
|
| + local control_files_to_run=""
|
| +
|
| + # Now search for tests which unambiguously include the given identifier
|
| + local search_path=$(echo ${TMP}/autotest/{client,server}/{tests,site_tests})
|
| + for test_request in $FLAGS_ARGV; do
|
| + test_request=$(remove_quotes "${test_request}")
|
| + ! finds=$(find ${search_path} -type f -name control | \
|
| + egrep "${test_request}")
|
| + if [[ -z "${finds}" ]]; then
|
| + echo "Can not find match for ${test_request}"
|
| + exit 1
|
| + fi
|
| + local matches=$(echo "${finds}" | wc -l)
|
| + if [[ ${matches} -gt 1 ]]; then
|
| + echo "${test_request} is ambiguous:"
|
| + echo "${finds}"
|
| + exit 1
|
| + fi
|
| + for i in $(seq 1 $FLAGS_iterations); do
|
| + control_files_to_run="${control_files_to_run} '${finds}'"
|
| + done
|
| + done
|
| +
|
| + echo "Running the following control files: ${control_files_to_run}"
|
| +
|
| + remote_access_init
|
| +
|
| + # Set the default machine description to the machine's IP
|
| + if [[ -z "${FLAGS_machine_desc}" ]]; then
|
| + FLAGS_machine_desc="${FLAGS_remote}"
|
| + fi
|
| +
|
| + local autoserv="${TMP}/autotest/server/autoserv"
|
| +
|
| + for control_file in ${control_files_to_run}; do
|
| + # Assume a line starts with TEST_TYPE =
|
| + control_file=$(remove_quotes "${control_file}")
|
| + local type=$(egrep '^\s*TEST_TYPE\s*=' "${control_file}" | head -1)
|
| + type=$(python -c "${type}; print TEST_TYPE.lower()")
|
| + local option
|
| + if [ "${type}" == "client" ]; then
|
| + option="-c"
|
| + elif [ "${type}" == "server" ]; then
|
| + option="-s"
|
| + else
|
| + echo "Unknown type of test (${type}) in ${control_file}"
|
| + exit 1
|
| + fi
|
| + echo "Running ${type} test ${control_file}"
|
| + local short_name=$(basename $(dirname "${control_file}"))
|
| + local timestamp=$(date '+%s')
|
| + local results_dir="${TMP}/${short_name},${FLAGS_machine_desc},${timestamp}"
|
| + rm -rf "${results_dir}"
|
| + local verbose=""
|
| + if [[ ${FLAGS_verbose} -eq $FLAGS_TRUE ]]; then
|
| + verbose="--verbose"
|
| + fi
|
| + ${autoserv} -m "${FLAGS_remote}" "${option}" "${control_file}" \
|
| + -r "${results_dir}" ${verbose}
|
| + local test_status="${results_dir}/status"
|
| + local test_result_dir="${results_dir}/${short_name}"
|
| + local keyval_file="${test_result_dir}/results/keyval"
|
| + if is_successful_test "${test_status}"; then
|
| + echo "${control_file} succeeded." | tee -a "${FLAGS_output_file}"
|
| + if [[ -f "${keyval_file}" ]]; then
|
| + echo "Keyval was:" | tee -a "${FLAGS_output_file}"
|
| + cat "${keyval_file}" | tee -a "${FLAGS_output_file}"
|
| + fi
|
| + else
|
| + echo "${control_file} failed:" | tee -a "${FLAGS_output_file}"
|
| + cat "${test_status}" | tee -a "${FLAGS_output_file}"
|
| + # Leave around output directory if the test failed.
|
| + FLAGS_cleanup=${FLAGS_FALSE}
|
| + fi
|
| +
|
| + # Update the database with results.
|
| + if [[ ${FLAGS_update_db} -eq ${FLAGS_TRUE} ]]; then
|
| + if ! "${parse_cmd}" -o "${results_dir}"; then
|
| + echo "Parse failed." | tee -a "${FLAGS_output_file}"
|
| + FLAGS_cleanup=${FLAGS_FALSE}
|
| + fi
|
| + fi
|
| + done
|
| +
|
| + echo "Output stored to ${FLAGS_output_file}"
|
| +}
|
| +
|
| +main $@
|
|
|