// Copyright 2013 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "base/message_loop/message_loop.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "chromeos/dbus/fake_nfc_adapter_client.h" #include "device/nfc/nfc_adapter_chromeos.h" #include "testing/gtest/include/gtest/gtest.h" using device::NfcAdapter; namespace chromeos { namespace { class TestObserver : public NfcAdapter::Observer { public: TestObserver(scoped_refptr<NfcAdapter> adapter) : present_changed_count_(0), powered_changed_count_(0), adapter_(adapter) { } virtual ~TestObserver() {} // NfcAdapter::Observer override. virtual void AdapterPresentChanged(NfcAdapter* adapter, bool present) OVERRIDE { EXPECT_EQ(adapter_, adapter); present_changed_count_++; } // NfcAdapter::Observer override. virtual void AdapterPoweredChanged(NfcAdapter* adapter, bool powered) OVERRIDE { EXPECT_EQ(adapter_, adapter); powered_changed_count_++; } int present_changed_count_; int powered_changed_count_; scoped_refptr<NfcAdapter> adapter_; }; } // namespace class NfcChromeOSTest : public testing::Test { public: virtual void SetUp() { DBusThreadManager::InitializeWithStub(); fake_nfc_adapter_client_ = static_cast<FakeNfcAdapterClient*>( DBusThreadManager::Get()->GetNfcAdapterClient()); SetAdapter(); message_loop_.RunUntilIdle(); success_callback_count_ = 0; error_callback_count_ = 0; } virtual void TearDown() { adapter_ = NULL; DBusThreadManager::Shutdown(); } // Assigns a new instance of NfcAdapterChromeOS to |adapter_|. void SetAdapter() { adapter_ = new NfcAdapterChromeOS(); ASSERT_TRUE(adapter_.get() != NULL); ASSERT_TRUE(adapter_->IsInitialized()); } // Generic callbacks for success and error. void SuccessCallback() { success_callback_count_++; } void ErrorCallback() { error_callback_count_++; } protected: // Fields for storing the number of times SuccessCallback and ErrorCallback // have been called. int success_callback_count_; int error_callback_count_; // A message loop to emulate asynchronous behavior. base::MessageLoop message_loop_; // The NfcAdapter instance under test. scoped_refptr<NfcAdapter> adapter_; // The fake D-Bus client instances used for testing. FakeNfcAdapterClient* fake_nfc_adapter_client_; }; TEST_F(NfcChromeOSTest, PresentChanged) { EXPECT_TRUE(adapter_->IsPresent()); TestObserver observer(adapter_); adapter_->AddObserver(&observer); // Remove all adapters. fake_nfc_adapter_client_->SetAdapterPresent(false); EXPECT_EQ(1, observer.present_changed_count_); EXPECT_FALSE(adapter_->IsPresent()); // Add two adapters. fake_nfc_adapter_client_->SetAdapterPresent(true); fake_nfc_adapter_client_->SetSecondAdapterPresent(true); EXPECT_EQ(2, observer.present_changed_count_); EXPECT_TRUE(adapter_->IsPresent()); // Remove the first adapter. Adapter should update to the second one. fake_nfc_adapter_client_->SetAdapterPresent(false); EXPECT_EQ(4, observer.present_changed_count_); EXPECT_TRUE(adapter_->IsPresent()); fake_nfc_adapter_client_->SetSecondAdapterPresent(false); EXPECT_EQ(5, observer.present_changed_count_); EXPECT_FALSE(adapter_->IsPresent()); } TEST_F(NfcChromeOSTest, SetPowered) { TestObserver observer(adapter_); adapter_->AddObserver(&observer); EXPECT_FALSE(adapter_->IsPowered()); // SetPowered(false), while not powered. adapter_->SetPowered( false, base::Bind(&NfcChromeOSTest::SuccessCallback, base::Unretained(this)), base::Bind(&NfcChromeOSTest::ErrorCallback, base::Unretained(this))); EXPECT_FALSE(adapter_->IsPowered()); EXPECT_EQ(0, observer.powered_changed_count_); EXPECT_EQ(0, success_callback_count_); EXPECT_EQ(1, error_callback_count_); // SetPowered(true). adapter_->SetPowered( true, base::Bind(&NfcChromeOSTest::SuccessCallback, base::Unretained(this)), base::Bind(&NfcChromeOSTest::ErrorCallback, base::Unretained(this))); EXPECT_TRUE(adapter_->IsPowered()); EXPECT_EQ(1, observer.powered_changed_count_); EXPECT_EQ(1, success_callback_count_); EXPECT_EQ(1, error_callback_count_); // SetPowered(true), while powered. adapter_->SetPowered( true, base::Bind(&NfcChromeOSTest::SuccessCallback, base::Unretained(this)), base::Bind(&NfcChromeOSTest::ErrorCallback, base::Unretained(this))); EXPECT_TRUE(adapter_->IsPowered()); EXPECT_EQ(1, observer.powered_changed_count_); EXPECT_EQ(1, success_callback_count_); EXPECT_EQ(2, error_callback_count_); // SetPowered(false). adapter_->SetPowered( false, base::Bind(&NfcChromeOSTest::SuccessCallback, base::Unretained(this)), base::Bind(&NfcChromeOSTest::ErrorCallback, base::Unretained(this))); EXPECT_FALSE(adapter_->IsPowered()); EXPECT_EQ(2, observer.powered_changed_count_); EXPECT_EQ(2, success_callback_count_); EXPECT_EQ(2, error_callback_count_); } TEST_F(NfcChromeOSTest, PresentChangedWhilePowered) { TestObserver observer(adapter_); adapter_->AddObserver(&observer); EXPECT_FALSE(adapter_->IsPowered()); EXPECT_TRUE(adapter_->IsPresent()); adapter_->SetPowered( true, base::Bind(&NfcChromeOSTest::SuccessCallback, base::Unretained(this)), base::Bind(&NfcChromeOSTest::ErrorCallback, base::Unretained(this))); EXPECT_TRUE(adapter_->IsPowered()); fake_nfc_adapter_client_->SetAdapterPresent(false); EXPECT_EQ(1, observer.present_changed_count_); EXPECT_EQ(2, observer.powered_changed_count_); EXPECT_FALSE(adapter_->IsPowered()); EXPECT_FALSE(adapter_->IsPresent()); } } // namespace chromeos