From 6fbd3d123cfb8d68ebd666b02255fe713a438a9d Mon Sep 17 00:00:00 2001 From: Eric Li Date: Mon, 29 Nov 2010 14:13:15 -0800 Subject: [PATCH] Refactor run_remote_tests script. What I did: 1. enter_chroot once and only once if necessary. The previous version would enter/exit chroot 3 times in worst case. And the entire logic happens inside chroot only, this has greatly simplified the overall workflow, and reduced the number of variables used. Shell script variables could be tricky. 2. Change variable type to test_type since type is a bash builtin. 3. get rid of {$TMP}/run_test.sh script, since it is not necessary any more. 4. get rid of rsync step from third_party/autotest/files to ${BUILD_DIR}, since it is not neccessary either. overall, reduced ~40 lines of code. All the change should be transparent to end users and there should be no regression changes at all. w/wo emerge autotest w/wo cros_workon in/outside of chroot. and all its combinations. Change-Id: I9c1532e9cb6cc0e724d4b6d870723df3e2a147ec BUG=9291 TEST=Run storageFio test since it need prebuild test and deps. Review URL: http://codereview.chromium.org/5176009 --- run_remote_tests.sh | 186 ++++++++++++++++++++------------------------ 1 file changed, 83 insertions(+), 103 deletions(-) diff --git a/run_remote_tests.sh b/run_remote_tests.sh index 0c644d46f1..e920bb61bc 100755 --- a/run_remote_tests.sh +++ b/run_remote_tests.sh @@ -48,83 +48,94 @@ function cleanup() { function read_test_type() { local control_file=$1 # Assume a line starts with TEST_TYPE = - local type=$(egrep -m1 \ - '^[[:space:]]*TEST_TYPE[[:space:]]*=' "${control_file}") - if [[ -z "${type}" ]]; then + local test_type=$(egrep -m1 \ + '^[[:space:]]*TEST_TYPE[[:space:]]*=' "${control_file}") + if [[ -z "${test_type}" ]]; then die "Unable to find TEST_TYPE line in ${control_file}" fi - type=$(python -c "${type}; print TEST_TYPE.lower()") - if [[ "${type}" != "client" ]] && [[ "${type}" != "server" ]]; then - die "Unknown type of test (${type}) in ${control_file}" + test_type=$(python -c "${test_type}; print TEST_TYPE.lower()") + if [[ "${test_type}" != "client" ]] && [[ "${test_type}" != "server" ]]; then + die "Unknown type of test (${test_type}) in ${control_file}" fi - echo ${type} + echo ${test_type} } function create_tmp() { # Set global TMP for remote_access.sh's sake # and if --results_dir_root is specified, # set TMP and create dir appropriately - if [[ ${INSIDE_CHROOT} -eq 0 ]]; then - if [[ -n "${FLAGS_results_dir_root}" ]]; then - TMP=${FLAGS_chroot}${FLAGS_results_dir_root} - mkdir -p -m 777 ${TMP} - else - TMP=$(mktemp -d ${FLAGS_chroot}/tmp/run_remote_tests.XXXX) - fi - TMP_INSIDE_CHROOT=$(echo ${TMP#${FLAGS_chroot}}) + if [[ -n "${FLAGS_results_dir_root}" ]]; then + TMP=${FLAGS_results_dir_root} + mkdir -p -m 777 ${TMP} else - if [[ -n "${FLAGS_results_dir_root}" ]]; then - TMP=${FLAGS_results_dir_root} - mkdir -p -m 777 ${TMP} - else - TMP=$(mktemp -d /tmp/run_remote_tests.XXXX) - fi - TMP_INSIDE_CHROOT=${TMP} + TMP=$(mktemp -d /tmp/run_remote_tests.XXXX) fi } -function prepare_build_dir() { - local autotest_dir="$1" - INSIDE_BUILD_DIR="${TMP_INSIDE_CHROOT}/build" - BUILD_DIR="${TMP}/build" - info "Copying autotest tree into ${BUILD_DIR}." - sudo mkdir -p "${BUILD_DIR}" - sudo rsync -rl --chmod=ugo=rwx "${autotest_dir}"/ "${BUILD_DIR}" +function prepare_build_env() { info "Pilfering toolchain shell environment from Portage." - local outside_ebuild_dir="${TMP}/chromeos-base/autotest-build" - local inside_ebuild_dir="${TMP_INSIDE_CHROOT}/chromeos-base/autotest-build" - mkdir -p "${outside_ebuild_dir}" + local ebuild_dir="${TMP}/chromeos-base/autotest-build" + mkdir -p "${ebuild_dir}" local E_only="autotest-build-9999.ebuild" - cat > "${outside_ebuild_dir}/${E_only}" < "${ebuild_dir}/${E_only}" <&1 > /dev/null - local P_tmp="${FLAGS_chroot}/build/${FLAGS_board}/tmp/portage/" + local P_tmp="/build/${FLAGS_board}/tmp/portage/" local E_dir="${E%%/*}/${E_only%.*}" - sudo cp "${P_tmp}/${E_dir}/temp/environment" "${BUILD_DIR}" + export BUILD_ENV="${P_tmp}/${E_dir}/temp/environment" } function autodetect_build() { if [ ${FLAGS_use_emerged} -eq ${FLAGS_TRUE} ]; then - info \ -"As requested, using emerged autotests already installed in your sysroot." + AUTOTEST_DIR="/build/${FLAGS_board}/usr/local/autotest" FLAGS_build=${FLAGS_FALSE} + if [ ! -d "${AUTOTEST_DIR}" ]; then + die \ +"Could not find pre-installed autotest, you need to emerge-${FLAGS_board} \ +autotest autotest-tests (or use --build)." + fi + info \ +"As requested, using emerged autotests already installed at ${AUTOTEST_DIR}." return fi - if ${ENTER_CHROOT} ./cros_workon --board=${FLAGS_board} list | \ - grep -q autotest; then - info \ -"Detected cros_workon autotests, building your sources instead of emerged \ -autotest. To use installed autotest, pass --use_emerged." + + if [ ${FLAGS_build} -eq ${FLAGS_FALSE} ] && + $(dirname $0)/cros_workon --board=${FLAGS_board} list | + grep -q autotest; then + AUTOTEST_DIR="${SRC_ROOT}/third_party/autotest/files" FLAGS_build=${FLAGS_TRUE} - else + if [ ! -d "${AUTOTEST_DIR}" ]; then + die \ +"Detected cros_workon autotest but ${AUTOTEST_DIR} does not exist. Run \ +repo sync autotest." + fi info \ -"Using emerged autotests already installed in your sysroot. To build \ -autotests directly from your source directory instead, pass --build." - FLAGS_build=${FLAGS_FALSE} +"Detected cros_workon autotests. Building and running your autotests from \ +${AUTOTEST_DIR}. To use emerged autotest, pass --use_emerged." + return + fi + + # flag use_emerged should be false once the code reaches here. + if [ ${FLAGS_build} -eq ${FLAGS_TRUE} ]; then + AUTOTEST_DIR="${SRC_ROOT}/third_party/autotest/files" + if [ ! -d "${AUTOTEST_DIR}" ]; then + die \ +"Build flag was turned on but ${AUTOTEST_DIR} is not found. Run cros_workon \ +start autotest and repo sync to continue." + fi + info "Build and run autotests from ${AUTOTEST_DIR}." + else + AUTOTEST_DIR="/build/${FLAGS_board}/usr/local/autotest" + if [ ! -d "${AUTOTEST_DIR}" ]; then + die \ +"Autotest was not emerged. Run emerge-${FLAGS_board} autotest \ +autotest-tests to continue." + fi + info "Using emerged autotests already installed at ${AUTOTEST_DIR}." fi } @@ -160,24 +171,7 @@ function main() { remote_access_init learn_board - autotest_dir="${FLAGS_chroot}/build/${FLAGS_board}/usr/local/autotest" - - ENTER_CHROOT="" - if [[ ${INSIDE_CHROOT} -eq 0 ]]; then - ENTER_CHROOT="./enter_chroot.sh --chroot ${FLAGS_chroot} --" - fi - - if [ ${FLAGS_build} -eq ${FLAGS_FALSE} ]; then - autodetect_build - fi - - if [ ${FLAGS_build} -eq ${FLAGS_TRUE} ]; then - autotest_dir="${SRC_ROOT}/third_party/autotest/files" - else - if [ ! -d "${autotest_dir}" ]; then - die "You need to emerge autotest-tests (or use --build)" - fi - fi + autodetect_build local control_files_to_run="" local chrome_autotests="${CHROME_ROOT}/src/chrome/test/chromeos/autotest/files" @@ -187,7 +181,8 @@ function main() { if [ -n "${CHROME_ROOT}" ]; then search_path="${search_path} ${chrome_autotests}/client/site_tests" fi - pushd ${autotest_dir} > /dev/null + + pushd ${AUTOTEST_DIR} > /dev/null for test_request in $FLAGS_ARGV; do test_request=$(remove_quotes "${test_request}") ! finds=$(find ${search_path} -maxdepth 2 -type f \( -name control.\* -or \ @@ -208,7 +203,6 @@ function main() { control_files_to_run="${control_files_to_run} '${finds}'" done done - popd > /dev/null echo "" @@ -216,29 +210,29 @@ function main() { die "Found no control files" fi - [ ${FLAGS_build} -eq ${FLAGS_TRUE} ] && prepare_build_dir "${autotest_dir}" + [ ${FLAGS_build} -eq ${FLAGS_TRUE} ] && prepare_build_env info "Running the following control files:" - for CONTROL_FILE in ${control_files_to_run}; do - info " * ${CONTROL_FILE}" + for control_file in ${control_files_to_run}; do + info " * ${control_file}" done for control_file in ${control_files_to_run}; do # Assume a line starts with TEST_TYPE = control_file=$(remove_quotes "${control_file}") - local type=$(read_test_type "${autotest_dir}/${control_file}") + local test_type=$(read_test_type "${AUTOTEST_DIR}/${control_file}") # Check if the control file is an absolute path (i.e. chrome autotests case) if [[ ${control_file:0:1} == "/" ]]; then - type=$(read_test_type "${control_file}") + test_type=$(read_test_type "${control_file}") fi local option - if [[ "${type}" == "client" ]]; then + if [[ "${test_type}" == "client" ]]; then option="-c" else option="-s" fi echo "" - info "Running ${type} test ${control_file}" + info "Running ${test_type} test ${control_file}" local control_file_name=$(basename "${control_file}") local short_name=$(basename $(dirname "${control_file}")) @@ -255,7 +249,7 @@ function main() { fi local results_dir_name="${short_name}" - local results_dir="${TMP_INSIDE_CHROOT}/${results_dir_name}" + local results_dir="${TMP}/${results_dir_name}" rm -rf "${results_dir}" local verbose="" if [[ ${FLAGS_verbose} -eq $FLAGS_TRUE ]]; then @@ -271,39 +265,24 @@ function main() { info "Running chrome autotest ${control_file}" fi - local autoserv_test_args="${FLAGS_args}" - if [ -n "${autoserv_test_args}" ]; then - autoserv_test_args="-a \"${autoserv_test_args}\"" - fi local autoserv_args="-m ${FLAGS_remote} --ssh-port ${FLAGS_ssh_port} \ ${option} ${control_file} -r ${results_dir} ${verbose}" - if [ ${FLAGS_build} -eq ${FLAGS_FALSE} ]; then - cat > "${TMP}/run_test.sh" <&2 + if [ -n "${FLAGS_args}" ]; then + autoserv_args="${autoserv_args} -a \""${FLAGS_args}"\"" + fi + + sudo chmod a+w ./server/{tests,site_tests} + echo ./server/autoserv ${autoserv_args} + + if [ ${FLAGS_build} -eq ${FLAGS_TRUE} ]; then + # run autoserv in subshell + (. ${BUILD_ENV} && tc-export CC CXX PKG_CONFIG && + ./server/autoserv ${autoserv_args}) else - cp "${BUILD_DIR}/environment" "${TMP}/run_test.sh" - GRAPHICS_BACKEND=${GRAPHICS_BACKEND:-OPENGL} - cat >> "${TMP}/run_test.sh" <&2 + ./server/autoserv ${autoserv_args} fi done + popd > /dev/null echo "" info "Test results:" @@ -312,4 +291,5 @@ EOF print_time_elapsed } +restart_in_chroot_if_needed $* main "$@"