| // 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/utils/previous_boot_file.h" | |
| #include <lib/syslog/cpp/macros.h> | |
| #include <gtest/gtest.h> | |
| #include "src/lib/files/directory.h" | |
| #include "src/lib/files/file.h" | |
| #include "src/lib/files/path.h" | |
| namespace forensics { | |
| namespace { | |
| constexpr const char* kFileName = "file.txt"; | |
| constexpr const char* kFileContent = "file content"; | |
| inline auto CleanUpFile(const std::string& dir) { | |
| ASSERT_TRUE(files::DeletePath(files::JoinPath(dir, kFileName), /*recursive=*/false)); | |
| } | |
| inline auto CleanUpDataFile() { return CleanUpFile("/data"); } | |
| inline auto CleanUpCacheFile() { return CleanUpFile("/cache"); } | |
| inline auto CleanUpTmpFile() { return CleanUpFile("/tmp"); } | |
| inline auto WriteFile(const std::string& dir) { | |
| ASSERT_TRUE(files::WriteFile(files::JoinPath(dir, kFileName), kFileContent)); | |
| } | |
| inline auto WriteDataFile() { return WriteFile("/data"); } | |
| inline auto WriteCacheFile() { return WriteFile("/cache"); } | |
| TEST(PreviousBootFileTest, MoveDataFile) { | |
| WriteDataFile(); | |
| auto previous_boot_file = PreviousBootFile::FromData(/*is_first_instance=*/true, kFileName); | |
| std::string read_file_content; | |
| ASSERT_TRUE(files::ReadFileToString(previous_boot_file.PreviousBootPath(), &read_file_content)); | |
| EXPECT_EQ(kFileContent, read_file_content); | |
| CleanUpDataFile(); | |
| CleanUpTmpFile(); | |
| } | |
| TEST(PreviousBootFileTest, MoveCacheFile) { | |
| WriteCacheFile(); | |
| auto previous_boot_file = PreviousBootFile::FromCache(/*is_first_instance=*/true, kFileName); | |
| std::string read_file_content; | |
| ASSERT_TRUE(files::ReadFileToString(previous_boot_file.PreviousBootPath(), &read_file_content)); | |
| EXPECT_EQ(kFileContent, read_file_content); | |
| CleanUpCacheFile(); | |
| CleanUpTmpFile(); | |
| } | |
| TEST(PreviousBootFileTest, DataFileDoesNotExist) { | |
| auto previous_boot_file = PreviousBootFile::FromData(/*is_first_instance=*/true, kFileName); | |
| ASSERT_FALSE(files::IsFile(previous_boot_file.PreviousBootPath())); | |
| CleanUpDataFile(); | |
| CleanUpTmpFile(); | |
| } | |
| TEST(PreviousBootFileTest, CacheFileDoesNotExist) { | |
| auto previous_boot_file = PreviousBootFile::FromCache(/*is_first_instance=*/true, kFileName); | |
| ASSERT_FALSE(files::IsFile(previous_boot_file.PreviousBootPath())); | |
| CleanUpCacheFile(); | |
| CleanUpTmpFile(); | |
| } | |
| TEST(PreviousBootFileTest, CreateTmpDir) { | |
| ASSERT_TRUE(files::CreateDirectory("/cache/dir")); | |
| ASSERT_TRUE(files::WriteFile("/cache/dir/file.txt", kFileContent)); | |
| auto previous_boot_file = PreviousBootFile::FromCache(/*is_first_instance=*/true, "dir/file.txt"); | |
| std::string read_file_content; | |
| ASSERT_TRUE(files::ReadFileToString(previous_boot_file.PreviousBootPath(), &read_file_content)); | |
| EXPECT_EQ(read_file_content, kFileContent); | |
| ASSERT_TRUE(files::DeletePath("/cache/dir", /*recursive=*/true)); | |
| ASSERT_TRUE(files::DeletePath("/tmp/dir", /*recursive=*/true)); | |
| } | |
| TEST(PreviousBootFileTest, TmpFileAlreadyExists) { | |
| ASSERT_TRUE(files::WriteFile(files::JoinPath("/tmp", kFileName), "OTHER STUFF")); | |
| WriteCacheFile(); | |
| auto previous_boot_file = PreviousBootFile::FromCache(/*is_first_instance=*/false, kFileName); | |
| std::string read_file_content; | |
| ASSERT_TRUE(files::ReadFileToString(previous_boot_file.PreviousBootPath(), &read_file_content)); | |
| EXPECT_EQ("OTHER STUFF", read_file_content); | |
| CleanUpCacheFile(); | |
| CleanUpTmpFile(); | |
| } | |
| TEST(PreviousBootFileTest, TmpFileDoesNotExist) { | |
| WriteCacheFile(); | |
| auto previous_boot_file = PreviousBootFile::FromCache(/*is_first_instance=*/false, kFileName); | |
| ASSERT_FALSE(files::IsFile(previous_boot_file.PreviousBootPath())); | |
| CleanUpCacheFile(); | |
| CleanUpTmpFile(); | |
| } | |
| } // namespace | |
| } // namespace forensics |