Merge "bootstat: test: refine reported test durations"

This commit is contained in:
Mark Salyzyn 2017-10-11 20:33:05 +00:00 committed by Gerrit Code Review
commit bb52cbf35d
1 changed files with 70 additions and 19 deletions

View File

@ -22,6 +22,8 @@ TAB=" "
GREEN="${ESCAPE}[38;5;40m"
RED="${ESCAPE}[38;5;196m"
NORMAL="${ESCAPE}[0m"
# Best guess to an average device's reboot time, refined as tests return
DURATION_DEFAULT=45
# Helper functions
@ -57,12 +59,15 @@ isDebuggable() {
fi
}
[ "USAGE: checkDebugBuild
[ "USAGE: checkDebugBuild [--noerror]
Returns: true if device is a userdebug or eng release" ]
checkDebugBuild() {
if isDebuggable; then
echo "INFO: '${TEST}' test requires userdebug build"
elif [ -n "${1}" ]; then
echo "WARNING: '${TEST}' test requires userdebug build"
false
else
echo "ERROR: '${TEST}' test requires userdebug build, skipping FAILURE"
false
@ -204,7 +209,7 @@ EXPECT_EQ() {
return 0
}
[ "USAGE: EXPECT_PROPERTY <prop> <value>
[ "USAGE: EXPECT_PROPERTY <prop> <value> [--allow_failure]
Returns true if current return (regex) value is true and the result matches" ]
EXPECT_PROPERTY() {
@ -214,6 +219,7 @@ EXPECT_PROPERTY() {
shift 2
val=`adb shell getprop ${property} 2>&1`
EXPECT_EQ "${value}" "${val}" for Android property ${property} ||
[ -n "${1}" ] ||
save_ret=${?}
return ${save_ret}
}
@ -279,11 +285,44 @@ init : Command 'exec - system log -- /system/bin/bootstat --record_time_since
Record start of test, preserve exit status" ]
start_test() {
save_ret=${?}
duration_prefix="~"
duration_estimate=1
START=`date +%s`
echo "${GREEN}[ RUN ]${NORMAL} ${TEST} ${*}"
return ${save_ret}
}
duration_sum_diff=0
duration_num=0
[ "USAGE: duration_test [[prefix]seconds]
Report the adjusted and expected test duration" ]
duration_test() {
duration_prefix=${1%%[0123456789]*}
if [ -z "${duration_prefix}" ]; then
duration_prefix="~"
fi
duration_estimate="${1#${duration_prefix}}"
if [ -z "${duration_estimate}" ]; then
duration_estimate="${DURATION_DEFAULT}"
fi
duration_new_estimate="${duration_estimate}"
if [ 0 -ne ${duration_num} ]; then
duration_new_estimate=`expr ${duration_new_estimate} + \
\( ${duration_num} / 2 + ${duration_sum_diff} \) / ${duration_num}`
# guard against catastrophe
if [ -z "${duration_new_estimate}" ]; then
duration_new_estimate=${duration_estimate}
fi
fi
# negative values are so undignified
if [ 0 -ge ${duration_new_estimate} ]; then
duration_new_estimate=1
fi
echo "INFO: expected duration of '${TEST}' test" \
"${duration_prefix}`format_duration ${duration_new_estimate}`" >&2
}
[ "USAGE: end_test [message]
Document duration and success of test, preserve exit status" ]
@ -291,9 +330,16 @@ end_test() {
save_ret=${?}
END=`date +%s`
duration=`expr ${END} - ${START} 2>/dev/null`
[ 0 = ${duration} ] ||
[ 0 -ge ${duration} ] ||
echo "INFO: '${TEST}' test duration `format_duration ${duration}`" >&2
if [ ${save_ret} = 0 ]; then
if [ 0 -lt ${duration} -a 0 -lt ${duration_estimate} -a \( \
X"~" = X"${duration_prefix}" -o \
${duration_estimate} -gt ${duration} \) ]; then
duration_sum_diff=`expr ${duration_sum_diff} + \
${duration} - ${duration_estimate}`
duration_num=`expr ${duration_num} + 1`
fi
echo "${GREEN}[ OK ]${NORMAL} ${TEST} ${*}"
else
echo "${RED}[ FAILED ]${NORMAL} ${TEST} ${*}"
@ -372,6 +418,7 @@ properties test
- adb shell getprop sys.boot.reason (system reason)
- NB: all should have a value that is compliant with our known set." ]
test_properties() {
duration_test 1
wait_for_screen
retval=0
check_set="ro.boot.bootreason persist.sys.boot.reason sys.boot.reason"
@ -410,7 +457,7 @@ ota test
Decision to change the build itself rather than trick bootstat by
rummaging through its data files was made." ]
test_ota() {
echo "INFO: expected duration of '${TEST}' test >`format_duration 300`" >&2
duration_test ">300"
echo " extended by build and flashing times" >&2
if [ -z "${TARGET_PRODUCT}" -o \
-z "${ANDROID_PRODUCT_OUT}" -o \
@ -451,7 +498,7 @@ test_ota() {
fast and fake (touch build_date on device to make it different)" ]
test_optional_ota() {
checkDebugBuild || return
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
duration_test
adb shell su root touch /data/misc/bootstat/build_date >&2
adb reboot ota
wait_for_screen
@ -472,11 +519,11 @@ We interleave the simple reboot tests between the hard/complex ones
as a means of checking sanity and any persistent side effect of the
other tests." ]
blind_reboot_test() {
duration_test
case ${TEST} in
bootloader | recovery | cold | hard | warm ) reason=${TEST} ;;
*) reason=reboot,${TEST} ;;
esac
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
adb reboot ${TEST}
wait_for_screen
EXPECT_PROPERTY sys.boot.reason ${reason}
@ -508,7 +555,7 @@ Decision to rummage through bootstat data files was made as
a _real_ factory_reset is too destructive to the device." ]
test_factory_reset() {
checkDebugBuild || return
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
duration_test
adb shell su root rm /data/misc/bootstat/build_date >&2
adb reboot >&2
wait_for_screen
@ -531,7 +578,7 @@ factory_reset test
For realz, and disruptive" ]
test_optional_factory_reset() {
echo "INFO: expected duration of '${TEST}' test ~`format_duration 60`" >&2
duration_test 60
if ! inFastboot; then
adb reboot-bootloader
fi
@ -585,7 +632,7 @@ battery test (trick):
- (replace set logd.kernel true to the above, and retry test)" ]
test_battery() {
checkDebugBuild || return
echo "INFO: expected duration of '${TEST}' test ~`format_duration 120`" >&2
duration_test 120
enterPstore
# Send it _many_ times to combat devices with flakey pstore
for i in a b c d e f g h i j k l m n o p q r s t u v w x y z; do
@ -626,7 +673,7 @@ battery shutdown test:
- adb shell getprop sys.boot.reason
- NB: should report shutdown,battery" ]
test_optional_battery() {
echo "INFO: expected duration of '${TEST}' test >`format_duration 60`" >&2
duration_test ">60"
echo " power on request" >&2
adb shell setprop sys.powerctl shutdown,battery
sleep 5
@ -646,7 +693,7 @@ battery thermal shutdown test:
- adb shell getprop sys.boot.reason
- NB: should report shutdown,thermal,battery" ]
test_optional_battery_thermal() {
echo "INFO: expected duration of '${TEST}' test >`format_duration 60`" >&2
duration_test ">60"
echo " power on request" >&2
adb shell setprop sys.powerctl shutdown,thermal,battery
sleep 5
@ -678,7 +725,7 @@ kernel_panic test:
- NB: should report kernel_panic,sysrq" ]
test_kernel_panic() {
checkDebugBuild || return
echo "INFO: expected duration of '${TEST}' test >`format_duration 120`" >&2
duration_test ">90"
panic_msg="kernel_panic,sysrq"
enterPstore || panic_msg="\(kernel_panic,sysrq\|kernel_panic\)"
echo c | adb shell su root tee /proc/sysrq-trigger >/dev/null
@ -709,7 +756,7 @@ thermal shutdown test:
- adb shell getprop sys.boot.reason
- NB: should report shutdown,thermal" ]
test_thermal_shutdown() {
echo "INFO: expected duration of '${TEST}' test >`format_duration 60`" >&2
durtion_test ">60"
echo " power on request" >&2
adb shell setprop sys.powerctl shutdown,thermal
sleep 5
@ -729,7 +776,7 @@ userrequested shutdown test:
- adb shell getprop sys.boot.reason
- NB: should report shutdown,userrequested" ]
test_userrequested_shutdown() {
echo "INFO: expected duration of '${TEST}' test >`format_duration 60`" >&2
duration_test ">60"
echo " power on request" >&2
adb shell setprop sys.powerctl shutdown,userrequested
sleep 5
@ -748,7 +795,7 @@ shell reboot test:
- adb shell getprop sys.boot.reason
- NB: should report reboot,shell" ]
test_shell_reboot() {
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
duration_test
adb shell reboot
wait_for_screen
EXPECT_PROPERTY sys.boot.reason reboot,shell
@ -764,7 +811,7 @@ adb reboot test:
- adb shell getprop sys.boot.reason
- NB: should report reboot,adb" ]
test_adb_reboot() {
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
duration_test
adb reboot
wait_for_screen
EXPECT_PROPERTY sys.boot.reason reboot,adb
@ -781,14 +828,18 @@ Its Just So Hard reboot test:
- NB: should report reboot,its_just_so_hard
- NB: expect log \"... I bootstat: Unknown boot reason: reboot,its_just_so_hard\"" ]
test_Its_Just_So_Hard_reboot() {
checkDebugBuild || return
echo "INFO: expected duration of '${TEST}' test ~`format_duration 45`" >&2
duration_test
adb shell 'reboot "Its Just So Hard"'
wait_for_screen
EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard
EXPECT_PROPERTY persist.sys.boot.reason "reboot,Its Just So Hard"
adb shell su root setprop persist.sys.boot.reason reboot,its_just_so_hard
EXPECT_PROPERTY persist.sys.boot.reason reboot,its_just_so_hard
if checkDebugBuild; then
flag=""
else
flag="--allow_failure"
fi
EXPECT_PROPERTY persist.sys.boot.reason reboot,its_just_so_hard ${flag}
report_bootstat_logs reboot,its_just_so_hard
}