1 // Copyright (c) 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 "ash/system/chromeos/power/power_status.h"
10 #include "base/command_line.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "base/message_loop/message_loop.h"
13 #include "chromeos/dbus/dbus_thread_manager.h"
14 #include "testing/gtest/include/gtest/gtest.h"
15 #include "third_party/cros_system_api/dbus/service_constants.h"
20 class TestObserver : public PowerStatus::Observer {
22 TestObserver() : power_changed_count_(0) {}
23 virtual ~TestObserver() {}
25 int power_changed_count() const { return power_changed_count_; }
27 // PowerStatus::Observer overrides:
28 virtual void OnPowerStatusChanged() OVERRIDE { ++power_changed_count_; }
31 int power_changed_count_;
33 DISALLOW_COPY_AND_ASSIGN(TestObserver);
38 class PowerStatusTest : public testing::Test {
40 PowerStatusTest() : power_status_(NULL) {}
41 virtual ~PowerStatusTest() {}
43 virtual void SetUp() OVERRIDE {
44 chromeos::DBusThreadManager::InitializeWithStub();
45 PowerStatus::Initialize();
46 power_status_ = PowerStatus::Get();
47 test_observer_.reset(new TestObserver);
48 power_status_->AddObserver(test_observer_.get());
51 virtual void TearDown() OVERRIDE {
52 power_status_->RemoveObserver(test_observer_.get());
53 test_observer_.reset();
54 PowerStatus::Shutdown();
55 chromeos::DBusThreadManager::Shutdown();
59 base::MessageLoopForUI message_loop_;
60 PowerStatus* power_status_; // Not owned.
61 scoped_ptr<TestObserver> test_observer_;
64 DISALLOW_COPY_AND_ASSIGN(PowerStatusTest);
67 TEST_F(PowerStatusTest, InitializeAndUpdate) {
68 // Test that the initial power supply state should be acquired after
69 // PowerStatus is instantiated. This depends on
70 // PowerManagerClientStubImpl, which responds to power status update
71 // requests, pretends there is a battery present, and generates some valid
72 // power supply status data.
73 message_loop_.RunUntilIdle();
74 EXPECT_EQ(1, test_observer_->power_changed_count());
76 // Test RequestUpdate, test_obsever_ should be notified for power suuply
78 power_status_->RequestStatusUpdate();
79 message_loop_.RunUntilIdle();
80 EXPECT_EQ(2, test_observer_->power_changed_count());
83 TEST_F(PowerStatusTest, ShouldDisplayBatteryTime) {
84 EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime(
85 base::TimeDelta::FromSeconds(-1)));
86 EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime(
87 base::TimeDelta::FromSeconds(0)));
88 EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime(
89 base::TimeDelta::FromSeconds(59)));
90 EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime(
91 base::TimeDelta::FromSeconds(60)));
92 EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime(
93 base::TimeDelta::FromSeconds(600)));
94 EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime(
95 base::TimeDelta::FromSeconds(3600)));
96 EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime(
97 base::TimeDelta::FromSeconds(
98 PowerStatus::kMaxBatteryTimeToDisplaySec)));
99 EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime(
100 base::TimeDelta::FromSeconds(
101 PowerStatus::kMaxBatteryTimeToDisplaySec + 1)));
104 TEST_F(PowerStatusTest, SplitTimeIntoHoursAndMinutes) {
105 int hours = 0, minutes = 0;
106 PowerStatus::SplitTimeIntoHoursAndMinutes(
107 base::TimeDelta::FromSeconds(0), &hours, &minutes);
109 EXPECT_EQ(0, minutes);
111 PowerStatus::SplitTimeIntoHoursAndMinutes(
112 base::TimeDelta::FromSeconds(60), &hours, &minutes);
114 EXPECT_EQ(1, minutes);
116 PowerStatus::SplitTimeIntoHoursAndMinutes(
117 base::TimeDelta::FromSeconds(3600), &hours, &minutes);
119 EXPECT_EQ(0, minutes);
121 PowerStatus::SplitTimeIntoHoursAndMinutes(
122 base::TimeDelta::FromSeconds(3600 + 60), &hours, &minutes);
124 EXPECT_EQ(1, minutes);
126 PowerStatus::SplitTimeIntoHoursAndMinutes(
127 base::TimeDelta::FromSeconds(7 * 3600 + 23 * 60), &hours, &minutes);
129 EXPECT_EQ(23, minutes);
131 // Check that minutes are rounded.
132 PowerStatus::SplitTimeIntoHoursAndMinutes(
133 base::TimeDelta::FromSeconds(2 * 3600 + 3 * 60 + 30), &hours, &minutes);
135 EXPECT_EQ(4, minutes);
137 PowerStatus::SplitTimeIntoHoursAndMinutes(
138 base::TimeDelta::FromSeconds(2 * 3600 + 3 * 60 + 29), &hours, &minutes);
140 EXPECT_EQ(3, minutes);
142 // Check that times close to hour boundaries aren't incorrectly rounded such
143 // that they display 60 minutes: http://crbug.com/368261
144 PowerStatus::SplitTimeIntoHoursAndMinutes(
145 base::TimeDelta::FromSecondsD(3599.9), &hours, &minutes);
147 EXPECT_EQ(0, minutes);
149 PowerStatus::SplitTimeIntoHoursAndMinutes(
150 base::TimeDelta::FromSecondsD(3600.1), &hours, &minutes);
152 EXPECT_EQ(0, minutes);