blob: 0471157b36dcfeff07bba0309e04b4dc7541e15f [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 "croslog/boot_records.h"
#include <memory>
#include <string>
#include <utility>
#include "base/files/file_path.h"
#include "gtest/gtest.h"
#include "croslog/log_line_reader.h"
namespace croslog {
class BootRecordsTest : public ::testing::Test {
public:
BootRecordsTest() = default;
BootRecordsTest(const BootRecordsTest&) = delete;
BootRecordsTest& operator=(const BootRecordsTest&) = delete;
static base::Time TimeFromExploded(
int year, int month, int day_of_month, int hour, int minute, int second) {
base::Time time;
EXPECT_TRUE(base::Time::FromUTCExploded(
base::Time::Exploded{year, month, 0, day_of_month, hour, minute, second,
0},
&time));
return time;
}
};
TEST_F(BootRecordsTest, Load) {
std::vector<BootRecords::BootEntry> set_entries;
set_entries.emplace_back(TimeFromExploded(2020, 7, 1, 16, 1, 17),
"46640bbceeb149a696171d1ea34516ad");
set_entries.emplace_back(TimeFromExploded(2020, 7, 3, 2, 35, 0),
"9fa644cb05dc4e3ebe3be322ac8d1e86");
set_entries.emplace_back(TimeFromExploded(2020, 7, 3, 7, 23, 24),
"59f7d9025ea044568318171a9b4d375e");
BootRecords boot_records(std::move(set_entries));
const auto& entries = boot_records.boot_ranges();
EXPECT_EQ(3, entries.size());
EXPECT_EQ("46640bbceeb149a696171d1ea34516ad", entries[0].boot_id());
EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86", entries[1].boot_id());
EXPECT_EQ("59f7d9025ea044568318171a9b4d375e", entries[2].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 1, 16, 1, 17), entries[0].boot_time());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 2, 35, 0), entries[1].boot_time());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 7, 23, 24), entries[2].boot_time());
}
TEST_F(BootRecordsTest, GetBootRange) {
std::vector<BootRecords::BootEntry> set_entries;
set_entries.emplace_back(TimeFromExploded(2020, 7, 3, 2, 35, 0),
"9fa644cb05dc4e3ebe3be322ac8d1e86");
set_entries.emplace_back(TimeFromExploded(2020, 7, 3, 7, 23, 24),
"59f7d9025ea044568318171a9b4d375e");
BootRecords boot_records(std::move(set_entries));
const auto kFirstBootRange =
BootRecords::BootRange(TimeFromExploded(2020, 7, 3, 2, 35, 0),
TimeFromExploded(2020, 7, 3, 7, 23, 24),
"9fa644cb05dc4e3ebe3be322ac8d1e86");
const auto kSecondBootRange = BootRecords::BootRange(
TimeFromExploded(2020, 7, 3, 7, 23, 24), base::Time::Max(),
"59f7d9025ea044568318171a9b4d375e");
// Absolute boot ids:
EXPECT_EQ(
kFirstBootRange,
boot_records.GetBootRange("9fa644cb05dc4e3ebe3be322ac8d1e86").value());
EXPECT_EQ(
kSecondBootRange,
boot_records.GetBootRange("59f7d9025ea044568318171a9b4d375e").value());
EXPECT_FALSE(boot_records.GetBootRange("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx")
.has_value());
EXPECT_FALSE(boot_records.GetBootRange("59F7D9025EA044568318171A9B4D375E")
.has_value());
// Relative boot offset (zero or negative):
EXPECT_EQ(kFirstBootRange, boot_records.GetBootRange("-1").value());
EXPECT_EQ(kSecondBootRange, boot_records.GetBootRange("-0").value());
EXPECT_EQ(kSecondBootRange, boot_records.GetBootRange("0").value());
EXPECT_EQ(kSecondBootRange, boot_records.GetBootRange("+0").value());
// Relative boot offset (positive):
EXPECT_FALSE(boot_records.GetBootRange("1").has_value());
EXPECT_FALSE(boot_records.GetBootRange("+1").has_value());
// Empty:
EXPECT_EQ(kSecondBootRange, boot_records.GetBootRange("").value());
EXPECT_FALSE(boot_records.GetBootRange("-2").has_value());
// Invalid:
EXPECT_FALSE(boot_records.GetBootRange("INVALID-BOOTID").has_value());
}
TEST_F(BootRecordsTest, LoadFromFile) {
base::FilePath file_path("./testdata/TEST_BOOT_ID_LOG");
BootRecords boot_records(file_path);
const auto& entries = boot_records.boot_ranges();
EXPECT_EQ(3, entries.size());
EXPECT_EQ("46640bbceeb149a696171d1ea34516ad", entries[0].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 1, 16, 1, 17), entries[0].boot_time());
EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86", entries[1].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 2, 35, 0), entries[1].boot_time());
EXPECT_EQ("59f7d9025ea044568318171a9b4d375e", entries[2].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 7, 23, 24), entries[2].boot_time());
}
TEST_F(BootRecordsTest, LoadFromInvalidFile) {
base::FilePath file_path("./testdata/TEST_BOOT_ID_LOG_INVALID");
BootRecords boot_records(file_path);
const auto& entries = boot_records.boot_ranges();
EXPECT_EQ(3, entries.size());
EXPECT_EQ("46640bbceeb149a696171d1ea34516ad", entries[0].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 1, 16, 1, 17), entries[0].boot_time());
EXPECT_EQ("9fa644cb05dc4e3ebe3be322ac8d1e86", entries[1].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 2, 35, 0), entries[1].boot_time());
// The invalid entry should be skipped.
EXPECT_EQ("59f7d9025ea044568318171a9b4d375e", entries[2].boot_id());
EXPECT_EQ(TimeFromExploded(2020, 7, 3, 7, 23, 24), entries[2].boot_time());
}
} // namespace croslog