blob: 63d53d7255cbd0f1fbecbd8fbc7b4771fdab20e8 [file] [log] [blame]
// Copyright 2023 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "content/browser/tracing/trace_report_database.h"
#include <string>
#include "base/files/scoped_file.h"
#include "base/functional/bind.h"
#include "base/strings/string_util.h"
#include "base/time/time.h"
#include "base/uuid.h"
#include "testing/gtest/include/gtest/gtest.h"
#include "third_party/abseil-cpp/absl/types/optional.h"
namespace content {
class TraceReportDatabaseTest : public testing::Test {
protected:
void SetUp() override { ASSERT_TRUE(trace_report_.OpenDatabaseForTesting()); }
TraceReportDatabase trace_report_;
};
TEST_F(TraceReportDatabaseTest, CreatingAndDroppingLocalTraceTable) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
}
TEST_F(TraceReportDatabaseTest, AddingNewReport) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
// Create Report for the local traces database.
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario1";
new_report.upload_rule_name = "rules1";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto1";
const auto new_size = new_report.total_size;
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
auto received_reports = trace_report_.GetAllReports();
EXPECT_EQ(received_reports.size(), 1u);
EXPECT_EQ(received_reports[0].scenario_name, "scenario1");
EXPECT_EQ(received_reports[0].upload_rule_name, "rules1");
EXPECT_EQ(received_reports[0].total_size, new_size);
}
TEST_F(TraceReportDatabaseTest, RetreiveProtoFromTrace) {
// Create Report for the local traces database.
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario2";
new_report.upload_rule_name = "rules2";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto2";
const auto copie_value = new_report.uuid;
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
absl::optional<std::string> received_value =
trace_report_.GetProtoValue(copie_value);
ASSERT_TRUE(received_value);
EXPECT_EQ(received_value, "Proto2");
}
TEST_F(TraceReportDatabaseTest, DeletingSingleTrace) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
// Create Report for the local traces database.
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario3";
new_report.upload_rule_name = "rules3";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto3";
const auto copie_value = new_report.uuid;
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
EXPECT_EQ(trace_report_.GetAllReports().size(), 1u);
ASSERT_TRUE(trace_report_.DeleteTrace(copie_value));
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
}
TEST_F(TraceReportDatabaseTest, DeletingAllTraces) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
// Create multiple NewReport and add to the local_traces table.
for (int i = 0; i < 5; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
EXPECT_EQ(trace_report_.GetAllReports().size(), 5u);
ASSERT_TRUE(trace_report_.DeleteAllTraces());
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
}
TEST_F(TraceReportDatabaseTest, DeletingTracesInRange) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
const base::Time today = base::Time::Now();
// Create multiple NewReport and add to the local_traces table.
for (int i = 0; i < 5; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.creation_time = today;
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
for (int i = 0; i < 3; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.creation_time = base::Time(today - base::Days(20));
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
for (int i = 0; i < 2; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.creation_time = base::Time(today - base::Days(10));
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
EXPECT_EQ(trace_report_.GetAllReports().size(), 10u);
const base::Time start = base::Time(today - base::Days(20));
const base::Time end = base::Time(today - base::Days(10));
ASSERT_TRUE(trace_report_.DeleteTracesInDateRange(start, end));
EXPECT_EQ(trace_report_.GetAllReports().size(), 5u);
}
TEST_F(TraceReportDatabaseTest, DeleteTracesOlderThan) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
const base::Time today = base::Time::Now();
// Create multiple NewReport and add to the local_traces table.
for (int i = 0; i < 5; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.creation_time = today;
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
for (int i = 0; i < 3; i++) {
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.creation_time = base::Time(today - base::Days(20));
new_report.scenario_name = "scenario";
new_report.upload_rule_name = "rules";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto";
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
}
EXPECT_EQ(trace_report_.GetAllReports().size(), 8u);
ASSERT_TRUE(trace_report_.DeleteTracesOlderThan(base::Days(10)));
EXPECT_EQ(trace_report_.GetAllReports().size(), 5u);
}
TEST_F(TraceReportDatabaseTest, UserRequestedUpload) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
// Create Report for the local traces database.
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario3";
new_report.upload_rule_name = "rules3";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto3";
const auto copie_value = new_report.uuid;
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
EXPECT_EQ(trace_report_.GetAllReports().size(), 1u);
ASSERT_TRUE(trace_report_.UserRequestedUpload(copie_value));
auto all_traces = trace_report_.GetAllReports();
EXPECT_EQ(all_traces.size(), 1u);
EXPECT_EQ(all_traces[0].state,
TraceReportDatabase::ReportUploadState::kPending_UserRequested);
}
TEST_F(TraceReportDatabaseTest, UploadComplete) {
EXPECT_EQ(trace_report_.GetAllReports().size(), 0u);
// Create Report for the local traces database.
TraceReportDatabase::NewReport new_report;
new_report.uuid = base::Uuid::GenerateRandomV4();
new_report.scenario_name = "scenario3";
new_report.upload_rule_name = "rules3";
new_report.total_size = 23192873129873128;
new_report.proto = "Proto3";
const auto copie_value = new_report.uuid;
ASSERT_TRUE(trace_report_.AddTrace(std::move(new_report)));
EXPECT_EQ(trace_report_.GetAllReports().size(), 1u);
auto uploaded_time = base::Time::Now();
ASSERT_TRUE(trace_report_.UploadComplete(copie_value, uploaded_time));
auto all_traces = trace_report_.GetAllReports();
EXPECT_EQ(all_traces.size(), 1u);
EXPECT_EQ(all_traces[0].state,
TraceReportDatabase::ReportUploadState::kUploaded);
EXPECT_EQ(all_traces[0].upload_time, uploaded_time);
}
} // namespace content