blob: 953a6462bf0b72ed32b12d46cc925c6eaa097cca [file] [log] [blame]
// 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 =
base::TrimWhitespaceASCII(file_contents,
base::TrimPositions::TRIM_TRAILING)
.as_string();
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);
}