blob: 7d8f8edcd45436ead8409bdea87279891edf600f [file] [log] [blame]
// Copyright 2021 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#include "components/reporting/metrics/metric_rate_controller.h"
#include <memory>
#include <string>
#include "base/test/bind.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "components/reporting/metrics/fakes/fake_reporting_settings.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace reporting {
namespace {
class MetricRateControllerTest : public ::testing::Test {
public:
void SetUp() override {
settings_ = std::make_unique<test::FakeReportingSettings>();
run_count_ = 0;
run_cb_ = base::BindLambdaForTesting([this]() { ++run_count_; });
}
protected:
const std::string rate_setting_path_ = "rate_path";
std::unique_ptr<test::FakeReportingSettings> settings_;
int run_count_ = 0;
base::RepeatingClosure run_cb_;
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
};
TEST_F(MetricRateControllerTest, InvalidPath) {
MetricRateController controller(run_cb_, settings_.get(), "invalid_path",
/*default_rate=*/base::Seconds(5));
controller.Start();
EXPECT_EQ(run_count_, 0);
task_environment_.FastForwardBy(base::Seconds(5));
EXPECT_EQ(run_count_, 1);
}
TEST_F(MetricRateControllerTest, TrustedCheck) {
// Set rate setting to 7000 milliseconds.
settings_->SetInteger(rate_setting_path_, 7000);
settings_->SetIsTrusted(false);
MetricRateController controller(run_cb_, settings_.get(), rate_setting_path_,
/*default_rate=*/base::Milliseconds(5000));
controller.Start();
EXPECT_EQ(run_count_, 0);
task_environment_.FastForwardBy(base::Milliseconds(5000));
EXPECT_EQ(run_count_, 1);
// Values are trusted, this won't get picked up until the next run.
settings_->SetIsTrusted(true);
task_environment_.FastForwardBy(base::Milliseconds(5000));
EXPECT_EQ(run_count_, 2);
// Now rate setting should be used since the values are trusted.
// No new runs expected after 5000 milliseconds.
task_environment_.FastForwardBy(base::Milliseconds(5000));
EXPECT_EQ(run_count_, 2);
// A new run is expected after 7000 milliseconds (5000 + 2000).
task_environment_.FastForwardBy(base::Milliseconds(2000));
EXPECT_EQ(run_count_, 3);
}
TEST_F(MetricRateControllerTest, BaseRateSetting) {
// Set rate setting to 10 seconds.
settings_->SetInteger(rate_setting_path_, 10);
MetricRateController controller(run_cb_, settings_.get(), rate_setting_path_,
/*default_rate=*/base::Seconds(5),
/*rate_unit_to_ms=*/1000);
// Start not called, no runs expected.
task_environment_.FastForwardBy(base::Seconds(20));
EXPECT_EQ(run_count_, 0);
controller.Start();
task_environment_.FastForwardBy(base::Seconds(5));
EXPECT_EQ(run_count_, 0);
task_environment_.FastForwardBy(base::Seconds(5));
EXPECT_EQ(run_count_, 1);
task_environment_.FastForwardBy(base::Seconds(10));
EXPECT_EQ(run_count_, 2);
controller.Stop();
// Controller stopped so new runs.
task_environment_.FastForwardBy(base::Seconds(10));
EXPECT_EQ(run_count_, 2);
}
TEST_F(MetricRateControllerTest, UpdateRateSetting) {
// Set rate setting to 9000 milliseconds.
settings_->SetInteger(rate_setting_path_, 9000);
MetricRateController controller(run_cb_, settings_.get(), rate_setting_path_,
/*default_rate=*/base::Milliseconds(5000));
controller.Start();
task_environment_.FastForwardBy(base::Milliseconds(9000));
EXPECT_EQ(run_count_, 1);
// Update rate setting, it won't get picked up until the next run.
settings_->SetInteger(rate_setting_path_, 2000);
task_environment_.FastForwardBy(base::Milliseconds(2000));
EXPECT_EQ(run_count_, 1);
task_environment_.FastForwardBy(base::Milliseconds(7000));
EXPECT_EQ(run_count_, 2);
task_environment_.FastForwardBy(base::Milliseconds(2000));
EXPECT_EQ(run_count_, 3);
}
TEST_F(MetricRateControllerTest, RateSettingZero) {
// Set rate setting to 0.
settings_->SetInteger(rate_setting_path_, 0);
MetricRateController controller(run_cb_, settings_.get(), rate_setting_path_,
/*default_rate=*/base::Milliseconds(5000));
controller.Start();
// Fallback to default rate.
task_environment_.FastForwardBy(base::Milliseconds(5000));
EXPECT_EQ(run_count_, 1);
}
} // namespace
} // namespace reporting