| // Copyright 2024 The ChromiumOS Authors | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "heartd/daemon/database.h" | |
| #include <string> | |
| #include <vector> | |
| #include <base/files/scoped_temp_dir.h> | |
| #include <base/strings/stringprintf.h> | |
| #include <base/test/task_environment.h> | |
| #include <base/time/time.h> | |
| #include <gmock/gmock.h> | |
| #include <gtest/gtest.h> | |
| #include <sqlite3.h> | |
| #include "heartd/daemon/boot_record.h" | |
| namespace heartd { | |
| namespace { | |
| void VerifyEqualBootRecord(const BootRecord& record1, | |
| const BootRecord& record2) { | |
| EXPECT_EQ(record1.id, record2.id); | |
| EXPECT_EQ(record1.time, record2.time); | |
| } | |
| class DatabaseTest : public testing::Test { | |
| public: | |
| DatabaseTest() = default; | |
| ~DatabaseTest() override = default; | |
| void Init() { | |
| db_path_ = temp_dir_.GetPath().Append("test_db.db"); | |
| db_ = std::make_unique<Database>(db_path_.MaybeAsASCII()); | |
| db_->Init(); | |
| EXPECT_TRUE(db_->IsOpen()); | |
| } | |
| protected: | |
| void SetUp() override { ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); } | |
| void TearDown() override { ASSERT_TRUE(temp_dir_.Delete()); } | |
| protected: | |
| base::test::TaskEnvironment task_environment_{ | |
| base::test::TaskEnvironment::TimeSource::MOCK_TIME}; | |
| base::ScopedTempDir temp_dir_; | |
| base::FilePath db_path_; | |
| std::unique_ptr<Database> db_; | |
| }; | |
| TEST_F(DatabaseTest, CreateDatabase) { | |
| Init(); | |
| EXPECT_TRUE(db_->TableExists(kBootRecordTable)); | |
| } | |
| TEST_F(DatabaseTest, InsertBootRecord) { | |
| Init(); | |
| BootRecord boot_record1{"id1", base::Time().Now()}; | |
| BootRecord boot_record2{"id2", base::Time().Now()}; | |
| db_->InsertBootRecord(boot_record1); | |
| db_->InsertBootRecord(boot_record2); | |
| auto boot_records = db_->GetBootRecordFromTime(base::Time().Now()); | |
| EXPECT_EQ(boot_records.size(), 2); | |
| VerifyEqualBootRecord(boot_record1, boot_records[0]); | |
| VerifyEqualBootRecord(boot_record2, boot_records[1]); | |
| } | |
| TEST_F(DatabaseTest, InsertBootRecordVerifyTimeFilter) { | |
| Init(); | |
| BootRecord boot_record1{"id1", base::Time().Now()}; | |
| db_->InsertBootRecord(boot_record1); | |
| task_environment_.FastForwardBy(base::Seconds(10)); | |
| BootRecord boot_record2{"id2", base::Time().Now()}; | |
| db_->InsertBootRecord(boot_record2); | |
| auto boot_records = | |
| db_->GetBootRecordFromTime(base::Time().Now() - base::Seconds(5)); | |
| EXPECT_EQ(boot_records.size(), 1); | |
| VerifyEqualBootRecord(boot_record2, boot_records[0]); | |
| } | |
| TEST_F(DatabaseTest, RemoveOutdatedData) { | |
| Init(); | |
| BootRecord boot_record1{"id_expired", base::Time().Now()}; | |
| db_->InsertBootRecord(boot_record1); | |
| task_environment_.FastForwardBy(base::Days(31)); | |
| BootRecord boot_record2{"id_valid", base::Time().Now()}; | |
| db_->InsertBootRecord(boot_record2); | |
| db_->RemoveOutdatedData(kBootRecordTable); | |
| auto boot_records = | |
| db_->GetBootRecordFromTime(base::Time().Now() - base::Days(90)); | |
| EXPECT_EQ(boot_records.size(), 1); | |
| VerifyEqualBootRecord(boot_record2, boot_records[0]); | |
| } | |
| } // namespace | |
| } // namespace heartd |