| // Copyright (c) 2012 The Chromium Authors. All rights reserved. | |
| // Use of this source code is governed by a BSD-style license that can be | |
| // found in the LICENSE file. | |
| #include "base/files/file_path.h" | |
| #include "base/files/file_util.h" | |
| #include "base/memory/ptr_util.h" | |
| #include "components/sync/base/cancelation_signal.h" | |
| #include "components/sync/engine_impl/loopback_server/loopback_connection_manager.h" | |
| #include "components/sync/engine_impl/syncer_proto_util.h" | |
| #include "components/sync/protocol/sync.pb.h" | |
| #include "components/sync/protocol/sync_enums.pb.h" | |
| #include "components/sync/test/engine/test_directory_setter_upper.h" | |
| #include "testing/gtest/include/gtest/gtest.h" | |
| using sync_pb::ClientToServerMessage; | |
| namespace syncer { | |
| class LoopbackServerTest : public testing::Test { | |
| public: | |
| void SetUp() override { | |
| base::CreateTemporaryFile(&persistent_file_); | |
| lcm_ = | |
| base::MakeUnique<LoopbackConnectionManager>(&signal_, persistent_file_); | |
| } | |
| static bool CallPostAndProcessHeaders( | |
| ServerConnectionManager* scm, | |
| SyncCycle* cycle, | |
| const sync_pb::ClientToServerMessage& msg, | |
| sync_pb::ClientToServerResponse* response) { | |
| return SyncerProtoUtil::PostAndProcessHeaders(scm, cycle, msg, response); | |
| } | |
| protected: | |
| ClientToServerMessage CreateCommitMessage() { | |
| ClientToServerMessage msg; | |
| SyncerProtoUtil::SetProtocolVersion(&msg); | |
| msg.set_share("required"); | |
| msg.set_message_contents(ClientToServerMessage::COMMIT); | |
| msg.set_invalidator_client_id("client_id"); | |
| auto* commit = msg.mutable_commit(); | |
| commit->set_cache_guid("cache_guid"); | |
| auto* entry = commit->add_entries(); | |
| // Not quite well formed but enough to fool the server. | |
| entry->set_parent_id_string("bookmark_bar"); | |
| entry->set_id_string("id_string"); | |
| entry->set_version(0); | |
| entry->set_name("google"); | |
| entry->mutable_specifics()->mutable_bookmark()->set_url("http://google.de"); | |
| return msg; | |
| } | |
| CancelationSignal signal_; | |
| base::FilePath persistent_file_; | |
| std::unique_ptr<LoopbackConnectionManager> lcm_; | |
| }; | |
| TEST_F(LoopbackServerTest, WrongBirthday) { | |
| ClientToServerMessage msg; | |
| SyncerProtoUtil::SetProtocolVersion(&msg); | |
| msg.set_share("required"); | |
| msg.set_store_birthday("not_your_birthday"); | |
| msg.set_message_contents(ClientToServerMessage::GET_UPDATES); | |
| msg.mutable_get_updates()->add_from_progress_marker()->set_data_type_id( | |
| sync_pb::EntitySpecifics::kBookmarkFieldNumber); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE(CallPostAndProcessHeaders(lcm_.get(), NULL, msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::NOT_MY_BIRTHDAY, response.error_code()); | |
| } | |
| TEST_F(LoopbackServerTest, GetUpdateCommand) { | |
| ClientToServerMessage msg; | |
| SyncerProtoUtil::SetProtocolVersion(&msg); | |
| msg.set_share("required"); | |
| msg.set_message_contents(ClientToServerMessage::GET_UPDATES); | |
| msg.mutable_get_updates()->add_from_progress_marker()->set_data_type_id( | |
| sync_pb::EntitySpecifics::kBookmarkFieldNumber); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE(CallPostAndProcessHeaders(lcm_.get(), NULL, msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| ASSERT_TRUE(response.has_get_updates()); | |
| // Expect to see the three top-level folders in this update already. | |
| EXPECT_EQ(3, response.get_updates().entries_size()); | |
| } | |
| TEST_F(LoopbackServerTest, ClearServerDataCommand) { | |
| ClientToServerMessage msg; | |
| SyncerProtoUtil::SetProtocolVersion(&msg); | |
| msg.set_share("required"); | |
| msg.set_message_contents(ClientToServerMessage::CLEAR_SERVER_DATA); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE(CallPostAndProcessHeaders(lcm_.get(), NULL, msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| EXPECT_TRUE(response.has_clear_server_data()); | |
| } | |
| TEST_F(LoopbackServerTest, CommitCommand) { | |
| ClientToServerMessage msg = CreateCommitMessage(); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE(CallPostAndProcessHeaders(lcm_.get(), NULL, msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| EXPECT_TRUE(response.has_commit()); | |
| } | |
| TEST_F(LoopbackServerTest, LoadSavedState) { | |
| ClientToServerMessage commit_msg = CreateCommitMessage(); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE( | |
| CallPostAndProcessHeaders(lcm_.get(), NULL, commit_msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| EXPECT_TRUE(response.has_commit()); | |
| CancelationSignal signal; | |
| LoopbackConnectionManager second_user(&signal, persistent_file_); | |
| ClientToServerMessage get_updates_msg; | |
| SyncerProtoUtil::SetProtocolVersion(&get_updates_msg); | |
| get_updates_msg.set_share("required"); | |
| get_updates_msg.set_message_contents(ClientToServerMessage::GET_UPDATES); | |
| get_updates_msg.mutable_get_updates() | |
| ->add_from_progress_marker() | |
| ->set_data_type_id(sync_pb::EntitySpecifics::kBookmarkFieldNumber); | |
| EXPECT_TRUE(CallPostAndProcessHeaders(&second_user, NULL, get_updates_msg, | |
| &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| ASSERT_TRUE(response.has_get_updates()); | |
| // Expect to see the three top-level folders and the newly added bookmark! | |
| EXPECT_EQ(4, response.get_updates().entries_size()); | |
| } | |
| TEST_F(LoopbackServerTest, CommitCommandUpdate) { | |
| ClientToServerMessage commit_msg_1 = CreateCommitMessage(); | |
| sync_pb::ClientToServerResponse response; | |
| EXPECT_TRUE( | |
| CallPostAndProcessHeaders(lcm_.get(), NULL, commit_msg_1, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| EXPECT_TRUE(response.has_commit()); | |
| const std::string server_id = response.commit().entryresponse(0).id_string(); | |
| ClientToServerMessage get_updates_msg; | |
| SyncerProtoUtil::SetProtocolVersion(&get_updates_msg); | |
| get_updates_msg.set_share("required"); | |
| get_updates_msg.set_message_contents(ClientToServerMessage::GET_UPDATES); | |
| get_updates_msg.mutable_get_updates() | |
| ->add_from_progress_marker() | |
| ->set_data_type_id(sync_pb::EntitySpecifics::kBookmarkFieldNumber); | |
| EXPECT_TRUE( | |
| CallPostAndProcessHeaders(lcm_.get(), NULL, get_updates_msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| ASSERT_TRUE(response.has_get_updates()); | |
| // Expect to see the three top-level folders and the newly added bookmark! | |
| EXPECT_EQ(4, response.get_updates().entries_size()); | |
| ClientToServerMessage commit_msg_2 = CreateCommitMessage(); | |
| auto* entry = commit_msg_2.mutable_commit()->mutable_entries()->Mutable(0); | |
| entry->set_id_string(server_id); | |
| entry->set_version(1); | |
| entry->set_parent_id_string("other_bookmarks"); | |
| entry->mutable_specifics()->mutable_bookmark()->set_url("http://google.bg"); | |
| EXPECT_TRUE( | |
| CallPostAndProcessHeaders(lcm_.get(), NULL, commit_msg_2, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| EXPECT_TRUE(response.has_commit()); | |
| EXPECT_TRUE( | |
| CallPostAndProcessHeaders(lcm_.get(), NULL, get_updates_msg, &response)); | |
| EXPECT_EQ(sync_pb::SyncEnums::SUCCESS, response.error_code()); | |
| ASSERT_TRUE(response.has_get_updates()); | |
| // Expect to see no fifth bookmark! | |
| EXPECT_EQ(4, response.get_updates().entries_size()); | |
| } | |
| } // namespace syncer |