| // Copyright 2021 The Chromium OS 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 <memory> |
| #include <utility> |
| |
| #include <base/files/file_util.h> |
| #include <base/files/scoped_temp_dir.h> |
| #include <brillo/namespaces/mock_platform.h> |
| #include <gtest/gtest.h> |
| |
| #include "minios/logger.h" |
| #include "minios/mock_disk_util.h" |
| |
| using ::testing::_; |
| using ::testing::DoAll; |
| using ::testing::Return; |
| using ::testing::SetArgPointee; |
| using ::testing::StrictMock; |
| |
| namespace minios { |
| |
| class LoggerTest : public ::testing::Test { |
| public: |
| void SetUp() override { |
| ASSERT_TRUE(root_path_.CreateUniqueTempDir()); |
| auto mock_disk_util = std::make_unique<StrictMock<MockDiskUtil>>(); |
| mock_disk_util_ptr_ = mock_disk_util.get(); |
| auto mock_platform = std::make_unique<StrictMock<brillo::MockPlatform>>(); |
| mock_platform_ptr_ = mock_platform.get(); |
| logger_ = std::make_unique<Logger>(std::move(mock_disk_util), |
| std::move(mock_platform), |
| root_path_.GetPath()); |
| } |
| |
| protected: |
| base::ScopedTempDir root_path_; |
| |
| MockDiskUtil* mock_disk_util_ptr_; |
| brillo::MockPlatform* mock_platform_ptr_; |
| std::unique_ptr<Logger> logger_; |
| }; |
| |
| TEST_F(LoggerTest, DumpLogsIntoStatefulNoDriveExists) { |
| EXPECT_CALL(*mock_disk_util_ptr_, GetFixedDrive()) |
| .WillOnce(Return(base::FilePath())); |
| EXPECT_FALSE(logger_->DumpLogsIntoStateful()); |
| } |
| |
| TEST_F(LoggerTest, DumpLogsIntoStatefulNoStatefulExists) { |
| base::ScopedTempDir tmp_dir; |
| ASSERT_TRUE(tmp_dir.CreateUniqueTempDir()); |
| const base::FilePath drive = tmp_dir.GetPath(); |
| |
| EXPECT_CALL(*mock_disk_util_ptr_, GetFixedDrive()).WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_disk_util_ptr_, GetStatefulPartition(_)) |
| .WillOnce(Return(base::FilePath())); |
| EXPECT_FALSE(logger_->DumpLogsIntoStateful()); |
| } |
| |
| TEST_F(LoggerTest, DumpLogIntoStatefulMountFailure) { |
| base::ScopedTempDir tmp_dir; |
| ASSERT_TRUE(tmp_dir.CreateUniqueTempDir()); |
| const base::FilePath drive = tmp_dir.GetPath(); |
| |
| EXPECT_CALL(*mock_disk_util_ptr_, GetFixedDrive()).WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_disk_util_ptr_, GetStatefulPartition(_)) |
| .WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_platform_ptr_, Mount(_, _, _, _, _)).WillOnce(Return(-1)); |
| EXPECT_FALSE(logger_->DumpLogsIntoStateful()); |
| } |
| |
| TEST_F(LoggerTest, DumpLogIntoStatefulUnmountFailureIsSuccess) { |
| base::ScopedTempDir tmp_dir; |
| ASSERT_TRUE(tmp_dir.CreateUniqueTempDir()); |
| const base::FilePath drive = tmp_dir.GetPath(); |
| |
| EXPECT_CALL(*mock_disk_util_ptr_, GetFixedDrive()).WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_disk_util_ptr_, GetStatefulPartition(_)) |
| .WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_platform_ptr_, Mount(_, _, _, _, _)).WillOnce(Return(0)); |
| EXPECT_CALL(*mock_platform_ptr_, Unmount(_, _, _)).WillOnce(Return(false)); |
| // Failing to unmount is still successful. |
| EXPECT_TRUE(logger_->DumpLogsIntoStateful()); |
| } |
| |
| TEST_F(LoggerTest, DumpLogIntoStatefulSuccess) { |
| base::ScopedTempDir tmp_dir; |
| ASSERT_TRUE(tmp_dir.CreateUniqueTempDir()); |
| const base::FilePath drive = tmp_dir.GetPath(); |
| |
| // Create sample log files. |
| const base::FilePath kLogName("some-log-file"); |
| ASSERT_TRUE( |
| base::WriteFile(root_path_.GetPath().Append(kLogName), "some-logging")); |
| |
| EXPECT_CALL(*mock_disk_util_ptr_, GetFixedDrive()).WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_disk_util_ptr_, GetStatefulPartition(_)) |
| .WillOnce(Return(drive)); |
| EXPECT_CALL(*mock_platform_ptr_, Mount(_, _, _, _, _)).WillOnce(Return(0)); |
| EXPECT_CALL(*mock_platform_ptr_, Unmount(_, _, _)).WillOnce(Return(true)); |
| EXPECT_TRUE(logger_->DumpLogsIntoStateful()); |
| |
| // Check that logs are copied. |
| EXPECT_TRUE( |
| base::PathExists(logger_->GetMountPath().Append(kMiniOSLogsDirectory))); |
| EXPECT_TRUE(base::PathExists(logger_->GetMountPath() |
| .Append(kMiniOSLogsDirectory) |
| .Append(root_path_.GetPath().BaseName()) |
| .Append(kLogName))); |
| } |
| |
| } // namespace minios |