172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Copyright (c) 2011 The Chromium Authors. All rights reserved. 272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Use of this source code is governed by a BSD-style license that can be 372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// found in the LICENSE file. 472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_sync_manager_observer.h" 672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include <cstddef> 872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/basictypes.h" 1072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "base/values.h" 1172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/engine/syncapi.h" 1272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_arg_list.h" 1372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/js_test_util.h" 1472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/sessions/session_state.h" 1572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "chrome/browser/sync/syncable/model_type.h" 16ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen#include "chrome/test/sync/engine/test_user_share.h" 1772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen#include "testing/gtest/include/gtest/gtest.h" 1872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 1972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace browser_sync { 2072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 2172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::InSequence; 2372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenusing ::testing::StrictMock; 2472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenclass JsSyncManagerObserverTest : public testing::Test { 2672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen protected: 2772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsSyncManagerObserverTest() : sync_manager_observer_(&mock_router_) {} 2872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 2972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen StrictMock<MockJsEventRouter> mock_router_; 3072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen JsSyncManagerObserver sync_manager_observer_; 3172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen}; 3272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, NoArgNotifiations) { 3472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InSequence dummy; 3572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 3672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 3772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onInitializationComplete", 3872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgs(JsArgList()), NULL)); 3972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 40dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RouteJsEvent("onPassphraseFailed", 41dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HasArgs(JsArgList()), NULL)); 42ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 4372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 4472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onStopSyncingPermanently", 4572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgs(JsArgList()), NULL)); 4672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 4772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onClearServerDataSucceeded", 4872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgs(JsArgList()), NULL)); 4972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 5072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onClearServerDataFailed", 5172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgs(JsArgList()), NULL)); 5272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnInitializationComplete(); 54dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sync_manager_observer_.OnPassphraseFailed(); 5572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnStopSyncingPermanently(); 5672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnClearServerDataSucceeded(); 5772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnClearServerDataFailed(); 5872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 5972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnChangesComplete) { 6172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InSequence dummy; 6272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 6372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = syncable::FIRST_REAL_MODEL_TYPE; 6472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 6572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& model_type_str = 6672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen syncable::ModelTypeToString(syncable::ModelTypeFromInt(i)); 6772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue expected_args; 6872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen expected_args.Append(Value::CreateStringValue(model_type_str)); 6972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 7072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onChangesComplete", 7172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(expected_args), NULL)); 7272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 7472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen for (int i = syncable::FIRST_REAL_MODEL_TYPE; 7572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 7672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnChangesComplete(syncable::ModelTypeFromInt(i)); 7772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 7872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 7972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 8072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnSyncCycleCompleted) { 8172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen std::string download_progress_markers[syncable::MODEL_TYPE_COUNT]; 8272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sessions::SyncSessionSnapshot snapshot(sessions::SyncerStatus(), 8372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sessions::ErrorCounters(), 8472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 100, 8572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false, 8672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen syncable::ModelTypeBitSet(), 8772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen download_progress_markers, 8872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false, 8972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen true, 9072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 100, 9172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 5, 9272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false, 9372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sessions::SyncSourceInfo()); 9472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue expected_args; 9572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen expected_args.Append(snapshot.ToValue()); 9672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 9772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 9872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onSyncCycleCompleted", 9972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(expected_args), NULL)); 10072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnSyncCycleCompleted(&snapshot); 10272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 10372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnAuthError) { 10572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen GoogleServiceAuthError error(GoogleServiceAuthError::TWO_FACTOR); 10672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue expected_args; 10772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen expected_args.Append(error.ToValue()); 10872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 10972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 11072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onAuthError", 11172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(expected_args), NULL)); 11272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnAuthError(error); 11472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 11572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnPassphraseRequired) { 11772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InSequence dummy; 11872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 11972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue true_args, false_args; 12072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen true_args.Append(Value::CreateBooleanValue(true)); 12172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen false_args.Append(Value::CreateBooleanValue(false)); 12272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 12372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 12472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onPassphraseRequired", 12572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(false_args), NULL)); 12672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 12772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onPassphraseRequired", 12872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(true_args), NULL)); 12972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnPassphraseRequired(false); 13172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnPassphraseRequired(true); 13272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 13372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, SensitiveNotifiations) { 13572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue redacted_args; 13672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen redacted_args.Append(Value::CreateStringValue("<redacted>")); 13772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 13872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 13972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onUpdatedToken", 14072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(redacted_args), NULL)); 14172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 14272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onPassphraseAccepted", 14372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(redacted_args), NULL)); 14472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 14572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnUpdatedToken("sensitive_token"); 14672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnPassphraseAccepted("sensitive_token"); 14772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 14872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 149dc0f95d653279beabeb9817299e2902918ba123eKristian MonsenTEST_F(JsSyncManagerObserverTest, OnEncryptionComplete) { 150dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ListValue expected_args; 151dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen ListValue* encrypted_type_values = new ListValue(); 152dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen syncable::ModelTypeSet encrypted_types; 153dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_args.Append(encrypted_type_values); 155dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int i = syncable::FIRST_REAL_MODEL_TYPE; 156dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 157dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen syncable::ModelType type = syncable::ModelTypeFromInt(i); 158dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen encrypted_types.insert(type); 159dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen encrypted_type_values->Append(Value::CreateStringValue( 160dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen syncable::ModelTypeToString(type))); 161dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen } 162dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 163dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen EXPECT_CALL(mock_router_, 164dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen RouteJsEvent("onEncryptionComplete", 165dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen HasArgsAsList(expected_args), NULL)); 166dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 167dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sync_manager_observer_.OnEncryptionComplete(encrypted_types); 168dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen} 169ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 170ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnMigrationNeededForTypes) { 171ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue expected_args; 172ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen ListValue* type_values = new ListValue(); 173ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeSet types; 174ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 175ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen expected_args.Append(type_values); 176ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen for (int i = syncable::FIRST_REAL_MODEL_TYPE; 177ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 178ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelType type = syncable::ModelTypeFromInt(i); 179ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen types.insert(type); 180ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen type_values->Append(Value::CreateStringValue( 181ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen syncable::ModelTypeToString(type))); 182ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen } 183ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 184ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen EXPECT_CALL(mock_router_, 185ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen RouteJsEvent("onMigrationNeededForTypes", 186ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen HasArgsAsList(expected_args), NULL)); 187ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 188ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_manager_observer_.OnMigrationNeededForTypes(types); 189ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen} 190ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen 19172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsennamespace { 19272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 19372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// Makes a node of the given model type. Returns the id of the 19472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen// newly-created node. 19572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsenint64 MakeNode(sync_api::UserShare* share, syncable::ModelType model_type) { 19672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::WriteTransaction trans(share); 19772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadNode root_node(&trans); 19872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen root_node.InitByRootLookup(); 19972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::WriteNode node(&trans); 20072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(node.InitUniqueByCreation( 20172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen model_type, root_node, 20272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen syncable::ModelTypeToString(model_type))); 20372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen node.SetIsFolder(false); 20472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen return node.GetId(); 20572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 20672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 20872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 20972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian MonsenTEST_F(JsSyncManagerObserverTest, OnChangesApplied) { 21072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen InSequence dummy; 21172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 212ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen TestUserShare test_user_share; 213ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_user_share.SetUp(); 21472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // We don't test with passwords as that requires additional setup. 21672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 21772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Build a list of example ChangeRecords. 218dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen sync_api::SyncManager::ChangeRecord changes[syncable::MODEL_TYPE_COUNT]; 219dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int i = syncable::AUTOFILL_PROFILE; 220dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 221ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen changes[i].id = 222ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen MakeNode(test_user_share.user_share(), syncable::ModelTypeFromInt(i)); 22372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen switch (i % 3) { 22472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case 0: 22572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen changes[i].action = 22672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::SyncManager::ChangeRecord::ACTION_ADD; 22772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 22872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen case 1: 22972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen changes[i].action = 23072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::SyncManager::ChangeRecord::ACTION_UPDATE; 23172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 23272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen default: 23372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen changes[i].action = 23472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::SyncManager::ChangeRecord::ACTION_DELETE; 23572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen break; 23672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 23772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen { 238ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_api::ReadTransaction trans(test_user_share.user_share()); 23972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_api::ReadNode node(&trans); 24072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_TRUE(node.InitByIdLookup(changes[i].id)); 24172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen changes[i].specifics = node.GetEntry()->Get(syncable::SPECIFICS); 24272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 24372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 24472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 245dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // For each i, we call OnChangesApplied() with the first arg equal 246dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // to i cast to ModelType and the second argument with the changes 247dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen // starting from changes[i]. 248dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen 24972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Set expectations for each data type. 250dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int i = syncable::AUTOFILL_PROFILE; 251dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 25272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen const std::string& model_type_str = 25372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen syncable::ModelTypeToString(syncable::ModelTypeFromInt(i)); 25472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue expected_args; 25572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen expected_args.Append(Value::CreateStringValue(model_type_str)); 25672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen ListValue* expected_changes = new ListValue(); 25772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen expected_args.Append(expected_changes); 258dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int j = i; j < syncable::MODEL_TYPE_COUNT; ++j) { 259ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_api::ReadTransaction trans(test_user_share.user_share()); 260dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen expected_changes->Append(changes[j].ToValue(&trans)); 26172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 26272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen EXPECT_CALL(mock_router_, 26372a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen RouteJsEvent("onChangesApplied", 26472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen HasArgsAsList(expected_args), NULL)); 26572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 26672a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 26772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen // Fire OnChangesApplied() for each data type. 268dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen for (int i = syncable::AUTOFILL_PROFILE; 269dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen i < syncable::MODEL_TYPE_COUNT; ++i) { 270ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen sync_api::ReadTransaction trans(test_user_share.user_share()); 27172a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen sync_manager_observer_.OnChangesApplied(syncable::ModelTypeFromInt(i), 27272a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen &trans, &changes[i], 273dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen syncable::MODEL_TYPE_COUNT - i); 27472a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen } 27572a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 276ddb351dbec246cf1fab5ec20d2d5520909041de1Kristian Monsen test_user_share.TearDown(); 27772a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} 27872a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen 27972a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace 28072a454cd3513ac24fbdd0e0cb9ad70b86a99b801Kristian Monsen} // namespace browser_sync 281