Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / chrome / browser / sync / test / integration / sync_exponential_backoff_test.cc
1 // Copyright 2013 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #include "base/bind.h"
6 #include "chrome/browser/sync/test/integration/bookmarks_helper.h"
7 #include "chrome/browser/sync/test/integration/profile_sync_service_harness.h"
8 #include "chrome/browser/sync/test/integration/retry_verifier.h"
9 #include "chrome/browser/sync/test/integration/status_change_checker.h"
10 #include "chrome/browser/sync/test/integration/sync_test.h"
11
12 namespace {
13
14 using bookmarks_helper::AddFolder;
15 using bookmarks_helper::ModelMatchesVerifier;
16 using syncer::sessions::SyncSessionSnapshot;
17
18 class SyncExponentialBackoffTest : public SyncTest {
19  public:
20   SyncExponentialBackoffTest() : SyncTest(SINGLE_CLIENT) {}
21   virtual ~SyncExponentialBackoffTest() {}
22
23  private:
24   DISALLOW_COPY_AND_ASSIGN(SyncExponentialBackoffTest);
25 };
26
27 // Helper class that checks if a sync client has successfully gone through
28 // exponential backoff after it encounters an error.
29 class ExponentialBackoffChecker : public StatusChangeChecker {
30  public:
31   explicit ExponentialBackoffChecker(const ProfileSyncServiceHarness* harness)
32       : StatusChangeChecker("ExponentialBackoffChecker"),
33         harness_(harness) {
34     DCHECK(harness);
35     const SyncSessionSnapshot& snap = harness_->GetLastSessionSnapshot();
36     retry_verifier_.Initialize(snap);
37   }
38
39   virtual ~ExponentialBackoffChecker() {}
40
41   // Checks if backoff is complete. Called repeatedly each time PSS notifies
42   // observers of a state change.
43   virtual bool IsExitConditionSatisfied() OVERRIDE {
44     const SyncSessionSnapshot& snap = harness_->GetLastSessionSnapshot();
45     retry_verifier_.VerifyRetryInterval(snap);
46     return (retry_verifier_.done() && retry_verifier_.Succeeded());
47   }
48
49  private:
50   // The sync client for which backoff is being verified.
51   const ProfileSyncServiceHarness* harness_;
52
53   // Keeps track of the number of attempts at exponential backoff and its
54   // related bookkeeping information for verification.
55   RetryVerifier retry_verifier_;
56
57   DISALLOW_COPY_AND_ASSIGN(ExponentialBackoffChecker);
58 };
59
60 IN_PROC_BROWSER_TEST_F(SyncExponentialBackoffTest, OfflineToOnline) {
61   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
62
63   // Add an item and ensure that sync is successful.
64   ASSERT_TRUE(AddFolder(0, 0, L"folder1"));
65   ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
66
67   // Trigger a network error at the client side.
68   DisableNetwork(GetProfile(0));
69
70   // Add a new item to trigger another sync cycle.
71   ASSERT_TRUE(AddFolder(0, 0, L"folder2"));
72
73   // Verify that the client goes into exponential backoff while it is unable to
74   // reach the sync server.
75   ExponentialBackoffChecker exponential_backoff_checker(GetClient(0));
76   ASSERT_TRUE(GetClient(0)->AwaitStatusChange(&exponential_backoff_checker,
77                                               "Checking exponential backoff"));
78
79   // Recover from the network error.
80   EnableNetwork(GetProfile(0));
81
82   // Verify that sync was able to recover.
83   ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
84   ASSERT_TRUE(ModelMatchesVerifier(0));
85 }
86
87 IN_PROC_BROWSER_TEST_F(SyncExponentialBackoffTest, TransientErrorTest) {
88   ASSERT_TRUE(SetupSync()) << "SetupSync() failed.";
89
90   // Add an item and ensure that sync is successful.
91   ASSERT_TRUE(AddFolder(0, 0, L"folder1"));
92   ASSERT_TRUE(GetClient(0)->AwaitCommitActivityCompletion());
93
94   // Trigger a transient error on the server.
95   TriggerTransientError();
96
97   // Add a new item to trigger another sync cycle.
98   ASSERT_TRUE(AddFolder(0, 0, L"folder2"));
99
100   // Verify that the client goes into exponential backoff while it is unable to
101   // reach the sync server.
102   ExponentialBackoffChecker exponential_backoff_checker(GetClient(0));
103   ASSERT_TRUE(GetClient(0)->AwaitStatusChange(&exponential_backoff_checker,
104                                               "Checking exponential backoff"));
105 }
106
107 }  // namespace