| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/sync/glue/chrome_sync_notification_bridge.h" | 5 #include "chrome/browser/sync/glue/chrome_sync_notification_bridge.h" |
| 6 | 6 |
| 7 #include "base/compiler_specific.h" | 7 #include "base/compiler_specific.h" |
| 8 #include "base/memory/weak_ptr.h" | 8 #include "base/memory/weak_ptr.h" |
| 9 #include "base/message_loop.h" | 9 #include "base/message_loop.h" |
| 10 #include "base/synchronization/waitable_event.h" | 10 #include "base/synchronization/waitable_event.h" |
| (...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 49 expected_payloads_(expected_payloads) { | 49 expected_payloads_(expected_payloads) { |
| 50 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 50 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 51 bridge_->AddObserver(this); | 51 bridge_->AddObserver(this); |
| 52 } | 52 } |
| 53 virtual ~FakeSyncNotifierObserverIO() { | 53 virtual ~FakeSyncNotifierObserverIO() { |
| 54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 54 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 55 bridge_->RemoveObserver(this); | 55 bridge_->RemoveObserver(this); |
| 56 } | 56 } |
| 57 | 57 |
| 58 // SyncNotifierObserver implementation. | 58 // SyncNotifierObserver implementation. |
| 59 virtual syncer::ObjectIdSet GetHandledIds() OVERRIDE { |
| 60 NOTREACHED(); |
| 61 return syncer::ObjectIdSet(); |
| 62 } |
| 63 |
| 59 virtual void OnIncomingNotification( | 64 virtual void OnIncomingNotification( |
| 60 const syncer::ModelTypePayloadMap& type_payloads, | 65 const syncer::ObjectIdPayloadMap& id_payloads, |
| 61 syncer::IncomingNotificationSource source) OVERRIDE { | 66 syncer::IncomingNotificationSource source) OVERRIDE { |
| 62 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); | 67 DCHECK(BrowserThread::CurrentlyOn(BrowserThread::IO)); |
| 63 notification_count_++; | 68 notification_count_++; |
| 64 if (source != syncer::LOCAL_NOTIFICATION) { | 69 if (source != syncer::LOCAL_NOTIFICATION) { |
| 65 LOG(ERROR) << "Received notification with wrong source."; | 70 LOG(ERROR) << "Received notification with wrong source."; |
| 66 received_improper_notification_ = true; | 71 received_improper_notification_ = true; |
| 67 } | 72 } |
| 68 if (expected_payloads_ != type_payloads) { | 73 const syncer::ModelTypePayloadMap& actual_payloads = |
| 74 syncer::ObjectIdPayloadMapToModelTypePayloadMap(id_payloads); |
| 75 if (expected_payloads_ != actual_payloads) { |
| 69 LOG(ERROR) << "Received wrong payload."; | 76 LOG(ERROR) << "Received wrong payload."; |
| 70 received_improper_notification_ = true; | 77 received_improper_notification_ = true; |
| 71 } | 78 } |
| 72 } | 79 } |
| 73 virtual void OnNotificationsEnabled() OVERRIDE { | 80 virtual void OnNotificationsEnabled() OVERRIDE { |
| 74 NOTREACHED(); | 81 NOTREACHED(); |
| 75 } | 82 } |
| 76 virtual void OnNotificationsDisabled( | 83 virtual void OnNotificationsDisabled( |
| 77 syncer::NotificationsDisabledReason reason) OVERRIDE { | 84 syncer::NotificationsDisabledReason reason) OVERRIDE { |
| 78 NOTREACHED(); | 85 NOTREACHED(); |
| (...skipping 107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 186 ChromeSyncNotificationBridge bridge_; | 193 ChromeSyncNotificationBridge bridge_; |
| 187 base::WaitableEvent done_; | 194 base::WaitableEvent done_; |
| 188 }; | 195 }; |
| 189 | 196 |
| 190 // Adds an observer on the UI thread, triggers a local refresh notification, and | 197 // Adds an observer on the UI thread, triggers a local refresh notification, and |
| 191 // ensures the bridge posts a LOCAL_NOTIFICATION with the proper payload to it. | 198 // ensures the bridge posts a LOCAL_NOTIFICATION with the proper payload to it. |
| 192 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotification) { | 199 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotification) { |
| 193 syncer::ModelTypePayloadMap payload_map; | 200 syncer::ModelTypePayloadMap payload_map; |
| 194 payload_map[syncer::SESSIONS] = ""; | 201 payload_map[syncer::SESSIONS] = ""; |
| 195 StrictMock<syncer::MockSyncNotifierObserver> observer; | 202 StrictMock<syncer::MockSyncNotifierObserver> observer; |
| 196 EXPECT_CALL(observer, | 203 EXPECT_CALL(observer, OnIncomingNotification( |
| 197 OnIncomingNotification(payload_map, | 204 ModelTypePayloadMapToObjectIdPayloadMap(payload_map), |
| 198 syncer::LOCAL_NOTIFICATION)); | 205 syncer::LOCAL_NOTIFICATION)); |
| 199 bridge_.AddObserver(&observer); | 206 bridge_.AddObserver(&observer); |
| 200 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, | 207 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, |
| 201 payload_map); | 208 payload_map); |
| 202 ui_loop_.RunAllPending(); | 209 ui_loop_.RunAllPending(); |
| 203 Mock::VerifyAndClearExpectations(&observer); | 210 Mock::VerifyAndClearExpectations(&observer); |
| 204 } | 211 } |
| 205 | 212 |
| 206 // Adds an observer on the UI thread, triggers a remote refresh notification, | 213 // Adds an observer on the UI thread, triggers a remote refresh notification, |
| 207 // and ensures the bridge posts a REMOTE_NOTIFICATION with the proper payload | 214 // and ensures the bridge posts a REMOTE_NOTIFICATION with the proper payload |
| 208 // to it. | 215 // to it. |
| 209 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotification) { | 216 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotification) { |
| 210 syncer::ModelTypePayloadMap payload_map; | 217 syncer::ModelTypePayloadMap payload_map; |
| 211 payload_map[syncer::BOOKMARKS] = ""; | 218 payload_map[syncer::BOOKMARKS] = ""; |
| 212 StrictMock<syncer::MockSyncNotifierObserver> observer; | 219 StrictMock<syncer::MockSyncNotifierObserver> observer; |
| 213 EXPECT_CALL(observer, | 220 EXPECT_CALL(observer, OnIncomingNotification( |
| 214 OnIncomingNotification(payload_map, | 221 ModelTypePayloadMapToObjectIdPayloadMap(payload_map), |
| 215 syncer::REMOTE_NOTIFICATION)); | 222 syncer::REMOTE_NOTIFICATION)); |
| 216 bridge_.AddObserver(&observer); | 223 bridge_.AddObserver(&observer); |
| 217 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, | 224 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, |
| 218 payload_map); | 225 payload_map); |
| 219 ui_loop_.RunAllPending(); | 226 ui_loop_.RunAllPending(); |
| 220 Mock::VerifyAndClearExpectations(&observer); | 227 Mock::VerifyAndClearExpectations(&observer); |
| 221 } | 228 } |
| 222 | 229 |
| 223 // Adds an observer on the UI thread, triggers a local refresh notification | 230 // Adds an observer on the UI thread, triggers a local refresh notification |
| 224 // with empty payload map and ensures the bridge posts a | 231 // with empty payload map and ensures the bridge posts a |
| 225 // LOCAL_NOTIFICATION with the proper payload to it. | 232 // LOCAL_NOTIFICATION with the proper payload to it. |
| 226 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotificationEmptyPayloadMap) { | 233 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotificationEmptyPayloadMap) { |
| 227 const syncer::ModelTypeSet enabled_types( | 234 const syncer::ModelTypeSet enabled_types( |
| 228 syncer::BOOKMARKS, syncer::PASSWORDS); | 235 syncer::BOOKMARKS, syncer::PASSWORDS); |
| 229 const syncer::ModelTypePayloadMap enabled_types_payload_map = | 236 const syncer::ModelTypePayloadMap enabled_types_payload_map = |
| 230 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); | 237 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); |
| 231 | 238 |
| 232 StrictMock<syncer::MockSyncNotifierObserver> observer; | 239 StrictMock<syncer::MockSyncNotifierObserver> observer; |
| 233 EXPECT_CALL(observer, | 240 EXPECT_CALL(observer, OnIncomingNotification( |
| 234 OnIncomingNotification(enabled_types_payload_map, | 241 ModelTypePayloadMapToObjectIdPayloadMap(enabled_types_payload_map), |
| 235 syncer::LOCAL_NOTIFICATION)); | 242 syncer::LOCAL_NOTIFICATION)); |
| 236 bridge_.AddObserver(&observer); | 243 bridge_.AddObserver(&observer); |
| 237 // Set enabled types on the bridge. | 244 // Set enabled types on the bridge. |
| 238 bridge_.UpdateEnabledTypes(enabled_types); | 245 bridge_.UpdateEnabledTypes(enabled_types); |
| 239 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, | 246 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, |
| 240 syncer::ModelTypePayloadMap()); | 247 syncer::ModelTypePayloadMap()); |
| 241 ui_loop_.RunAllPending(); | 248 ui_loop_.RunAllPending(); |
| 242 Mock::VerifyAndClearExpectations(&observer); | 249 Mock::VerifyAndClearExpectations(&observer); |
| 243 } | 250 } |
| 244 | 251 |
| 245 // Adds an observer on the UI thread, triggers a remote refresh notification | 252 // Adds an observer on the UI thread, triggers a remote refresh notification |
| 246 // with empty payload map and ensures the bridge posts a | 253 // with empty payload map and ensures the bridge posts a |
| 247 // REMOTE_NOTIFICATION with the proper payload to it. | 254 // REMOTE_NOTIFICATION with the proper payload to it. |
| 248 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotificationEmptyPayloadMap) { | 255 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotificationEmptyPayloadMap) { |
| 249 const syncer::ModelTypeSet enabled_types( | 256 const syncer::ModelTypeSet enabled_types( |
| 250 syncer::BOOKMARKS, syncer::TYPED_URLS); | 257 syncer::BOOKMARKS, syncer::TYPED_URLS); |
| 251 const syncer::ModelTypePayloadMap enabled_types_payload_map = | 258 const syncer::ModelTypePayloadMap enabled_types_payload_map = |
| 252 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); | 259 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); |
| 253 | 260 |
| 254 StrictMock<syncer::MockSyncNotifierObserver> observer; | 261 StrictMock<syncer::MockSyncNotifierObserver> observer; |
| 255 EXPECT_CALL(observer, | 262 EXPECT_CALL(observer, OnIncomingNotification( |
| 256 OnIncomingNotification(enabled_types_payload_map, | 263 ModelTypePayloadMapToObjectIdPayloadMap(enabled_types_payload_map), |
| 257 syncer::REMOTE_NOTIFICATION)); | 264 syncer::REMOTE_NOTIFICATION)); |
| 258 bridge_.AddObserver(&observer); | 265 bridge_.AddObserver(&observer); |
| 259 // Set enabled types on the bridge. | 266 // Set enabled types on the bridge. |
| 260 bridge_.UpdateEnabledTypes(enabled_types); | 267 bridge_.UpdateEnabledTypes(enabled_types); |
| 261 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, | 268 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, |
| 262 syncer::ModelTypePayloadMap()); | 269 syncer::ModelTypePayloadMap()); |
| 263 ui_loop_.RunAllPending(); | 270 ui_loop_.RunAllPending(); |
| 264 Mock::VerifyAndClearExpectations(&observer); | 271 Mock::VerifyAndClearExpectations(&observer); |
| 265 } | 272 } |
| 266 | 273 |
| 267 // Adds an observer on the I/O thread. Then triggers a refresh notification on | 274 // Adds an observer on the I/O thread. Then triggers a refresh notification on |
| 268 // the UI thread. We finally verify the proper notification was received by the | 275 // the UI thread. We finally verify the proper notification was received by the |
| 269 // observer and destroy it on the I/O thread. | 276 // observer and destroy it on the I/O thread. |
| 270 TEST_F(ChromeSyncNotificationBridgeTest, BasicThreaded) { | 277 TEST_F(ChromeSyncNotificationBridgeTest, BasicThreaded) { |
| 271 syncer::ModelTypePayloadMap payload_map; | 278 syncer::ModelTypePayloadMap payload_map; |
| 272 payload_map[syncer::SESSIONS] = ""; | 279 payload_map[syncer::SESSIONS] = ""; |
| 273 CreateObserverWithExpectedPayload(payload_map); | 280 CreateObserverWithExpectedPayload(payload_map); |
| 274 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, | 281 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, |
| 275 payload_map); | 282 payload_map); |
| 276 VerifyAndDestroyObserver(); | 283 VerifyAndDestroyObserver(); |
| 277 } | 284 } |
| 278 | 285 |
| 279 } // namespace | 286 } // namespace |
| 280 } // namespace browser_sync | 287 } // namespace browser_sync |
| OLD | NEW |