Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 2f0bcd93 authored by Yi-Yo Chiang's avatar Yi-Yo Chiang
Browse files

adb-remount-test: Refactor raw remount & remount from scratch test

Move "raw remount test" right after "disable-verity -R test".
Device is expected to be in a clean state right after disable-verity, so
we can perform "raw remount test" immediately after. This saves us one
reboot.

Move "remount from scratch test" right before "remount -R test".
Since they both require overlay teardown state, group them together so
we only need to teardown (and reboot) once. This saves us one reboot.

Total test runtime reduced by two reboots.

Bug: 243116800
Test: adb-remount-test
Change-Id: Ifd95ba713f1819a7d31e88cd70077dc306c64c58
parent 4cf5421e
Loading
Loading
Loading
Loading
+91 −91
Original line number Diff line number Diff line
@@ -760,9 +760,11 @@ surgically_wipe_overlayfs() {
  ${wiped_anything}
}

[ "USAGE: is_overlayfs_mounted
[ "USAGE: is_overlayfs_mounted [mountpoint]

Returns: true if overlayfs is mounted" ]
Diagnostic output of overlayfs df lines to stderr.

Returns: true if overlayfs is mounted [on mountpoint]" ]
is_overlayfs_mounted() {
  local df_output=$(adb_su df -k </dev/null)
  local df_header_line=$(echo "${df_output}" | head -1)
@@ -775,6 +777,9 @@ is_overlayfs_mounted() {
  ( echo "${df_header_line}"
    echo "${overlay_mounts}"
  ) >&2
  if [ "${#}" -gt 0 ] && ! ( echo "${overlay_mounts}" | grep -qE " ${1}\$" ); then
    return 1
  fi >/dev/null 2>/dev/null
  return 0
}

@@ -1123,14 +1128,47 @@ if [ "2" = "$(get_property partition.system.verified)" ]; then
fi
if ${overlayfs_needed}; then
  is_overlayfs_mounted ||
    die "no overlay takeover after adb disable-verity -R"
    die -d "no overlay takeover after adb disable-verity -R"
  LOG OK "overlay takeover after adb disable-verity -R"
fi
LOG OK "adb disable-verity -R"

################################################################################
# Precondition is a verity-disabled device with overlayfs already setup.
LOG RUN "Testing raw remount commands"

LOG RUN "Testing adb remount -R"
adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null &&
  die "/system is not RO"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null &&
  die "/vendor is not RO"

T=$(adb_date)
adb_su mount -o remount,rw /vendor ||
  die -t "${T}" "mount -o remount,rw /vendor"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
  die "/vendor is not RW after mount -o remount,rw"
LOG OK "mount -o remount,rw"

T=$(adb_date)
adb_su mount -o remount,ro /vendor ||
  die -t "${T}" "mount -o remount,ro /vendor"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null &&
  die "/vendor is not RO after mount -o remount,ro"
LOG OK "mount -o remount,ro"

T=$(adb_date)
adb_su remount vendor >&2 ||
  die -t "${T}" "adb remount vendor"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
  die -t "${T}" "/vendor is not RW after adb remount vendor"
adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null &&
  die -t "${T}" "/system is not RO after adb remount vendor"
LOG OK "adb remount vendor"

LOG INFO "Restoring device RO state and destroying overlayfs"
T=$(adb_date)
adb_su mount -o remount,ro /vendor ||
  die -t "${T}" "mount -o remount,ro /vendor"
if surgically_wipe_overlayfs; then
  adb_reboot &&
    adb_wait "${ADB_WAIT}" ||
@@ -1139,6 +1177,31 @@ fi
is_overlayfs_mounted &&
  die "overlay takeover unexpected at this phase"

################################################################################
# Precondition is a verity-disabled device with overlayfs *not* setup.
LOG RUN "Testing adb remount performs overlayfs setup from scratch"

adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null &&
  die "/vendor is not RO"
T=$(adb_date)
adb_su remount vendor >&2 ||
  die -t "${T}" "adb remount vendor from scratch"
if ${overlayfs_needed}; then
  is_overlayfs_mounted /vendor ||
    die -t "${T}" "expected overlay takeover /vendor"
  is_overlayfs_mounted /system 2>/dev/null &&
    die -t "${T}" "unexpected overlay takeover /system"
fi
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
  die -t "${T}" "/vendor is not RW after adb remount vendor"
adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null &&
  die -t "${T}" "/system is not RO after adb remount vendor"
LOG OK "adb remount from scratch"

################################################################################
# Precondition is overlayfs partially setup by previous test.
LOG RUN "Testing adb remount -R"

T=$(adb_date)
adb_su remount -R </dev/null >&2 ||
  die -t "${T}" "adb remount -R failed"
@@ -1151,16 +1214,16 @@ if [ "2" = "$(get_property partition.system.verified)" ]; then
  die "verity not disabled after adb remount -R"
fi
if ${overlayfs_needed}; then
  is_overlayfs_mounted ||
    die "no overlay takeover after adb remount -R"
  is_overlayfs_mounted /system ||
    die -d "expected overlay takeover /system"
  is_overlayfs_mounted /vendor 2>/dev/null ||
    die -d "expected overlay takeover /vendor"
  LOG OK "overlay takeover after adb remount -R"
fi
LOG OK "adb remount -R"

################################################################################
# Precondition is a verity-disabled device with overlayfs already setup.
LOG RUN "Testing adb remount RW"

# For devices using overlayfs, remount -R should reboot after overlayfs setup.
# For legacy device, manual reboot to ensure device clean state.
if ! ${overlayfs_needed}; then
  LOG WARNING "Reboot to RO (device doesn't use overlayfs)"
  adb_reboot &&
@@ -1168,35 +1231,32 @@ if ! ${overlayfs_needed}; then
    die "lost device after reboot to RO $(usb_status)"
fi

################################################################################
# Precondition is a verity-disabled device with overlayfs already setup.
LOG RUN "Testing adb remount RW"

# Feed log with selinux denials as baseline before overlays
adb_unroot
adb_sh find ${MOUNTS} </dev/null >/dev/null 2>/dev/null || true
adb_root

adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null &&
  die "/system is not RO"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null &&
  die "/vendor is not RO"
T=$(adb_date)
adb remount vendor >&2 ||
  die -t "${T}" "adb remount vendor"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
  die "/vendor is not RW"

adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null &&
  die "/system is not RO"
T=$(adb_date)
adb remount >&2 ||
  die -t "${T}" "adb remount"
adb_sh grep -qE " (/system|/) [^ ]* rw," /proc/mounts </dev/null ||
  die "/system is not RW"
  die -t "${T}" "/system is not RW"
adb_sh grep -q " /vendor [^ ]* rw," /proc/mounts </dev/null ||
  die -t "${T}" "/vendor is not RW"

D=$(adb_sh df -k </dev/null)
H=$(echo "${D}" | head -1)
D=$(echo "${D}" | skip_unrelated_mounts | grep "^overlay ")
if [ -n "${D}" ] && ! ${overlayfs_needed}; then
  die -t "${T}" "unexpected overlay takeover"
fi
if [ -z "${D}" ] && ${overlayfs_needed}; then
  die -t "${T}" "expected overlay takeover"
if ${overlayfs_needed}; then
  is_overlayfs_mounted || die -t "${T}" "expected overlay takeover"
else
  is_overlayfs_mounted && die -t "${T}" "unexpected overlay takeover"
fi

# If scratch_partition && uses_dynamic_scratch, then scratch is on super.
@@ -1234,10 +1294,7 @@ if ${overlayfs_needed}; then
    fi
  done

  ( echo "${H}"
    echo "${D}"
  ) >&2
  echo "${D}" | grep ' /system$' >/dev/null ||
  is_overlayfs_mounted /system 2>/dev/null ||
    die -t "${T}" "expected overlay to takeover /system after remount"
  adb_sh grep "^overlay " /proc/mounts </dev/null |
    skip_unrelated_mounts |
@@ -1325,9 +1382,7 @@ adb_reboot &&
  die "reboot after override content added failed `usb_status`"

if ${overlayfs_needed}; then
  D=`adb_su df -k </dev/null` &&
    H=`echo "${D}" | head -1` &&
    D=`echo "${D}" | grep -v " /vendor/..*$" | grep "^overlay "` ||
  is_overlayfs_mounted ||
    die -d "overlay takeover failed after reboot"

  adb_su sed -n '1,/overlay \/system/p' /proc/mounts </dev/null |
@@ -1449,16 +1504,9 @@ else
    fixup_from_recovery ||
    die "cannot reboot after flash vendor $(usb_status)"
  if ${overlayfs_needed}; then
    adb_root &&
      D=`adb_sh df -k </dev/null` &&
      H=`echo "${D}" | head -1` &&
      D=`echo "${D}" | skip_unrelated_mounts | grep "^overlay "` &&
      ( echo "${H}" &&
        echo "${D}"
      ) >&2 &&
      echo "${D}" | grep "^overlay .* /system\$" >/dev/null ||
    is_overlayfs_mounted /system ||
      die  "overlay /system takeover after flash vendor"
    echo "${D}" | grep "^overlay .* /vendor\$" >/dev/null &&
    if is_overlayfs_mounted /vendor 2>/dev/null; then
      if ${is_userspace_fastboot}; then
        die  "overlay supposed to be minus /vendor takeover after flash vendor"
      else
@@ -1466,6 +1514,7 @@ else
        LOG WARNING "overlay supposed to be minus /vendor takeover after flash vendor"
      fi
    fi
  fi
  check_eq "${A}" "$(adb_cat /system/hello)" "/system content after flash vendor"
  check_eq "${SYSTEM_INO}" "$(adb_sh stat --format=%i /system/hello </dev/null)" "system inode after flash vendor"
  adb_sh ls /system >/dev/null || die "ls /system"
@@ -1566,54 +1615,5 @@ if ${is_bootloader_fastboot} && [ -n "${scratch_partition}" ]; then
    die -t ${T} "remount failed"
fi

LOG RUN "test raw remount commands"

fixup_from_fastboot() {
  inFastboot || return 1
  if [ -n "${ACTIVE_SLOT}" ]; then
    local active_slot=`get_active_slot`
    if [ X"${ACTIVE_SLOT}" != X"${active_slot}" ]; then
      LOG WARNING "Active slot changed from ${ACTIVE_SLOT} to ${active_slot}"
    else
      LOG WARNING "Active slot to be set to ${ACTIVE_SLOT}"
    fi
    fastboot --set-active=${ACTIVE_SLOT}
  fi
  fastboot reboot
  adb_wait ${ADB_WAIT}
}

# Prerequisite is a prepped device from above.
adb_reboot &&
  adb_wait ${ADB_WAIT} ||
  fixup_from_fastboot ||
  die "lost device after reboot to ro state `usb_status`"
adb_sh grep " /vendor .* rw," /proc/mounts >/dev/null </dev/null &&
  die "/vendor is not read-only"
adb_su mount -o rw,remount /vendor </dev/null ||
  die "remount command"
adb_sh grep " /vendor .* rw," /proc/mounts >/dev/null </dev/null ||
  die "/vendor is not read-write"
LOG OK "mount -o rw,remount command works"

# Prerequisite is an overlayfs deconstructed device but with verity disabled.
# This also saves a lot of 'noise' from the command doing a mkfs on backing
# storage and all the related tuning and adjustment.
surgically_wipe_overlayfs || true
adb_reboot &&
  adb_wait ${ADB_WAIT} ||
  fixup_from_fastboot ||
  die "lost device after reboot after wipe `usb_status`"
adb_sh grep " /vendor .* rw," /proc/mounts >/dev/null </dev/null &&
  die "/vendor is not read-only"
adb_su remount vendor </dev/null ||
  die "remount command"
adb_su df -k </dev/null | skip_unrelated_mounts >&2
adb_sh grep " /vendor .* rw," /proc/mounts >/dev/null </dev/null ||
  die "/vendor is not read-write"
adb_sh grep " \(/system\|/\) .* rw," /proc/mounts >/dev/null </dev/null &&
  die "/system is not read-only"
LOG OK "remount command works from scratch"


LOG PASSED "adb remount test"