1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- // Copyright 2015 The Chromium Authors. All rights reserved.
- // Use of this source code is governed by a BSD-style license that can be
- // found in the LICENSE file.
- #include "remoting/host/backoff_timer.h"
- #include "base/bind.h"
- #include "base/test/task_environment.h"
- #include "base/time/time.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace remoting {
- class BackoffTimerTest : public testing::Test {
- public:
- BackoffTimerTest()
- : task_environment_(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {}
- ~BackoffTimerTest() override = default;
- void IncrementCounter() { ++counter_; }
- void AssertNextDelayAndFastForwardBy(base::TimeDelta delay) {
- ASSERT_EQ(task_environment_.NextMainThreadPendingTaskDelay(), delay);
- task_environment_.FastForwardBy(delay);
- }
- int counter() const { return counter_; }
- private:
- base::test::TaskEnvironment task_environment_;
- int counter_ = 0;
- };
- TEST_F(BackoffTimerTest, Basic) {
- BackoffTimer backoff_timer;
- ASSERT_FALSE(backoff_timer.IsRunning());
- constexpr base::TimeDelta initial_delay = base::Milliseconds(10);
- constexpr base::TimeDelta max_delay = base::Milliseconds(50);
- backoff_timer.Start(FROM_HERE, initial_delay, max_delay,
- base::BindRepeating(&BackoffTimerTest::IncrementCounter,
- base::Unretained(this)));
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(0, counter());
- // The backoff timer always immediately fires without delay.
- AssertNextDelayAndFastForwardBy(base::TimeDelta());
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(1, counter());
- // The next delay is equal to the initial delay.
- AssertNextDelayAndFastForwardBy(initial_delay);
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(2, counter());
- // The next delay is doubled.
- AssertNextDelayAndFastForwardBy(2 * initial_delay);
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(3, counter());
- // The next delay is doubled again.
- AssertNextDelayAndFastForwardBy(4 * initial_delay);
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(4, counter());
- // The next delay is clamped to the max delay. Otherwise, it would exceed it.
- ASSERT_GT(8 * initial_delay, max_delay);
- AssertNextDelayAndFastForwardBy(max_delay);
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(5, counter());
- // The delay remains constant at the max delay.
- AssertNextDelayAndFastForwardBy(max_delay);
- ASSERT_TRUE(backoff_timer.IsRunning());
- ASSERT_EQ(6, counter());
- backoff_timer.Stop();
- ASSERT_FALSE(backoff_timer.IsRunning());
- }
- } // namespace remoting
|