| Index: chrome/browser/sync/profile_sync_service_unittest.cc
|
| diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc
|
| index 5c85c1df38c82ab8e2d8cc141e9d33487c33cc29..15b93aad84c71db884b2fe77b1ee34f3ebe6559f 100644
|
| --- a/chrome/browser/sync/profile_sync_service_unittest.cc
|
| +++ b/chrome/browser/sync/profile_sync_service_unittest.cc
|
| @@ -52,18 +52,85 @@ using testing::Return;
|
| using testing::WithArg;
|
| using testing::Invoke;
|
|
|
| +// TODO(akalin): Bookmark-specific tests should be moved into their
|
| +// own file.
|
| class TestBookmarkModelAssociator : public BookmarkModelAssociator {
|
| public:
|
| - TestBookmarkModelAssociator(TestProfileSyncService* service,
|
| + TestBookmarkModelAssociator(
|
| + TestProfileSyncService* service,
|
| UnrecoverableErrorHandler* persist_ids_error_handler)
|
| : BookmarkModelAssociator(service, persist_ids_error_handler),
|
| - helper_(new TestModelAssociatorHelper(service->id_factory())) {
|
| - }
|
| + id_factory_(service->id_factory()) {}
|
| +
|
| + // TODO(akalin): This logic lazily creates any tagged node that is
|
| + // requested. A better way would be to have utility functions to
|
| + // create sync nodes from some bookmark structure and to use that.
|
| virtual bool GetSyncIdForTaggedNode(const std::string& tag, int64* sync_id) {
|
| - return helper_->GetSyncIdForTaggedNode(this, tag, sync_id);
|
| + std::wstring tag_wide;
|
| + if (!UTF8ToWide(tag.c_str(), tag.length(), &tag_wide)) {
|
| + NOTREACHED() << "Unable to convert UTF8 to wide for string: " << tag;
|
| + return false;
|
| + }
|
| +
|
| + bool root_exists = false;
|
| + syncable::ModelType type = model_type();
|
| + {
|
| + sync_api::WriteTransaction trans(sync_service()->GetUserShare());
|
| + sync_api::ReadNode uber_root(&trans);
|
| + uber_root.InitByRootLookup();
|
| +
|
| + sync_api::ReadNode root(&trans);
|
| + root_exists = root.InitByTagLookup(
|
| + ProfileSyncServiceTestHelper::GetTagForType(type));
|
| + }
|
| +
|
| + if (!root_exists) {
|
| + bool created = ProfileSyncServiceTestHelper::CreateRoot(
|
| + type,
|
| + sync_service()->GetUserShare(),
|
| + id_factory_);
|
| + if (!created)
|
| + return false;
|
| + }
|
| +
|
| + sync_api::WriteTransaction trans(sync_service()->GetUserShare());
|
| + sync_api::ReadNode root(&trans);
|
| + EXPECT_TRUE(root.InitByTagLookup(
|
| + ProfileSyncServiceTestHelper::GetTagForType(type)));
|
| +
|
| + // First, try to find a node with the title among the root's children.
|
| + // This will be the case if we are testing model persistence, and
|
| + // are reloading a sync repository created earlier in the test.
|
| + int64 last_child_id = sync_api::kInvalidId;
|
| + for (int64 id = root.GetFirstChildId(); id != sync_api::kInvalidId; /***/) {
|
| + sync_api::ReadNode child(&trans);
|
| + child.InitByIdLookup(id);
|
| + last_child_id = id;
|
| + if (tag_wide == child.GetTitle()) {
|
| + *sync_id = id;
|
| + return true;
|
| + }
|
| + id = child.GetSuccessorId();
|
| + }
|
| +
|
| + sync_api::ReadNode predecessor_node(&trans);
|
| + sync_api::ReadNode* predecessor = NULL;
|
| + if (last_child_id != sync_api::kInvalidId) {
|
| + predecessor_node.InitByIdLookup(last_child_id);
|
| + predecessor = &predecessor_node;
|
| + }
|
| + sync_api::WriteNode node(&trans);
|
| + // Create new fake tagged nodes at the end of the ordering.
|
| + node.InitByCreation(type, root, predecessor);
|
| + node.SetIsFolder(true);
|
| + node.SetTitle(tag_wide);
|
| + node.SetExternalId(0);
|
| + *sync_id = node.GetId();
|
| + return true;
|
| }
|
| +
|
| private:
|
| - scoped_ptr<TestModelAssociatorHelper> helper_;
|
| + browser_sync::TestIdFactory* id_factory_;
|
| };
|
|
|
| // FakeServerChange constructs a list of sync_api::ChangeRecords while modifying
|
| @@ -342,7 +409,7 @@ class ProfileSyncServiceTest : public testing::Test {
|
| }
|
|
|
| void ExpectSyncerNodeMatching(const BookmarkNode* bnode) {
|
| - sync_api::ReadTransaction trans(service_->backend_->GetUserShareHandle());
|
| + sync_api::ReadTransaction trans(service_->GetUserShare());
|
| ExpectSyncerNodeMatching(&trans, bnode);
|
| }
|
|
|
| @@ -420,7 +487,7 @@ class ProfileSyncServiceTest : public testing::Test {
|
| }
|
|
|
| void ExpectModelMatch() {
|
| - sync_api::ReadTransaction trans(service_->backend_->GetUserShareHandle());
|
| + sync_api::ReadTransaction trans(service_->GetUserShare());
|
| ExpectModelMatch(&trans);
|
| }
|
|
|
| @@ -433,8 +500,6 @@ class ProfileSyncServiceTest : public testing::Test {
|
| model_->GetBookmarkBarNode()->id());
|
| }
|
|
|
| - SyncBackendHost* backend() { return service_->backend_.get(); }
|
| -
|
| // This serves as the "UI loop" on which the ProfileSyncService lives and
|
| // operates. It is needed because the SyncBackend can post tasks back to
|
| // the service, meaning it can't be null. It doesn't have to be running,
|
| @@ -548,7 +613,7 @@ TEST_F(ProfileSyncServiceTest, ServerChangeProcessing) {
|
| LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
|
| StartSyncService();
|
|
|
| - sync_api::WriteTransaction trans(backend()->GetUserShareHandle());
|
| + sync_api::WriteTransaction trans(service_->GetUserShare());
|
|
|
| FakeServerChange adds(&trans);
|
| int64 f1 = adds.AddFolder(L"Server Folder B", bookmark_bar_id(), 0);
|
| @@ -637,7 +702,7 @@ TEST_F(ProfileSyncServiceTest, ServerChangeRequiringFosterParent) {
|
| LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
|
| StartSyncService();
|
|
|
| - sync_api::WriteTransaction trans(backend()->GetUserShareHandle());
|
| + sync_api::WriteTransaction trans(service_->GetUserShare());
|
|
|
| // Stress the immediate children of other_node because that's where
|
| // ApplyModelChanges puts a temporary foster parent node.
|
| @@ -686,7 +751,7 @@ TEST_F(ProfileSyncServiceTest, ServerChangeWithNonCanonicalURL) {
|
| StartSyncService();
|
|
|
| {
|
| - sync_api::WriteTransaction trans(backend()->GetUserShareHandle());
|
| + sync_api::WriteTransaction trans(service_->GetUserShare());
|
|
|
| FakeServerChange adds(&trans);
|
| std::string url("http://dev.chromium.org");
|
| @@ -717,7 +782,7 @@ TEST_F(ProfileSyncServiceTest, DISABLED_ServerChangeWithInvalidURL) {
|
|
|
| int child_count = 0;
|
| {
|
| - sync_api::WriteTransaction trans(backend()->GetUserShareHandle());
|
| + sync_api::WriteTransaction trans(service_->GetUserShare());
|
|
|
| FakeServerChange adds(&trans);
|
| std::string url("x");
|
| @@ -834,7 +899,7 @@ TEST_F(ProfileSyncServiceTest, UnrecoverableErrorSuspendsService) {
|
| // updating the ProfileSyncService state. This should introduce
|
| // inconsistency between the two models.
|
| {
|
| - sync_api::WriteTransaction trans(service_->backend_->GetUserShareHandle());
|
| + sync_api::WriteTransaction trans(service_->GetUserShare());
|
| sync_api::WriteNode sync_node(&trans);
|
| EXPECT_TRUE(associator()->InitSyncNodeFromChromeId(node->id(),
|
| &sync_node));
|
| @@ -1323,7 +1388,8 @@ TEST_F(ProfileSyncServiceTestWithData, RecoverAfterDeletingSyncDataDirectory) {
|
| WriteTestDataToBookmarkModel();
|
|
|
| // While the service is running.
|
| - FilePath sync_data_directory = backend()->sync_data_folder_path();
|
| + FilePath sync_data_directory =
|
| + service_->GetBackendForTest()->sync_data_folder_path();
|
|
|
| // Simulate a normal shutdown for the sync service (don't disable it for
|
| // the user, which would reset the preferences and delete the sync data
|
| @@ -1388,7 +1454,6 @@ TEST_F(ProfileSyncServiceTestWithData, TestStartupWithOldSyncData) {
|
| // hasn't been completed.
|
| }
|
|
|
| - ASSERT_FALSE(service_->backend());
|
| ASSERT_FALSE(service_->HasSyncSetupCompleted());
|
|
|
| // Create some tokens in the token service; the service will startup when
|
|
|