summaryrefslogtreecommitdiffstats
path: root/chrome/browser/sync/profile_sync_service_unittest.cc
diff options
context:
space:
mode:
Diffstat (limited to 'chrome/browser/sync/profile_sync_service_unittest.cc')
-rw-r--r--chrome/browser/sync/profile_sync_service_unittest.cc188
1 files changed, 181 insertions, 7 deletions
diff --git a/chrome/browser/sync/profile_sync_service_unittest.cc b/chrome/browser/sync/profile_sync_service_unittest.cc
index 15b93aa..ce2134e 100644
--- a/chrome/browser/sync/profile_sync_service_unittest.cc
+++ b/chrome/browser/sync/profile_sync_service_unittest.cc
@@ -13,6 +13,7 @@
#include "base/string_util.h"
#include "base/string16.h"
#include "base/utf_string_conversions.h"
+#include "base/values.h"
#include "chrome/browser/bookmarks/bookmark_model.h"
#include "chrome/browser/browser_thread.h"
#include "chrome/browser/net/gaia/token_service.h"
@@ -27,6 +28,8 @@
#include "chrome/browser/sync/glue/model_associator.h"
#include "chrome/browser/sync/glue/sync_backend_host.h"
#include "chrome/browser/sync/glue/sync_backend_host_mock.h"
+#include "chrome/browser/sync/js_arg_list.h"
+#include "chrome/browser/sync/js_test_util.h"
#include "chrome/browser/sync/profile_sync_factory.h"
#include "chrome/browser/sync/profile_sync_factory_mock.h"
#include "chrome/browser/sync/test_profile_sync_service.h"
@@ -43,12 +46,16 @@ using browser_sync::BookmarkChangeProcessor;
using browser_sync::BookmarkModelAssociator;
using browser_sync::ChangeProcessor;
using browser_sync::DataTypeController;
+using browser_sync::HasArgs;
+using browser_sync::JsArgList;
+using browser_sync::MockJsEventHandler;
using browser_sync::ModelAssociator;
using browser_sync::SyncBackendHost;
using browser_sync::SyncBackendHostMock;
using browser_sync::UnrecoverableErrorHandler;
using testing::_;
using testing::Return;
+using testing::StrictMock;
using testing::WithArg;
using testing::Invoke;
@@ -310,14 +317,16 @@ class ProfileSyncServiceTest : public testing::Test {
}
void StartSyncService() {
- StartSyncServiceAndSetInitialSyncEnded(true);
+ StartSyncServiceAndSetInitialSyncEnded(true, true);
}
- void StartSyncServiceAndSetInitialSyncEnded(bool set_initial_sync_ended) {
+ void StartSyncServiceAndSetInitialSyncEnded(
+ bool set_initial_sync_ended,
+ bool issue_auth_token) {
if (!service_.get()) {
// Set bootstrap to true and it will provide a logged in user for test
service_.reset(new TestProfileSyncService(&factory_,
profile_.get(),
- "test", false, NULL));
+ "test", true, NULL));
if (!set_initial_sync_ended)
service_->dont_set_initial_sync_ended_on_init();
@@ -337,10 +346,11 @@ class ProfileSyncServiceTest : public testing::Test {
profile_.get(),
service_.get()));
- profile_->GetTokenService()->IssueAuthTokenForTest(
- GaiaConstants::kSyncService, "token");
+ if (issue_auth_token) {
+ profile_->GetTokenService()->IssueAuthTokenForTest(
+ GaiaConstants::kSyncService, "token");
+ }
service_->Initialize();
- MessageLoop::current()->Run();
}
}
@@ -947,6 +957,170 @@ TEST_F(ProfileSyncServiceTest, MergeDuplicates) {
ExpectModelMatch();
}
+TEST_F(ProfileSyncServiceTest, JsFrontendHandlersBasic) {
+ LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
+ StartSyncService();
+
+ StrictMock<MockJsEventHandler> event_handler;
+
+ browser_sync::SyncBackendHostForProfileSyncTest* test_backend =
+ service_->GetBackendForTest();
+
+ EXPECT_TRUE(service_->sync_initialized());
+ ASSERT_TRUE(test_backend != NULL);
+ ASSERT_TRUE(test_backend->GetJsBackend() != NULL);
+ EXPECT_EQ(NULL, test_backend->GetJsBackend()->GetParentJsEventRouter());
+
+ browser_sync::JsFrontend* js_backend = service_->GetJsFrontend();
+ js_backend->AddHandler(&event_handler);
+ ASSERT_TRUE(test_backend->GetJsBackend() != NULL);
+ EXPECT_TRUE(test_backend->GetJsBackend()->GetParentJsEventRouter() != NULL);
+
+ js_backend->RemoveHandler(&event_handler);
+ EXPECT_EQ(NULL, test_backend->GetJsBackend()->GetParentJsEventRouter());
+}
+
+TEST_F(ProfileSyncServiceTest,
+ JsFrontendHandlersDelayedBackendInitialization) {
+ LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
+ StartSyncServiceAndSetInitialSyncEnded(true, false);
+
+ StrictMock<MockJsEventHandler> event_handler;
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("onSyncServiceStateChanged",
+ HasArgs(JsArgList()))).Times(3);
+
+ EXPECT_EQ(NULL, service_->GetBackendForTest());
+ EXPECT_FALSE(service_->sync_initialized());
+
+ browser_sync::JsFrontend* js_backend = service_->GetJsFrontend();
+ js_backend->AddHandler(&event_handler);
+ // Since we're doing synchronous initialization, backend should be
+ // initialized by this call.
+ profile_->GetTokenService()->IssueAuthTokenForTest(
+ GaiaConstants::kSyncService, "token");
+
+ browser_sync::SyncBackendHostForProfileSyncTest* test_backend =
+ service_->GetBackendForTest();
+
+ EXPECT_TRUE(service_->sync_initialized());
+ ASSERT_TRUE(test_backend != NULL);
+ ASSERT_TRUE(test_backend->GetJsBackend() != NULL);
+ EXPECT_TRUE(test_backend->GetJsBackend()->GetParentJsEventRouter() != NULL);
+
+ js_backend->RemoveHandler(&event_handler);
+ EXPECT_EQ(NULL, test_backend->GetJsBackend()->GetParentJsEventRouter());
+}
+
+TEST_F(ProfileSyncServiceTest, JsFrontendProcessMessageBasic) {
+ LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
+ StartSyncService();
+
+ StrictMock<MockJsEventHandler> event_handler;
+
+ ListValue arg_list1;
+ arg_list1.Append(Value::CreateBooleanValue(true));
+ arg_list1.Append(Value::CreateIntegerValue(5));
+ JsArgList args1(arg_list1);
+ EXPECT_CALL(event_handler, HandleJsEvent("testMessage1", HasArgs(args1)));
+
+ ListValue arg_list2;
+ arg_list2.Append(Value::CreateStringValue("test"));
+ arg_list2.Append(arg_list1.DeepCopy());
+ JsArgList args2(arg_list2);
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("delayTestMessage2", HasArgs(args2)));
+
+ ListValue arg_list3;
+ arg_list3.Append(arg_list1.DeepCopy());
+ arg_list3.Append(arg_list2.DeepCopy());
+ JsArgList args3(arg_list3);
+
+ browser_sync::JsFrontend* js_backend = service_->GetJsFrontend();
+
+ // Never replied to.
+ js_backend->ProcessMessage("notRepliedTo", args3, &event_handler);
+
+ // Replied to later.
+ js_backend->ProcessMessage("delayTestMessage2", args2, &event_handler);
+
+ js_backend->AddHandler(&event_handler);
+
+ // Replied to immediately.
+ js_backend->ProcessMessage("testMessage1", args1, &event_handler);
+
+ // Fires off reply for delayTestMessage2.
+ message_loop_.RunAllPending();
+
+ // Never replied to.
+ js_backend->ProcessMessage("delayNotRepliedTo", args3, &event_handler);
+
+ js_backend->RemoveHandler(&event_handler);
+
+ message_loop_.RunAllPending();
+
+ // Never replied to.
+ js_backend->ProcessMessage("notRepliedTo", args3, &event_handler);
+}
+
+TEST_F(ProfileSyncServiceTest,
+ JsFrontendProcessMessageBasicDelayedBackendInitialization) {
+ LoadBookmarkModel(DELETE_EXISTING_STORAGE, DONT_SAVE_TO_STORAGE);
+ StartSyncServiceAndSetInitialSyncEnded(true, false);
+
+ StrictMock<MockJsEventHandler> event_handler;
+
+ ListValue arg_list1;
+ arg_list1.Append(Value::CreateBooleanValue(true));
+ arg_list1.Append(Value::CreateIntegerValue(5));
+ JsArgList args1(arg_list1);
+ EXPECT_CALL(event_handler, HandleJsEvent("testMessage1", HasArgs(args1)));
+
+ ListValue arg_list2;
+ arg_list2.Append(Value::CreateStringValue("test"));
+ arg_list2.Append(arg_list1.DeepCopy());
+ JsArgList args2(arg_list2);
+ EXPECT_CALL(event_handler, HandleJsEvent("testMessage2", HasArgs(args2)));
+
+ ListValue arg_list3;
+ arg_list3.Append(arg_list1.DeepCopy());
+ arg_list3.Append(arg_list2.DeepCopy());
+ JsArgList args3(arg_list3);
+ EXPECT_CALL(event_handler,
+ HandleJsEvent("delayTestMessage3", HasArgs(args3)));
+
+ const JsArgList kNoArgs;
+
+ EXPECT_CALL(event_handler, HandleJsEvent("onSyncServiceStateChanged",
+ HasArgs(kNoArgs))).Times(3);
+
+ browser_sync::JsFrontend* js_backend = service_->GetJsFrontend();
+
+ // We expect a reply for this message, even though its sent before
+ // |event_handler| is added as a handler.
+ js_backend->ProcessMessage("testMessage1", args1, &event_handler);
+
+ js_backend->AddHandler(&event_handler);
+
+ js_backend->ProcessMessage("testMessage2", args2, &event_handler);
+ js_backend->ProcessMessage("delayTestMessage3", args3, &event_handler);
+
+ // Fires testMessage1 and testMessage2.
+ profile_->GetTokenService()->IssueAuthTokenForTest(
+ GaiaConstants::kSyncService, "token");
+
+ // Fires delayTestMessage3.
+ message_loop_.RunAllPending();
+
+ js_backend->ProcessMessage("delayNotRepliedTo", kNoArgs, &event_handler);
+
+ js_backend->RemoveHandler(&event_handler);
+
+ message_loop_.RunAllPending();
+
+ js_backend->ProcessMessage("notRepliedTo", kNoArgs, &event_handler);
+}
+
struct TestData {
const wchar_t* title;
const char* url;
@@ -1401,7 +1575,7 @@ TEST_F(ProfileSyncServiceTestWithData, RecoverAfterDeletingSyncDataDirectory) {
// Restart the sync service. Don't fake out setting initial sync ended; lets
// make sure the system does in fact nudge and wait for this to happen.
- StartSyncServiceAndSetInitialSyncEnded(false);
+ StartSyncServiceAndSetInitialSyncEnded(false, true);
// Make sure we're back in sync. In real life, the user would need
// to reauthenticate before this happens, but in the test, authentication