#include "base/message_loop/message_loop.h"
#include "base/stl_util.h"
+#include "sync/engine/get_updates_delegate.h"
#include "sync/engine/sync_directory_update_handler.h"
#include "sync/internal_api/public/base/model_type_test_util.h"
#include "sync/protocol/sync.pb.h"
// A test fixture for tests exercising download updates functions.
class DownloadUpdatesTest : public ::testing::Test {
protected:
- DownloadUpdatesTest() : update_handler_deleter_(&update_handler_map_) {}
+ DownloadUpdatesTest() :
+ kTestStartTime(base::TimeTicks::Now()),
+ update_handler_deleter_(&update_handler_map_) {}
virtual void SetUp() {
dir_maker_.SetUp();
dir_maker_.TearDown();
}
- ModelTypeSet proto_request_types() {
- return proto_request_types_;
+ ModelTypeSet request_types() {
+ return request_types_;
}
syncable::Directory* directory() {
return dir_maker_.directory();
}
- GetUpdatesProcessor* get_updates_processor() {
- return get_updates_processor_.get();
+ scoped_ptr<GetUpdatesProcessor> BuildGetUpdatesProcessor(
+ const GetUpdatesDelegate& delegate) {
+ return scoped_ptr<GetUpdatesProcessor>(
+ new GetUpdatesProcessor(&update_handler_map_, delegate));
}
void InitFakeUpdateResponse(sync_pb::GetUpdatesResponse* response) {
- ModelTypeSet types = proto_request_types();
+ ModelTypeSet types = request_types();
for (ModelTypeSet::Iterator it = types.First(); it.Good(); it.Inc()) {
sync_pb::DataTypeProgressMarker* marker =
response->set_changes_remaining(0);
}
+ const base::TimeTicks kTestStartTime;
+
private:
void AddUpdateHandler(ModelType type, ModelSafeGroup group) {
DCHECK(directory());
- proto_request_types_.Put(type);
+ request_types_.Put(type);
scoped_refptr<ModelSafeWorker> worker = new FakeModelWorker(group);
SyncDirectoryUpdateHandler* handler =
new SyncDirectoryUpdateHandler(directory(), type, worker);
update_handler_map_.insert(std::make_pair(type, handler));
- get_updates_processor_.reset(new GetUpdatesProcessor(&update_handler_map_));
}
base::MessageLoop loop_; // Needed for directory init.
TestDirectorySetterUpper dir_maker_;
- ModelTypeSet proto_request_types_;
+ ModelTypeSet request_types_;
UpdateHandlerMap update_handler_map_;
STLValueDeleter<UpdateHandlerMap> update_handler_deleter_;
scoped_ptr<GetUpdatesProcessor> get_updates_processor_;
sessions::NudgeTracker nudge_tracker;
nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS));
- sync_pb::ClientToServerMessage msg;
- download::BuildNormalDownloadUpdatesImpl(proto_request_types(),
- get_updates_processor(),
- nudge_tracker,
- msg.mutable_get_updates());
+ sync_pb::GetUpdatesMessage gu_msg;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
- const sync_pb::GetUpdatesMessage& gu_msg = msg.get_updates();
EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::LOCAL,
gu_msg.caller_info().source());
EXPECT_EQ(sync_pb::SyncEnums::GU_TRIGGER, gu_msg.get_updates_origin());
notified_types.Put(BOOKMARKS);
notified_types.Put(PREFERENCES);
- sync_pb::ClientToServerMessage msg;
- download::BuildNormalDownloadUpdatesImpl(proto_request_types(),
- get_updates_processor(),
- nudge_tracker,
- msg.mutable_get_updates());
+ sync_pb::GetUpdatesMessage gu_msg;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
- const sync_pb::GetUpdatesMessage& gu_msg = msg.get_updates();
EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::NOTIFICATION,
gu_msg.caller_info().source());
EXPECT_EQ(sync_pb::SyncEnums::GU_TRIGGER, gu_msg.get_updates_origin());
}
TEST_F(DownloadUpdatesTest, ConfigureTest) {
- sync_pb::ClientToServerMessage msg;
- download::BuildDownloadUpdatesForConfigureImpl(
- proto_request_types(),
- get_updates_processor(),
- sync_pb::GetUpdatesCallerInfo::RECONFIGURATION,
- msg.mutable_get_updates());
-
- const sync_pb::GetUpdatesMessage& gu_msg = msg.get_updates();
+ sync_pb::GetUpdatesMessage gu_msg;
+ ConfigureGetUpdatesDelegate configure_delegate(
+ sync_pb::GetUpdatesCallerInfo::RECONFIGURATION);
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(configure_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
EXPECT_EQ(sync_pb::SyncEnums::RECONFIGURATION, gu_msg.get_updates_origin());
EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::RECONFIGURATION,
gu_msg.from_progress_marker(i).data_type_id());
progress_types.Put(type);
}
- EXPECT_TRUE(proto_request_types().Equals(progress_types));
+ EXPECT_TRUE(request_types().Equals(progress_types));
}
TEST_F(DownloadUpdatesTest, PollTest) {
- sync_pb::ClientToServerMessage msg;
- download::BuildDownloadUpdatesForPollImpl(
- proto_request_types(),
- get_updates_processor(),
- msg.mutable_get_updates());
-
- const sync_pb::GetUpdatesMessage& gu_msg = msg.get_updates();
+ sync_pb::GetUpdatesMessage gu_msg;
+ PollGetUpdatesDelegate poll_delegate;
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(poll_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
EXPECT_EQ(sync_pb::SyncEnums::PERIODIC, gu_msg.get_updates_origin());
EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::PERIODIC,
gu_msg.from_progress_marker(i).data_type_id());
progress_types.Put(type);
}
- EXPECT_TRUE(proto_request_types().Equals(progress_types));
+ EXPECT_TRUE(request_types().Equals(progress_types));
}
TEST_F(DownloadUpdatesTest, RetryTest) {
- sync_pb::ClientToServerMessage msg;
- download::BuildDownloadUpdatesForRetryImpl(
- proto_request_types(),
- get_updates_processor(),
- msg.mutable_get_updates());
+ sessions::NudgeTracker nudge_tracker;
+
+ // Schedule a retry.
+ base::TimeTicks t1 = kTestStartTime;
+ nudge_tracker.SetNextRetryTime(t1);
- const sync_pb::GetUpdatesMessage& gu_msg = msg.get_updates();
+ // Get the nudge tracker to think the retry is due.
+ nudge_tracker.SetSyncCycleStartTime(t1 + base::TimeDelta::FromSeconds(1));
+
+ sync_pb::GetUpdatesMessage gu_msg;
+ RetryGetUpdatesDelegate retry_delegate;
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(retry_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
EXPECT_EQ(sync_pb::SyncEnums::RETRY, gu_msg.get_updates_origin());
EXPECT_EQ(sync_pb::GetUpdatesCallerInfo::RETRY,
gu_msg.from_progress_marker(i).data_type_id());
progress_types.Put(type);
}
- EXPECT_TRUE(proto_request_types().Equals(progress_types));
+ EXPECT_TRUE(request_types().Equals(progress_types));
}
TEST_F(DownloadUpdatesTest, NudgeWithRetryTest) {
sessions::NudgeTracker nudge_tracker;
+
+ // Schedule a retry.
+ base::TimeTicks t1 = kTestStartTime;
+ nudge_tracker.SetNextRetryTime(t1);
+
+ // Get the nudge tracker to think the retry is due.
+ nudge_tracker.SetSyncCycleStartTime(t1 + base::TimeDelta::FromSeconds(1));
+
+ // Record a local change, too.
nudge_tracker.RecordLocalChange(ModelTypeSet(BOOKMARKS));
- nudge_tracker.set_next_retry_time(
- base::TimeTicks::Now() - base::TimeDelta::FromSeconds(1));
-
- sync_pb::ClientToServerMessage msg;
- download::BuildNormalDownloadUpdatesImpl(proto_request_types(),
- get_updates_processor(),
- nudge_tracker,
- msg.mutable_get_updates());
- EXPECT_TRUE(msg.get_updates().is_retry());
+
+ sync_pb::GetUpdatesMessage gu_msg;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
+ processor->PrepareGetUpdates(request_types(), &gu_msg);
+
+ EXPECT_NE(sync_pb::SyncEnums::RETRY, gu_msg.get_updates_origin());
+ EXPECT_NE(sync_pb::GetUpdatesCallerInfo::RETRY,
+ gu_msg.caller_info().source());
+
+ EXPECT_TRUE(gu_msg.is_retry());
}
// Verify that a bogus response message is detected.
// then something is very wrong. The client should detect this.
gu_response.clear_changes_remaining();
+ sessions::NudgeTracker nudge_tracker;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
sessions::StatusController status;
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
SyncerError error = download::ProcessResponse(gu_response,
- proto_request_types(),
- get_updates_processor(),
+ request_types(),
+ processor.get(),
&status);
EXPECT_EQ(error, SERVER_RESPONSE_VALIDATION_FAILED);
}
InitFakeUpdateResponse(&gu_response);
gu_response.set_changes_remaining(1);
+ sessions::NudgeTracker nudge_tracker;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
sessions::StatusController status;
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
SyncerError error = download::ProcessResponse(gu_response,
- proto_request_types(),
- get_updates_processor(),
+ request_types(),
+ processor.get(),
&status);
EXPECT_EQ(error, SERVER_MORE_TO_DOWNLOAD);
}
InitFakeUpdateResponse(&gu_response);
gu_response.set_changes_remaining(0);
+ sessions::NudgeTracker nudge_tracker;
+ NormalGetUpdatesDelegate normal_delegate(nudge_tracker);
sessions::StatusController status;
+ scoped_ptr<GetUpdatesProcessor> processor(
+ BuildGetUpdatesProcessor(normal_delegate));
SyncerError error = download::ProcessResponse(gu_response,
- proto_request_types(),
- get_updates_processor(),
+ request_types(),
+ processor.get(),
&status);
EXPECT_EQ(error, SYNCER_OK);
}