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
This commit is contained in:
Treehugger Robot 2017-10-27 00:28:32 +00:00 committed by Gerrit Code Review
commit c2cdaf1840
2 changed files with 35 additions and 16 deletions

View file

@ -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() {
duration_test
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"
adb shell su root setprop persist.sys.boot.reason reboot,its_just_so_hard
if checkDebugBuild; then
flag=""
# 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
( 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
}

View file

@ -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)) {