| OLD | NEW |
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 "chrome/browser/sync/syncable/syncable.h" | 5 #include "chrome/browser/sync/syncable/syncable.h" |
| 6 | 6 |
| 7 #include "build/build_config.h" | |
| 8 | |
| 9 #include <sys/types.h> | |
| 10 | |
| 11 #include <limits> | |
| 12 #include <string> | 7 #include <string> |
| 13 | 8 |
| 14 #if !defined(OS_WIN) | |
| 15 #define MAX_PATH PATH_MAX | |
| 16 #include <ostream> | |
| 17 #include <stdio.h> | |
| 18 #include <sys/ipc.h> | |
| 19 #include <sys/sem.h> | |
| 20 #include <sys/times.h> | |
| 21 #endif // !defined(OS_WIN) | |
| 22 | |
| 23 #include "base/compiler_specific.h" | 9 #include "base/compiler_specific.h" |
| 24 #include "base/file_path.h" | 10 #include "base/file_path.h" |
| 25 #include "base/file_util.h" | 11 #include "base/file_util.h" |
| 26 #include "base/location.h" | 12 #include "base/location.h" |
| 27 #include "base/logging.h" | 13 #include "base/logging.h" |
| 28 #include "base/memory/scoped_ptr.h" | 14 #include "base/memory/scoped_ptr.h" |
| 15 #include "base/message_loop.h" |
| 29 #include "base/scoped_temp_dir.h" | 16 #include "base/scoped_temp_dir.h" |
| 30 #include "base/stringprintf.h" | 17 #include "base/stringprintf.h" |
| 31 #include "base/synchronization/condition_variable.h" | 18 #include "base/synchronization/condition_variable.h" |
| 32 #include "base/threading/platform_thread.h" | 19 #include "base/threading/platform_thread.h" |
| 33 #include "base/values.h" | 20 #include "base/values.h" |
| 34 #include "chrome/browser/sync/engine/syncproto.h" | 21 #include "chrome/browser/sync/engine/syncproto.h" |
| 35 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 22 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| 36 #include "chrome/browser/sync/syncable/directory_backing_store.h" | 23 #include "chrome/browser/sync/syncable/directory_backing_store.h" |
| 37 #include "chrome/browser/sync/syncable/directory_change_delegate.h" | 24 #include "chrome/browser/sync/syncable/directory_change_delegate.h" |
| 38 #include "chrome/browser/sync/syncable/directory_manager.h" | 25 #include "chrome/browser/sync/syncable/directory_manager.h" |
| 39 #include "chrome/browser/sync/test/engine/test_id_factory.h" | 26 #include "chrome/browser/sync/test/engine/test_id_factory.h" |
| 40 #include "chrome/browser/sync/test/engine/test_syncable_utils.h" | 27 #include "chrome/browser/sync/test/engine/test_syncable_utils.h" |
| 41 #include "chrome/browser/sync/test/null_directory_change_delegate.h" | 28 #include "chrome/browser/sync/test/null_directory_change_delegate.h" |
| 29 #include "chrome/browser/sync/test/null_transaction_observer.h" |
| 42 #include "chrome/test/base/values_test_util.h" | 30 #include "chrome/test/base/values_test_util.h" |
| 43 #include "testing/gtest/include/gtest/gtest.h" | 31 #include "testing/gtest/include/gtest/gtest.h" |
| 44 #include "third_party/sqlite/sqlite3.h" | 32 #include "third_party/sqlite/sqlite3.h" |
| 45 | 33 |
| 46 using browser_sync::TestIdFactory; | 34 using browser_sync::TestIdFactory; |
| 47 using test::ExpectDictBooleanValue; | 35 using test::ExpectDictBooleanValue; |
| 48 using test::ExpectDictStringValue; | 36 using test::ExpectDictStringValue; |
| 49 | 37 |
| 50 namespace syncable { | 38 namespace syncable { |
| 51 | 39 |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 96 public: | 84 public: |
| 97 virtual void SetUp() { | 85 virtual void SetUp() { |
| 98 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 86 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 99 db_path_ = temp_dir_.path().Append( | 87 db_path_ = temp_dir_.path().Append( |
| 100 FILE_PATH_LITERAL("SyncableTest.sqlite3")); | 88 FILE_PATH_LITERAL("SyncableTest.sqlite3")); |
| 101 } | 89 } |
| 102 | 90 |
| 103 virtual void TearDown() { | 91 virtual void TearDown() { |
| 104 } | 92 } |
| 105 protected: | 93 protected: |
| 94 MessageLoop message_loop_; |
| 106 ScopedTempDir temp_dir_; | 95 ScopedTempDir temp_dir_; |
| 107 NullDirectoryChangeDelegate delegate_; | 96 NullDirectoryChangeDelegate delegate_; |
| 108 FilePath db_path_; | 97 FilePath db_path_; |
| 109 }; | 98 }; |
| 110 | 99 |
| 111 TEST_F(SyncableGeneralTest, General) { | 100 TEST_F(SyncableGeneralTest, General) { |
| 112 Directory dir; | 101 Directory dir; |
| 113 dir.Open(db_path_, "SimpleTest", &delegate_); | 102 dir.Open(db_path_, "SimpleTest", &delegate_, NullTransactionObserver()); |
| 114 | 103 |
| 115 int64 root_metahandle; | 104 int64 root_metahandle; |
| 116 { | 105 { |
| 117 ReadTransaction rtrans(FROM_HERE, &dir); | 106 ReadTransaction rtrans(FROM_HERE, &dir); |
| 118 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); | 107 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); |
| 119 ASSERT_TRUE(e.good()); | 108 ASSERT_TRUE(e.good()); |
| 120 root_metahandle = e.Get(META_HANDLE); | 109 root_metahandle = e.Get(META_HANDLE); |
| 121 } | 110 } |
| 122 | 111 |
| 123 int64 written_metahandle; | 112 int64 written_metahandle; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 e.Put(IS_DEL, true); | 191 e.Put(IS_DEL, true); |
| 203 | 192 |
| 204 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), name)); | 193 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), name)); |
| 205 } | 194 } |
| 206 | 195 |
| 207 dir.SaveChanges(); | 196 dir.SaveChanges(); |
| 208 } | 197 } |
| 209 | 198 |
| 210 TEST_F(SyncableGeneralTest, ChildrenOps) { | 199 TEST_F(SyncableGeneralTest, ChildrenOps) { |
| 211 Directory dir; | 200 Directory dir; |
| 212 dir.Open(db_path_, "SimpleTest", &delegate_); | 201 dir.Open(db_path_, "SimpleTest", &delegate_, NullTransactionObserver()); |
| 213 | 202 |
| 214 int64 root_metahandle; | 203 int64 root_metahandle; |
| 215 { | 204 { |
| 216 ReadTransaction rtrans(FROM_HERE, &dir); | 205 ReadTransaction rtrans(FROM_HERE, &dir); |
| 217 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); | 206 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); |
| 218 ASSERT_TRUE(e.good()); | 207 ASSERT_TRUE(e.good()); |
| 219 root_metahandle = e.Get(META_HANDLE); | 208 root_metahandle = e.Get(META_HANDLE); |
| 220 } | 209 } |
| 221 | 210 |
| 222 int64 written_metahandle; | 211 int64 written_metahandle; |
| (...skipping 59 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 282 TEST_F(SyncableGeneralTest, ClientIndexRebuildsProperly) { | 271 TEST_F(SyncableGeneralTest, ClientIndexRebuildsProperly) { |
| 283 int64 written_metahandle; | 272 int64 written_metahandle; |
| 284 TestIdFactory factory; | 273 TestIdFactory factory; |
| 285 const Id id = factory.NewServerId(); | 274 const Id id = factory.NewServerId(); |
| 286 std::string name = "cheesepuffs"; | 275 std::string name = "cheesepuffs"; |
| 287 std::string tag = "dietcoke"; | 276 std::string tag = "dietcoke"; |
| 288 | 277 |
| 289 // Test creating a new meta entry. | 278 // Test creating a new meta entry. |
| 290 { | 279 { |
| 291 Directory dir; | 280 Directory dir; |
| 292 dir.Open(db_path_, "IndexTest", &delegate_); | 281 dir.Open(db_path_, "IndexTest", &delegate_, NullTransactionObserver()); |
| 293 { | 282 { |
| 294 WriteTransaction wtrans(FROM_HERE, UNITTEST, &dir); | 283 WriteTransaction wtrans(FROM_HERE, UNITTEST, &dir); |
| 295 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); | 284 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); |
| 296 ASSERT_TRUE(me.good()); | 285 ASSERT_TRUE(me.good()); |
| 297 me.Put(ID, id); | 286 me.Put(ID, id); |
| 298 me.Put(BASE_VERSION, 1); | 287 me.Put(BASE_VERSION, 1); |
| 299 me.Put(UNIQUE_CLIENT_TAG, tag); | 288 me.Put(UNIQUE_CLIENT_TAG, tag); |
| 300 written_metahandle = me.Get(META_HANDLE); | 289 written_metahandle = me.Get(META_HANDLE); |
| 301 } | 290 } |
| 302 dir.SaveChanges(); | 291 dir.SaveChanges(); |
| 303 } | 292 } |
| 304 | 293 |
| 305 // The DB was closed. Now reopen it. This will cause index regeneration. | 294 // The DB was closed. Now reopen it. This will cause index regeneration. |
| 306 { | 295 { |
| 307 Directory dir; | 296 Directory dir; |
| 308 dir.Open(db_path_, "IndexTest", &delegate_); | 297 dir.Open(db_path_, "IndexTest", &delegate_, NullTransactionObserver()); |
| 309 | 298 |
| 310 ReadTransaction trans(FROM_HERE, &dir); | 299 ReadTransaction trans(FROM_HERE, &dir); |
| 311 Entry me(&trans, GET_BY_CLIENT_TAG, tag); | 300 Entry me(&trans, GET_BY_CLIENT_TAG, tag); |
| 312 ASSERT_TRUE(me.good()); | 301 ASSERT_TRUE(me.good()); |
| 313 EXPECT_EQ(me.Get(ID), id); | 302 EXPECT_EQ(me.Get(ID), id); |
| 314 EXPECT_EQ(me.Get(BASE_VERSION), 1); | 303 EXPECT_EQ(me.Get(BASE_VERSION), 1); |
| 315 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); | 304 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); |
| 316 EXPECT_EQ(me.Get(META_HANDLE), written_metahandle); | 305 EXPECT_EQ(me.Get(META_HANDLE), written_metahandle); |
| 317 } | 306 } |
| 318 } | 307 } |
| 319 | 308 |
| 320 TEST_F(SyncableGeneralTest, ClientIndexRebuildsDeletedProperly) { | 309 TEST_F(SyncableGeneralTest, ClientIndexRebuildsDeletedProperly) { |
| 321 TestIdFactory factory; | 310 TestIdFactory factory; |
| 322 const Id id = factory.NewServerId(); | 311 const Id id = factory.NewServerId(); |
| 323 std::string tag = "dietcoke"; | 312 std::string tag = "dietcoke"; |
| 324 | 313 |
| 325 // Test creating a deleted, unsynced, server meta entry. | 314 // Test creating a deleted, unsynced, server meta entry. |
| 326 { | 315 { |
| 327 Directory dir; | 316 Directory dir; |
| 328 dir.Open(db_path_, "IndexTest", &delegate_); | 317 dir.Open(db_path_, "IndexTest", &delegate_, NullTransactionObserver()); |
| 329 { | 318 { |
| 330 WriteTransaction wtrans(FROM_HERE, UNITTEST, &dir); | 319 WriteTransaction wtrans(FROM_HERE, UNITTEST, &dir); |
| 331 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "deleted"); | 320 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "deleted"); |
| 332 ASSERT_TRUE(me.good()); | 321 ASSERT_TRUE(me.good()); |
| 333 me.Put(ID, id); | 322 me.Put(ID, id); |
| 334 me.Put(BASE_VERSION, 1); | 323 me.Put(BASE_VERSION, 1); |
| 335 me.Put(UNIQUE_CLIENT_TAG, tag); | 324 me.Put(UNIQUE_CLIENT_TAG, tag); |
| 336 me.Put(IS_DEL, true); | 325 me.Put(IS_DEL, true); |
| 337 me.Put(IS_UNSYNCED, true); // Or it might be purged. | 326 me.Put(IS_UNSYNCED, true); // Or it might be purged. |
| 338 } | 327 } |
| 339 dir.SaveChanges(); | 328 dir.SaveChanges(); |
| 340 } | 329 } |
| 341 | 330 |
| 342 // The DB was closed. Now reopen it. This will cause index regeneration. | 331 // The DB was closed. Now reopen it. This will cause index regeneration. |
| 343 // Should still be present and valid in the client tag index. | 332 // Should still be present and valid in the client tag index. |
| 344 { | 333 { |
| 345 Directory dir; | 334 Directory dir; |
| 346 dir.Open(db_path_, "IndexTest", &delegate_); | 335 dir.Open(db_path_, "IndexTest", &delegate_, NullTransactionObserver()); |
| 347 | 336 |
| 348 ReadTransaction trans(FROM_HERE, &dir); | 337 ReadTransaction trans(FROM_HERE, &dir); |
| 349 Entry me(&trans, GET_BY_CLIENT_TAG, tag); | 338 Entry me(&trans, GET_BY_CLIENT_TAG, tag); |
| 350 ASSERT_TRUE(me.good()); | 339 ASSERT_TRUE(me.good()); |
| 351 EXPECT_EQ(me.Get(ID), id); | 340 EXPECT_EQ(me.Get(ID), id); |
| 352 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); | 341 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); |
| 353 EXPECT_TRUE(me.Get(IS_DEL)); | 342 EXPECT_TRUE(me.Get(IS_DEL)); |
| 354 EXPECT_TRUE(me.Get(IS_UNSYNCED)); | 343 EXPECT_TRUE(me.Get(IS_UNSYNCED)); |
| 355 } | 344 } |
| 356 } | 345 } |
| 357 | 346 |
| 358 TEST_F(SyncableGeneralTest, ToValue) { | 347 TEST_F(SyncableGeneralTest, ToValue) { |
| 359 Directory dir; | 348 Directory dir; |
| 360 dir.Open(db_path_, "SimpleTest", &delegate_); | 349 dir.Open(db_path_, "SimpleTest", &delegate_, NullTransactionObserver()); |
| 361 | 350 |
| 362 const Id id = TestIdFactory::FromNumber(99); | 351 const Id id = TestIdFactory::FromNumber(99); |
| 363 { | 352 { |
| 364 ReadTransaction rtrans(FROM_HERE, &dir); | 353 ReadTransaction rtrans(FROM_HERE, &dir); |
| 365 Entry e(&rtrans, GET_BY_ID, id); | 354 Entry e(&rtrans, GET_BY_ID, id); |
| 366 EXPECT_FALSE(e.good()); // Hasn't been written yet. | 355 EXPECT_FALSE(e.good()); // Hasn't been written yet. |
| 367 | 356 |
| 368 scoped_ptr<DictionaryValue> value(e.ToValue()); | 357 scoped_ptr<DictionaryValue> value(e.ToValue()); |
| 369 ExpectDictBooleanValue(false, *value, "good"); | 358 ExpectDictBooleanValue(false, *value, "good"); |
| 370 EXPECT_EQ(1u, value->size()); | 359 EXPECT_EQ(1u, value->size()); |
| (...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 virtual DirectoryBackingStore* CreateBackingStore( | 394 virtual DirectoryBackingStore* CreateBackingStore( |
| 406 const std::string& dir_name, | 395 const std::string& dir_name, |
| 407 const FilePath& backing_filepath) { | 396 const FilePath& backing_filepath) { |
| 408 return new UnsaveableBackingStore(dir_name, backing_filepath); | 397 return new UnsaveableBackingStore(dir_name, backing_filepath); |
| 409 } | 398 } |
| 410 }; | 399 }; |
| 411 | 400 |
| 412 // Test suite for syncable::Directory. | 401 // Test suite for syncable::Directory. |
| 413 class SyncableDirectoryTest : public testing::Test { | 402 class SyncableDirectoryTest : public testing::Test { |
| 414 protected: | 403 protected: |
| 404 MessageLoop message_loop_; |
| 415 ScopedTempDir temp_dir_; | 405 ScopedTempDir temp_dir_; |
| 416 static const char kName[]; | 406 static const char kName[]; |
| 417 static const Id kId; | 407 static const Id kId; |
| 418 | 408 |
| 419 // SetUp() is called before each test case is run. | 409 // SetUp() is called before each test case is run. |
| 420 // The sqlite3 DB is deleted before each test is run. | 410 // The sqlite3 DB is deleted before each test is run. |
| 421 virtual void SetUp() { | 411 virtual void SetUp() { |
| 422 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 412 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 423 file_path_ = temp_dir_.path().Append( | 413 file_path_ = temp_dir_.path().Append( |
| 424 FILE_PATH_LITERAL("Test.sqlite3")); | 414 FILE_PATH_LITERAL("Test.sqlite3")); |
| 425 file_util::Delete(file_path_, true); | 415 file_util::Delete(file_path_, true); |
| 426 dir_.reset(new Directory()); | 416 dir_.reset(new Directory()); |
| 427 ASSERT_TRUE(dir_.get()); | 417 ASSERT_TRUE(dir_.get()); |
| 428 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); | 418 ASSERT_EQ(OPENED, dir_->Open(file_path_, kName, |
| 419 &delegate_, NullTransactionObserver())); |
| 429 ASSERT_TRUE(dir_->good()); | 420 ASSERT_TRUE(dir_->good()); |
| 430 } | 421 } |
| 431 | 422 |
| 432 virtual void TearDown() { | 423 virtual void TearDown() { |
| 433 // This also closes file handles. | 424 // This also closes file handles. |
| 434 dir_->SaveChanges(); | 425 dir_->SaveChanges(); |
| 435 dir_.reset(); | 426 dir_.reset(); |
| 436 file_util::Delete(file_path_, true); | 427 file_util::Delete(file_path_, true); |
| 437 } | 428 } |
| 438 | 429 |
| 439 void ReloadDir() { | 430 void ReloadDir() { |
| 440 dir_.reset(new Directory()); | 431 dir_.reset(new Directory()); |
| 441 ASSERT_TRUE(dir_.get()); | 432 ASSERT_TRUE(dir_.get()); |
| 442 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); | 433 ASSERT_EQ(OPENED, dir_->Open(file_path_, kName, |
| 434 &delegate_, NullTransactionObserver())); |
| 443 } | 435 } |
| 444 | 436 |
| 445 void SaveAndReloadDir() { | 437 void SaveAndReloadDir() { |
| 446 dir_->SaveChanges(); | 438 dir_->SaveChanges(); |
| 447 ReloadDir(); | 439 ReloadDir(); |
| 448 } | 440 } |
| 449 | 441 |
| 450 bool IsInDirtyMetahandles(int64 metahandle) { | 442 bool IsInDirtyMetahandles(int64 metahandle) { |
| 451 return 1 == dir_->kernel_->dirty_metahandles->count(metahandle); | 443 return 1 == dir_->kernel_->dirty_metahandles->count(metahandle); |
| 452 } | 444 } |
| (...skipping 742 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1195 specifics.MutableExtension(sync_pb::bookmark)->set_url("http://nowhere"); | 1187 specifics.MutableExtension(sync_pb::bookmark)->set_url("http://nowhere"); |
| 1196 create.Put(SPECIFICS, specifics); | 1188 create.Put(SPECIFICS, specifics); |
| 1197 create_pre_save = create.GetKernelCopy(); | 1189 create_pre_save = create.GetKernelCopy(); |
| 1198 update_pre_save = update.GetKernelCopy(); | 1190 update_pre_save = update.GetKernelCopy(); |
| 1199 create_id = create.Get(ID); | 1191 create_id = create.Get(ID); |
| 1200 } | 1192 } |
| 1201 | 1193 |
| 1202 dir_->SaveChanges(); | 1194 dir_->SaveChanges(); |
| 1203 dir_.reset(new Directory()); | 1195 dir_.reset(new Directory()); |
| 1204 ASSERT_TRUE(dir_.get()); | 1196 ASSERT_TRUE(dir_.get()); |
| 1205 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); | 1197 ASSERT_EQ(OPENED, dir_->Open(file_path_, kName, |
| 1198 &delegate_, NullTransactionObserver())); |
| 1206 ASSERT_TRUE(dir_->good()); | 1199 ASSERT_TRUE(dir_->good()); |
| 1207 | 1200 |
| 1208 { | 1201 { |
| 1209 ReadTransaction trans(FROM_HERE, dir_.get()); | 1202 ReadTransaction trans(FROM_HERE, dir_.get()); |
| 1210 Entry create(&trans, GET_BY_ID, create_id); | 1203 Entry create(&trans, GET_BY_ID, create_id); |
| 1211 EXPECT_EQ(1, CountEntriesWithName(&trans, trans.root_id(), create_name)); | 1204 EXPECT_EQ(1, CountEntriesWithName(&trans, trans.root_id(), create_name)); |
| 1212 Entry update(&trans, GET_BY_ID, update_id); | 1205 Entry update(&trans, GET_BY_ID, update_id); |
| 1213 create_post_save = create.GetKernelCopy(); | 1206 create_post_save = create.GetKernelCopy(); |
| 1214 update_post_save = update.GetKernelCopy(); | 1207 update_post_save = update.GetKernelCopy(); |
| 1215 } | 1208 } |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1294 aguilera.Put(NON_UNIQUE_NAME, "overwritten"); | 1287 aguilera.Put(NON_UNIQUE_NAME, "overwritten"); |
| 1295 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); | 1288 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); |
| 1296 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1289 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1297 } | 1290 } |
| 1298 ASSERT_TRUE(dir_->SaveChanges()); | 1291 ASSERT_TRUE(dir_->SaveChanges()); |
| 1299 | 1292 |
| 1300 // Now do some operations using a directory for which SaveChanges will | 1293 // Now do some operations using a directory for which SaveChanges will |
| 1301 // always fail. | 1294 // always fail. |
| 1302 dir_.reset(new TestUnsaveableDirectory()); | 1295 dir_.reset(new TestUnsaveableDirectory()); |
| 1303 ASSERT_TRUE(dir_.get()); | 1296 ASSERT_TRUE(dir_.get()); |
| 1304 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); | 1297 ASSERT_EQ(OPENED, dir_->Open(file_path_, kName, |
| 1298 &delegate_, NullTransactionObserver())); |
| 1305 ASSERT_TRUE(dir_->good()); | 1299 ASSERT_TRUE(dir_->good()); |
| 1306 int64 handle2 = 0; | 1300 int64 handle2 = 0; |
| 1307 { | 1301 { |
| 1308 WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get()); | 1302 WriteTransaction trans(FROM_HERE, UNITTEST, dir_.get()); |
| 1309 | 1303 |
| 1310 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); | 1304 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); |
| 1311 ASSERT_TRUE(aguilera.good()); | 1305 ASSERT_TRUE(aguilera.good()); |
| 1312 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); | 1306 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); |
| 1313 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "overwritten"); | 1307 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "overwritten"); |
| 1314 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); | 1308 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); |
| (...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1367 e1.Put(ID, TestIdFactory::FromNumber(101)); | 1361 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 1368 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); | 1362 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); |
| 1369 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1363 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1370 } | 1364 } |
| 1371 ASSERT_TRUE(dir_->SaveChanges()); | 1365 ASSERT_TRUE(dir_->SaveChanges()); |
| 1372 | 1366 |
| 1373 // Now do some operations using a directory for which SaveChanges will | 1367 // Now do some operations using a directory for which SaveChanges will |
| 1374 // always fail. | 1368 // always fail. |
| 1375 dir_.reset(new TestUnsaveableDirectory()); | 1369 dir_.reset(new TestUnsaveableDirectory()); |
| 1376 ASSERT_TRUE(dir_.get()); | 1370 ASSERT_TRUE(dir_.get()); |
| 1377 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); | 1371 ASSERT_EQ(OPENED, dir_->Open(file_path_, kName, |
| 1372 &delegate_, NullTransactionObserver())); |
| 1378 ASSERT_TRUE(dir_->good()); | 1373 ASSERT_TRUE(dir_->good()); |
| 1379 | 1374 |
| 1380 ModelTypeSet set; | 1375 ModelTypeSet set; |
| 1381 set.insert(BOOKMARKS); | 1376 set.insert(BOOKMARKS); |
| 1382 dir_->PurgeEntriesWithTypeIn(set); | 1377 dir_->PurgeEntriesWithTypeIn(set); |
| 1383 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); | 1378 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); |
| 1384 ASSERT_FALSE(dir_->SaveChanges()); | 1379 ASSERT_FALSE(dir_->SaveChanges()); |
| 1385 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); | 1380 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); |
| 1386 } | 1381 } |
| 1387 | 1382 |
| (...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1489 | 1484 |
| 1490 class SyncableDirectoryManager : public testing::Test { | 1485 class SyncableDirectoryManager : public testing::Test { |
| 1491 public: | 1486 public: |
| 1492 virtual void SetUp() { | 1487 virtual void SetUp() { |
| 1493 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 1488 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 1494 } | 1489 } |
| 1495 | 1490 |
| 1496 virtual void TearDown() { | 1491 virtual void TearDown() { |
| 1497 } | 1492 } |
| 1498 protected: | 1493 protected: |
| 1494 MessageLoop message_loop_; |
| 1499 ScopedTempDir temp_dir_; | 1495 ScopedTempDir temp_dir_; |
| 1500 NullDirectoryChangeDelegate delegate_; | 1496 NullDirectoryChangeDelegate delegate_; |
| 1501 }; | 1497 }; |
| 1502 | 1498 |
| 1503 TEST_F(SyncableDirectoryManager, TestFileRelease) { | 1499 TEST_F(SyncableDirectoryManager, TestFileRelease) { |
| 1504 DirectoryManager dm(FilePath(temp_dir_.path())); | 1500 DirectoryManager dm(FilePath(temp_dir_.path())); |
| 1505 ASSERT_TRUE(dm.Open("ScopeTest", &delegate_)); | 1501 ASSERT_TRUE(dm.Open("ScopeTest", &delegate_, NullTransactionObserver())); |
| 1506 { | 1502 { |
| 1507 ScopedDirLookup(&dm, "ScopeTest"); | 1503 ScopedDirLookup(&dm, "ScopeTest"); |
| 1508 } | 1504 } |
| 1509 dm.Close("ScopeTest"); | 1505 dm.Close("ScopeTest"); |
| 1510 ASSERT_TRUE(file_util::Delete(dm.GetSyncDataDatabasePath(), true)); | 1506 ASSERT_TRUE(file_util::Delete(dm.GetSyncDataDatabasePath(), true)); |
| 1511 } | 1507 } |
| 1512 | 1508 |
| 1513 class ThreadOpenTestDelegate : public base::PlatformThread::Delegate { | 1509 class ThreadOpenTestDelegate : public base::PlatformThread::Delegate { |
| 1514 public: | 1510 public: |
| 1515 explicit ThreadOpenTestDelegate(DirectoryManager* dm) | 1511 explicit ThreadOpenTestDelegate(DirectoryManager* dm) |
| 1516 : directory_manager_(dm) {} | 1512 : directory_manager_(dm) {} |
| 1517 DirectoryManager* const directory_manager_; | 1513 DirectoryManager* const directory_manager_; |
| 1518 NullDirectoryChangeDelegate delegate_; | 1514 NullDirectoryChangeDelegate delegate_; |
| 1519 | 1515 |
| 1520 private: | 1516 private: |
| 1521 // PlatformThread::Delegate methods: | 1517 // PlatformThread::Delegate methods: |
| 1522 virtual void ThreadMain() { | 1518 virtual void ThreadMain() { |
| 1523 CHECK(directory_manager_->Open("Open", &delegate_)); | 1519 CHECK(directory_manager_->Open( |
| 1520 "Open", &delegate_, NullTransactionObserver())); |
| 1524 } | 1521 } |
| 1525 | 1522 |
| 1526 DISALLOW_COPY_AND_ASSIGN(ThreadOpenTestDelegate); | 1523 DISALLOW_COPY_AND_ASSIGN(ThreadOpenTestDelegate); |
| 1527 }; | 1524 }; |
| 1528 | 1525 |
| 1529 TEST_F(SyncableDirectoryManager, ThreadOpenTest) { | 1526 TEST_F(SyncableDirectoryManager, ThreadOpenTest) { |
| 1530 DirectoryManager dm(FilePath(temp_dir_.path())); | 1527 DirectoryManager dm(FilePath(temp_dir_.path())); |
| 1531 base::PlatformThreadHandle thread_handle; | 1528 base::PlatformThreadHandle thread_handle; |
| 1532 ThreadOpenTestDelegate test_delegate(&dm); | 1529 ThreadOpenTestDelegate test_delegate(&dm); |
| 1533 ASSERT_TRUE(base::PlatformThread::Create(0, &test_delegate, &thread_handle)); | 1530 ASSERT_TRUE(base::PlatformThread::Create(0, &test_delegate, &thread_handle)); |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1557 : role_(role), step_(step), directory_manager_(dirman) {} | 1554 : role_(role), step_(step), directory_manager_(dirman) {} |
| 1558 | 1555 |
| 1559 protected: | 1556 protected: |
| 1560 const int role_; | 1557 const int role_; |
| 1561 Step* const step_; | 1558 Step* const step_; |
| 1562 NullDirectoryChangeDelegate delegate_; | 1559 NullDirectoryChangeDelegate delegate_; |
| 1563 DirectoryManager* const directory_manager_; | 1560 DirectoryManager* const directory_manager_; |
| 1564 | 1561 |
| 1565 // PlatformThread::Delegate methods: | 1562 // PlatformThread::Delegate methods: |
| 1566 virtual void ThreadMain() { | 1563 virtual void ThreadMain() { |
| 1564 MessageLoop message_loop; |
| 1567 const std::string dirname = "ThreadBug1"; | 1565 const std::string dirname = "ThreadBug1"; |
| 1568 base::AutoLock scoped_lock(step_->mutex); | 1566 base::AutoLock scoped_lock(step_->mutex); |
| 1569 | 1567 |
| 1570 while (step_->number < 3) { | 1568 while (step_->number < 3) { |
| 1571 while (step_->number % 2 != role_) { | 1569 while (step_->number % 2 != role_) { |
| 1572 step_->condvar.Wait(); | 1570 step_->condvar.Wait(); |
| 1573 } | 1571 } |
| 1574 switch (step_->number) { | 1572 switch (step_->number) { |
| 1575 case 0: | 1573 case 0: |
| 1576 directory_manager_->Open(dirname, &delegate_); | 1574 directory_manager_->Open( |
| 1575 dirname, &delegate_, NullTransactionObserver()); |
| 1577 break; | 1576 break; |
| 1578 case 1: | 1577 case 1: |
| 1579 { | 1578 { |
| 1580 directory_manager_->Close(dirname); | 1579 directory_manager_->Close(dirname); |
| 1581 directory_manager_->Open(dirname, &delegate_); | 1580 directory_manager_->Open( |
| 1581 dirname, &delegate_, NullTransactionObserver()); |
| 1582 ScopedDirLookup dir(directory_manager_, dirname); | 1582 ScopedDirLookup dir(directory_manager_, dirname); |
| 1583 CHECK(dir.good()); | 1583 CHECK(dir.good()); |
| 1584 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | 1584 WriteTransaction trans(FROM_HERE, UNITTEST, dir); |
| 1585 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); | 1585 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); |
| 1586 step_->metahandle = me.Get(META_HANDLE); | 1586 step_->metahandle = me.Get(META_HANDLE); |
| 1587 me.Put(IS_UNSYNCED, true); | 1587 me.Put(IS_UNSYNCED, true); |
| 1588 } | 1588 } |
| 1589 break; | 1589 break; |
| 1590 case 2: | 1590 case 2: |
| 1591 { | 1591 { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1629 // The in-memory information would get out of sync because a | 1629 // The in-memory information would get out of sync because a |
| 1630 // directory would be closed and re-opened, and then an old | 1630 // directory would be closed and re-opened, and then an old |
| 1631 // Directory::Kernel with stale information would get saved to the db. | 1631 // Directory::Kernel with stale information would get saved to the db. |
| 1632 class DirectoryKernelStalenessBugDelegate : public ThreadBugDelegate { | 1632 class DirectoryKernelStalenessBugDelegate : public ThreadBugDelegate { |
| 1633 public: | 1633 public: |
| 1634 DirectoryKernelStalenessBugDelegate(int role, Step* step, | 1634 DirectoryKernelStalenessBugDelegate(int role, Step* step, |
| 1635 DirectoryManager* dirman) | 1635 DirectoryManager* dirman) |
| 1636 : ThreadBugDelegate(role, step, dirman) {} | 1636 : ThreadBugDelegate(role, step, dirman) {} |
| 1637 | 1637 |
| 1638 virtual void ThreadMain() { | 1638 virtual void ThreadMain() { |
| 1639 MessageLoop message_loop; |
| 1639 const char test_bytes[] = "test data"; | 1640 const char test_bytes[] = "test data"; |
| 1640 const std::string dirname = "DirectoryKernelStalenessBug"; | 1641 const std::string dirname = "DirectoryKernelStalenessBug"; |
| 1641 base::AutoLock scoped_lock(step_->mutex); | 1642 base::AutoLock scoped_lock(step_->mutex); |
| 1642 const Id jeff_id = TestIdFactory::FromNumber(100); | 1643 const Id jeff_id = TestIdFactory::FromNumber(100); |
| 1643 | 1644 |
| 1644 while (step_->number < 4) { | 1645 while (step_->number < 4) { |
| 1645 while (step_->number % 2 != role_) { | 1646 while (step_->number % 2 != role_) { |
| 1646 step_->condvar.Wait(); | 1647 step_->condvar.Wait(); |
| 1647 } | 1648 } |
| 1648 switch (step_->number) { | 1649 switch (step_->number) { |
| 1649 case 0: | 1650 case 0: |
| 1650 { | 1651 { |
| 1651 // Clean up remnants of earlier test runs. | 1652 // Clean up remnants of earlier test runs. |
| 1652 file_util::Delete(directory_manager_->GetSyncDataDatabasePath(), | 1653 file_util::Delete(directory_manager_->GetSyncDataDatabasePath(), |
| 1653 true); | 1654 true); |
| 1654 // Test. | 1655 // Test. |
| 1655 directory_manager_->Open(dirname, &delegate_); | 1656 directory_manager_->Open( |
| 1657 dirname, &delegate_, NullTransactionObserver()); |
| 1656 ScopedDirLookup dir(directory_manager_, dirname); | 1658 ScopedDirLookup dir(directory_manager_, dirname); |
| 1657 CHECK(dir.good()); | 1659 CHECK(dir.good()); |
| 1658 WriteTransaction trans(FROM_HERE, UNITTEST, dir); | 1660 WriteTransaction trans(FROM_HERE, UNITTEST, dir); |
| 1659 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); | 1661 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); |
| 1660 me.Put(BASE_VERSION, 1); | 1662 me.Put(BASE_VERSION, 1); |
| 1661 me.Put(ID, jeff_id); | 1663 me.Put(ID, jeff_id); |
| 1662 PutDataAsBookmarkFavicon(&trans, &me, test_bytes, | 1664 PutDataAsBookmarkFavicon(&trans, &me, test_bytes, |
| 1663 sizeof(test_bytes)); | 1665 sizeof(test_bytes)); |
| 1664 } | 1666 } |
| 1665 { | 1667 { |
| 1666 ScopedDirLookup dir(directory_manager_, dirname); | 1668 ScopedDirLookup dir(directory_manager_, dirname); |
| 1667 CHECK(dir.good()); | 1669 CHECK(dir.good()); |
| 1668 dir->SaveChanges(); | 1670 dir->SaveChanges(); |
| 1669 } | 1671 } |
| 1670 directory_manager_->Close(dirname); | 1672 directory_manager_->Close(dirname); |
| 1671 break; | 1673 break; |
| 1672 case 1: | 1674 case 1: |
| 1673 { | 1675 { |
| 1674 directory_manager_->Open(dirname, &delegate_); | 1676 directory_manager_->Open( |
| 1677 dirname, &delegate_, NullTransactionObserver()); |
| 1675 ScopedDirLookup dir(directory_manager_, dirname); | 1678 ScopedDirLookup dir(directory_manager_, dirname); |
| 1676 CHECK(dir.good()); | 1679 CHECK(dir.good()); |
| 1677 } | 1680 } |
| 1678 break; | 1681 break; |
| 1679 case 2: | 1682 case 2: |
| 1680 { | 1683 { |
| 1681 ScopedDirLookup dir(directory_manager_, dirname); | 1684 ScopedDirLookup dir(directory_manager_, dirname); |
| 1682 CHECK(dir.good()); | 1685 CHECK(dir.good()); |
| 1683 } | 1686 } |
| 1684 break; | 1687 break; |
| (...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1763 e.Put(BASE_VERSION, 1); | 1766 e.Put(BASE_VERSION, 1); |
| 1764 } | 1767 } |
| 1765 } | 1768 } |
| 1766 } | 1769 } |
| 1767 } | 1770 } |
| 1768 | 1771 |
| 1769 DISALLOW_COPY_AND_ASSIGN(StressTransactionsDelegate); | 1772 DISALLOW_COPY_AND_ASSIGN(StressTransactionsDelegate); |
| 1770 }; | 1773 }; |
| 1771 | 1774 |
| 1772 TEST(SyncableDirectory, StressTransactions) { | 1775 TEST(SyncableDirectory, StressTransactions) { |
| 1776 MessageLoop message_loop; |
| 1773 ScopedTempDir temp_dir; | 1777 ScopedTempDir temp_dir; |
| 1774 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1778 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 1775 DirectoryManager dirman(FilePath(temp_dir.path())); | 1779 DirectoryManager dirman(FilePath(temp_dir.path())); |
| 1776 std::string dirname = "stress"; | 1780 std::string dirname = "stress"; |
| 1777 file_util::Delete(dirman.GetSyncDataDatabasePath(), true); | 1781 file_util::Delete(dirman.GetSyncDataDatabasePath(), true); |
| 1778 NullDirectoryChangeDelegate delegate; | 1782 NullDirectoryChangeDelegate delegate; |
| 1779 dirman.Open(dirname, &delegate); | 1783 dirman.Open(dirname, &delegate, NullTransactionObserver()); |
| 1780 | 1784 |
| 1781 const int kThreadCount = 7; | 1785 const int kThreadCount = 7; |
| 1782 base::PlatformThreadHandle threads[kThreadCount]; | 1786 base::PlatformThreadHandle threads[kThreadCount]; |
| 1783 scoped_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; | 1787 scoped_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; |
| 1784 | 1788 |
| 1785 for (int i = 0; i < kThreadCount; ++i) { | 1789 for (int i = 0; i < kThreadCount; ++i) { |
| 1786 thread_delegates[i].reset( | 1790 thread_delegates[i].reset( |
| 1787 new StressTransactionsDelegate(&dirman, dirname, i)); | 1791 new StressTransactionsDelegate(&dirman, dirname, i)); |
| 1788 ASSERT_TRUE(base::PlatformThread::Create( | 1792 ASSERT_TRUE(base::PlatformThread::Create( |
| 1789 0, thread_delegates[i].get(), &threads[i])); | 1793 0, thread_delegates[i].get(), &threads[i])); |
| (...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1887 TEST_F(SyncableClientTagTest, TestClientTagIndexDuplicateServer) { | 1891 TEST_F(SyncableClientTagTest, TestClientTagIndexDuplicateServer) { |
| 1888 EXPECT_TRUE(CreateWithDefaultTag(factory_.NewServerId(), true)); | 1892 EXPECT_TRUE(CreateWithDefaultTag(factory_.NewServerId(), true)); |
| 1889 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), true)); | 1893 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), true)); |
| 1890 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), false)); | 1894 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), false)); |
| 1891 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), false)); | 1895 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), false)); |
| 1892 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), true)); | 1896 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), true)); |
| 1893 } | 1897 } |
| 1894 | 1898 |
| 1895 } // namespace | 1899 } // namespace |
| 1896 } // namespace syncable | 1900 } // namespace syncable |
| OLD | NEW |