summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormaniscalco@chromium.org <maniscalco@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-21 20:55:44 +0000
committermaniscalco@chromium.org <maniscalco@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-11-21 20:55:44 +0000
commit9cb5c9d40dc7cfd0b923809897bc081b04258009 (patch)
treeb1e0f48c695888bf8b86466280c377e2466f2776
parent932aaa47f3eead48ad440dff9d0532c5a8ef4af6 (diff)
downloadchromium_src-9cb5c9d40dc7cfd0b923809897bc081b04258009.zip
chromium_src-9cb5c9d40dc7cfd0b923809897bc081b04258009.tar.gz
chromium_src-9cb5c9d40dc7cfd0b923809897bc081b04258009.tar.bz2
Don't clear debug info until after it has been sent to the server.
Replaced DebugInfoGetter::GetAndClearDebugInfo with GetDebugInfo and ClearDebugInfo so we can clear the debug info only after we have successfully sent it to the server. Moved MockDebugInfoGetter into its own file so it can be used by other tests. BUG=319937 Review URL: https://codereview.chromium.org/61213009 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@236591 0039d316-1c4b-4281-b951-d872f2087c98
-rw-r--r--sync/engine/download.cc31
-rw-r--r--sync/engine/download.h7
-rw-r--r--sync/engine/download_unittest.cc52
-rw-r--r--sync/engine/syncer_unittest.cc58
-rw-r--r--sync/internal_api/debug_info_event_listener.cc22
-rw-r--r--sync/internal_api/debug_info_event_listener.h14
-rw-r--r--sync/internal_api/debug_info_event_listener_unittest.cc18
-rw-r--r--sync/internal_api/public/sessions/model_neutral_state.cc1
-rw-r--r--sync/internal_api/public/sessions/model_neutral_state.h3
-rw-r--r--sync/sessions/debug_info_getter.h11
-rw-r--r--sync/sessions/status_controller.cc8
-rw-r--r--sync/sessions/status_controller.h4
-rw-r--r--sync/sync_tests.gypi2
-rw-r--r--sync/test/engine/mock_connection_manager.cc14
-rw-r--r--sync/test/engine/mock_connection_manager.h9
-rw-r--r--sync/test/sessions/mock_debug_info_getter.cc29
-rw-r--r--sync/test/sessions/mock_debug_info_getter.h39
17 files changed, 219 insertions, 103 deletions
diff --git a/sync/engine/download.cc b/sync/engine/download.cc
index 53d36f5..7d00beb 100644
--- a/sync/engine/download.cc
+++ b/sync/engine/download.cc
@@ -94,11 +94,6 @@ void InitDownloadUpdatesContext(
// (e.g. Bookmark URLs but not their containing folders).
get_updates->set_fetch_folders(true);
- sync_pb::DebugInfo* debug_info = message->mutable_debug_info();
- AppendClientDebugInfoIfNeeded(session->context()->debug_info_getter(),
- session->mutable_status_controller(),
- debug_info);
-
get_updates->set_create_mobile_bookmarks_folder(
create_mobile_bookmarks_folder);
bool need_encryption_key = ShouldRequestEncryptionKey(session->context());
@@ -344,6 +339,11 @@ SyncerError ExecuteDownloadUpdates(
StatusController* status = session->mutable_status_controller();
bool need_encryption_key = ShouldRequestEncryptionKey(session->context());
+ if (session->context()->debug_info_getter()) {
+ sync_pb::DebugInfo* debug_info = msg->mutable_debug_info();
+ CopyClientDebugInfo(session->context()->debug_info_getter(), debug_info);
+ }
+
SyncerError result = SyncerProtoUtil::PostClientToServerMessage(
msg,
&update_response,
@@ -366,6 +366,12 @@ SyncerError ExecuteDownloadUpdates(
<< update_response.get_updates().changes_remaining()
<< " updates left on server.";
+ if (session->context()->debug_info_getter()) {
+ // Clear debug info now that we have successfully sent it to the server.
+ DVLOG(1) << "Clearing client debug info.";
+ session->context()->debug_info_getter()->ClearDebugInfo();
+ }
+
if (need_encryption_key ||
update_response.get_updates().encryption_keys_size() > 0) {
syncable::Directory* dir = session->context()->directory();
@@ -392,20 +398,11 @@ SyncerError ExecuteDownloadUpdates(
}
}
-void AppendClientDebugInfoIfNeeded(
+void CopyClientDebugInfo(
sessions::DebugInfoGetter* debug_info_getter,
- StatusController* status,
sync_pb::DebugInfo* debug_info) {
- // We want to send the debug info only once per sync cycle. Check if it has
- // already been sent.
- if (!status->debug_info_sent()) {
- DVLOG(1) << "Sending client debug info ...";
- // Could be null in some unit tests.
- if (debug_info_getter) {
- debug_info_getter->GetAndClearDebugInfo(debug_info);
- }
- status->set_debug_info_sent();
- }
+ DVLOG(1) << "Copying client debug info to send.";
+ debug_info_getter->GetDebugInfo(debug_info);
}
} // namespace download
diff --git a/sync/engine/download.h b/sync/engine/download.h
index ec085c9..952823f 100644
--- a/sync/engine/download.h
+++ b/sync/engine/download.h
@@ -82,11 +82,10 @@ SYNC_EXPORT_PRIVATE SyncerError
sessions::SyncSession* session,
sync_pb::ClientToServerMessage* msg);
-// Helper function to append client debug info to the message, but only do so
-// once per sync cycle. Defined here for testing.
-void SYNC_EXPORT_PRIVATE AppendClientDebugInfoIfNeeded(
+// Helper function to copy client debug info from debug_info_getter to
+// debug_info. Defined here for testing.
+void SYNC_EXPORT_PRIVATE CopyClientDebugInfo(
sessions::DebugInfoGetter* debug_info_getter,
- sessions::StatusController* status,
sync_pb::DebugInfo* debug_info);
} // namespace download
diff --git a/sync/engine/download_unittest.cc b/sync/engine/download_unittest.cc
index f38ab2b..9336893 100644
--- a/sync/engine/download_unittest.cc
+++ b/sync/engine/download_unittest.cc
@@ -14,10 +14,13 @@
#include "sync/sessions/status_controller.h"
#include "sync/syncable/directory.h"
#include "sync/test/engine/test_directory_setter_upper.h"
+#include "sync/test/sessions/mock_debug_info_getter.h"
#include "testing/gtest/include/gtest/gtest.h"
namespace syncer {
+using sessions::MockDebugInfoGetter;
+
// A test fixture for tests exercising download updates functions.
class DownloadUpdatesTest : public ::testing::Test {
protected:
@@ -201,24 +204,6 @@ TEST_F(DownloadUpdatesTest, PollTest) {
EXPECT_TRUE(proto_request_types().Equals(progress_types));
}
-class MockDebugInfoGetter : public sessions::DebugInfoGetter {
- public:
- MockDebugInfoGetter() {}
- virtual ~MockDebugInfoGetter() {}
-
- virtual void GetAndClearDebugInfo(sync_pb::DebugInfo* debug_info) OVERRIDE {
- debug_info->CopyFrom(debug_info_);
- debug_info_.Clear();
- }
-
- void AddDebugEvent() {
- debug_info_.add_events();
- }
-
- private:
- sync_pb::DebugInfo debug_info_;
-};
-
class DownloadUpdatesDebugInfoTest : public ::testing::Test {
public:
DownloadUpdatesDebugInfoTest() {}
@@ -242,33 +227,20 @@ class DownloadUpdatesDebugInfoTest : public ::testing::Test {
};
-// Verify AppendDebugInfo when there are no events to upload.
-TEST_F(DownloadUpdatesDebugInfoTest, VerifyAppendDebugInfo_Empty) {
+// Verify CopyClientDebugInfo when there are no events to upload.
+TEST_F(DownloadUpdatesDebugInfoTest, VerifyCopyClientDebugInfo_Empty) {
sync_pb::DebugInfo debug_info;
- download::AppendClientDebugInfoIfNeeded(debug_info_getter(),
- status(),
- &debug_info);
+ download::CopyClientDebugInfo(debug_info_getter(), &debug_info);
EXPECT_EQ(0, debug_info.events_size());
}
-// We should upload debug info only once per sync cycle.
-TEST_F(DownloadUpdatesDebugInfoTest, TryDoubleAppend) {
- sync_pb::DebugInfo debug_info1;
-
- AddDebugEvent();
- download::AppendClientDebugInfoIfNeeded(debug_info_getter(),
- status(),
- &debug_info1);
- EXPECT_EQ(1, debug_info1.events_size());
-
-
- // Repeated invocations should not send up more events.
+TEST_F(DownloadUpdatesDebugInfoTest, VerifyCopyOverwrites) {
+ sync_pb::DebugInfo debug_info;
AddDebugEvent();
- sync_pb::DebugInfo debug_info2;
- download::AppendClientDebugInfoIfNeeded(debug_info_getter(),
- status(),
- &debug_info2);
- EXPECT_EQ(0, debug_info2.events_size());
+ download::CopyClientDebugInfo(debug_info_getter(), &debug_info);
+ EXPECT_EQ(1, debug_info.events_size());
+ download::CopyClientDebugInfo(debug_info_getter(), &debug_info);
+ EXPECT_EQ(1, debug_info.events_size());
}
} // namespace syncer
diff --git a/sync/engine/syncer_unittest.cc b/sync/engine/syncer_unittest.cc
index e31a08e..e4755b6 100644
--- a/sync/engine/syncer_unittest.cc
+++ b/sync/engine/syncer_unittest.cc
@@ -50,6 +50,7 @@
#include "sync/test/engine/test_syncable_utils.h"
#include "sync/test/fake_encryptor.h"
#include "sync/test/fake_sync_encryption_handler.h"
+#include "sync/test/sessions/mock_debug_info_getter.h"
#include "sync/util/cryptographer.h"
#include "sync/util/extensions_activity.h"
#include "sync/util/time.h"
@@ -104,6 +105,7 @@ using syncable::SPECIFICS;
using syncable::SYNCING;
using syncable::UNITTEST;
+using sessions::MockDebugInfoGetter;
using sessions::StatusController;
using sessions::SyncSessionContext;
using sessions::SyncSession;
@@ -204,6 +206,7 @@ class SyncerTest : public testing::Test,
dir_maker_.SetUp();
mock_server_.reset(new MockConnectionManager(directory(),
&cancelation_signal_));
+ debug_info_getter_.reset(new MockDebugInfoGetter);
EnableDatatype(BOOKMARKS);
EnableDatatype(NIGORI);
EnableDatatype(PREFERENCES);
@@ -222,7 +225,7 @@ class SyncerTest : public testing::Test,
new SyncSessionContext(
mock_server_.get(), directory(), workers,
extensions_activity_,
- listeners, NULL, &traffic_recorder_,
+ listeners, debug_info_getter_.get(), &traffic_recorder_,
true, // enable keystore encryption
false, // force enable pre-commit GU avoidance experiment
"fake_invalidator_client_id"));
@@ -490,6 +493,7 @@ class SyncerTest : public testing::Test,
ModelTypeSet enabled_datatypes_;
TrafficRecorder traffic_recorder_;
sessions::NudgeTracker nudge_tracker_;
+ scoped_ptr<MockDebugInfoGetter> debug_info_getter_;
DISALLOW_COPY_AND_ASSIGN(SyncerTest);
};
@@ -2515,6 +2519,58 @@ TEST_F(SyncerTest, CommitManyItemsInOneGo_CommitConflict) {
directory()->unsynced_entity_count());
}
+// Tests that sending debug info events works.
+TEST_F(SyncerTest, SendDebugInfoEvents_HappyCase) {
+ debug_info_getter_->AddDebugEvent();
+ debug_info_getter_->AddDebugEvent();
+
+ SyncShareNudge();
+
+ // Verify we received one request with two debug info events.
+ EXPECT_EQ(1U, mock_server_->requests().size());
+ EXPECT_EQ(2, mock_server_->requests().back().debug_info().events_size());
+
+ SyncShareNudge();
+
+ // See that we received another request, but that it contains no debug info
+ // events.
+ EXPECT_EQ(2U, mock_server_->requests().size());
+ EXPECT_EQ(0, mock_server_->requests().back().debug_info().events_size());
+
+ debug_info_getter_->AddDebugEvent();
+
+ SyncShareNudge();
+
+ // See that we received another request and it contains one debug info event.
+ EXPECT_EQ(3U, mock_server_->requests().size());
+ EXPECT_EQ(1, mock_server_->requests().back().debug_info().events_size());
+}
+
+// Tests that debug info events are dropped on server error.
+TEST_F(SyncerTest, SendDebugInfoEvents_PostFailsDontDrop) {
+ debug_info_getter_->AddDebugEvent();
+ debug_info_getter_->AddDebugEvent();
+
+ mock_server_->FailNextPostBufferToPathCall();
+ SyncShareNudge();
+
+ // Verify we attempted to send one request with two debug info events.
+ EXPECT_EQ(1U, mock_server_->requests().size());
+ EXPECT_EQ(2, mock_server_->requests().back().debug_info().events_size());
+
+ SyncShareNudge();
+
+ // See that the client resent the two debug info events.
+ EXPECT_EQ(2U, mock_server_->requests().size());
+ EXPECT_EQ(2, mock_server_->requests().back().debug_info().events_size());
+
+ // The previous send was successful so this next one shouldn't generate any
+ // debug info events.
+ SyncShareNudge();
+ EXPECT_EQ(3U, mock_server_->requests().size());
+ EXPECT_EQ(0, mock_server_->requests().back().debug_info().events_size());
+}
+
TEST_F(SyncerTest, HugeConflict) {
int item_count = 300; // We should be able to do 300 or 3000 w/o issue.
diff --git a/sync/internal_api/debug_info_event_listener.cc b/sync/internal_api/debug_info_event_listener.cc
index 7875ed9..f46c4ee 100644
--- a/sync/internal_api/debug_info_event_listener.cc
+++ b/sync/internal_api/debug_info_event_listener.cc
@@ -144,22 +144,28 @@ void DebugInfoEventListener::OnIncomingNotification(
AddEventToQueue(event_info);
}
-void DebugInfoEventListener::GetAndClearDebugInfo(
- sync_pb::DebugInfo* debug_info) {
+void DebugInfoEventListener::GetDebugInfo(sync_pb::DebugInfo* debug_info) {
DCHECK(thread_checker_.CalledOnValidThread());
DCHECK_LE(events_.size(), kMaxEntries);
- while (!events_.empty()) {
+
+ for (DebugEventInfoQueue::const_iterator iter = events_.begin();
+ iter != events_.end();
+ ++iter) {
sync_pb::DebugEventInfo* event_info = debug_info->add_events();
- const sync_pb::DebugEventInfo& debug_event_info = events_.front();
- event_info->CopyFrom(debug_event_info);
- events_.pop();
+ event_info->CopyFrom(*iter);
}
debug_info->set_events_dropped(events_dropped_);
debug_info->set_cryptographer_ready(cryptographer_ready_);
debug_info->set_cryptographer_has_pending_keys(
cryptographer_has_pending_keys_);
+}
+
+void DebugInfoEventListener::ClearDebugInfo() {
+ DCHECK(thread_checker_.CalledOnValidThread());
+ DCHECK_LE(events_.size(), kMaxEntries);
+ events_.clear();
events_dropped_ = false;
}
@@ -255,10 +261,10 @@ void DebugInfoEventListener::AddEventToQueue(
DVLOG(1) << "DebugInfoEventListener::AddEventToQueue Dropping an old event "
<< "because of full queue";
- events_.pop();
+ events_.pop_front();
events_dropped_ = true;
}
- events_.push(event_info);
+ events_.push_back(event_info);
}
} // namespace syncer
diff --git a/sync/internal_api/debug_info_event_listener.h b/sync/internal_api/debug_info_event_listener.h
index ee12c54..15cc0a6 100644
--- a/sync/internal_api/debug_info_event_listener.h
+++ b/sync/internal_api/debug_info_event_listener.h
@@ -5,7 +5,7 @@
#ifndef SYNC_INTERNAL_API_DEBUG_INFO_EVENT_LISTENER_H_
#define SYNC_INTERNAL_API_DEBUG_INFO_EVENT_LISTENER_H_
-#include <queue>
+#include <deque>
#include <string>
#include "base/compiler_specific.h"
@@ -75,7 +75,10 @@ class SYNC_EXPORT_PRIVATE DebugInfoEventListener
void OnIncomingNotification(const ObjectIdInvalidationMap& invalidations);
// DebugInfoGetter implementation.
- virtual void GetAndClearDebugInfo(sync_pb::DebugInfo* debug_info) OVERRIDE;
+ virtual void GetDebugInfo(sync_pb::DebugInfo* debug_info) OVERRIDE;
+
+ // DebugInfoGetter implementation.
+ virtual void ClearDebugInfo() OVERRIDE;
// DataTypeDebugInfoListener implementation.
virtual void OnDataTypeConfigureComplete(
@@ -88,11 +91,14 @@ class SYNC_EXPORT_PRIVATE DebugInfoEventListener
private:
FRIEND_TEST_ALL_PREFIXES(DebugInfoEventListenerTest, VerifyEventsAdded);
FRIEND_TEST_ALL_PREFIXES(DebugInfoEventListenerTest, VerifyQueueSize);
- FRIEND_TEST_ALL_PREFIXES(DebugInfoEventListenerTest, VerifyGetAndClearEvents);
+ FRIEND_TEST_ALL_PREFIXES(DebugInfoEventListenerTest, VerifyGetEvents);
+ FRIEND_TEST_ALL_PREFIXES(DebugInfoEventListenerTest, VerifyClearEvents);
void AddEventToQueue(const sync_pb::DebugEventInfo& event_info);
void CreateAndAddEvent(sync_pb::DebugEventInfo::SingletonEventType type);
- std::queue<sync_pb::DebugEventInfo> events_;
+
+ typedef std::deque<sync_pb::DebugEventInfo> DebugEventInfoQueue;
+ DebugEventInfoQueue events_;
// True indicates we had to drop one or more events to keep our limit of
// |kMaxEntries|.
diff --git a/sync/internal_api/debug_info_event_listener_unittest.cc b/sync/internal_api/debug_info_event_listener_unittest.cc
index 131728b..31f16f8 100644
--- a/sync/internal_api/debug_info_event_listener_unittest.cc
+++ b/sync/internal_api/debug_info_event_listener_unittest.cc
@@ -29,23 +29,33 @@ TEST_F(DebugInfoEventListenerTest, VerifyQueueSize) {
sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
}
sync_pb::DebugInfo debug_info;
- debug_info_event_listener.GetAndClearDebugInfo(&debug_info);
+ debug_info_event_listener.GetDebugInfo(&debug_info);
+ debug_info_event_listener.ClearDebugInfo();
ASSERT_TRUE(debug_info.events_dropped());
ASSERT_EQ(static_cast<int>(kMaxEntries), debug_info.events_size());
}
-TEST_F(DebugInfoEventListenerTest, VerifyGetAndClearEvents) {
+TEST_F(DebugInfoEventListenerTest, VerifyGetEvents) {
DebugInfoEventListener debug_info_event_listener;
debug_info_event_listener.CreateAndAddEvent(
sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
ASSERT_EQ(debug_info_event_listener.events_.size(), 1U);
sync_pb::DebugInfo debug_info;
- debug_info_event_listener.GetAndClearDebugInfo(&debug_info);
- ASSERT_EQ(debug_info_event_listener.events_.size(), 0U);
+ debug_info_event_listener.GetDebugInfo(&debug_info);
+ ASSERT_EQ(debug_info_event_listener.events_.size(), 1U);
ASSERT_EQ(debug_info.events_size(), 1);
ASSERT_TRUE(debug_info.events(0).has_singleton_event());
ASSERT_EQ(debug_info.events(0).singleton_event(),
sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
}
+TEST_F(DebugInfoEventListenerTest, VerifyClearEvents) {
+ DebugInfoEventListener debug_info_event_listener;
+ debug_info_event_listener.CreateAndAddEvent(
+ sync_pb::DebugEventInfo::ENCRYPTION_COMPLETE);
+ ASSERT_EQ(debug_info_event_listener.events_.size(), 1U);
+ debug_info_event_listener.ClearDebugInfo();
+ ASSERT_EQ(debug_info_event_listener.events_.size(), 0U);
+}
+
} // namespace syncer
diff --git a/sync/internal_api/public/sessions/model_neutral_state.cc b/sync/internal_api/public/sessions/model_neutral_state.cc
index b1a1706..fa2b019 100644
--- a/sync/internal_api/public/sessions/model_neutral_state.cc
+++ b/sync/internal_api/public/sessions/model_neutral_state.cc
@@ -23,7 +23,6 @@ ModelNeutralState::ModelNeutralState()
last_download_updates_result(UNSET),
commit_result(UNSET),
items_committed(false),
- debug_info_sent(false),
num_server_changes_remaining(0) {
}
diff --git a/sync/internal_api/public/sessions/model_neutral_state.h b/sync/internal_api/public/sessions/model_neutral_state.h
index 3a9d744..ee9c974 100644
--- a/sync/internal_api/public/sessions/model_neutral_state.h
+++ b/sync/internal_api/public/sessions/model_neutral_state.h
@@ -63,9 +63,6 @@ struct SYNC_EXPORT ModelNeutralState {
// Set to true by PostCommitMessageCommand if any commits were successful.
bool items_committed;
- // True indicates debug info has been sent once this session.
- bool debug_info_sent;
-
// Number of changes remaining, according to the server.
// Take it as an estimate unless it's value is zero, in which case there
// really is nothing more to download.
diff --git a/sync/sessions/debug_info_getter.h b/sync/sessions/debug_info_getter.h
index c1536ba..7efe0cb 100644
--- a/sync/sessions/debug_info_getter.h
+++ b/sync/sessions/debug_info_getter.h
@@ -15,9 +15,13 @@ namespace sessions {
// to communicate the debug info data to the syncer.
class SYNC_EXPORT_PRIVATE DebugInfoGetter {
public:
- // Gets the client debug info and clears the state so the same data is not
- // sent again.
- virtual void GetAndClearDebugInfo(sync_pb::DebugInfo* debug_info) = 0;
+ // Gets the client debug info. Be sure to clear the info to ensure the data
+ // isn't sent multiple times.
+ virtual void GetDebugInfo(sync_pb::DebugInfo* debug_info) = 0;
+
+ // Clears the debug info.
+ virtual void ClearDebugInfo() = 0;
+
virtual ~DebugInfoGetter() {}
};
@@ -25,4 +29,3 @@ class SYNC_EXPORT_PRIVATE DebugInfoGetter {
} // namespace syncer
#endif // SYNC_SESSIONS_DEBUG_INFO_GETTER_H_
-
diff --git a/sync/sessions/status_controller.cc b/sync/sessions/status_controller.cc
index abd6f1e..f6fbdb5 100644
--- a/sync/sessions/status_controller.cc
+++ b/sync/sessions/status_controller.cc
@@ -163,13 +163,5 @@ bool StatusController::ServerSaysNothingMoreToDownload() const {
return updates_response().get_updates().changes_remaining() == 0;
}
-void StatusController::set_debug_info_sent() {
- model_neutral_.debug_info_sent = true;
-}
-
-bool StatusController::debug_info_sent() const {
- return model_neutral_.debug_info_sent;
-}
-
} // namespace sessions
} // namespace syncer
diff --git a/sync/sessions/status_controller.h b/sync/sessions/status_controller.h
index 101e583..75b8b82 100644
--- a/sync/sessions/status_controller.h
+++ b/sync/sessions/status_controller.h
@@ -141,10 +141,6 @@ class SYNC_EXPORT_PRIVATE StatusController {
void UpdateStartTime();
- void set_debug_info_sent();
-
- bool debug_info_sent() const;
-
private:
friend class ScopedModelSafeGroupRestriction;
diff --git a/sync/sync_tests.gypi b/sync/sync_tests.gypi
index f3acf45..1b5871a85 100644
--- a/sync/sync_tests.gypi
+++ b/sync/sync_tests.gypi
@@ -56,6 +56,8 @@
'test/null_transaction_observer.cc',
'test/null_transaction_observer.h',
'test/sessions/test_scoped_session_event_listener.h',
+ 'test/sessions/mock_debug_info_getter.h',
+ 'test/sessions/mock_debug_info_getter.cc',
'test/test_directory_backing_store.cc',
'test/test_directory_backing_store.h',
'test/test_transaction_observer.cc',
diff --git a/sync/test/engine/mock_connection_manager.cc b/sync/test/engine/mock_connection_manager.cc
index 624e022..434f6c3 100644
--- a/sync/test/engine/mock_connection_manager.cc
+++ b/sync/test/engine/mock_connection_manager.cc
@@ -83,7 +83,8 @@ bool MockConnectionManager::PostBufferToPath(PostBufferParams* params,
CHECK(post.has_protocol_version());
CHECK(post.has_api_key());
CHECK(post.has_bag_of_chips());
- last_request_.CopyFrom(post);
+
+ requests_.push_back(post);
client_stuck_ = post.sync_problem_detected();
sync_pb::ClientToServerResponse response;
response.Clear();
@@ -686,6 +687,17 @@ const CommitResponse& MockConnectionManager::last_commit_response() const {
return *commit_responses_.back();
}
+const sync_pb::ClientToServerMessage&
+ MockConnectionManager::last_request() const {
+ EXPECT_TRUE(!requests_.empty());
+ return requests_.back();
+}
+
+const std::vector<sync_pb::ClientToServerMessage>&
+ MockConnectionManager::requests() const {
+ return requests_;
+}
+
bool MockConnectionManager::IsModelTypePresentInSpecifics(
const google::protobuf::RepeatedPtrField<
sync_pb::DataTypeProgressMarker>& filter,
diff --git a/sync/test/engine/mock_connection_manager.h b/sync/test/engine/mock_connection_manager.h
index afeaac8..6b95eab 100644
--- a/sync/test/engine/mock_connection_manager.h
+++ b/sync/test/engine/mock_connection_manager.h
@@ -194,9 +194,10 @@ class MockConnectionManager : public ServerConnectionManager {
const sync_pb::CommitResponse& last_commit_response() const;
// Retrieve the last request submitted to the server (regardless of type).
- const sync_pb::ClientToServerMessage& last_request() const {
- return last_request_;
- }
+ const sync_pb::ClientToServerMessage& last_request() const;
+
+ // Retrieve the cumulative collection of all requests sent by clients.
+ const std::vector<sync_pb::ClientToServerMessage>& requests() const;
void set_conflict_all_commits(bool value) {
conflict_all_commits_ = value;
@@ -395,7 +396,7 @@ class MockConnectionManager : public ServerConnectionManager {
std::string next_token_;
- sync_pb::ClientToServerMessage last_request_;
+ std::vector<sync_pb::ClientToServerMessage> requests_;
DISALLOW_COPY_AND_ASSIGN(MockConnectionManager);
};
diff --git a/sync/test/sessions/mock_debug_info_getter.cc b/sync/test/sessions/mock_debug_info_getter.cc
new file mode 100644
index 0000000..524c5cf
--- /dev/null
+++ b/sync/test/sessions/mock_debug_info_getter.cc
@@ -0,0 +1,29 @@
+// Copyright 2013 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 "sync/test/sessions/mock_debug_info_getter.h"
+
+namespace syncer {
+namespace sessions {
+
+MockDebugInfoGetter::MockDebugInfoGetter() {
+}
+
+MockDebugInfoGetter::~MockDebugInfoGetter() {
+}
+
+void MockDebugInfoGetter::GetDebugInfo(sync_pb::DebugInfo* debug_info) {
+ debug_info->CopyFrom(debug_info_);
+}
+
+void MockDebugInfoGetter::ClearDebugInfo() {
+ debug_info_.Clear();
+}
+
+void MockDebugInfoGetter::AddDebugEvent() {
+ debug_info_.add_events();
+}
+
+} // namespace sessions
+} // namespace syncer
diff --git a/sync/test/sessions/mock_debug_info_getter.h b/sync/test/sessions/mock_debug_info_getter.h
new file mode 100644
index 0000000..e66a962
--- /dev/null
+++ b/sync/test/sessions/mock_debug_info_getter.h
@@ -0,0 +1,39 @@
+// Copyright 2013 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.
+
+#ifndef SYNC_SESSIONS_MOCK_DEBUG_INFO_GETTER_H_
+#define SYNC_SESSIONS_MOCK_DEBUG_INFO_GETTER_H_
+
+#include "base/basictypes.h"
+#include "base/compiler_specific.h"
+#include "sync/base/sync_export.h"
+#include "sync/protocol/sync.pb.h"
+#include "sync/sessions/debug_info_getter.h"
+
+namespace syncer {
+namespace sessions {
+
+// A mock implementation of DebugInfoGetter to be used in tests. Events added by
+// AddDebugEvent are accessible via DebugInfoGetter methods.
+class MockDebugInfoGetter : public sessions::DebugInfoGetter {
+ public:
+ MockDebugInfoGetter();
+ virtual ~MockDebugInfoGetter();
+
+ // DebugInfoGetter implementation.
+ virtual void GetDebugInfo(sync_pb::DebugInfo* debug_info) OVERRIDE;
+ virtual void ClearDebugInfo() OVERRIDE;
+
+ void AddDebugEvent();
+
+ private:
+ sync_pb::DebugInfo debug_info_;
+
+ DISALLOW_COPY_AND_ASSIGN(MockDebugInfoGetter);
+};
+
+} // namespace sessions
+} // namespace syncer
+
+#endif // SYNC_SESSIONS_MOCK_DEBUG_INFO_GETTER_H_