OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
| 5 #include "sync/internal_api/public/base/model_type_test_util.h" |
5 #include "sync/sessions/nudge_tracker.h" | 6 #include "sync/sessions/nudge_tracker.h" |
6 | |
7 #include "sync/internal_api/public/base/model_type_invalidation_map.h" | |
8 #include "testing/gtest/include/gtest/gtest.h" | 7 #include "testing/gtest/include/gtest/gtest.h" |
9 | 8 |
10 namespace syncer { | 9 namespace syncer { |
11 | 10 |
12 namespace { | 11 namespace { |
13 | 12 |
14 testing::AssertionResult ModelTypeSetEquals(ModelTypeSet a, ModelTypeSet b) { | 13 testing::AssertionResult ModelTypeSetEquals(ModelTypeSet a, ModelTypeSet b) { |
15 if (a.Equals(b)) { | 14 if (a.Equals(b)) { |
16 return testing::AssertionSuccess(); | 15 return testing::AssertionSuccess(); |
17 } else { | 16 } else { |
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
85 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(TYPED_URLS)); | 84 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(TYPED_URLS)); |
86 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH, | 85 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH, |
87 nudge_tracker.updates_source()); | 86 nudge_tracker.updates_source()); |
88 | 87 |
89 // Another local nudge will not be enough to change it. | 88 // Another local nudge will not be enough to change it. |
90 nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS)); | 89 nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS)); |
91 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH, | 90 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::DATATYPE_REFRESH, |
92 nudge_tracker.updates_source()); | 91 nudge_tracker.updates_source()); |
93 | 92 |
94 // An invalidation will override the refresh request source. | 93 // An invalidation will override the refresh request source. |
95 ModelTypeInvalidationMap invalidation_map = | 94 ObjectIdInvalidationMap invalidation_map = |
96 ModelTypeSetToInvalidationMap(ModelTypeSet(PREFERENCES), | 95 BuildInvalidationMap(PREFERENCES, 1, "hint"); |
97 std::string("hint")); | |
98 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 96 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
99 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, | 97 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, |
100 nudge_tracker.updates_source()); | 98 nudge_tracker.updates_source()); |
101 | 99 |
102 // Neither local nudges nor refresh requests will override it. | 100 // Neither local nudges nor refresh requests will override it. |
103 nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS)); | 101 nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS)); |
104 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, | 102 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, |
105 nudge_tracker.updates_source()); | 103 nudge_tracker.updates_source()); |
106 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(TYPED_URLS)); | 104 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(TYPED_URLS)); |
107 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, | 105 EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION, |
108 nudge_tracker.updates_source()); | 106 nudge_tracker.updates_source()); |
109 } | 107 } |
110 | 108 |
111 TEST_F(NudgeTrackerTest, HintCoalescing) { | 109 TEST_F(NudgeTrackerTest, HintCoalescing) { |
112 NudgeTracker nudge_tracker; | 110 NudgeTracker nudge_tracker; |
113 | 111 |
114 // Easy case: record one hint. | 112 // Easy case: record one hint. |
115 { | 113 { |
116 ModelTypeInvalidationMap invalidation_map = | 114 ObjectIdInvalidationMap invalidation_map = |
117 ModelTypeSetToInvalidationMap(ModelTypeSet(BOOKMARKS), | 115 BuildInvalidationMap(BOOKMARKS, 1, "bm_hint_1"); |
118 std::string("bm_hint_1")); | |
119 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 116 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
120 | 117 |
121 sync_pb::GetUpdateTriggers gu_trigger; | 118 sync_pb::GetUpdateTriggers gu_trigger; |
122 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); | 119 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); |
123 ASSERT_EQ(1, gu_trigger.notification_hint_size()); | 120 ASSERT_EQ(1, gu_trigger.notification_hint_size()); |
124 EXPECT_EQ("bm_hint_1", gu_trigger.notification_hint(0)); | 121 EXPECT_EQ("bm_hint_1", gu_trigger.notification_hint(0)); |
125 EXPECT_FALSE(gu_trigger.client_dropped_hints()); | 122 EXPECT_FALSE(gu_trigger.client_dropped_hints()); |
126 } | 123 } |
127 | 124 |
128 // Record a second hint for the same type. | 125 // Record a second hint for the same type. |
129 { | 126 { |
130 ModelTypeInvalidationMap invalidation_map = | 127 ObjectIdInvalidationMap invalidation_map = |
131 ModelTypeSetToInvalidationMap(ModelTypeSet(BOOKMARKS), | 128 BuildInvalidationMap(BOOKMARKS, 2, "bm_hint_2"); |
132 std::string("bm_hint_2")); | |
133 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 129 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
134 | 130 |
135 sync_pb::GetUpdateTriggers gu_trigger; | 131 sync_pb::GetUpdateTriggers gu_trigger; |
136 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); | 132 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); |
137 ASSERT_EQ(2, gu_trigger.notification_hint_size()); | 133 ASSERT_EQ(2, gu_trigger.notification_hint_size()); |
138 | 134 |
139 // Expect the most hint recent is last in the list. | 135 // Expect the most hint recent is last in the list. |
140 EXPECT_EQ("bm_hint_1", gu_trigger.notification_hint(0)); | 136 EXPECT_EQ("bm_hint_1", gu_trigger.notification_hint(0)); |
141 EXPECT_EQ("bm_hint_2", gu_trigger.notification_hint(1)); | 137 EXPECT_EQ("bm_hint_2", gu_trigger.notification_hint(1)); |
142 EXPECT_FALSE(gu_trigger.client_dropped_hints()); | 138 EXPECT_FALSE(gu_trigger.client_dropped_hints()); |
143 } | 139 } |
144 | 140 |
145 // Record a hint for a different type. | 141 // Record a hint for a different type. |
146 { | 142 { |
147 ModelTypeInvalidationMap invalidation_map = | 143 ObjectIdInvalidationMap invalidation_map = |
148 ModelTypeSetToInvalidationMap(ModelTypeSet(PASSWORDS), | 144 BuildInvalidationMap(PASSWORDS, 1, "pw_hint_1"); |
149 std::string("pw_hint_1")); | |
150 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 145 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
151 | 146 |
152 // Re-verify the bookmarks to make sure they're unaffected. | 147 // Re-verify the bookmarks to make sure they're unaffected. |
153 sync_pb::GetUpdateTriggers bm_gu_trigger; | 148 sync_pb::GetUpdateTriggers bm_gu_trigger; |
154 nudge_tracker.FillProtoMessage(BOOKMARKS, &bm_gu_trigger); | 149 nudge_tracker.FillProtoMessage(BOOKMARKS, &bm_gu_trigger); |
155 ASSERT_EQ(2, bm_gu_trigger.notification_hint_size()); | 150 ASSERT_EQ(2, bm_gu_trigger.notification_hint_size()); |
156 EXPECT_EQ("bm_hint_1", bm_gu_trigger.notification_hint(0)); | 151 EXPECT_EQ("bm_hint_1", bm_gu_trigger.notification_hint(0)); |
157 EXPECT_EQ("bm_hint_2", | 152 EXPECT_EQ("bm_hint_2", |
158 bm_gu_trigger.notification_hint(1)); // most recent last. | 153 bm_gu_trigger.notification_hint(1)); // most recent last. |
159 EXPECT_FALSE(bm_gu_trigger.client_dropped_hints()); | 154 EXPECT_FALSE(bm_gu_trigger.client_dropped_hints()); |
160 | 155 |
161 // Verify the new type, too. | 156 // Verify the new type, too. |
162 sync_pb::GetUpdateTriggers pw_gu_trigger; | 157 sync_pb::GetUpdateTriggers pw_gu_trigger; |
163 nudge_tracker.FillProtoMessage(PASSWORDS, &pw_gu_trigger); | 158 nudge_tracker.FillProtoMessage(PASSWORDS, &pw_gu_trigger); |
164 ASSERT_EQ(1, pw_gu_trigger.notification_hint_size()); | 159 ASSERT_EQ(1, pw_gu_trigger.notification_hint_size()); |
165 EXPECT_EQ("pw_hint_1", pw_gu_trigger.notification_hint(0)); | 160 EXPECT_EQ("pw_hint_1", pw_gu_trigger.notification_hint(0)); |
166 EXPECT_FALSE(pw_gu_trigger.client_dropped_hints()); | 161 EXPECT_FALSE(pw_gu_trigger.client_dropped_hints()); |
167 } | 162 } |
168 } | 163 } |
169 | 164 |
170 TEST_F(NudgeTrackerTest, DropHintsLocally) { | 165 TEST_F(NudgeTrackerTest, DropHintsLocally) { |
171 NudgeTracker nudge_tracker; | 166 NudgeTracker nudge_tracker; |
172 ModelTypeInvalidationMap invalidation_map = | 167 ObjectIdInvalidationMap invalidation_map = |
173 ModelTypeSetToInvalidationMap(ModelTypeSet(BOOKMARKS), | 168 BuildInvalidationMap(BOOKMARKS, 1, "hint"); |
174 std::string("hint")); | |
175 | 169 |
176 for (size_t i = 0; i < GetHintBufferSize(); ++i) { | 170 for (size_t i = 0; i < GetHintBufferSize(); ++i) { |
177 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 171 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
178 } | 172 } |
179 { | 173 { |
180 sync_pb::GetUpdateTriggers gu_trigger; | 174 sync_pb::GetUpdateTriggers gu_trigger; |
181 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); | 175 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); |
182 EXPECT_EQ(GetHintBufferSize(), | 176 EXPECT_EQ(GetHintBufferSize(), |
183 static_cast<size_t>(gu_trigger.notification_hint_size())); | 177 static_cast<size_t>(gu_trigger.notification_hint_size())); |
184 EXPECT_FALSE(gu_trigger.client_dropped_hints()); | 178 EXPECT_FALSE(gu_trigger.client_dropped_hints()); |
185 } | 179 } |
186 | 180 |
187 // Force an overflow. | 181 // Force an overflow. |
188 ModelTypeInvalidationMap invalidation_map2 = | 182 ObjectIdInvalidationMap invalidation_map2 = |
189 ModelTypeSetToInvalidationMap(ModelTypeSet(BOOKMARKS), | 183 BuildInvalidationMap(BOOKMARKS, 1000, "new_hint"); |
190 std::string("new_hint")); | |
191 nudge_tracker.RecordRemoteInvalidation(invalidation_map2); | 184 nudge_tracker.RecordRemoteInvalidation(invalidation_map2); |
192 | 185 |
193 { | 186 { |
194 sync_pb::GetUpdateTriggers gu_trigger; | 187 sync_pb::GetUpdateTriggers gu_trigger; |
195 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); | 188 nudge_tracker.FillProtoMessage(BOOKMARKS, &gu_trigger); |
196 EXPECT_EQ(GetHintBufferSize(), | 189 EXPECT_EQ(GetHintBufferSize(), |
197 static_cast<size_t>(gu_trigger.notification_hint_size())); | 190 static_cast<size_t>(gu_trigger.notification_hint_size())); |
198 EXPECT_TRUE(gu_trigger.client_dropped_hints()); | 191 EXPECT_TRUE(gu_trigger.client_dropped_hints()); |
199 | 192 |
200 // Verify the newest hint was not dropped and is the last in the list. | 193 // Verify the newest hint was not dropped and is the last in the list. |
(...skipping 82 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
283 nudge_tracker.RecordSuccessfulSyncCycle(); | 276 nudge_tracker.RecordSuccessfulSyncCycle(); |
284 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); | 277 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); |
285 | 278 |
286 // Refresh requests. | 279 // Refresh requests. |
287 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(SESSIONS)); | 280 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(SESSIONS)); |
288 EXPECT_TRUE(nudge_tracker.IsSyncRequired()); | 281 EXPECT_TRUE(nudge_tracker.IsSyncRequired()); |
289 nudge_tracker.RecordSuccessfulSyncCycle(); | 282 nudge_tracker.RecordSuccessfulSyncCycle(); |
290 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); | 283 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); |
291 | 284 |
292 // Invalidations. | 285 // Invalidations. |
293 ModelTypeInvalidationMap invalidation_map = | 286 ObjectIdInvalidationMap invalidation_map = |
294 ModelTypeSetToInvalidationMap(ModelTypeSet(PREFERENCES), | 287 BuildInvalidationMap(PREFERENCES, 1, "hint"); |
295 std::string("hint")); | |
296 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 288 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
297 EXPECT_TRUE(nudge_tracker.IsSyncRequired()); | 289 EXPECT_TRUE(nudge_tracker.IsSyncRequired()); |
298 nudge_tracker.RecordSuccessfulSyncCycle(); | 290 nudge_tracker.RecordSuccessfulSyncCycle(); |
299 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); | 291 EXPECT_FALSE(nudge_tracker.IsSyncRequired()); |
300 } | 292 } |
301 | 293 |
302 // Basic tests for the IsGetUpdatesRequired() flag. | 294 // Basic tests for the IsGetUpdatesRequired() flag. |
303 TEST_F(NudgeTrackerTest, IsGetUpdatesRequired) { | 295 TEST_F(NudgeTrackerTest, IsGetUpdatesRequired) { |
304 NudgeTracker nudge_tracker; | 296 NudgeTracker nudge_tracker; |
305 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); | 297 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); |
306 | 298 |
307 // Local changes. | 299 // Local changes. |
308 nudge_tracker.RecordLocalChange(ModelTypeSet(SESSIONS)); | 300 nudge_tracker.RecordLocalChange(ModelTypeSet(SESSIONS)); |
309 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); | 301 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); |
310 nudge_tracker.RecordSuccessfulSyncCycle(); | 302 nudge_tracker.RecordSuccessfulSyncCycle(); |
311 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); | 303 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); |
312 | 304 |
313 // Refresh requests. | 305 // Refresh requests. |
314 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(SESSIONS)); | 306 nudge_tracker.RecordLocalRefreshRequest(ModelTypeSet(SESSIONS)); |
315 EXPECT_TRUE(nudge_tracker.IsGetUpdatesRequired()); | 307 EXPECT_TRUE(nudge_tracker.IsGetUpdatesRequired()); |
316 nudge_tracker.RecordSuccessfulSyncCycle(); | 308 nudge_tracker.RecordSuccessfulSyncCycle(); |
317 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); | 309 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); |
318 | 310 |
319 // Invalidations. | 311 // Invalidations. |
320 ModelTypeInvalidationMap invalidation_map = | 312 ObjectIdInvalidationMap invalidation_map = |
321 ModelTypeSetToInvalidationMap(ModelTypeSet(PREFERENCES), | 313 BuildInvalidationMap(PREFERENCES, 1, "hint"); |
322 std::string("hint")); | |
323 nudge_tracker.RecordRemoteInvalidation(invalidation_map); | 314 nudge_tracker.RecordRemoteInvalidation(invalidation_map); |
324 EXPECT_TRUE(nudge_tracker.IsGetUpdatesRequired()); | 315 EXPECT_TRUE(nudge_tracker.IsGetUpdatesRequired()); |
325 nudge_tracker.RecordSuccessfulSyncCycle(); | 316 nudge_tracker.RecordSuccessfulSyncCycle(); |
326 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); | 317 EXPECT_FALSE(nudge_tracker.IsGetUpdatesRequired()); |
327 } | 318 } |
328 | 319 |
329 // Test IsSyncRequired() responds correctly to data type throttling. | 320 // Test IsSyncRequired() responds correctly to data type throttling. |
330 TEST_F(NudgeTrackerTest, IsSyncRequired_Throttling) { | 321 TEST_F(NudgeTrackerTest, IsSyncRequired_Throttling) { |
331 NudgeTracker nudge_tracker; | 322 NudgeTracker nudge_tracker; |
332 const base::TimeTicks t0 = base::TimeTicks::FromInternalValue(1234); | 323 const base::TimeTicks t0 = base::TimeTicks::FromInternalValue(1234); |
(...skipping 135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
468 EXPECT_EQ(throttle2_length - throttle1_length, | 459 EXPECT_EQ(throttle2_length - throttle1_length, |
469 nudge_tracker.GetTimeUntilNextUnthrottle(t1)); | 460 nudge_tracker.GetTimeUntilNextUnthrottle(t1)); |
470 | 461 |
471 // Expire the second interval. | 462 // Expire the second interval. |
472 nudge_tracker.UpdateTypeThrottlingState(t2); | 463 nudge_tracker.UpdateTypeThrottlingState(t2); |
473 EXPECT_TRUE(nudge_tracker.GetThrottledTypes().Empty()); | 464 EXPECT_TRUE(nudge_tracker.GetThrottledTypes().Empty()); |
474 } | 465 } |
475 | 466 |
476 } // namespace sessions | 467 } // namespace sessions |
477 } // namespace syncer | 468 } // namespace syncer |
OLD | NEW |