| 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" | 7 #include "build/build_config.h" |
| 8 | 8 |
| 9 #include <sys/types.h> | 9 #include <sys/types.h> |
| 10 | 10 |
| 11 #include <limits> | 11 #include <limits> |
| 12 #include <string> | 12 #include <string> |
| 13 | 13 |
| 14 #if !defined(OS_WIN) | 14 #if !defined(OS_WIN) |
| 15 #define MAX_PATH PATH_MAX | 15 #define MAX_PATH PATH_MAX |
| 16 #include <ostream> | 16 #include <ostream> |
| 17 #include <stdio.h> | 17 #include <stdio.h> |
| 18 #include <sys/ipc.h> | 18 #include <sys/ipc.h> |
| 19 #include <sys/sem.h> | 19 #include <sys/sem.h> |
| 20 #include <sys/times.h> | 20 #include <sys/times.h> |
| 21 #endif // !defined(OS_WIN) | 21 #endif // !defined(OS_WIN) |
| 22 | 22 |
| 23 #include "base/compiler_specific.h" |
| 23 #include "base/file_path.h" | 24 #include "base/file_path.h" |
| 24 #include "base/file_util.h" | 25 #include "base/file_util.h" |
| 25 #include "base/logging.h" | 26 #include "base/logging.h" |
| 26 #include "base/memory/scoped_ptr.h" | 27 #include "base/memory/scoped_ptr.h" |
| 27 #include "base/scoped_temp_dir.h" | 28 #include "base/scoped_temp_dir.h" |
| 28 #include "base/stringprintf.h" | 29 #include "base/stringprintf.h" |
| 29 #include "base/threading/platform_thread.h" | 30 #include "base/threading/platform_thread.h" |
| 31 #include "base/tracked.h" |
| 30 #include "base/values.h" | 32 #include "base/values.h" |
| 31 #include "chrome/browser/sync/engine/syncproto.h" | 33 #include "chrome/browser/sync/engine/syncproto.h" |
| 32 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 34 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| 33 #include "chrome/browser/sync/syncable/directory_backing_store.h" | 35 #include "chrome/browser/sync/syncable/directory_backing_store.h" |
| 36 #include "chrome/browser/sync/syncable/directory_change_delegate.h" |
| 34 #include "chrome/browser/sync/syncable/directory_manager.h" | 37 #include "chrome/browser/sync/syncable/directory_manager.h" |
| 35 #include "chrome/common/deprecated/event_sys-inl.h" | 38 #include "chrome/common/deprecated/event_sys-inl.h" |
| 36 #include "chrome/test/sync/engine/test_id_factory.h" | 39 #include "chrome/test/sync/engine/test_id_factory.h" |
| 37 #include "chrome/test/sync/engine/test_syncable_utils.h" | 40 #include "chrome/test/sync/engine/test_syncable_utils.h" |
| 41 #include "chrome/test/sync/null_directory_change_delegate.h" |
| 38 #include "chrome/test/values_test_util.h" | 42 #include "chrome/test/values_test_util.h" |
| 39 #include "testing/gtest/include/gtest/gtest.h" | 43 #include "testing/gtest/include/gtest/gtest.h" |
| 40 #include "third_party/sqlite/sqlite3.h" | 44 #include "third_party/sqlite/sqlite3.h" |
| 41 | 45 |
| 42 using browser_sync::TestIdFactory; | 46 using browser_sync::TestIdFactory; |
| 43 using test::ExpectDictBooleanValue; | 47 using test::ExpectDictBooleanValue; |
| 44 using test::ExpectDictStringValue; | 48 using test::ExpectDictStringValue; |
| 45 | 49 |
| 46 namespace syncable { | 50 namespace syncable { |
| 47 | 51 |
| (...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 93 virtual void SetUp() { | 97 virtual void SetUp() { |
| 94 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 98 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 95 db_path_ = temp_dir_.path().Append( | 99 db_path_ = temp_dir_.path().Append( |
| 96 FILE_PATH_LITERAL("SyncableTest.sqlite3")); | 100 FILE_PATH_LITERAL("SyncableTest.sqlite3")); |
| 97 } | 101 } |
| 98 | 102 |
| 99 virtual void TearDown() { | 103 virtual void TearDown() { |
| 100 } | 104 } |
| 101 protected: | 105 protected: |
| 102 ScopedTempDir temp_dir_; | 106 ScopedTempDir temp_dir_; |
| 107 NullDirectoryChangeDelegate delegate_; |
| 103 FilePath db_path_; | 108 FilePath db_path_; |
| 104 }; | 109 }; |
| 105 | 110 |
| 106 TEST_F(SyncableGeneralTest, General) { | 111 TEST_F(SyncableGeneralTest, General) { |
| 107 Directory dir; | 112 Directory dir; |
| 108 dir.Open(db_path_, "SimpleTest"); | 113 dir.Open(db_path_, "SimpleTest", &delegate_); |
| 109 | 114 |
| 110 int64 root_metahandle; | 115 int64 root_metahandle; |
| 111 { | 116 { |
| 112 ReadTransaction rtrans(&dir, __FILE__, __LINE__); | 117 ReadTransaction rtrans(&dir, FROM_HERE); |
| 113 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); | 118 Entry e(&rtrans, GET_BY_ID, rtrans.root_id()); |
| 114 ASSERT_TRUE(e.good()); | 119 ASSERT_TRUE(e.good()); |
| 115 root_metahandle = e.Get(META_HANDLE); | 120 root_metahandle = e.Get(META_HANDLE); |
| 116 } | 121 } |
| 117 | 122 |
| 118 int64 written_metahandle; | 123 int64 written_metahandle; |
| 119 const Id id = TestIdFactory::FromNumber(99); | 124 const Id id = TestIdFactory::FromNumber(99); |
| 120 std::string name = "Jeff"; | 125 std::string name = "Jeff"; |
| 121 // Test simple read operations on an empty DB. | 126 // Test simple read operations on an empty DB. |
| 122 { | 127 { |
| 123 ReadTransaction rtrans(&dir, __FILE__, __LINE__); | 128 ReadTransaction rtrans(&dir, FROM_HERE); |
| 124 Entry e(&rtrans, GET_BY_ID, id); | 129 Entry e(&rtrans, GET_BY_ID, id); |
| 125 ASSERT_FALSE(e.good()); // Hasn't been written yet. | 130 ASSERT_FALSE(e.good()); // Hasn't been written yet. |
| 126 | 131 |
| 127 Directory::ChildHandles child_handles; | 132 Directory::ChildHandles child_handles; |
| 128 dir.GetChildHandlesById(&rtrans, rtrans.root_id(), &child_handles); | 133 dir.GetChildHandlesById(&rtrans, rtrans.root_id(), &child_handles); |
| 129 EXPECT_TRUE(child_handles.empty()); | 134 EXPECT_TRUE(child_handles.empty()); |
| 130 | 135 |
| 131 dir.GetChildHandlesByHandle(&rtrans, root_metahandle, &child_handles); | 136 dir.GetChildHandlesByHandle(&rtrans, root_metahandle, &child_handles); |
| 132 EXPECT_TRUE(child_handles.empty()); | 137 EXPECT_TRUE(child_handles.empty()); |
| 133 } | 138 } |
| 134 | 139 |
| 135 // Test creating a new meta entry. | 140 // Test creating a new meta entry. |
| 136 { | 141 { |
| 137 WriteTransaction wtrans(&dir, UNITTEST, __FILE__, __LINE__); | 142 WriteTransaction wtrans(&dir, UNITTEST, FROM_HERE); |
| 138 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); | 143 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); |
| 139 ASSERT_TRUE(me.good()); | 144 ASSERT_TRUE(me.good()); |
| 140 me.Put(ID, id); | 145 me.Put(ID, id); |
| 141 me.Put(BASE_VERSION, 1); | 146 me.Put(BASE_VERSION, 1); |
| 142 written_metahandle = me.Get(META_HANDLE); | 147 written_metahandle = me.Get(META_HANDLE); |
| 143 } | 148 } |
| 144 | 149 |
| 145 // Test GetChildHandles* after something is now in the DB. | 150 // Test GetChildHandles* after something is now in the DB. |
| 146 // Also check that GET_BY_ID works. | 151 // Also check that GET_BY_ID works. |
| 147 { | 152 { |
| 148 ReadTransaction rtrans(&dir, __FILE__, __LINE__); | 153 ReadTransaction rtrans(&dir, FROM_HERE); |
| 149 Entry e(&rtrans, GET_BY_ID, id); | 154 Entry e(&rtrans, GET_BY_ID, id); |
| 150 ASSERT_TRUE(e.good()); | 155 ASSERT_TRUE(e.good()); |
| 151 | 156 |
| 152 Directory::ChildHandles child_handles; | 157 Directory::ChildHandles child_handles; |
| 153 dir.GetChildHandlesById(&rtrans, rtrans.root_id(), &child_handles); | 158 dir.GetChildHandlesById(&rtrans, rtrans.root_id(), &child_handles); |
| 154 EXPECT_EQ(1u, child_handles.size()); | 159 EXPECT_EQ(1u, child_handles.size()); |
| 155 | 160 |
| 156 for (Directory::ChildHandles::iterator i = child_handles.begin(); | 161 for (Directory::ChildHandles::iterator i = child_handles.begin(); |
| 157 i != child_handles.end(); ++i) { | 162 i != child_handles.end(); ++i) { |
| 158 EXPECT_EQ(*i, written_metahandle); | 163 EXPECT_EQ(*i, written_metahandle); |
| 159 } | 164 } |
| 160 | 165 |
| 161 dir.GetChildHandlesByHandle(&rtrans, root_metahandle, &child_handles); | 166 dir.GetChildHandlesByHandle(&rtrans, root_metahandle, &child_handles); |
| 162 EXPECT_EQ(1u, child_handles.size()); | 167 EXPECT_EQ(1u, child_handles.size()); |
| 163 | 168 |
| 164 for (Directory::ChildHandles::iterator i = child_handles.begin(); | 169 for (Directory::ChildHandles::iterator i = child_handles.begin(); |
| 165 i != child_handles.end(); ++i) { | 170 i != child_handles.end(); ++i) { |
| 166 EXPECT_EQ(*i, written_metahandle); | 171 EXPECT_EQ(*i, written_metahandle); |
| 167 } | 172 } |
| 168 } | 173 } |
| 169 | 174 |
| 170 // Test writing data to an entity. Also check that GET_BY_HANDLE works. | 175 // Test writing data to an entity. Also check that GET_BY_HANDLE works. |
| 171 static const char s[] = "Hello World."; | 176 static const char s[] = "Hello World."; |
| 172 { | 177 { |
| 173 WriteTransaction trans(&dir, UNITTEST, __FILE__, __LINE__); | 178 WriteTransaction trans(&dir, UNITTEST, FROM_HERE); |
| 174 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); | 179 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); |
| 175 ASSERT_TRUE(e.good()); | 180 ASSERT_TRUE(e.good()); |
| 176 PutDataAsBookmarkFavicon(&trans, &e, s, sizeof(s)); | 181 PutDataAsBookmarkFavicon(&trans, &e, s, sizeof(s)); |
| 177 } | 182 } |
| 178 | 183 |
| 179 // Test reading back the contents that we just wrote. | 184 // Test reading back the contents that we just wrote. |
| 180 { | 185 { |
| 181 WriteTransaction trans(&dir, UNITTEST, __FILE__, __LINE__); | 186 WriteTransaction trans(&dir, UNITTEST, FROM_HERE); |
| 182 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); | 187 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); |
| 183 ASSERT_TRUE(e.good()); | 188 ASSERT_TRUE(e.good()); |
| 184 ExpectDataFromBookmarkFaviconEquals(&trans, &e, s, sizeof(s)); | 189 ExpectDataFromBookmarkFaviconEquals(&trans, &e, s, sizeof(s)); |
| 185 } | 190 } |
| 186 | 191 |
| 187 // Verify it exists in the folder. | 192 // Verify it exists in the folder. |
| 188 { | 193 { |
| 189 ReadTransaction rtrans(&dir, __FILE__, __LINE__); | 194 ReadTransaction rtrans(&dir, FROM_HERE); |
| 190 EXPECT_EQ(1, CountEntriesWithName(&rtrans, rtrans.root_id(), name)); | 195 EXPECT_EQ(1, CountEntriesWithName(&rtrans, rtrans.root_id(), name)); |
| 191 } | 196 } |
| 192 | 197 |
| 193 // Now delete it. | 198 // Now delete it. |
| 194 { | 199 { |
| 195 WriteTransaction trans(&dir, UNITTEST, __FILE__, __LINE__); | 200 WriteTransaction trans(&dir, UNITTEST, FROM_HERE); |
| 196 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); | 201 MutableEntry e(&trans, GET_BY_HANDLE, written_metahandle); |
| 197 e.Put(IS_DEL, true); | 202 e.Put(IS_DEL, true); |
| 198 | 203 |
| 199 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), name)); | 204 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), name)); |
| 200 } | 205 } |
| 201 | 206 |
| 202 dir.SaveChanges(); | 207 dir.SaveChanges(); |
| 203 } | 208 } |
| 204 | 209 |
| 205 TEST_F(SyncableGeneralTest, ClientIndexRebuildsProperly) { | 210 TEST_F(SyncableGeneralTest, ClientIndexRebuildsProperly) { |
| 206 int64 written_metahandle; | 211 int64 written_metahandle; |
| 207 TestIdFactory factory; | 212 TestIdFactory factory; |
| 208 const Id id = factory.NewServerId(); | 213 const Id id = factory.NewServerId(); |
| 209 std::string name = "cheesepuffs"; | 214 std::string name = "cheesepuffs"; |
| 210 std::string tag = "dietcoke"; | 215 std::string tag = "dietcoke"; |
| 211 | 216 |
| 212 // Test creating a new meta entry. | 217 // Test creating a new meta entry. |
| 213 { | 218 { |
| 214 Directory dir; | 219 Directory dir; |
| 215 dir.Open(db_path_, "IndexTest"); | 220 dir.Open(db_path_, "IndexTest", &delegate_); |
| 216 { | 221 { |
| 217 WriteTransaction wtrans(&dir, UNITTEST, __FILE__, __LINE__); | 222 WriteTransaction wtrans(&dir, UNITTEST, FROM_HERE); |
| 218 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); | 223 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), name); |
| 219 ASSERT_TRUE(me.good()); | 224 ASSERT_TRUE(me.good()); |
| 220 me.Put(ID, id); | 225 me.Put(ID, id); |
| 221 me.Put(BASE_VERSION, 1); | 226 me.Put(BASE_VERSION, 1); |
| 222 me.Put(UNIQUE_CLIENT_TAG, tag); | 227 me.Put(UNIQUE_CLIENT_TAG, tag); |
| 223 written_metahandle = me.Get(META_HANDLE); | 228 written_metahandle = me.Get(META_HANDLE); |
| 224 } | 229 } |
| 225 dir.SaveChanges(); | 230 dir.SaveChanges(); |
| 226 } | 231 } |
| 227 | 232 |
| 228 // The DB was closed. Now reopen it. This will cause index regeneration. | 233 // The DB was closed. Now reopen it. This will cause index regeneration. |
| 229 { | 234 { |
| 230 Directory dir; | 235 Directory dir; |
| 231 dir.Open(db_path_, "IndexTest"); | 236 dir.Open(db_path_, "IndexTest", &delegate_); |
| 232 | 237 |
| 233 ReadTransaction trans(&dir, __FILE__, __LINE__); | 238 ReadTransaction trans(&dir, FROM_HERE); |
| 234 Entry me(&trans, GET_BY_CLIENT_TAG, tag); | 239 Entry me(&trans, GET_BY_CLIENT_TAG, tag); |
| 235 ASSERT_TRUE(me.good()); | 240 ASSERT_TRUE(me.good()); |
| 236 EXPECT_EQ(me.Get(ID), id); | 241 EXPECT_EQ(me.Get(ID), id); |
| 237 EXPECT_EQ(me.Get(BASE_VERSION), 1); | 242 EXPECT_EQ(me.Get(BASE_VERSION), 1); |
| 238 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); | 243 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); |
| 239 EXPECT_EQ(me.Get(META_HANDLE), written_metahandle); | 244 EXPECT_EQ(me.Get(META_HANDLE), written_metahandle); |
| 240 } | 245 } |
| 241 } | 246 } |
| 242 | 247 |
| 243 TEST_F(SyncableGeneralTest, ClientIndexRebuildsDeletedProperly) { | 248 TEST_F(SyncableGeneralTest, ClientIndexRebuildsDeletedProperly) { |
| 244 TestIdFactory factory; | 249 TestIdFactory factory; |
| 245 const Id id = factory.NewServerId(); | 250 const Id id = factory.NewServerId(); |
| 246 std::string tag = "dietcoke"; | 251 std::string tag = "dietcoke"; |
| 247 | 252 |
| 248 // Test creating a deleted, unsynced, server meta entry. | 253 // Test creating a deleted, unsynced, server meta entry. |
| 249 { | 254 { |
| 250 Directory dir; | 255 Directory dir; |
| 251 dir.Open(db_path_, "IndexTest"); | 256 dir.Open(db_path_, "IndexTest", &delegate_); |
| 252 { | 257 { |
| 253 WriteTransaction wtrans(&dir, UNITTEST, __FILE__, __LINE__); | 258 WriteTransaction wtrans(&dir, UNITTEST, FROM_HERE); |
| 254 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "deleted"); | 259 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "deleted"); |
| 255 ASSERT_TRUE(me.good()); | 260 ASSERT_TRUE(me.good()); |
| 256 me.Put(ID, id); | 261 me.Put(ID, id); |
| 257 me.Put(BASE_VERSION, 1); | 262 me.Put(BASE_VERSION, 1); |
| 258 me.Put(UNIQUE_CLIENT_TAG, tag); | 263 me.Put(UNIQUE_CLIENT_TAG, tag); |
| 259 me.Put(IS_DEL, true); | 264 me.Put(IS_DEL, true); |
| 260 me.Put(IS_UNSYNCED, true); // Or it might be purged. | 265 me.Put(IS_UNSYNCED, true); // Or it might be purged. |
| 261 } | 266 } |
| 262 dir.SaveChanges(); | 267 dir.SaveChanges(); |
| 263 } | 268 } |
| 264 | 269 |
| 265 // The DB was closed. Now reopen it. This will cause index regeneration. | 270 // The DB was closed. Now reopen it. This will cause index regeneration. |
| 266 // Should still be present and valid in the client tag index. | 271 // Should still be present and valid in the client tag index. |
| 267 { | 272 { |
| 268 Directory dir; | 273 Directory dir; |
| 269 dir.Open(db_path_, "IndexTest"); | 274 dir.Open(db_path_, "IndexTest", &delegate_); |
| 270 | 275 |
| 271 ReadTransaction trans(&dir, __FILE__, __LINE__); | 276 ReadTransaction trans(&dir, FROM_HERE); |
| 272 Entry me(&trans, GET_BY_CLIENT_TAG, tag); | 277 Entry me(&trans, GET_BY_CLIENT_TAG, tag); |
| 273 ASSERT_TRUE(me.good()); | 278 ASSERT_TRUE(me.good()); |
| 274 EXPECT_EQ(me.Get(ID), id); | 279 EXPECT_EQ(me.Get(ID), id); |
| 275 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); | 280 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), tag); |
| 276 EXPECT_TRUE(me.Get(IS_DEL)); | 281 EXPECT_TRUE(me.Get(IS_DEL)); |
| 277 EXPECT_TRUE(me.Get(IS_UNSYNCED)); | 282 EXPECT_TRUE(me.Get(IS_UNSYNCED)); |
| 278 } | 283 } |
| 279 } | 284 } |
| 280 | 285 |
| 281 TEST_F(SyncableGeneralTest, ToValue) { | 286 TEST_F(SyncableGeneralTest, ToValue) { |
| 282 Directory dir; | 287 Directory dir; |
| 283 dir.Open(db_path_, "SimpleTest"); | 288 dir.Open(db_path_, "SimpleTest", &delegate_); |
| 284 | 289 |
| 285 const Id id = TestIdFactory::FromNumber(99); | 290 const Id id = TestIdFactory::FromNumber(99); |
| 286 { | 291 { |
| 287 ReadTransaction rtrans(&dir, __FILE__, __LINE__); | 292 ReadTransaction rtrans(&dir, FROM_HERE); |
| 288 Entry e(&rtrans, GET_BY_ID, id); | 293 Entry e(&rtrans, GET_BY_ID, id); |
| 289 EXPECT_FALSE(e.good()); // Hasn't been written yet. | 294 EXPECT_FALSE(e.good()); // Hasn't been written yet. |
| 290 | 295 |
| 291 scoped_ptr<DictionaryValue> value(e.ToValue()); | 296 scoped_ptr<DictionaryValue> value(e.ToValue()); |
| 292 ExpectDictBooleanValue(false, *value, "good"); | 297 ExpectDictBooleanValue(false, *value, "good"); |
| 293 EXPECT_EQ(1u, value->size()); | 298 EXPECT_EQ(1u, value->size()); |
| 294 } | 299 } |
| 295 | 300 |
| 296 // Test creating a new meta entry. | 301 // Test creating a new meta entry. |
| 297 { | 302 { |
| 298 WriteTransaction wtrans(&dir, UNITTEST, __FILE__, __LINE__); | 303 WriteTransaction wtrans(&dir, UNITTEST, FROM_HERE); |
| 299 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "new"); | 304 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), "new"); |
| 300 ASSERT_TRUE(me.good()); | 305 ASSERT_TRUE(me.good()); |
| 301 me.Put(ID, id); | 306 me.Put(ID, id); |
| 302 me.Put(BASE_VERSION, 1); | 307 me.Put(BASE_VERSION, 1); |
| 303 | 308 |
| 304 scoped_ptr<DictionaryValue> value(me.ToValue()); | 309 scoped_ptr<DictionaryValue> value(me.ToValue()); |
| 305 ExpectDictBooleanValue(true, *value, "good"); | 310 ExpectDictBooleanValue(true, *value, "good"); |
| 306 EXPECT_TRUE(value->HasKey("kernel")); | 311 EXPECT_TRUE(value->HasKey("kernel")); |
| 307 ExpectDictStringValue("Unspecified", *value, "serverModelType"); | 312 ExpectDictStringValue("Unspecified", *value, "serverModelType"); |
| 308 ExpectDictStringValue("Unspecified", *value, "modelType"); | 313 ExpectDictStringValue("Unspecified", *value, "modelType"); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 342 | 347 |
| 343 // SetUp() is called before each test case is run. | 348 // SetUp() is called before each test case is run. |
| 344 // The sqlite3 DB is deleted before each test is run. | 349 // The sqlite3 DB is deleted before each test is run. |
| 345 virtual void SetUp() { | 350 virtual void SetUp() { |
| 346 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 351 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 347 file_path_ = temp_dir_.path().Append( | 352 file_path_ = temp_dir_.path().Append( |
| 348 FILE_PATH_LITERAL("Test.sqlite3")); | 353 FILE_PATH_LITERAL("Test.sqlite3")); |
| 349 file_util::Delete(file_path_, true); | 354 file_util::Delete(file_path_, true); |
| 350 dir_.reset(new Directory()); | 355 dir_.reset(new Directory()); |
| 351 ASSERT_TRUE(dir_.get()); | 356 ASSERT_TRUE(dir_.get()); |
| 352 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName)); | 357 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); |
| 353 ASSERT_TRUE(dir_->good()); | 358 ASSERT_TRUE(dir_->good()); |
| 354 } | 359 } |
| 355 | 360 |
| 356 virtual void TearDown() { | 361 virtual void TearDown() { |
| 357 // This also closes file handles. | 362 // This also closes file handles. |
| 358 dir_->SaveChanges(); | 363 dir_->SaveChanges(); |
| 359 dir_.reset(); | 364 dir_.reset(); |
| 360 file_util::Delete(file_path_, true); | 365 file_util::Delete(file_path_, true); |
| 361 } | 366 } |
| 362 | 367 |
| 363 void ReloadDir() { | 368 void ReloadDir() { |
| 364 dir_.reset(new Directory()); | 369 dir_.reset(new Directory()); |
| 365 ASSERT_TRUE(dir_.get()); | 370 ASSERT_TRUE(dir_.get()); |
| 366 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName)); | 371 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); |
| 367 } | 372 } |
| 368 | 373 |
| 369 void SaveAndReloadDir() { | 374 void SaveAndReloadDir() { |
| 370 dir_->SaveChanges(); | 375 dir_->SaveChanges(); |
| 371 ReloadDir(); | 376 ReloadDir(); |
| 372 } | 377 } |
| 373 | 378 |
| 374 bool IsInDirtyMetahandles(int64 metahandle) { | 379 bool IsInDirtyMetahandles(int64 metahandle) { |
| 375 return 1 == dir_->kernel_->dirty_metahandles->count(metahandle); | 380 return 1 == dir_->kernel_->dirty_metahandles->count(metahandle); |
| 376 } | 381 } |
| 377 | 382 |
| 378 bool IsInMetahandlesToPurge(int64 metahandle) { | 383 bool IsInMetahandlesToPurge(int64 metahandle) { |
| 379 return 1 == dir_->kernel_->metahandles_to_purge->count(metahandle); | 384 return 1 == dir_->kernel_->metahandles_to_purge->count(metahandle); |
| 380 } | 385 } |
| 381 | 386 |
| 382 void CheckPurgeEntriesWithTypeInSucceeded(const ModelTypeSet& types_to_purge, | 387 void CheckPurgeEntriesWithTypeInSucceeded(const ModelTypeSet& types_to_purge, |
| 383 bool before_reload) { | 388 bool before_reload) { |
| 384 SCOPED_TRACE(testing::Message("Before reload: ") << before_reload); | 389 SCOPED_TRACE(testing::Message("Before reload: ") << before_reload); |
| 385 { | 390 { |
| 386 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 391 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 387 MetahandleSet all_set; | 392 MetahandleSet all_set; |
| 388 dir_->GetAllMetaHandles(&trans, &all_set); | 393 dir_->GetAllMetaHandles(&trans, &all_set); |
| 389 EXPECT_EQ(3U, all_set.size()); | 394 EXPECT_EQ(3U, all_set.size()); |
| 390 if (before_reload) | 395 if (before_reload) |
| 391 EXPECT_EQ(4U, dir_->kernel_->metahandles_to_purge->size()); | 396 EXPECT_EQ(4U, dir_->kernel_->metahandles_to_purge->size()); |
| 392 for (MetahandleSet::iterator iter = all_set.begin(); | 397 for (MetahandleSet::iterator iter = all_set.begin(); |
| 393 iter != all_set.end(); ++iter) { | 398 iter != all_set.end(); ++iter) { |
| 394 Entry e(&trans, GET_BY_HANDLE, *iter); | 399 Entry e(&trans, GET_BY_HANDLE, *iter); |
| 395 if ((types_to_purge.count(e.GetModelType()) || | 400 if ((types_to_purge.count(e.GetModelType()) || |
| 396 types_to_purge.count(e.GetServerModelType()))) { | 401 types_to_purge.count(e.GetServerModelType()))) { |
| 397 FAIL() << "Illegal type should have been deleted."; | 402 FAIL() << "Illegal type should have been deleted."; |
| 398 } | 403 } |
| 399 } | 404 } |
| 400 } | 405 } |
| 401 | 406 |
| 402 EXPECT_FALSE(dir_->initial_sync_ended_for_type(PREFERENCES)); | 407 EXPECT_FALSE(dir_->initial_sync_ended_for_type(PREFERENCES)); |
| 403 EXPECT_FALSE(dir_->initial_sync_ended_for_type(AUTOFILL)); | 408 EXPECT_FALSE(dir_->initial_sync_ended_for_type(AUTOFILL)); |
| 404 EXPECT_TRUE(dir_->initial_sync_ended_for_type(BOOKMARKS)); | 409 EXPECT_TRUE(dir_->initial_sync_ended_for_type(BOOKMARKS)); |
| 405 } | 410 } |
| 406 | 411 |
| 407 scoped_ptr<Directory> dir_; | 412 scoped_ptr<Directory> dir_; |
| 408 FilePath file_path_; | 413 FilePath file_path_; |
| 414 NullDirectoryChangeDelegate delegate_; |
| 409 | 415 |
| 410 // Creates an empty entry and sets the ID field to the default kId. | 416 // Creates an empty entry and sets the ID field to the default kId. |
| 411 void CreateEntry(const std::string& entryname) { | 417 void CreateEntry(const std::string& entryname) { |
| 412 CreateEntry(entryname, kId); | 418 CreateEntry(entryname, kId); |
| 413 } | 419 } |
| 414 | 420 |
| 415 // Creates an empty entry and sets the ID field to id. | 421 // Creates an empty entry and sets the ID field to id. |
| 416 void CreateEntry(const std::string& entryname, const int id) { | 422 void CreateEntry(const std::string& entryname, const int id) { |
| 417 CreateEntry(entryname, TestIdFactory::FromNumber(id)); | 423 CreateEntry(entryname, TestIdFactory::FromNumber(id)); |
| 418 } | 424 } |
| 419 void CreateEntry(const std::string& entryname, Id id) { | 425 void CreateEntry(const std::string& entryname, Id id) { |
| 420 WriteTransaction wtrans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 426 WriteTransaction wtrans(dir_.get(), UNITTEST, FROM_HERE); |
| 421 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), entryname); | 427 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), entryname); |
| 422 ASSERT_TRUE(me.good()); | 428 ASSERT_TRUE(me.good()); |
| 423 me.Put(ID, id); | 429 me.Put(ID, id); |
| 424 me.Put(IS_UNSYNCED, true); | 430 me.Put(IS_UNSYNCED, true); |
| 425 } | 431 } |
| 426 | 432 |
| 427 void ValidateEntry(BaseTransaction* trans, | 433 void ValidateEntry(BaseTransaction* trans, |
| 428 int64 id, | 434 int64 id, |
| 429 bool check_name, | 435 bool check_name, |
| 430 const std::string& name, | 436 const std::string& name, |
| 431 int64 base_version, | 437 int64 base_version, |
| 432 int64 server_version, | 438 int64 server_version, |
| 433 bool is_del); | 439 bool is_del); |
| 434 }; | 440 }; |
| 435 | 441 |
| 436 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsMetahandlesToPurge) { | 442 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsMetahandlesToPurge) { |
| 437 const int metas_to_create = 50; | 443 const int metas_to_create = 50; |
| 438 MetahandleSet expected_purges; | 444 MetahandleSet expected_purges; |
| 439 MetahandleSet all_handles; | 445 MetahandleSet all_handles; |
| 440 { | 446 { |
| 441 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 447 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 442 for (int i = 0; i < metas_to_create; i++) { | 448 for (int i = 0; i < metas_to_create; i++) { |
| 443 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); | 449 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); |
| 444 e.Put(IS_UNSYNCED, true); | 450 e.Put(IS_UNSYNCED, true); |
| 445 sync_pb::EntitySpecifics specs; | 451 sync_pb::EntitySpecifics specs; |
| 446 if (i % 2 == 0) { | 452 if (i % 2 == 0) { |
| 447 AddDefaultExtensionValue(BOOKMARKS, &specs); | 453 AddDefaultExtensionValue(BOOKMARKS, &specs); |
| 448 expected_purges.insert(e.Get(META_HANDLE)); | 454 expected_purges.insert(e.Get(META_HANDLE)); |
| 449 all_handles.insert(e.Get(META_HANDLE)); | 455 all_handles.insert(e.Get(META_HANDLE)); |
| 450 } else { | 456 } else { |
| 451 AddDefaultExtensionValue(PREFERENCES, &specs); | 457 AddDefaultExtensionValue(PREFERENCES, &specs); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 473 | 479 |
| 474 Directory::SaveChangesSnapshot snapshot2; | 480 Directory::SaveChangesSnapshot snapshot2; |
| 475 dir_->TakeSnapshotForSaveChanges(&snapshot2); | 481 dir_->TakeSnapshotForSaveChanges(&snapshot2); |
| 476 EXPECT_TRUE(all_handles == snapshot2.metahandles_to_purge); | 482 EXPECT_TRUE(all_handles == snapshot2.metahandles_to_purge); |
| 477 } | 483 } |
| 478 | 484 |
| 479 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsAllDirtyHandlesTest) { | 485 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsAllDirtyHandlesTest) { |
| 480 const int metahandles_to_create = 100; | 486 const int metahandles_to_create = 100; |
| 481 std::vector<int64> expected_dirty_metahandles; | 487 std::vector<int64> expected_dirty_metahandles; |
| 482 { | 488 { |
| 483 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 489 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 484 for (int i = 0; i < metahandles_to_create; i++) { | 490 for (int i = 0; i < metahandles_to_create; i++) { |
| 485 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); | 491 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); |
| 486 expected_dirty_metahandles.push_back(e.Get(META_HANDLE)); | 492 expected_dirty_metahandles.push_back(e.Get(META_HANDLE)); |
| 487 e.Put(IS_UNSYNCED, true); | 493 e.Put(IS_UNSYNCED, true); |
| 488 } | 494 } |
| 489 } | 495 } |
| 490 // Fake SaveChanges() and make sure we got what we expected. | 496 // Fake SaveChanges() and make sure we got what we expected. |
| 491 { | 497 { |
| 492 Directory::SaveChangesSnapshot snapshot; | 498 Directory::SaveChangesSnapshot snapshot; |
| 493 base::AutoLock scoped_lock(dir_->kernel_->save_changes_mutex); | 499 base::AutoLock scoped_lock(dir_->kernel_->save_changes_mutex); |
| 494 dir_->TakeSnapshotForSaveChanges(&snapshot); | 500 dir_->TakeSnapshotForSaveChanges(&snapshot); |
| 495 // Make sure there's an entry for each new metahandle. Make sure all | 501 // Make sure there's an entry for each new metahandle. Make sure all |
| 496 // entries are marked dirty. | 502 // entries are marked dirty. |
| 497 ASSERT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size()); | 503 ASSERT_EQ(expected_dirty_metahandles.size(), snapshot.dirty_metas.size()); |
| 498 for (OriginalEntries::const_iterator i = snapshot.dirty_metas.begin(); | 504 for (OriginalEntries::const_iterator i = snapshot.dirty_metas.begin(); |
| 499 i != snapshot.dirty_metas.end(); ++i) { | 505 i != snapshot.dirty_metas.end(); ++i) { |
| 500 ASSERT_TRUE(i->is_dirty()); | 506 ASSERT_TRUE(i->is_dirty()); |
| 501 } | 507 } |
| 502 dir_->VacuumAfterSaveChanges(snapshot); | 508 dir_->VacuumAfterSaveChanges(snapshot); |
| 503 } | 509 } |
| 504 // Put a new value with existing transactions as well as adding new ones. | 510 // Put a new value with existing transactions as well as adding new ones. |
| 505 { | 511 { |
| 506 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 512 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 507 std::vector<int64> new_dirty_metahandles; | 513 std::vector<int64> new_dirty_metahandles; |
| 508 for (std::vector<int64>::const_iterator i = | 514 for (std::vector<int64>::const_iterator i = |
| 509 expected_dirty_metahandles.begin(); | 515 expected_dirty_metahandles.begin(); |
| 510 i != expected_dirty_metahandles.end(); ++i) { | 516 i != expected_dirty_metahandles.end(); ++i) { |
| 511 // Change existing entries to directories to dirty them. | 517 // Change existing entries to directories to dirty them. |
| 512 MutableEntry e1(&trans, GET_BY_HANDLE, *i); | 518 MutableEntry e1(&trans, GET_BY_HANDLE, *i); |
| 513 e1.Put(IS_DIR, true); | 519 e1.Put(IS_DIR, true); |
| 514 e1.Put(IS_UNSYNCED, true); | 520 e1.Put(IS_UNSYNCED, true); |
| 515 // Add new entries | 521 // Add new entries |
| 516 MutableEntry e2(&trans, CREATE, trans.root_id(), "bar"); | 522 MutableEntry e2(&trans, CREATE, trans.root_id(), "bar"); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 547 dir_->set_initial_sync_ended_for_type(PREFERENCES, true); | 553 dir_->set_initial_sync_ended_for_type(PREFERENCES, true); |
| 548 dir_->set_initial_sync_ended_for_type(AUTOFILL, true); | 554 dir_->set_initial_sync_ended_for_type(AUTOFILL, true); |
| 549 | 555 |
| 550 std::set<ModelType> types_to_purge; | 556 std::set<ModelType> types_to_purge; |
| 551 types_to_purge.insert(PREFERENCES); | 557 types_to_purge.insert(PREFERENCES); |
| 552 types_to_purge.insert(AUTOFILL); | 558 types_to_purge.insert(AUTOFILL); |
| 553 | 559 |
| 554 TestIdFactory id_factory; | 560 TestIdFactory id_factory; |
| 555 // Create some items for each type. | 561 // Create some items for each type. |
| 556 { | 562 { |
| 557 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 563 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 558 MutableEntry item1(&trans, CREATE, trans.root_id(), "Item"); | 564 MutableEntry item1(&trans, CREATE, trans.root_id(), "Item"); |
| 559 ASSERT_TRUE(item1.good()); | 565 ASSERT_TRUE(item1.good()); |
| 560 item1.Put(SPECIFICS, bookmark_specs); | 566 item1.Put(SPECIFICS, bookmark_specs); |
| 561 item1.Put(SERVER_SPECIFICS, bookmark_specs); | 567 item1.Put(SERVER_SPECIFICS, bookmark_specs); |
| 562 item1.Put(IS_UNSYNCED, true); | 568 item1.Put(IS_UNSYNCED, true); |
| 563 | 569 |
| 564 MutableEntry item2(&trans, CREATE_NEW_UPDATE_ITEM, | 570 MutableEntry item2(&trans, CREATE_NEW_UPDATE_ITEM, |
| 565 id_factory.NewServerId()); | 571 id_factory.NewServerId()); |
| 566 ASSERT_TRUE(item2.good()); | 572 ASSERT_TRUE(item2.good()); |
| 567 item2.Put(SERVER_SPECIFICS, bookmark_specs); | 573 item2.Put(SERVER_SPECIFICS, bookmark_specs); |
| (...skipping 19 matching lines...) Expand all Loading... |
| 587 | 593 |
| 588 MutableEntry item6(&trans, CREATE_NEW_UPDATE_ITEM, | 594 MutableEntry item6(&trans, CREATE_NEW_UPDATE_ITEM, |
| 589 id_factory.NewServerId()); | 595 id_factory.NewServerId()); |
| 590 ASSERT_TRUE(item6.good()); | 596 ASSERT_TRUE(item6.good()); |
| 591 item6.Put(SERVER_SPECIFICS, autofill_specs); | 597 item6.Put(SERVER_SPECIFICS, autofill_specs); |
| 592 item6.Put(IS_UNAPPLIED_UPDATE, true); | 598 item6.Put(IS_UNAPPLIED_UPDATE, true); |
| 593 } | 599 } |
| 594 | 600 |
| 595 dir_->SaveChanges(); | 601 dir_->SaveChanges(); |
| 596 { | 602 { |
| 597 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 603 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 598 MetahandleSet all_set; | 604 MetahandleSet all_set; |
| 599 dir_->GetAllMetaHandles(&trans, &all_set); | 605 dir_->GetAllMetaHandles(&trans, &all_set); |
| 600 ASSERT_EQ(7U, all_set.size()); | 606 ASSERT_EQ(7U, all_set.size()); |
| 601 } | 607 } |
| 602 | 608 |
| 603 dir_->PurgeEntriesWithTypeIn(types_to_purge); | 609 dir_->PurgeEntriesWithTypeIn(types_to_purge); |
| 604 | 610 |
| 605 // We first query the in-memory data, and then reload the directory (without | 611 // We first query the in-memory data, and then reload the directory (without |
| 606 // saving) to verify that disk does not still have the data. | 612 // saving) to verify that disk does not still have the data. |
| 607 CheckPurgeEntriesWithTypeInSucceeded(types_to_purge, true); | 613 CheckPurgeEntriesWithTypeInSucceeded(types_to_purge, true); |
| 608 SaveAndReloadDir(); | 614 SaveAndReloadDir(); |
| 609 CheckPurgeEntriesWithTypeInSucceeded(types_to_purge, false); | 615 CheckPurgeEntriesWithTypeInSucceeded(types_to_purge, false); |
| 610 } | 616 } |
| 611 | 617 |
| 612 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsOnlyDirtyHandlesTest) { | 618 TEST_F(SyncableDirectoryTest, TakeSnapshotGetsOnlyDirtyHandlesTest) { |
| 613 const int metahandles_to_create = 100; | 619 const int metahandles_to_create = 100; |
| 614 | 620 |
| 615 // half of 2 * metahandles_to_create | 621 // half of 2 * metahandles_to_create |
| 616 const unsigned int number_changed = 100u; | 622 const unsigned int number_changed = 100u; |
| 617 std::vector<int64> expected_dirty_metahandles; | 623 std::vector<int64> expected_dirty_metahandles; |
| 618 { | 624 { |
| 619 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 625 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 620 for (int i = 0; i < metahandles_to_create; i++) { | 626 for (int i = 0; i < metahandles_to_create; i++) { |
| 621 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); | 627 MutableEntry e(&trans, CREATE, trans.root_id(), "foo"); |
| 622 expected_dirty_metahandles.push_back(e.Get(META_HANDLE)); | 628 expected_dirty_metahandles.push_back(e.Get(META_HANDLE)); |
| 623 e.Put(IS_UNSYNCED, true); | 629 e.Put(IS_UNSYNCED, true); |
| 624 } | 630 } |
| 625 } | 631 } |
| 626 dir_->SaveChanges(); | 632 dir_->SaveChanges(); |
| 627 // Put a new value with existing transactions as well as adding new ones. | 633 // Put a new value with existing transactions as well as adding new ones. |
| 628 { | 634 { |
| 629 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 635 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 630 std::vector<int64> new_dirty_metahandles; | 636 std::vector<int64> new_dirty_metahandles; |
| 631 for (std::vector<int64>::const_iterator i = | 637 for (std::vector<int64>::const_iterator i = |
| 632 expected_dirty_metahandles.begin(); | 638 expected_dirty_metahandles.begin(); |
| 633 i != expected_dirty_metahandles.end(); ++i) { | 639 i != expected_dirty_metahandles.end(); ++i) { |
| 634 // Change existing entries to directories to dirty them. | 640 // Change existing entries to directories to dirty them. |
| 635 MutableEntry e1(&trans, GET_BY_HANDLE, *i); | 641 MutableEntry e1(&trans, GET_BY_HANDLE, *i); |
| 636 ASSERT_TRUE(e1.good()); | 642 ASSERT_TRUE(e1.good()); |
| 637 e1.Put(IS_DIR, true); | 643 e1.Put(IS_DIR, true); |
| 638 e1.Put(IS_UNSYNCED, true); | 644 e1.Put(IS_UNSYNCED, true); |
| 639 // Add new entries | 645 // Add new entries |
| 640 MutableEntry e2(&trans, CREATE, trans.root_id(), "bar"); | 646 MutableEntry e2(&trans, CREATE, trans.root_id(), "bar"); |
| 641 e2.Put(IS_UNSYNCED, true); | 647 e2.Put(IS_UNSYNCED, true); |
| 642 new_dirty_metahandles.push_back(e2.Get(META_HANDLE)); | 648 new_dirty_metahandles.push_back(e2.Get(META_HANDLE)); |
| 643 } | 649 } |
| 644 expected_dirty_metahandles.insert(expected_dirty_metahandles.end(), | 650 expected_dirty_metahandles.insert(expected_dirty_metahandles.end(), |
| 645 new_dirty_metahandles.begin(), new_dirty_metahandles.end()); | 651 new_dirty_metahandles.begin(), new_dirty_metahandles.end()); |
| 646 } | 652 } |
| 647 dir_->SaveChanges(); | 653 dir_->SaveChanges(); |
| 648 // Don't make any changes whatsoever and ensure nothing comes back. | 654 // Don't make any changes whatsoever and ensure nothing comes back. |
| 649 { | 655 { |
| 650 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 656 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 651 for (std::vector<int64>::const_iterator i = | 657 for (std::vector<int64>::const_iterator i = |
| 652 expected_dirty_metahandles.begin(); | 658 expected_dirty_metahandles.begin(); |
| 653 i != expected_dirty_metahandles.end(); ++i) { | 659 i != expected_dirty_metahandles.end(); ++i) { |
| 654 MutableEntry e(&trans, GET_BY_HANDLE, *i); | 660 MutableEntry e(&trans, GET_BY_HANDLE, *i); |
| 655 ASSERT_TRUE(e.good()); | 661 ASSERT_TRUE(e.good()); |
| 656 // We aren't doing anything to dirty these entries. | 662 // We aren't doing anything to dirty these entries. |
| 657 } | 663 } |
| 658 } | 664 } |
| 659 // Fake SaveChanges() and make sure we got what we expected. | 665 // Fake SaveChanges() and make sure we got what we expected. |
| 660 { | 666 { |
| 661 Directory::SaveChangesSnapshot snapshot; | 667 Directory::SaveChangesSnapshot snapshot; |
| 662 base::AutoLock scoped_lock(dir_->kernel_->save_changes_mutex); | 668 base::AutoLock scoped_lock(dir_->kernel_->save_changes_mutex); |
| 663 dir_->TakeSnapshotForSaveChanges(&snapshot); | 669 dir_->TakeSnapshotForSaveChanges(&snapshot); |
| 664 // Make sure there are no dirty_metahandles. | 670 // Make sure there are no dirty_metahandles. |
| 665 EXPECT_EQ(0u, snapshot.dirty_metas.size()); | 671 EXPECT_EQ(0u, snapshot.dirty_metas.size()); |
| 666 dir_->VacuumAfterSaveChanges(snapshot); | 672 dir_->VacuumAfterSaveChanges(snapshot); |
| 667 } | 673 } |
| 668 { | 674 { |
| 669 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 675 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 670 bool should_change = false; | 676 bool should_change = false; |
| 671 for (std::vector<int64>::const_iterator i = | 677 for (std::vector<int64>::const_iterator i = |
| 672 expected_dirty_metahandles.begin(); | 678 expected_dirty_metahandles.begin(); |
| 673 i != expected_dirty_metahandles.end(); ++i) { | 679 i != expected_dirty_metahandles.end(); ++i) { |
| 674 // Maybe change entries by flipping IS_DIR. | 680 // Maybe change entries by flipping IS_DIR. |
| 675 MutableEntry e(&trans, GET_BY_HANDLE, *i); | 681 MutableEntry e(&trans, GET_BY_HANDLE, *i); |
| 676 ASSERT_TRUE(e.good()); | 682 ASSERT_TRUE(e.good()); |
| 677 should_change = !should_change; | 683 should_change = !should_change; |
| 678 if (should_change) { | 684 if (should_change) { |
| 679 bool not_dir = !e.Get(IS_DIR); | 685 bool not_dir = !e.Get(IS_DIR); |
| (...skipping 16 matching lines...) Expand all Loading... |
| 696 } | 702 } |
| 697 dir_->VacuumAfterSaveChanges(snapshot); | 703 dir_->VacuumAfterSaveChanges(snapshot); |
| 698 } | 704 } |
| 699 } | 705 } |
| 700 | 706 |
| 701 const char SyncableDirectoryTest::kName[] = "Foo"; | 707 const char SyncableDirectoryTest::kName[] = "Foo"; |
| 702 const Id SyncableDirectoryTest::kId(TestIdFactory::FromNumber(-99)); | 708 const Id SyncableDirectoryTest::kId(TestIdFactory::FromNumber(-99)); |
| 703 | 709 |
| 704 namespace { | 710 namespace { |
| 705 TEST_F(SyncableDirectoryTest, TestBasicLookupNonExistantID) { | 711 TEST_F(SyncableDirectoryTest, TestBasicLookupNonExistantID) { |
| 706 ReadTransaction rtrans(dir_.get(), __FILE__, __LINE__); | 712 ReadTransaction rtrans(dir_.get(), FROM_HERE); |
| 707 Entry e(&rtrans, GET_BY_ID, kId); | 713 Entry e(&rtrans, GET_BY_ID, kId); |
| 708 ASSERT_FALSE(e.good()); | 714 ASSERT_FALSE(e.good()); |
| 709 } | 715 } |
| 710 | 716 |
| 711 TEST_F(SyncableDirectoryTest, TestBasicLookupValidID) { | 717 TEST_F(SyncableDirectoryTest, TestBasicLookupValidID) { |
| 712 CreateEntry("rtc"); | 718 CreateEntry("rtc"); |
| 713 ReadTransaction rtrans(dir_.get(), __FILE__, __LINE__); | 719 ReadTransaction rtrans(dir_.get(), FROM_HERE); |
| 714 Entry e(&rtrans, GET_BY_ID, kId); | 720 Entry e(&rtrans, GET_BY_ID, kId); |
| 715 ASSERT_TRUE(e.good()); | 721 ASSERT_TRUE(e.good()); |
| 716 } | 722 } |
| 717 | 723 |
| 718 TEST_F(SyncableDirectoryTest, TestDelete) { | 724 TEST_F(SyncableDirectoryTest, TestDelete) { |
| 719 std::string name = "peanut butter jelly time"; | 725 std::string name = "peanut butter jelly time"; |
| 720 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 726 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 721 MutableEntry e1(&trans, CREATE, trans.root_id(), name); | 727 MutableEntry e1(&trans, CREATE, trans.root_id(), name); |
| 722 ASSERT_TRUE(e1.good()); | 728 ASSERT_TRUE(e1.good()); |
| 723 ASSERT_TRUE(e1.Put(IS_DEL, true)); | 729 ASSERT_TRUE(e1.Put(IS_DEL, true)); |
| 724 MutableEntry e2(&trans, CREATE, trans.root_id(), name); | 730 MutableEntry e2(&trans, CREATE, trans.root_id(), name); |
| 725 ASSERT_TRUE(e2.good()); | 731 ASSERT_TRUE(e2.good()); |
| 726 ASSERT_TRUE(e2.Put(IS_DEL, true)); | 732 ASSERT_TRUE(e2.Put(IS_DEL, true)); |
| 727 MutableEntry e3(&trans, CREATE, trans.root_id(), name); | 733 MutableEntry e3(&trans, CREATE, trans.root_id(), name); |
| 728 ASSERT_TRUE(e3.good()); | 734 ASSERT_TRUE(e3.good()); |
| 729 ASSERT_TRUE(e3.Put(IS_DEL, true)); | 735 ASSERT_TRUE(e3.Put(IS_DEL, true)); |
| 730 | 736 |
| 731 ASSERT_TRUE(e1.Put(IS_DEL, false)); | 737 ASSERT_TRUE(e1.Put(IS_DEL, false)); |
| 732 ASSERT_TRUE(e2.Put(IS_DEL, false)); | 738 ASSERT_TRUE(e2.Put(IS_DEL, false)); |
| 733 ASSERT_TRUE(e3.Put(IS_DEL, false)); | 739 ASSERT_TRUE(e3.Put(IS_DEL, false)); |
| 734 | 740 |
| 735 ASSERT_TRUE(e1.Put(IS_DEL, true)); | 741 ASSERT_TRUE(e1.Put(IS_DEL, true)); |
| 736 ASSERT_TRUE(e2.Put(IS_DEL, true)); | 742 ASSERT_TRUE(e2.Put(IS_DEL, true)); |
| 737 ASSERT_TRUE(e3.Put(IS_DEL, true)); | 743 ASSERT_TRUE(e3.Put(IS_DEL, true)); |
| 738 } | 744 } |
| 739 | 745 |
| 740 TEST_F(SyncableDirectoryTest, TestGetUnsynced) { | 746 TEST_F(SyncableDirectoryTest, TestGetUnsynced) { |
| 741 Directory::UnsyncedMetaHandles handles; | 747 Directory::UnsyncedMetaHandles handles; |
| 742 int64 handle1, handle2; | 748 int64 handle1, handle2; |
| 743 { | 749 { |
| 744 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 750 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 745 | 751 |
| 746 dir_->GetUnsyncedMetaHandles(&trans, &handles); | 752 dir_->GetUnsyncedMetaHandles(&trans, &handles); |
| 747 ASSERT_TRUE(0 == handles.size()); | 753 ASSERT_TRUE(0 == handles.size()); |
| 748 | 754 |
| 749 MutableEntry e1(&trans, CREATE, trans.root_id(), "abba"); | 755 MutableEntry e1(&trans, CREATE, trans.root_id(), "abba"); |
| 750 ASSERT_TRUE(e1.good()); | 756 ASSERT_TRUE(e1.good()); |
| 751 handle1 = e1.Get(META_HANDLE); | 757 handle1 = e1.Get(META_HANDLE); |
| 752 e1.Put(BASE_VERSION, 1); | 758 e1.Put(BASE_VERSION, 1); |
| 753 e1.Put(IS_DIR, true); | 759 e1.Put(IS_DIR, true); |
| 754 e1.Put(ID, TestIdFactory::FromNumber(101)); | 760 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 755 | 761 |
| 756 MutableEntry e2(&trans, CREATE, e1.Get(ID), "bread"); | 762 MutableEntry e2(&trans, CREATE, e1.Get(ID), "bread"); |
| 757 ASSERT_TRUE(e2.good()); | 763 ASSERT_TRUE(e2.good()); |
| 758 handle2 = e2.Get(META_HANDLE); | 764 handle2 = e2.Get(META_HANDLE); |
| 759 e2.Put(BASE_VERSION, 1); | 765 e2.Put(BASE_VERSION, 1); |
| 760 e2.Put(ID, TestIdFactory::FromNumber(102)); | 766 e2.Put(ID, TestIdFactory::FromNumber(102)); |
| 761 } | 767 } |
| 762 dir_->SaveChanges(); | 768 dir_->SaveChanges(); |
| 763 { | 769 { |
| 764 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 770 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 765 | 771 |
| 766 dir_->GetUnsyncedMetaHandles(&trans, &handles); | 772 dir_->GetUnsyncedMetaHandles(&trans, &handles); |
| 767 ASSERT_TRUE(0 == handles.size()); | 773 ASSERT_TRUE(0 == handles.size()); |
| 768 | 774 |
| 769 MutableEntry e3(&trans, GET_BY_HANDLE, handle1); | 775 MutableEntry e3(&trans, GET_BY_HANDLE, handle1); |
| 770 ASSERT_TRUE(e3.good()); | 776 ASSERT_TRUE(e3.good()); |
| 771 e3.Put(IS_UNSYNCED, true); | 777 e3.Put(IS_UNSYNCED, true); |
| 772 } | 778 } |
| 773 dir_->SaveChanges(); | 779 dir_->SaveChanges(); |
| 774 { | 780 { |
| 775 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 781 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 776 dir_->GetUnsyncedMetaHandles(&trans, &handles); | 782 dir_->GetUnsyncedMetaHandles(&trans, &handles); |
| 777 ASSERT_TRUE(1 == handles.size()); | 783 ASSERT_TRUE(1 == handles.size()); |
| 778 ASSERT_TRUE(handle1 == handles[0]); | 784 ASSERT_TRUE(handle1 == handles[0]); |
| 779 | 785 |
| 780 MutableEntry e4(&trans, GET_BY_HANDLE, handle2); | 786 MutableEntry e4(&trans, GET_BY_HANDLE, handle2); |
| 781 ASSERT_TRUE(e4.good()); | 787 ASSERT_TRUE(e4.good()); |
| 782 e4.Put(IS_UNSYNCED, true); | 788 e4.Put(IS_UNSYNCED, true); |
| 783 } | 789 } |
| 784 dir_->SaveChanges(); | 790 dir_->SaveChanges(); |
| 785 { | 791 { |
| 786 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 792 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 787 dir_->GetUnsyncedMetaHandles(&trans, &handles); | 793 dir_->GetUnsyncedMetaHandles(&trans, &handles); |
| 788 ASSERT_TRUE(2 == handles.size()); | 794 ASSERT_TRUE(2 == handles.size()); |
| 789 if (handle1 == handles[0]) { | 795 if (handle1 == handles[0]) { |
| 790 ASSERT_TRUE(handle2 == handles[1]); | 796 ASSERT_TRUE(handle2 == handles[1]); |
| 791 } else { | 797 } else { |
| 792 ASSERT_TRUE(handle2 == handles[0]); | 798 ASSERT_TRUE(handle2 == handles[0]); |
| 793 ASSERT_TRUE(handle1 == handles[1]); | 799 ASSERT_TRUE(handle1 == handles[1]); |
| 794 } | 800 } |
| 795 | 801 |
| 796 MutableEntry e5(&trans, GET_BY_HANDLE, handle1); | 802 MutableEntry e5(&trans, GET_BY_HANDLE, handle1); |
| 797 ASSERT_TRUE(e5.good()); | 803 ASSERT_TRUE(e5.good()); |
| 798 ASSERT_TRUE(e5.Get(IS_UNSYNCED)); | 804 ASSERT_TRUE(e5.Get(IS_UNSYNCED)); |
| 799 ASSERT_TRUE(e5.Put(IS_UNSYNCED, false)); | 805 ASSERT_TRUE(e5.Put(IS_UNSYNCED, false)); |
| 800 ASSERT_FALSE(e5.Get(IS_UNSYNCED)); | 806 ASSERT_FALSE(e5.Get(IS_UNSYNCED)); |
| 801 } | 807 } |
| 802 dir_->SaveChanges(); | 808 dir_->SaveChanges(); |
| 803 { | 809 { |
| 804 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 810 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 805 dir_->GetUnsyncedMetaHandles(&trans, &handles); | 811 dir_->GetUnsyncedMetaHandles(&trans, &handles); |
| 806 ASSERT_TRUE(1 == handles.size()); | 812 ASSERT_TRUE(1 == handles.size()); |
| 807 ASSERT_TRUE(handle2 == handles[0]); | 813 ASSERT_TRUE(handle2 == handles[0]); |
| 808 } | 814 } |
| 809 } | 815 } |
| 810 | 816 |
| 811 TEST_F(SyncableDirectoryTest, TestGetUnappliedUpdates) { | 817 TEST_F(SyncableDirectoryTest, TestGetUnappliedUpdates) { |
| 812 Directory::UnappliedUpdateMetaHandles handles; | 818 Directory::UnappliedUpdateMetaHandles handles; |
| 813 int64 handle1, handle2; | 819 int64 handle1, handle2; |
| 814 { | 820 { |
| 815 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 821 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 816 | 822 |
| 817 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); | 823 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); |
| 818 ASSERT_TRUE(0 == handles.size()); | 824 ASSERT_TRUE(0 == handles.size()); |
| 819 | 825 |
| 820 MutableEntry e1(&trans, CREATE, trans.root_id(), "abba"); | 826 MutableEntry e1(&trans, CREATE, trans.root_id(), "abba"); |
| 821 ASSERT_TRUE(e1.good()); | 827 ASSERT_TRUE(e1.good()); |
| 822 handle1 = e1.Get(META_HANDLE); | 828 handle1 = e1.Get(META_HANDLE); |
| 823 e1.Put(IS_UNAPPLIED_UPDATE, false); | 829 e1.Put(IS_UNAPPLIED_UPDATE, false); |
| 824 e1.Put(BASE_VERSION, 1); | 830 e1.Put(BASE_VERSION, 1); |
| 825 e1.Put(ID, TestIdFactory::FromNumber(101)); | 831 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 826 e1.Put(IS_DIR, true); | 832 e1.Put(IS_DIR, true); |
| 827 | 833 |
| 828 MutableEntry e2(&trans, CREATE, e1.Get(ID), "bread"); | 834 MutableEntry e2(&trans, CREATE, e1.Get(ID), "bread"); |
| 829 ASSERT_TRUE(e2.good()); | 835 ASSERT_TRUE(e2.good()); |
| 830 handle2 = e2.Get(META_HANDLE); | 836 handle2 = e2.Get(META_HANDLE); |
| 831 e2.Put(IS_UNAPPLIED_UPDATE, false); | 837 e2.Put(IS_UNAPPLIED_UPDATE, false); |
| 832 e2.Put(BASE_VERSION, 1); | 838 e2.Put(BASE_VERSION, 1); |
| 833 e2.Put(ID, TestIdFactory::FromNumber(102)); | 839 e2.Put(ID, TestIdFactory::FromNumber(102)); |
| 834 } | 840 } |
| 835 dir_->SaveChanges(); | 841 dir_->SaveChanges(); |
| 836 { | 842 { |
| 837 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 843 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 838 | 844 |
| 839 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); | 845 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); |
| 840 ASSERT_TRUE(0 == handles.size()); | 846 ASSERT_TRUE(0 == handles.size()); |
| 841 | 847 |
| 842 MutableEntry e3(&trans, GET_BY_HANDLE, handle1); | 848 MutableEntry e3(&trans, GET_BY_HANDLE, handle1); |
| 843 ASSERT_TRUE(e3.good()); | 849 ASSERT_TRUE(e3.good()); |
| 844 e3.Put(IS_UNAPPLIED_UPDATE, true); | 850 e3.Put(IS_UNAPPLIED_UPDATE, true); |
| 845 } | 851 } |
| 846 dir_->SaveChanges(); | 852 dir_->SaveChanges(); |
| 847 { | 853 { |
| 848 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 854 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 849 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); | 855 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); |
| 850 ASSERT_TRUE(1 == handles.size()); | 856 ASSERT_TRUE(1 == handles.size()); |
| 851 ASSERT_TRUE(handle1 == handles[0]); | 857 ASSERT_TRUE(handle1 == handles[0]); |
| 852 | 858 |
| 853 MutableEntry e4(&trans, GET_BY_HANDLE, handle2); | 859 MutableEntry e4(&trans, GET_BY_HANDLE, handle2); |
| 854 ASSERT_TRUE(e4.good()); | 860 ASSERT_TRUE(e4.good()); |
| 855 e4.Put(IS_UNAPPLIED_UPDATE, true); | 861 e4.Put(IS_UNAPPLIED_UPDATE, true); |
| 856 } | 862 } |
| 857 dir_->SaveChanges(); | 863 dir_->SaveChanges(); |
| 858 { | 864 { |
| 859 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 865 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 860 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); | 866 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); |
| 861 ASSERT_TRUE(2 == handles.size()); | 867 ASSERT_TRUE(2 == handles.size()); |
| 862 if (handle1 == handles[0]) { | 868 if (handle1 == handles[0]) { |
| 863 ASSERT_TRUE(handle2 == handles[1]); | 869 ASSERT_TRUE(handle2 == handles[1]); |
| 864 } else { | 870 } else { |
| 865 ASSERT_TRUE(handle2 == handles[0]); | 871 ASSERT_TRUE(handle2 == handles[0]); |
| 866 ASSERT_TRUE(handle1 == handles[1]); | 872 ASSERT_TRUE(handle1 == handles[1]); |
| 867 } | 873 } |
| 868 | 874 |
| 869 MutableEntry e5(&trans, GET_BY_HANDLE, handle1); | 875 MutableEntry e5(&trans, GET_BY_HANDLE, handle1); |
| 870 ASSERT_TRUE(e5.good()); | 876 ASSERT_TRUE(e5.good()); |
| 871 e5.Put(IS_UNAPPLIED_UPDATE, false); | 877 e5.Put(IS_UNAPPLIED_UPDATE, false); |
| 872 } | 878 } |
| 873 dir_->SaveChanges(); | 879 dir_->SaveChanges(); |
| 874 { | 880 { |
| 875 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 881 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 876 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); | 882 dir_->GetUnappliedUpdateMetaHandles(&trans, &handles); |
| 877 ASSERT_TRUE(1 == handles.size()); | 883 ASSERT_TRUE(1 == handles.size()); |
| 878 ASSERT_TRUE(handle2 == handles[0]); | 884 ASSERT_TRUE(handle2 == handles[0]); |
| 879 } | 885 } |
| 880 } | 886 } |
| 881 | 887 |
| 882 | 888 |
| 883 TEST_F(SyncableDirectoryTest, DeleteBug_531383) { | 889 TEST_F(SyncableDirectoryTest, DeleteBug_531383) { |
| 884 // Try to evoke a check failure... | 890 // Try to evoke a check failure... |
| 885 TestIdFactory id_factory; | 891 TestIdFactory id_factory; |
| 886 int64 grandchild_handle, twin_handle; | 892 int64 grandchild_handle, twin_handle; |
| 887 { | 893 { |
| 888 WriteTransaction wtrans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 894 WriteTransaction wtrans(dir_.get(), UNITTEST, FROM_HERE); |
| 889 MutableEntry parent(&wtrans, CREATE, id_factory.root(), "Bob"); | 895 MutableEntry parent(&wtrans, CREATE, id_factory.root(), "Bob"); |
| 890 ASSERT_TRUE(parent.good()); | 896 ASSERT_TRUE(parent.good()); |
| 891 parent.Put(IS_DIR, true); | 897 parent.Put(IS_DIR, true); |
| 892 parent.Put(ID, id_factory.NewServerId()); | 898 parent.Put(ID, id_factory.NewServerId()); |
| 893 parent.Put(BASE_VERSION, 1); | 899 parent.Put(BASE_VERSION, 1); |
| 894 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "Bob"); | 900 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "Bob"); |
| 895 ASSERT_TRUE(child.good()); | 901 ASSERT_TRUE(child.good()); |
| 896 child.Put(IS_DIR, true); | 902 child.Put(IS_DIR, true); |
| 897 child.Put(ID, id_factory.NewServerId()); | 903 child.Put(ID, id_factory.NewServerId()); |
| 898 child.Put(BASE_VERSION, 1); | 904 child.Put(BASE_VERSION, 1); |
| 899 MutableEntry grandchild(&wtrans, CREATE, child.Get(ID), "Bob"); | 905 MutableEntry grandchild(&wtrans, CREATE, child.Get(ID), "Bob"); |
| 900 ASSERT_TRUE(grandchild.good()); | 906 ASSERT_TRUE(grandchild.good()); |
| 901 grandchild.Put(ID, id_factory.NewServerId()); | 907 grandchild.Put(ID, id_factory.NewServerId()); |
| 902 grandchild.Put(BASE_VERSION, 1); | 908 grandchild.Put(BASE_VERSION, 1); |
| 903 ASSERT_TRUE(grandchild.Put(IS_DEL, true)); | 909 ASSERT_TRUE(grandchild.Put(IS_DEL, true)); |
| 904 MutableEntry twin(&wtrans, CREATE, child.Get(ID), "Bob"); | 910 MutableEntry twin(&wtrans, CREATE, child.Get(ID), "Bob"); |
| 905 ASSERT_TRUE(twin.good()); | 911 ASSERT_TRUE(twin.good()); |
| 906 ASSERT_TRUE(twin.Put(IS_DEL, true)); | 912 ASSERT_TRUE(twin.Put(IS_DEL, true)); |
| 907 ASSERT_TRUE(grandchild.Put(IS_DEL, false)); | 913 ASSERT_TRUE(grandchild.Put(IS_DEL, false)); |
| 908 | 914 |
| 909 grandchild_handle = grandchild.Get(META_HANDLE); | 915 grandchild_handle = grandchild.Get(META_HANDLE); |
| 910 twin_handle = twin.Get(META_HANDLE); | 916 twin_handle = twin.Get(META_HANDLE); |
| 911 } | 917 } |
| 912 dir_->SaveChanges(); | 918 dir_->SaveChanges(); |
| 913 { | 919 { |
| 914 WriteTransaction wtrans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 920 WriteTransaction wtrans(dir_.get(), UNITTEST, FROM_HERE); |
| 915 MutableEntry grandchild(&wtrans, GET_BY_HANDLE, grandchild_handle); | 921 MutableEntry grandchild(&wtrans, GET_BY_HANDLE, grandchild_handle); |
| 916 grandchild.Put(IS_DEL, true); // Used to CHECK fail here. | 922 grandchild.Put(IS_DEL, true); // Used to CHECK fail here. |
| 917 } | 923 } |
| 918 } | 924 } |
| 919 | 925 |
| 920 static inline bool IsLegalNewParent(const Entry& a, const Entry& b) { | 926 static inline bool IsLegalNewParent(const Entry& a, const Entry& b) { |
| 921 return IsLegalNewParent(a.trans(), a.Get(ID), b.Get(ID)); | 927 return IsLegalNewParent(a.trans(), a.Get(ID), b.Get(ID)); |
| 922 } | 928 } |
| 923 | 929 |
| 924 TEST_F(SyncableDirectoryTest, TestIsLegalNewParent) { | 930 TEST_F(SyncableDirectoryTest, TestIsLegalNewParent) { |
| 925 TestIdFactory id_factory; | 931 TestIdFactory id_factory; |
| 926 WriteTransaction wtrans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 932 WriteTransaction wtrans(dir_.get(), UNITTEST, FROM_HERE); |
| 927 Entry root(&wtrans, GET_BY_ID, id_factory.root()); | 933 Entry root(&wtrans, GET_BY_ID, id_factory.root()); |
| 928 ASSERT_TRUE(root.good()); | 934 ASSERT_TRUE(root.good()); |
| 929 MutableEntry parent(&wtrans, CREATE, root.Get(ID), "Bob"); | 935 MutableEntry parent(&wtrans, CREATE, root.Get(ID), "Bob"); |
| 930 ASSERT_TRUE(parent.good()); | 936 ASSERT_TRUE(parent.good()); |
| 931 parent.Put(IS_DIR, true); | 937 parent.Put(IS_DIR, true); |
| 932 parent.Put(ID, id_factory.NewServerId()); | 938 parent.Put(ID, id_factory.NewServerId()); |
| 933 parent.Put(BASE_VERSION, 1); | 939 parent.Put(BASE_VERSION, 1); |
| 934 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "Bob"); | 940 MutableEntry child(&wtrans, CREATE, parent.Get(ID), "Bob"); |
| 935 ASSERT_TRUE(child.good()); | 941 ASSERT_TRUE(child.good()); |
| 936 child.Put(IS_DIR, true); | 942 child.Put(IS_DIR, true); |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 975 } | 981 } |
| 976 | 982 |
| 977 TEST_F(SyncableDirectoryTest, TestEntryIsInFolder) { | 983 TEST_F(SyncableDirectoryTest, TestEntryIsInFolder) { |
| 978 // Create a subdir and an entry. | 984 // Create a subdir and an entry. |
| 979 int64 entry_handle; | 985 int64 entry_handle; |
| 980 syncable::Id folder_id; | 986 syncable::Id folder_id; |
| 981 syncable::Id entry_id; | 987 syncable::Id entry_id; |
| 982 std::string entry_name = "entry"; | 988 std::string entry_name = "entry"; |
| 983 | 989 |
| 984 { | 990 { |
| 985 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 991 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 986 MutableEntry folder(&trans, CREATE, trans.root_id(), "folder"); | 992 MutableEntry folder(&trans, CREATE, trans.root_id(), "folder"); |
| 987 ASSERT_TRUE(folder.good()); | 993 ASSERT_TRUE(folder.good()); |
| 988 EXPECT_TRUE(folder.Put(IS_DIR, true)); | 994 EXPECT_TRUE(folder.Put(IS_DIR, true)); |
| 989 EXPECT_TRUE(folder.Put(IS_UNSYNCED, true)); | 995 EXPECT_TRUE(folder.Put(IS_UNSYNCED, true)); |
| 990 folder_id = folder.Get(ID); | 996 folder_id = folder.Get(ID); |
| 991 | 997 |
| 992 MutableEntry entry(&trans, CREATE, folder.Get(ID), entry_name); | 998 MutableEntry entry(&trans, CREATE, folder.Get(ID), entry_name); |
| 993 ASSERT_TRUE(entry.good()); | 999 ASSERT_TRUE(entry.good()); |
| 994 entry_handle = entry.Get(META_HANDLE); | 1000 entry_handle = entry.Get(META_HANDLE); |
| 995 entry.Put(IS_UNSYNCED, true); | 1001 entry.Put(IS_UNSYNCED, true); |
| 996 entry_id = entry.Get(ID); | 1002 entry_id = entry.Get(ID); |
| 997 } | 1003 } |
| 998 | 1004 |
| 999 // Make sure we can find the entry in the folder. | 1005 // Make sure we can find the entry in the folder. |
| 1000 { | 1006 { |
| 1001 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1007 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1002 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), entry_name)); | 1008 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), entry_name)); |
| 1003 EXPECT_EQ(1, CountEntriesWithName(&trans, folder_id, entry_name)); | 1009 EXPECT_EQ(1, CountEntriesWithName(&trans, folder_id, entry_name)); |
| 1004 | 1010 |
| 1005 Entry entry(&trans, GET_BY_ID, entry_id); | 1011 Entry entry(&trans, GET_BY_ID, entry_id); |
| 1006 ASSERT_TRUE(entry.good()); | 1012 ASSERT_TRUE(entry.good()); |
| 1007 EXPECT_EQ(entry_handle, entry.Get(META_HANDLE)); | 1013 EXPECT_EQ(entry_handle, entry.Get(META_HANDLE)); |
| 1008 EXPECT_TRUE(entry.Get(NON_UNIQUE_NAME) == entry_name); | 1014 EXPECT_TRUE(entry.Get(NON_UNIQUE_NAME) == entry_name); |
| 1009 EXPECT_TRUE(entry.Get(PARENT_ID) == folder_id); | 1015 EXPECT_TRUE(entry.Get(PARENT_ID) == folder_id); |
| 1010 } | 1016 } |
| 1011 } | 1017 } |
| 1012 | 1018 |
| 1013 TEST_F(SyncableDirectoryTest, TestParentIdIndexUpdate) { | 1019 TEST_F(SyncableDirectoryTest, TestParentIdIndexUpdate) { |
| 1014 std::string child_name = "child"; | 1020 std::string child_name = "child"; |
| 1015 | 1021 |
| 1016 WriteTransaction wt(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1022 WriteTransaction wt(dir_.get(), UNITTEST, FROM_HERE); |
| 1017 MutableEntry parent_folder(&wt, CREATE, wt.root_id(), "folder1"); | 1023 MutableEntry parent_folder(&wt, CREATE, wt.root_id(), "folder1"); |
| 1018 parent_folder.Put(IS_UNSYNCED, true); | 1024 parent_folder.Put(IS_UNSYNCED, true); |
| 1019 EXPECT_TRUE(parent_folder.Put(IS_DIR, true)); | 1025 EXPECT_TRUE(parent_folder.Put(IS_DIR, true)); |
| 1020 | 1026 |
| 1021 MutableEntry parent_folder2(&wt, CREATE, wt.root_id(), "folder2"); | 1027 MutableEntry parent_folder2(&wt, CREATE, wt.root_id(), "folder2"); |
| 1022 parent_folder2.Put(IS_UNSYNCED, true); | 1028 parent_folder2.Put(IS_UNSYNCED, true); |
| 1023 EXPECT_TRUE(parent_folder2.Put(IS_DIR, true)); | 1029 EXPECT_TRUE(parent_folder2.Put(IS_DIR, true)); |
| 1024 | 1030 |
| 1025 MutableEntry child(&wt, CREATE, parent_folder.Get(ID), child_name); | 1031 MutableEntry child(&wt, CREATE, parent_folder.Get(ID), child_name); |
| 1026 EXPECT_TRUE(child.Put(IS_DIR, true)); | 1032 EXPECT_TRUE(child.Put(IS_DIR, true)); |
| 1027 child.Put(IS_UNSYNCED, true); | 1033 child.Put(IS_UNSYNCED, true); |
| 1028 | 1034 |
| 1029 ASSERT_TRUE(child.good()); | 1035 ASSERT_TRUE(child.good()); |
| 1030 | 1036 |
| 1031 EXPECT_EQ(0, CountEntriesWithName(&wt, wt.root_id(), child_name)); | 1037 EXPECT_EQ(0, CountEntriesWithName(&wt, wt.root_id(), child_name)); |
| 1032 EXPECT_EQ(parent_folder.Get(ID), child.Get(PARENT_ID)); | 1038 EXPECT_EQ(parent_folder.Get(ID), child.Get(PARENT_ID)); |
| 1033 EXPECT_EQ(1, CountEntriesWithName(&wt, parent_folder.Get(ID), child_name)); | 1039 EXPECT_EQ(1, CountEntriesWithName(&wt, parent_folder.Get(ID), child_name)); |
| 1034 EXPECT_EQ(0, CountEntriesWithName(&wt, parent_folder2.Get(ID), child_name)); | 1040 EXPECT_EQ(0, CountEntriesWithName(&wt, parent_folder2.Get(ID), child_name)); |
| 1035 child.Put(PARENT_ID, parent_folder2.Get(ID)); | 1041 child.Put(PARENT_ID, parent_folder2.Get(ID)); |
| 1036 EXPECT_EQ(parent_folder2.Get(ID), child.Get(PARENT_ID)); | 1042 EXPECT_EQ(parent_folder2.Get(ID), child.Get(PARENT_ID)); |
| 1037 EXPECT_EQ(0, CountEntriesWithName(&wt, parent_folder.Get(ID), child_name)); | 1043 EXPECT_EQ(0, CountEntriesWithName(&wt, parent_folder.Get(ID), child_name)); |
| 1038 EXPECT_EQ(1, CountEntriesWithName(&wt, parent_folder2.Get(ID), child_name)); | 1044 EXPECT_EQ(1, CountEntriesWithName(&wt, parent_folder2.Get(ID), child_name)); |
| 1039 } | 1045 } |
| 1040 | 1046 |
| 1041 TEST_F(SyncableDirectoryTest, TestNoReindexDeletedItems) { | 1047 TEST_F(SyncableDirectoryTest, TestNoReindexDeletedItems) { |
| 1042 std::string folder_name = "folder"; | 1048 std::string folder_name = "folder"; |
| 1043 std::string new_name = "new_name"; | 1049 std::string new_name = "new_name"; |
| 1044 | 1050 |
| 1045 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1051 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1046 MutableEntry folder(&trans, CREATE, trans.root_id(), folder_name); | 1052 MutableEntry folder(&trans, CREATE, trans.root_id(), folder_name); |
| 1047 ASSERT_TRUE(folder.good()); | 1053 ASSERT_TRUE(folder.good()); |
| 1048 ASSERT_TRUE(folder.Put(IS_DIR, true)); | 1054 ASSERT_TRUE(folder.Put(IS_DIR, true)); |
| 1049 ASSERT_TRUE(folder.Put(IS_DEL, true)); | 1055 ASSERT_TRUE(folder.Put(IS_DEL, true)); |
| 1050 | 1056 |
| 1051 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), folder_name)); | 1057 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), folder_name)); |
| 1052 | 1058 |
| 1053 MutableEntry deleted(&trans, GET_BY_ID, folder.Get(ID)); | 1059 MutableEntry deleted(&trans, GET_BY_ID, folder.Get(ID)); |
| 1054 ASSERT_TRUE(deleted.good()); | 1060 ASSERT_TRUE(deleted.good()); |
| 1055 ASSERT_TRUE(deleted.Put(PARENT_ID, trans.root_id())); | 1061 ASSERT_TRUE(deleted.Put(PARENT_ID, trans.root_id())); |
| 1056 ASSERT_TRUE(deleted.Put(NON_UNIQUE_NAME, new_name)); | 1062 ASSERT_TRUE(deleted.Put(NON_UNIQUE_NAME, new_name)); |
| 1057 | 1063 |
| 1058 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), folder_name)); | 1064 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), folder_name)); |
| 1059 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), new_name)); | 1065 EXPECT_EQ(0, CountEntriesWithName(&trans, trans.root_id(), new_name)); |
| 1060 } | 1066 } |
| 1061 | 1067 |
| 1062 TEST_F(SyncableDirectoryTest, TestCaseChangeRename) { | 1068 TEST_F(SyncableDirectoryTest, TestCaseChangeRename) { |
| 1063 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1069 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1064 MutableEntry folder(&trans, CREATE, trans.root_id(), "CaseChange"); | 1070 MutableEntry folder(&trans, CREATE, trans.root_id(), "CaseChange"); |
| 1065 ASSERT_TRUE(folder.good()); | 1071 ASSERT_TRUE(folder.good()); |
| 1066 EXPECT_TRUE(folder.Put(PARENT_ID, trans.root_id())); | 1072 EXPECT_TRUE(folder.Put(PARENT_ID, trans.root_id())); |
| 1067 EXPECT_TRUE(folder.Put(NON_UNIQUE_NAME, "CASECHANGE")); | 1073 EXPECT_TRUE(folder.Put(NON_UNIQUE_NAME, "CASECHANGE")); |
| 1068 EXPECT_TRUE(folder.Put(IS_DEL, true)); | 1074 EXPECT_TRUE(folder.Put(IS_DEL, true)); |
| 1069 } | 1075 } |
| 1070 | 1076 |
| 1071 TEST_F(SyncableDirectoryTest, TestShareInfo) { | 1077 TEST_F(SyncableDirectoryTest, TestShareInfo) { |
| 1072 dir_->set_initial_sync_ended_for_type(AUTOFILL, true); | 1078 dir_->set_initial_sync_ended_for_type(AUTOFILL, true); |
| 1073 dir_->set_store_birthday("Jan 31st"); | 1079 dir_->set_store_birthday("Jan 31st"); |
| 1074 dir_->SetNotificationState("notification_state"); | 1080 dir_->SetNotificationState("notification_state"); |
| 1075 { | 1081 { |
| 1076 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1082 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1077 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); | 1083 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); |
| 1078 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); | 1084 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); |
| 1079 EXPECT_EQ("Jan 31st", dir_->store_birthday()); | 1085 EXPECT_EQ("Jan 31st", dir_->store_birthday()); |
| 1080 EXPECT_EQ("notification_state", dir_->GetAndClearNotificationState()); | 1086 EXPECT_EQ("notification_state", dir_->GetAndClearNotificationState()); |
| 1081 EXPECT_EQ("", dir_->GetAndClearNotificationState()); | 1087 EXPECT_EQ("", dir_->GetAndClearNotificationState()); |
| 1082 } | 1088 } |
| 1083 dir_->set_store_birthday("April 10th"); | 1089 dir_->set_store_birthday("April 10th"); |
| 1084 dir_->SetNotificationState("notification_state2"); | 1090 dir_->SetNotificationState("notification_state2"); |
| 1085 dir_->SaveChanges(); | 1091 dir_->SaveChanges(); |
| 1086 { | 1092 { |
| 1087 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1093 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1088 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); | 1094 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); |
| 1089 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); | 1095 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); |
| 1090 EXPECT_EQ("April 10th", dir_->store_birthday()); | 1096 EXPECT_EQ("April 10th", dir_->store_birthday()); |
| 1091 EXPECT_EQ("notification_state2", dir_->GetAndClearNotificationState()); | 1097 EXPECT_EQ("notification_state2", dir_->GetAndClearNotificationState()); |
| 1092 EXPECT_EQ("", dir_->GetAndClearNotificationState()); | 1098 EXPECT_EQ("", dir_->GetAndClearNotificationState()); |
| 1093 } | 1099 } |
| 1094 dir_->SetNotificationState("notification_state2"); | 1100 dir_->SetNotificationState("notification_state2"); |
| 1095 // Restore the directory from disk. Make sure that nothing's changed. | 1101 // Restore the directory from disk. Make sure that nothing's changed. |
| 1096 SaveAndReloadDir(); | 1102 SaveAndReloadDir(); |
| 1097 { | 1103 { |
| 1098 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1104 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1099 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); | 1105 EXPECT_TRUE(dir_->initial_sync_ended_for_type(AUTOFILL)); |
| 1100 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); | 1106 EXPECT_FALSE(dir_->initial_sync_ended_for_type(BOOKMARKS)); |
| 1101 EXPECT_EQ("April 10th", dir_->store_birthday()); | 1107 EXPECT_EQ("April 10th", dir_->store_birthday()); |
| 1102 EXPECT_EQ("notification_state2", dir_->GetAndClearNotificationState()); | 1108 EXPECT_EQ("notification_state2", dir_->GetAndClearNotificationState()); |
| 1103 EXPECT_EQ("", dir_->GetAndClearNotificationState()); | 1109 EXPECT_EQ("", dir_->GetAndClearNotificationState()); |
| 1104 } | 1110 } |
| 1105 } | 1111 } |
| 1106 | 1112 |
| 1107 TEST_F(SyncableDirectoryTest, TestSimpleFieldsPreservedDuringSaveChanges) { | 1113 TEST_F(SyncableDirectoryTest, TestSimpleFieldsPreservedDuringSaveChanges) { |
| 1108 Id update_id = TestIdFactory::FromNumber(1); | 1114 Id update_id = TestIdFactory::FromNumber(1); |
| 1109 Id create_id; | 1115 Id create_id; |
| 1110 EntryKernel create_pre_save, update_pre_save; | 1116 EntryKernel create_pre_save, update_pre_save; |
| 1111 EntryKernel create_post_save, update_post_save; | 1117 EntryKernel create_post_save, update_post_save; |
| 1112 std::string create_name = "Create"; | 1118 std::string create_name = "Create"; |
| 1113 | 1119 |
| 1114 { | 1120 { |
| 1115 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1121 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1116 MutableEntry create(&trans, CREATE, trans.root_id(), create_name); | 1122 MutableEntry create(&trans, CREATE, trans.root_id(), create_name); |
| 1117 MutableEntry update(&trans, CREATE_NEW_UPDATE_ITEM, update_id); | 1123 MutableEntry update(&trans, CREATE_NEW_UPDATE_ITEM, update_id); |
| 1118 create.Put(IS_UNSYNCED, true); | 1124 create.Put(IS_UNSYNCED, true); |
| 1119 update.Put(IS_UNAPPLIED_UPDATE, true); | 1125 update.Put(IS_UNAPPLIED_UPDATE, true); |
| 1120 sync_pb::EntitySpecifics specifics; | 1126 sync_pb::EntitySpecifics specifics; |
| 1121 specifics.MutableExtension(sync_pb::bookmark)->set_favicon("PNG"); | 1127 specifics.MutableExtension(sync_pb::bookmark)->set_favicon("PNG"); |
| 1122 specifics.MutableExtension(sync_pb::bookmark)->set_url("http://nowhere"); | 1128 specifics.MutableExtension(sync_pb::bookmark)->set_url("http://nowhere"); |
| 1123 create.Put(SPECIFICS, specifics); | 1129 create.Put(SPECIFICS, specifics); |
| 1124 create_pre_save = create.GetKernelCopy(); | 1130 create_pre_save = create.GetKernelCopy(); |
| 1125 update_pre_save = update.GetKernelCopy(); | 1131 update_pre_save = update.GetKernelCopy(); |
| 1126 create_id = create.Get(ID); | 1132 create_id = create.Get(ID); |
| 1127 } | 1133 } |
| 1128 | 1134 |
| 1129 dir_->SaveChanges(); | 1135 dir_->SaveChanges(); |
| 1130 dir_.reset(new Directory()); | 1136 dir_.reset(new Directory()); |
| 1131 ASSERT_TRUE(dir_.get()); | 1137 ASSERT_TRUE(dir_.get()); |
| 1132 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName)); | 1138 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); |
| 1133 ASSERT_TRUE(dir_->good()); | 1139 ASSERT_TRUE(dir_->good()); |
| 1134 | 1140 |
| 1135 { | 1141 { |
| 1136 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1142 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1137 Entry create(&trans, GET_BY_ID, create_id); | 1143 Entry create(&trans, GET_BY_ID, create_id); |
| 1138 EXPECT_EQ(1, CountEntriesWithName(&trans, trans.root_id(), create_name)); | 1144 EXPECT_EQ(1, CountEntriesWithName(&trans, trans.root_id(), create_name)); |
| 1139 Entry update(&trans, GET_BY_ID, update_id); | 1145 Entry update(&trans, GET_BY_ID, update_id); |
| 1140 create_post_save = create.GetKernelCopy(); | 1146 create_post_save = create.GetKernelCopy(); |
| 1141 update_post_save = update.GetKernelCopy(); | 1147 update_post_save = update.GetKernelCopy(); |
| 1142 } | 1148 } |
| 1143 int i = BEGIN_FIELDS; | 1149 int i = BEGIN_FIELDS; |
| 1144 for ( ; i < INT64_FIELDS_END ; ++i) { | 1150 for ( ; i < INT64_FIELDS_END ; ++i) { |
| 1145 EXPECT_EQ(create_pre_save.ref((Int64Field)i), | 1151 EXPECT_EQ(create_pre_save.ref((Int64Field)i), |
| 1146 create_post_save.ref((Int64Field)i)) | 1152 create_post_save.ref((Int64Field)i)) |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 EXPECT_EQ(update_pre_save.ref((ProtoField)i).SerializeAsString(), | 1186 EXPECT_EQ(update_pre_save.ref((ProtoField)i).SerializeAsString(), |
| 1181 update_post_save.ref((ProtoField)i).SerializeAsString()) | 1187 update_post_save.ref((ProtoField)i).SerializeAsString()) |
| 1182 << "Blob field #" << i << " changed during save/load"; | 1188 << "Blob field #" << i << " changed during save/load"; |
| 1183 } | 1189 } |
| 1184 } | 1190 } |
| 1185 | 1191 |
| 1186 TEST_F(SyncableDirectoryTest, TestSaveChangesFailure) { | 1192 TEST_F(SyncableDirectoryTest, TestSaveChangesFailure) { |
| 1187 int64 handle1 = 0; | 1193 int64 handle1 = 0; |
| 1188 // Set up an item using a regular, saveable directory. | 1194 // Set up an item using a regular, saveable directory. |
| 1189 { | 1195 { |
| 1190 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1196 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1191 | 1197 |
| 1192 MutableEntry e1(&trans, CREATE, trans.root_id(), "aguilera"); | 1198 MutableEntry e1(&trans, CREATE, trans.root_id(), "aguilera"); |
| 1193 ASSERT_TRUE(e1.good()); | 1199 ASSERT_TRUE(e1.good()); |
| 1194 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); | 1200 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); |
| 1195 handle1 = e1.Get(META_HANDLE); | 1201 handle1 = e1.Get(META_HANDLE); |
| 1196 e1.Put(BASE_VERSION, 1); | 1202 e1.Put(BASE_VERSION, 1); |
| 1197 e1.Put(IS_DIR, true); | 1203 e1.Put(IS_DIR, true); |
| 1198 e1.Put(ID, TestIdFactory::FromNumber(101)); | 1204 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 1199 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); | 1205 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); |
| 1200 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1206 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1201 } | 1207 } |
| 1202 ASSERT_TRUE(dir_->SaveChanges()); | 1208 ASSERT_TRUE(dir_->SaveChanges()); |
| 1203 | 1209 |
| 1204 // Make sure the item is no longer dirty after saving, | 1210 // Make sure the item is no longer dirty after saving, |
| 1205 // and make a modification. | 1211 // and make a modification. |
| 1206 { | 1212 { |
| 1207 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1213 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1208 | 1214 |
| 1209 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); | 1215 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); |
| 1210 ASSERT_TRUE(aguilera.good()); | 1216 ASSERT_TRUE(aguilera.good()); |
| 1211 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); | 1217 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); |
| 1212 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "aguilera"); | 1218 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "aguilera"); |
| 1213 aguilera.Put(NON_UNIQUE_NAME, "overwritten"); | 1219 aguilera.Put(NON_UNIQUE_NAME, "overwritten"); |
| 1214 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); | 1220 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); |
| 1215 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1221 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1216 } | 1222 } |
| 1217 ASSERT_TRUE(dir_->SaveChanges()); | 1223 ASSERT_TRUE(dir_->SaveChanges()); |
| 1218 | 1224 |
| 1219 // Now do some operations using a directory for which SaveChanges will | 1225 // Now do some operations using a directory for which SaveChanges will |
| 1220 // always fail. | 1226 // always fail. |
| 1221 dir_.reset(new TestUnsaveableDirectory()); | 1227 dir_.reset(new TestUnsaveableDirectory()); |
| 1222 ASSERT_TRUE(dir_.get()); | 1228 ASSERT_TRUE(dir_.get()); |
| 1223 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName)); | 1229 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); |
| 1224 ASSERT_TRUE(dir_->good()); | 1230 ASSERT_TRUE(dir_->good()); |
| 1225 int64 handle2 = 0; | 1231 int64 handle2 = 0; |
| 1226 { | 1232 { |
| 1227 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1233 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1228 | 1234 |
| 1229 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); | 1235 MutableEntry aguilera(&trans, GET_BY_HANDLE, handle1); |
| 1230 ASSERT_TRUE(aguilera.good()); | 1236 ASSERT_TRUE(aguilera.good()); |
| 1231 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); | 1237 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); |
| 1232 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "overwritten"); | 1238 EXPECT_EQ(aguilera.Get(NON_UNIQUE_NAME), "overwritten"); |
| 1233 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); | 1239 EXPECT_FALSE(aguilera.GetKernelCopy().is_dirty()); |
| 1234 EXPECT_FALSE(IsInDirtyMetahandles(handle1)); | 1240 EXPECT_FALSE(IsInDirtyMetahandles(handle1)); |
| 1235 aguilera.Put(NON_UNIQUE_NAME, "christina"); | 1241 aguilera.Put(NON_UNIQUE_NAME, "christina"); |
| 1236 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); | 1242 EXPECT_TRUE(aguilera.GetKernelCopy().is_dirty()); |
| 1237 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1243 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1238 | 1244 |
| 1239 // New item. | 1245 // New item. |
| 1240 MutableEntry kids_on_block(&trans, CREATE, trans.root_id(), "kids"); | 1246 MutableEntry kids_on_block(&trans, CREATE, trans.root_id(), "kids"); |
| 1241 ASSERT_TRUE(kids_on_block.good()); | 1247 ASSERT_TRUE(kids_on_block.good()); |
| 1242 handle2 = kids_on_block.Get(META_HANDLE); | 1248 handle2 = kids_on_block.Get(META_HANDLE); |
| 1243 kids_on_block.Put(BASE_VERSION, 1); | 1249 kids_on_block.Put(BASE_VERSION, 1); |
| 1244 kids_on_block.Put(IS_DIR, true); | 1250 kids_on_block.Put(IS_DIR, true); |
| 1245 kids_on_block.Put(ID, TestIdFactory::FromNumber(102)); | 1251 kids_on_block.Put(ID, TestIdFactory::FromNumber(102)); |
| 1246 EXPECT_TRUE(kids_on_block.GetKernelCopy().is_dirty()); | 1252 EXPECT_TRUE(kids_on_block.GetKernelCopy().is_dirty()); |
| 1247 EXPECT_TRUE(IsInDirtyMetahandles(handle2)); | 1253 EXPECT_TRUE(IsInDirtyMetahandles(handle2)); |
| 1248 } | 1254 } |
| 1249 | 1255 |
| 1250 // We are using an unsaveable directory, so this can't succeed. However, | 1256 // We are using an unsaveable directory, so this can't succeed. However, |
| 1251 // the HandleSaveChangesFailure code path should have been triggered. | 1257 // the HandleSaveChangesFailure code path should have been triggered. |
| 1252 ASSERT_FALSE(dir_->SaveChanges()); | 1258 ASSERT_FALSE(dir_->SaveChanges()); |
| 1253 | 1259 |
| 1254 // Make sure things were rolled back and the world is as it was before call. | 1260 // Make sure things were rolled back and the world is as it was before call. |
| 1255 { | 1261 { |
| 1256 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1262 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1257 Entry e1(&trans, GET_BY_HANDLE, handle1); | 1263 Entry e1(&trans, GET_BY_HANDLE, handle1); |
| 1258 ASSERT_TRUE(e1.good()); | 1264 ASSERT_TRUE(e1.good()); |
| 1259 EntryKernel aguilera = e1.GetKernelCopy(); | 1265 EntryKernel aguilera = e1.GetKernelCopy(); |
| 1260 Entry kids(&trans, GET_BY_HANDLE, handle2); | 1266 Entry kids(&trans, GET_BY_HANDLE, handle2); |
| 1261 ASSERT_TRUE(kids.good()); | 1267 ASSERT_TRUE(kids.good()); |
| 1262 EXPECT_TRUE(kids.GetKernelCopy().is_dirty()); | 1268 EXPECT_TRUE(kids.GetKernelCopy().is_dirty()); |
| 1263 EXPECT_TRUE(IsInDirtyMetahandles(handle2)); | 1269 EXPECT_TRUE(IsInDirtyMetahandles(handle2)); |
| 1264 EXPECT_TRUE(aguilera.is_dirty()); | 1270 EXPECT_TRUE(aguilera.is_dirty()); |
| 1265 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1271 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1266 } | 1272 } |
| 1267 } | 1273 } |
| 1268 | 1274 |
| 1269 TEST_F(SyncableDirectoryTest, TestSaveChangesFailureWithPurge) { | 1275 TEST_F(SyncableDirectoryTest, TestSaveChangesFailureWithPurge) { |
| 1270 int64 handle1 = 0; | 1276 int64 handle1 = 0; |
| 1271 // Set up an item using a regular, saveable directory. | 1277 // Set up an item using a regular, saveable directory. |
| 1272 { | 1278 { |
| 1273 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1279 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1274 | 1280 |
| 1275 MutableEntry e1(&trans, CREATE, trans.root_id(), "aguilera"); | 1281 MutableEntry e1(&trans, CREATE, trans.root_id(), "aguilera"); |
| 1276 ASSERT_TRUE(e1.good()); | 1282 ASSERT_TRUE(e1.good()); |
| 1277 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); | 1283 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); |
| 1278 handle1 = e1.Get(META_HANDLE); | 1284 handle1 = e1.Get(META_HANDLE); |
| 1279 e1.Put(BASE_VERSION, 1); | 1285 e1.Put(BASE_VERSION, 1); |
| 1280 e1.Put(IS_DIR, true); | 1286 e1.Put(IS_DIR, true); |
| 1281 e1.Put(ID, TestIdFactory::FromNumber(101)); | 1287 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 1282 sync_pb::EntitySpecifics bookmark_specs; | 1288 sync_pb::EntitySpecifics bookmark_specs; |
| 1283 AddDefaultExtensionValue(BOOKMARKS, &bookmark_specs); | 1289 AddDefaultExtensionValue(BOOKMARKS, &bookmark_specs); |
| 1284 e1.Put(SPECIFICS, bookmark_specs); | 1290 e1.Put(SPECIFICS, bookmark_specs); |
| 1285 e1.Put(SERVER_SPECIFICS, bookmark_specs); | 1291 e1.Put(SERVER_SPECIFICS, bookmark_specs); |
| 1286 e1.Put(ID, TestIdFactory::FromNumber(101)); | 1292 e1.Put(ID, TestIdFactory::FromNumber(101)); |
| 1287 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); | 1293 EXPECT_TRUE(e1.GetKernelCopy().is_dirty()); |
| 1288 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); | 1294 EXPECT_TRUE(IsInDirtyMetahandles(handle1)); |
| 1289 } | 1295 } |
| 1290 ASSERT_TRUE(dir_->SaveChanges()); | 1296 ASSERT_TRUE(dir_->SaveChanges()); |
| 1291 | 1297 |
| 1292 // Now do some operations using a directory for which SaveChanges will | 1298 // Now do some operations using a directory for which SaveChanges will |
| 1293 // always fail. | 1299 // always fail. |
| 1294 dir_.reset(new TestUnsaveableDirectory()); | 1300 dir_.reset(new TestUnsaveableDirectory()); |
| 1295 ASSERT_TRUE(dir_.get()); | 1301 ASSERT_TRUE(dir_.get()); |
| 1296 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName)); | 1302 ASSERT_TRUE(OPENED == dir_->Open(file_path_, kName, &delegate_)); |
| 1297 ASSERT_TRUE(dir_->good()); | 1303 ASSERT_TRUE(dir_->good()); |
| 1298 | 1304 |
| 1299 ModelTypeSet set; | 1305 ModelTypeSet set; |
| 1300 set.insert(BOOKMARKS); | 1306 set.insert(BOOKMARKS); |
| 1301 dir_->PurgeEntriesWithTypeIn(set); | 1307 dir_->PurgeEntriesWithTypeIn(set); |
| 1302 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); | 1308 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); |
| 1303 ASSERT_FALSE(dir_->SaveChanges()); | 1309 ASSERT_FALSE(dir_->SaveChanges()); |
| 1304 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); | 1310 EXPECT_TRUE(IsInMetahandlesToPurge(handle1)); |
| 1305 } | 1311 } |
| 1306 | 1312 |
| 1307 // Create items of each model type, and check that GetModelType and | 1313 // Create items of each model type, and check that GetModelType and |
| 1308 // GetServerModelType return the right value. | 1314 // GetServerModelType return the right value. |
| 1309 TEST_F(SyncableDirectoryTest, GetModelType) { | 1315 TEST_F(SyncableDirectoryTest, GetModelType) { |
| 1310 TestIdFactory id_factory; | 1316 TestIdFactory id_factory; |
| 1311 for (int i = 0; i < MODEL_TYPE_COUNT; ++i) { | 1317 for (int i = 0; i < MODEL_TYPE_COUNT; ++i) { |
| 1312 ModelType datatype = ModelTypeFromInt(i); | 1318 ModelType datatype = ModelTypeFromInt(i); |
| 1313 SCOPED_TRACE(testing::Message("Testing model type ") << datatype); | 1319 SCOPED_TRACE(testing::Message("Testing model type ") << datatype); |
| 1314 switch (datatype) { | 1320 switch (datatype) { |
| 1315 case UNSPECIFIED: | 1321 case UNSPECIFIED: |
| 1316 case TOP_LEVEL_FOLDER: | 1322 case TOP_LEVEL_FOLDER: |
| 1317 continue; // Datatype isn't a function of Specifics. | 1323 continue; // Datatype isn't a function of Specifics. |
| 1318 default: | 1324 default: |
| 1319 break; | 1325 break; |
| 1320 } | 1326 } |
| 1321 sync_pb::EntitySpecifics specifics; | 1327 sync_pb::EntitySpecifics specifics; |
| 1322 AddDefaultExtensionValue(datatype, &specifics); | 1328 AddDefaultExtensionValue(datatype, &specifics); |
| 1323 | 1329 |
| 1324 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1330 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1325 | 1331 |
| 1326 MutableEntry folder(&trans, CREATE, trans.root_id(), "Folder"); | 1332 MutableEntry folder(&trans, CREATE, trans.root_id(), "Folder"); |
| 1327 ASSERT_TRUE(folder.good()); | 1333 ASSERT_TRUE(folder.good()); |
| 1328 folder.Put(ID, id_factory.NewServerId()); | 1334 folder.Put(ID, id_factory.NewServerId()); |
| 1329 folder.Put(SPECIFICS, specifics); | 1335 folder.Put(SPECIFICS, specifics); |
| 1330 folder.Put(BASE_VERSION, 1); | 1336 folder.Put(BASE_VERSION, 1); |
| 1331 folder.Put(IS_DIR, true); | 1337 folder.Put(IS_DIR, true); |
| 1332 folder.Put(IS_DEL, false); | 1338 folder.Put(IS_DEL, false); |
| 1333 ASSERT_EQ(datatype, folder.GetModelType()); | 1339 ASSERT_EQ(datatype, folder.GetModelType()); |
| 1334 | 1340 |
| (...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1409 class SyncableDirectoryManager : public testing::Test { | 1415 class SyncableDirectoryManager : public testing::Test { |
| 1410 public: | 1416 public: |
| 1411 virtual void SetUp() { | 1417 virtual void SetUp() { |
| 1412 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); | 1418 ASSERT_TRUE(temp_dir_.CreateUniqueTempDir()); |
| 1413 } | 1419 } |
| 1414 | 1420 |
| 1415 virtual void TearDown() { | 1421 virtual void TearDown() { |
| 1416 } | 1422 } |
| 1417 protected: | 1423 protected: |
| 1418 ScopedTempDir temp_dir_; | 1424 ScopedTempDir temp_dir_; |
| 1425 NullDirectoryChangeDelegate delegate_; |
| 1419 }; | 1426 }; |
| 1420 | 1427 |
| 1421 TEST_F(SyncableDirectoryManager, TestFileRelease) { | 1428 TEST_F(SyncableDirectoryManager, TestFileRelease) { |
| 1422 DirectoryManager dm(FilePath(temp_dir_.path())); | 1429 DirectoryManager dm(FilePath(temp_dir_.path())); |
| 1423 ASSERT_TRUE(dm.Open("ScopeTest")); | 1430 ASSERT_TRUE(dm.Open("ScopeTest", &delegate_)); |
| 1424 { | 1431 { |
| 1425 ScopedDirLookup(&dm, "ScopeTest"); | 1432 ScopedDirLookup(&dm, "ScopeTest"); |
| 1426 } | 1433 } |
| 1427 dm.Close("ScopeTest"); | 1434 dm.Close("ScopeTest"); |
| 1428 ASSERT_TRUE(file_util::Delete(dm.GetSyncDataDatabasePath(), true)); | 1435 ASSERT_TRUE(file_util::Delete(dm.GetSyncDataDatabasePath(), true)); |
| 1429 } | 1436 } |
| 1430 | 1437 |
| 1431 class ThreadOpenTestDelegate : public base::PlatformThread::Delegate { | 1438 class ThreadOpenTestDelegate : public base::PlatformThread::Delegate { |
| 1432 public: | 1439 public: |
| 1433 explicit ThreadOpenTestDelegate(DirectoryManager* dm) | 1440 explicit ThreadOpenTestDelegate(DirectoryManager* dm) |
| 1434 : directory_manager_(dm) {} | 1441 : directory_manager_(dm) {} |
| 1435 DirectoryManager* const directory_manager_; | 1442 DirectoryManager* const directory_manager_; |
| 1443 NullDirectoryChangeDelegate delegate_; |
| 1436 | 1444 |
| 1437 private: | 1445 private: |
| 1438 // PlatformThread::Delegate methods: | 1446 // PlatformThread::Delegate methods: |
| 1439 virtual void ThreadMain() { | 1447 virtual void ThreadMain() { |
| 1440 CHECK(directory_manager_->Open("Open")); | 1448 CHECK(directory_manager_->Open("Open", &delegate_)); |
| 1441 } | 1449 } |
| 1442 | 1450 |
| 1443 DISALLOW_COPY_AND_ASSIGN(ThreadOpenTestDelegate); | 1451 DISALLOW_COPY_AND_ASSIGN(ThreadOpenTestDelegate); |
| 1444 }; | 1452 }; |
| 1445 | 1453 |
| 1446 TEST_F(SyncableDirectoryManager, ThreadOpenTest) { | 1454 TEST_F(SyncableDirectoryManager, ThreadOpenTest) { |
| 1447 DirectoryManager dm(FilePath(temp_dir_.path())); | 1455 DirectoryManager dm(FilePath(temp_dir_.path())); |
| 1448 base::PlatformThreadHandle thread_handle; | 1456 base::PlatformThreadHandle thread_handle; |
| 1449 ThreadOpenTestDelegate test_delegate(&dm); | 1457 ThreadOpenTestDelegate test_delegate(&dm); |
| 1450 ASSERT_TRUE(base::PlatformThread::Create(0, &test_delegate, &thread_handle)); | 1458 ASSERT_TRUE(base::PlatformThread::Create(0, &test_delegate, &thread_handle)); |
| (...skipping 18 matching lines...) Expand all Loading... |
| 1469 | 1477 |
| 1470 class ThreadBugDelegate : public base::PlatformThread::Delegate { | 1478 class ThreadBugDelegate : public base::PlatformThread::Delegate { |
| 1471 public: | 1479 public: |
| 1472 // a role is 0 or 1, meaning this thread does the odd or event steps. | 1480 // a role is 0 or 1, meaning this thread does the odd or event steps. |
| 1473 ThreadBugDelegate(int role, Step* step, DirectoryManager* dirman) | 1481 ThreadBugDelegate(int role, Step* step, DirectoryManager* dirman) |
| 1474 : role_(role), step_(step), directory_manager_(dirman) {} | 1482 : role_(role), step_(step), directory_manager_(dirman) {} |
| 1475 | 1483 |
| 1476 protected: | 1484 protected: |
| 1477 const int role_; | 1485 const int role_; |
| 1478 Step* const step_; | 1486 Step* const step_; |
| 1487 NullDirectoryChangeDelegate delegate_; |
| 1479 DirectoryManager* const directory_manager_; | 1488 DirectoryManager* const directory_manager_; |
| 1480 | 1489 |
| 1481 // PlatformThread::Delegate methods: | 1490 // PlatformThread::Delegate methods: |
| 1482 virtual void ThreadMain() { | 1491 virtual void ThreadMain() { |
| 1483 const std::string dirname = "ThreadBug1"; | 1492 const std::string dirname = "ThreadBug1"; |
| 1484 base::AutoLock scoped_lock(step_->mutex); | 1493 base::AutoLock scoped_lock(step_->mutex); |
| 1485 | 1494 |
| 1486 while (step_->number < 3) { | 1495 while (step_->number < 3) { |
| 1487 while (step_->number % 2 != role_) { | 1496 while (step_->number % 2 != role_) { |
| 1488 step_->condvar.Wait(); | 1497 step_->condvar.Wait(); |
| 1489 } | 1498 } |
| 1490 switch (step_->number) { | 1499 switch (step_->number) { |
| 1491 case 0: | 1500 case 0: |
| 1492 directory_manager_->Open(dirname); | 1501 directory_manager_->Open(dirname, &delegate_); |
| 1493 break; | 1502 break; |
| 1494 case 1: | 1503 case 1: |
| 1495 { | 1504 { |
| 1496 directory_manager_->Close(dirname); | 1505 directory_manager_->Close(dirname); |
| 1497 directory_manager_->Open(dirname); | 1506 directory_manager_->Open(dirname, &delegate_); |
| 1498 ScopedDirLookup dir(directory_manager_, dirname); | 1507 ScopedDirLookup dir(directory_manager_, dirname); |
| 1499 CHECK(dir.good()); | 1508 CHECK(dir.good()); |
| 1500 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1509 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
| 1501 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); | 1510 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); |
| 1502 step_->metahandle = me.Get(META_HANDLE); | 1511 step_->metahandle = me.Get(META_HANDLE); |
| 1503 me.Put(IS_UNSYNCED, true); | 1512 me.Put(IS_UNSYNCED, true); |
| 1504 } | 1513 } |
| 1505 break; | 1514 break; |
| 1506 case 2: | 1515 case 2: |
| 1507 { | 1516 { |
| 1508 ScopedDirLookup dir(directory_manager_, dirname); | 1517 ScopedDirLookup dir(directory_manager_, dirname); |
| 1509 CHECK(dir.good()); | 1518 CHECK(dir.good()); |
| 1510 ReadTransaction trans(dir, __FILE__, __LINE__); | 1519 ReadTransaction trans(dir, FROM_HERE); |
| 1511 Entry e(&trans, GET_BY_HANDLE, step_->metahandle); | 1520 Entry e(&trans, GET_BY_HANDLE, step_->metahandle); |
| 1512 CHECK(e.good()); // Failed due to ThreadBug1 | 1521 CHECK(e.good()); // Failed due to ThreadBug1 |
| 1513 } | 1522 } |
| 1514 directory_manager_->Close(dirname); | 1523 directory_manager_->Close(dirname); |
| 1515 break; | 1524 break; |
| 1516 } | 1525 } |
| 1517 step_->number += 1; | 1526 step_->number += 1; |
| 1518 step_->condvar.Signal(); | 1527 step_->condvar.Signal(); |
| 1519 } | 1528 } |
| 1520 } | 1529 } |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1561 while (step_->number % 2 != role_) { | 1570 while (step_->number % 2 != role_) { |
| 1562 step_->condvar.Wait(); | 1571 step_->condvar.Wait(); |
| 1563 } | 1572 } |
| 1564 switch (step_->number) { | 1573 switch (step_->number) { |
| 1565 case 0: | 1574 case 0: |
| 1566 { | 1575 { |
| 1567 // Clean up remnants of earlier test runs. | 1576 // Clean up remnants of earlier test runs. |
| 1568 file_util::Delete(directory_manager_->GetSyncDataDatabasePath(), | 1577 file_util::Delete(directory_manager_->GetSyncDataDatabasePath(), |
| 1569 true); | 1578 true); |
| 1570 // Test. | 1579 // Test. |
| 1571 directory_manager_->Open(dirname); | 1580 directory_manager_->Open(dirname, &delegate_); |
| 1572 ScopedDirLookup dir(directory_manager_, dirname); | 1581 ScopedDirLookup dir(directory_manager_, dirname); |
| 1573 CHECK(dir.good()); | 1582 CHECK(dir.good()); |
| 1574 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1583 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
| 1575 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); | 1584 MutableEntry me(&trans, CREATE, trans.root_id(), "Jeff"); |
| 1576 me.Put(BASE_VERSION, 1); | 1585 me.Put(BASE_VERSION, 1); |
| 1577 me.Put(ID, jeff_id); | 1586 me.Put(ID, jeff_id); |
| 1578 PutDataAsBookmarkFavicon(&trans, &me, test_bytes, | 1587 PutDataAsBookmarkFavicon(&trans, &me, test_bytes, |
| 1579 sizeof(test_bytes)); | 1588 sizeof(test_bytes)); |
| 1580 } | 1589 } |
| 1581 { | 1590 { |
| 1582 ScopedDirLookup dir(directory_manager_, dirname); | 1591 ScopedDirLookup dir(directory_manager_, dirname); |
| 1583 CHECK(dir.good()); | 1592 CHECK(dir.good()); |
| 1584 dir->SaveChanges(); | 1593 dir->SaveChanges(); |
| 1585 } | 1594 } |
| 1586 directory_manager_->Close(dirname); | 1595 directory_manager_->Close(dirname); |
| 1587 break; | 1596 break; |
| 1588 case 1: | 1597 case 1: |
| 1589 { | 1598 { |
| 1590 directory_manager_->Open(dirname); | 1599 directory_manager_->Open(dirname, &delegate_); |
| 1591 ScopedDirLookup dir(directory_manager_, dirname); | 1600 ScopedDirLookup dir(directory_manager_, dirname); |
| 1592 CHECK(dir.good()); | 1601 CHECK(dir.good()); |
| 1593 } | 1602 } |
| 1594 break; | 1603 break; |
| 1595 case 2: | 1604 case 2: |
| 1596 { | 1605 { |
| 1597 ScopedDirLookup dir(directory_manager_, dirname); | 1606 ScopedDirLookup dir(directory_manager_, dirname); |
| 1598 CHECK(dir.good()); | 1607 CHECK(dir.good()); |
| 1599 } | 1608 } |
| 1600 break; | 1609 break; |
| 1601 case 3: | 1610 case 3: |
| 1602 { | 1611 { |
| 1603 ScopedDirLookup dir(directory_manager_, dirname); | 1612 ScopedDirLookup dir(directory_manager_, dirname); |
| 1604 CHECK(dir.good()); | 1613 CHECK(dir.good()); |
| 1605 ReadTransaction trans(dir, __FILE__, __LINE__); | 1614 ReadTransaction trans(dir, FROM_HERE); |
| 1606 Entry e(&trans, GET_BY_ID, jeff_id); | 1615 Entry e(&trans, GET_BY_ID, jeff_id); |
| 1607 ExpectDataFromBookmarkFaviconEquals(&trans, &e, test_bytes, | 1616 ExpectDataFromBookmarkFaviconEquals(&trans, &e, test_bytes, |
| 1608 sizeof(test_bytes)); | 1617 sizeof(test_bytes)); |
| 1609 } | 1618 } |
| 1610 // Same result as CloseAllDirectories, but more code coverage. | 1619 // Same result as CloseAllDirectories, but more code coverage. |
| 1611 directory_manager_->Close(dirname); | 1620 directory_manager_->Close(dirname); |
| 1612 break; | 1621 break; |
| 1613 } | 1622 } |
| 1614 step_->number += 1; | 1623 step_->number += 1; |
| 1615 step_->condvar.Signal(); | 1624 step_->condvar.Signal(); |
| (...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1655 // PlatformThread::Delegate methods: | 1664 // PlatformThread::Delegate methods: |
| 1656 virtual void ThreadMain() { | 1665 virtual void ThreadMain() { |
| 1657 ScopedDirLookup dir(directory_manager_, dirname_); | 1666 ScopedDirLookup dir(directory_manager_, dirname_); |
| 1658 CHECK(dir.good()); | 1667 CHECK(dir.good()); |
| 1659 int entry_count = 0; | 1668 int entry_count = 0; |
| 1660 std::string path_name; | 1669 std::string path_name; |
| 1661 | 1670 |
| 1662 for (int i = 0; i < 20; ++i) { | 1671 for (int i = 0; i < 20; ++i) { |
| 1663 const int rand_action = rand() % 10; | 1672 const int rand_action = rand() % 10; |
| 1664 if (rand_action < 4 && !path_name.empty()) { | 1673 if (rand_action < 4 && !path_name.empty()) { |
| 1665 ReadTransaction trans(dir, __FILE__, __LINE__); | 1674 ReadTransaction trans(dir, FROM_HERE); |
| 1666 CHECK(1 == CountEntriesWithName(&trans, trans.root_id(), path_name)); | 1675 CHECK(1 == CountEntriesWithName(&trans, trans.root_id(), path_name)); |
| 1667 base::PlatformThread::Sleep(rand() % 10); | 1676 base::PlatformThread::Sleep(rand() % 10); |
| 1668 } else { | 1677 } else { |
| 1669 std::string unique_name = | 1678 std::string unique_name = |
| 1670 base::StringPrintf("%d.%d", thread_number_, entry_count++); | 1679 base::StringPrintf("%d.%d", thread_number_, entry_count++); |
| 1671 path_name.assign(unique_name.begin(), unique_name.end()); | 1680 path_name.assign(unique_name.begin(), unique_name.end()); |
| 1672 WriteTransaction trans(dir, UNITTEST, __FILE__, __LINE__); | 1681 WriteTransaction trans(dir, UNITTEST, FROM_HERE); |
| 1673 MutableEntry e(&trans, CREATE, trans.root_id(), path_name); | 1682 MutableEntry e(&trans, CREATE, trans.root_id(), path_name); |
| 1674 CHECK(e.good()); | 1683 CHECK(e.good()); |
| 1675 base::PlatformThread::Sleep(rand() % 20); | 1684 base::PlatformThread::Sleep(rand() % 20); |
| 1676 e.Put(IS_UNSYNCED, true); | 1685 e.Put(IS_UNSYNCED, true); |
| 1677 if (e.Put(ID, TestIdFactory::FromNumber(rand())) && | 1686 if (e.Put(ID, TestIdFactory::FromNumber(rand())) && |
| 1678 e.Get(ID).ServerKnows() && !e.Get(ID).IsRoot()) { | 1687 e.Get(ID).ServerKnows() && !e.Get(ID).IsRoot()) { |
| 1679 e.Put(BASE_VERSION, 1); | 1688 e.Put(BASE_VERSION, 1); |
| 1680 } | 1689 } |
| 1681 } | 1690 } |
| 1682 } | 1691 } |
| 1683 } | 1692 } |
| 1684 | 1693 |
| 1685 DISALLOW_COPY_AND_ASSIGN(StressTransactionsDelegate); | 1694 DISALLOW_COPY_AND_ASSIGN(StressTransactionsDelegate); |
| 1686 }; | 1695 }; |
| 1687 | 1696 |
| 1688 TEST(SyncableDirectory, StressTransactions) { | 1697 TEST(SyncableDirectory, StressTransactions) { |
| 1689 ScopedTempDir temp_dir; | 1698 ScopedTempDir temp_dir; |
| 1690 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); | 1699 ASSERT_TRUE(temp_dir.CreateUniqueTempDir()); |
| 1691 DirectoryManager dirman(FilePath(temp_dir.path())); | 1700 DirectoryManager dirman(FilePath(temp_dir.path())); |
| 1692 std::string dirname = "stress"; | 1701 std::string dirname = "stress"; |
| 1693 file_util::Delete(dirman.GetSyncDataDatabasePath(), true); | 1702 file_util::Delete(dirman.GetSyncDataDatabasePath(), true); |
| 1694 dirman.Open(dirname); | 1703 NullDirectoryChangeDelegate delegate; |
| 1704 dirman.Open(dirname, &delegate); |
| 1695 | 1705 |
| 1696 const int kThreadCount = 7; | 1706 const int kThreadCount = 7; |
| 1697 base::PlatformThreadHandle threads[kThreadCount]; | 1707 base::PlatformThreadHandle threads[kThreadCount]; |
| 1698 scoped_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; | 1708 scoped_ptr<StressTransactionsDelegate> thread_delegates[kThreadCount]; |
| 1699 | 1709 |
| 1700 for (int i = 0; i < kThreadCount; ++i) { | 1710 for (int i = 0; i < kThreadCount; ++i) { |
| 1701 thread_delegates[i].reset( | 1711 thread_delegates[i].reset( |
| 1702 new StressTransactionsDelegate(&dirman, dirname, i)); | 1712 new StressTransactionsDelegate(&dirman, dirname, i)); |
| 1703 ASSERT_TRUE(base::PlatformThread::Create( | 1713 ASSERT_TRUE(base::PlatformThread::Create( |
| 1704 0, thread_delegates[i].get(), &threads[i])); | 1714 0, thread_delegates[i].get(), &threads[i])); |
| (...skipping 14 matching lines...) Expand all Loading... |
| 1719 const char* test_tag_; | 1729 const char* test_tag_; |
| 1720 | 1730 |
| 1721 SyncableClientTagTest() : test_name_("test_name"), test_tag_("dietcoke") {} | 1731 SyncableClientTagTest() : test_name_("test_name"), test_tag_("dietcoke") {} |
| 1722 | 1732 |
| 1723 bool CreateWithDefaultTag(Id id, bool deleted) { | 1733 bool CreateWithDefaultTag(Id id, bool deleted) { |
| 1724 return CreateWithTag(test_tag_, id, deleted); | 1734 return CreateWithTag(test_tag_, id, deleted); |
| 1725 } | 1735 } |
| 1726 | 1736 |
| 1727 // Attempt to create an entry with a default tag. | 1737 // Attempt to create an entry with a default tag. |
| 1728 bool CreateWithTag(const char* tag, Id id, bool deleted) { | 1738 bool CreateWithTag(const char* tag, Id id, bool deleted) { |
| 1729 WriteTransaction wtrans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1739 WriteTransaction wtrans(dir_.get(), UNITTEST, FROM_HERE); |
| 1730 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), test_name_); | 1740 MutableEntry me(&wtrans, CREATE, wtrans.root_id(), test_name_); |
| 1731 CHECK(me.good()); | 1741 CHECK(me.good()); |
| 1732 me.Put(ID, id); | 1742 me.Put(ID, id); |
| 1733 if (id.ServerKnows()) { | 1743 if (id.ServerKnows()) { |
| 1734 me.Put(BASE_VERSION, kBaseVersion); | 1744 me.Put(BASE_VERSION, kBaseVersion); |
| 1735 } | 1745 } |
| 1736 me.Put(IS_DEL, deleted); | 1746 me.Put(IS_DEL, deleted); |
| 1737 me.Put(IS_UNSYNCED, true); | 1747 me.Put(IS_UNSYNCED, true); |
| 1738 me.Put(IS_DIR, false); | 1748 me.Put(IS_DIR, false); |
| 1739 return me.Put(UNIQUE_CLIENT_TAG, tag); | 1749 return me.Put(UNIQUE_CLIENT_TAG, tag); |
| 1740 } | 1750 } |
| 1741 | 1751 |
| 1742 // Verify an entry exists with the default tag. | 1752 // Verify an entry exists with the default tag. |
| 1743 void VerifyTag(Id id, bool deleted) { | 1753 void VerifyTag(Id id, bool deleted) { |
| 1744 // Should still be present and valid in the client tag index. | 1754 // Should still be present and valid in the client tag index. |
| 1745 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1755 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1746 Entry me(&trans, GET_BY_CLIENT_TAG, test_tag_); | 1756 Entry me(&trans, GET_BY_CLIENT_TAG, test_tag_); |
| 1747 CHECK(me.good()); | 1757 CHECK(me.good()); |
| 1748 EXPECT_EQ(me.Get(ID), id); | 1758 EXPECT_EQ(me.Get(ID), id); |
| 1749 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), test_tag_); | 1759 EXPECT_EQ(me.Get(UNIQUE_CLIENT_TAG), test_tag_); |
| 1750 EXPECT_EQ(me.Get(IS_DEL), deleted); | 1760 EXPECT_EQ(me.Get(IS_DEL), deleted); |
| 1751 EXPECT_EQ(me.Get(IS_UNSYNCED), true); | 1761 EXPECT_EQ(me.Get(IS_UNSYNCED), true); |
| 1752 } | 1762 } |
| 1753 | 1763 |
| 1754 protected: | 1764 protected: |
| 1755 TestIdFactory factory_; | 1765 TestIdFactory factory_; |
| 1756 }; | 1766 }; |
| 1757 | 1767 |
| 1758 TEST_F(SyncableClientTagTest, TestClientTagClear) { | 1768 TEST_F(SyncableClientTagTest, TestClientTagClear) { |
| 1759 Id server_id = factory_.NewServerId(); | 1769 Id server_id = factory_.NewServerId(); |
| 1760 EXPECT_TRUE(CreateWithDefaultTag(server_id, false)); | 1770 EXPECT_TRUE(CreateWithDefaultTag(server_id, false)); |
| 1761 { | 1771 { |
| 1762 WriteTransaction trans(dir_.get(), UNITTEST, __FILE__, __LINE__); | 1772 WriteTransaction trans(dir_.get(), UNITTEST, FROM_HERE); |
| 1763 MutableEntry me(&trans, GET_BY_CLIENT_TAG, test_tag_); | 1773 MutableEntry me(&trans, GET_BY_CLIENT_TAG, test_tag_); |
| 1764 EXPECT_TRUE(me.good()); | 1774 EXPECT_TRUE(me.good()); |
| 1765 me.Put(UNIQUE_CLIENT_TAG, ""); | 1775 me.Put(UNIQUE_CLIENT_TAG, ""); |
| 1766 } | 1776 } |
| 1767 { | 1777 { |
| 1768 ReadTransaction trans(dir_.get(), __FILE__, __LINE__); | 1778 ReadTransaction trans(dir_.get(), FROM_HERE); |
| 1769 Entry by_tag(&trans, GET_BY_CLIENT_TAG, test_tag_); | 1779 Entry by_tag(&trans, GET_BY_CLIENT_TAG, test_tag_); |
| 1770 EXPECT_FALSE(by_tag.good()); | 1780 EXPECT_FALSE(by_tag.good()); |
| 1771 | 1781 |
| 1772 Entry by_id(&trans, GET_BY_ID, server_id); | 1782 Entry by_id(&trans, GET_BY_ID, server_id); |
| 1773 EXPECT_TRUE(by_id.good()); | 1783 EXPECT_TRUE(by_id.good()); |
| 1774 EXPECT_TRUE(by_id.Get(UNIQUE_CLIENT_TAG).empty()); | 1784 EXPECT_TRUE(by_id.Get(UNIQUE_CLIENT_TAG).empty()); |
| 1775 } | 1785 } |
| 1776 } | 1786 } |
| 1777 | 1787 |
| 1778 TEST_F(SyncableClientTagTest, TestClientTagIndexServerId) { | 1788 TEST_F(SyncableClientTagTest, TestClientTagIndexServerId) { |
| (...skipping 23 matching lines...) Expand all Loading... |
| 1802 TEST_F(SyncableClientTagTest, TestClientTagIndexDuplicateServer) { | 1812 TEST_F(SyncableClientTagTest, TestClientTagIndexDuplicateServer) { |
| 1803 EXPECT_TRUE(CreateWithDefaultTag(factory_.NewServerId(), true)); | 1813 EXPECT_TRUE(CreateWithDefaultTag(factory_.NewServerId(), true)); |
| 1804 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), true)); | 1814 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), true)); |
| 1805 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), false)); | 1815 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewServerId(), false)); |
| 1806 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), false)); | 1816 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), false)); |
| 1807 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), true)); | 1817 EXPECT_FALSE(CreateWithDefaultTag(factory_.NewLocalId(), true)); |
| 1808 } | 1818 } |
| 1809 | 1819 |
| 1810 } // namespace | 1820 } // namespace |
| 1811 } // namespace syncable | 1821 } // namespace syncable |
| OLD | NEW |