| // Copyright 2020 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include "src/developer/forensics/feedback/reboot_log/reboot_reason.h" |
| |
| #include <fuchsia/feedback/cpp/fidl.h> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "src/developer/forensics/utils/cobalt/metrics.h" |
| |
| namespace forensics { |
| namespace feedback { |
| namespace { |
| |
| TEST(RebootReasonTest, NotParseable) { |
| const auto reason = RebootReason::kNotParseable; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kUnknown); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-reboot-log-not-parseable"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-reboot-log-not-parseable"); |
| EXPECT_EQ(ToCrashProgramName(reason), "reboot-log"); |
| EXPECT_EQ(ToFidlRebootReason(reason), std::nullopt); |
| } |
| |
| TEST(RebootReasonTest, Cold) { |
| const auto reason = RebootReason::kCold; |
| |
| EXPECT_FALSE(IsCrash(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kCold); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::COLD); |
| } |
| |
| TEST(RebootReasonTest, Spontaneous) { |
| const auto reason = RebootReason::kSpontaneous; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kBriefPowerLoss); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-brief-power-loss"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-brief-power-loss"); |
| EXPECT_EQ(ToCrashProgramName(reason), "device"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::BRIEF_POWER_LOSS); |
| } |
| |
| TEST(RebootReasonTest, KernelPanic) { |
| const auto reason = RebootReason::kKernelPanic; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kKernelPanic); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-kernel-panic"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-kernel-panic"); |
| EXPECT_EQ(ToCrashProgramName(reason), "kernel"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::KERNEL_PANIC); |
| } |
| |
| TEST(RebootReasonTest, OOM) { |
| const auto reason = RebootReason::kOOM; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kSystemOutOfMemory); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-oom"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-oom"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::SYSTEM_OUT_OF_MEMORY); |
| } |
| |
| TEST(RebootReasonTest, HardwareWatchdogTimeout) { |
| const auto reason = RebootReason::kHardwareWatchdogTimeout; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kHardwareWatchdogTimeout); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-hw-watchdog-timeout"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-hw-watchdog-timeout"); |
| EXPECT_EQ(ToCrashProgramName(reason), "device"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::HARDWARE_WATCHDOG_TIMEOUT); |
| } |
| |
| TEST(RebootReasonTest, SoftwareWatchdogTimeout) { |
| const auto reason = RebootReason::kSoftwareWatchdogTimeout; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kSoftwareWatchdogTimeout); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-sw-watchdog-timeout"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-sw-watchdog-timeout"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::SOFTWARE_WATCHDOG_TIMEOUT); |
| } |
| |
| TEST(RebootReasonTest, Brownout) { |
| const auto reason = RebootReason::kBrownout; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kBrownout); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-brownout"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-brownout"); |
| EXPECT_EQ(ToCrashProgramName(reason), "device"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::BROWNOUT); |
| } |
| |
| TEST(RebootReasonTest, RootJobTermination) { |
| const auto reason = RebootReason::kRootJobTermination; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kRootJobTermination); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-root-job-termination"); |
| EXPECT_EQ(ToCrashSignature(reason, "critical_process"), |
| "fuchsia-reboot-critical_process-terminated"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::ROOT_JOB_TERMINATION); |
| } |
| |
| TEST(RebootReasonTest, GenericGraceful) { |
| const auto reason = RebootReason::kGenericGraceful; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kGenericGraceful); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-undetermined-userspace-reboot"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-undetermined-userspace-reboot"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), std::nullopt); |
| } |
| |
| TEST(RebootReasonTest, UserRequest) { |
| const auto reason = RebootReason::kUserRequest; |
| |
| EXPECT_FALSE(IsCrash(reason)); |
| EXPECT_FALSE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kUserRequest); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::USER_REQUEST); |
| } |
| |
| TEST(RebootReasonTest, SystemUpdate) { |
| const auto reason = RebootReason::kSystemUpdate; |
| |
| EXPECT_FALSE(IsCrash(reason)); |
| EXPECT_FALSE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kSystemUpdate); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::SYSTEM_UPDATE); |
| } |
| |
| TEST(RebootReasonTest, HighTemperature) { |
| const auto reason = RebootReason::kHighTemperature; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kHighTemperature); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-reboot-high-temperature"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-reboot-high-temperature"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::HIGH_TEMPERATURE); |
| } |
| |
| TEST(RebootReasonTest, SessionFailure) { |
| const auto reason = RebootReason::kSessionFailure; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_FALSE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kSessionFailure); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-session-failure"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-session-failure"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::SESSION_FAILURE); |
| } |
| |
| TEST(RebootReasonTest, SysmgrFailure) { |
| const auto reason = RebootReason::kSysmgrFailure; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kSysmgrFailure); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-sysmgr-failure"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-sysmgr-failure"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::SYSMGR_FAILURE); |
| } |
| |
| TEST(RebootReasonTest, CriticalComponentFailure) { |
| const auto reason = RebootReason::kCriticalComponentFailure; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kCriticalComponentFailure); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-critical-component-failure"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-critical-component-failure"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), |
| fuchsia::feedback::RebootReason::CRITICAL_COMPONENT_FAILURE); |
| } |
| |
| TEST(RebootReasonTest, RetrySystemUpdate) { |
| const auto reason = RebootReason::kRetrySystemUpdate; |
| |
| EXPECT_TRUE(IsCrash(reason)); |
| EXPECT_TRUE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kRetrySystemUpdate); |
| EXPECT_EQ(ToCrashSignature(reason), "fuchsia-retry-system-update"); |
| EXPECT_EQ(ToCrashSignature(reason, "unused"), "fuchsia-retry-system-update"); |
| EXPECT_EQ(ToCrashProgramName(reason), "system"); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::RETRY_SYSTEM_UPDATE); |
| } |
| |
| TEST(RebootReasonTest, ZbiSwap) { |
| const auto reason = RebootReason::kZbiSwap; |
| |
| EXPECT_FALSE(IsCrash(reason)); |
| EXPECT_FALSE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kZbiSwap); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::ZBI_SWAP); |
| } |
| |
| TEST(RebootReasonTest, FDR) { |
| const auto reason = RebootReason::kFdr; |
| |
| EXPECT_FALSE(IsCrash(reason)); |
| EXPECT_FALSE(IsFatal(reason)); |
| EXPECT_EQ(ToCobaltLastRebootReason(reason), cobalt::LastRebootReason::kFactoryDataReset); |
| EXPECT_EQ(ToFidlRebootReason(reason), fuchsia::feedback::RebootReason::FACTORY_DATA_RESET); |
| } |
| |
| } // namespace |
| } // namespace feedback |
| } // namespace forensics |