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 |