| // Copyright 2020 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 "bootid-logger/bootid_logger.h" |
| |
| #include <base/files/file_path.h> |
| #include <base/files/file_util.h> |
| #include <base/strings/string_util.h> |
| #include <base/time/time.h> |
| #include <gtest/gtest.h> |
| |
| class BootidLoggerTest : public ::testing::Test {}; |
| |
| TEST_F(BootidLoggerTest, WriteEntry) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| const std::string kBootID = "12345678901234567890123456789012"; |
| |
| const base::Time::Exploded exploded = {2020, 12, 1, 1, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID, time, base::Time(), 100)); |
| |
| const std::string expected_entry = |
| "2020-12-01T00:00:00.000000Z INFO boot_id: " + kBootID + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, WriteDuplicatedEntries) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| const std::string kBootID = "12345678901234567890123456789012"; |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 1, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE( |
| WriteBootEntry(temporary_file, kBootID, time, base::Time(), 100)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 2, 2, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| // Should return true, since the ID is duplicated but this is not a failure. |
| EXPECT_TRUE( |
| WriteBootEntry(temporary_file, kBootID, time, base::Time(), 100)); |
| } |
| |
| const std::string expected_entry = |
| "2020-12-01T00:00:00.000000Z INFO boot_id: " + kBootID + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, WriteMultipleEntries) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| const size_t kMaxEntryNum = 3; |
| const std::string kBootID1 = "12345678901234567890123456789012"; |
| const std::string kBootID2 = "12345678901234567890123456789013"; |
| const std::string kBootID3 = "12345678901234567890123456789014"; |
| const std::string kBootID4 = "12345678901234567890123456789015"; |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 1, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID1, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 2, 2, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID2, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 3, 3, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID3, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 4, 4, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID4, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| const std::string expected_entry = |
| "2020-12-02T00:00:00.000000Z INFO boot_id: " + kBootID2 + |
| "\n" |
| "2020-12-03T00:00:00.000000Z INFO boot_id: " + |
| kBootID3 + |
| "\n" |
| "2020-12-04T00:00:00.000000Z INFO boot_id: " + |
| kBootID4 + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, DiscardOldEntries) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| const size_t kMaxEntryNum = 10; |
| const std::string kBootID1 = "12345678901234567890123456789012"; |
| const std::string kBootID2 = "12345678901234567890123456789013"; |
| const std::string kBootID3 = "12345678901234567890123456789014"; |
| const std::string kBootID4 = "12345678901234567890123456789015"; |
| |
| base::Time oldest_timestamp; |
| const base::Time::Exploded exploded = {2020, 12, 1, 1, 12, 0, 0, 0}; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &oldest_timestamp)); |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 1, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID1, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 2, 2, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID2, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 3, 3, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID3, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| { |
| const base::Time::Exploded exploded = {2020, 12, 4, 4, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID4, time, oldest_timestamp, |
| kMaxEntryNum)); |
| } |
| |
| const std::string expected_entry = |
| "2020-12-02T00:00:00.000000Z INFO boot_id: " + kBootID2 + |
| "\n" |
| "2020-12-03T00:00:00.000000Z INFO boot_id: " + |
| kBootID3 + |
| "\n" |
| "2020-12-04T00:00:00.000000Z INFO boot_id: " + |
| kBootID4 + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, WriteCurrentBootEntry) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| const size_t kMaxEntryNum = 1; |
| |
| WriteCurrentBootEntry(temporary_file, base::Time(), kMaxEntryNum); |
| |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| std::string boot_entry = std::string(base::TrimWhitespaceASCII( |
| file_contents, base::TrimPositions::TRIM_TRAILING)); |
| EXPECT_TRUE(ValidateBootEntry(boot_entry)) << boot_entry; |
| std::string boot_id = ExtractBootId(boot_entry); |
| EXPECT_EQ(boot_id, GetCurrentBootId()); |
| } |
| |
| TEST_F(BootidLoggerTest, ApppendToExistingFile) { |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| // Prepare the file with the existing entries. |
| const std::string kExistingEntry1 = |
| "2020-12-01T00:00:00.000000Z INFO boot_id: " |
| "12345678901234567890123456789001\n"; |
| const std::string kExistingEntry2 = |
| "2020-12-02T00:00:00.000000Z INFO boot_id: " |
| "12345678901234567890123456789002\n"; |
| EXPECT_TRUE( |
| base::WriteFile(temporary_file, kExistingEntry1 + kExistingEntry2)); |
| |
| // Write an entry. |
| const std::string kBootID3 = "12345678901234567890123456789003"; |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 3, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE( |
| WriteBootEntry(temporary_file, kBootID3, time, base::Time(), 100)); |
| } |
| |
| // Confirms that the entry is written. |
| const std::string expected_entry = |
| kExistingEntry1 + kExistingEntry2 + |
| "2020-12-03T00:00:00.000000Z INFO boot_id: " + kBootID3 + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, KeepExistingEntryLocalTimezone) { |
| const size_t kMaxEntryNum = 999; |
| |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| // Prepare the file with the existing entries. |
| const std::string kExistingEntry1 = |
| "2020-12-01T00:00:00.000000+00:00 INFO boot_id: " |
| "12345678901234567890123456789001\n"; |
| const std::string kExistingEntry2 = |
| "2020-12-02T00:00:00.000000+00:00 INFO boot_id: " |
| "12345678901234567890123456789002\n"; |
| EXPECT_TRUE( |
| base::WriteFile(temporary_file, kExistingEntry1 + kExistingEntry2)); |
| |
| // Write an entry. |
| const std::string kBootID3 = "12345678901234567890123456789003"; |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 3, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID3, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| // Confirms that the entry is written. |
| const std::string expected_entry = |
| kExistingEntry1 + kExistingEntry2 + |
| "2020-12-03T00:00:00.000000Z INFO boot_id: " + kBootID3 + "\n"; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |
| |
| TEST_F(BootidLoggerTest, KeepExistingEntryLocalTimezoneDuplicated) { |
| const size_t kMaxEntryNum = 999; |
| |
| base::FilePath temporary_file; |
| EXPECT_TRUE(base::CreateTemporaryFile(&temporary_file)); |
| |
| // Prepare the file with the existing entries. |
| const std::string kExistingEntry1 = |
| "2020-12-01T00:00:00.000000Z INFO boot_id: " |
| "12345678901234567890123456789001\n"; |
| const std::string kBootID2 = "12345678901234567890123456789002"; |
| const std::string kExistingEntry2 = |
| "2020-12-02T00:00:00.000000Z INFO boot_id: " + kBootID2 + "\n"; |
| EXPECT_TRUE( |
| base::WriteFile(temporary_file, kExistingEntry1 + kExistingEntry2)); |
| |
| // Write an entry. |
| { |
| const base::Time::Exploded exploded = {2020, 12, 1, 3, 0, 0, 0, 0}; |
| base::Time time; |
| EXPECT_TRUE(base::Time::FromUTCExploded(exploded, &time)); |
| // Should return true, even if the ID is duplicated. |
| EXPECT_TRUE(WriteBootEntry(temporary_file, kBootID2, time, base::Time(), |
| kMaxEntryNum)); |
| } |
| |
| // Confirms that the entry is not written, since it is duplicated. |
| const std::string expected_entry = kExistingEntry1 + kExistingEntry2; |
| std::string file_contents; |
| EXPECT_TRUE(base::ReadFileToString(temporary_file, &file_contents)); |
| EXPECT_EQ(expected_entry, file_contents); |
| } |