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

Side by Side Diff: chrome/browser/sync/syncable/syncable_unittest.cc

Issue 8586014: [Sync] Replace uses of ObserverListThreadSafe with WeakHandles (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Sync to head Created 9 years, 1 month 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 | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « chrome/browser/sync/syncable/syncable_mock.cc ('k') | chrome/browser/sync/test/engine/syncer_command_test.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698