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.
5 #include "chrome/browser/chromeos/power/peripheral_battery_observer.h"
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/notifications/notification_ui_manager.h"
11 #include "chrome/test/base/in_process_browser_test.h"
12 #include "chromeos/dbus/fake_dbus_thread_manager.h"
13 #include "content/public/test/test_utils.h"
14 #include "testing/gmock/include/gmock/gmock.h"
15 #include "testing/gtest/include/gtest/gtest.h"
18 using ::testing::InSequence;
19 using ::testing::Return;
20 using ::testing::SaveArg;
24 const char kTestBatteryPath[] = "/sys/class/power_supply/hid-AA:BB:CC-battery";
25 const char kTestBatteryAddress[] = "cc:bb:aa";
26 const char kTestDeviceName[] = "test device";
32 class PeripheralBatteryObserverTest : public InProcessBrowserTest {
34 PeripheralBatteryObserverTest() {}
35 virtual ~PeripheralBatteryObserverTest() {}
37 virtual void SetUpInProcessBrowserTestFixture() OVERRIDE {
38 FakeDBusThreadManager* fake_dbus_thread_manager =
39 new FakeDBusThreadManager;
40 fake_dbus_thread_manager->SetFakeClients();
41 DBusThreadManager::SetInstanceForTesting(fake_dbus_thread_manager);
42 InProcessBrowserTest::SetUpInProcessBrowserTestFixture();
45 virtual void SetUpOnMainThread() OVERRIDE {
46 observer_.reset(new PeripheralBatteryObserver());
49 virtual void TearDownOnMainThread() OVERRIDE {
53 virtual void TearDownInProcessBrowserTestFixture() OVERRIDE {
54 InProcessBrowserTest::TearDownInProcessBrowserTestFixture();
58 scoped_ptr<PeripheralBatteryObserver> observer_;
61 DISALLOW_COPY_AND_ASSIGN(PeripheralBatteryObserverTest);
64 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, Basic) {
65 base::SimpleTestTickClock clock;
66 observer_->set_testing_clock(&clock);
68 NotificationUIManager* notification_manager =
69 g_browser_process->notification_ui_manager();
71 // Level 50 at time 100, no low-battery notification.
72 clock.Advance(base::TimeDelta::FromSeconds(100));
73 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
75 EXPECT_EQ(observer_->batteries_.count(kTestBatteryAddress), 1u);
77 const PeripheralBatteryObserver::BatteryInfo& info =
78 observer_->batteries_[kTestBatteryAddress];
80 EXPECT_EQ(info.name, kTestDeviceName);
81 EXPECT_EQ(info.level, 50);
82 EXPECT_EQ(info.last_notification_timestamp, base::TimeTicks());
83 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL);
85 // Level 5 at time 110, low-battery notification.
86 clock.Advance(base::TimeDelta::FromSeconds(10));
87 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
89 EXPECT_EQ(info.level, 5);
90 EXPECT_EQ(info.last_notification_timestamp, clock.NowTicks());
91 EXPECT_TRUE(notification_manager->FindById(kTestBatteryAddress) != NULL);
93 // Level -1 at time 115, cancel previous notification
94 clock.Advance(base::TimeDelta::FromSeconds(5));
95 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
97 EXPECT_EQ(info.level, 5);
98 EXPECT_EQ(info.last_notification_timestamp,
99 clock.NowTicks() - base::TimeDelta::FromSeconds(5));
100 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL);
102 // Level 50 at time 120, no low-battery notification.
103 clock.Advance(base::TimeDelta::FromSeconds(5));
104 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
105 kTestDeviceName, 50);
106 EXPECT_EQ(info.level, 50);
107 EXPECT_EQ(info.last_notification_timestamp,
108 clock.NowTicks() - base::TimeDelta::FromSeconds(10));
109 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL);
111 // Level 5 at time 130, no low-battery notification (throttling).
112 clock.Advance(base::TimeDelta::FromSeconds(10));
113 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
115 EXPECT_EQ(info.level, 5);
116 EXPECT_EQ(info.last_notification_timestamp,
117 clock.NowTicks() - base::TimeDelta::FromSeconds(20));
118 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL);
121 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, InvalidBatteryInfo) {
122 observer_->PeripheralBatteryStatusReceived("invalid-path", kTestDeviceName,
124 EXPECT_TRUE(observer_->batteries_.empty());
126 observer_->PeripheralBatteryStatusReceived(
127 "/sys/class/power_supply/hid-battery", kTestDeviceName, 10);
128 EXPECT_TRUE(observer_->batteries_.empty());
130 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
131 kTestDeviceName, -2);
132 EXPECT_TRUE(observer_->batteries_.empty());
134 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
135 kTestDeviceName, 101);
136 EXPECT_TRUE(observer_->batteries_.empty());
138 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
139 kTestDeviceName, -1);
140 EXPECT_TRUE(observer_->batteries_.empty());
143 IN_PROC_BROWSER_TEST_F(PeripheralBatteryObserverTest, DeviceRemove) {
144 NotificationUIManager* notification_manager =
145 g_browser_process->notification_ui_manager();
147 observer_->PeripheralBatteryStatusReceived(kTestBatteryPath,
149 EXPECT_EQ(observer_->batteries_.count(kTestBatteryAddress), 1u);
150 EXPECT_TRUE(notification_manager->FindById(kTestBatteryAddress) != NULL);
152 observer_->RemoveBattery(kTestBatteryAddress);
153 EXPECT_FALSE(notification_manager->FindById(kTestBatteryAddress) != NULL);
156 } // namespace chromeos