blob: 2ad91edb9dfbb3ba7162a10039dde5876ac0bb98 [file] [log] [blame]
// Copyright 2023 The ChromiumOS Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "metrics/metrics_writer.h"
#include <base/files/file_path.h>
#include <base/files/scoped_temp_dir.h>
#include <base/memory/scoped_refptr.h>
#include <base/task/thread_pool.h>
#include <base/test/task_environment.h>
#include <gtest/gtest.h>
#include "metrics/serialization/serialization_utils.h"
TEST(SynchronousMetricsWriterTest, WriteMetrics) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
auto file_path = temp_dir.GetPath().Append("metrics");
auto writer = base::MakeRefCounted<SynchronousMetricsWriter>(
/*use_nonblocking_lock=*/false, file_path);
auto sample1 = metrics::MetricSample::LinearHistogramSample("Test1", 1, 2);
auto sample2 = metrics::MetricSample::LinearHistogramSample("Test2", 1, 2);
EXPECT_TRUE(writer->WriteMetrics({sample1}));
EXPECT_TRUE(writer->WriteMetrics({sample2}));
std::vector<metrics::MetricSample> samples;
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 2);
EXPECT_EQ(samples[0].name(), sample1.name());
EXPECT_EQ(samples[1].name(), sample2.name());
}
TEST(SynchronousMetricsWriterTest, SetOutputFile) {
base::ScopedTempDir temp_dir;
ASSERT_TRUE(temp_dir.CreateUniqueTempDir());
auto file_path = temp_dir.GetPath().Append("metrics");
auto file_path2 = temp_dir.GetPath().Append("metrics2");
auto writer = base::MakeRefCounted<SynchronousMetricsWriter>(
/*use_nonblocking_lock=*/false, file_path);
auto sample1 = metrics::MetricSample::LinearHistogramSample("Test1", 1, 2);
auto sample2 = metrics::MetricSample::LinearHistogramSample("Test2", 1, 2);
EXPECT_TRUE(writer->WriteMetrics({sample1}));
EXPECT_TRUE(writer->SetOutputFile(file_path2.value()));
EXPECT_TRUE(writer->WriteMetrics({sample2}));
std::vector<metrics::MetricSample> samples;
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 1);
EXPECT_EQ(samples[0].name(), sample1.name());
samples.clear();
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path2.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 1);
EXPECT_EQ(samples[0].name(), sample2.name());
}
class AsynchronousMetricsWriterTest : public testing::Test {
protected:
void SetUp() override {
ASSERT_TRUE(temp_dir_.CreateUniqueTempDir());
file_path_ = temp_dir_.GetPath().Append("metrics");
writer_ = base::MakeRefCounted<AsynchronousMetricsWriter>(
base::ThreadPool::CreateSequencedTaskRunner({base::MayBlock()}),
/*wait_on_destructor=*/true, file_path_);
}
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::ThreadingMode::MULTIPLE_THREADS};
scoped_refptr<AsynchronousMetricsWriter> writer_;
base::ScopedTempDir temp_dir_;
base::FilePath file_path_;
};
TEST_F(AsynchronousMetricsWriterTest, WriteMetrics) {
auto sample1 = metrics::MetricSample::LinearHistogramSample("Test1", 1, 2);
auto sample2 = metrics::MetricSample::LinearHistogramSample("Test2", 1, 2);
EXPECT_TRUE(writer_->WriteMetrics({sample1}));
EXPECT_TRUE(writer_->WriteMetrics({sample2}));
writer_->WaitUntilFlushed();
std::vector<metrics::MetricSample> samples;
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path_.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 2);
EXPECT_EQ(samples[0].name(), sample1.name());
EXPECT_EQ(samples[1].name(), sample2.name());
}
TEST_F(AsynchronousMetricsWriterTest, WriteMetricsWithoutFlush) {
auto sample1 = metrics::MetricSample::LinearHistogramSample("Test1", 1, 2);
auto sample2 = metrics::MetricSample::LinearHistogramSample("Test2", 1, 2);
EXPECT_TRUE(writer_->WriteMetrics({sample1}));
EXPECT_TRUE(writer_->WriteMetrics({sample2}));
// Destructor call `WaitUntilFlushed()` implicitly by default.
writer_.reset();
std::vector<metrics::MetricSample> samples;
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path_.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 2);
EXPECT_EQ(samples[0].name(), sample1.name());
EXPECT_EQ(samples[1].name(), sample2.name());
}
TEST_F(AsynchronousMetricsWriterTest, SetOutputFile) {
auto file_path2 = temp_dir_.GetPath().Append("metrics2");
auto sample1 = metrics::MetricSample::LinearHistogramSample("Test1", 1, 2);
auto sample2 = metrics::MetricSample::LinearHistogramSample("Test2", 1, 2);
EXPECT_TRUE(writer_->WriteMetrics({sample1}));
EXPECT_TRUE(writer_->SetOutputFile(file_path2.value()));
EXPECT_TRUE(writer_->WriteMetrics({sample2}));
writer_->WaitUntilFlushed();
std::vector<metrics::MetricSample> samples;
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path_.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 1);
EXPECT_EQ(samples[0].name(), sample1.name());
samples.clear();
ASSERT_TRUE(metrics::SerializationUtils::ReadAndTruncateMetricsFromFile(
file_path2.value(), &samples,
metrics::SerializationUtils::kSampleBatchMaxLength));
EXPECT_EQ(samples.size(), 1);
EXPECT_EQ(samples[0].name(), sample2.name());
}