| // Copyright 2021 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/annotations/startup_annotations.h" |
| |
| #include <lib/syslog/cpp/macros.h> |
| |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "src/developer/forensics/feedback/annotations/constants.h" |
| #include "src/developer/forensics/feedback/constants.h" |
| #include "src/developer/forensics/feedback/reboot_log/annotations.h" |
| #include "src/developer/forensics/feedback_data/constants.h" |
| #include "src/developer/forensics/testing/gmatchers.h" |
| #include "src/developer/forensics/testing/gpretty_printers.h" |
| #include "src/developer/forensics/testing/scoped_memfs_manager.h" |
| #include "src/lib/files/file.h" |
| #include "src/lib/files/path.h" |
| |
| namespace forensics::feedback { |
| namespace { |
| |
| using ::testing::_; |
| using ::testing::Key; |
| using ::testing::Pair; |
| using ::testing::UnorderedElementsAre; |
| using ::testing::UnorderedElementsAreArray; |
| |
| class StartupAnnotationsTest : public ::testing::Test { |
| public: |
| void SetUp() override {} |
| |
| void TearDown() override {} |
| |
| void WriteFile(const std::string& path, const std::string& data) { |
| FX_CHECK(files::WriteFile(path, data)) << "Failed to write to " << path; |
| } |
| |
| void WriteFiles(const std::map<std::string, std::string>& paths_and_data) { |
| for (const auto& [path, data] : paths_and_data) { |
| WriteFile(path, data); |
| } |
| } |
| }; |
| |
| TEST_F(StartupAnnotationsTest, Keys) { |
| const RebootLog reboot_log(RebootReason::kOOM, "", std::nullopt, std::nullopt); |
| const auto startup_annotations = GetStartupAnnotations(reboot_log); |
| |
| EXPECT_THAT(startup_annotations, UnorderedElementsAreArray({ |
| Key(kBuildBoardKey), |
| Key(kBuildProductKey), |
| Key(kBuildLatestCommitDateKey), |
| Key(kBuildVersionKey), |
| Key(kBuildVersionPreviousBootKey), |
| Key(kBuildIsDebugKey), |
| Key(kDeviceBoardNameKey), |
| Key(kDeviceNumCPUsKey), |
| Key(kSystemBootIdCurrentKey), |
| Key(kSystemBootIdPreviousKey), |
| Key(kSystemLastRebootReasonKey), |
| Key(kSystemLastRebootUptimeKey), |
| })); |
| } |
| |
| TEST_F(StartupAnnotationsTest, Values_FilesPresent) { |
| testing::ScopedMemFsManager memfs_manager; |
| |
| memfs_manager.Create("/config/build-info"); |
| memfs_manager.Create("/cache"); |
| memfs_manager.Create("/data"); |
| memfs_manager.Create("/tmp"); |
| |
| WriteFiles({ |
| {kBuildBoardPath, "board"}, |
| {kBuildProductPath, "product"}, |
| {kBuildCommitDatePath, "commit-date"}, |
| {kCurrentBuildVersionPath, "current-version"}, |
| {kPreviousBuildVersionPath, "previous-version"}, |
| {kCurrentBootIdPath, "current-boot-id"}, |
| {kPreviousBootIdPath, "previous-boot-id"}, |
| }); |
| |
| const RebootLog reboot_log(RebootReason::kOOM, "", std::nullopt, std::nullopt); |
| const auto startup_annotations = GetStartupAnnotations(reboot_log); |
| |
| EXPECT_THAT( |
| startup_annotations, |
| UnorderedElementsAre( |
| Pair(kBuildBoardKey, "board"), Pair(kBuildProductKey, "product"), |
| Pair(kBuildLatestCommitDateKey, "commit-date"), Pair(kBuildVersionKey, "current-version"), |
| Pair(kBuildVersionPreviousBootKey, "previous-version"), Pair(kBuildIsDebugKey, _), |
| Pair(kDeviceBoardNameKey, _), Pair(kDeviceNumCPUsKey, _), |
| Pair(kSystemBootIdCurrentKey, "current-boot-id"), |
| Pair(kSystemBootIdPreviousKey, "previous-boot-id"), |
| Pair(kSystemLastRebootReasonKey, LastRebootReasonAnnotation(reboot_log)), |
| Pair(kSystemLastRebootUptimeKey, LastRebootUptimeAnnotation(reboot_log)))); |
| } |
| |
| TEST_F(StartupAnnotationsTest, Values_FilesMissing) { |
| const RebootLog reboot_log(RebootReason::kOOM, "", std::nullopt, std::nullopt); |
| const auto startup_annotations = GetStartupAnnotations(reboot_log); |
| |
| EXPECT_THAT( |
| startup_annotations, |
| UnorderedElementsAre( |
| Pair(kBuildBoardKey, Error::kFileReadFailure), |
| Pair(kBuildProductKey, Error::kFileReadFailure), |
| Pair(kBuildLatestCommitDateKey, Error::kFileReadFailure), |
| Pair(kBuildVersionKey, Error::kFileReadFailure), |
| Pair(kBuildVersionPreviousBootKey, Error::kFileReadFailure), Pair(kBuildIsDebugKey, _), |
| Pair(kDeviceBoardNameKey, _), Pair(kDeviceNumCPUsKey, _), |
| Pair(kSystemBootIdCurrentKey, Error::kFileReadFailure), |
| Pair(kSystemBootIdPreviousKey, Error::kFileReadFailure), |
| Pair(kSystemLastRebootReasonKey, LastRebootReasonAnnotation(reboot_log)), |
| Pair(kSystemLastRebootUptimeKey, LastRebootUptimeAnnotation(reboot_log)))); |
| } |
| |
| } // namespace |
| } // namespace forensics::feedback |