Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1547)

Side by Side Diff: chrome/browser/sync/glue/chrome_sync_notification_bridge_unittest.cc

Issue 10837214: Refactor ModelTypePayloadMap and ObjectIdPayloadMap to StateMaps. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix unit test Created 8 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 <cstddef> 7 #include <cstddef>
8 8
9 #include "base/compiler_specific.h" 9 #include "base/compiler_specific.h"
10 #include "base/memory/ref_counted.h" 10 #include "base/memory/ref_counted.h"
11 #include "base/memory/scoped_ptr.h" 11 #include "base/memory/scoped_ptr.h"
12 #include "base/memory/weak_ptr.h" 12 #include "base/memory/weak_ptr.h"
13 #include "base/message_loop.h" 13 #include "base/message_loop.h"
14 #include "base/sequenced_task_runner.h" 14 #include "base/sequenced_task_runner.h"
15 #include "base/synchronization/waitable_event.h" 15 #include "base/synchronization/waitable_event.h"
16 #include "base/test/test_timeouts.h" 16 #include "base/test/test_timeouts.h"
17 #include "base/threading/thread.h" 17 #include "base/threading/thread.h"
18 #include "chrome/common/chrome_notification_types.h" 18 #include "chrome/common/chrome_notification_types.h"
19 #include "chrome/test/base/profile_mock.h" 19 #include "chrome/test/base/profile_mock.h"
20 #include "content/public/browser/notification_details.h" 20 #include "content/public/browser/notification_details.h"
21 #include "content/public/browser/notification_service.h" 21 #include "content/public/browser/notification_service.h"
22 #include "content/public/test/test_browser_thread.h" 22 #include "content/public/test/test_browser_thread.h"
23 #include "sync/internal_api/public/base/model_type.h" 23 #include "sync/internal_api/public/base/model_type.h"
24 #include "sync/internal_api/public/base/model_type_payload_map.h" 24 #include "sync/internal_api/public/base/model_type_state_map.h"
25 #include "sync/notifier/object_id_state_map_test_util.h"
25 #include "sync/notifier/sync_notifier_observer.h" 26 #include "sync/notifier/sync_notifier_observer.h"
26 #include "testing/gmock/include/gmock/gmock.h" 27 #include "testing/gmock/include/gmock/gmock.h"
27 #include "testing/gtest/include/gtest/gtest.h" 28 #include "testing/gtest/include/gtest/gtest.h"
28 29
29 namespace browser_sync { 30 namespace browser_sync {
30 namespace { 31 namespace {
31 32
32 using ::testing::Mock; 33 using ::testing::Mock;
33 using ::testing::NiceMock; 34 using ::testing::NiceMock;
34 using ::testing::StrictMock; 35 using ::testing::StrictMock;
35 using content::BrowserThread; 36 using content::BrowserThread;
36 37
37 // Receives a ChromeSyncNotificationBridge to register to, and an expected 38 // Receives a ChromeSyncNotificationBridge to register to, and an expected
38 // ModelTypePayloadMap. ReceivedProperNotification() will return true only 39 // ModelTypeStateMap. ReceivedProperNotification() will return true only
39 // if the observer has received a notification with the proper source and 40 // if the observer has received a notification with the proper source and
40 // payload. 41 // state.
41 // Note: Because this object lives on the sync thread, we use a fake 42 // Note: Because this object lives on the sync thread, we use a fake
42 // (vs a mock) so we don't have to worry about possible thread safety 43 // (vs a mock) so we don't have to worry about possible thread safety
43 // issues within GTest/GMock. 44 // issues within GTest/GMock.
44 class FakeSyncNotifierObserver : public syncer::SyncNotifierObserver { 45 class FakeSyncNotifierObserver : public syncer::SyncNotifierObserver {
45 public: 46 public:
46 FakeSyncNotifierObserver( 47 FakeSyncNotifierObserver(
47 const scoped_refptr<base::SequencedTaskRunner>& sync_task_runner, 48 const scoped_refptr<base::SequencedTaskRunner>& sync_task_runner,
48 ChromeSyncNotificationBridge* bridge, 49 ChromeSyncNotificationBridge* bridge,
49 const syncer::ObjectIdPayloadMap& expected_payloads, 50 const syncer::ObjectIdStateMap& expected_states,
50 syncer::IncomingNotificationSource expected_source) 51 syncer::IncomingNotificationSource expected_source)
51 : sync_task_runner_(sync_task_runner), 52 : sync_task_runner_(sync_task_runner),
52 bridge_(bridge), 53 bridge_(bridge),
53 received_improper_notification_(false), 54 received_improper_notification_(false),
54 notification_count_(0), 55 notification_count_(0),
55 expected_payloads_(expected_payloads), 56 expected_states_(expected_states),
56 expected_source_(expected_source) { 57 expected_source_(expected_source) {
57 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread()); 58 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread());
58 bridge_->RegisterHandler(this); 59 bridge_->RegisterHandler(this);
59 const syncer::ObjectIdSet& ids = 60 const syncer::ObjectIdSet& ids =
60 syncer::ObjectIdPayloadMapToSet(expected_payloads); 61 syncer::ObjectIdStateMapToSet(expected_states);
61 bridge_->UpdateRegisteredIds(this, ids); 62 bridge_->UpdateRegisteredIds(this, ids);
62 } 63 }
63 64
64 virtual ~FakeSyncNotifierObserver() { 65 virtual ~FakeSyncNotifierObserver() {
65 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread()); 66 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread());
66 bridge_->UnregisterHandler(this); 67 bridge_->UnregisterHandler(this);
67 } 68 }
68 69
69 // SyncNotifierObserver implementation. 70 // SyncNotifierObserver implementation.
70 virtual void OnIncomingNotification( 71 virtual void OnIncomingNotification(
71 const syncer::ObjectIdPayloadMap& id_payloads, 72 const syncer::ObjectIdStateMap& id_state_map,
72 syncer::IncomingNotificationSource source) OVERRIDE { 73 syncer::IncomingNotificationSource source) OVERRIDE {
73 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread()); 74 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread());
74 notification_count_++; 75 notification_count_++;
75 if (source != expected_source_) { 76 if (source != expected_source_) {
76 LOG(ERROR) << "Received notification with wrong source"; 77 LOG(ERROR) << "Received notification with wrong source";
77 received_improper_notification_ = true; 78 received_improper_notification_ = true;
78 } 79 }
79 if (expected_payloads_ != id_payloads) { 80 if (!::testing::Matches(Eq(expected_states_))(id_state_map)) {
80 LOG(ERROR) << "Received wrong payload"; 81 LOG(ERROR) << "Received wrong state";
81 received_improper_notification_ = true; 82 received_improper_notification_ = true;
82 } 83 }
83 } 84 }
84 virtual void OnNotificationsEnabled() OVERRIDE { 85 virtual void OnNotificationsEnabled() OVERRIDE {
85 NOTREACHED(); 86 NOTREACHED();
86 } 87 }
87 virtual void OnNotificationsDisabled( 88 virtual void OnNotificationsDisabled(
88 syncer::NotificationsDisabledReason reason) OVERRIDE { 89 syncer::NotificationsDisabledReason reason) OVERRIDE {
89 NOTREACHED(); 90 NOTREACHED();
90 } 91 }
91 92
92 bool ReceivedProperNotification() const { 93 bool ReceivedProperNotification() const {
93 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread()); 94 DCHECK(sync_task_runner_->RunsTasksOnCurrentThread());
94 return (notification_count_ == 1) && !received_improper_notification_; 95 return (notification_count_ == 1) && !received_improper_notification_;
95 } 96 }
96 97
97 private: 98 private:
98 const scoped_refptr<base::SequencedTaskRunner> sync_task_runner_; 99 const scoped_refptr<base::SequencedTaskRunner> sync_task_runner_;
99 ChromeSyncNotificationBridge* const bridge_; 100 ChromeSyncNotificationBridge* const bridge_;
100 bool received_improper_notification_; 101 bool received_improper_notification_;
101 size_t notification_count_; 102 size_t notification_count_;
102 const syncer::ObjectIdPayloadMap expected_payloads_; 103 const syncer::ObjectIdStateMap expected_states_;
103 const syncer::IncomingNotificationSource expected_source_; 104 const syncer::IncomingNotificationSource expected_source_;
104 }; 105 };
105 106
106 class ChromeSyncNotificationBridgeTest : public testing::Test { 107 class ChromeSyncNotificationBridgeTest : public testing::Test {
107 public: 108 public:
108 ChromeSyncNotificationBridgeTest() 109 ChromeSyncNotificationBridgeTest()
109 : ui_thread_(BrowserThread::UI), 110 : ui_thread_(BrowserThread::UI),
110 sync_thread_("Sync thread"), 111 sync_thread_("Sync thread"),
111 sync_observer_(NULL), 112 sync_observer_(NULL),
112 sync_observer_notification_failure_(false), 113 sync_observer_notification_failure_(false),
(...skipping 22 matching lines...) Expand all
135 void VerifyAndDestroyObserver() { 136 void VerifyAndDestroyObserver() {
136 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask( 137 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask(
137 FROM_HERE, 138 FROM_HERE,
138 base::Bind(&ChromeSyncNotificationBridgeTest:: 139 base::Bind(&ChromeSyncNotificationBridgeTest::
139 VerifyAndDestroyObserverOnSyncThread, 140 VerifyAndDestroyObserverOnSyncThread,
140 base::Unretained(this)))); 141 base::Unretained(this))));
141 BlockForSyncThread(); 142 BlockForSyncThread();
142 } 143 }
143 144
144 void CreateObserverWithExpectations( 145 void CreateObserverWithExpectations(
145 const syncer::ModelTypePayloadMap& expected_payloads, 146 const syncer::ModelTypeStateMap& expected_states,
146 syncer::IncomingNotificationSource expected_source) { 147 syncer::IncomingNotificationSource expected_source) {
147 const syncer::ObjectIdPayloadMap& expected_id_payloads = 148 const syncer::ObjectIdStateMap& expected_id_state_map =
148 syncer::ModelTypePayloadMapToObjectIdPayloadMap(expected_payloads); 149 syncer::ModelTypeStateMapToObjectIdStateMap(expected_states);
149 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask( 150 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask(
150 FROM_HERE, 151 FROM_HERE,
151 base::Bind( 152 base::Bind(
152 &ChromeSyncNotificationBridgeTest::CreateObserverOnSyncThread, 153 &ChromeSyncNotificationBridgeTest::CreateObserverOnSyncThread,
153 base::Unretained(this), 154 base::Unretained(this),
154 expected_id_payloads, 155 expected_id_state_map,
155 expected_source))); 156 expected_source)));
156 BlockForSyncThread(); 157 BlockForSyncThread();
157 } 158 }
158 159
159 void UpdateBridgeEnabledTypes(syncer::ModelTypeSet enabled_types) { 160 void UpdateBridgeEnabledTypes(syncer::ModelTypeSet enabled_types) {
160 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask( 161 ASSERT_TRUE(sync_thread_.message_loop_proxy()->PostTask(
161 FROM_HERE, 162 FROM_HERE,
162 base::Bind( 163 base::Bind(
163 &ChromeSyncNotificationBridgeTest:: 164 &ChromeSyncNotificationBridgeTest::
164 UpdateBridgeEnabledTypesOnSyncThread, 165 UpdateBridgeEnabledTypesOnSyncThread,
165 base::Unretained(this), 166 base::Unretained(this),
166 enabled_types))); 167 enabled_types)));
167 BlockForSyncThread(); 168 BlockForSyncThread();
168 } 169 }
169 170
170 void TriggerRefreshNotification( 171 void TriggerRefreshNotification(
171 int type, 172 int type,
172 const syncer::ModelTypePayloadMap& payload_map) { 173 const syncer::ModelTypeStateMap& state_map) {
173 content::NotificationService::current()->Notify( 174 content::NotificationService::current()->Notify(
174 type, 175 type,
175 content::Source<Profile>(&mock_profile_), 176 content::Source<Profile>(&mock_profile_),
176 content::Details<const syncer::ModelTypePayloadMap>(&payload_map)); 177 content::Details<const syncer::ModelTypeStateMap>(&state_map));
177 } 178 }
178 179
179 private: 180 private:
180 void VerifyAndDestroyObserverOnSyncThread() { 181 void VerifyAndDestroyObserverOnSyncThread() {
181 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread()); 182 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread());
182 if (!sync_observer_) { 183 if (!sync_observer_) {
183 sync_observer_notification_failure_ = true; 184 sync_observer_notification_failure_ = true;
184 } else { 185 } else {
185 sync_observer_notification_failure_ = 186 sync_observer_notification_failure_ =
186 !sync_observer_->ReceivedProperNotification(); 187 !sync_observer_->ReceivedProperNotification();
187 delete sync_observer_; 188 delete sync_observer_;
188 sync_observer_ = NULL; 189 sync_observer_ = NULL;
189 } 190 }
190 } 191 }
191 192
192 void CreateObserverOnSyncThread( 193 void CreateObserverOnSyncThread(
193 const syncer::ObjectIdPayloadMap& expected_payloads, 194 const syncer::ObjectIdStateMap& expected_states,
194 syncer::IncomingNotificationSource expected_source) { 195 syncer::IncomingNotificationSource expected_source) {
195 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread()); 196 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread());
196 sync_observer_ = new FakeSyncNotifierObserver( 197 sync_observer_ = new FakeSyncNotifierObserver(
197 sync_thread_.message_loop_proxy(), 198 sync_thread_.message_loop_proxy(),
198 bridge_.get(), 199 bridge_.get(),
199 expected_payloads, 200 expected_states,
200 expected_source); 201 expected_source);
201 } 202 }
202 203
203 void UpdateBridgeEnabledTypesOnSyncThread( 204 void UpdateBridgeEnabledTypesOnSyncThread(
204 syncer::ModelTypeSet enabled_types) { 205 syncer::ModelTypeSet enabled_types) {
205 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread()); 206 DCHECK(sync_thread_.message_loop_proxy()->RunsTasksOnCurrentThread());
206 bridge_->UpdateEnabledTypes(enabled_types); 207 bridge_->UpdateEnabledTypes(enabled_types);
207 } 208 }
208 209
209 void SignalOnSyncThread() { 210 void SignalOnSyncThread() {
(...skipping 17 matching lines...) Expand all
227 NiceMock<ProfileMock> mock_profile_; 228 NiceMock<ProfileMock> mock_profile_;
228 // Created/used/destroyed on sync thread. 229 // Created/used/destroyed on sync thread.
229 FakeSyncNotifierObserver* sync_observer_; 230 FakeSyncNotifierObserver* sync_observer_;
230 bool sync_observer_notification_failure_; 231 bool sync_observer_notification_failure_;
231 scoped_ptr<ChromeSyncNotificationBridge> bridge_; 232 scoped_ptr<ChromeSyncNotificationBridge> bridge_;
232 base::WaitableEvent done_; 233 base::WaitableEvent done_;
233 }; 234 };
234 235
235 // Adds an observer on the sync thread, triggers a local refresh 236 // Adds an observer on the sync thread, triggers a local refresh
236 // notification, and ensures the bridge posts a LOCAL_NOTIFICATION 237 // notification, and ensures the bridge posts a LOCAL_NOTIFICATION
237 // with the proper payload to it. 238 // with the proper state to it.
238 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotification) { 239 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotification) {
239 syncer::ModelTypePayloadMap payload_map; 240 syncer::ModelTypeStateMap state_map;
240 payload_map[syncer::SESSIONS] = ""; 241 state_map.insert(
241 CreateObserverWithExpectations(payload_map, syncer::LOCAL_NOTIFICATION); 242 std::make_pair(syncer::SESSIONS, syncer::InvalidationState()));
243 CreateObserverWithExpectations(state_map, syncer::LOCAL_NOTIFICATION);
242 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, 244 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL,
243 payload_map); 245 state_map);
244 VerifyAndDestroyObserver(); 246 VerifyAndDestroyObserver();
245 } 247 }
246 248
247 // Adds an observer on the sync thread, triggers a remote refresh 249 // Adds an observer on the sync thread, triggers a remote refresh
248 // notification, and ensures the bridge posts a REMOTE_NOTIFICATION 250 // notification, and ensures the bridge posts a REMOTE_NOTIFICATION
249 // with the proper payload to it. 251 // with the proper state to it.
250 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotification) { 252 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotification) {
251 syncer::ModelTypePayloadMap payload_map; 253 syncer::ModelTypeStateMap state_map;
252 payload_map[syncer::SESSIONS] = ""; 254 state_map.insert(
253 CreateObserverWithExpectations(payload_map, syncer::REMOTE_NOTIFICATION); 255 std::make_pair(syncer::SESSIONS, syncer::InvalidationState()));
256 CreateObserverWithExpectations(state_map, syncer::REMOTE_NOTIFICATION);
254 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, 257 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
255 payload_map); 258 state_map);
256 VerifyAndDestroyObserver(); 259 VerifyAndDestroyObserver();
257 } 260 }
258 261
259 // Adds an observer on the sync thread, triggers a local refresh 262 // Adds an observer on the sync thread, triggers a local refresh
260 // notification with empty payload map and ensures the bridge posts a 263 // notification with empty state map and ensures the bridge posts a
261 // LOCAL_NOTIFICATION with the proper payload to it. 264 // LOCAL_NOTIFICATION with the proper state to it.
262 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotificationEmptyPayloadMap) { 265 TEST_F(ChromeSyncNotificationBridgeTest, LocalNotificationEmptyPayloadMap) {
263 const syncer::ModelTypeSet enabled_types( 266 const syncer::ModelTypeSet enabled_types(
264 syncer::BOOKMARKS, syncer::PASSWORDS); 267 syncer::BOOKMARKS, syncer::PASSWORDS);
265 const syncer::ModelTypePayloadMap enabled_types_payload_map = 268 const syncer::ModelTypeStateMap enabled_types_state_map =
266 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); 269 syncer::ModelTypeSetToStateMap(enabled_types, std::string());
267 CreateObserverWithExpectations( 270 CreateObserverWithExpectations(
268 enabled_types_payload_map, syncer::LOCAL_NOTIFICATION); 271 enabled_types_state_map, syncer::LOCAL_NOTIFICATION);
269 UpdateBridgeEnabledTypes(enabled_types); 272 UpdateBridgeEnabledTypes(enabled_types);
270 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL, 273 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_LOCAL,
271 syncer::ModelTypePayloadMap()); 274 syncer::ModelTypeStateMap());
272 VerifyAndDestroyObserver(); 275 VerifyAndDestroyObserver();
273 } 276 }
274 277
275 // Adds an observer on the sync thread, triggers a remote refresh 278 // Adds an observer on the sync thread, triggers a remote refresh
276 // notification with empty payload map and ensures the bridge posts a 279 // notification with empty state map and ensures the bridge posts a
277 // REMOTE_NOTIFICATION with the proper payload to it. 280 // REMOTE_NOTIFICATION with the proper state to it.
278 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotificationEmptyPayloadMap) { 281 TEST_F(ChromeSyncNotificationBridgeTest, RemoteNotificationEmptyPayloadMap) {
279 const syncer::ModelTypeSet enabled_types( 282 const syncer::ModelTypeSet enabled_types(
280 syncer::BOOKMARKS, syncer::TYPED_URLS); 283 syncer::BOOKMARKS, syncer::TYPED_URLS);
281 const syncer::ModelTypePayloadMap enabled_types_payload_map = 284 const syncer::ModelTypeStateMap enabled_types_state_map =
282 syncer::ModelTypePayloadMapFromEnumSet(enabled_types, std::string()); 285 syncer::ModelTypeSetToStateMap(enabled_types, std::string());
283 CreateObserverWithExpectations( 286 CreateObserverWithExpectations(
284 enabled_types_payload_map, syncer::REMOTE_NOTIFICATION); 287 enabled_types_state_map, syncer::REMOTE_NOTIFICATION);
285 UpdateBridgeEnabledTypes(enabled_types); 288 UpdateBridgeEnabledTypes(enabled_types);
286 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE, 289 TriggerRefreshNotification(chrome::NOTIFICATION_SYNC_REFRESH_REMOTE,
287 syncer::ModelTypePayloadMap()); 290 syncer::ModelTypeStateMap());
288 VerifyAndDestroyObserver(); 291 VerifyAndDestroyObserver();
289 } 292 }
290 293
291 } // namespace 294 } // namespace
292 } // namespace browser_sync 295 } // namespace browser_sync
OLDNEW
« no previous file with comments | « chrome/browser/sync/glue/chrome_sync_notification_bridge.cc ('k') | chrome/browser/sync/glue/session_change_processor.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698