1 // Copyright (c) 2009 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 "chrome/browser/sync/sessions/sync_session.h"
6 #include "chrome/test/sync/engine/test_id_factory.h"
7 #include "testing/gtest/include/gtest/gtest.h"
8
9 namespace browser_sync {
10 namespace sessions {
11
12 class StatusControllerTest : public testing::Test {
13 public:
SetUp()14 virtual void SetUp() {
15 routes_[syncable::BOOKMARKS] = GROUP_UI;
16 }
17 protected:
18 ModelSafeRoutingInfo routes_;
19 };
20
TEST_F(StatusControllerTest,GetsDirty)21 TEST_F(StatusControllerTest, GetsDirty) {
22 StatusController status(routes_);
23 status.increment_num_conflicting_commits_by(1);
24 EXPECT_TRUE(status.TestAndClearIsDirty());
25 EXPECT_FALSE(status.TestAndClearIsDirty()); // Test that it actually resets.
26 status.increment_num_conflicting_commits_by(0);
27 EXPECT_FALSE(status.TestAndClearIsDirty());
28 status.increment_num_conflicting_commits_by(1);
29 EXPECT_TRUE(status.TestAndClearIsDirty());
30
31 status.set_num_consecutive_transient_error_commits(1);
32 EXPECT_TRUE(status.TestAndClearIsDirty());
33
34 status.increment_num_consecutive_transient_error_commits_by(1);
35 EXPECT_TRUE(status.TestAndClearIsDirty());
36 status.increment_num_consecutive_transient_error_commits_by(0);
37 EXPECT_FALSE(status.TestAndClearIsDirty());
38
39 status.set_num_consecutive_errors(10);
40 EXPECT_TRUE(status.TestAndClearIsDirty());
41 status.set_num_consecutive_errors(10);
42 EXPECT_FALSE(status.TestAndClearIsDirty()); // Only dirty if value changed.
43 status.increment_num_consecutive_errors();
44 EXPECT_TRUE(status.TestAndClearIsDirty());
45 status.increment_num_consecutive_errors_by(1);
46 EXPECT_TRUE(status.TestAndClearIsDirty());
47 status.increment_num_consecutive_errors_by(0);
48 EXPECT_FALSE(status.TestAndClearIsDirty());
49
50 status.set_num_server_changes_remaining(30);
51 EXPECT_TRUE(status.TestAndClearIsDirty());
52
53 status.set_invalid_store(true);
54 EXPECT_TRUE(status.TestAndClearIsDirty());
55 status.set_invalid_store(false);
56 EXPECT_TRUE(status.TestAndClearIsDirty());
57
58 status.set_syncer_stuck(true);
59 EXPECT_TRUE(status.TestAndClearIsDirty());
60 status.set_syncer_stuck(false);
61 EXPECT_TRUE(status.TestAndClearIsDirty());
62
63 status.set_syncing(true);
64 EXPECT_TRUE(status.TestAndClearIsDirty());
65 status.set_syncing(false);
66 EXPECT_TRUE(status.TestAndClearIsDirty());
67
68 status.increment_num_successful_commits();
69 EXPECT_TRUE(status.TestAndClearIsDirty());
70 status.increment_num_successful_commits();
71 EXPECT_TRUE(status.TestAndClearIsDirty());
72
73 {
74 ScopedModelSafeGroupRestriction r(&status, GROUP_UI);
75 status.mutable_conflict_progress()->AddConflictingItemById(syncable::Id());
76 }
77 EXPECT_TRUE(status.TestAndClearIsDirty());
78
79 std::vector<int64> v;
80 v.push_back(1);
81 status.set_unsynced_handles(v);
82 EXPECT_TRUE(status.TestAndClearIsDirty());
83 std::vector<int64> v2;
84 v2.push_back(1);
85 status.set_unsynced_handles(v2);
86 EXPECT_FALSE(status.TestAndClearIsDirty()); // Test for deep comparison.
87 }
88
TEST_F(StatusControllerTest,StaysClean)89 TEST_F(StatusControllerTest, StaysClean) {
90 StatusController status(routes_);
91 status.update_conflict_sets_built(true);
92 EXPECT_FALSE(status.TestAndClearIsDirty());
93 status.update_conflicts_resolved(true);
94 EXPECT_FALSE(status.TestAndClearIsDirty());
95
96 status.set_items_committed();
97 EXPECT_FALSE(status.TestAndClearIsDirty());
98
99 OrderedCommitSet commits(routes_);
100 commits.AddCommitItem(0, syncable::Id(), syncable::BOOKMARKS);
101 status.set_commit_set(commits);
102 EXPECT_FALSE(status.TestAndClearIsDirty());
103 }
104
105 // This test is useful, as simple as it sounds, due to the copy-paste prone
106 // nature of status_controller.cc (we have had bugs in the past where a set_foo
107 // method was actually setting |bar_| instead!).
TEST_F(StatusControllerTest,ReadYourWrites)108 TEST_F(StatusControllerTest, ReadYourWrites) {
109 StatusController status(routes_);
110 status.increment_num_conflicting_commits_by(1);
111 EXPECT_EQ(1, status.error_counters().num_conflicting_commits);
112
113 status.set_num_consecutive_transient_error_commits(6);
114 EXPECT_EQ(6, status.error_counters().consecutive_transient_error_commits);
115 status.increment_num_consecutive_transient_error_commits_by(1);
116 EXPECT_EQ(7, status.error_counters().consecutive_transient_error_commits);
117 status.increment_num_consecutive_transient_error_commits_by(0);
118 EXPECT_EQ(7, status.error_counters().consecutive_transient_error_commits);
119
120 status.set_num_consecutive_errors(8);
121 EXPECT_EQ(8, status.error_counters().consecutive_errors);
122 status.increment_num_consecutive_errors();
123 EXPECT_EQ(9, status.error_counters().consecutive_errors);
124 status.increment_num_consecutive_errors_by(2);
125 EXPECT_EQ(11, status.error_counters().consecutive_errors);
126
127 status.set_num_server_changes_remaining(13);
128 EXPECT_EQ(13, status.num_server_changes_remaining());
129
130 EXPECT_FALSE(status.syncer_status().invalid_store);
131 status.set_invalid_store(true);
132 EXPECT_TRUE(status.syncer_status().invalid_store);
133
134 EXPECT_FALSE(status.syncer_status().syncer_stuck);
135 status.set_syncer_stuck(true);
136 EXPECT_TRUE(status.syncer_status().syncer_stuck);
137
138 EXPECT_FALSE(status.syncer_status().syncing);
139 status.set_syncing(true);
140 EXPECT_TRUE(status.syncer_status().syncing);
141
142 for (int i = 0; i < 14; i++)
143 status.increment_num_successful_commits();
144 EXPECT_EQ(14, status.syncer_status().num_successful_commits);
145
146 std::vector<int64> v;
147 v.push_back(16);
148 status.set_unsynced_handles(v);
149 EXPECT_EQ(16, v[0]);
150 }
151
TEST_F(StatusControllerTest,HasConflictingUpdates)152 TEST_F(StatusControllerTest, HasConflictingUpdates) {
153 StatusController status(routes_);
154 EXPECT_FALSE(status.HasConflictingUpdates());
155 {
156 ScopedModelSafeGroupRestriction r(&status, GROUP_UI);
157 EXPECT_FALSE(status.update_progress().HasConflictingUpdates());
158 status.mutable_update_progress()->AddAppliedUpdate(SUCCESS,
159 syncable::Id());
160 status.mutable_update_progress()->AddAppliedUpdate(CONFLICT,
161 syncable::Id());
162 EXPECT_TRUE(status.update_progress().HasConflictingUpdates());
163 }
164
165 EXPECT_TRUE(status.HasConflictingUpdates());
166
167 {
168 ScopedModelSafeGroupRestriction r(&status, GROUP_PASSIVE);
169 EXPECT_FALSE(status.update_progress().HasConflictingUpdates());
170 }
171 }
172
TEST_F(StatusControllerTest,CountUpdates)173 TEST_F(StatusControllerTest, CountUpdates) {
174 StatusController status(routes_);
175 EXPECT_EQ(0, status.CountUpdates());
176 ClientToServerResponse* response(status.mutable_updates_response());
177 sync_pb::SyncEntity* entity1 = response->mutable_get_updates()->add_entries();
178 sync_pb::SyncEntity* entity2 = response->mutable_get_updates()->add_entries();
179 ASSERT_TRUE(entity1 != NULL && entity2 != NULL);
180 EXPECT_EQ(2, status.CountUpdates());
181 }
182
183 // Test TotalNumConflictingItems
TEST_F(StatusControllerTest,TotalNumConflictingItems)184 TEST_F(StatusControllerTest, TotalNumConflictingItems) {
185 StatusController status(routes_);
186 TestIdFactory f;
187 {
188 ScopedModelSafeGroupRestriction r(&status, GROUP_UI);
189 status.mutable_conflict_progress()->AddConflictingItemById(f.NewLocalId());
190 status.mutable_conflict_progress()->AddConflictingItemById(f.NewLocalId());
191 EXPECT_EQ(2, status.conflict_progress().ConflictingItemsSize());
192 }
193 EXPECT_EQ(2, status.TotalNumConflictingItems());
194 {
195 ScopedModelSafeGroupRestriction r(&status, GROUP_DB);
196 EXPECT_EQ(0, status.conflict_progress().ConflictingItemsSize());
197 status.mutable_conflict_progress()->AddConflictingItemById(f.NewLocalId());
198 status.mutable_conflict_progress()->AddConflictingItemById(f.NewLocalId());
199 EXPECT_EQ(2, status.conflict_progress().ConflictingItemsSize());
200 }
201 EXPECT_EQ(4, status.TotalNumConflictingItems());
202 }
203
204 // Basic test that non group-restricted state accessors don't cause violations.
TEST_F(StatusControllerTest,Unrestricted)205 TEST_F(StatusControllerTest, Unrestricted) {
206 StatusController status(routes_);
207 status.GetUnrestrictedUpdateProgress(
208 GROUP_UI)->SuccessfullyAppliedUpdateCount();
209 status.mutable_commit_message();
210 status.commit_response();
211 status.mutable_commit_response();
212 status.updates_response();
213 status.mutable_updates_response();
214 status.error_counters();
215 status.syncer_status();
216 status.num_server_changes_remaining();
217 status.commit_ids();
218 status.HasBookmarkCommitActivity();
219 status.download_updates_succeeded();
220 status.ServerSaysNothingMoreToDownload();
221 status.group_restriction();
222 }
223
224 } // namespace sessions
225 } // namespace browser_sync
226