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 "chrome/browser/chromeos/power/peripheral_battery_observer.h" 6 7 #include "base/command_line.h" 8 #include "base/message_loop/message_loop.h" 9 #include "chrome/browser/browser_process.h" 10 #include "chrome/browser/chromeos/cros/cros_in_process_browser_test.h" 11 #include "chrome/browser/notifications/notification_ui_manager.h" 12 #include "chromeos/dbus/mock_dbus_thread_manager_without_gmock.h" 13 #include "content/public/browser/browser_thread.h" 14 #include "content/public/test/test_browser_thread.h" 15 #include "content/public/test/test_utils.h" 16 #include "testing/gmock/include/gmock/gmock.h" 17 #include "testing/gtest/include/gtest/gtest.h" 18 19 using ::testing::_; 20 using ::testing::InSequence; 21 using ::testing::Return; 22 using ::testing::SaveArg; 23 24 namespace { 25 26 const char kTestBatteryPath[] = "/sys/class/power_supply/hid-AA:BB:CC-battery"; 27 const char kTestBatteryAddress[] = "cc:bb:aa"; 28 const char kTestDeviceName[] = "test device"; 29 30 } // namespace 31 32 namespace chromeos { 33 34 class PeripheralBatteryObserverTest : public CrosInProcessBrowserTest { 35 public: 36 PeripheralBatteryObserverTest () {} 37 virtual ~PeripheralBatteryObserverTest () {} 38 39 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE { 40 MockDBusThreadManagerWithoutGMock* mock_dbus_thread_manager = 41 new MockDBusThreadManagerWithoutGMock; 42 DBusThreadManager::InitializeForTesting(mock_dbus_thread_manager); 43 CrosInProcessBrowserTest::SetUpInProcessBrowserTestFixture(); 44 } 45 46 virtual void SetUpOnMainThread() OVERRIDE { 47 observer_.reset(new PeripheralBatteryObserver()); 48 } 49 50 virtual void CleanUpOnMainThread() OVERRIDE { 51 observer_.reset(); 52 } 53 54 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE { 55 CrosInProcessBrowserTest::TearDownInProcessBrowserTestFixture(); 56 DBusThreadManager::Shutdown(); 57 } 58 59 protected: 60 scoped_ptr<PeripheralBatteryObserver> observer_; 61 62 private: 63 DISALLOW_COPY_AND_ASSIGN(PeripheralBatteryObserverTest); 64 }; 65 66 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, Basic) { 67 base::SimpleTestTickClock clock; 68 observer_->set_testing_clock(&clock); 69 70 NotificationUIManager* notification_manager = 71 g_browser_process->notification_ui_manager(); 72 73 // Level 50 at time 100, no low-battery notification. 74 clock.Advance(base::TimeDelta::FromSeconds(100)); 75 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 76 kTestDeviceName, 50); 77 EXPECT_EQ(observer_->batteries_.count(kTestBatteryAddress), 1u); 78 79 const PeripheralBatteryObserver::BatteryInfo& info = 80 observer_->batteries_[kTestBatteryAddress]; 81 82 EXPECT_EQ(info.name, kTestDeviceName); 83 EXPECT_EQ(info.level, 50); 84 EXPECT_EQ(info.last_notification_timestamp, base::TimeTicks()); 85 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL); 86 87 // Level 5 at time 110, low-battery notification. 88 clock.Advance(base::TimeDelta::FromSeconds(10)); 89 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 90 kTestDeviceName, 5); 91 EXPECT_EQ(info.level, 5); 92 EXPECT_EQ(info.last_notification_timestamp, clock.NowTicks()); 93 EXPECT_TRUE(notification_manager->FindById(kTestBatteryAddress) != NULL); 94 95 // Level -1 at time 115, cancel previous notification 96 clock.Advance(base::TimeDelta::FromSeconds(5)); 97 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 98 kTestDeviceName, -1); 99 EXPECT_EQ(info.level, 5); 100 EXPECT_EQ(info.last_notification_timestamp, 101 clock.NowTicks() - base::TimeDelta::FromSeconds(5)); 102 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL); 103 104 // Level 50 at time 120, no low-battery notification. 105 clock.Advance(base::TimeDelta::FromSeconds(5)); 106 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 107 kTestDeviceName, 50); 108 EXPECT_EQ(info.level, 50); 109 EXPECT_EQ(info.last_notification_timestamp, 110 clock.NowTicks() - base::TimeDelta::FromSeconds(10)); 111 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL); 112 113 // Level 5 at time 130, no low-battery notification (throttling). 114 clock.Advance(base::TimeDelta::FromSeconds(10)); 115 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 116 kTestDeviceName, 5); 117 EXPECT_EQ(info.level, 5); 118 EXPECT_EQ(info.last_notification_timestamp, 119 clock.NowTicks() - base::TimeDelta::FromSeconds(20)); 120 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL); 121 } 122 123 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, InvalidBatteryInfo) { 124 observer_->PeripheralBatteryStatusReceived("invalid-path", kTestDeviceName, 125 10); 126 EXPECT_TRUE(observer_->batteries_.empty()); 127 128 observer_->PeripheralBatteryStatusReceived( 129 "/sys/class/power_supply/hid-battery", kTestDeviceName, 10); 130 EXPECT_TRUE(observer_->batteries_.empty()); 131 132 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 133 kTestDeviceName, -2); 134 EXPECT_TRUE(observer_->batteries_.empty()); 135 136 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 137 kTestDeviceName, 101); 138 EXPECT_TRUE(observer_->batteries_.empty()); 139 140 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 141 kTestDeviceName, -1); 142 EXPECT_TRUE(observer_->batteries_.empty()); 143 } 144 145 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, DeviceRemove) { 146 NotificationUIManager* notification_manager = 147 g_browser_process->notification_ui_manager(); 148 149 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath, 150 kTestDeviceName, 5); 151 EXPECT_EQ(observer_->batteries_.count(kTestBatteryAddress), 1u); 152 EXPECT_TRUE(notification_manager->FindById(kTestBatteryAddress) != NULL); 153 154 observer_->RemoveBattery(kTestBatteryAddress); 155 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL); 156 } 157 158 } // namespace chromeos 159