| // Copyright (c) 2012 The Chromium OS 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 "shill/power_manager.h" |
| |
| #include <string> |
| |
| #include <base/bind.h> |
| #include <base/memory/scoped_ptr.h> |
| #include <gmock/gmock.h> |
| #include <gtest/gtest.h> |
| |
| #include "shill/mock_power_manager_proxy.h" |
| #include "shill/power_manager_proxy_interface.h" |
| #include "shill/proxy_factory.h" |
| |
| using base::Bind; |
| using base::Unretained; |
| using std::string; |
| using testing::_; |
| using testing::Test; |
| |
| namespace shill { |
| |
| namespace { |
| |
| class FakeProxyFactory : public ProxyFactory { |
| public: |
| FakeProxyFactory() : delegate_(NULL) {} |
| |
| virtual PowerManagerProxyInterface *CreatePowerManagerProxy( |
| PowerManagerProxyDelegate *delegate) { |
| delegate_ = delegate; |
| return new MockPowerManagerProxy; |
| } |
| PowerManagerProxyDelegate *delegate() const { return delegate_; } |
| |
| private: |
| PowerManagerProxyDelegate *delegate_; |
| }; |
| |
| } // namespace |
| |
| class PowerManagerTest : public Test { |
| public: |
| PowerManagerTest() |
| : power_manager_(&factory_), |
| delegate_(factory_.delegate()) { } |
| |
| MOCK_METHOD1(TestCallback1, void(PowerManager::SuspendState)); |
| MOCK_METHOD1(TestCallback2, void(PowerManager::SuspendState)); |
| |
| protected: |
| FakeProxyFactory factory_; |
| PowerManager power_manager_; |
| PowerManagerProxyDelegate *const delegate_; |
| }; |
| |
| TEST_F(PowerManagerTest, Add) { |
| const string kKey = "Zaphod"; |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn)); |
| power_manager_.AddStateChangeCallback( |
| kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| power_manager_.RemoveStateChangeCallback(kKey); |
| } |
| |
| TEST_F(PowerManagerTest, AddMultipleRunMultiple) { |
| const string kKey1 = "Zaphod"; |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn)); |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem)); |
| power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| |
| const string kKey2 = "Beeblebrox"; |
| EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn)); |
| EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem)); |
| power_manager_.AddStateChangeCallback( |
| kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this))); |
| |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem); |
| } |
| |
| TEST_F(PowerManagerTest, Remove) { |
| const string kKey1 = "Zaphod"; |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn)); |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kMem)); |
| power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| |
| const string kKey2 = "Beeblebrox"; |
| EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn)); |
| EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kMem)).Times(0); |
| power_manager_.AddStateChangeCallback( |
| kKey2, Bind(&PowerManagerTest::TestCallback2, Unretained(this))); |
| |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| |
| power_manager_.RemoveStateChangeCallback(kKey2); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kMem); |
| |
| power_manager_.RemoveStateChangeCallback(kKey1); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| } |
| |
| TEST_F(PowerManagerTest, OnSuspendDelayIgnored) { |
| const string kKey = "Zaphod"; |
| EXPECT_CALL(*this, TestCallback1(_)).Times(0); |
| power_manager_.AddStateChangeCallback( |
| kKey, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| factory_.delegate()->OnSuspendDelay(99); |
| } |
| |
| typedef PowerManagerTest PowerManagerDeathTest; |
| |
| TEST_F(PowerManagerDeathTest, AddDuplicateKey) { |
| const string kKey1 = "Zaphod"; |
| power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| |
| #ifndef NDEBUG |
| // Adding another callback with the same key is an error and causes a crash in |
| // debug mode. |
| EXPECT_DEATH(power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this))), |
| "Inserting duplicate key"); |
| #else // NDEBUG |
| EXPECT_CALL(*this, TestCallback2(PowerManagerProxyDelegate::kOn)); |
| power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback2, Unretained(this))); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| #endif // NDEBUG |
| } |
| |
| TEST_F(PowerManagerDeathTest, RemoveUnknownKey) { |
| const string kKey1 = "Zaphod"; |
| const string kKey2 = "Beeblebrox"; |
| power_manager_.AddStateChangeCallback( |
| kKey1, Bind(&PowerManagerTest::TestCallback1, Unretained(this))); |
| |
| #ifndef NDEBUG |
| // Attempting to remove a callback key that was not added is an error and |
| // crashes in debug mode. |
| EXPECT_DEATH(power_manager_.RemoveStateChangeCallback(kKey2), |
| "Removing unknown key"); |
| #else // NDEBUG |
| EXPECT_CALL(*this, TestCallback1(PowerManagerProxyDelegate::kOn)); |
| |
| // In non-debug mode, removing an unknown key does nothing. |
| power_manager_.RemoveStateChangeCallback(kKey2); |
| factory_.delegate()->OnPowerStateChanged(PowerManagerProxyDelegate::kOn); |
| #endif // NDEBUG |
| } |
| |
| } // namespace shill |