You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
7.1 KiB
227 lines
7.1 KiB
#!/bin/bash
|
|
|
|
# Copyright (c) 2010 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.
|
|
|
|
# Wrapper to run the platform_BootPerfServer autotest, and store the
|
|
# results for later analysis by the 'showbootdata' script.
|
|
#
|
|
# NOTE: This script must be run from inside the chromeos build
|
|
# chroot environment.
|
|
#
|
|
COMMONSH="/mnt/host/source/src/scripts/common.sh"
|
|
. ${COMMONSH} || (echo "Unable to load ${COMMONSH}" && exit 1)
|
|
|
|
# TODO(jrbarnette) The log files produced in this script will be
|
|
# stored inside the chroot. So, from outside the chroot, this
|
|
# script doesn't work. I don't know if this is easy to fix, but
|
|
# you're welcome to try. Let me know how it goes. :-)
|
|
assert_inside_chroot
|
|
|
|
DEFINE_string output_dir "" "output directory for results" o
|
|
DEFINE_string board "" "name of board we are testing"
|
|
DEFINE_boolean keep_logs "$FLAGS_FALSE" "keep autotest results" k
|
|
|
|
RUN_TEST="test_that"
|
|
TEST='platform_BootPerfServer.bootperf'
|
|
TMP_RESULTS="$(mktemp -d /tmp/bootperf.XXXXXX)"
|
|
RESULTS_ROOT="results-1-$TEST"
|
|
RESULTS_DIR=platform_BootPerfServer/results
|
|
RESULTS_KEYVAL=$RESULTS_DIR/keyval
|
|
RESULTS_SUMMARY_FILES=(
|
|
$RESULTS_DIR
|
|
keyval
|
|
platform_BootPerfServer/keyval
|
|
platform_BootPerfServer/platform_BootPerf/keyval
|
|
platform_BootPerfServer/platform_BootPerf/status
|
|
platform_BootPerfServer/status
|
|
platform_BootPerfServer/status.log
|
|
platform_BootPerfServer/sysinfo/cmdline
|
|
platform_BootPerfServer/sysinfo/cpuinfo
|
|
platform_BootPerfServer/sysinfo/modules
|
|
platform_BootPerfServer/sysinfo/uname
|
|
platform_BootPerfServer/sysinfo/version
|
|
status.log
|
|
)
|
|
|
|
# Structure of a results directory:
|
|
# $RUNDIR.$ITER/ - directory
|
|
# $RUNDIR_LOG - file
|
|
# $RUNDIR_SUMMARY/ - directory
|
|
# $RUNDIR_ALL_RESULTS/ - optional directory
|
|
# $KEYVAL_SUMMARY/ - file
|
|
# If you add any other content under the results directory, you'll
|
|
# probably need to change extra_files(), below.
|
|
RUNDIR=run
|
|
RUNDIR_LOG=log.txt
|
|
RUNDIR_SUMMARY=summary
|
|
RUNDIR_ALL_RESULTS=logs
|
|
KEYVAL_SUMMARY=results_keyval
|
|
|
|
|
|
# Usage/help function. This function is known to the shflags library,
|
|
# and mustn't be renamed.
|
|
flags_help() {
|
|
cat <<END_USAGE >&2
|
|
usage: $(basename $0) [ <options> ] <ip-address> [ <count> ]
|
|
Options:
|
|
--output_dir <directory>
|
|
--o <directory> Specify output directory for results
|
|
|
|
--board <BOARDNAME> name of board we are testing (e.g. daisy)
|
|
|
|
--[no]keep_logs
|
|
-k Keep [don't keep] autotest log files
|
|
Summary:
|
|
Run the platform_BootPerfServer autotest, and store results in the
|
|
given destination directory. The test target is specified by
|
|
<ip-address>.
|
|
|
|
By default, the test is run once; if <count> is given, the test is
|
|
run that many times. Note that the platform_BootPerfServer test
|
|
reboots the target 10 times, so the total number of reboots will
|
|
be 10*<count>.
|
|
|
|
If the destination directory doesn't exist, it is created. If the
|
|
destination directory already holds test results, additional
|
|
results are added in without overwriting earlier results.
|
|
|
|
If no destination is specified, the current directory is used,
|
|
provided that the directory is empty, or has been previously used
|
|
as a destination directory for this command.
|
|
|
|
By default, only a summary subset of the log files created by
|
|
autotest is preserved; with --keep_logs the (potentially large)
|
|
autotest logs are preserved with the test results.
|
|
END_USAGE
|
|
return $FLAGS_TRUE
|
|
}
|
|
|
|
usage() {
|
|
if [ $# -gt 0 ]; then
|
|
error "$(basename $0): $*"
|
|
echo >&2
|
|
fi
|
|
flags_help
|
|
exit 1
|
|
}
|
|
|
|
# List any files in the current directory not created as output
|
|
# from running this script.
|
|
extra_files() {
|
|
ls | grep -v "^$RUNDIR[.]...\$" |
|
|
grep -v $KEYVAL_SUMMARY
|
|
}
|
|
|
|
# Main function to run the boot performance test. Run the boot
|
|
# performance test for the given count, putting output into the
|
|
# current directory.
|
|
#
|
|
# Arguments are <ip-address> and <count> arguments, as for the main
|
|
# command.
|
|
#
|
|
# We terminate test runs if "test_that" ever fails to produce the
|
|
# results keyval file; generally this is the result of a serious
|
|
# error (e.g. disk full) that won't go away if we just plow on.
|
|
run_boot_test() {
|
|
local remote="$1"
|
|
local count="${2:-1}"
|
|
|
|
local iter=$(expr "$(echo $RUNDIR.???)" : '.*\(...\)')
|
|
if [ "$iter" != "???" ]; then
|
|
iter=$(echo $iter | awk '{printf "%03d\n", $1 + 1}')
|
|
else
|
|
iter=000
|
|
fi
|
|
|
|
i=0
|
|
while [ $i -lt $count ]; do
|
|
local iter_rundir=$RUNDIR.$iter
|
|
local logfile=$(pwd)/$iter_rundir/$RUNDIR_LOG
|
|
local summary_dir=$iter_rundir/$RUNDIR_SUMMARY
|
|
local all_results_dir=$iter_rundir/$RUNDIR_ALL_RESULTS
|
|
|
|
mkdir $iter_rundir
|
|
echo "$(date '+%T') - $logfile"
|
|
|
|
$RUN_TEST --results_dir="$TMP_RESULTS" --args "10" $BOARD \
|
|
"$remote" $TEST >$logfile 2>&1
|
|
if [ ! -e "$TMP_RESULTS/$RESULTS_ROOT/$RESULTS_KEYVAL" ]; then
|
|
error "No results file; terminating test runs."
|
|
error "Check $logfile for output from the test run,"
|
|
error "and see $TMP_RESULTS for full test logs and output."
|
|
return
|
|
fi
|
|
mkdir $summary_dir
|
|
tar cf - -C $TMP_RESULTS/$RESULTS_ROOT "${RESULTS_SUMMARY_FILES[@]}" |
|
|
tar xf - -C $summary_dir
|
|
if [ $FLAGS_keep_logs -eq $FLAGS_TRUE ]; then
|
|
mv $TMP_RESULTS $all_results_dir
|
|
chmod 755 $all_results_dir
|
|
else
|
|
rm -rf $TMP_RESULTS
|
|
fi
|
|
i=$(expr $i + 1)
|
|
iter=$(echo $iter | awk '{printf "%03d\n", $1 + 1}')
|
|
done
|
|
date '+%T'
|
|
cat $RUNDIR.???/$RUNDIR_SUMMARY/$RESULTS_KEYVAL >$KEYVAL_SUMMARY
|
|
}
|
|
|
|
# Main routine - check validity of the (already parsed) command line
|
|
# options. 'cd' to the results directory, if it was specified. If
|
|
# all the arguments checks pass, hand control to run_boot_test
|
|
main() {
|
|
if [ $# -lt 1 ]; then
|
|
usage "Missing target host address"
|
|
elif [ $# -gt 2 ]; then
|
|
usage "Too many arguments"
|
|
fi
|
|
|
|
if [ -n "${FLAGS_board}" ]; then
|
|
BOARD="--board=${FLAGS_board}"
|
|
fi
|
|
|
|
if [ -n "${FLAGS_output_dir}" ]; then
|
|
if [ ! -d "${FLAGS_output_dir}" ]; then
|
|
if ! mkdir "${FLAGS_output_dir}"; then
|
|
usage "Unable to create ${FLAGS_output_dir}"
|
|
fi
|
|
fi
|
|
cd "${FLAGS_output_dir}" ||
|
|
usage "No permissions to chdir to ${FLAGS_output_dir}"
|
|
elif [ -n "$(extra_files)" ]; then
|
|
error "No results directory specified, and current directory"
|
|
error "contains contents other than run results."
|
|
error "You can override this error by using the --output_dir option"
|
|
usage
|
|
fi
|
|
|
|
# Check the count argument.
|
|
# N.B. the test [ "$2" -eq "$2" ] tests whether "$2" is valid as a
|
|
# number; when it fails it will also report a syntax error (which
|
|
# we suppress).
|
|
if [ -n "$2" ]; then
|
|
if ! [ "$2" -eq "$2" ] 2>/dev/null || [ "$2" -le 0 ]; then
|
|
usage "<count> argument must be a positive number"
|
|
fi
|
|
fi
|
|
|
|
run_boot_test "$@"
|
|
}
|
|
|
|
# shflags defines --help implicitly; if it's used on the command
|
|
# line FLAGS will invoke flags_help, set FLAGS_help to TRUE, and
|
|
# then return false. To avoid printing help twice, we have to check
|
|
# for that case here.
|
|
if ! FLAGS "$@"; then
|
|
if [ ${FLAGS_help} -eq ${FLAGS_TRUE} ]; then
|
|
exit 0
|
|
else
|
|
usage
|
|
fi
|
|
fi
|
|
|
|
eval main "${FLAGS_ARGV}"
|