Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Side by Side Diff: components/sync/syncable/directory_unittest.cc

Issue 2130453004: [Sync] Move //sync to //components/sync. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Rebase. Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « components/sync/syncable/directory_unittest.h ('k') | components/sync/syncable/entry.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 The Chromium Authors. All rights reserved. 1 // Copyright 2014 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/syncable/directory_unittest.h" 5 #include "components/sync/syncable/directory_unittest.h"
6 6
7 #include <stddef.h> 7 #include <stddef.h>
8 #include <stdint.h> 8 #include <stdint.h>
9 9
10 #include <cstdlib> 10 #include <cstdlib>
11 11
12 #include "base/macros.h" 12 #include "base/macros.h"
13 #include "base/rand_util.h" 13 #include "base/rand_util.h"
14 #include "base/run_loop.h" 14 #include "base/run_loop.h"
15 #include "base/strings/stringprintf.h" 15 #include "base/strings/stringprintf.h"
16 #include "base/test/values_test_util.h" 16 #include "base/test/values_test_util.h"
17 #include "sync/internal_api/public/base/attachment_id_proto.h" 17 #include "components/sync/base/attachment_id_proto.h"
18 #include "sync/syncable/syncable_proto_util.h" 18 #include "components/sync/base/mock_unrecoverable_error_handler.h"
19 #include "sync/syncable/syncable_util.h" 19 #include "components/sync/syncable/syncable_proto_util.h"
20 #include "sync/syncable/syncable_write_transaction.h" 20 #include "components/sync/syncable/syncable_util.h"
21 #include "sync/test/engine/test_syncable_utils.h" 21 #include "components/sync/syncable/syncable_write_transaction.h"
22 #include "sync/test/test_directory_backing_store.h" 22 #include "components/sync/test/engine/test_syncable_utils.h"
23 #include "sync/util/mock_unrecoverable_error_handler.h" 23 #include "components/sync/test/test_directory_backing_store.h"
24 24
25 using base::ExpectDictBooleanValue; 25 using base::ExpectDictBooleanValue;
26 using base::ExpectDictStringValue; 26 using base::ExpectDictStringValue;
27 27
28 namespace syncer { 28 namespace syncer {
29 29
30 namespace syncable { 30 namespace syncable {
31 31
32 namespace { 32 namespace {
33 33
(...skipping 19 matching lines...) Expand all
53 ASSERT_TRUE(e->GetSpecifics().has_bookmark()); 53 ASSERT_TRUE(e->GetSpecifics().has_bookmark());
54 ASSERT_EQ("http://demo/", e->GetSpecifics().bookmark().url()); 54 ASSERT_EQ("http://demo/", e->GetSpecifics().bookmark().url());
55 ASSERT_EQ(std::string(bytes, bytes_length), 55 ASSERT_EQ(std::string(bytes, bytes_length),
56 e->GetSpecifics().bookmark().favicon()); 56 e->GetSpecifics().bookmark().favicon());
57 } 57 }
58 58
59 } // namespace 59 } // namespace
60 60
61 const char SyncableDirectoryTest::kDirectoryName[] = "Foo"; 61 const char SyncableDirectoryTest::kDirectoryName[] = "Foo";
62 62
63 SyncableDirectoryTest::SyncableDirectoryTest() { 63 SyncableDirectoryTest::SyncableDirectoryTest() {}
64 }
65 64
66 SyncableDirectoryTest::~SyncableDirectoryTest() { 65 SyncableDirectoryTest::~SyncableDirectoryTest() {}
67 }
68 66
69 void SyncableDirectoryTest::SetUp() { 67 void SyncableDirectoryTest::SetUp() {
70 ASSERT_TRUE(connection_.OpenInMemory()); 68 ASSERT_TRUE(connection_.OpenInMemory());
71 ASSERT_EQ(OPENED, ReopenDirectory()); 69 ASSERT_EQ(OPENED, ReopenDirectory());
72 } 70 }
73 71
74 void SyncableDirectoryTest::TearDown() { 72 void SyncableDirectoryTest::TearDown() {
75 if (dir_) 73 if (dir_)
76 dir_->SaveChanges(); 74 dir_->SaveChanges();
77 dir_.reset(); 75 dir_.reset();
(...skipping 26 matching lines...) Expand all
104 // Creates an empty entry and sets the ID field to id. 102 // Creates an empty entry and sets the ID field to id.
105 void SyncableDirectoryTest::CreateEntry(const ModelType& model_type, 103 void SyncableDirectoryTest::CreateEntry(const ModelType& model_type,
106 const std::string& entryname, 104 const std::string& entryname,
107 const int id) { 105 const int id) {
108 CreateEntry(model_type, entryname, TestIdFactory::FromNumber(id)); 106 CreateEntry(model_type, entryname, TestIdFactory::FromNumber(id));
109 } 107 }
110 108
111 void SyncableDirectoryTest::CreateEntry(const ModelType& model_type, 109 void SyncableDirectoryTest::CreateEntry(const ModelType& model_type,
112 const std::string& entryname, 110 const std::string& entryname,
113 const Id& id) { 111 const Id& id) {
114 CreateEntryWithAttachmentMetadata( 112 CreateEntryWithAttachmentMetadata(model_type, entryname, id,
115 model_type, entryname, id, sync_pb::AttachmentMetadata()); 113 sync_pb::AttachmentMetadata());
116 } 114 }
117 115
118 void SyncableDirectoryTest::CreateEntryWithAttachmentMetadata( 116 void SyncableDirectoryTest::CreateEntryWithAttachmentMetadata(
119 const ModelType& model_type, 117 const ModelType& model_type,
120 const std::string& entryname, 118 const std::string& entryname,
121 const Id& id, 119 const Id& id,
122 const sync_pb::AttachmentMetadata& attachment_metadata) { 120 const sync_pb::AttachmentMetadata& attachment_metadata) {
123 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir_.get()); 121 WriteTransaction wtrans(FROM_HERE, UNITTEST, dir_.get());
124 MutableEntry me(&wtrans, CREATE, model_type, wtrans.root_id(), entryname); 122 MutableEntry me(&wtrans, CREATE, model_type, wtrans.root_id(), entryname);
125 ASSERT_TRUE(me.good()); 123 ASSERT_TRUE(me.good());
(...skipping 79 matching lines...) Expand 10 before | Expand all | Expand 10 after
205 } 203 }
206 204
207 DirectoryChangeDelegate* SyncableDirectoryTest::directory_change_delegate() { 205 DirectoryChangeDelegate* SyncableDirectoryTest::directory_change_delegate() {
208 return &delegate_; 206 return &delegate_;
209 } 207 }
210 208
211 Encryptor* SyncableDirectoryTest::encryptor() { 209 Encryptor* SyncableDirectoryTest::encryptor() {
212 return &encryptor_; 210 return &encryptor_;
213 } 211 }
214 212
215
216 TestUnrecoverableErrorHandler* 213 TestUnrecoverableErrorHandler*
217 SyncableDirectoryTest::unrecoverable_error_handler() { 214 SyncableDirectoryTest::unrecoverable_error_handler() {
218 return &handler_; 215 return &handler_;
219 } 216 }
220 217
221 void SyncableDirectoryTest::ValidateEntry(BaseTransaction* trans, 218 void SyncableDirectoryTest::ValidateEntry(BaseTransaction* trans,
222 int64_t id, 219 int64_t id,
223 bool check_name, 220 bool check_name,
224 const std::string& name, 221 const std::string& name,
225 int64_t base_version, 222 int64_t base_version,
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
291 } 288 }
292 // Fake SaveChanges() and make sure we got what we expected. 289 // Fake SaveChanges() and make sure we got what we expected.
293 { 290 {
294 Directory::SaveChangesSnapshot snapshot; 291 Directory::SaveChangesSnapshot snapshot;
295 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex); 292 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex);
296 dir()->TakeSnapshotForSaveChanges(&snapshot); 293 dir()->TakeSnapshotForSaveChanges(&snapshot);
297 // Make sure there's an entry for each new metahandle. Make sure all 294 // Make sure there's an entry for each new metahandle. Make sure all
298 // entries are marked dirty. 295 // entries are marked dirty.
299 ASSERT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size()); 296 ASSERT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size());
300 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin(); 297 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
301 i != snapshot.dirty_metas.end(); 298 i != snapshot.dirty_metas.end(); ++i) {
302 ++i) {
303 ASSERT_TRUE((*i)->is_dirty()); 299 ASSERT_TRUE((*i)->is_dirty());
304 } 300 }
305 dir()->VacuumAfterSaveChanges(snapshot); 301 dir()->VacuumAfterSaveChanges(snapshot);
306 } 302 }
307 // Put a new value with existing transactions as well as adding new ones. 303 // Put a new value with existing transactions as well as adding new ones.
308 { 304 {
309 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get()); 305 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get());
310 std::vector<int64_t> new_dirty_metahandles; 306 std::vector<int64_t> new_dirty_metahandles;
311 for (std::vector<int64_t>::const_iterator i = 307 for (std::vector<int64_t>::const_iterator i =
312 expected_dirty_metahandles.begin(); 308 expected_dirty_metahandles.begin();
(...skipping 13 matching lines...) Expand all
326 } 322 }
327 // Fake SaveChanges() and make sure we got what we expected. 323 // Fake SaveChanges() and make sure we got what we expected.
328 { 324 {
329 Directory::SaveChangesSnapshot snapshot; 325 Directory::SaveChangesSnapshot snapshot;
330 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex); 326 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex);
331 dir()->TakeSnapshotForSaveChanges(&snapshot); 327 dir()->TakeSnapshotForSaveChanges(&snapshot);
332 // Make sure there's an entry for each new metahandle. Make sure all 328 // Make sure there's an entry for each new metahandle. Make sure all
333 // entries are marked dirty. 329 // entries are marked dirty.
334 EXPECT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size()); 330 EXPECT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size());
335 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin(); 331 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
336 i != snapshot.dirty_metas.end(); 332 i != snapshot.dirty_metas.end(); ++i) {
337 ++i) {
338 EXPECT_TRUE((*i)->is_dirty()); 333 EXPECT_TRUE((*i)->is_dirty());
339 } 334 }
340 dir()->VacuumAfterSaveChanges(snapshot); 335 dir()->VacuumAfterSaveChanges(snapshot);
341 } 336 }
342 } 337 }
343 338
344 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsOnlyDirtyHandlesTest) { 339 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsOnlyDirtyHandlesTest) {
345 const int metahandles_to_create = 100; 340 const int metahandles_to_create = 100;
346 341
347 // half of 2 * metahandles_to_create 342 // half of 2 * metahandles_to_create
(...skipping 69 matching lines...) Expand 10 before | Expand all | Expand 10 after
417 } 412 }
418 // Fake SaveChanges() and make sure we got what we expected. 413 // Fake SaveChanges() and make sure we got what we expected.
419 { 414 {
420 Directory::SaveChangesSnapshot snapshot; 415 Directory::SaveChangesSnapshot snapshot;
421 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex); 416 base::AutoLock scoped_lock(dir()->kernel()->save_changes_mutex);
422 dir()->TakeSnapshotForSaveChanges(&snapshot); 417 dir()->TakeSnapshotForSaveChanges(&snapshot);
423 // Make sure there's an entry for each changed metahandle. Make sure all 418 // Make sure there's an entry for each changed metahandle. Make sure all
424 // entries are marked dirty. 419 // entries are marked dirty.
425 EXPECT_EQ(number_changed, snapshot.dirty_metas.size()); 420 EXPECT_EQ(number_changed, snapshot.dirty_metas.size());
426 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin(); 421 for (EntryKernelSet::const_iterator i = snapshot.dirty_metas.begin();
427 i != snapshot.dirty_metas.end(); 422 i != snapshot.dirty_metas.end(); ++i) {
428 ++i) {
429 EXPECT_TRUE((*i)->is_dirty()); 423 EXPECT_TRUE((*i)->is_dirty());
430 } 424 }
431 dir()->VacuumAfterSaveChanges(snapshot); 425 dir()->VacuumAfterSaveChanges(snapshot);
432 } 426 }
433 } 427 }
434 428
435 // Test delete journals management. 429 // Test delete journals management.
436 TEST_F(SyncableDirectoryTest, ManageDeleteJournals) { 430 TEST_F(SyncableDirectoryTest, ManageDeleteJournals) {
437 sync_pb::EntitySpecifics bookmark_specifics; 431 sync_pb::EntitySpecifics bookmark_specifics;
438 AddDefaultFieldValue(BOOKMARKS, &bookmark_specifics); 432 AddDefaultFieldValue(BOOKMARKS, &bookmark_specifics);
(...skipping 617 matching lines...) Expand 10 before | Expand all | Expand 10 after
1056 ASSERT_TRUE(item.good()); 1050 ASSERT_TRUE(item.good());
1057 item.PutId(id_factory.NewServerId()); 1051 item.PutId(id_factory.NewServerId());
1058 item.PutSpecifics(specifics); 1052 item.PutSpecifics(specifics);
1059 item.PutBaseVersion(1); 1053 item.PutBaseVersion(1);
1060 item.PutIsDir(false); 1054 item.PutIsDir(false);
1061 item.PutIsDel(false); 1055 item.PutIsDel(false);
1062 ASSERT_EQ(datatype, item.GetModelType()); 1056 ASSERT_EQ(datatype, item.GetModelType());
1063 1057
1064 // It's critical that deletion records retain their datatype, so that 1058 // It's critical that deletion records retain their datatype, so that
1065 // they can be dispatched to the appropriate change processor. 1059 // they can be dispatched to the appropriate change processor.
1066 MutableEntry deleted_item( 1060 MutableEntry deleted_item(&trans, CREATE, BOOKMARKS, trans.root_id(),
1067 &trans, CREATE, BOOKMARKS, trans.root_id(), "Deleted Item"); 1061 "Deleted Item");
1068 ASSERT_TRUE(item.good()); 1062 ASSERT_TRUE(item.good());
1069 deleted_item.PutId(id_factory.NewServerId()); 1063 deleted_item.PutId(id_factory.NewServerId());
1070 deleted_item.PutSpecifics(specifics); 1064 deleted_item.PutSpecifics(specifics);
1071 deleted_item.PutBaseVersion(1); 1065 deleted_item.PutBaseVersion(1);
1072 deleted_item.PutIsDir(false); 1066 deleted_item.PutIsDir(false);
1073 deleted_item.PutIsDel(true); 1067 deleted_item.PutIsDel(true);
1074 ASSERT_EQ(datatype, deleted_item.GetModelType()); 1068 ASSERT_EQ(datatype, deleted_item.GetModelType());
1075 1069
1076 MutableEntry server_folder( 1070 MutableEntry server_folder(&trans, CREATE_NEW_UPDATE_ITEM,
1077 &trans, CREATE_NEW_UPDATE_ITEM, id_factory.NewServerId()); 1071 id_factory.NewServerId());
1078 ASSERT_TRUE(server_folder.good()); 1072 ASSERT_TRUE(server_folder.good());
1079 server_folder.PutServerSpecifics(specifics); 1073 server_folder.PutServerSpecifics(specifics);
1080 server_folder.PutBaseVersion(1); 1074 server_folder.PutBaseVersion(1);
1081 server_folder.PutServerIsDir(true); 1075 server_folder.PutServerIsDir(true);
1082 server_folder.PutServerIsDel(false); 1076 server_folder.PutServerIsDel(false);
1083 ASSERT_EQ(datatype, server_folder.GetServerModelType()); 1077 ASSERT_EQ(datatype, server_folder.GetServerModelType());
1084 1078
1085 MutableEntry server_item( 1079 MutableEntry server_item(&trans, CREATE_NEW_UPDATE_ITEM,
1086 &trans, CREATE_NEW_UPDATE_ITEM, id_factory.NewServerId()); 1080 id_factory.NewServerId());
1087 ASSERT_TRUE(server_item.good()); 1081 ASSERT_TRUE(server_item.good());
1088 server_item.PutServerSpecifics(specifics); 1082 server_item.PutServerSpecifics(specifics);
1089 server_item.PutBaseVersion(1); 1083 server_item.PutBaseVersion(1);
1090 server_item.PutServerIsDir(false); 1084 server_item.PutServerIsDir(false);
1091 server_item.PutServerIsDel(false); 1085 server_item.PutServerIsDel(false);
1092 ASSERT_EQ(datatype, server_item.GetServerModelType()); 1086 ASSERT_EQ(datatype, server_item.GetServerModelType());
1093 1087
1094 sync_pb::SyncEntity folder_entity; 1088 sync_pb::SyncEntity folder_entity;
1095 folder_entity.set_id_string(SyncableIdToProto(id_factory.NewServerId())); 1089 folder_entity.set_id_string(SyncableIdToProto(id_factory.NewServerId()));
1096 folder_entity.set_deleted(false); 1090 folder_entity.set_deleted(false);
(...skipping 196 matching lines...) Expand 10 before | Expand all | Expand 10 after
1293 Id zombie_id = id_factory.NewLocalId(); 1287 Id zombie_id = id_factory.NewLocalId();
1294 1288
1295 // We're about to do some bad things. Tell the directory verification 1289 // We're about to do some bad things. Tell the directory verification
1296 // routines to look the other way. 1290 // routines to look the other way.
1297 dir()->SetInvariantCheckLevel(OFF); 1291 dir()->SetInvariantCheckLevel(OFF);
1298 1292
1299 { 1293 {
1300 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get()); 1294 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get());
1301 1295
1302 // Create an uncommitted tombstone entry. 1296 // Create an uncommitted tombstone entry.
1303 MutableEntry server_knows( 1297 MutableEntry server_knows(&trans, CREATE, BOOKMARKS, id_factory.root(),
1304 &trans, CREATE, BOOKMARKS, id_factory.root(), "server_knows"); 1298 "server_knows");
1305 server_knows.PutId(server_knows_id); 1299 server_knows.PutId(server_knows_id);
1306 server_knows.PutIsUnsynced(true); 1300 server_knows.PutIsUnsynced(true);
1307 server_knows.PutIsDel(true); 1301 server_knows.PutIsDel(true);
1308 server_knows.PutBaseVersion(5); 1302 server_knows.PutBaseVersion(5);
1309 server_knows.PutServerVersion(4); 1303 server_knows.PutServerVersion(4);
1310 1304
1311 // Create a valid update entry. 1305 // Create a valid update entry.
1312 MutableEntry not_is_del( 1306 MutableEntry not_is_del(&trans, CREATE, BOOKMARKS, id_factory.root(),
1313 &trans, CREATE, BOOKMARKS, id_factory.root(), "not_is_del"); 1307 "not_is_del");
1314 not_is_del.PutId(not_is_del_id); 1308 not_is_del.PutId(not_is_del_id);
1315 not_is_del.PutIsDel(false); 1309 not_is_del.PutIsDel(false);
1316 not_is_del.PutIsUnsynced(true); 1310 not_is_del.PutIsUnsynced(true);
1317 1311
1318 // Create a tombstone which should never be sent to the server because the 1312 // Create a tombstone which should never be sent to the server because the
1319 // server never knew about the item's existence. 1313 // server never knew about the item's existence.
1320 // 1314 //
1321 // New clients should never put entries into this state. We work around 1315 // New clients should never put entries into this state. We work around
1322 // this by setting IS_DEL before setting IS_UNSYNCED, something which the 1316 // this by setting IS_DEL before setting IS_UNSYNCED, something which the
1323 // client should never do in practice. 1317 // client should never do in practice.
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
1398 1392
1399 MutableEntry parent(&trans, CREATE, BOOKMARKS, id_factory.root(), "parent"); 1393 MutableEntry parent(&trans, CREATE, BOOKMARKS, id_factory.root(), "parent");
1400 parent.PutIsDir(true); 1394 parent.PutIsDir(true);
1401 parent.PutIsUnsynced(true); 1395 parent.PutIsUnsynced(true);
1402 1396
1403 // The code is littered with DCHECKs that try to stop us from doing what 1397 // The code is littered with DCHECKs that try to stop us from doing what
1404 // we're about to do. Our work-around is to create a bookmark based on 1398 // we're about to do. Our work-around is to create a bookmark based on
1405 // a server update, then update its local specifics without updating its 1399 // a server update, then update its local specifics without updating its
1406 // local unique position. 1400 // local unique position.
1407 1401
1408 MutableEntry child( 1402 MutableEntry child(&trans, CREATE_NEW_UPDATE_ITEM,
1409 &trans, CREATE_NEW_UPDATE_ITEM, id_factory.MakeServer("child")); 1403 id_factory.MakeServer("child"));
1410 sync_pb::EntitySpecifics specifics; 1404 sync_pb::EntitySpecifics specifics;
1411 AddDefaultFieldValue(BOOKMARKS, &specifics); 1405 AddDefaultFieldValue(BOOKMARKS, &specifics);
1412 child.PutIsUnappliedUpdate(true); 1406 child.PutIsUnappliedUpdate(true);
1413 child.PutSpecifics(specifics); 1407 child.PutSpecifics(specifics);
1414 1408
1415 EXPECT_TRUE(child.ShouldMaintainPosition()); 1409 EXPECT_TRUE(child.ShouldMaintainPosition());
1416 EXPECT_TRUE(!child.GetUniquePosition().IsValid()); 1410 EXPECT_TRUE(!child.GetUniquePosition().IsValid());
1417 } 1411 }
1418 1412
1419 EXPECT_EQ(FAILED_DATABASE_CORRUPT, SimulateSaveAndReloadDir()); 1413 EXPECT_EQ(FAILED_DATABASE_CORRUPT, SimulateSaveAndReloadDir());
(...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after
1696 }; 1690 };
1697 1691
1698 // Stress test Directory by accessing it from several threads concurrently. 1692 // Stress test Directory by accessing it from several threads concurrently.
1699 TEST_F(SyncableDirectoryTest, StressTransactions) { 1693 TEST_F(SyncableDirectoryTest, StressTransactions) {
1700 const int kThreadCount = 7; 1694 const int kThreadCount = 7;
1701 base::PlatformThreadHandle threads[kThreadCount]; 1695 base::PlatformThreadHandle threads[kThreadCount];
1702 std::unique_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; 1696 std::unique_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount];
1703 1697
1704 for (int i = 0; i < kThreadCount; ++i) { 1698 for (int i = 0; i < kThreadCount; ++i) {
1705 thread_delegates[i].reset(new StressTransactionsDelegate(dir().get(), i)); 1699 thread_delegates[i].reset(new StressTransactionsDelegate(dir().get(), i));
1706 ASSERT_TRUE(base::PlatformThread::Create( 1700 ASSERT_TRUE(base::PlatformThread::Create(0, thread_delegates[i].get(),
1707 0, thread_delegates[i].get(), &threads[i])); 1701 &threads[i]));
1708 } 1702 }
1709 1703
1710 for (int i = 0; i < kThreadCount; ++i) { 1704 for (int i = 0; i < kThreadCount; ++i) {
1711 base::PlatformThread::Join(threads[i]); 1705 base::PlatformThread::Join(threads[i]);
1712 } 1706 }
1713 } 1707 }
1714 1708
1715 // Verify that Directory is notifed when a MutableEntry's AttachmentMetadata 1709 // Verify that Directory is notifed when a MutableEntry's AttachmentMetadata
1716 // changes. 1710 // changes.
1717 TEST_F(SyncableDirectoryTest, MutableEntry_PutAttachmentMetadata) { 1711 TEST_F(SyncableDirectoryTest, MutableEntry_PutAttachmentMetadata) {
1718 sync_pb::AttachmentMetadata attachment_metadata; 1712 sync_pb::AttachmentMetadata attachment_metadata;
1719 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record(); 1713 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record();
1720 sync_pb::AttachmentIdProto attachment_id_proto = 1714 sync_pb::AttachmentIdProto attachment_id_proto =
1721 syncer::CreateAttachmentIdProto(0, 0); 1715 syncer::CreateAttachmentIdProto(0, 0);
1722 *record->mutable_id() = attachment_id_proto; 1716 *record->mutable_id() = attachment_id_proto;
1723 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1717 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1724 { 1718 {
1725 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get()); 1719 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get());
1726 1720
1727 // Create an entry with attachment metadata and see that the attachment id 1721 // Create an entry with attachment metadata and see that the attachment id
1728 // is not linked. 1722 // is not linked.
1729 MutableEntry entry( 1723 MutableEntry entry(&trans, CREATE, PREFERENCES, trans.root_id(),
1730 &trans, CREATE, PREFERENCES, trans.root_id(), "some entry"); 1724 "some entry");
1731 entry.PutId(TestIdFactory::FromNumber(-1)); 1725 entry.PutId(TestIdFactory::FromNumber(-1));
1732 entry.PutIsUnsynced(true); 1726 entry.PutIsUnsynced(true);
1733 1727
1734 Directory::Metahandles metahandles; 1728 Directory::Metahandles metahandles;
1735 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1729 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1736 dir()->GetMetahandlesByAttachmentId( 1730 dir()->GetMetahandlesByAttachmentId(&trans, attachment_id_proto,
1737 &trans, attachment_id_proto, &metahandles); 1731 &metahandles);
1738 ASSERT_TRUE(metahandles.empty()); 1732 ASSERT_TRUE(metahandles.empty());
1739 1733
1740 // Now add the attachment metadata and see that Directory believes it is 1734 // Now add the attachment metadata and see that Directory believes it is
1741 // linked. 1735 // linked.
1742 entry.PutAttachmentMetadata(attachment_metadata); 1736 entry.PutAttachmentMetadata(attachment_metadata);
1743 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto)); 1737 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto));
1744 dir()->GetMetahandlesByAttachmentId( 1738 dir()->GetMetahandlesByAttachmentId(&trans, attachment_id_proto,
1745 &trans, attachment_id_proto, &metahandles); 1739 &metahandles);
1746 ASSERT_FALSE(metahandles.empty()); 1740 ASSERT_FALSE(metahandles.empty());
1747 ASSERT_EQ(metahandles[0], entry.GetMetahandle()); 1741 ASSERT_EQ(metahandles[0], entry.GetMetahandle());
1748 1742
1749 // Clear out the attachment metadata and see that it's no longer linked. 1743 // Clear out the attachment metadata and see that it's no longer linked.
1750 sync_pb::AttachmentMetadata empty_attachment_metadata; 1744 sync_pb::AttachmentMetadata empty_attachment_metadata;
1751 entry.PutAttachmentMetadata(empty_attachment_metadata); 1745 entry.PutAttachmentMetadata(empty_attachment_metadata);
1752 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1746 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1753 dir()->GetMetahandlesByAttachmentId( 1747 dir()->GetMetahandlesByAttachmentId(&trans, attachment_id_proto,
1754 &trans, attachment_id_proto, &metahandles); 1748 &metahandles);
1755 ASSERT_TRUE(metahandles.empty()); 1749 ASSERT_TRUE(metahandles.empty());
1756 } 1750 }
1757 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1751 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1758 } 1752 }
1759 1753
1760 // Verify that UpdateAttachmentId updates attachment_id and is_on_server flag. 1754 // Verify that UpdateAttachmentId updates attachment_id and is_on_server flag.
1761 TEST_F(SyncableDirectoryTest, MutableEntry_UpdateAttachmentId) { 1755 TEST_F(SyncableDirectoryTest, MutableEntry_UpdateAttachmentId) {
1762 sync_pb::AttachmentMetadata attachment_metadata; 1756 sync_pb::AttachmentMetadata attachment_metadata;
1763 sync_pb::AttachmentMetadataRecord* r1 = attachment_metadata.add_record(); 1757 sync_pb::AttachmentMetadataRecord* r1 = attachment_metadata.add_record();
1764 sync_pb::AttachmentMetadataRecord* r2 = attachment_metadata.add_record(); 1758 sync_pb::AttachmentMetadataRecord* r2 = attachment_metadata.add_record();
1765 *r1->mutable_id() = syncer::CreateAttachmentIdProto(0, 0); 1759 *r1->mutable_id() = syncer::CreateAttachmentIdProto(0, 0);
1766 *r2->mutable_id() = syncer::CreateAttachmentIdProto(0, 0); 1760 *r2->mutable_id() = syncer::CreateAttachmentIdProto(0, 0);
1767 sync_pb::AttachmentIdProto attachment_id_proto = r1->id(); 1761 sync_pb::AttachmentIdProto attachment_id_proto = r1->id();
1768 1762
1769 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get()); 1763 WriteTransaction trans(FROM_HERE, UNITTEST, dir().get());
1770 1764
1771 MutableEntry entry( 1765 MutableEntry entry(&trans, CREATE, PREFERENCES, trans.root_id(),
1772 &trans, CREATE, PREFERENCES, trans.root_id(), "some entry"); 1766 "some entry");
1773 entry.PutId(TestIdFactory::FromNumber(-1)); 1767 entry.PutId(TestIdFactory::FromNumber(-1));
1774 entry.PutAttachmentMetadata(attachment_metadata); 1768 entry.PutAttachmentMetadata(attachment_metadata);
1775 1769
1776 { 1770 {
1777 const sync_pb::AttachmentMetadata& entry_metadata = 1771 const sync_pb::AttachmentMetadata& entry_metadata =
1778 entry.GetAttachmentMetadata(); 1772 entry.GetAttachmentMetadata();
1779 ASSERT_EQ(2, entry_metadata.record_size()); 1773 ASSERT_EQ(2, entry_metadata.record_size());
1780 ASSERT_FALSE(entry_metadata.record(0).is_on_server()); 1774 ASSERT_FALSE(entry_metadata.record(0).is_on_server());
1781 ASSERT_FALSE(entry_metadata.record(1).is_on_server()); 1775 ASSERT_FALSE(entry_metadata.record(1).is_on_server());
1782 ASSERT_FALSE(entry.GetIsUnsynced()); 1776 ASSERT_FALSE(entry.GetIsUnsynced());
(...skipping 18 matching lines...) Expand all
1801 sync_pb::AttachmentMetadata attachment_metadata; 1795 sync_pb::AttachmentMetadata attachment_metadata;
1802 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record(); 1796 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record();
1803 sync_pb::AttachmentIdProto attachment_id_proto = 1797 sync_pb::AttachmentIdProto attachment_id_proto =
1804 syncer::CreateAttachmentIdProto(0, 0); 1798 syncer::CreateAttachmentIdProto(0, 0);
1805 *record->mutable_id() = attachment_id_proto; 1799 *record->mutable_id() = attachment_id_proto;
1806 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1800 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1807 const Id id = TestIdFactory::FromNumber(-1); 1801 const Id id = TestIdFactory::FromNumber(-1);
1808 1802
1809 // Create an entry with attachment metadata and see that the attachment id 1803 // Create an entry with attachment metadata and see that the attachment id
1810 // is linked. 1804 // is linked.
1811 CreateEntryWithAttachmentMetadata( 1805 CreateEntryWithAttachmentMetadata(PREFERENCES, "some entry", id,
1812 PREFERENCES, "some entry", id, attachment_metadata); 1806 attachment_metadata);
1813 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto)); 1807 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto));
1814 1808
1815 // Delete the entry and see that it's still linked because the entry hasn't 1809 // Delete the entry and see that it's still linked because the entry hasn't
1816 // yet been purged. 1810 // yet been purged.
1817 DeleteEntry(id); 1811 DeleteEntry(id);
1818 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto)); 1812 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto));
1819 1813
1820 // Reload the Directory, purging the deleted entry, and see that the 1814 // Reload the Directory, purging the deleted entry, and see that the
1821 // attachment is no longer linked. 1815 // attachment is no longer linked.
1822 SimulateSaveAndReloadDir(); 1816 SimulateSaveAndReloadDir();
1823 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1817 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1824 } 1818 }
1825 1819
1826 // Verify that a given attachment can be referenced by multiple entries and that 1820 // Verify that a given attachment can be referenced by multiple entries and that
1827 // any one of the references is sufficient to ensure it remains linked. 1821 // any one of the references is sufficient to ensure it remains linked.
1828 TEST_F(SyncableDirectoryTest, Directory_LastReferenceUnlinksAttachments) { 1822 TEST_F(SyncableDirectoryTest, Directory_LastReferenceUnlinksAttachments) {
1829 // Create one attachment. 1823 // Create one attachment.
1830 sync_pb::AttachmentMetadata attachment_metadata; 1824 sync_pb::AttachmentMetadata attachment_metadata;
1831 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record(); 1825 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record();
1832 sync_pb::AttachmentIdProto attachment_id_proto = 1826 sync_pb::AttachmentIdProto attachment_id_proto =
1833 syncer::CreateAttachmentIdProto(0, 0); 1827 syncer::CreateAttachmentIdProto(0, 0);
1834 *record->mutable_id() = attachment_id_proto; 1828 *record->mutable_id() = attachment_id_proto;
1835 1829
1836 // Create two entries, each referencing the attachment. 1830 // Create two entries, each referencing the attachment.
1837 const Id id1 = TestIdFactory::FromNumber(-1); 1831 const Id id1 = TestIdFactory::FromNumber(-1);
1838 const Id id2 = TestIdFactory::FromNumber(-2); 1832 const Id id2 = TestIdFactory::FromNumber(-2);
1839 CreateEntryWithAttachmentMetadata( 1833 CreateEntryWithAttachmentMetadata(PREFERENCES, "some entry", id1,
1840 PREFERENCES, "some entry", id1, attachment_metadata); 1834 attachment_metadata);
1841 CreateEntryWithAttachmentMetadata( 1835 CreateEntryWithAttachmentMetadata(PREFERENCES, "some other entry", id2,
1842 PREFERENCES, "some other entry", id2, attachment_metadata); 1836 attachment_metadata);
1843 1837
1844 // See that the attachment is considered linked. 1838 // See that the attachment is considered linked.
1845 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto)); 1839 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto));
1846 1840
1847 // Delete the first entry, reload the Directory, see that the attachment is 1841 // Delete the first entry, reload the Directory, see that the attachment is
1848 // still linked. 1842 // still linked.
1849 DeleteEntry(id1); 1843 DeleteEntry(id1);
1850 SimulateSaveAndReloadDir(); 1844 SimulateSaveAndReloadDir();
1851 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto)); 1845 ASSERT_TRUE(dir()->IsAttachmentLinked(attachment_id_proto));
1852 1846
1853 // Delete the second entry, reload the Directory, see that the attachment is 1847 // Delete the second entry, reload the Directory, see that the attachment is
1854 // no loner linked. 1848 // no loner linked.
1855 DeleteEntry(id2); 1849 DeleteEntry(id2);
1856 SimulateSaveAndReloadDir(); 1850 SimulateSaveAndReloadDir();
1857 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto)); 1851 ASSERT_FALSE(dir()->IsAttachmentLinked(attachment_id_proto));
1858 } 1852 }
1859 1853
1860 TEST_F(SyncableDirectoryTest, Directory_GetAttachmentIdsToUpload) { 1854 TEST_F(SyncableDirectoryTest, Directory_GetAttachmentIdsToUpload) {
1861 // Create one attachment, referenced by two entries. 1855 // Create one attachment, referenced by two entries.
1862 AttachmentId attachment_id = AttachmentId::Create(0, 0); 1856 AttachmentId attachment_id = AttachmentId::Create(0, 0);
1863 sync_pb::AttachmentIdProto attachment_id_proto = attachment_id.GetProto(); 1857 sync_pb::AttachmentIdProto attachment_id_proto = attachment_id.GetProto();
1864 sync_pb::AttachmentMetadata attachment_metadata; 1858 sync_pb::AttachmentMetadata attachment_metadata;
1865 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record(); 1859 sync_pb::AttachmentMetadataRecord* record = attachment_metadata.add_record();
1866 *record->mutable_id() = attachment_id_proto; 1860 *record->mutable_id() = attachment_id_proto;
1867 const Id id1 = TestIdFactory::FromNumber(-1); 1861 const Id id1 = TestIdFactory::FromNumber(-1);
1868 const Id id2 = TestIdFactory::FromNumber(-2); 1862 const Id id2 = TestIdFactory::FromNumber(-2);
1869 CreateEntryWithAttachmentMetadata( 1863 CreateEntryWithAttachmentMetadata(PREFERENCES, "some entry", id1,
1870 PREFERENCES, "some entry", id1, attachment_metadata); 1864 attachment_metadata);
1871 CreateEntryWithAttachmentMetadata( 1865 CreateEntryWithAttachmentMetadata(PREFERENCES, "some other entry", id2,
1872 PREFERENCES, "some other entry", id2, attachment_metadata); 1866 attachment_metadata);
1873 1867
1874 // See that Directory reports that this attachment is not on the server. 1868 // See that Directory reports that this attachment is not on the server.
1875 AttachmentIdList ids; 1869 AttachmentIdList ids;
1876 { 1870 {
1877 ReadTransaction trans(FROM_HERE, dir().get()); 1871 ReadTransaction trans(FROM_HERE, dir().get());
1878 dir()->GetAttachmentIdsToUpload(&trans, PREFERENCES, &ids); 1872 dir()->GetAttachmentIdsToUpload(&trans, PREFERENCES, &ids);
1879 } 1873 }
1880 ASSERT_EQ(1U, ids.size()); 1874 ASSERT_EQ(1U, ids.size());
1881 ASSERT_EQ(attachment_id, *ids.begin()); 1875 ASSERT_EQ(attachment_id, *ids.begin());
1882 1876
(...skipping 248 matching lines...) Expand 10 before | Expand all | Expand 10 after
2131 EXPECT_FALSE(dir()->InitialSyncEndedForType(&trans, PREFERENCES)); 2125 EXPECT_FALSE(dir()->InitialSyncEndedForType(&trans, PREFERENCES));
2132 2126
2133 // Mark as complete and verify. 2127 // Mark as complete and verify.
2134 dir()->MarkInitialSyncEndedForType(&trans, PREFERENCES); 2128 dir()->MarkInitialSyncEndedForType(&trans, PREFERENCES);
2135 EXPECT_TRUE(dir()->InitialSyncEndedForType(&trans, PREFERENCES)); 2129 EXPECT_TRUE(dir()->InitialSyncEndedForType(&trans, PREFERENCES));
2136 } 2130 }
2137 2131
2138 } // namespace syncable 2132 } // namespace syncable
2139 2133
2140 } // namespace syncer 2134 } // namespace syncer
OLDNEW
« no previous file with comments | « components/sync/syncable/directory_unittest.h ('k') | components/sync/syncable/entry.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698