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

Commit c2cdaf18 authored by Treehugger Robot's avatar Treehugger Robot Committed by Gerrit Code Review
Browse files

Merge changes Ia1c401b8,I571fb7da,I47999569

* changes:
  bootstat: Do not allow unknown boot reasons to land in first field.
  bootstat: move boot reason validation transformation policy into subroutine.
  bootstat: test: fix Its_Just_So_Hard_reboot
parents b5f090d8 dafced93
Loading
Loading
Loading
Loading
+18 −5
Original line number Diff line number Diff line
@@ -873,17 +873,30 @@ 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() {
  if isDebuggable; then       # see below
    duration_test
  else
    duration_test `expr ${DURATION_DEFAULT} + ${DURATION_DEFAULT}`
  fi
  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"
  # Do not leave this test with an illegal value in persist.sys.boot.reason
  save_ret=${?}           # hold on to error code from above two lines
  if isDebuggable; then   # can do this easy, or we can do this hard.
    adb shell su root setprop persist.sys.boot.reason reboot,its_just_so_hard
  if checkDebugBuild; then
    flag=""
    ( exit ${save_ret} )  # because one can not just do ?=${save_ret}
  else
    flag="--allow_failure"
    report_bootstat_logs reboot,its_just_so_hard  # report what we have so far
    # user build mitigation
    adb shell reboot its_just_so_hard
    wait_for_screen
    ( exit ${save_ret} )  # because one can not just do ?=${save_ret}
    EXPECT_PROPERTY sys.boot.reason reboot,its_just_so_hard
  fi
  # Ensure persist.sys.boot.reason now valid, failure here acts as a signal
  # that we could choke up following tests.  For example test_properties.
  EXPECT_PROPERTY persist.sys.boot.reason reboot,its_just_so_hard ${flag}
  report_bootstat_logs reboot,its_just_so_hard
}
+17 −11
Original line number Diff line number Diff line
@@ -225,6 +225,8 @@ const std::map<std::string, int32_t> kBootReasonMap = {
    {"reboot,longkey", 85},
    {"reboot,2sec", 86},
    {"shutdown,thermal,battery", 87},
    {"reboot,its_just_so_hard", 88},  // produced by boot_reason_test
    {"reboot,Its Just So Hard", 89},  // produced by boot_reason_test
};

// Converts a string value representing the reason the system booted to an
@@ -351,10 +353,18 @@ bool addKernelPanicSubReason(const std::string& console, std::string& ret) {
char tounderline(char c) {
  return ::isblank(c) ? '_' : c;
}

char toprintable(char c) {
  return ::isprint(c) ? c : '?';
}

// Cleanup boot_reason regarding acceptable character set
void transformReason(std::string& reason) {
  std::transform(reason.begin(), reason.end(), reason.begin(), ::tolower);
  std::transform(reason.begin(), reason.end(), reason.begin(), tounderline);
  std::transform(reason.begin(), reason.end(), reason.begin(), toprintable);
}

const char system_reboot_reason_property[] = "sys.boot.reason";
const char last_reboot_reason_property[] = LAST_REBOOT_REASON_PROPERTY;
const char bootloader_reboot_reason_property[] = "ro.boot.bootreason";
@@ -368,10 +378,7 @@ std::string BootReasonStrToReason(const std::string& boot_reason) {
  // If sys.boot.reason == ro.boot.bootreason, let's re-evaluate
  if (reason == ret) ret = "";

  // Cleanup boot_reason regarding acceptable character set
  std::transform(reason.begin(), reason.end(), reason.begin(), ::tolower);
  std::transform(reason.begin(), reason.end(), reason.begin(), tounderline);
  std::transform(reason.begin(), reason.end(), reason.begin(), toprintable);
  transformReason(reason);

  // Is the current system boot reason sys.boot.reason valid?
  if (!isKnownRebootReason(ret)) ret = "";
@@ -460,18 +467,20 @@ std::string BootReasonStrToReason(const std::string& boot_reason) {
        pos += strlen(cmd);
        std::string subReason(content.substr(pos, max_reason_length));
        for (pos = 0; pos < subReason.length(); ++pos) {
          char c = tounderline(subReason[pos]);
          char c = subReason[pos];
          if (!::isprint(c) || (c == '\'')) {
            subReason.erase(pos);
            break;
          }
          subReason[pos] = ::tolower(c);
        }
        transformReason(subReason);
        if (subReason != "") {  // Will not land "reboot" as that is too blunt.
          if (isKernelRebootReason(subReason)) {
            ret = "reboot," + subReason;  // User space can't talk kernel reasons.
          } else {
          } else if (isKnownRebootReason(subReason)) {
            ret = subReason;
          } else {
            ret = "reboot," + subReason;  // legitimize unknown reasons
          }
        }
      }
@@ -563,10 +572,7 @@ std::string BootReasonStrToReason(const std::string& boot_reason) {
      // Content buffer no longer will have console data. Beware if more
      // checks added below, that depend on parsing console content.
      content = GetProperty(last_reboot_reason_property);
      // Cleanup last_boot_reason regarding acceptable character set
      std::transform(content.begin(), content.end(), content.begin(), ::tolower);
      std::transform(content.begin(), content.end(), content.begin(), tounderline);
      std::transform(content.begin(), content.end(), content.begin(), toprintable);
      transformReason(content);

      // Anything in last is better than 'super-blunt' reboot or shutdown.
      if ((ret == "") || (ret == "reboot") || (ret == "shutdown") || !isBluntRebootReason(content)) {