nfc_client_unittest.cc revision a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7
15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright 2013 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 "base/bind.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/message_loop/message_loop.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/nfc_adapter_client.h" 85d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "chromeos/dbus/nfc_client_helpers.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/nfc_device_client.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "chromeos/dbus/nfc_manager_client.h" 11cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "chromeos/dbus/nfc_record_client.h" 12f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)#include "chromeos/dbus/nfc_tag_client.h" 135f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "dbus/mock_bus.h" 145f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)#include "dbus/mock_object_proxy.h" 155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/cros_system_api/dbus/service_constants.h" 181320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::_; 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Invoke; 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Mock; 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)using ::testing::Return; 237d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) 242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using chromeos::nfc_client_helpers::ObjectPathVector; 252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 265e3f23d412006dc4db4e659864679f29341e113fTorne (Richard Coles)namespace chromeos { 27868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace { 294e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// D-Bus service name used by the test. 312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestServiceName[] = "test.service.name"; 32eb525c5499e34cc9c4b825d6d9e75bb07cc06aceBen Murdoch 332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)// Object paths that are used for testing. 342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestManagerPath[] = "/test/nfc/manager"; 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestAdapterPath0[] = "/test/nfc/adapter0"; 365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestAdapterPath1[] = "/test/nfc/adapter1"; 377dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdochconst char kTestDevicePath0[] = "/test/nfc/device0"; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)const char kTestDevicePath1[] = "/test/nfc/device1"; 3903b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles)const char kTestRecordPath0[] = "/test/nfc/record0"; 402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestRecordPath1[] = "/test/nfc/record1"; 41a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)const char kTestRecordPath2[] = "/test/nfc/record2"; 42116680a4aac90f2aa7413d9095a592090648e557Ben Murdochconst char kTestRecordPath3[] = "/test/nfc/record3"; 43cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)const char kTestTagPath0[] = "/test/nfc/tag0"; 442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)const char kTestTagPath1[] = "/test/nfc/tag1"; 455d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 465d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)class MockNfcManagerObserver : public NfcManagerClient::Observer { 47116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch public: 48cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MOCK_METHOD1(AdapterAdded, void(const dbus::ObjectPath&)); 49cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MOCK_METHOD1(AdapterRemoved, void(const dbus::ObjectPath&)); 50effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MOCK_METHOD1(ManagerPropertyChanged, void(const std::string&)); 51cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)}; 52cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) 536e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles)class MockNfcAdapterObserver : public NfcAdapterClient::Observer { 546e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) public: 55cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MOCK_METHOD1(AdapterAdded, void(const dbus::ObjectPath&)); 56116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MOCK_METHOD1(AdapterRemoved, void(const dbus::ObjectPath&)); 575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(AdapterPropertyChanged, void(const dbus::ObjectPath&, 585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string&)); 595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 6046d4c2bc3267f3f028f39e7e311b0f89aba2e4fdTorne (Richard Coles) 617d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)class MockNfcDeviceObserver : public NfcDeviceClient::Observer { 627d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) public: 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(DeviceAdded, void(const dbus::ObjectPath&)); 645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(DeviceRemoved, void(const dbus::ObjectPath&)); 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(DevicePropertyChanged, void(const dbus::ObjectPath&, 66a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) const std::string&)); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 694e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)class MockNfcRecordObserver : public NfcRecordClient::Observer { 705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RecordAdded, void(const dbus::ObjectPath&)); 725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD1(RecordRemoved, void(const dbus::ObjectPath&)); 735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MOCK_METHOD2(RecordPropertyChanged, void(const dbus::ObjectPath&, 74c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string&)); 754e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD1(RecordPropertiesReceived, void(const dbus::ObjectPath&)); 764e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles)}; 774e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MockNfcTagObserver : public NfcTagClient::Observer { 795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 80116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch MOCK_METHOD1(TagAdded, void(const dbus::ObjectPath&)); 815b892326406927b709cdaf6c384d4ababf456332Ben Murdoch MOCK_METHOD1(TagRemoved, void(const dbus::ObjectPath&)); 824e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) MOCK_METHOD2(TagPropertyChanged, void(const dbus::ObjectPath&, 83e5d81f57cb97b3b6b7fccc9c5610d21eb81db09dBen Murdoch const std::string&)); 845f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles)}; 856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class NfcClientTest : public testing::Test { 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NfcClientTest() : response_(NULL) {} 915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual ~NfcClientTest() {} 927dbb3d5cf0c15f500944d211057644d6a2f37371Ben Murdoch 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) virtual void SetUp() OVERRIDE { 941320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Create the mock bus. 951320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dbus::Bus::Options options; 961320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci options.bus_type = dbus::Bus::SYSTEM; 971320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci mock_bus_ = new dbus::MockBus(options); 981320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the mock proxies. 1005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_manager_proxy_ = new dbus::MockObjectProxy( 1016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1036e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dbus::ObjectPath(kTestManagerPath)); 1046e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_adapter0_proxy_ = new dbus::MockObjectProxy( 1056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath0)); 1086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_adapter1_proxy_ = new dbus::MockObjectProxy( 1096e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1106e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1116e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath1)); 1126e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_device0_proxy_ = new dbus::MockObjectProxy( 1136e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestDevicePath0)); 1165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_device1_proxy_ = new dbus::MockObjectProxy( 117116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_bus_.get(), 118116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestServiceName, 119116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestDevicePath1)); 120116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_record0_proxy_ = new dbus::MockObjectProxy( 121116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_bus_.get(), 122116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestServiceName, 123116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestRecordPath0)); 124116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_record1_proxy_ = new dbus::MockObjectProxy( 125116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_bus_.get(), 126116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestServiceName, 127116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestRecordPath1)); 128116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_record2_proxy_ = new dbus::MockObjectProxy( 1296e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1316e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dbus::ObjectPath(kTestRecordPath2)); 132116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_record3_proxy_ = new dbus::MockObjectProxy( 1336e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 134116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestServiceName, 135116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestRecordPath3)); 136116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_tag0_proxy_ = new dbus::MockObjectProxy( 1376e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 138116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch kTestServiceName, 139116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestTagPath0)); 140116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch mock_tag1_proxy_ = new dbus::MockObjectProxy( 1416e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) mock_bus_.get(), 1426e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) kTestServiceName, 1436e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) dbus::ObjectPath(kTestTagPath1)); 144116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 145116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set expectations that use NfcClientTest::OnConnectToSignal when the 146116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // client connect signals on the mock proxies. 147116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_manager_proxy_.get(), ConnectToSignal(_, _, _, _)) 148116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); 149116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_adapter0_proxy_.get(), ConnectToSignal(_, _, _, _)) 150116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); 151116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_adapter1_proxy_.get(), ConnectToSignal(_, _, _, _)) 152116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Invoke(this, &NfcClientTest::OnConnectToSignal)); 153116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 154116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Set expectations that return our mock proxies on demand. 1551675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch EXPECT_CALL( 1561675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch *mock_bus_.get(), 1571675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch GetObjectProxy(nfc_manager::kNfcManagerServiceName, 1581675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch dbus::ObjectPath(nfc_manager::kNfcManagerServicePath))) 1591675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch .WillRepeatedly(Return(mock_manager_proxy_.get())); 160116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 161116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetObjectProxy(nfc_adapter::kNfcAdapterServiceName, 162116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestAdapterPath0))) 163116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Return(mock_adapter0_proxy_.get())); 164116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 165116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetObjectProxy(nfc_adapter::kNfcAdapterServiceName, 166116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestAdapterPath1))) 167116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Return(mock_adapter1_proxy_.get())); 168116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 169116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetObjectProxy(nfc_device::kNfcDeviceServiceName, 170116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestDevicePath0))) 171116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Return(mock_device0_proxy_.get())); 172116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 1731320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci GetObjectProxy(nfc_device::kNfcDeviceServiceName, 1741320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci dbus::ObjectPath(kTestDevicePath1))) 1751320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .WillRepeatedly(Return(mock_device1_proxy_.get())); 1761320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*mock_bus_.get(), 177116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetObjectProxy(nfc_record::kNfcRecordServiceName, 178116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestRecordPath0))) 179116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Return(mock_record0_proxy_.get())); 180116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 181116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch GetObjectProxy(nfc_record::kNfcRecordServiceName, 182116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestRecordPath1))) 183116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch .WillRepeatedly(Return(mock_record1_proxy_.get())); 184116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_bus_.get(), 1855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetObjectProxy(nfc_record::kNfcRecordServiceName, 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestRecordPath2))) 187f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) .WillRepeatedly(Return(mock_record2_proxy_.get())); 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetObjectProxy(nfc_record::kNfcRecordServiceName, 1905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestRecordPath3))) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .WillRepeatedly(Return(mock_record3_proxy_.get())); 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetObjectProxy(nfc_tag::kNfcTagServiceName, 1945f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dbus::ObjectPath(kTestTagPath0))) 1955f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) .WillRepeatedly(Return(mock_tag0_proxy_.get())); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) GetObjectProxy(nfc_tag::kNfcTagServiceName, 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestTagPath1))) 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) .WillRepeatedly(Return(mock_tag1_proxy_.get())); 200116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch 20190dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) // ShutdownAndBlock will be called in TearDown. 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_bus_.get(), ShutdownAndBlock()).WillOnce(Return()); 2035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create the clients. 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_client_.reset(NfcManagerClient::Create()); 206116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch adapter_client_.reset(NfcAdapterClient::Create(manager_client_.get())); 207116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch device_client_.reset(NfcDeviceClient::Create(adapter_client_.get())); 208116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tag_client_.reset(NfcTagClient::Create(adapter_client_.get())); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_client_.reset( 210116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch NfcRecordClient::Create(device_client_.get(), tag_client_.get())); 211f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) manager_client_->Init(mock_bus_.get()); 212f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) adapter_client_->Init(mock_bus_.get()); 213f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) device_client_->Init(mock_bus_.get()); 214f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) tag_client_->Init(mock_bus_.get()); 2155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_client_->Init(mock_bus_.get()); 2165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_client_->AddObserver(&mock_manager_observer_); 2175f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) adapter_client_->AddObserver(&mock_adapter_observer_); 2185f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) device_client_->AddObserver(&mock_device_observer_); 2195f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) tag_client_->AddObserver(&mock_tag_observer_); 2205f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) record_client_->AddObserver(&mock_record_observer_); 2215f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2225f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) message_loop_.RunUntilIdle(); 2235f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 224f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) 225f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual void TearDown() OVERRIDE { 226f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) tag_client_->RemoveObserver(&mock_tag_observer_); 227f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) device_client_->RemoveObserver(&mock_device_observer_); 2285d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) adapter_client_->RemoveObserver(&mock_adapter_observer_); 2295d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) manager_client_->RemoveObserver(&mock_manager_observer_); 2305d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) mock_bus_->ShutdownAndBlock(); 23168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) } 2325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateAdaptersChanged( 2345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPathVector& adapter_paths) { 2355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NfcManagerClient::Properties* properties = 2365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_client_->GetProperties(); 2375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(properties); 2385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_manager_observer_, 2395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ManagerPropertyChanged(nfc_manager::kAdaptersProperty)); 2405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendArrayPropertyChangedSignal( 2415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties, 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_manager::kNfcManagerInterface, 2435821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_manager::kAdaptersProperty, 2445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_paths); 2455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_manager_observer_); 2465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateTagsChanged(const ObjectPathVector& tag_paths, 2495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& adapter_path) { 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NfcAdapterClient::Properties* properties = 2515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_client_->GetProperties(adapter_path); 2525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(properties); 2535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 2545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdapterPropertyChanged(adapter_path, 2555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kTagsProperty)); 2565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SendArrayPropertyChangedSignal( 2575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties, 2585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kNfcAdapterInterface, 2595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kTagsProperty, 2605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tag_paths); 2615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter_observer_); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateDevicesChanged(const ObjectPathVector& device_paths, 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& adapter_path) { 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NfcAdapterClient::Properties* properties = 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_client_->GetProperties(adapter_path); 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(properties); 2695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 2705f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) AdapterPropertyChanged(adapter_path, 2715f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) nfc_adapter::kDevicesProperty)); 2725f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) SendArrayPropertyChangedSignal( 2735f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) properties, 2745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kNfcAdapterInterface, 2755f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) nfc_adapter::kDevicesProperty, 2765f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) device_paths); 2775f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter_observer_); 2785f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) } 2795f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 2805f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) void SimulateDeviceRecordsChanged( 2815f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const ObjectPathVector& record_paths, 2825f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) const dbus::ObjectPath& device_path) { 2835f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) NfcDeviceClient::Properties* properties = 2844e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) device_client_->GetProperties(device_path); 2856e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) ASSERT_TRUE(properties); 2866e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_CALL(mock_device_observer_, 2872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) DevicePropertyChanged(device_path, 2882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) nfc_device::kRecordsProperty)); 2892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) SendArrayPropertyChangedSignal( 290116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch properties, 2917d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) nfc_device::kNfcDeviceInterface, 2927d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) nfc_device::kRecordsProperty, 2935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_paths); 2945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_device_observer_); 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void SimulateTagRecordsChanged( 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const ObjectPathVector& record_paths, 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectPath& tag_path) { 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) NfcTagClient::Properties* properties = 301116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch tag_client_->GetProperties(tag_path); 3021320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ASSERT_TRUE(properties); 3031320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(mock_tag_observer_, 3041320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci TagPropertyChanged(tag_path, 3051320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci nfc_tag::kRecordsProperty)); 3061320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SendArrayPropertyChangedSignal( 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties, 3085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_tag::kNfcTagInterface, 3095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_tag::kRecordsProperty, 3105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) record_paths); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_tag_observer_); 3125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void SendArrayPropertyChangedSignal( 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::PropertySet* properties, 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& interface, 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& property_name, 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectPathVector object_paths) { 3194e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dbus::Signal signal(interface, nfc_common::kPropertyChangedSignal); 3204e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dbus::MessageWriter writer(&signal); 3211320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci writer.AppendString(property_name); 3224e180b6a0b4720a9b8e9e959a882386f690f08ffTorne (Richard Coles) dbus::MessageWriter variant_writer(NULL); 3235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.OpenVariant("ao", &variant_writer); 3245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) variant_writer.AppendArrayOfObjectPaths(object_paths); 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) writer.CloseContainer(&variant_writer); 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) properties->ChangedReceived(&signal); 327868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) } 3286e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 329cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) MOCK_METHOD0(SuccessCallback, void(void)); 3306e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) MOCK_METHOD2(ErrorCallback, void(const std::string& error_name, 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& error_message)); 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3335f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) protected: 3345f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The mock object proxies. 3355f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_manager_proxy_; 3365f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_adapter0_proxy_; 3375f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_adapter1_proxy_; 3385f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_device0_proxy_; 3395f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_device1_proxy_; 3405f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_record0_proxy_; 3415f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_record1_proxy_; 3425f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_record2_proxy_; 3435f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_record3_proxy_; 3445f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_tag0_proxy_; 345f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<dbus::MockObjectProxy> mock_tag1_proxy_; 346f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The mock bus. 347f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_refptr<dbus::MockBus> mock_bus_; 3485f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // A message loop to emulate asynchronous behavior. 3495f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) base::MessageLoop message_loop_; 3505f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Response returned by mock methods. 3515f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dbus::Response* response_; 3525f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // The D-Bus client objects under test. 3535f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NfcManagerClient> manager_client_; 3545f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NfcAdapterClient> adapter_client_; 3555f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NfcDeviceClient> device_client_; 3565f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NfcTagClient> tag_client_; 3575f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) scoped_ptr<NfcRecordClient> record_client_; 3585f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Mock observers. 3595f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MockNfcManagerObserver mock_manager_observer_; 3605f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MockNfcAdapterObserver mock_adapter_observer_; 3615f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) MockNfcDeviceObserver mock_device_observer_; 362f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockNfcTagObserver mock_tag_observer_; 363f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) MockNfcRecordObserver mock_record_observer_; 364f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // The signal callbacks used to simulate asychronous signals. 3655f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dbus::ObjectProxy::SignalCallback manager_adapter_added_signal_callback_; 3665f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) dbus::ObjectProxy::SignalCallback manager_adapter_removed_signal_callback_; 3675f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) 3685f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) private: 3695f1c94371a64b3196d4be9466099bb892df9b88eTorne (Richard Coles) // Used to implement the mock proxy. 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnConnectToSignal( 371c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) const std::string& interface_name, 372116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch const std::string& signal_name, 37390dce4d38c5ff5333bea97d859d4e484e27edf0cTorne (Richard Coles) const dbus::ObjectProxy::SignalCallback& signal_callback, 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const dbus::ObjectProxy::OnConnectedCallback& on_connected_callback) { 375f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (interface_name == nfc_manager::kNfcManagerInterface) { 376f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) if (signal_name == nfc_manager::kAdapterAddedSignal) 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) manager_adapter_added_signal_callback_ = signal_callback; 378f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) else if (signal_name == nfc_manager::kAdapterRemovedSignal) 379f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) manager_adapter_removed_signal_callback_ = signal_callback; 380f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) } 381f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) message_loop_.PostTask(FROM_HERE, base::Bind(on_connected_callback, 382f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) interface_name, 383116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch signal_name, 384116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch true)); 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Tests that when adapters are added and removed through the manager, all 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// observers are notified and the proxies are created and removed 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// accordingly. 3915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(NfcClientTest, AdaptersAddedAndRemoved) { 392116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Invoking methods on adapters that haven't been added should fail. 393116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, 394116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 395116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch adapter_client_->StartPollLoop( 396116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch dbus::ObjectPath(kTestAdapterPath0), 397116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch nfc_adapter::kModeInitiator, 398116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 399116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 400116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Mock::VerifyAndClearExpectations(this); 4016e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 4026e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) // Add adapter 0. 403116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ObjectPathVector adapter_paths; 404116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); 4056e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 4066e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); 4076e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) SimulateAdaptersChanged(adapter_paths); 4086e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) 409116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch // Invoking methods should succeed on adapter 0 but fail on adapter 1. 410116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 411116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch adapter_client_->StartPollLoop( 4121675a649fd7a8b3cb80ffddae2dc181f122353c5Ben Murdoch dbus::ObjectPath(kTestAdapterPath0), 413116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch nfc_adapter::kModeInitiator, 4146e8cce623b6e4fe0c9e4af605d675dd9d0338c38Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 415116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 416116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); 417116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, 418116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) .Times(0); 4215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_client_->StartPollLoop( 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath1), 4235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kModeInitiator, 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 4255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 426effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Mock::VerifyAndClearExpectations(this); 427effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); 428effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 429effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch // Add adapter 1. 430effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); 4315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 4325b892326406927b709cdaf6c384d4ababf456332Ben Murdoch AdapterAdded(dbus::ObjectPath(kTestAdapterPath1))); 4335b892326406927b709cdaf6c384d4ababf456332Ben Murdoch SimulateAdaptersChanged(adapter_paths); 4345b892326406927b709cdaf6c384d4ababf456332Ben Murdoch 4355b892326406927b709cdaf6c384d4ababf456332Ben Murdoch // Invoking methods should succeed on both adapters. 4365b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 4375b892326406927b709cdaf6c384d4ababf456332Ben Murdoch EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 4385b892326406927b709cdaf6c384d4ababf456332Ben Murdoch adapter_client_->StartPollLoop( 4395b892326406927b709cdaf6c384d4ababf456332Ben Murdoch dbus::ObjectPath(kTestAdapterPath0), 4405b892326406927b709cdaf6c384d4ababf456332Ben Murdoch nfc_adapter::kModeInitiator, 4415b892326406927b709cdaf6c384d4ababf456332Ben Murdoch base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 4425b892326406927b709cdaf6c384d4ababf456332Ben Murdoch base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 4435b892326406927b709cdaf6c384d4ababf456332Ben Murdoch adapter_client_->StartPollLoop( 4445b892326406927b709cdaf6c384d4ababf456332Ben Murdoch dbus::ObjectPath(kTestAdapterPath1), 4455b892326406927b709cdaf6c384d4ababf456332Ben Murdoch nfc_adapter::kModeInitiator, 4465b892326406927b709cdaf6c384d4ababf456332Ben Murdoch base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 4475b892326406927b709cdaf6c384d4ababf456332Ben Murdoch base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 4482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); 4495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); 4505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove adapter 0. 452116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch adapter_paths.erase(adapter_paths.begin()); 4535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 4545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AdapterRemoved(dbus::ObjectPath(kTestAdapterPath0))); 4557d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) SimulateAdaptersChanged(adapter_paths); 4565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Invoking methods should succeed on adapter 1 but fail on adapter 0. 4585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(*this, 4595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 4607d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles) EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 46103b57e008b61dfcb1fbad3aea950ae0e001748b0Torne (Richard Coles) .Times(0); 4625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_client_->StartPollLoop( 4635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath0), 4645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kModeInitiator, 4655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 4665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 4675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(this); 4685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 469f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 470f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) adapter_client_->StartPollLoop( 471f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath1), 4725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) nfc_adapter::kModeInitiator, 4735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 474f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 475f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter0_proxy_); 476f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter1_proxy_); 477f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) 4785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Remove adapter 1. 479f8ee788a64d60abd8f2d742a5fdedde054ecd910Torne (Richard Coles) adapter_paths.clear(); 4805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 4815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AdapterRemoved(dbus::ObjectPath(kTestAdapterPath1))); 4821320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci SimulateAdaptersChanged(adapter_paths); 4831320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 4841320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci // Invoking methods should fail on both adapters. 4851320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*this, 4861320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) 4871320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(2); 4881320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci EXPECT_CALL(*mock_adapter0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 4891320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci .Times(0); 490116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*mock_adapter1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 49168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) .Times(0);; 4925d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) adapter_client_->StartPollLoop( 49368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath0), 49468043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) nfc_adapter::kModeInitiator, 49568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 49668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 49768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) adapter_client_->StartPollLoop( 49868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) dbus::ObjectPath(kTestAdapterPath1), 49968043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) nfc_adapter::kModeInitiator, 50068043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, base::Unretained(this)), 50168043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, base::Unretained(this))); 50268043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)} 50368043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) 5045d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)// Tests that when tags are added and removed through an adapter, all 50568043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// observers are notified and the proxies are created and removed 50668043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)// accordingly. 50768043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles)TEST_F(NfcClientTest, TagsAddedAndRemoved) { 50868043e1e95eeb07d5cae7aca370b26518b0867d6Torne (Richard Coles) // Invoking methods on tags that haven't been added should fail. 509116680a4aac90f2aa7413d9095a592090648e557Ben Murdoch EXPECT_CALL(*this, 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) base::DictionaryValue write_data; 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) write_data.SetString(nfc_record::kTypeProperty, nfc_record::kTypeText); 5135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, 5145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, 5155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)), 5165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::ErrorCallback, 5175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this))); 5185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(this); 5195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Add adapter 0. 5215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ObjectPathVector adapter_paths; 5225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); 5235d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(mock_adapter_observer_, 5245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); 525a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) SimulateAdaptersChanged(adapter_paths); 526a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_adapter_observer_); 527a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) 528a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) // Add tag 0. 529a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) ObjectPathVector tag_paths; 530a3f6a49ab37290eeeb8db0f41ec0f1cb74a68be7Torne (Richard Coles) tag_paths.push_back(dbus::ObjectPath(kTestTagPath0)); 5315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_CALL(mock_tag_observer_, 5325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) TagAdded(dbus::ObjectPath(kTestTagPath0))); 5335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); 5345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) Mock::VerifyAndClearExpectations(&mock_tag_observer_); 5355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 5365d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) // Invoking methods should succeed on tag 0 but fail on tag 1. 5375d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 5385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, 5395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind(&NfcClientTest::SuccessCallback, 5405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(this)), 541 base::Bind(&NfcClientTest::ErrorCallback, 542 base::Unretained(this))); 543 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); 544 EXPECT_CALL(*this, 545 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 546 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 547 .Times(0); 548 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, 549 base::Bind(&NfcClientTest::SuccessCallback, 550 base::Unretained(this)), 551 base::Bind(&NfcClientTest::ErrorCallback, 552 base::Unretained(this))); 553 Mock::VerifyAndClearExpectations(this); 554 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); 555 556 // Add tag 1. 557 tag_paths.push_back(dbus::ObjectPath(kTestTagPath1)); 558 EXPECT_CALL(mock_tag_observer_, 559 TagAdded(dbus::ObjectPath(kTestTagPath1))); 560 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); 561 Mock::VerifyAndClearExpectations(&mock_tag_observer_); 562 563 // Invoking methods should succeed on both tags. 564 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 565 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 566 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, 567 base::Bind(&NfcClientTest::SuccessCallback, 568 base::Unretained(this)), 569 base::Bind(&NfcClientTest::ErrorCallback, 570 base::Unretained(this))); 571 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, 572 base::Bind(&NfcClientTest::SuccessCallback, 573 base::Unretained(this)), 574 base::Bind(&NfcClientTest::ErrorCallback, 575 base::Unretained(this))); 576 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); 577 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); 578 579 // Remove tag 0. 580 tag_paths.erase(tag_paths.begin()); 581 EXPECT_CALL(mock_tag_observer_, 582 TagRemoved(dbus::ObjectPath(kTestTagPath0))); 583 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); 584 Mock::VerifyAndClearExpectations(&mock_tag_observer_); 585 586 // Invoking methods should succeed on tag 1 but fail on tag 0. 587 EXPECT_CALL(*this, 588 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 589 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 590 .Times(0); 591 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, 592 base::Bind(&NfcClientTest::SuccessCallback, 593 base::Unretained(this)), 594 base::Bind(&NfcClientTest::ErrorCallback, 595 base::Unretained(this))); 596 Mock::VerifyAndClearExpectations(this); 597 Mock::VerifyAndClearExpectations(&mock_tag0_proxy_); 598 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 599 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, 600 base::Bind(&NfcClientTest::SuccessCallback, 601 base::Unretained(this)), 602 base::Bind(&NfcClientTest::ErrorCallback, 603 base::Unretained(this))); 604 Mock::VerifyAndClearExpectations(&mock_tag1_proxy_); 605 606 // Remove tag 1. 607 tag_paths.clear(); 608 EXPECT_CALL(mock_tag_observer_, 609 TagRemoved(dbus::ObjectPath(kTestTagPath1))); 610 SimulateTagsChanged(tag_paths, dbus::ObjectPath(kTestAdapterPath0)); 611 Mock::VerifyAndClearExpectations(&mock_tag_observer_); 612 613 // Invoking methods should fail on both tags. 614 EXPECT_CALL(*this, 615 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) 616 .Times(2); 617 EXPECT_CALL(*mock_tag0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 618 .Times(0); 619 EXPECT_CALL(*mock_tag1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 620 .Times(0); 621 tag_client_->Write(dbus::ObjectPath(kTestTagPath0), write_data, 622 base::Bind(&NfcClientTest::SuccessCallback, 623 base::Unretained(this)), 624 base::Bind(&NfcClientTest::ErrorCallback, 625 base::Unretained(this))); 626 tag_client_->Write(dbus::ObjectPath(kTestTagPath1), write_data, 627 base::Bind(&NfcClientTest::SuccessCallback, 628 base::Unretained(this)), 629 base::Bind(&NfcClientTest::ErrorCallback, 630 base::Unretained(this))); 631} 632 633// Tests that when devices are added and removed through an adapter, all 634// observers are notified and the proxies are created and removed 635// accordingly. 636TEST_F(NfcClientTest, DevicesAddedAndRemoved) { 637 // Invoking methods on devices that haven't been added should fail. 638 EXPECT_CALL(*this, 639 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 640 base::DictionaryValue write_data; 641 write_data.SetString(nfc_record::kTypeProperty, nfc_record::kTypeText); 642 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, 643 base::Bind(&NfcClientTest::SuccessCallback, 644 base::Unretained(this)), 645 base::Bind(&NfcClientTest::ErrorCallback, 646 base::Unretained(this))); 647 Mock::VerifyAndClearExpectations(this); 648 649 // Add adapter 0. 650 ObjectPathVector adapter_paths; 651 adapter_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); 652 EXPECT_CALL(mock_adapter_observer_, 653 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); 654 SimulateAdaptersChanged(adapter_paths); 655 656 // Add device 0. 657 ObjectPathVector device_paths; 658 device_paths.push_back(dbus::ObjectPath(kTestDevicePath0)); 659 EXPECT_CALL(mock_device_observer_, 660 DeviceAdded(dbus::ObjectPath(kTestDevicePath0))); 661 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); 662 Mock::VerifyAndClearExpectations(&mock_device_observer_); 663 664 // Invoking methods should succeed on device 0 but fail on device 1. 665 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 666 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, 667 base::Bind(&NfcClientTest::SuccessCallback, 668 base::Unretained(this)), 669 base::Bind(&NfcClientTest::ErrorCallback, 670 base::Unretained(this))); 671 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); 672 EXPECT_CALL(*this, 673 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 674 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 675 .Times(0); 676 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, 677 base::Bind(&NfcClientTest::SuccessCallback, 678 base::Unretained(this)), 679 base::Bind(&NfcClientTest::ErrorCallback, 680 base::Unretained(this))); 681 Mock::VerifyAndClearExpectations(this); 682 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); 683 684 // Add device 1. 685 device_paths.push_back(dbus::ObjectPath(kTestDevicePath1)); 686 EXPECT_CALL(mock_device_observer_, 687 DeviceAdded(dbus::ObjectPath(kTestDevicePath1))); 688 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); 689 Mock::VerifyAndClearExpectations(&mock_device_observer_); 690 691 // Invoking methods should succeed on both devices. 692 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 693 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 694 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, 695 base::Bind(&NfcClientTest::SuccessCallback, 696 base::Unretained(this)), 697 base::Bind(&NfcClientTest::ErrorCallback, 698 base::Unretained(this))); 699 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, 700 base::Bind(&NfcClientTest::SuccessCallback, 701 base::Unretained(this)), 702 base::Bind(&NfcClientTest::ErrorCallback, 703 base::Unretained(this))); 704 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); 705 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); 706 707 // Remove device 0. 708 device_paths.erase(device_paths.begin()); 709 EXPECT_CALL(mock_device_observer_, 710 DeviceRemoved(dbus::ObjectPath(kTestDevicePath0))); 711 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); 712 Mock::VerifyAndClearExpectations(&mock_device_observer_); 713 714 // Invoking methods should succeed on device 1 but fail on device 0. 715 EXPECT_CALL(*this, 716 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)); 717 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 718 .Times(0); 719 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, 720 base::Bind(&NfcClientTest::SuccessCallback, 721 base::Unretained(this)), 722 base::Bind(&NfcClientTest::ErrorCallback, 723 base::Unretained(this))); 724 Mock::VerifyAndClearExpectations(this); 725 Mock::VerifyAndClearExpectations(&mock_device0_proxy_); 726 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)); 727 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, 728 base::Bind(&NfcClientTest::SuccessCallback, 729 base::Unretained(this)), 730 base::Bind(&NfcClientTest::ErrorCallback, 731 base::Unretained(this))); 732 Mock::VerifyAndClearExpectations(&mock_device1_proxy_); 733 734 // Remove device 1. 735 device_paths.clear(); 736 EXPECT_CALL(mock_device_observer_, 737 DeviceRemoved(dbus::ObjectPath(kTestDevicePath1))); 738 SimulateDevicesChanged(device_paths, dbus::ObjectPath(kTestAdapterPath0)); 739 Mock::VerifyAndClearExpectations(&mock_device_observer_); 740 741 // Invoking methods should fail on both devices. 742 EXPECT_CALL(*this, 743 ErrorCallback(nfc_client_helpers::kUnknownObjectError, _)) 744 .Times(2); 745 EXPECT_CALL(*mock_device0_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 746 .Times(0); 747 EXPECT_CALL(*mock_device1_proxy_, CallMethodWithErrorCallback(_, _, _, _)) 748 .Times(0); 749 device_client_->Push(dbus::ObjectPath(kTestDevicePath0), write_data, 750 base::Bind(&NfcClientTest::SuccessCallback, 751 base::Unretained(this)), 752 base::Bind(&NfcClientTest::ErrorCallback, 753 base::Unretained(this))); 754 device_client_->Push(dbus::ObjectPath(kTestDevicePath1), write_data, 755 base::Bind(&NfcClientTest::SuccessCallback, 756 base::Unretained(this)), 757 base::Bind(&NfcClientTest::ErrorCallback, 758 base::Unretained(this))); 759} 760 761TEST_F(NfcClientTest, ObjectCleanup) { 762 // Tests that when an adapter gets removed, proxies that belong to the 763 // adapter, device, tag, and record hierarchy get cleaned up properly. 764 ObjectPathVector object_paths; 765 766 // Add adapters. 767 EXPECT_CALL(mock_adapter_observer_, 768 AdapterAdded(dbus::ObjectPath(kTestAdapterPath0))); 769 EXPECT_CALL(mock_adapter_observer_, 770 AdapterAdded(dbus::ObjectPath(kTestAdapterPath1))); 771 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath0)); 772 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); 773 SimulateAdaptersChanged(object_paths); 774 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); 775 776 // Add devices and a tags. Assign them like the following: 777 // - device 0 -> adapter 0 778 // - tag 0 -> adapter 0 779 // - device 1 -> adapter 1 780 // - tag 1 -> adapter 1 781 EXPECT_CALL(mock_device_observer_, 782 DeviceAdded(dbus::ObjectPath(kTestDevicePath0))); 783 EXPECT_CALL(mock_device_observer_, 784 DeviceAdded(dbus::ObjectPath(kTestDevicePath1))); 785 EXPECT_CALL(mock_tag_observer_, 786 TagAdded(dbus::ObjectPath(kTestTagPath0))); 787 EXPECT_CALL(mock_tag_observer_, 788 TagAdded(dbus::ObjectPath(kTestTagPath1))); 789 object_paths.clear(); 790 object_paths.push_back(dbus::ObjectPath(kTestDevicePath0)); 791 SimulateDevicesChanged(object_paths, dbus::ObjectPath(kTestAdapterPath0)); 792 object_paths.clear(); 793 object_paths.push_back(dbus::ObjectPath(kTestTagPath0)); 794 SimulateTagsChanged(object_paths, dbus::ObjectPath(kTestAdapterPath0)); 795 object_paths.clear(); 796 object_paths.push_back(dbus::ObjectPath(kTestDevicePath1)); 797 SimulateDevicesChanged(object_paths, dbus::ObjectPath(kTestAdapterPath1)); 798 object_paths.clear(); 799 object_paths.push_back(dbus::ObjectPath(kTestTagPath1)); 800 SimulateTagsChanged(object_paths, dbus::ObjectPath(kTestAdapterPath1)); 801 Mock::VerifyAndClearExpectations(&mock_device_observer_); 802 Mock::VerifyAndClearExpectations(&mock_tag_observer_); 803 804 // Add records. Assign them like the following: 805 // - record 0 -> device 0 806 // - record 1 -> tag 0 807 // - record 2 -> device 1 808 // - record 3 -> tag 1 809 EXPECT_CALL(mock_record_observer_, 810 RecordAdded(dbus::ObjectPath(kTestRecordPath0))); 811 EXPECT_CALL(mock_record_observer_, 812 RecordAdded(dbus::ObjectPath(kTestRecordPath1))); 813 EXPECT_CALL(mock_record_observer_, 814 RecordAdded(dbus::ObjectPath(kTestRecordPath2))); 815 EXPECT_CALL(mock_record_observer_, 816 RecordAdded(dbus::ObjectPath(kTestRecordPath3))); 817 object_paths.clear(); 818 object_paths.push_back(dbus::ObjectPath(kTestRecordPath0)); 819 SimulateDeviceRecordsChanged(object_paths, 820 dbus::ObjectPath(kTestDevicePath0)); 821 object_paths.clear(); 822 object_paths.push_back(dbus::ObjectPath(kTestRecordPath1)); 823 SimulateTagRecordsChanged(object_paths, 824 dbus::ObjectPath(kTestTagPath0)); 825 object_paths.clear(); 826 object_paths.push_back(dbus::ObjectPath(kTestRecordPath2)); 827 SimulateDeviceRecordsChanged(object_paths, 828 dbus::ObjectPath(kTestDevicePath1)); 829 object_paths.clear(); 830 object_paths.push_back(dbus::ObjectPath(kTestRecordPath3)); 831 SimulateTagRecordsChanged(object_paths, 832 dbus::ObjectPath(kTestTagPath1)); 833 Mock::VerifyAndClearExpectations(&mock_record_observer_); 834 835 // Check that the records have been assigned to the correct device or tag. 836 NfcTagClient::Properties* tag_properties = 837 tag_client_->GetProperties(dbus::ObjectPath(kTestTagPath0)); 838 EXPECT_EQ((size_t)1, tag_properties->records.value().size()); 839 EXPECT_EQ(dbus::ObjectPath(kTestRecordPath1), 840 tag_properties->records.value()[0]); 841 NfcDeviceClient::Properties* device_properties = 842 device_client_->GetProperties(dbus::ObjectPath(kTestDevicePath0)); 843 EXPECT_EQ((size_t)1, device_properties->records.value().size()); 844 EXPECT_EQ(dbus::ObjectPath(kTestRecordPath0), 845 device_properties->records.value()[0]); 846 847 // Remove adapter 0. Make sure that all of the tag, device, and records that 848 // are in the adapter 0 hierarchy are removed. 849 object_paths.clear(); 850 object_paths.push_back(dbus::ObjectPath(kTestAdapterPath1)); 851 EXPECT_CALL(mock_adapter_observer_, 852 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath0))); 853 EXPECT_CALL(mock_device_observer_, 854 DeviceRemoved(dbus::ObjectPath(kTestDevicePath0))); 855 EXPECT_CALL(mock_tag_observer_, 856 TagRemoved(dbus::ObjectPath(kTestTagPath0))); 857 EXPECT_CALL(mock_record_observer_, 858 RecordRemoved(dbus::ObjectPath(kTestRecordPath0))); 859 EXPECT_CALL(mock_record_observer_, 860 RecordRemoved(dbus::ObjectPath(kTestRecordPath1))); 861 SimulateAdaptersChanged(object_paths); 862 Mock::VerifyAndClearExpectations(&mock_adapter_observer_); 863 Mock::VerifyAndClearExpectations(&mock_device_observer_); 864 Mock::VerifyAndClearExpectations(&mock_tag_observer_); 865 Mock::VerifyAndClearExpectations(&mock_record_observer_); 866 867 // Remove adapter 1. 868 object_paths.clear(); 869 EXPECT_CALL(mock_adapter_observer_, 870 AdapterRemoved(dbus::ObjectPath(kTestAdapterPath1))); 871 EXPECT_CALL(mock_device_observer_, 872 DeviceRemoved(dbus::ObjectPath(kTestDevicePath1))); 873 EXPECT_CALL(mock_tag_observer_, 874 TagRemoved(dbus::ObjectPath(kTestTagPath1))); 875 EXPECT_CALL(mock_record_observer_, 876 RecordRemoved(dbus::ObjectPath(kTestRecordPath2))); 877 EXPECT_CALL(mock_record_observer_, 878 RecordRemoved(dbus::ObjectPath(kTestRecordPath3))); 879 SimulateAdaptersChanged(object_paths); 880} 881 882} // namespace chromeos 883