summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/engine/syncapi_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/engine/syncapi_unittest.cc')
-rw-r--r--chrome/browser/sync/engine/syncapi_unittest.cc309
1 files changed, 145 insertions, 164 deletions
diff --git a/chrome/browser/sync/engine/syncapi_unittest.cc b/chrome/browser/sync/engine/syncapi_unittest.cc
index 4af502e..7be2af3 100644
--- a/chrome/browser/sync/engine/syncapi_unittest.cc
+++ b/chrome/browser/sync/engine/syncapi_unittest.cc
@@ -10,6 +10,7 @@
#include <map>
#include "base/basictypes.h"
+#include "base/compiler_specific.h"
#include "base/format_macros.h"
#include "base/memory/scoped_ptr.h"
#include "base/message_loop.h"
@@ -27,7 +28,7 @@
#include "chrome/browser/sync/js_arg_list.h"
#include "chrome/browser/sync/js_backend.h"
#include "chrome/browser/sync/js_event_handler.h"
-#include "chrome/browser/sync/js_event_router.h"
+#include "chrome/browser/sync/js_reply_handler.h"
#include "chrome/browser/sync/js_test_util.h"
#include "chrome/browser/sync/notifier/sync_notifier.h"
#include "chrome/browser/sync/notifier/sync_notifier_observer.h"
@@ -52,17 +53,22 @@ using browser_sync::HasArgsAsList;
using browser_sync::HasDetailsAsDictionary;
using browser_sync::KeyParams;
using browser_sync::JsArgList;
+using browser_sync::JsBackend;
+using browser_sync::JsEventHandler;
+using browser_sync::JsReplyHandler;
using browser_sync::MockJsEventHandler;
-using browser_sync::MockJsEventRouter;
+using browser_sync::MockJsReplyHandler;
using browser_sync::ModelSafeRoutingInfo;
using browser_sync::ModelSafeWorker;
using browser_sync::ModelSafeWorkerRegistrar;
using browser_sync::sessions::SyncSessionSnapshot;
+using browser_sync::WeakHandle;
using syncable::ModelType;
using syncable::ModelTypeSet;
using test::ExpectDictDictionaryValue;
using test::ExpectDictStringValue;
using testing::_;
+using testing::AnyNumber;
using testing::AtLeast;
using testing::InSequence;
using testing::Invoke;
@@ -638,15 +644,41 @@ TEST_F(SyncApiTest, ChangeRecordToValue) {
namespace {
+class TestHttpPostProviderInterface : public HttpPostProviderInterface {
+ public:
+ virtual ~TestHttpPostProviderInterface() {}
+
+ virtual void SetUserAgent(const char* user_agent) OVERRIDE {}
+ virtual void SetExtraRequestHeaders(const char* headers) OVERRIDE {}
+ virtual void SetURL(const char* url, int port) OVERRIDE {}
+ virtual void SetPostPayload(const char* content_type,
+ int content_length,
+ const char* content) OVERRIDE {}
+ virtual bool MakeSynchronousPost(int* os_error_code, int* response_code)
+ OVERRIDE {
+ return false;
+ }
+ virtual int GetResponseContentLength() const OVERRIDE {
+ return 0;
+ }
+ virtual const char* GetResponseContent() const OVERRIDE {
+ return "";
+ }
+ virtual const std::string GetResponseHeaderValue(
+ const std::string& name) const OVERRIDE {
+ return "";
+ }
+ virtual void Abort() OVERRIDE {}
+};
+
class TestHttpPostProviderFactory : public HttpPostProviderFactory {
public:
virtual ~TestHttpPostProviderFactory() {}
- virtual HttpPostProviderInterface* Create() {
- NOTREACHED();
- return NULL;
+ virtual HttpPostProviderInterface* Create() OVERRIDE {
+ return new TestHttpPostProviderInterface();
}
- virtual void Destroy(HttpPostProviderInterface* http) {
- NOTREACHED();
+ virtual void Destroy(HttpPostProviderInterface* http) OVERRIDE {
+ delete http;
}
};
@@ -660,7 +692,8 @@ class SyncManagerObserverMock : public SyncManager::Observer {
MOCK_METHOD1(OnChangesComplete, void(ModelType)); // NOLINT
MOCK_METHOD1(OnSyncCycleCompleted,
void(const SyncSessionSnapshot*)); // NOLINT
- MOCK_METHOD0(OnInitializationComplete, void()); // NOLINT
+ MOCK_METHOD1(OnInitializationComplete,
+ void(const WeakHandle<JsBackend>&)); // NOLINT
MOCK_METHOD1(OnAuthError, void(const GoogleServiceAuthError&)); // NOLINT
MOCK_METHOD1(OnPassphraseRequired,
void(sync_api::PassphraseRequiredReason)); // NOLINT
@@ -722,16 +755,23 @@ class SyncManagerTest : public testing::Test,
EXPECT_CALL(*sync_notifier_mock_, RemoveObserver(_)).
WillOnce(Invoke(this, &SyncManagerTest::SyncNotifierRemoveObserver));
+ sync_manager_.AddObserver(&observer_);
+ EXPECT_CALL(observer_, OnInitializationComplete(_)).
+ WillOnce(SaveArg<0>(&js_backend_));
+
EXPECT_FALSE(sync_notifier_observer_);
+ EXPECT_FALSE(js_backend_.IsInitialized());
// Takes ownership of |sync_notifier_mock_|.
- sync_manager_.Init(temp_dir_.path(), "bogus", 0, false,
+ sync_manager_.Init(temp_dir_.path(),
+ WeakHandle<JsEventHandler>(),
+ "bogus", 0, false,
new TestHttpPostProviderFactory(), this, "bogus",
credentials, sync_notifier_mock_, "",
true /* setup_for_test_mode */);
EXPECT_TRUE(sync_notifier_observer_);
- sync_manager_.AddObserver(&observer_);
+ EXPECT_TRUE(js_backend_.IsInitialized());
EXPECT_EQ(1, update_enabled_types_call_count_);
@@ -746,6 +786,7 @@ class SyncManagerTest : public testing::Test,
type_roots_[i->first] = MakeServerNodeForType(
sync_manager_.GetUserShare(), i->first);
}
+ PumpLoop();
}
void TearDown() {
@@ -753,6 +794,7 @@ class SyncManagerTest : public testing::Test,
sync_manager_.Shutdown();
sync_notifier_mock_ = NULL;
EXPECT_FALSE(sync_notifier_observer_);
+ PumpLoop();
}
// ModelSafeWorkerRegistrar implementation.
@@ -827,6 +869,23 @@ class SyncManagerTest : public testing::Test,
++update_enabled_types_call_count_;
}
+ void PumpLoop() {
+ ui_loop_.RunAllPending();
+ }
+
+ void SendJsMessage(const std::string& name, const JsArgList& args,
+ const WeakHandle<JsReplyHandler>& reply_handler) {
+ js_backend_.Call(FROM_HERE, &JsBackend::ProcessJsMessage,
+ name, args, reply_handler);
+ PumpLoop();
+ }
+
+ void SetJsEventHandler(const WeakHandle<JsEventHandler>& event_handler) {
+ js_backend_.Call(FROM_HERE, &JsBackend::SetJsEventHandler,
+ event_handler);
+ PumpLoop();
+ }
+
private:
// Needed by |ui_thread_|.
MessageLoopForUI ui_loop_;
@@ -840,6 +899,7 @@ class SyncManagerTest : public testing::Test,
protected:
SyncManager sync_manager_;
+ WeakHandle<JsBackend> js_backend_;
StrictMock<SyncManagerObserverMock> observer_;
sync_notifier::SyncNotifierObserver* sync_notifier_observer_;
int update_enabled_types_call_count_;
@@ -852,84 +912,36 @@ TEST_F(SyncManagerTest, UpdateEnabledTypes) {
EXPECT_EQ(2, update_enabled_types_call_count_);
}
-TEST_F(SyncManagerTest, ParentJsEventRouter) {
- StrictMock<MockJsEventRouter> event_router;
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
- EXPECT_EQ(NULL, js_backend->GetParentJsEventRouter());
- js_backend->SetParentJsEventRouter(&event_router);
- EXPECT_EQ(&event_router, js_backend->GetParentJsEventRouter());
- js_backend->RemoveParentJsEventRouter();
- EXPECT_EQ(NULL, js_backend->GetParentJsEventRouter());
-}
-
-TEST_F(SyncManagerTest, ProcessMessage) {
+TEST_F(SyncManagerTest, ProcessJsMessage) {
const JsArgList kNoArgs;
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- // Messages sent without any parent router should be dropped.
- {
- StrictMock<MockJsEventHandler> event_handler;
- js_backend->ProcessMessage("unknownMessage",
- kNoArgs, &event_handler);
- js_backend->ProcessMessage("getNotificationState",
- kNoArgs, &event_handler);
- }
-
- {
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
-
- ListValue false_args;
- false_args.Append(Value::CreateBooleanValue(false));
-
- EXPECT_CALL(event_router,
- RouteJsMessageReply("getNotificationState",
- HasArgsAsList(false_args),
- &event_handler));
-
- js_backend->SetParentJsEventRouter(&event_router);
+ StrictMock<MockJsReplyHandler> reply_handler;
- // This message should be dropped.
- js_backend->ProcessMessage("unknownMessage",
- kNoArgs, &event_handler);
+ ListValue false_args;
+ false_args.Append(Value::CreateBooleanValue(false));
- // This should trigger the reply.
- js_backend->ProcessMessage("getNotificationState",
- kNoArgs, &event_handler);
+ EXPECT_CALL(reply_handler,
+ HandleJsReply("getNotificationState",
+ HasArgsAsList(false_args)));
- js_backend->RemoveParentJsEventRouter();
- }
+ // This message should be dropped.
+ SendJsMessage("unknownMessage", kNoArgs, reply_handler.AsWeakHandle());
- // Messages sent after a parent router has been removed should be
- // dropped.
- {
- StrictMock<MockJsEventHandler> event_handler;
- js_backend->ProcessMessage("unknownMessage",
- kNoArgs, &event_handler);
- js_backend->ProcessMessage("getNotificationState",
- kNoArgs, &event_handler);
- }
+ SendJsMessage("getNotificationState", kNoArgs, reply_handler.AsWeakHandle());
}
-TEST_F(SyncManagerTest, ProcessMessageGetRootNodeDetails) {
+TEST_F(SyncManagerTest, ProcessJsMessageGetRootNodeDetails) {
const JsArgList kNoArgs;
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsReplyHandler> reply_handler;
JsArgList return_args;
- EXPECT_CALL(event_router,
- RouteJsMessageReply("getRootNodeDetails", _, &event_handler))
+ EXPECT_CALL(reply_handler,
+ HandleJsReply("getRootNodeDetails", _))
.WillOnce(SaveArg<1>(&return_args));
- js_backend->SetParentJsEventRouter(&event_router);
-
- // Should trigger the reply.
- js_backend->ProcessMessage("getRootNodeDetails", kNoArgs, &event_handler);
+ SendJsMessage("getRootNodeDetails", kNoArgs, reply_handler.AsWeakHandle());
EXPECT_EQ(1u, return_args.Get().GetSize());
DictionaryValue* node_info = NULL;
@@ -942,8 +954,6 @@ TEST_F(SyncManagerTest, ProcessMessageGetRootNodeDetails) {
} else {
ADD_FAILURE();
}
-
- js_backend->RemoveParentJsEventRouter();
}
void CheckGetNodesByIdReturnArgs(const SyncManager& sync_manager,
@@ -981,64 +991,51 @@ class SyncManagerGetNodesByIdTest : public SyncManagerTest {
MakeNode(sync_manager_.GetUserShare(),
syncable::BOOKMARKS, "testtag");
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsReplyHandler> reply_handler;
JsArgList return_args;
const int64 ids[] = { root_id, child_id };
- EXPECT_CALL(event_router,
- RouteJsMessageReply(message_name, _, &event_handler))
+ EXPECT_CALL(reply_handler,
+ HandleJsReply(message_name, _))
.Times(arraysize(ids)).WillRepeatedly(SaveArg<1>(&return_args));
- js_backend->SetParentJsEventRouter(&event_router);
-
for (size_t i = 0; i < arraysize(ids); ++i) {
ListValue args;
ListValue* id_values = new ListValue();
args.Append(id_values);
id_values->Append(Value::CreateStringValue(base::Int64ToString(ids[i])));
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
CheckGetNodesByIdReturnArgs(sync_manager_, return_args,
ids[i], is_detailed);
}
-
- js_backend->RemoveParentJsEventRouter();
}
void RunGetNodesByIdFailureTest(const char* message_name) {
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsReplyHandler> reply_handler;
ListValue empty_list_args;
empty_list_args.Append(new ListValue());
- EXPECT_CALL(event_router,
- RouteJsMessageReply(message_name,
- HasArgsAsList(empty_list_args),
- &event_handler))
+ EXPECT_CALL(reply_handler,
+ HandleJsReply(message_name,
+ HasArgsAsList(empty_list_args)))
.Times(6);
- js_backend->SetParentJsEventRouter(&event_router);
-
{
ListValue args;
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
ListValue args;
args.Append(new ListValue());
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
@@ -1046,8 +1043,8 @@ class SyncManagerGetNodesByIdTest : public SyncManagerTest {
ListValue* ids = new ListValue();
args.Append(ids);
ids->Append(Value::CreateStringValue(""));
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
@@ -1055,8 +1052,8 @@ class SyncManagerGetNodesByIdTest : public SyncManagerTest {
ListValue* ids = new ListValue();
args.Append(ids);
ids->Append(Value::CreateStringValue("nonsense"));
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
@@ -1064,8 +1061,8 @@ class SyncManagerGetNodesByIdTest : public SyncManagerTest {
ListValue* ids = new ListValue();
args.Append(ids);
ids->Append(Value::CreateStringValue("0"));
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
@@ -1073,11 +1070,9 @@ class SyncManagerGetNodesByIdTest : public SyncManagerTest {
ListValue* ids = new ListValue();
args.Append(ids);
ids->Append(Value::CreateStringValue("9999"));
- js_backend->ProcessMessage(message_name,
- JsArgList(&args), &event_handler);
+ SendJsMessage(message_name,
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
-
- js_backend->RemoveParentJsEventRouter();
}
};
@@ -1098,25 +1093,19 @@ TEST_F(SyncManagerGetNodesByIdTest, GetNodeDetailsByIdFailure) {
}
TEST_F(SyncManagerTest, GetChildNodeIds) {
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsReplyHandler> reply_handler;
JsArgList return_args;
- EXPECT_CALL(event_router,
- RouteJsMessageReply("getChildNodeIds", _, &event_handler))
+ EXPECT_CALL(reply_handler,
+ HandleJsReply("getChildNodeIds", _))
.Times(1).WillRepeatedly(SaveArg<1>(&return_args));
- js_backend->SetParentJsEventRouter(&event_router);
-
- // Should trigger the reply.
{
ListValue args;
args.Append(Value::CreateStringValue("1"));
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
EXPECT_EQ(1u, return_args.Get().GetSize());
@@ -1124,98 +1113,89 @@ TEST_F(SyncManagerTest, GetChildNodeIds) {
ASSERT_TRUE(return_args.Get().GetList(0, &nodes));
ASSERT_TRUE(nodes);
EXPECT_EQ(5u, nodes->GetSize());
-
- js_backend->RemoveParentJsEventRouter();
}
TEST_F(SyncManagerTest, GetChildNodeIdsFailure) {
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
- StrictMock<MockJsEventHandler> event_handler;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsReplyHandler> reply_handler;
ListValue empty_list_args;
empty_list_args.Append(new ListValue());
- EXPECT_CALL(event_router,
- RouteJsMessageReply("getChildNodeIds",
- HasArgsAsList(empty_list_args),
- &event_handler))
+ EXPECT_CALL(reply_handler,
+ HandleJsReply("getChildNodeIds",
+ HasArgsAsList(empty_list_args)))
.Times(5);
- js_backend->SetParentJsEventRouter(&event_router);
-
{
ListValue args;
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
ListValue args;
args.Append(Value::CreateStringValue(""));
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
ListValue args;
args.Append(Value::CreateStringValue("nonsense"));
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
ListValue args;
args.Append(Value::CreateStringValue("0"));
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
{
ListValue args;
args.Append(Value::CreateStringValue("9999"));
- js_backend->ProcessMessage("getChildNodeIds",
- JsArgList(&args), &event_handler);
+ SendJsMessage("getChildNodeIds",
+ JsArgList(&args), reply_handler.AsWeakHandle());
}
-
- js_backend->RemoveParentJsEventRouter();
}
// TODO(akalin): Add unit tests for findNodesContainingString message.
TEST_F(SyncManagerTest, OnNotificationStateChange) {
InSequence dummy;
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsEventHandler> event_handler;
DictionaryValue true_details;
true_details.SetBoolean("enabled", true);
DictionaryValue false_details;
false_details.SetBoolean("enabled", false);
- EXPECT_CALL(event_router,
- RouteJsEvent("onNotificationStateChange",
- HasDetailsAsDictionary(true_details)));
- EXPECT_CALL(event_router,
- RouteJsEvent("onNotificationStateChange",
- HasDetailsAsDictionary(false_details)));
-
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("onNotificationStateChange",
+ HasDetailsAsDictionary(true_details)));
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("onNotificationStateChange",
+ HasDetailsAsDictionary(false_details)));
sync_manager_.TriggerOnNotificationStateChangeForTest(true);
sync_manager_.TriggerOnNotificationStateChangeForTest(false);
- js_backend->SetParentJsEventRouter(&event_router);
+ SetJsEventHandler(event_handler.AsWeakHandle());
sync_manager_.TriggerOnNotificationStateChangeForTest(true);
sync_manager_.TriggerOnNotificationStateChangeForTest(false);
- js_backend->RemoveParentJsEventRouter();
+ SetJsEventHandler(WeakHandle<JsEventHandler>());
sync_manager_.TriggerOnNotificationStateChangeForTest(true);
sync_manager_.TriggerOnNotificationStateChangeForTest(false);
+
+ // Should trigger the replies.
+ PumpLoop();
}
TEST_F(SyncManagerTest, OnIncomingNotification) {
- StrictMock<MockJsEventRouter> event_router;
+ StrictMock<MockJsEventHandler> event_handler;
const syncable::ModelTypeBitSet empty_model_types;
syncable::ModelTypeBitSet model_types;
@@ -1239,21 +1219,22 @@ TEST_F(SyncManagerTest, OnIncomingNotification) {
}
}
- EXPECT_CALL(event_router,
- RouteJsEvent("onIncomingNotification",
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("onIncomingNotification",
HasDetailsAsDictionary(expected_details)));
- browser_sync::JsBackend* js_backend = sync_manager_.GetJsBackend();
-
sync_manager_.TriggerOnIncomingNotificationForTest(empty_model_types);
sync_manager_.TriggerOnIncomingNotificationForTest(model_types);
- js_backend->SetParentJsEventRouter(&event_router);
+ SetJsEventHandler(event_handler.AsWeakHandle());
sync_manager_.TriggerOnIncomingNotificationForTest(model_types);
- js_backend->RemoveParentJsEventRouter();
+ SetJsEventHandler(WeakHandle<JsEventHandler>());
sync_manager_.TriggerOnIncomingNotificationForTest(empty_model_types);
sync_manager_.TriggerOnIncomingNotificationForTest(model_types);
+
+ // Should trigger the replies.
+ PumpLoop();
}
TEST_F(SyncManagerTest, RefreshEncryptionReady) {