root/chrome/browser/sync/test/integration/sync_exponential_backoff_test.cc

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. IsExitConditionSatisfied
  2. GetDebugMessage
  3. IN_PROC_BROWSER_TEST_F
  4. IN_PROC_BROWSER_TEST_F

// Copyright 2013 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 "base/bind.h"
#include "base/strings/stringprintf.h"
#include "chrome/browser/sync/profile_sync_service.h"
#include "chrome/browser/sync/test/integration/bookmarks_helper.h"
#include "chrome/browser/sync/test/integration/retry_verifier.h"
#include "chrome/browser/sync/test/integration/single_client_status_change_checker.h"
#include "chrome/browser/sync/test/integration/sync_integration_test_util.h"
#include "chrome/browser/sync/test/integration/sync_test.h"

namespace {

using bookmarks_helper::AddFolder;
using bookmarks_helper::ModelMatchesVerifier;
using syncer::sessions::SyncSessionSnapshot;
using sync_integration_test_util::AwaitCommitActivityCompletion;

class SyncExponentialBackoffTest : public SyncTest {
 public:
  // TODO(pvalenzuela): Switch to SINGLE_CLIENT once FakeServer
  // supports this scenario.
  SyncExponentialBackoffTest() : SyncTest(SINGLE_CLIENT_LEGACY) {}
  virtual ~SyncExponentialBackoffTest() {}

 private:
  DISALLOW_COPY_AND_ASSIGN(SyncExponentialBackoffTest);
};

// Helper class that checks if a sync client has successfully gone through
// exponential backoff after it encounters an error.
class ExponentialBackoffChecker : public SingleClientStatusChangeChecker {
 public:
  explicit ExponentialBackoffChecker(ProfileSyncService* pss)
        : SingleClientStatusChangeChecker(pss) {
    const SyncSessionSnapshot& snap = service()->GetLastSessionSnapshot();
    retry_verifier_.Initialize(snap);
  }

  virtual ~ExponentialBackoffChecker() {}

  // Checks if backoff is complete. Called repeatedly each time PSS notifies
  // observers of a state change.
  virtual bool IsExitConditionSatisfied() OVERRIDE {
    const SyncSessionSnapshot& snap = service()->GetLastSessionSnapshot();
    retry_verifier_.VerifyRetryInterval(snap);
    return (retry_verifier_.done() && retry_verifier_.Succeeded());
  }

  virtual std::string GetDebugMessage() const OVERRIDE {
    return base::StringPrintf("Verifying backoff intervals (%d/%d)",
                              retry_verifier_.retry_count(),
                              RetryVerifier::kMaxRetry);
  }

 private:
  // Keeps track of the number of attempts at exponential backoff and its
  // related bookkeeping information for verification.
  RetryVerifier retry_verifier_;

  DISALLOW_COPY_AND_ASSIGN(ExponentialBackoffChecker);
};

IN_PROC_BROWSER_TEST_F(SyncExponentialBackoffTest, OfflineToOnline) {
  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";

  // Add an item and ensure that sync is successful.
  ASSERT_TRUE(AddFolder(0, 0, L"folder1"));
  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));

  // Trigger a network error at the client side.
  DisableNetwork(GetProfile(0));

  // Add a new item to trigger another sync cycle.
  ASSERT_TRUE(AddFolder(0, 0, L"folder2"));

  // Verify that the client goes into exponential backoff while it is unable to
  // reach the sync server.
  ExponentialBackoffChecker exponential_backoff_checker(
      GetSyncService((0)));
  exponential_backoff_checker.Wait();
  ASSERT_FALSE(exponential_backoff_checker.TimedOut());

  // Recover from the network error.
  EnableNetwork(GetProfile(0));

  // Verify that sync was able to recover.
  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));
  ASSERT_TRUE(ModelMatchesVerifier(0));
}

IN_PROC_BROWSER_TEST_F(SyncExponentialBackoffTest, TransientErrorTest) {
  ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";

  // Add an item and ensure that sync is successful.
  ASSERT_TRUE(AddFolder(0, 0, L"folder1"));
  ASSERT_TRUE(AwaitCommitActivityCompletion(GetSyncService((0))));

  // Trigger a transient error on the server.
  TriggerTransientError();

  // Add a new item to trigger another sync cycle.
  ASSERT_TRUE(AddFolder(0, 0, L"folder2"));

  // Verify that the client goes into exponential backoff while it is unable to
  // reach the sync server.
  ExponentialBackoffChecker exponential_backoff_checker(
      GetSyncService((0)));
  exponential_backoff_checker.Wait();
  ASSERT_FALSE(exponential_backoff_checker.TimedOut());
}

}  // namespace

/* [<][>][^][v][top][bottom][index][help] */