15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved.
25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be
35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file.
45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/js_sync_manager_observer.h"
65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/basictypes.h"
85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/location.h"
99ab5563a3196760eb381d102cbb2bc0f7abc6a50Ben Murdoch#include "base/message_loop/message_loop.h"
105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/values.h"
115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/base/model_type.h"
125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/sessions/sync_session_snapshot.h"
135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/sync_string_conversions.h"
145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/internal_api/public/util/weak_handle.h"
155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_event_details.h"
165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/js/js_test_util.h"
175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "sync/protocol/sync_protocol_error.h"
185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h"
195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace syncer {
215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace {
225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::InSequence;
245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::StrictMock;
255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class JsSyncManagerObserverTest : public testing::Test {
275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JsSyncManagerObserverTest() {
295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)    js_sync_manager_observer_.SetJsEventHandler(
305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)        mock_js_event_handler_.AsWeakHandle());
315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private:
345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // This must be destroyed after the member variables below in order
355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  // for WeakHandles to be destroyed properly.
36b2df76ea8fec9e32f6f3718986dba0d95315b29cTorne (Richard Coles)  base::MessageLoop message_loop_;
375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected:
395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  StrictMock<MockJsEventHandler> mock_js_event_handler_;
405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  JsSyncManagerObserver js_sync_manager_observer_;
415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  void PumpLoop() {
432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)    message_loop_.RunUntilIdle();
445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  }
455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)};
465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsSyncManagerObserverTest, OnInitializationComplete) {
48eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue expected_details;
495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  syncer::ModelTypeSet restored_types;
505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restored_types.Put(BOOKMARKS);
515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  restored_types.Put(NIGORI);
525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_details.Set("restoredTypes", ModelTypeSetToValue(restored_types));
535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_js_event_handler_,
555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              HandleJsEvent("onInitializationComplete",
565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            HasDetailsAsDictionary(expected_details)));
575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_sync_manager_observer_.OnInitializationComplete(
595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WeakHandle<JsBackend>(),
605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      WeakHandle<DataTypeDebugInfoListener>(),
615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      true,
625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)      restored_types);
635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PumpLoop();
645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsSyncManagerObserverTest, OnSyncCycleCompleted) {
672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)  sessions::SyncSessionSnapshot snapshot(
682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      sessions::ModelNeutralState(),
692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      ProgressMarkerMap(),
702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      5,
722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      2,
732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      7,
742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      false,
752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      0,
762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      base::Time::Now(),
772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)      std::vector<int>(MODEL_TYPE_COUNT, 0),
78a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      std::vector<int>(MODEL_TYPE_COUNT, 0),
79a36e5920737c6adbddd3e43b760e5de8431db6e0Torne (Richard Coles)      sync_pb::GetUpdatesCallerInfo::UNKNOWN);
80eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue expected_details;
815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_details.Set("snapshot", snapshot.ToValue());
825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_js_event_handler_,
845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              HandleJsEvent("onSyncCycleCompleted",
855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            HasDetailsAsDictionary(expected_details)));
865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_sync_manager_observer_.OnSyncCycleCompleted(snapshot);
885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PumpLoop();
895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsSyncManagerObserverTest, OnActionableError) {
925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  SyncProtocolError sync_error;
935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_error.action = CLEAR_USER_DATA_AND_RESYNC;
945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  sync_error.error_type = TRANSIENT_ERROR;
95eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue expected_details;
965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_details.Set("syncError", sync_error.ToValue());
975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_js_event_handler_,
995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              HandleJsEvent("onActionableError",
1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                           HasDetailsAsDictionary(expected_details)));
1015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_sync_manager_observer_.OnActionableError(sync_error);
1035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PumpLoop();
1045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1065821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(JsSyncManagerObserverTest, OnConnectionStatusChange) {
1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  const ConnectionStatus kStatus = CONNECTION_AUTH_ERROR;
109eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch  base::DictionaryValue expected_details;
1105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  expected_details.SetString("status",
1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                             ConnectionStatusToString(kStatus));
1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  EXPECT_CALL(mock_js_event_handler_,
1145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)              HandleJsEvent("onConnectionStatusChange",
1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)                            HasDetailsAsDictionary(expected_details)));
1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  js_sync_manager_observer_.OnConnectionStatusChange(kStatus);
1185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)  PumpLoop();
1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}
1205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)
1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace
1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}  // namespace syncer
123