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