| Index: sync/engine/syncer_unittest.cc | 
| diff --git a/sync/engine/syncer_unittest.cc b/sync/engine/syncer_unittest.cc | 
| index 2800f0162ae2398cafcd679c6eea037e2b85b191..adae4f2fd952b5dd769f258e2d935a8dd92f7d11 100644 | 
| --- a/sync/engine/syncer_unittest.cc | 
| +++ b/sync/engine/syncer_unittest.cc | 
| @@ -116,6 +116,7 @@ class SyncerTest : public testing::Test, | 
| SyncerTest() | 
| : syncer_(NULL), | 
| saw_syncer_event_(false), | 
| +        last_client_invalidation_hint_buffer_size_(10), | 
| traffic_recorder_(0, 0) { | 
| } | 
|  | 
| @@ -138,6 +139,10 @@ class SyncerTest : public testing::Test, | 
| const base::TimeDelta& new_delay) OVERRIDE { | 
| last_sessions_commit_delay_seconds_ = new_delay; | 
| } | 
| +  virtual void OnReceivedClientInvalidationHintBufferSize( | 
| +      int size) OVERRIDE { | 
| +    last_client_invalidation_hint_buffer_size_ = size; | 
| +  } | 
| virtual void OnShouldStopSyncingPermanently() OVERRIDE { | 
| } | 
| virtual void OnSyncProtocolError( | 
| @@ -171,23 +176,37 @@ class SyncerTest : public testing::Test, | 
| saw_syncer_event_ = true; | 
| } | 
|  | 
| -  SyncSession* MakeSession() { | 
| +  void SyncShareNudge() { | 
| ModelSafeRoutingInfo info; | 
| GetModelSafeRoutingInfo(&info); | 
| ModelTypeInvalidationMap invalidation_map = | 
| ModelSafeRoutingInfoToInvalidationMap(info, std::string()); | 
| -    sessions::SyncSourceInfo source_info(sync_pb::GetUpdatesCallerInfo::UNKNOWN, | 
| -                                         invalidation_map); | 
| -    return new SyncSession(context_.get(), this, source_info); | 
| -  } | 
| +    sessions::SyncSourceInfo source_info( | 
| +        sync_pb::GetUpdatesCallerInfo::LOCAL, | 
| +        invalidation_map); | 
| +    // Use our dummy nudge tracker.  These tests won't notice that it hasn't | 
| +    // been tracking anything because the server is mocked out and ignores most | 
| +    // of the content of requests sent by the client. | 
| +    session_.reset( | 
| +        SyncSession::BuildForNudge(context_.get(), | 
| +                                   this, | 
| +                                   source_info, | 
| +                                   &nudge_tracker_)); | 
|  | 
| -  void SyncShareNudge() { | 
| -    session_.reset(MakeSession()); | 
| EXPECT_TRUE(syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END)); | 
| } | 
|  | 
| void SyncShareConfigure() { | 
| -    session_.reset(MakeSession()); | 
| +    ModelSafeRoutingInfo info; | 
| +    GetModelSafeRoutingInfo(&info); | 
| +    ModelTypeInvalidationMap invalidation_map = | 
| +        ModelSafeRoutingInfoToInvalidationMap(info, std::string()); | 
| +    sessions::SyncSourceInfo source_info( | 
| +        sync_pb::GetUpdatesCallerInfo::RECONFIGURATION, | 
| +        invalidation_map); | 
| +    session_.reset(SyncSession::Build(context_.get(), | 
| +                                      this, | 
| +                                      source_info)); | 
| EXPECT_TRUE( | 
| syncer_->SyncShare(session_.get(), DOWNLOAD_UPDATES, APPLY_UPDATES)); | 
| } | 
| @@ -220,7 +239,6 @@ class SyncerTest : public testing::Test, | 
| "fake_invalidator_client_id")); | 
| context_->set_routing_info(routing_info); | 
| syncer_ = new Syncer(); | 
| -    session_.reset(MakeSession()); | 
|  | 
| syncable::ReadTransaction trans(FROM_HERE, directory()); | 
| syncable::Directory::ChildHandles children; | 
| @@ -563,10 +581,12 @@ class SyncerTest : public testing::Test, | 
| base::TimeDelta last_short_poll_interval_received_; | 
| base::TimeDelta last_long_poll_interval_received_; | 
| base::TimeDelta last_sessions_commit_delay_seconds_; | 
| +  int last_client_invalidation_hint_buffer_size_; | 
| scoped_refptr<ModelSafeWorker> worker_; | 
|  | 
| ModelTypeSet enabled_datatypes_; | 
| TrafficRecorder traffic_recorder_; | 
| +  sessions::NudgeTracker nudge_tracker_; | 
|  | 
| DISALLOW_COPY_AND_ASSIGN(SyncerTest); | 
| }; | 
| @@ -2242,7 +2262,7 @@ TEST_F(EntryCreatedInNewFolderTest, EntryCreatedInNewFolderMidSync) { | 
| mock_server_->SetMidCommitCallback( | 
| base::Bind(&EntryCreatedInNewFolderTest::CreateFolderInBob, | 
| base::Unretained(this))); | 
| -  syncer_->SyncShare(session_.get(), COMMIT, SYNCER_END); | 
| +  SyncShareNudge(); | 
| // We loop until no unsynced handles remain, so we will commit both ids. | 
| EXPECT_EQ(2u, mock_server_->committed_ids().size()); | 
| { | 
| @@ -2480,8 +2500,7 @@ TEST_F(SyncerTest, UnappliedUpdateDuringCommit) { | 
| entry.Put(SERVER_SPECIFICS, DefaultBookmarkSpecifics()); | 
| entry.Put(IS_DEL, false); | 
| } | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 
| +  SyncShareNudge(); | 
| EXPECT_EQ(1, session_->status_controller().TotalNumConflictingItems()); | 
| saw_syncer_event_ = false; | 
| } | 
| @@ -2508,7 +2527,7 @@ TEST_F(SyncerTest, DeletingEntryInFolder) { | 
| entry.Put(IS_UNSYNCED, true); | 
| existing_metahandle = entry.Get(META_HANDLE); | 
| } | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 
| +  SyncShareNudge(); | 
| { | 
| WriteTransaction trans(FROM_HERE, UNITTEST, directory()); | 
| MutableEntry newfolder(&trans, CREATE, BOOKMARKS, trans.root_id(), "new"); | 
| @@ -2526,7 +2545,7 @@ TEST_F(SyncerTest, DeletingEntryInFolder) { | 
| newfolder.Put(IS_DEL, true); | 
| existing.Put(IS_DEL, true); | 
| } | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 
| +  SyncShareNudge(); | 
| EXPECT_EQ(0, status().num_server_conflicts()); | 
| } | 
|  | 
| @@ -2549,7 +2568,7 @@ TEST_F(SyncerTest, DeletingEntryWithLocalEdits) { | 
| mock_server_->AddUpdateDirectory(1, 0, "bob", 2, 20, | 
| foreign_cache_guid(), "-1"); | 
| mock_server_->SetLastUpdateDeleted(); | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, APPLY_UPDATES); | 
| +  SyncShareConfigure(); | 
| { | 
| syncable::ReadTransaction trans(FROM_HERE, directory()); | 
| Entry entry(&trans, syncable::GET_BY_HANDLE, newfolder_metahandle); | 
| @@ -3204,7 +3223,7 @@ TEST_F(SyncerTest, LongChangelistWithApplicationConflict) { | 
| folder_id, "stuck", 1, 1, | 
| foreign_cache_guid(), "-99999"); | 
| mock_server_->SetChangesRemaining(depth - 1); | 
| -  syncer_->SyncShare(session_.get(), SYNCER_BEGIN, SYNCER_END); | 
| +  SyncShareNudge(); | 
|  | 
| // Buffer up a very long series of downloads. | 
| // We should never be stuck (conflict resolution shouldn't | 
| @@ -3432,6 +3451,7 @@ TEST_F(SyncerTest, TestClientCommandDuringUpdate) { | 
| command->set_set_sync_poll_interval(8); | 
| command->set_set_sync_long_poll_interval(800); | 
| command->set_sessions_commit_delay_seconds(3141); | 
| +  command->set_client_invalidation_hint_buffer_size(11); | 
| mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1, | 
| foreign_cache_guid(), "-1"); | 
| mock_server_->SetGUClientCommand(command); | 
| @@ -3443,11 +3463,13 @@ TEST_F(SyncerTest, TestClientCommandDuringUpdate) { | 
| last_long_poll_interval_received_); | 
| EXPECT_TRUE(TimeDelta::FromSeconds(3141) == | 
| last_sessions_commit_delay_seconds_); | 
| +  EXPECT_EQ(11, last_client_invalidation_hint_buffer_size_); | 
|  | 
| command = new ClientCommand(); | 
| command->set_set_sync_poll_interval(180); | 
| command->set_set_sync_long_poll_interval(190); | 
| command->set_sessions_commit_delay_seconds(2718); | 
| +  command->set_client_invalidation_hint_buffer_size(9); | 
| mock_server_->AddUpdateDirectory(1, 0, "in_root", 1, 1, | 
| foreign_cache_guid(), "-1"); | 
| mock_server_->SetGUClientCommand(command); | 
| @@ -3459,6 +3481,7 @@ TEST_F(SyncerTest, TestClientCommandDuringUpdate) { | 
| last_long_poll_interval_received_); | 
| EXPECT_TRUE(TimeDelta::FromSeconds(2718) == | 
| last_sessions_commit_delay_seconds_); | 
| +  EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_); | 
| } | 
|  | 
| TEST_F(SyncerTest, TestClientCommandDuringCommit) { | 
| @@ -3468,6 +3491,7 @@ TEST_F(SyncerTest, TestClientCommandDuringCommit) { | 
| command->set_set_sync_poll_interval(8); | 
| command->set_set_sync_long_poll_interval(800); | 
| command->set_sessions_commit_delay_seconds(3141); | 
| +  command->set_client_invalidation_hint_buffer_size(11); | 
| CreateUnsyncedDirectory("X", "id_X"); | 
| mock_server_->SetCommitClientCommand(command); | 
| SyncShareNudge(); | 
| @@ -3478,11 +3502,13 @@ TEST_F(SyncerTest, TestClientCommandDuringCommit) { | 
| last_long_poll_interval_received_); | 
| EXPECT_TRUE(TimeDelta::FromSeconds(3141) == | 
| last_sessions_commit_delay_seconds_); | 
| +  EXPECT_EQ(11, last_client_invalidation_hint_buffer_size_); | 
|  | 
| command = new ClientCommand(); | 
| command->set_set_sync_poll_interval(180); | 
| command->set_set_sync_long_poll_interval(190); | 
| command->set_sessions_commit_delay_seconds(2718); | 
| +  command->set_client_invalidation_hint_buffer_size(9); | 
| CreateUnsyncedDirectory("Y", "id_Y"); | 
| mock_server_->SetCommitClientCommand(command); | 
| SyncShareNudge(); | 
| @@ -3493,6 +3519,7 @@ TEST_F(SyncerTest, TestClientCommandDuringCommit) { | 
| last_long_poll_interval_received_); | 
| EXPECT_TRUE(TimeDelta::FromSeconds(2718) == | 
| last_sessions_commit_delay_seconds_); | 
| +  EXPECT_EQ(9, last_client_invalidation_hint_buffer_size_); | 
| } | 
|  | 
| TEST_F(SyncerTest, EnsureWeSendUpOldParent) { | 
|  |