OLD | NEW |
1 // Copyright 2012 The Chromium Authors. All rights reserved. | 1 // Copyright 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 // Syncer unit tests. Unfortunately a lot of these tests | 5 // Syncer unit tests. Unfortunately a lot of these tests |
6 // are outdated and need to be reworked and updated. | 6 // are outdated and need to be reworked and updated. |
7 | 7 |
8 #include <algorithm> | 8 #include <algorithm> |
9 #include <limits> | 9 #include <limits> |
10 #include <list> | 10 #include <list> |
(...skipping 170 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
181 } | 181 } |
182 | 182 |
183 void SyncShareNudge() { | 183 void SyncShareNudge() { |
184 ModelSafeRoutingInfo info; | 184 ModelSafeRoutingInfo info; |
185 GetModelSafeRoutingInfo(&info); | 185 GetModelSafeRoutingInfo(&info); |
186 ModelTypeInvalidationMap invalidation_map = | 186 ModelTypeInvalidationMap invalidation_map = |
187 ModelSafeRoutingInfoToInvalidationMap(info, std::string()); | 187 ModelSafeRoutingInfoToInvalidationMap(info, std::string()); |
188 sessions::SyncSourceInfo source_info( | 188 sessions::SyncSourceInfo source_info( |
189 sync_pb::GetUpdatesCallerInfo::LOCAL, | 189 sync_pb::GetUpdatesCallerInfo::LOCAL, |
190 invalidation_map); | 190 invalidation_map); |
191 // Use our dummy nudge tracker. These tests won't notice that it hasn't | 191 session_.reset(SyncSession::Build(context_.get(), this, source_info)); |
192 // been tracking anything because the server is mocked out and ignores most | |
193 // of the content of requests sent by the client. | |
194 session_.reset( | |
195 SyncSession::BuildForNudge(context_.get(), | |
196 this, | |
197 source_info, | |
198 &nudge_tracker_)); | |
199 | 192 |
200 EXPECT_TRUE(syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END)); | 193 // Pretend we've seen a local change, to make the nudge_tracker look normal. |
| 194 nudge_tracker_.RecordLocalChange(ModelTypeSet(BOOKMARKS)); |
| 195 |
| 196 EXPECT_TRUE( |
| 197 syncer_->NormalSyncShare( |
| 198 session_.get(), |
| 199 GetRoutingInfoTypes(context_->routing_info()), |
| 200 nudge_tracker_)); |
201 } | 201 } |
202 | 202 |
203 void SyncShareConfigure() { | 203 void SyncShareConfigure() { |
204 ModelSafeRoutingInfo info; | 204 ModelSafeRoutingInfo info; |
205 GetModelSafeRoutingInfo(&info); | 205 GetModelSafeRoutingInfo(&info); |
206 ModelTypeInvalidationMap invalidation_map = | 206 ModelTypeInvalidationMap invalidation_map = |
207 ModelSafeRoutingInfoToInvalidationMap(info, std::string()); | 207 ModelSafeRoutingInfoToInvalidationMap(info, std::string()); |
208 sessions::SyncSourceInfo source_info( | 208 sessions::SyncSourceInfo source_info( |
209 sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, | 209 sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, |
210 invalidation_map); | 210 invalidation_map); |
211 session_.reset(SyncSession::Build(context_.get(), | 211 session_.reset(SyncSession::Build(context_.get(), |
212 this, | 212 this, |
213 source_info)); | 213 source_info)); |
214 EXPECT_TRUE( | 214 EXPECT_TRUE(syncer_->ConfigureSyncShare( |
215 syncer_->SyncShare(session_.get(), DOWNLOAD_UPDATES, APPLY_UPDATES)); | 215 session_.get(), |
| 216 GetRoutingInfoTypes(context_->routing_info()))); |
216 } | 217 } |
217 | 218 |
218 virtual void SetUp() { | 219 virtual void SetUp() { |
219 dir_maker_.SetUp(); | 220 dir_maker_.SetUp(); |
220 mock_server_.reset(new MockConnectionManager(directory())); | 221 mock_server_.reset(new MockConnectionManager(directory())); |
221 EnableDatatype(BOOKMARKS); | 222 EnableDatatype(BOOKMARKS); |
222 EnableDatatype(NIGORI); | 223 EnableDatatype(NIGORI); |
223 EnableDatatype(PREFERENCES); | 224 EnableDatatype(PREFERENCES); |
224 EnableDatatype(NIGORI); | 225 EnableDatatype(NIGORI); |
225 worker_ = new FakeModelWorker(GROUP_PASSIVE); | 226 worker_ = new FakeModelWorker(GROUP_PASSIVE); |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
297 EXPECT_FALSE(client_status.hierarchy_conflict_detected()); | 298 EXPECT_FALSE(client_status.hierarchy_conflict_detected()); |
298 } | 299 } |
299 | 300 |
300 void VerifyHierarchyConflictsUnspecified( | 301 void VerifyHierarchyConflictsUnspecified( |
301 const sync_pb::ClientToServerMessage& message) { | 302 const sync_pb::ClientToServerMessage& message) { |
302 // Our request should have neither confirmed nor denied hierarchy conflicts. | 303 // Our request should have neither confirmed nor denied hierarchy conflicts. |
303 const sync_pb::ClientStatus& client_status = message.client_status(); | 304 const sync_pb::ClientStatus& client_status = message.client_status(); |
304 EXPECT_FALSE(client_status.has_hierarchy_conflict_detected()); | 305 EXPECT_FALSE(client_status.has_hierarchy_conflict_detected()); |
305 } | 306 } |
306 | 307 |
307 void SyncRepeatedlyToTriggerConflictResolution(SyncSession* session) { | |
308 // We should trigger after less than 6 syncs, but extra does no harm. | |
309 for (int i = 0 ; i < 6 ; ++i) | |
310 syncer_->SyncShare(session, SYNCER_BEGIN, SYNCER_END); | |
311 } | |
312 void SyncRepeatedlyToTriggerStuckSignal(SyncSession* session) { | |
313 // We should trigger after less than 10 syncs, but we want to avoid brittle | |
314 // tests. | |
315 for (int i = 0 ; i < 12 ; ++i) | |
316 syncer_->SyncShare(session, SYNCER_BEGIN, SYNCER_END); | |
317 } | |
318 sync_pb::EntitySpecifics DefaultBookmarkSpecifics() { | 308 sync_pb::EntitySpecifics DefaultBookmarkSpecifics() { |
319 sync_pb::EntitySpecifics result; | 309 sync_pb::EntitySpecifics result; |
320 AddDefaultFieldValue(BOOKMARKS, &result); | 310 AddDefaultFieldValue(BOOKMARKS, &result); |
321 return result; | 311 return result; |
322 } | 312 } |
323 | 313 |
324 sync_pb::EntitySpecifics DefaultPreferencesSpecifics() { | 314 sync_pb::EntitySpecifics DefaultPreferencesSpecifics() { |
325 sync_pb::EntitySpecifics result; | 315 sync_pb::EntitySpecifics result; |
326 AddDefaultFieldValue(PREFERENCES, &result); | 316 AddDefaultFieldValue(PREFERENCES, &result); |
327 return result; | 317 return result; |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
415 } | 405 } |
416 } | 406 } |
417 | 407 |
418 void DoTruncationTest(const vector<int64>& unsynced_handle_view, | 408 void DoTruncationTest(const vector<int64>& unsynced_handle_view, |
419 const vector<syncable::Id>& expected_id_order) { | 409 const vector<syncable::Id>& expected_id_order) { |
420 for (size_t limit = expected_id_order.size() + 2; limit > 0; --limit) { | 410 for (size_t limit = expected_id_order.size() + 2; limit > 0; --limit) { |
421 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); | 411 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); |
422 | 412 |
423 ModelSafeRoutingInfo routes; | 413 ModelSafeRoutingInfo routes; |
424 GetModelSafeRoutingInfo(&routes); | 414 GetModelSafeRoutingInfo(&routes); |
| 415 ModelTypeSet types = GetRoutingInfoTypes(routes); |
425 sessions::OrderedCommitSet output_set(routes); | 416 sessions::OrderedCommitSet output_set(routes); |
426 GetCommitIdsCommand command(&wtrans, limit, &output_set); | 417 GetCommitIdsCommand command(&wtrans, types, limit, &output_set); |
427 std::set<int64> ready_unsynced_set; | 418 std::set<int64> ready_unsynced_set; |
428 command.FilterUnreadyEntries(&wtrans, ModelTypeSet(), | 419 command.FilterUnreadyEntries(&wtrans, types, |
429 ModelTypeSet(), false, | 420 ModelTypeSet(), false, |
430 unsynced_handle_view, &ready_unsynced_set); | 421 unsynced_handle_view, &ready_unsynced_set); |
431 command.BuildCommitIds(&wtrans, routes, ready_unsynced_set); | 422 command.BuildCommitIds(&wtrans, routes, ready_unsynced_set); |
432 size_t truncated_size = std::min(limit, expected_id_order.size()); | 423 size_t truncated_size = std::min(limit, expected_id_order.size()); |
433 ASSERT_EQ(truncated_size, output_set.Size()); | 424 ASSERT_EQ(truncated_size, output_set.Size()); |
434 for (size_t i = 0; i < truncated_size; ++i) { | 425 for (size_t i = 0; i < truncated_size; ++i) { |
435 ASSERT_EQ(expected_id_order[i], output_set.GetCommitIdAt(i)) | 426 ASSERT_EQ(expected_id_order[i], output_set.GetCommitIdAt(i)) |
436 << "At index " << i << " with batch size limited to " << limit; | 427 << "At index " << i << " with batch size limited to " << limit; |
437 } | 428 } |
438 sessions::OrderedCommitSet::Projection proj; | 429 sessions::OrderedCommitSet::Projection proj; |
(...skipping 217 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
656 // appropriately. | 647 // appropriately. |
657 expected_order.push_back(ids_.MakeServer("x")); | 648 expected_order.push_back(ids_.MakeServer("x")); |
658 expected_order.push_back(ids_.MakeLocal("b")); | 649 expected_order.push_back(ids_.MakeLocal("b")); |
659 expected_order.push_back(ids_.MakeLocal("c")); | 650 expected_order.push_back(ids_.MakeLocal("c")); |
660 expected_order.push_back(ids_.MakeLocal("d")); | 651 expected_order.push_back(ids_.MakeLocal("d")); |
661 expected_order.push_back(ids_.MakeLocal("e")); | 652 expected_order.push_back(ids_.MakeLocal("e")); |
662 expected_order.push_back(ids_.MakeLocal("j")); | 653 expected_order.push_back(ids_.MakeLocal("j")); |
663 DoTruncationTest(unsynced_handle_view, expected_order); | 654 DoTruncationTest(unsynced_handle_view, expected_order); |
664 } | 655 } |
665 | 656 |
666 // TODO(rlarocque): re-enable this test. | 657 TEST_F(SyncerTest, GetCommitIdsFiltersThrottledEntries) { |
667 TEST_F(SyncerTest, DISABLED_GetCommitIdsFiltersThrottledEntries) { | |
668 const ModelTypeSet throttled_types(BOOKMARKS); | 658 const ModelTypeSet throttled_types(BOOKMARKS); |
669 sync_pb::EntitySpecifics bookmark_data; | 659 sync_pb::EntitySpecifics bookmark_data; |
670 AddDefaultFieldValue(BOOKMARKS, &bookmark_data); | 660 AddDefaultFieldValue(BOOKMARKS, &bookmark_data); |
671 | 661 |
672 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, | 662 mock_server_->AddUpdateDirectory(1, 0, "A", 10, 10, |
673 foreign_cache_guid(), "-1"); | 663 foreign_cache_guid(), "-1"); |
674 SyncShareNudge(); | 664 SyncShareNudge(); |
675 | 665 |
676 { | 666 { |
677 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); | 667 WriteTransaction wtrans(FROM_HERE, UNITTEST, directory()); |
678 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); | 668 MutableEntry A(&wtrans, GET_BY_ID, ids_.FromNumber(1)); |
679 ASSERT_TRUE(A.good()); | 669 ASSERT_TRUE(A.good()); |
680 A.Put(IS_UNSYNCED, true); | 670 A.Put(IS_UNSYNCED, true); |
681 A.Put(SPECIFICS, bookmark_data); | 671 A.Put(SPECIFICS, bookmark_data); |
682 A.Put(NON_UNIQUE_NAME, "bookmark"); | 672 A.Put(NON_UNIQUE_NAME, "bookmark"); |
683 } | 673 } |
684 | 674 |
685 // Now set the throttled types. | 675 // Now sync without enabling bookmarks. |
686 // context_->throttled_data_type_tracker()->SetUnthrottleTime( | 676 syncer_->NormalSyncShare( |
687 // throttled_types, | 677 session_.get(), |
688 // base::TimeTicks::Now() + base::TimeDelta::FromSeconds(1200)); | 678 Difference(GetRoutingInfoTypes(context_->routing_info()), |
689 SyncShareNudge(); | 679 ModelTypeSet(BOOKMARKS)), |
| 680 nudge_tracker_); |
690 | 681 |
691 { | 682 { |
692 // Nothing should have been committed as bookmarks is throttled. | 683 // Nothing should have been committed as bookmarks is throttled. |
693 syncable::ReadTransaction rtrans(FROM_HERE, directory()); | 684 syncable::ReadTransaction rtrans(FROM_HERE, directory()); |
694 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); | 685 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); |
695 ASSERT_TRUE(entryA.good()); | 686 ASSERT_TRUE(entryA.good()); |
696 EXPECT_TRUE(entryA.Get(IS_UNSYNCED)); | 687 EXPECT_TRUE(entryA.Get(IS_UNSYNCED)); |
697 } | 688 } |
698 | 689 |
699 // Now unthrottle. | 690 // Sync again with bookmarks enabled. |
700 // context_->throttled_data_type_tracker()->SetUnthrottleTime( | 691 syncer_->NormalSyncShare( |
701 // throttled_types, | 692 session_.get(), |
702 // base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1200)); | 693 GetRoutingInfoTypes(context_->routing_info()), |
| 694 nudge_tracker_); |
703 SyncShareNudge(); | 695 SyncShareNudge(); |
704 { | 696 { |
705 // It should have been committed. | 697 // It should have been committed. |
706 syncable::ReadTransaction rtrans(FROM_HERE, directory()); | 698 syncable::ReadTransaction rtrans(FROM_HERE, directory()); |
707 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); | 699 Entry entryA(&rtrans, syncable::GET_BY_ID, ids_.FromNumber(1)); |
708 ASSERT_TRUE(entryA.good()); | 700 ASSERT_TRUE(entryA.good()); |
709 EXPECT_FALSE(entryA.Get(IS_UNSYNCED)); | 701 EXPECT_FALSE(entryA.Get(IS_UNSYNCED)); |
710 } | 702 } |
711 } | 703 } |
712 | 704 |
(...skipping 2493 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3206 local_cache_guid(), "-1"); | 3198 local_cache_guid(), "-1"); |
3207 SyncShareNudge(); | 3199 SyncShareNudge(); |
3208 { | 3200 { |
3209 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); | 3201 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); |
3210 MutableEntry entry( | 3202 MutableEntry entry( |
3211 &trans, CREATE, BOOKMARKS, trans.root_id(), "Copy of base"); | 3203 &trans, CREATE, BOOKMARKS, trans.root_id(), "Copy of base"); |
3212 WriteTestDataToEntry(&trans, &entry); | 3204 WriteTestDataToEntry(&trans, &entry); |
3213 } | 3205 } |
3214 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, | 3206 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, |
3215 local_cache_guid(), "-1"); | 3207 local_cache_guid(), "-1"); |
3216 SyncRepeatedlyToTriggerConflictResolution(session_.get()); | 3208 SyncShareNudge(); |
3217 } | 3209 } |
3218 | 3210 |
3219 // In this test a long changelog contains a child at the start of the changelog | 3211 // In this test a long changelog contains a child at the start of the changelog |
3220 // and a parent at the end. While these updates are in progress the client would | 3212 // and a parent at the end. While these updates are in progress the client would |
3221 // appear stuck. | 3213 // appear stuck. |
3222 TEST_F(SyncerTest, LongChangelistWithApplicationConflict) { | 3214 TEST_F(SyncerTest, LongChangelistWithApplicationConflict) { |
3223 const int depth = 400; | 3215 const int depth = 400; |
3224 syncable::Id folder_id = ids_.FromNumber(1); | 3216 syncable::Id folder_id = ids_.FromNumber(1); |
3225 | 3217 |
3226 // First we an item in a folder in the root. However the folder won't come | 3218 // First we an item in a folder in the root. However the folder won't come |
3227 // till much later. | 3219 // till much later. |
3228 syncable::Id stuck_entry_id = TestIdFactory::FromNumber(99999); | 3220 syncable::Id stuck_entry_id = TestIdFactory::FromNumber(99999); |
3229 mock_server_->AddUpdateDirectory(stuck_entry_id, | 3221 mock_server_->AddUpdateDirectory(stuck_entry_id, |
3230 folder_id, "stuck", 1, 1, | 3222 folder_id, "stuck", 1, 1, |
3231 foreign_cache_guid(), "-99999"); | 3223 foreign_cache_guid(), "-99999"); |
3232 mock_server_->SetChangesRemaining(depth - 1); | 3224 mock_server_->SetChangesRemaining(depth - 1); |
3233 SyncShareNudge(); | 3225 SyncShareNudge(); |
3234 | 3226 |
3235 // Buffer up a very long series of downloads. | 3227 // Buffer up a very long series of downloads. |
3236 // We should never be stuck (conflict resolution shouldn't | 3228 // We should never be stuck (conflict resolution shouldn't |
3237 // kick in so long as we're making forward progress). | 3229 // kick in so long as we're making forward progress). |
3238 for (int i = 0; i < depth; i++) { | 3230 for (int i = 0; i < depth; i++) { |
3239 mock_server_->NextUpdateBatch(); | 3231 mock_server_->NextUpdateBatch(); |
3240 mock_server_->SetNewTimestamp(i + 1); | 3232 mock_server_->SetNewTimestamp(i + 1); |
3241 mock_server_->SetChangesRemaining(depth - i); | 3233 mock_server_->SetChangesRemaining(depth - i); |
3242 } | 3234 } |
3243 | 3235 |
3244 syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 3236 SyncShareNudge(); |
3245 | 3237 |
3246 // Ensure our folder hasn't somehow applied. | 3238 // Ensure our folder hasn't somehow applied. |
3247 { | 3239 { |
3248 syncable::ReadTransaction trans(FROM_HERE, directory()); | 3240 syncable::ReadTransaction trans(FROM_HERE, directory()); |
3249 Entry child(&trans, GET_BY_ID, stuck_entry_id); | 3241 Entry child(&trans, GET_BY_ID, stuck_entry_id); |
3250 EXPECT_TRUE(child.good()); | 3242 EXPECT_TRUE(child.good()); |
3251 EXPECT_TRUE(child.Get(IS_UNAPPLIED_UPDATE)); | 3243 EXPECT_TRUE(child.Get(IS_UNAPPLIED_UPDATE)); |
3252 EXPECT_TRUE(child.Get(IS_DEL)); | 3244 EXPECT_TRUE(child.Get(IS_DEL)); |
3253 EXPECT_FALSE(child.Get(IS_UNSYNCED)); | 3245 EXPECT_FALSE(child.Get(IS_UNSYNCED)); |
3254 } | 3246 } |
(...skipping 26 matching lines...) Expand all Loading... |
3281 SyncShareNudge(); | 3273 SyncShareNudge(); |
3282 { | 3274 { |
3283 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); | 3275 WriteTransaction trans(FROM_HERE, UNITTEST, directory()); |
3284 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3276 MutableEntry entry(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3285 ASSERT_TRUE(entry.good()); | 3277 ASSERT_TRUE(entry.good()); |
3286 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base")); | 3278 EXPECT_TRUE(entry.Put(NON_UNIQUE_NAME, "Copy of base")); |
3287 entry.Put(IS_UNSYNCED, true); | 3279 entry.Put(IS_UNSYNCED, true); |
3288 } | 3280 } |
3289 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, | 3281 mock_server_->AddUpdateBookmark(1, 0, "Copy of base", 50, 50, |
3290 foreign_cache_guid(), "-1"); | 3282 foreign_cache_guid(), "-1"); |
3291 SyncRepeatedlyToTriggerConflictResolution(session_.get()); | 3283 SyncShareNudge(); |
3292 { | 3284 { |
3293 syncable::ReadTransaction trans(FROM_HERE, directory()); | 3285 syncable::ReadTransaction trans(FROM_HERE, directory()); |
3294 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); | 3286 Entry entry1(&trans, GET_BY_ID, ids_.FromNumber(1)); |
3295 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE)); | 3287 EXPECT_FALSE(entry1.Get(IS_UNAPPLIED_UPDATE)); |
3296 EXPECT_FALSE(entry1.Get(IS_UNSYNCED)); | 3288 EXPECT_FALSE(entry1.Get(IS_UNSYNCED)); |
3297 EXPECT_FALSE(entry1.Get(IS_DEL)); | 3289 EXPECT_FALSE(entry1.Get(IS_DEL)); |
3298 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); | 3290 Entry entry2(&trans, GET_BY_ID, ids_.FromNumber(2)); |
3299 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE)); | 3291 EXPECT_FALSE(entry2.Get(IS_UNAPPLIED_UPDATE)); |
3300 EXPECT_TRUE(entry2.Get(IS_UNSYNCED)); | 3292 EXPECT_TRUE(entry2.Get(IS_UNSYNCED)); |
3301 EXPECT_FALSE(entry2.Get(IS_DEL)); | 3293 EXPECT_FALSE(entry2.Get(IS_DEL)); |
(...skipping 1524 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4826 EXPECT_EQ("xyz", final_monitor_records["xyz"].extension_id); | 4818 EXPECT_EQ("xyz", final_monitor_records["xyz"].extension_id); |
4827 EXPECT_EQ(2049U, final_monitor_records["ABC"].bookmark_write_count); | 4819 EXPECT_EQ(2049U, final_monitor_records["ABC"].bookmark_write_count); |
4828 EXPECT_EQ(4U, final_monitor_records["xyz"].bookmark_write_count); | 4820 EXPECT_EQ(4U, final_monitor_records["xyz"].bookmark_write_count); |
4829 } else { | 4821 } else { |
4830 EXPECT_TRUE(final_monitor_records.empty()) | 4822 EXPECT_TRUE(final_monitor_records.empty()) |
4831 << "Should not restore records after successful bookmark commit."; | 4823 << "Should not restore records after successful bookmark commit."; |
4832 } | 4824 } |
4833 } | 4825 } |
4834 | 4826 |
4835 } // namespace syncer | 4827 } // namespace syncer |
OLD | NEW |