blob: ac1b5ac646d2c4ae1a5c925c3f62ffd7006df544 [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 "components/reporting/util/rate_limiter_slide_window.h"
#include <cstddef>
#include "base/rand_util.h"
#include "base/test/task_environment.h"
#include "base/time/time.h"
#include "testing/gmock/include/gmock/gmock.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace reporting {
namespace {
constexpr size_t kTotalSize = 1024u;
constexpr base::TimeDelta kTimeWindow = base::Seconds(16);
constexpr size_t kBucketCount = 8;
constexpr base::TimeDelta kBucket = kTimeWindow / kBucketCount;
class RateLimiterSlideWindowTest : public ::testing::Test {
protected:
base::test::TaskEnvironment task_environment_{
base::test::TaskEnvironment::TimeSource::MOCK_TIME};
RateLimiterSlideWindow rate_limiter_{kTotalSize, kTimeWindow, kBucketCount};
};
TEST_F(RateLimiterSlideWindowTest, SingularEvent) {
ASSERT_FALSE(rate_limiter_.Acquire(kTotalSize + 1));
ASSERT_TRUE(rate_limiter_.Acquire(kTotalSize));
ASSERT_FALSE(rate_limiter_.Acquire(1u));
task_environment_.FastForwardBy(kTimeWindow - kBucket);
ASSERT_FALSE(rate_limiter_.Acquire(kTotalSize));
task_environment_.FastForwardBy(kBucket);
ASSERT_TRUE(rate_limiter_.Acquire(kTotalSize));
ASSERT_FALSE(rate_limiter_.Acquire(1u));
}
TEST_F(RateLimiterSlideWindowTest, SteadyEventsStream) {
for (size_t i = 0; i < 2 * kBucketCount; ++i) {
ASSERT_TRUE(rate_limiter_.Acquire(kTotalSize / kBucketCount));
if (i >= kBucketCount) {
ASSERT_FALSE(rate_limiter_.Acquire(1u));
}
task_environment_.FastForwardBy(kBucket);
}
}
TEST_F(RateLimiterSlideWindowTest, RandomizedEventsStream) {
for (size_t i = 0; i < 2 * kBucketCount; ++i) {
ASSERT_TRUE(rate_limiter_.Acquire(kTotalSize / kBucketCount));
if (i >= kBucketCount) {
ASSERT_FALSE(rate_limiter_.Acquire(1u));
}
task_environment_.FastForwardBy(kBucket +
base::Milliseconds(base::RandInt(0, 100)));
}
}
TEST_F(RateLimiterSlideWindowTest, SparseEventsStream) {
for (size_t i = 0; i < 2 * kBucketCount; ++i) {
ASSERT_TRUE(rate_limiter_.Acquire(1u));
task_environment_.FastForwardBy(kTimeWindow - base::Milliseconds(1));
}
}
} // namespace
} // namespace reporting