123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146 |
- // 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 "components/sync/engine/backoff_delay_provider.h"
- #include <memory>
- #include "components/sync/base/syncer_error.h"
- #include "components/sync/engine/cycle/model_neutral_state.h"
- #include "components/sync/engine/polling_constants.h"
- #include "net/base/net_errors.h"
- #include "net/http/http_status_code.h"
- #include "testing/gmock/include/gmock/gmock.h"
- #include "testing/gtest/include/gtest/gtest.h"
- namespace syncer {
- namespace {
- using testing::Gt;
- using testing::Lt;
- TEST(BackoffDelayProviderTest, GetRecommendedDelay) {
- std::unique_ptr<BackoffDelayProvider> delay(
- BackoffDelayProvider::FromDefaults());
- EXPECT_EQ(base::Seconds(1), delay->GetDelay(base::Seconds(0)));
- EXPECT_LE(base::Seconds(1), delay->GetDelay(base::Seconds(1)));
- EXPECT_LE(base::Seconds(50), delay->GetDelay(base::Seconds(50)));
- EXPECT_LE(base::Seconds(10), delay->GetDelay(base::Seconds(10)));
- EXPECT_EQ(kMaxBackoffTime, delay->GetDelay(kMaxBackoffTime));
- EXPECT_EQ(kMaxBackoffTime,
- delay->GetDelay(kMaxBackoffTime + base::Seconds(1)));
- }
- TEST(BackoffDelayProviderTest, GetInitialDelay) {
- std::unique_ptr<BackoffDelayProvider> delay(
- BackoffDelayProvider::FromDefaults());
- ModelNeutralState state;
- state.last_get_key_result =
- SyncerError::HttpError(net::HTTP_INTERNAL_SERVER_ERROR);
- EXPECT_EQ(kInitialBackoffRetryTime, delay->GetInitialDelay(state));
- state.last_get_key_result = SyncerError();
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RETURN_MIGRATION_DONE);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError::NetworkConnectionUnavailable(net::ERR_FAILED);
- EXPECT_EQ(kInitialBackoffRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RETURN_TRANSIENT_ERROR);
- EXPECT_EQ(kInitialBackoffRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RESPONSE_VALIDATION_FAILED);
- EXPECT_EQ(kInitialBackoffRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::DATATYPE_TRIGGERED_RETRY);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result = SyncerError(SyncerError::SYNCER_OK);
- state.commit_result = SyncerError(SyncerError::SERVER_RETURN_MIGRATION_DONE);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.commit_result =
- SyncerError::NetworkConnectionUnavailable(net::ERR_FAILED);
- EXPECT_EQ(kInitialBackoffRetryTime, delay->GetInitialDelay(state));
- state.commit_result = SyncerError(SyncerError::SERVER_RETURN_CONFLICT);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- }
- TEST(BackoffDelayProviderTest, GetInitialDelayWithOverride) {
- std::unique_ptr<BackoffDelayProvider> delay(
- BackoffDelayProvider::WithShortInitialRetryOverride());
- ModelNeutralState state;
- state.last_get_key_result =
- SyncerError::HttpError(net::HTTP_INTERNAL_SERVER_ERROR);
- EXPECT_EQ(kInitialBackoffShortRetryTime, delay->GetInitialDelay(state));
- state.last_get_key_result = SyncerError();
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RETURN_MIGRATION_DONE);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RETURN_TRANSIENT_ERROR);
- EXPECT_EQ(kInitialBackoffShortRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::SERVER_RESPONSE_VALIDATION_FAILED);
- EXPECT_EQ(kInitialBackoffShortRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result =
- SyncerError(SyncerError::DATATYPE_TRIGGERED_RETRY);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.last_download_updates_result = SyncerError(SyncerError::SYNCER_OK);
- state.commit_result = SyncerError(SyncerError::SERVER_RETURN_MIGRATION_DONE);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- state.commit_result = SyncerError(SyncerError::SERVER_RETURN_CONFLICT);
- EXPECT_EQ(kInitialBackoffImmediateRetryTime, delay->GetInitialDelay(state));
- }
- // This rules out accidents with the constants.
- TEST(BackoffDelayProviderTest, GetExponentiallyIncreasingDelay) {
- std::unique_ptr<BackoffDelayProvider> delay_provider(
- BackoffDelayProvider::FromDefaults());
- ASSERT_THAT(kBackoffMultiplyFactor, Gt(1.0));
- // Even when the jitter is negative, the delay should grow (overall
- // multiplicative factor bigger than 1).
- ASSERT_THAT(kBackoffJitterFactor, Lt(kBackoffMultiplyFactor - 1.0));
- const base::TimeDelta delay0 = base::Seconds(1);
- const base::TimeDelta delay1_min =
- delay_provider->GetDelayForTesting(delay0, /*jitter_sign=*/-1);
- const base::TimeDelta delay2_min =
- delay_provider->GetDelayForTesting(delay1_min, /*jitter_sign=*/-1);
- const base::TimeDelta delay1_max =
- delay_provider->GetDelayForTesting(delay0, /*jitter_sign=*/1);
- const base::TimeDelta delay2_max =
- delay_provider->GetDelayForTesting(delay1_max, /*jitter_sign=*/1);
- ASSERT_THAT(delay1_min, Lt(delay1_max));
- ASSERT_THAT(delay2_min, Lt(delay2_max));
- // The minimum value should increase faster than linearly.
- EXPECT_THAT(delay1_min, Gt(delay0));
- EXPECT_THAT(delay2_min, Gt(delay1_min));
- EXPECT_THAT(delay2_min - delay1_min, Gt(delay1_min - delay0));
- // The maximum value should increase faster than linearly.
- EXPECT_THAT(delay1_max, Gt(delay0));
- EXPECT_THAT(delay2_max, Gt(delay1_max));
- EXPECT_THAT(delay2_max - delay1_max, Gt(delay1_max - delay0));
- }
- } // namespace
- } // namespace syncer
|