OLD | NEW |
| (Empty) |
1 // Copyright 2013 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 <stddef.h> | |
6 | |
7 #include "base/bind.h" | |
8 #include "base/location.h" | |
9 #include "base/message_loop/message_loop.h" | |
10 #include "base/single_thread_task_runner.h" | |
11 #include "chromeos/dbus/nfc_adapter_client.h" | |
12 #include "chromeos/dbus/nfc_client_helpers.h" | |
13 #include "chromeos/dbus/nfc_device_client.h" | |
14 #include "chromeos/dbus/nfc_manager_client.h" | |
15 #include "chromeos/dbus/nfc_record_client.h" | |
16 #include "chromeos/dbus/nfc_tag_client.h" | |
17 #include "dbus/mock_bus.h" | |
18 #include "dbus/mock_object_proxy.h" | |
19 #include "testing/gmock/include/gmock/gmock.h" | |
20 #include "testing/gtest/include/gtest/gtest.h" | |
21 #include "third_party/cros_system_api/dbus/service_constants.h" | |
22 | |
23 using ::testing::_; | |
24 using ::testing::Invoke; | |
25 using ::testing::Mock; | |
26 using ::testing::Return; | |
27 | |
28 using chromeos::nfc_client_helpers::ObjectPathVector; | |
29 | |
30 namespace chromeos { | |
31 | |
32 namespace { | |
33 | |
34 // D-Bus service name used by the test. | |
35 const char kTestServiceName[] = "test.service.name"; | |
36 | |
37 // Object paths that are used for testing. | |
38 const char kTestManagerPath[] = "/test/nfc/manager"; | |
39 const char kTestAdapterPath0[] = "/test/nfc/adapter0"; | |
40 const char kTestAdapterPath1[] = "/test/nfc/adapter1"; | |
41 const char kTestDevicePath0[] = "/test/nfc/device0"; | |
42 const char kTestDevicePath1[] = "/test/nfc/device1"; | |
43 const char kTestRecordPath0[] = "/test/nfc/record0"; | |
44 const char kTestRecordPath1[] = "/test/nfc/record1"; | |
45 const char kTestRecordPath2[] = "/test/nfc/record2"; | |
46 const char kTestRecordPath3[] = "/test/nfc/record3"; | |
47 const char kTestTagPath0[] = "/test/nfc/tag0"; | |
48 const char kTestTagPath1[] = "/test/nfc/tag1"; | |
49 | |
50 class MockNfcManagerObserver : public NfcManagerClient::Observer { | |
51 public: | |
52 MOCK_METHOD1(AdapterAdded, void(const dbus::ObjectPath&)); | |
53 MOCK_METHOD1(AdapterRemoved, void(const dbus::ObjectPath&)); | |
54 MOCK_METHOD1(ManagerPropertyChanged, void(const std::string&)); | |
55 }; | |
56 | |
57 class MockNfcAdapterObserver : public NfcAdapterClient::Observer { | |
58 public: | |
59 MOCK_METHOD1(AdapterAdded, void(const dbus::ObjectPath&)); | |
60 MOCK_METHOD1(AdapterRemoved, void(const dbus::ObjectPath&)); | |
61 MOCK_METHOD2(AdapterPropertyChanged, void(const dbus::ObjectPath&, | |
62 const std::string&)); | |
63 }; | |
64 | |
65 class MockNfcDeviceObserver : public NfcDeviceClient::Observer { | |
66 public: | |
67 MOCK_METHOD1(DeviceAdded, void(const dbus::ObjectPath&)); | |
68 MOCK_METHOD1(DeviceRemoved, void(const dbus::ObjectPath&)); | |
69 MOCK_METHOD2(DevicePropertyChanged, void(const dbus::ObjectPath&, | |
70 const std::string&)); | |
71 }; | |
72 | |
73 class MockNfcRecordObserver : public NfcRecordClient::Observer { | |
74 public: | |
75 MOCK_METHOD1(RecordAdded, void(const dbus::ObjectPath&)); | |
76 MOCK_METHOD1(RecordRemoved, void(const dbus::ObjectPath&)); | |
77 MOCK_METHOD2(RecordPropertyChanged, void(const dbus::ObjectPath&, | |
78 const std::string&)); | |
79 MOCK_METHOD1(RecordPropertiesReceived, void(const dbus::ObjectPath&)); | |
80 }; | |
81 | |
82 class MockNfcTagObserver : public NfcTagClient::Observer { | |
83 public: | |
84 MOCK_METHOD1(TagAdded, void(const dbus::ObjectPath&)); | |
85 MOCK_METHOD1(TagRemoved, void(const dbus::ObjectPath&)); | |
86 MOCK_METHOD2(TagPropertyChanged, void(const dbus::ObjectPath&, | |
87 const std::string&)); | |
88 }; | |
89 | |
90 } // namespace | |
91 | |
92 class NfcClientTest : public testing::Test { | |
93 public: | |
94 NfcClientTest() : response_(NULL) {} | |
95 ~NfcClientTest() override {} | |
96 | |
97 void SetUp() override { | |
98 // Create the mock bus. | |
99 dbus::Bus::Options options; | |
100 options.bus_type = dbus::Bus::SYSTEM; | |
101 mock_bus_ = new dbus::MockBus(options); | |
102 | |
103 // Create the mock proxies. | |
104 mock_manager_proxy_ = new dbus::MockObjectProxy( | |
105 mock_bus_.get(), | |
106 kTestServiceName, | |
107 dbus::ObjectPath(kTestManagerPath)); | |
108 mock_adapter0_proxy_ = new dbus::MockObjectProxy( | |
109 mock_bus_.get(), | |
110 kTestServiceName, | |
111 dbus::ObjectPath(kTestAdapterPath0)); | |
112 mock_adapter1_proxy_ = new dbus::MockObjectProxy( | |
113 mock_bus_.get(), | |
114 kTestServiceName, | |
115 dbus::ObjectPath(kTestAdapterPath1)); | |
116 mock_device0_proxy_ = new dbus::MockObjectProxy( | |
117 mock_bus_.get(), | |
118 kTestServiceName, | |
119 dbus::ObjectPath(kTestDevicePath0)); | |
120 mock_device1_proxy_ = new dbus::MockObjectProxy( | |
121 mock_bus_.get(), | |
122 kTestServiceName, | |
123 dbus::ObjectPath(kTestDevicePath1)); | |
124 mock_record0_proxy_ = new dbus::MockObjectProxy( | |
125 mock_bus_.get(), | |
126 kTestServiceName, | |
127 dbus::ObjectPath(kTestRecordPath0)); | |
128 mock_record1_proxy_ = new dbus::MockObjectProxy( | |
129 mock_bus_.get(), | |
130 kTestServiceName, | |
131 dbus::ObjectPath(kTestRecordPath1)); | |
132 mock_record2_proxy_ = new dbus::MockObjectProxy( | |
133 mock_bus_.get(), | |
134 kTestServiceName, | |
135 dbus::ObjectPath(kTestRecordPath2)); | |
136 mock_record3_proxy_ = new dbus::MockObjectProxy( | |
137 mock_bus_.get(), | |
138 kTestServiceName, | |
139 dbus::ObjectPath(kTestRecordPath3)); | |
140 mock_tag0_proxy_ = new dbus::MockObjectProxy( | |
141 mock_bus_.get(), | |
142 kTestServiceName, | |
143 dbus::ObjectPath(kTestTagPath0)); | |
144 mock_tag1_proxy_ = new dbus::MockObjectProxy( | |
145 mock_bus_.get(), | |
146 kTestServiceName, | |
147 dbus::ObjectPath(kTestTagPath1)); | |
148 | |
149 // Set expectations that use NfcClientTest::OnConnectToSignal when the | |
150 // client connect signals on the mock proxies. | |
151 EXPECT_CALL(*mock_manager_proxy_.get(), ConnectToSignal(_, _, _, _)) | |
152 .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); | |
153 EXPECT_CALL(*mock_adapter0_proxy_.get(), ConnectToSignal(_, _, _, _)) | |
154 .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); | |
155 EXPECT_CALL(*mock_adapter1_proxy_.get(), ConnectToSignal(_, _, _, _)) | |
156 .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); | |
157 | |
158 // Set expectations that return our mock proxies on demand. | |
159 EXPECT_CALL( | |
160 *mock_bus_.get(), | |
161 GetObjectProxy(nfc_manager::kNfcManagerServiceName, | |
162 dbus::ObjectPath(nfc_manager::kNfcManagerServicePath))) | |
163 .WillRepeatedly(Return(mock_manager_proxy_.get())); | |
164 EXPECT_CALL(*mock_bus_.get(), | |
165 GetObjectProxy(nfc_adapter::kNfcAdapterServiceName, | |
166 dbus::ObjectPath(kTestAdapterPath0))) | |
167 .WillRepeatedly(Return(mock_adapter0_proxy_.get())); | |
168 EXPECT_CALL(*mock_bus_.get(), | |
169 GetObjectProxy(nfc_adapter::kNfcAdapterServiceName, | |
170 dbus::ObjectPath(kTestAdapterPath1))) | |
171 .WillRepeatedly(Return(mock_adapter1_proxy_.get())); | |
172 EXPECT_CALL(*mock_bus_.get(), | |
173 GetObjectProxy(nfc_device::kNfcDeviceServiceName, | |
174 dbus::ObjectPath(kTestDevicePath0))) | |
175 .WillRepeatedly(Return(mock_device0_proxy_.get())); | |
176 EXPECT_CALL(*mock_bus_.get(), | |
177 GetObjectProxy(nfc_device::kNfcDeviceServiceName, | |
178 dbus::ObjectPath(kTestDevicePath1))) | |
179 .WillRepeatedly(Return(mock_device1_proxy_.get())); | |
180 EXPECT_CALL(*mock_bus_.get(), | |
181 GetObjectProxy(nfc_record::kNfcRecordServiceName, | |
182 dbus::ObjectPath(kTestRecordPath0))) | |
183 .WillRepeatedly(Return(mock_record0_proxy_.get())); | |
184 EXPECT_CALL(*mock_bus_.get(), | |
185 GetObjectProxy(nfc_record::kNfcRecordServiceName, | |
186 dbus::ObjectPath(kTestRecordPath1))) | |
187 .WillRepeatedly(Return(mock_record1_proxy_.get())); | |
188 EXPECT_CALL(*mock_bus_.get(), | |
189 GetObjectProxy(nfc_record::kNfcRecordServiceName, | |
190 dbus::ObjectPath(kTestRecordPath2))) | |
191 .WillRepeatedly(Return(mock_record2_proxy_.get())); | |
192 EXPECT_CALL(*mock_bus_.get(), | |
193 GetObjectProxy(nfc_record::kNfcRecordServiceName, | |
194 dbus::ObjectPath(kTestRecordPath3))) | |
195 .WillRepeatedly(Return(mock_record3_proxy_.get())); | |
196 EXPECT_CALL(*mock_bus_.get(), | |
197 GetObjectProxy(nfc_tag::kNfcTagServiceName, | |
198 dbus::ObjectPath(kTestTagPath0))) | |
199 .WillRepeatedly(Return(mock_tag0_proxy_.get())); | |
200 EXPECT_CALL(*mock_bus_.get(), | |
201 GetObjectProxy(nfc_tag::kNfcTagServiceName, | |
202 dbus::ObjectPath(kTestTagPath1))) | |
203 .WillRepeatedly(Return(mock_tag1_proxy_.get())); | |
204 | |
205 // Handle |manager_client_|'s request to register a callback | |
206 // for |mock_manager_proxy_|'s D-Bus service becoming available. | |
207 EXPECT_CALL(*mock_manager_proxy_.get(), WaitForServiceToBeAvailable(_)) | |
208 .WillRepeatedly( | |
209 Invoke(this, &NfcClientTest::OnWaitForServiceToBeAvailable)); | |
210 | |
211 // ShutdownAndBlock will be called in TearDown. | |
212 EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return()); | |
213 | |
214 // Create the clients. | |
215 manager_client_.reset(NfcManagerClient::Create()); | |
216 adapter_client_.reset(NfcAdapterClient::Create(manager_client_.get())); | |
217 device_client_.reset(NfcDeviceClient::Create(adapter_client_.get())); | |
218 tag_client_.reset(NfcTagClient::Create(adapter_client_.get())); | |
219 record_client_.reset( | |
220 NfcRecordClient::Create(device_client_.get(), tag_client_.get())); | |
221 manager_client_->Init(mock_bus_.get()); | |
222 adapter_client_->Init(mock_bus_.get()); | |
223 device_client_->Init(mock_bus_.get()); | |
224 tag_client_->Init(mock_bus_.get()); | |
225 record_client_->Init(mock_bus_.get()); | |
226 manager_client_->AddObserver(&mock_manager_observer_); | |
227 adapter_client_->AddObserver(&mock_adapter_observer_); | |
228 device_client_->AddObserver(&mock_device_observer_); | |
229 tag_client_->AddObserver(&mock_tag_observer_); | |
230 record_client_->AddObserver(&mock_record_observer_); | |
231 | |
232 message_loop_.RunUntilIdle(); | |
233 } | |
234 | |
235 void TearDown() override { | |
236 tag_client_->RemoveObserver(&mock_tag_observer_); | |
237 device_client_->RemoveObserver(&mock_device_observer_); | |
238 adapter_client_->RemoveObserver(&mock_adapter_observer_); | |
239 manager_client_->RemoveObserver(&mock_manager_observer_); | |
240 mock_bus_->ShutdownAndBlock(); | |
241 } | |
242 | |
243 void SimulateAdaptersChanged( | |
244 const ObjectPathVector& adapter_paths) { | |
245 NfcManagerClient::Properties* properties = | |
246 manager_client_->GetProperties(); | |
247 ASSERT_TRUE(properties); | |
248 EXPECT_CALL(mock_manager_observer_, | |
249 ManagerPropertyChanged(nfc_manager::kAdaptersProperty)); | |
250 SendArrayPropertyChangedSignal( | |
251 properties, | |
252 nfc_manager::kNfcManagerInterface, | |
253 nfc_manager::kAdaptersProperty, | |
254 adapter_paths); | |
255 Mock::VerifyAndClearExpectations(&mock_manager_observer_); | |
256 } | |
257 | |
258 void SimulateTagsChanged(const ObjectPathVector& tag_paths, | |
259 const dbus::ObjectPath& adapter_path) { | |
260 NfcAdapterClient::Properties* properties = | |
261 adapter_client_->GetProperties(adapter_path); | |
262 ASSERT_TRUE(properties); | |
263 EXPECT_CALL(mock_adapter_observer_, | |
264 AdapterPropertyChanged(adapter_path, | |
265 nfc_adapter::kTagsProperty)); | |
266 SendArrayPropertyChangedSignal( | |
267 properties, | |
268 nfc_adapter::kNfcAdapterInterface, | |
269 nfc_adapter::kTagsProperty, | |
270 tag_paths); | |
271 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); | |
272 } | |
273 | |
274 void SimulateDevicesChanged(const ObjectPathVector& device_paths, | |
275 const dbus::ObjectPath& adapter_path) { | |
276 NfcAdapterClient::Properties* properties = | |
277 adapter_client_->GetProperties(adapter_path); | |
278 ASSERT_TRUE(properties); | |
279 EXPECT_CALL(mock_adapter_observer_, | |
280 AdapterPropertyChanged(adapter_path, | |
281 nfc_adapter::kDevicesProperty)); | |
282 SendArrayPropertyChangedSignal( | |
283 properties, | |
284 nfc_adapter::kNfcAdapterInterface, | |
285 nfc_adapter::kDevicesProperty, | |
286 device_paths); | |
287 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); | |
288 } | |
289 | |
290 void SimulateDeviceRecordsChanged( | |
291 const ObjectPathVector& record_paths, | |
292 const dbus::ObjectPath& device_path) { | |
293 NfcDeviceClient::Properties* properties = | |
294 device_client_->GetProperties(device_path); | |
295 ASSERT_TRUE(properties); | |
296 EXPECT_CALL(mock_device_observer_, | |
297 DevicePropertyChanged(device_path, | |
298 nfc_device::kRecordsProperty)); | |
299 SendArrayPropertyChangedSignal( | |
300 properties, | |
301 nfc_device::kNfcDeviceInterface, | |
302 nfc_device::kRecordsProperty, | |
303 record_paths); | |
304 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
305 } | |
306 | |
307 void SimulateTagRecordsChanged( | |
308 const ObjectPathVector& record_paths, | |
309 const dbus::ObjectPath& tag_path) { | |
310 NfcTagClient::Properties* properties = | |
311 tag_client_->GetProperties(tag_path); | |
312 ASSERT_TRUE(properties); | |
313 EXPECT_CALL(mock_tag_observer_, | |
314 TagPropertyChanged(tag_path, | |
315 nfc_tag::kRecordsProperty)); | |
316 SendArrayPropertyChangedSignal( | |
317 properties, | |
318 nfc_tag::kNfcTagInterface, | |
319 nfc_tag::kRecordsProperty, | |
320 record_paths); | |
321 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
322 } | |
323 | |
324 void SendArrayPropertyChangedSignal( | |
325 dbus::PropertySet* properties, | |
326 const std::string& interface, | |
327 const std::string& property_name, | |
328 ObjectPathVector object_paths) { | |
329 dbus::Signal signal(interface, nfc_common::kPropertyChangedSignal); | |
330 dbus::MessageWriter writer(&signal); | |
331 writer.AppendString(property_name); | |
332 dbus::MessageWriter variant_writer(NULL); | |
333 writer.OpenVariant("ao", &variant_writer); | |
334 variant_writer.AppendArrayOfObjectPaths(object_paths); | |
335 writer.CloseContainer(&variant_writer); | |
336 properties->ChangedReceived(&signal); | |
337 } | |
338 | |
339 MOCK_METHOD0(SuccessCallback, void(void)); | |
340 MOCK_METHOD2(ErrorCallback, void(const std::string& error_name, | |
341 const std::string& error_message)); | |
342 | |
343 protected: | |
344 // The mock object proxies. | |
345 scoped_refptr<dbus::MockObjectProxy> mock_manager_proxy_; | |
346 scoped_refptr<dbus::MockObjectProxy> mock_adapter0_proxy_; | |
347 scoped_refptr<dbus::MockObjectProxy> mock_adapter1_proxy_; | |
348 scoped_refptr<dbus::MockObjectProxy> mock_device0_proxy_; | |
349 scoped_refptr<dbus::MockObjectProxy> mock_device1_proxy_; | |
350 scoped_refptr<dbus::MockObjectProxy> mock_record0_proxy_; | |
351 scoped_refptr<dbus::MockObjectProxy> mock_record1_proxy_; | |
352 scoped_refptr<dbus::MockObjectProxy> mock_record2_proxy_; | |
353 scoped_refptr<dbus::MockObjectProxy> mock_record3_proxy_; | |
354 scoped_refptr<dbus::MockObjectProxy> mock_tag0_proxy_; | |
355 scoped_refptr<dbus::MockObjectProxy> mock_tag1_proxy_; | |
356 // The mock bus. | |
357 scoped_refptr<dbus::MockBus> mock_bus_; | |
358 // A message loop to emulate asynchronous behavior. | |
359 base::MessageLoop message_loop_; | |
360 // Response returned by mock methods. | |
361 dbus::Response* response_; | |
362 // The D-Bus client objects under test. | |
363 std::unique_ptr<NfcManagerClient> manager_client_; | |
364 std::unique_ptr<NfcAdapterClient> adapter_client_; | |
365 std::unique_ptr<NfcDeviceClient> device_client_; | |
366 std::unique_ptr<NfcTagClient> tag_client_; | |
367 std::unique_ptr<NfcRecordClient> record_client_; | |
368 // Mock observers. | |
369 MockNfcManagerObserver mock_manager_observer_; | |
370 MockNfcAdapterObserver mock_adapter_observer_; | |
371 MockNfcDeviceObserver mock_device_observer_; | |
372 MockNfcTagObserver mock_tag_observer_; | |
373 MockNfcRecordObserver mock_record_observer_; | |
374 // The signal callbacks used to simulate asychronous signals. | |
375 dbus::ObjectProxy::SignalCallback manager_adapter_added_signal_callback_; | |
376 dbus::ObjectProxy::SignalCallback manager_adapter_removed_signal_callback_; | |
377 | |
378 private: | |
379 // Used to inform |manager_client_| that |mock_manager_proxy_| is ready. | |
380 void OnWaitForServiceToBeAvailable( | |
381 dbus::ObjectProxy::WaitForServiceToBeAvailableCallback callback) { | |
382 message_loop_.task_runner()->PostTask(FROM_HERE, | |
383 base::Bind(callback, true)); | |
384 } | |
385 | |
386 // Used to implement the mock proxy. | |
387 void OnConnectToSignal( | |
388 const std::string& interface_name, | |
389 const std::string& signal_name, | |
390 const dbus::ObjectProxy::SignalCallback& signal_callback, | |
391 const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) { | |
392 if (interface_name == nfc_manager::kNfcManagerInterface) { | |
393 if (signal_name == nfc_manager::kAdapterAddedSignal) | |
394 manager_adapter_added_signal_callback_ = signal_callback; | |
395 else if (signal_name == nfc_manager::kAdapterRemovedSignal) | |
396 manager_adapter_removed_signal_callback_ = signal_callback; | |
397 } | |
398 message_loop_.task_runner()->PostTask( | |
399 FROM_HERE, | |
400 base::Bind(on_connected_callback, interface_name, signal_name, true)); | |
401 } | |
402 }; | |
403 | |
404 // Tests that when adapters are added and removed through the manager, all | |
405 // observers are notified and the proxies are created and removed | |
406 // accordingly. | |
407 TEST_F(NfcClientTest, AdaptersAddedAndRemoved) { | |
408 // Invoking methods on adapters that haven't been added should fail. | |
409 EXPECT_CALL(*this, | |
410 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
411 adapter_client_->StartPollLoop( | |
412 dbus::ObjectPath(kTestAdapterPath0), | |
413 nfc_adapter::kModeInitiator, | |
414 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
415 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
416 Mock::VerifyAndClearExpectations(this); | |
417 | |
418 // Add adapter 0. | |
419 ObjectPathVector adapter_paths; | |
420 adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); | |
421 EXPECT_CALL(mock_adapter_observer_, | |
422 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); | |
423 SimulateAdaptersChanged(adapter_paths); | |
424 | |
425 // Invoking methods should succeed on adapter 0 but fail on adapter 1. | |
426 EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
427 adapter_client_->StartPollLoop( | |
428 dbus::ObjectPath(kTestAdapterPath0), | |
429 nfc_adapter::kModeInitiator, | |
430 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
431 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
432 Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); | |
433 EXPECT_CALL(*this, | |
434 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
435 EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
436 .Times(1); | |
437 adapter_client_->StartPollLoop( | |
438 dbus::ObjectPath(kTestAdapterPath1), | |
439 nfc_adapter::kModeInitiator, | |
440 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
441 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
442 Mock::VerifyAndClearExpectations(this); | |
443 Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); | |
444 | |
445 // Add adapter 1. | |
446 adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); | |
447 EXPECT_CALL(mock_adapter_observer_, | |
448 AdapterAdded(dbus::ObjectPath(kTestAdapterPath1))); | |
449 SimulateAdaptersChanged(adapter_paths); | |
450 | |
451 // Invoking methods should succeed on both adapters. | |
452 EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
453 EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
454 adapter_client_->StartPollLoop( | |
455 dbus::ObjectPath(kTestAdapterPath0), | |
456 nfc_adapter::kModeInitiator, | |
457 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
458 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
459 adapter_client_->StartPollLoop( | |
460 dbus::ObjectPath(kTestAdapterPath1), | |
461 nfc_adapter::kModeInitiator, | |
462 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
463 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
464 Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); | |
465 Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); | |
466 | |
467 // Remove adapter 0. | |
468 adapter_paths.erase(adapter_paths.begin()); | |
469 EXPECT_CALL(mock_adapter_observer_, | |
470 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath0))); | |
471 SimulateAdaptersChanged(adapter_paths); | |
472 | |
473 // Invoking methods should succeed on adapter 1 but fail on adapter 0. | |
474 EXPECT_CALL(*this, | |
475 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
476 EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
477 .Times(0); | |
478 adapter_client_->StartPollLoop( | |
479 dbus::ObjectPath(kTestAdapterPath0), | |
480 nfc_adapter::kModeInitiator, | |
481 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
482 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
483 Mock::VerifyAndClearExpectations(this); | |
484 | |
485 EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
486 adapter_client_->StartPollLoop( | |
487 dbus::ObjectPath(kTestAdapterPath1), | |
488 nfc_adapter::kModeInitiator, | |
489 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
490 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
491 Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); | |
492 Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); | |
493 | |
494 // Remove adapter 1. | |
495 adapter_paths.clear(); | |
496 EXPECT_CALL(mock_adapter_observer_, | |
497 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath1))); | |
498 SimulateAdaptersChanged(adapter_paths); | |
499 | |
500 // Invoking methods should fail on both adapters. | |
501 EXPECT_CALL(*this, | |
502 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) | |
503 .Times(2); | |
504 EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
505 .Times(0); | |
506 EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
507 .Times(0); | |
508 adapter_client_->StartPollLoop( | |
509 dbus::ObjectPath(kTestAdapterPath0), | |
510 nfc_adapter::kModeInitiator, | |
511 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
512 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
513 adapter_client_->StartPollLoop( | |
514 dbus::ObjectPath(kTestAdapterPath1), | |
515 nfc_adapter::kModeInitiator, | |
516 base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), | |
517 base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); | |
518 } | |
519 | |
520 // Tests that when tags are added and removed through an adapter, all | |
521 // observers are notified and the proxies are created and removed | |
522 // accordingly. | |
523 TEST_F(NfcClientTest, TagsAddedAndRemoved) { | |
524 // Invoking methods on tags that haven't been added should fail. | |
525 EXPECT_CALL(*this, | |
526 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
527 base::DictionaryValue write_data; | |
528 write_data.SetString(nfc_record::kTypeProperty, nfc_record::kTypeText); | |
529 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, | |
530 base::Bind(&NfcClientTest::SuccessCallback, | |
531 base::Unretained(this)), | |
532 base::Bind(&NfcClientTest::ErrorCallback, | |
533 base::Unretained(this))); | |
534 Mock::VerifyAndClearExpectations(this); | |
535 | |
536 // Add adapter 0. | |
537 ObjectPathVector adapter_paths; | |
538 adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); | |
539 EXPECT_CALL(mock_adapter_observer_, | |
540 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); | |
541 SimulateAdaptersChanged(adapter_paths); | |
542 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); | |
543 | |
544 // Add tag 0. | |
545 ObjectPathVector tag_paths; | |
546 tag_paths.push_back(dbus::ObjectPath(kTestTagPath0)); | |
547 EXPECT_CALL(mock_tag_observer_, | |
548 TagAdded(dbus::ObjectPath(kTestTagPath0))); | |
549 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
550 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
551 | |
552 // Invoking methods should succeed on tag 0 but fail on tag 1. | |
553 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
554 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, | |
555 base::Bind(&NfcClientTest::SuccessCallback, | |
556 base::Unretained(this)), | |
557 base::Bind(&NfcClientTest::ErrorCallback, | |
558 base::Unretained(this))); | |
559 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); | |
560 EXPECT_CALL(*this, | |
561 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
562 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
563 .Times(1); | |
564 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, | |
565 base::Bind(&NfcClientTest::SuccessCallback, | |
566 base::Unretained(this)), | |
567 base::Bind(&NfcClientTest::ErrorCallback, | |
568 base::Unretained(this))); | |
569 Mock::VerifyAndClearExpectations(this); | |
570 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); | |
571 | |
572 // Add tag 1. | |
573 tag_paths.push_back(dbus::ObjectPath(kTestTagPath1)); | |
574 EXPECT_CALL(mock_tag_observer_, | |
575 TagAdded(dbus::ObjectPath(kTestTagPath1))); | |
576 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
577 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
578 | |
579 // Invoking methods should succeed on both tags. | |
580 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
581 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
582 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, | |
583 base::Bind(&NfcClientTest::SuccessCallback, | |
584 base::Unretained(this)), | |
585 base::Bind(&NfcClientTest::ErrorCallback, | |
586 base::Unretained(this))); | |
587 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, | |
588 base::Bind(&NfcClientTest::SuccessCallback, | |
589 base::Unretained(this)), | |
590 base::Bind(&NfcClientTest::ErrorCallback, | |
591 base::Unretained(this))); | |
592 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); | |
593 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); | |
594 | |
595 // Remove tag 0. | |
596 tag_paths.erase(tag_paths.begin()); | |
597 EXPECT_CALL(mock_tag_observer_, | |
598 TagRemoved(dbus::ObjectPath(kTestTagPath0))); | |
599 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
600 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
601 | |
602 // Invoking methods should succeed on tag 1 but fail on tag 0. | |
603 EXPECT_CALL(*this, | |
604 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
605 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
606 .Times(0); | |
607 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, | |
608 base::Bind(&NfcClientTest::SuccessCallback, | |
609 base::Unretained(this)), | |
610 base::Bind(&NfcClientTest::ErrorCallback, | |
611 base::Unretained(this))); | |
612 Mock::VerifyAndClearExpectations(this); | |
613 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); | |
614 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
615 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, | |
616 base::Bind(&NfcClientTest::SuccessCallback, | |
617 base::Unretained(this)), | |
618 base::Bind(&NfcClientTest::ErrorCallback, | |
619 base::Unretained(this))); | |
620 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); | |
621 | |
622 // Remove tag 1. | |
623 tag_paths.clear(); | |
624 EXPECT_CALL(mock_tag_observer_, | |
625 TagRemoved(dbus::ObjectPath(kTestTagPath1))); | |
626 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
627 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
628 | |
629 // Invoking methods should fail on both tags. | |
630 EXPECT_CALL(*this, | |
631 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) | |
632 .Times(2); | |
633 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
634 .Times(0); | |
635 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
636 .Times(0); | |
637 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, | |
638 base::Bind(&NfcClientTest::SuccessCallback, | |
639 base::Unretained(this)), | |
640 base::Bind(&NfcClientTest::ErrorCallback, | |
641 base::Unretained(this))); | |
642 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, | |
643 base::Bind(&NfcClientTest::SuccessCallback, | |
644 base::Unretained(this)), | |
645 base::Bind(&NfcClientTest::ErrorCallback, | |
646 base::Unretained(this))); | |
647 } | |
648 | |
649 // Tests that when devices are added and removed through an adapter, all | |
650 // observers are notified and the proxies are created and removed | |
651 // accordingly. | |
652 TEST_F(NfcClientTest, DevicesAddedAndRemoved) { | |
653 // Invoking methods on devices that haven't been added should fail. | |
654 EXPECT_CALL(*this, | |
655 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
656 base::DictionaryValue write_data; | |
657 write_data.SetString(nfc_record::kTypeProperty, nfc_record::kTypeText); | |
658 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, | |
659 base::Bind(&NfcClientTest::SuccessCallback, | |
660 base::Unretained(this)), | |
661 base::Bind(&NfcClientTest::ErrorCallback, | |
662 base::Unretained(this))); | |
663 Mock::VerifyAndClearExpectations(this); | |
664 | |
665 // Add adapter 0. | |
666 ObjectPathVector adapter_paths; | |
667 adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); | |
668 EXPECT_CALL(mock_adapter_observer_, | |
669 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); | |
670 SimulateAdaptersChanged(adapter_paths); | |
671 | |
672 // Add device 0. | |
673 ObjectPathVector device_paths; | |
674 device_paths.push_back(dbus::ObjectPath(kTestDevicePath0)); | |
675 EXPECT_CALL(mock_device_observer_, | |
676 DeviceAdded(dbus::ObjectPath(kTestDevicePath0))); | |
677 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
678 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
679 | |
680 // Invoking methods should succeed on device 0 but fail on device 1. | |
681 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
682 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, | |
683 base::Bind(&NfcClientTest::SuccessCallback, | |
684 base::Unretained(this)), | |
685 base::Bind(&NfcClientTest::ErrorCallback, | |
686 base::Unretained(this))); | |
687 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); | |
688 EXPECT_CALL(*this, | |
689 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
690 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
691 .Times(1); | |
692 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, | |
693 base::Bind(&NfcClientTest::SuccessCallback, | |
694 base::Unretained(this)), | |
695 base::Bind(&NfcClientTest::ErrorCallback, | |
696 base::Unretained(this))); | |
697 Mock::VerifyAndClearExpectations(this); | |
698 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); | |
699 | |
700 // Add device 1. | |
701 device_paths.push_back(dbus::ObjectPath(kTestDevicePath1)); | |
702 EXPECT_CALL(mock_device_observer_, | |
703 DeviceAdded(dbus::ObjectPath(kTestDevicePath1))); | |
704 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
705 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
706 | |
707 // Invoking methods should succeed on both devices. | |
708 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
709 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
710 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, | |
711 base::Bind(&NfcClientTest::SuccessCallback, | |
712 base::Unretained(this)), | |
713 base::Bind(&NfcClientTest::ErrorCallback, | |
714 base::Unretained(this))); | |
715 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, | |
716 base::Bind(&NfcClientTest::SuccessCallback, | |
717 base::Unretained(this)), | |
718 base::Bind(&NfcClientTest::ErrorCallback, | |
719 base::Unretained(this))); | |
720 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); | |
721 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); | |
722 | |
723 // Remove device 0. | |
724 device_paths.erase(device_paths.begin()); | |
725 EXPECT_CALL(mock_device_observer_, | |
726 DeviceRemoved(dbus::ObjectPath(kTestDevicePath0))); | |
727 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
728 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
729 | |
730 // Invoking methods should succeed on device 1 but fail on device 0. | |
731 EXPECT_CALL(*this, | |
732 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); | |
733 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
734 .Times(0); | |
735 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, | |
736 base::Bind(&NfcClientTest::SuccessCallback, | |
737 base::Unretained(this)), | |
738 base::Bind(&NfcClientTest::ErrorCallback, | |
739 base::Unretained(this))); | |
740 Mock::VerifyAndClearExpectations(this); | |
741 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); | |
742 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); | |
743 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, | |
744 base::Bind(&NfcClientTest::SuccessCallback, | |
745 base::Unretained(this)), | |
746 base::Bind(&NfcClientTest::ErrorCallback, | |
747 base::Unretained(this))); | |
748 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); | |
749 | |
750 // Remove device 1. | |
751 device_paths.clear(); | |
752 EXPECT_CALL(mock_device_observer_, | |
753 DeviceRemoved(dbus::ObjectPath(kTestDevicePath1))); | |
754 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
755 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
756 | |
757 // Invoking methods should fail on both devices. | |
758 EXPECT_CALL(*this, | |
759 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) | |
760 .Times(2); | |
761 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
762 .Times(0); | |
763 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) | |
764 .Times(0); | |
765 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, | |
766 base::Bind(&NfcClientTest::SuccessCallback, | |
767 base::Unretained(this)), | |
768 base::Bind(&NfcClientTest::ErrorCallback, | |
769 base::Unretained(this))); | |
770 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, | |
771 base::Bind(&NfcClientTest::SuccessCallback, | |
772 base::Unretained(this)), | |
773 base::Bind(&NfcClientTest::ErrorCallback, | |
774 base::Unretained(this))); | |
775 } | |
776 | |
777 TEST_F(NfcClientTest, ObjectCleanup) { | |
778 // Tests that when an adapter gets removed, proxies that belong to the | |
779 // adapter, device, tag, and record hierarchy get cleaned up properly. | |
780 ObjectPathVector object_paths; | |
781 | |
782 // Add adapters. | |
783 EXPECT_CALL(mock_adapter_observer_, | |
784 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); | |
785 EXPECT_CALL(mock_adapter_observer_, | |
786 AdapterAdded(dbus::ObjectPath(kTestAdapterPath1))); | |
787 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); | |
788 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); | |
789 SimulateAdaptersChanged(object_paths); | |
790 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); | |
791 | |
792 // Add devices and a tags. Assign them like the following: | |
793 // - device 0 -> adapter 0 | |
794 // - tag 0 -> adapter 0 | |
795 // - device 1 -> adapter 1 | |
796 // - tag 1 -> adapter 1 | |
797 EXPECT_CALL(mock_device_observer_, | |
798 DeviceAdded(dbus::ObjectPath(kTestDevicePath0))); | |
799 EXPECT_CALL(mock_device_observer_, | |
800 DeviceAdded(dbus::ObjectPath(kTestDevicePath1))); | |
801 EXPECT_CALL(mock_tag_observer_, | |
802 TagAdded(dbus::ObjectPath(kTestTagPath0))); | |
803 EXPECT_CALL(mock_tag_observer_, | |
804 TagAdded(dbus::ObjectPath(kTestTagPath1))); | |
805 object_paths.clear(); | |
806 object_paths.push_back(dbus::ObjectPath(kTestDevicePath0)); | |
807 SimulateDevicesChanged(object_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
808 object_paths.clear(); | |
809 object_paths.push_back(dbus::ObjectPath(kTestTagPath0)); | |
810 SimulateTagsChanged(object_paths, dbus::ObjectPath(kTestAdapterPath0)); | |
811 object_paths.clear(); | |
812 object_paths.push_back(dbus::ObjectPath(kTestDevicePath1)); | |
813 SimulateDevicesChanged(object_paths, dbus::ObjectPath(kTestAdapterPath1)); | |
814 object_paths.clear(); | |
815 object_paths.push_back(dbus::ObjectPath(kTestTagPath1)); | |
816 SimulateTagsChanged(object_paths, dbus::ObjectPath(kTestAdapterPath1)); | |
817 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
818 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
819 | |
820 // Add records. Assign them like the following: | |
821 // - record 0 -> device 0 | |
822 // - record 1 -> tag 0 | |
823 // - record 2 -> device 1 | |
824 // - record 3 -> tag 1 | |
825 EXPECT_CALL(mock_record_observer_, | |
826 RecordAdded(dbus::ObjectPath(kTestRecordPath0))); | |
827 EXPECT_CALL(mock_record_observer_, | |
828 RecordAdded(dbus::ObjectPath(kTestRecordPath1))); | |
829 EXPECT_CALL(mock_record_observer_, | |
830 RecordAdded(dbus::ObjectPath(kTestRecordPath2))); | |
831 EXPECT_CALL(mock_record_observer_, | |
832 RecordAdded(dbus::ObjectPath(kTestRecordPath3))); | |
833 object_paths.clear(); | |
834 object_paths.push_back(dbus::ObjectPath(kTestRecordPath0)); | |
835 SimulateDeviceRecordsChanged(object_paths, | |
836 dbus::ObjectPath(kTestDevicePath0)); | |
837 object_paths.clear(); | |
838 object_paths.push_back(dbus::ObjectPath(kTestRecordPath1)); | |
839 SimulateTagRecordsChanged(object_paths, | |
840 dbus::ObjectPath(kTestTagPath0)); | |
841 object_paths.clear(); | |
842 object_paths.push_back(dbus::ObjectPath(kTestRecordPath2)); | |
843 SimulateDeviceRecordsChanged(object_paths, | |
844 dbus::ObjectPath(kTestDevicePath1)); | |
845 object_paths.clear(); | |
846 object_paths.push_back(dbus::ObjectPath(kTestRecordPath3)); | |
847 SimulateTagRecordsChanged(object_paths, | |
848 dbus::ObjectPath(kTestTagPath1)); | |
849 Mock::VerifyAndClearExpectations(&mock_record_observer_); | |
850 | |
851 // Check that the records have been assigned to the correct device or tag. | |
852 NfcTagClient::Properties* tag_properties = | |
853 tag_client_->GetProperties(dbus::ObjectPath(kTestTagPath0)); | |
854 EXPECT_EQ((size_t)1, tag_properties->records.value().size()); | |
855 EXPECT_EQ(dbus::ObjectPath(kTestRecordPath1), | |
856 tag_properties->records.value()[0]); | |
857 NfcDeviceClient::Properties* device_properties = | |
858 device_client_->GetProperties(dbus::ObjectPath(kTestDevicePath0)); | |
859 EXPECT_EQ((size_t)1, device_properties->records.value().size()); | |
860 EXPECT_EQ(dbus::ObjectPath(kTestRecordPath0), | |
861 device_properties->records.value()[0]); | |
862 | |
863 // Remove adapter 0. Make sure that all of the tag, device, and records that | |
864 // are in the adapter 0 hierarchy are removed. | |
865 object_paths.clear(); | |
866 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); | |
867 EXPECT_CALL(mock_adapter_observer_, | |
868 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath0))); | |
869 EXPECT_CALL(mock_device_observer_, | |
870 DeviceRemoved(dbus::ObjectPath(kTestDevicePath0))); | |
871 EXPECT_CALL(mock_tag_observer_, | |
872 TagRemoved(dbus::ObjectPath(kTestTagPath0))); | |
873 EXPECT_CALL(mock_record_observer_, | |
874 RecordRemoved(dbus::ObjectPath(kTestRecordPath0))); | |
875 EXPECT_CALL(mock_record_observer_, | |
876 RecordRemoved(dbus::ObjectPath(kTestRecordPath1))); | |
877 SimulateAdaptersChanged(object_paths); | |
878 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); | |
879 Mock::VerifyAndClearExpectations(&mock_device_observer_); | |
880 Mock::VerifyAndClearExpectations(&mock_tag_observer_); | |
881 Mock::VerifyAndClearExpectations(&mock_record_observer_); | |
882 | |
883 // Remove adapter 1. | |
884 object_paths.clear(); | |
885 EXPECT_CALL(mock_adapter_observer_, | |
886 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath1))); | |
887 EXPECT_CALL(mock_device_observer_, | |
888 DeviceRemoved(dbus::ObjectPath(kTestDevicePath1))); | |
889 EXPECT_CALL(mock_tag_observer_, | |
890 TagRemoved(dbus::ObjectPath(kTestTagPath1))); | |
891 EXPECT_CALL(mock_record_observer_, | |
892 RecordRemoved(dbus::ObjectPath(kTestRecordPath2))); | |
893 EXPECT_CALL(mock_record_observer_, | |
894 RecordRemoved(dbus::ObjectPath(kTestRecordPath3))); | |
895 SimulateAdaptersChanged(object_paths); | |
896 } | |
897 | |
898 } // namespace chromeos | |
OLD | NEW |