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