Index: sync/notifier/ack_tracker_unittest.cc |
diff --git a/sync/notifier/ack_tracker_unittest.cc b/sync/notifier/ack_tracker_unittest.cc |
deleted file mode 100644 |
index c1a677351e28540c83a55e7253ef38c38269e3d8..0000000000000000000000000000000000000000 |
--- a/sync/notifier/ack_tracker_unittest.cc |
+++ /dev/null |
@@ -1,352 +0,0 @@ |
-// Copyright (c) 2012 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 "sync/notifier/ack_tracker.h" |
- |
-#include "base/compiler_specific.h" |
-#include "base/memory/ref_counted.h" |
-#include "base/message_loop/message_loop.h" |
-#include "base/time/tick_clock.h" |
-#include "google/cacheinvalidation/include/types.h" |
-#include "google/cacheinvalidation/types.pb.h" |
-#include "testing/gmock/include/gmock/gmock.h" |
-#include "testing/gtest/include/gtest/gtest.h" |
- |
-namespace syncer { |
- |
-namespace { |
- |
-class FakeTickClock : public base::TickClock { |
- public: |
- FakeTickClock() {} |
- |
- virtual ~FakeTickClock() {} |
- |
- void LeapForward(int seconds) { |
- ASSERT_GT(seconds, 0); |
- fake_now_ticks_ += base::TimeDelta::FromSeconds(seconds); |
- } |
- |
- // After the next call to Now(), immediately leap forward by |seconds|. |
- void DelayedLeapForward(int seconds) { |
- ASSERT_GT(seconds, 0); |
- delayed_leap_ = base::TimeDelta::FromSeconds(seconds); |
- } |
- |
- virtual base::TimeTicks NowTicks() OVERRIDE { |
- base::TimeTicks fake_now_ticks = fake_now_ticks_; |
- if (delayed_leap_ > base::TimeDelta()) { |
- fake_now_ticks_ += delayed_leap_; |
- delayed_leap_ = base::TimeDelta(); |
- } |
- return fake_now_ticks; |
- } |
- |
- private: |
- base::TimeTicks fake_now_ticks_; |
- base::TimeDelta delayed_leap_; |
-}; |
- |
-class FakeBackoffEntry : public net::BackoffEntry { |
- public: |
- FakeBackoffEntry(const Policy* const policy, base::TickClock* tick_clock) |
- : BackoffEntry(policy), |
- tick_clock_(tick_clock) { |
- } |
- |
- protected: |
- virtual base::TimeTicks ImplGetTimeNow() const OVERRIDE { |
- return tick_clock_->NowTicks(); |
- } |
- |
- private: |
- base::TickClock* const tick_clock_; |
-}; |
- |
-class MockDelegate : public AckTracker::Delegate { |
- public: |
- MOCK_METHOD1(OnTimeout, void(const ObjectIdSet&)); |
-}; |
- |
-scoped_ptr<net::BackoffEntry> CreateMockEntry( |
- base::TickClock* tick_clock, |
- const net::BackoffEntry::Policy* const policy) { |
- return scoped_ptr<net::BackoffEntry>(new FakeBackoffEntry( |
- policy, tick_clock)); |
-} |
- |
-} // namespace |
- |
-class AckTrackerTest : public testing::Test { |
- public: |
- AckTrackerTest() |
- : ack_tracker_(&fake_tick_clock_, &delegate_), |
- kIdOne(ipc::invalidation::ObjectSource::TEST, "one"), |
- kIdTwo(ipc::invalidation::ObjectSource::TEST, "two") { |
- ack_tracker_.SetCreateBackoffEntryCallbackForTest( |
- base::Bind(&CreateMockEntry, &fake_tick_clock_)); |
- } |
- |
- protected: |
- bool TriggerTimeoutNow() { |
- return ack_tracker_.TriggerTimeoutAtForTest(fake_tick_clock_.NowTicks()); |
- } |
- |
- base::TimeDelta GetTimerDelay() const { |
- const base::Timer& timer = ack_tracker_.GetTimerForTest(); |
- if (!timer.IsRunning()) |
- ADD_FAILURE() << "Timer is not running!"; |
- return timer.GetCurrentDelay(); |
- } |
- |
- FakeTickClock fake_tick_clock_; |
- ::testing::StrictMock<MockDelegate> delegate_; |
- AckTracker ack_tracker_; |
- |
- const invalidation::ObjectId kIdOne; |
- const invalidation::ObjectId kIdTwo; |
- |
- // AckTracker uses base::Timer internally, which depends on the existence of a |
- // MessageLoop. |
- base::MessageLoop message_loop_; |
-}; |
- |
-// Tests that various combinations of Track()/Ack() behave as |
-// expected. |
-TEST_F(AckTrackerTest, TrackAndAck) { |
- ObjectIdSet ids_one; |
- ids_one.insert(kIdOne); |
- ObjectIdSet ids_two; |
- ids_two.insert(kIdTwo); |
- ObjectIdSet ids_all; |
- ids_all.insert(kIdOne); |
- ids_all.insert(kIdTwo); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids_one); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids_two); |
- ack_tracker_.Ack(ids_one); |
- ack_tracker_.Ack(ids_two); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- ack_tracker_.Track(ids_all); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Ack(ids_one); |
- ack_tracker_.Ack(ids_two); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- ack_tracker_.Track(ids_one); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids_two); |
- ack_tracker_.Ack(ids_all); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- ack_tracker_.Track(ids_all); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Ack(ids_all); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-TEST_F(AckTrackerTest, DoubleTrack) { |
- ObjectIdSet ids; |
- ids.insert(kIdOne); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids); |
- ack_tracker_.Ack(ids); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-TEST_F(AckTrackerTest, UntrackedAck) { |
- ObjectIdSet ids; |
- ids.insert(kIdOne); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Ack(ids); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-TEST_F(AckTrackerTest, Clear) { |
- ObjectIdSet ids; |
- ids.insert(kIdOne); |
- ids.insert(kIdOne); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Clear(); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-// Test that timeout behavior for one object ID. The timeout should increase |
-// exponentially until it hits the cap. |
-TEST_F(AckTrackerTest, SimpleTimeout) { |
- ObjectIdSet ids; |
- ids.insert(kIdOne); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(60), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(60); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(120), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(120); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(240), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(240); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(480), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(480); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(600), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(600); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(600), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(600); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Ack(ids); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- // The backoff time should be reset after an Ack/Track cycle. |
- ack_tracker_.Track(ids); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(60), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(60); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Ack(ids); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-// Tests that a sequence of Track() calls that results in interleaving |
-// timeouts occurs as expected. |
-TEST_F(AckTrackerTest, InterleavedTimeout) { |
- ObjectIdSet ids_one; |
- ids_one.insert(kIdOne); |
- ObjectIdSet ids_two; |
- ids_two.insert(kIdTwo); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids_one); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- fake_tick_clock_.LeapForward(30); |
- ack_tracker_.Track(ids_two); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(60), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(30); |
- EXPECT_CALL(delegate_, OnTimeout(ids_one)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(30), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(30); |
- EXPECT_CALL(delegate_, OnTimeout(ids_two)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(90), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(90); |
- EXPECT_CALL(delegate_, OnTimeout(ids_one)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(30), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(30); |
- EXPECT_CALL(delegate_, OnTimeout(ids_two)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- ack_tracker_.Ack(ids_one); |
- ack_tracker_.Ack(ids_two); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-// Tests that registering a new object ID properly shortens the timeout when |
-// needed. |
-TEST_F(AckTrackerTest, ShortenTimeout) { |
- ObjectIdSet ids_one; |
- ids_one.insert(kIdOne); |
- ObjectIdSet ids_two; |
- ids_two.insert(kIdTwo); |
- |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids_one); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(60), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(60); |
- EXPECT_CALL(delegate_, OnTimeout(ids_one)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- // Without this next register, the next timeout should occur in 120 seconds |
- // from the last timeout event. |
- EXPECT_EQ(base::TimeDelta::FromSeconds(120), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(30); |
- ack_tracker_.Track(ids_two); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- // Now that we've registered another entry though, we should receive a timeout |
- // in 60 seconds. |
- EXPECT_EQ(base::TimeDelta::FromSeconds(60), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(60); |
- EXPECT_CALL(delegate_, OnTimeout(ids_two)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- // Verify that the original timeout for kIdOne still occurs as expected. |
- EXPECT_EQ(base::TimeDelta::FromSeconds(30), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(30); |
- EXPECT_CALL(delegate_, OnTimeout(ids_one)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- ack_tracker_.Ack(ids_one); |
- ack_tracker_.Ack(ids_two); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-// Tests that a delay between inserting a new object ID registration and start |
-// the timer that is greater than the initial timeout period (60 seconds) does |
-// not break things. This could happen on a heavily loaded system, for instance. |
-TEST_F(AckTrackerTest, ImmediateTimeout) { |
- ObjectIdSet ids; |
- ids.insert(kIdOne); |
- |
- fake_tick_clock_.DelayedLeapForward(90); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
- ack_tracker_.Track(ids); |
- EXPECT_FALSE(ack_tracker_.IsQueueEmptyForTest()); |
- |
- EXPECT_EQ(base::TimeDelta::FromSeconds(0), GetTimerDelay()); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- message_loop_.RunUntilIdle(); |
- |
- // The next timeout should still be scheduled normally. |
- EXPECT_EQ(base::TimeDelta::FromSeconds(120), GetTimerDelay()); |
- fake_tick_clock_.LeapForward(120); |
- EXPECT_CALL(delegate_, OnTimeout(ids)); |
- EXPECT_TRUE(TriggerTimeoutNow()); |
- |
- ack_tracker_.Ack(ids); |
- EXPECT_TRUE(ack_tracker_.IsQueueEmptyForTest()); |
-} |
- |
-} // namespace syncer |