blob: ea1464ea4bf3ad1505466568b11170be58d5212c [file] [log] [blame]
// 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