1// Copyright (c) 2012 The Chromium Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5#include "sync/internal_api/js_sync_manager_observer.h" 6 7#include "base/basictypes.h" 8#include "base/location.h" 9#include "base/message_loop/message_loop.h" 10#include "base/values.h" 11#include "sync/internal_api/public/base/model_type.h" 12#include "sync/internal_api/public/sessions/sync_session_snapshot.h" 13#include "sync/internal_api/public/util/sync_string_conversions.h" 14#include "sync/internal_api/public/util/weak_handle.h" 15#include "sync/js/js_event_details.h" 16#include "sync/js/js_test_util.h" 17#include "sync/protocol/sync_protocol_error.h" 18#include "testing/gtest/include/gtest/gtest.h" 19 20namespace syncer { 21namespace { 22 23using ::testing::InSequence; 24using ::testing::StrictMock; 25 26class JsSyncManagerObserverTest : public testing::Test { 27 protected: 28 JsSyncManagerObserverTest() { 29 js_sync_manager_observer_.SetJsEventHandler( 30 mock_js_event_handler_.AsWeakHandle()); 31 } 32 33 private: 34 // This must be destroyed after the member variables below in order 35 // for WeakHandles to be destroyed properly. 36 base::MessageLoop message_loop_; 37 38 protected: 39 StrictMock<MockJsEventHandler> mock_js_event_handler_; 40 JsSyncManagerObserver js_sync_manager_observer_; 41 42 void PumpLoop() { 43 message_loop_.RunUntilIdle(); 44 } 45}; 46 47TEST_F(JsSyncManagerObserverTest, OnInitializationComplete) { 48 base::DictionaryValue expected_details; 49 syncer::ModelTypeSet restored_types; 50 restored_types.Put(BOOKMARKS); 51 restored_types.Put(NIGORI); 52 expected_details.Set("restoredTypes", ModelTypeSetToValue(restored_types)); 53 54 EXPECT_CALL(mock_js_event_handler_, 55 HandleJsEvent("onInitializationComplete", 56 HasDetailsAsDictionary(expected_details))); 57 58 js_sync_manager_observer_.OnInitializationComplete( 59 WeakHandle<JsBackend>(), 60 WeakHandle<DataTypeDebugInfoListener>(), 61 true, 62 restored_types); 63 PumpLoop(); 64} 65 66TEST_F(JsSyncManagerObserverTest, OnSyncCycleCompleted) { 67 sessions::SyncSessionSnapshot snapshot( 68 sessions::ModelNeutralState(), 69 ProgressMarkerMap(), 70 false, 71 5, 72 2, 73 7, 74 false, 75 0, 76 base::Time::Now(), 77 std::vector<int>(MODEL_TYPE_COUNT, 0), 78 std::vector<int>(MODEL_TYPE_COUNT, 0), 79 sync_pb::GetUpdatesCallerInfo::UNKNOWN); 80 base::DictionaryValue expected_details; 81 expected_details.Set("snapshot", snapshot.ToValue()); 82 83 EXPECT_CALL(mock_js_event_handler_, 84 HandleJsEvent("onSyncCycleCompleted", 85 HasDetailsAsDictionary(expected_details))); 86 87 js_sync_manager_observer_.OnSyncCycleCompleted(snapshot); 88 PumpLoop(); 89} 90 91TEST_F(JsSyncManagerObserverTest, OnActionableError) { 92 SyncProtocolError sync_error; 93 sync_error.action = CLEAR_USER_DATA_AND_RESYNC; 94 sync_error.error_type = TRANSIENT_ERROR; 95 base::DictionaryValue expected_details; 96 expected_details.Set("syncError", sync_error.ToValue()); 97 98 EXPECT_CALL(mock_js_event_handler_, 99 HandleJsEvent("onActionableError", 100 HasDetailsAsDictionary(expected_details))); 101 102 js_sync_manager_observer_.OnActionableError(sync_error); 103 PumpLoop(); 104} 105 106 107TEST_F(JsSyncManagerObserverTest, OnConnectionStatusChange) { 108 const ConnectionStatus kStatus = CONNECTION_AUTH_ERROR; 109 base::DictionaryValue expected_details; 110 expected_details.SetString("status", 111 ConnectionStatusToString(kStatus)); 112 113 EXPECT_CALL(mock_js_event_handler_, 114 HandleJsEvent("onConnectionStatusChange", 115 HasDetailsAsDictionary(expected_details))); 116 117 js_sync_manager_observer_.OnConnectionStatusChange(kStatus); 118 PumpLoop(); 119} 120 121} // namespace 122} // namespace syncer 123