Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 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 <vector> | 5 #include <vector> |
| 6 | 6 |
| 7 #include "base/string_util.h" | 7 #include "base/string_util.h" |
| 8 #include "chrome/browser/sync/engine/mock_model_safe_workers.h" | 8 #include "chrome/browser/sync/engine/mock_model_safe_workers.h" |
| 9 #include "chrome/browser/sync/engine/process_commit_response_command.h" | 9 #include "chrome/browser/sync/engine/process_commit_response_command.h" |
| 10 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" | 10 #include "chrome/browser/sync/protocol/bookmark_specifics.pb.h" |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 27 using syncable::IS_UNSYNCED; | 27 using syncable::IS_UNSYNCED; |
| 28 using syncable::Id; | 28 using syncable::Id; |
| 29 using syncable::MutableEntry; | 29 using syncable::MutableEntry; |
| 30 using syncable::NON_UNIQUE_NAME; | 30 using syncable::NON_UNIQUE_NAME; |
| 31 using syncable::ReadTransaction; | 31 using syncable::ReadTransaction; |
| 32 using syncable::ScopedDirLookup; | 32 using syncable::ScopedDirLookup; |
| 33 using syncable::UNITTEST; | 33 using syncable::UNITTEST; |
| 34 using syncable::WriteTransaction; | 34 using syncable::WriteTransaction; |
| 35 | 35 |
| 36 // A test fixture for tests exercising ProcessCommitResponseCommand. | 36 // A test fixture for tests exercising ProcessCommitResponseCommand. |
| 37 class ProcessCommitResponseCommandTest : public SyncerCommandTest { | 37 template<typename T> |
| 38 class ProcessCommitResponseCommandTestWithParam | |
| 39 : public SyncerCommandTestWithParam<T> { | |
| 38 public: | 40 public: |
| 39 virtual void SetUp() { | 41 virtual void SetUp() { |
| 40 workers()->clear(); | 42 workers()->clear(); |
| 41 mutable_routing_info()->clear(); | 43 mutable_routing_info()->clear(); |
| 42 | 44 |
| 43 workers()->push_back(new ModelSafeWorker()); // GROUP_PASSIVE worker. | 45 workers()->push_back(new ModelSafeWorker()); // GROUP_PASSIVE worker. |
| 44 workers()->push_back(new MockUIModelWorker()); // GROUP_UI worker. | 46 workers()->push_back(new MockUIModelWorker()); // GROUP_UI worker. |
| 45 (*mutable_routing_info())[syncable::BOOKMARKS] = GROUP_UI; | 47 (*mutable_routing_info())[syncable::BOOKMARKS] = GROUP_UI; |
| 46 (*mutable_routing_info())[syncable::PREFERENCES] = GROUP_UI; | 48 (*mutable_routing_info())[syncable::PREFERENCES] = GROUP_UI; |
| 47 (*mutable_routing_info())[syncable::AUTOFILL] = GROUP_PASSIVE; | 49 (*mutable_routing_info())[syncable::AUTOFILL] = GROUP_PASSIVE; |
| 48 | 50 |
| 49 commit_set_.reset(new sessions::OrderedCommitSet(routing_info())); | 51 commit_set_.reset(new sessions::OrderedCommitSet(routing_info())); |
| 50 SyncerCommandTest::SetUp(); | 52 SyncerCommandTestWithParam::SetUp(); |
| 51 } | 53 } |
| 52 | 54 |
| 53 protected: | 55 protected: |
| 54 ProcessCommitResponseCommandTest() | 56 ProcessCommitResponseCommandTestWithParam() |
| 55 : next_old_revision_(1), | 57 : next_old_revision_(1), |
| 56 next_new_revision_(4000), | 58 next_new_revision_(4000), |
| 57 next_server_position_(10000) { | 59 next_server_position_(10000) { |
| 58 } | 60 } |
| 59 | 61 |
| 60 void CheckEntry(Entry* e, const std::string& name, | 62 void CheckEntry(Entry* e, const std::string& name, |
| 61 syncable::ModelType model_type, const Id& parent_id) { | 63 syncable::ModelType model_type, const Id& parent_id) { |
| 62 EXPECT_TRUE(e->good()); | 64 EXPECT_TRUE(e->good()); |
| 63 ASSERT_EQ(name, e->Get(NON_UNIQUE_NAME)); | 65 ASSERT_EQ(name, e->Get(NON_UNIQUE_NAME)); |
| 64 ASSERT_EQ(model_type, e->GetModelType()); | 66 ASSERT_EQ(model_type, e->GetModelType()); |
| (...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 165 entry_response->set_parent_id_string(entity->parent_id_string()); | 167 entry_response->set_parent_id_string(entity->parent_id_string()); |
| 166 for (int i = 0; i < commit->commit().entries_size(); ++i) { | 168 for (int i = 0; i < commit->commit().entries_size(); ++i) { |
| 167 if (commit->commit().entries(i).id_string() == | 169 if (commit->commit().entries(i).id_string() == |
| 168 entity->parent_id_string()) { | 170 entity->parent_id_string()) { |
| 169 entry_response->set_parent_id_string( | 171 entry_response->set_parent_id_string( |
| 170 response->commit().entryresponse(i).id_string()); | 172 response->commit().entryresponse(i).id_string()); |
| 171 } | 173 } |
| 172 } | 174 } |
| 173 } | 175 } |
| 174 | 176 |
| 177 void SetLastErrorCode(CommitResponse::ResponseType error_code) { | |
| 178 sessions::StatusController* sync_state = session()->status_controller(); | |
| 179 sync_pb::ClientToServerResponse* response = | |
| 180 sync_state->mutable_commit_response(); | |
| 181 sync_pb::CommitResponse_EntryResponse* entry_response = | |
| 182 response->mutable_commit()->mutable_entryresponse( | |
| 183 response->mutable_commit()->entryresponse_size() - 1); | |
| 184 entry_response->set_response_type(error_code); | |
| 185 } | |
| 186 | |
| 175 ProcessCommitResponseCommand command_; | 187 ProcessCommitResponseCommand command_; |
| 176 TestIdFactory id_factory_; | 188 TestIdFactory id_factory_; |
| 177 scoped_ptr<sessions::OrderedCommitSet> commit_set_; | 189 scoped_ptr<sessions::OrderedCommitSet> commit_set_; |
| 178 private: | 190 private: |
| 179 int64 next_old_revision_; | 191 int64 next_old_revision_; |
| 180 int64 next_new_revision_; | 192 int64 next_new_revision_; |
| 181 int64 next_server_position_; | 193 int64 next_server_position_; |
| 182 DISALLOW_COPY_AND_ASSIGN(ProcessCommitResponseCommandTest); | 194 DISALLOW_COPY_AND_ASSIGN(ProcessCommitResponseCommandTestWithParam); |
| 183 }; | 195 }; |
| 184 | 196 |
| 197 class ProcessCommitResponseCommandTest | |
| 198 : public ProcessCommitResponseCommandTestWithParam<void*> {}; | |
| 199 | |
| 185 TEST_F(ProcessCommitResponseCommandTest, MultipleCommitIdProjections) { | 200 TEST_F(ProcessCommitResponseCommandTest, MultipleCommitIdProjections) { |
| 186 Id bookmark_folder_id = id_factory_.NewLocalId(); | 201 Id bookmark_folder_id = id_factory_.NewLocalId(); |
| 187 Id bookmark_id1 = id_factory_.NewLocalId(); | 202 Id bookmark_id1 = id_factory_.NewLocalId(); |
| 188 Id bookmark_id2 = id_factory_.NewLocalId(); | 203 Id bookmark_id2 = id_factory_.NewLocalId(); |
| 189 Id pref_id1 = id_factory_.NewLocalId(), pref_id2 = id_factory_.NewLocalId(); | 204 Id pref_id1 = id_factory_.NewLocalId(), pref_id2 = id_factory_.NewLocalId(); |
| 190 Id autofill_id1 = id_factory_.NewLocalId(); | 205 Id autofill_id1 = id_factory_.NewLocalId(); |
| 191 Id autofill_id2 = id_factory_.NewLocalId(); | 206 Id autofill_id2 = id_factory_.NewLocalId(); |
| 192 CreateUnprocessedCommitResult(bookmark_folder_id, id_factory_.root(), | 207 CreateUnprocessedCommitResult(bookmark_folder_id, id_factory_.root(), |
| 193 "A bookmark folder", syncable::BOOKMARKS); | 208 "A bookmark folder", syncable::BOOKMARKS); |
| 194 CreateUnprocessedCommitResult(bookmark_id1, bookmark_folder_id, | 209 CreateUnprocessedCommitResult(bookmark_id1, bookmark_folder_id, |
| (...skipping 142 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 337 ASSERT_LT(0, c.Get(BASE_VERSION)); | 352 ASSERT_LT(0, c.Get(BASE_VERSION)); |
| 338 } | 353 } |
| 339 } | 354 } |
| 340 cid = c.Get(syncable::NEXT_ID); | 355 cid = c.Get(syncable::NEXT_ID); |
| 341 child_count++; | 356 child_count++; |
| 342 } | 357 } |
| 343 ASSERT_EQ(batch_size*2, child_count) | 358 ASSERT_EQ(batch_size*2, child_count) |
| 344 << "Too few or too many children in parent folder after commit."; | 359 << "Too few or too many children in parent folder after commit."; |
| 345 } | 360 } |
| 346 | 361 |
| 362 // This test fixture runs across a Cartesian product of per-type fail/success | |
| 363 // possibilities. | |
| 364 enum { | |
| 365 TEST_PARAM_BOOKMARK_ENABLE_BIT, | |
| 366 TEST_PARAM_AUTOFILL_ENABLE_BIT, | |
| 367 TEST_PARAM_BIT_COUNT | |
| 368 }; | |
| 369 class MixedResult : public ProcessCommitResponseCommandTestWithParam<int> { | |
| 370 protected: | |
| 371 bool ShouldFailBookmarkCommit() { | |
| 372 return (GetParam() & (1 << TEST_PARAM_BOOKMARK_ENABLE_BIT)) == 0; | |
| 373 } | |
| 374 bool ShouldFailAutofillCommit() { | |
| 375 return (GetParam() & (1 << TEST_PARAM_AUTOFILL_ENABLE_BIT)) == 0; | |
| 376 } | |
| 377 }; | |
| 378 INSTANTIATE_TEST_CASE_P(ProcessCommitResponse, | |
| 379 MixedResult, | |
| 380 testing::Range(0, 1 << TEST_PARAM_BIT_COUNT)); | |
|
tim (not reviewing)
2010/03/25 21:16:14
this is cool
| |
| 381 | |
| 382 // This test commits 2 items (one bookmark, one autofill) and validates what | |
| 383 // happens to the extensions activity records. Commits could fail or succeed, | |
| 384 // depending on the test parameter. | |
| 385 TEST_P(MixedResult, ExtensionActivity) { | |
| 386 EXPECT_NE(routing_info().find(syncable::BOOKMARKS)->second, | |
| 387 routing_info().find(syncable::AUTOFILL)->second) | |
| 388 << "To not be lame, this test requires more than one active group."; | |
| 389 | |
| 390 // Bookmark item setup. | |
| 391 CreateUnprocessedCommitResult(id_factory_.NewServerId(), | |
| 392 id_factory_.root(), "Some bookmark", syncable::BOOKMARKS); | |
| 393 if (ShouldFailBookmarkCommit()) | |
| 394 SetLastErrorCode(CommitResponse::TRANSIENT_ERROR); | |
| 395 // Autofill item setup. | |
| 396 CreateUnprocessedCommitResult(id_factory_.NewServerId(), | |
| 397 id_factory_.root(), "Some autofill", syncable::AUTOFILL); | |
| 398 if (ShouldFailAutofillCommit()) | |
| 399 SetLastErrorCode(CommitResponse::TRANSIENT_ERROR); | |
| 400 | |
| 401 // Put some extensions activity in the session. | |
| 402 { | |
| 403 ExtensionsActivityMonitor::Records* records = | |
| 404 session()->mutable_extensions_activity(); | |
| 405 (*records)["ABC"].extension_id = "ABC"; | |
| 406 (*records)["ABC"].bookmark_write_count = 2049U; | |
| 407 (*records)["xyz"].extension_id = "xyz"; | |
| 408 (*records)["xyz"].bookmark_write_count = 4U; | |
| 409 } | |
| 410 command_.ExecuteImpl(session()); | |
| 411 | |
| 412 ExtensionsActivityMonitor::Records final_monitor_records; | |
| 413 context()->extensions_monitor()->GetAndClearRecords(&final_monitor_records); | |
| 414 | |
| 415 if (ShouldFailBookmarkCommit()) { | |
| 416 ASSERT_EQ(2U, final_monitor_records.size()) | |
| 417 << "Should restore records after unsuccessful bookmark commit."; | |
| 418 EXPECT_EQ("ABC", final_monitor_records["ABC"].extension_id); | |
| 419 EXPECT_EQ("xyz", final_monitor_records["xyz"].extension_id); | |
| 420 EXPECT_EQ(2049U, final_monitor_records["ABC"].bookmark_write_count); | |
| 421 EXPECT_EQ(4U, final_monitor_records["xyz"].bookmark_write_count); | |
| 422 } else { | |
| 423 EXPECT_TRUE(final_monitor_records.empty()) | |
| 424 << "Should not restore records after successful bookmark commit."; | |
| 425 } | |
| 426 } | |
| 427 | |
| 428 | |
| 347 } // namespace browser_sync | 429 } // namespace browser_sync |
| OLD | NEW |