From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mail-pf0-f196.google.com ([209.85.192.196]:33685 "EHLO mail-pf0-f196.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1750983AbdGZATm (ORCPT ); Tue, 25 Jul 2017 20:19:42 -0400 Received: by mail-pf0-f196.google.com with SMTP id k72so10659745pfj.0 for ; Tue, 25 Jul 2017 17:19:41 -0700 (PDT) From: Eric Biggers Subject: [PATCH 1/2] android-xfstests: support specifying a kernel to boot Date: Tue, 25 Jul 2017 17:18:37 -0700 Message-Id: <20170726001838.80452-1-ebiggers3@gmail.com> Sender: fstests-owner@vger.kernel.org To: Theodore Ts'o Cc: fstests@vger.kernel.org, Eric Biggers List-ID: From: Eric Biggers Update android-xfstests to support specifying a kernel with KERNEL in ~/.config/android-xfstests or --kernel on the command line, similar to kvm-xfstests and gce-xfstests. If it's not already running, the kernel is booted using the 'fastboot boot' command. This unfortunately doesn't work on all devices, but it should still be useful to have. Signed-off-by: Eric Biggers --- kvm-xfstests/android-xfstests | 223 +++++++++++++++++++++++++++++++++++++----- kvm-xfstests/config.android | 5 + kvm-xfstests/util/parse_cli | 5 +- 3 files changed, 204 insertions(+), 29 deletions(-) diff --git a/kvm-xfstests/android-xfstests b/kvm-xfstests/android-xfstests index 6d41540..8e5b77c 100755 --- a/kvm-xfstests/android-xfstests +++ b/kvm-xfstests/android-xfstests @@ -50,27 +50,56 @@ die() ask_yesno() { local response - echo -n -e "$@ (y/n) " + echo -n -e "$@ (y/N) " read response if [ "$response" != y ]; then exit 1 fi } +adb_ready() +{ + adb devices | grep -q 'device$' +} + +fastboot_ready() +{ + fastboot devices | grep -q 'fastboot$' +} + wait_for_device() { + local want_adb=false + local want_fastboot=false + local waiting_for="" local unauthorized=false local waiting=false + + if [[ ,$1, == *,adb,* ]]; then + want_adb=true + waiting_for="adb to be ready" + fi + if [[ ,$1, == *,fastboot,* ]]; then + want_fastboot=true + waiting_for+="${waiting_for:+ or for }device to enter fastboot mode" + fi + : "${waiting_for:=device}" + while true; do - if adb devices | grep -q 'device$'; then - break + if $want_adb; then + if adb_ready; then + break + fi + if ! $unauthorized && adb devices | grep -q 'unauthorized$'; then + echo "adb is not authorized. Authorize it using the dialog on the device to continue." + unauthorized=true + fi fi - if adb devices | grep -q 'unauthorized$' && ! $unauthorized; then - echo "adb is not authorized. Authorize it using the dialog on the device to continue." - unauthorized=true + if $want_fastboot && fastboot_ready; then + return fi if ! $waiting && ! $unauthorized; then - echo "Waiting for device..." + echo "Waiting for $waiting_for..." waiting=true fi sleep 0.5 @@ -83,6 +112,115 @@ wait_for_device() adb shell "setenforce 0" } +wait_for_adb() +{ + wait_for_device adb +} + +wait_for_fastboot() +{ + wait_for_device fastboot +} + +wait_for_adb_or_fastboot() +{ + wait_for_device adb,fastboot +} + +reboot_into_fastboot_mode() +{ + adb reboot bootloader + wait_for_fastboot +} + +# Query the version of the kernel running on the device +query_kernel_version() +{ + adb shell "uname -r -v" +} + +# Try to extract the version information from the $KERNEL image by grepping for +# the linux_banner[] string. It's a hack, but there doesn't seem to be a better +# way, and scripts elsewhere supposedly have been doing this for a long time... +extract_kernel_version() +{ + local decompress + + # Note: we use the filename extension rather than the 'file' program to get + # the compression format because old versions of 'file' don't recognize + # LZ4-compressed files. + case "$(basename "$KERNEL")" in + Image.gz*) + decompress="gzip -d -c" + ;; + Image.bz2*) + decompress="bzip2 -d -c" + ;; + Image.xz*) + decompress="xz -d -c" + ;; + Image.lz4*) + decompress="lz4 -d" # no -c option; stdout is assumed when not a tty + ;; + *) + decompress="cat" + ;; + esac + local banner="$($decompress "$KERNEL" \ + | grep -a -m1 'Linux version [0-9]\+\.[0-9]\+.*#.*$')" + + if [ -n "$banner" ]; then + local krelease="$(echo "$banner" | awk '{print $3}')" + local kver="#${banner##*#}" + echo "$krelease $kver" + fi +} + +# If the specified $KERNEL isn't already running on the device, try to boot it +# using 'fastboot boot'. +boot_kernel() +{ + local version actual_version + local have_version=true + + if [ ! -f "$KERNEL" ]; then + die "The specified kernel image does not exist: $KERNEL" + fi + + version="$(extract_kernel_version "$KERNEL")" + if [ -z "$version" ]; then + cat 1>&2 < /dev/null ; then die "fastboot is not installed" fi -wait_for_device -setup_chroot -if ! xfstests_running; then - setup_partitions first_try -fi - case "$ARG" in cmd=shell*|cmd=maint*) - chroot_interactive_shell - exit 0 + want_shell=true + ;; + *) + want_shell=false + if adb_ready; then + stop_existing_tests + fi ;; esac -stop_existing_tests +# Set up the kernel, the chroot, and the xfstests partitions. + +tried_to_shrink_userdata=false +while true; do + + # Start by booting into the correct kernel. + if [ -n "$KERNEL" ]; then + boot_kernel + elif fastboot_ready; then + fastboot continue + fi + + wait_for_adb + + # Set up the chroot and xfstests partitions. Note: if an interactive shell + # is requested and tests are currently running, we won't mess around with + # the partitions. However, we'll still try to set up the chroot just in + # case a different ROOT_FS was specified (in which case the existing tests + # will need to be stopped). + setup_chroot + if $want_shell && xfstests_running; then + break + fi + if setup_partitions; then + break + fi + + # Need to shrink userdata to make space for the xfstests partitions! + if $tried_to_shrink_userdata; then + die "An unexpected problem occurred when shrinking userdata." + fi + try_shrink_userdata + tried_to_shrink_userdata=true + + # 'userdata' has just been formatted and the device is now in fastboot mode. + # Start the configuration over again. +done + +if $want_shell; then + chroot_interactive_shell + exit 0 +fi cat > "$tmpfile" <