1 // Copyright 2013 The Chromium Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style license that can be 3 // found in the LICENSE file. 4 5 #include "base/message_loop/message_loop.h" 6 #include "chromeos/dbus/dbus_thread_manager.h" 7 #include "chromeos/dbus/fake_nfc_adapter_client.h" 8 #include "device/nfc/nfc_adapter_chromeos.h" 9 #include "testing/gtest/include/gtest/gtest.h" 10 11 using device::NfcAdapter; 12 13 namespace chromeos { 14 15 namespace { 16 17 class TestObserver : public NfcAdapter::Observer { 18 public: 19 TestObserver(scoped_refptr<NfcAdapter> adapter) 20 : present_changed_count_(0), 21 powered_changed_count_(0), 22 adapter_(adapter) { 23 } 24 25 virtual ~TestObserver() {} 26 27 // NfcAdapter::Observer override. 28 virtual void AdapterPresentChanged(NfcAdapter* adapter, 29 bool present) OVERRIDE { 30 EXPECT_EQ(adapter_, adapter); 31 present_changed_count_++; 32 } 33 34 // NfcAdapter::Observer override. 35 virtual void AdapterPoweredChanged(NfcAdapter* adapter, 36 bool powered) OVERRIDE { 37 EXPECT_EQ(adapter_, adapter); 38 powered_changed_count_++; 39 } 40 41 int present_changed_count_; 42 int powered_changed_count_; 43 scoped_refptr<NfcAdapter> adapter_; 44 }; 45 46 } // namespace 47 48 class NfcChromeOSTest : public testing::Test { 49 public: 50 virtual void SetUp() { 51 DBusThreadManager::InitializeWithStub(); 52 fake_nfc_adapter_client_ = static_cast<FakeNfcAdapterClient*>( 53 DBusThreadManager::Get()->GetNfcAdapterClient()); 54 SetAdapter(); 55 message_loop_.RunUntilIdle(); 56 57 success_callback_count_ = 0; 58 error_callback_count_ = 0; 59 } 60 61 virtual void TearDown() { 62 adapter_ = NULL; 63 DBusThreadManager::Shutdown(); 64 } 65 66 // Assigns a new instance of NfcAdapterChromeOS to |adapter_|. 67 void SetAdapter() { 68 adapter_ = new NfcAdapterChromeOS(); 69 ASSERT_TRUE(adapter_.get() != NULL); 70 ASSERT_TRUE(adapter_->IsInitialized()); 71 } 72 73 // Generic callbacks for success and error. 74 void SuccessCallback() { 75 success_callback_count_++; 76 } 77 78 void ErrorCallback() { 79 error_callback_count_++; 80 } 81 82 protected: 83 // Fields for storing the number of times SuccessCallback and ErrorCallback 84 // have been called. 85 int success_callback_count_; 86 int error_callback_count_; 87 88 // A message loop to emulate asynchronous behavior. 89 base::MessageLoop message_loop_; 90 91 // The NfcAdapter instance under test. 92 scoped_refptr<NfcAdapter> adapter_; 93 94 // The fake D-Bus client instances used for testing. 95 FakeNfcAdapterClient* fake_nfc_adapter_client_; 96 }; 97 98 TEST_F(NfcChromeOSTest, PresentChanged) { 99 EXPECT_TRUE(adapter_->IsPresent()); 100 101 TestObserver observer(adapter_); 102 adapter_->AddObserver(&observer); 103 104 // Remove all adapters. 105 fake_nfc_adapter_client_->SetAdapterPresent(false); 106 EXPECT_EQ(1, observer.present_changed_count_); 107 EXPECT_FALSE(adapter_->IsPresent()); 108 109 // Add two adapters. 110 fake_nfc_adapter_client_->SetAdapterPresent(true); 111 fake_nfc_adapter_client_->SetSecondAdapterPresent(true); 112 EXPECT_EQ(2, observer.present_changed_count_); 113 EXPECT_TRUE(adapter_->IsPresent()); 114 115 // Remove the first adapter. Adapter should update to the second one. 116 fake_nfc_adapter_client_->SetAdapterPresent(false); 117 EXPECT_EQ(4, observer.present_changed_count_); 118 EXPECT_TRUE(adapter_->IsPresent()); 119 120 fake_nfc_adapter_client_->SetSecondAdapterPresent(false); 121 EXPECT_EQ(5, observer.present_changed_count_); 122 EXPECT_FALSE(adapter_->IsPresent()); 123 } 124 125 TEST_F(NfcChromeOSTest, SetPowered) { 126 TestObserver observer(adapter_); 127 adapter_->AddObserver(&observer); 128 129 EXPECT_FALSE(adapter_->IsPowered()); 130 131 // SetPowered(false), while not powered. 132 adapter_->SetPowered( 133 false, 134 base::Bind(&NfcChromeOSTest::SuccessCallback, 135 base::Unretained(this)), 136 base::Bind(&NfcChromeOSTest::ErrorCallback, 137 base::Unretained(this))); 138 EXPECT_FALSE(adapter_->IsPowered()); 139 EXPECT_EQ(0, observer.powered_changed_count_); 140 EXPECT_EQ(0, success_callback_count_); 141 EXPECT_EQ(1, error_callback_count_); 142 143 // SetPowered(true). 144 adapter_->SetPowered( 145 true, 146 base::Bind(&NfcChromeOSTest::SuccessCallback, 147 base::Unretained(this)), 148 base::Bind(&NfcChromeOSTest::ErrorCallback, 149 base::Unretained(this))); 150 EXPECT_TRUE(adapter_->IsPowered()); 151 EXPECT_EQ(1, observer.powered_changed_count_); 152 EXPECT_EQ(1, success_callback_count_); 153 EXPECT_EQ(1, error_callback_count_); 154 155 // SetPowered(true), while powered. 156 adapter_->SetPowered( 157 true, 158 base::Bind(&NfcChromeOSTest::SuccessCallback, 159 base::Unretained(this)), 160 base::Bind(&NfcChromeOSTest::ErrorCallback, 161 base::Unretained(this))); 162 EXPECT_TRUE(adapter_->IsPowered()); 163 EXPECT_EQ(1, observer.powered_changed_count_); 164 EXPECT_EQ(1, success_callback_count_); 165 EXPECT_EQ(2, error_callback_count_); 166 167 // SetPowered(false). 168 adapter_->SetPowered( 169 false, 170 base::Bind(&NfcChromeOSTest::SuccessCallback, 171 base::Unretained(this)), 172 base::Bind(&NfcChromeOSTest::ErrorCallback, 173 base::Unretained(this))); 174 EXPECT_FALSE(adapter_->IsPowered()); 175 EXPECT_EQ(2, observer.powered_changed_count_); 176 EXPECT_EQ(2, success_callback_count_); 177 EXPECT_EQ(2, error_callback_count_); 178 } 179 180 TEST_F(NfcChromeOSTest, PresentChangedWhilePowered) { 181 TestObserver observer(adapter_); 182 adapter_->AddObserver(&observer); 183 184 EXPECT_FALSE(adapter_->IsPowered()); 185 EXPECT_TRUE(adapter_->IsPresent()); 186 187 adapter_->SetPowered( 188 true, 189 base::Bind(&NfcChromeOSTest::SuccessCallback, 190 base::Unretained(this)), 191 base::Bind(&NfcChromeOSTest::ErrorCallback, 192 base::Unretained(this))); 193 EXPECT_TRUE(adapter_->IsPowered()); 194 195 fake_nfc_adapter_client_->SetAdapterPresent(false); 196 EXPECT_EQ(1, observer.present_changed_count_); 197 EXPECT_EQ(2, observer.powered_changed_count_); 198 EXPECT_FALSE(adapter_->IsPowered()); 199 EXPECT_FALSE(adapter_->IsPresent()); 200 } 201 202 } // namespace chromeos 203