// Copyright (c) 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 "ash/system/chromeos/power/power_status.h" #include #include #include "base/command_line.h" #include "base/memory/scoped_ptr.h" #include "base/message_loop/message_loop.h" #include "chromeos/dbus/dbus_thread_manager.h" #include "testing/gtest/include/gtest/gtest.h" #include "third_party/cros_system_api/dbus/service_constants.h" namespace ash { namespace internal { namespace { class TestObserver : public PowerStatus::Observer { public: TestObserver() : power_changed_count_(0) {} virtual ~TestObserver() {} int power_changed_count() const { return power_changed_count_; } // PowerStatus::Observer overrides: virtual void OnPowerStatusChanged() OVERRIDE { ++power_changed_count_; } private: int power_changed_count_; DISALLOW_COPY_AND_ASSIGN(TestObserver); }; } // namespace class PowerStatusTest : public testing::Test { public: PowerStatusTest() : power_status_(NULL) {} virtual ~PowerStatusTest() {} virtual void SetUp() OVERRIDE { chromeos::DBusThreadManager::InitializeWithStub(); PowerStatus::Initialize(); power_status_ = PowerStatus::Get(); test_observer_.reset(new TestObserver); power_status_->AddObserver(test_observer_.get()); } virtual void TearDown() OVERRIDE { power_status_->RemoveObserver(test_observer_.get()); test_observer_.reset(); PowerStatus::Shutdown(); chromeos::DBusThreadManager::Shutdown(); } protected: base::MessageLoopForUI message_loop_; PowerStatus* power_status_; // Not owned. scoped_ptr test_observer_; private: DISALLOW_COPY_AND_ASSIGN(PowerStatusTest); }; TEST_F(PowerStatusTest, InitializeAndUpdate) { // Test that the initial power supply state should be acquired after // PowerStatus is instantiated. This depends on // PowerManagerClientStubImpl, which responds to power status update // requests, pretends there is a battery present, and generates some valid // power supply status data. message_loop_.RunUntilIdle(); EXPECT_EQ(1, test_observer_->power_changed_count()); // Test RequestUpdate, test_obsever_ should be notified for power suuply // status change. power_status_->RequestStatusUpdate(); message_loop_.RunUntilIdle(); EXPECT_EQ(2, test_observer_->power_changed_count()); } TEST_F(PowerStatusTest, ShouldDisplayBatteryTime) { EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(-1))); EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(0))); EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(59))); EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(60))); EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(600))); EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds(3600))); EXPECT_TRUE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds( PowerStatus::kMaxBatteryTimeToDisplaySec))); EXPECT_FALSE(PowerStatus::ShouldDisplayBatteryTime( base::TimeDelta::FromSeconds( PowerStatus::kMaxBatteryTimeToDisplaySec + 1))); } TEST_F(PowerStatusTest, SplitTimeIntoHoursAndMinutes) { int hours = 0, minutes = 0; PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(0), &hours, &minutes); EXPECT_EQ(0, hours); EXPECT_EQ(0, minutes); PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(60), &hours, &minutes); EXPECT_EQ(0, hours); EXPECT_EQ(1, minutes); PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(3600), &hours, &minutes); EXPECT_EQ(1, hours); EXPECT_EQ(0, minutes); PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(3600 + 60), &hours, &minutes); EXPECT_EQ(1, hours); EXPECT_EQ(1, minutes); PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(7 * 3600 + 23 * 60), &hours, &minutes); EXPECT_EQ(7, hours); EXPECT_EQ(23, minutes); // Check that minutes are rounded. PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(2 * 3600 + 3 * 60 + 30), &hours, &minutes); EXPECT_EQ(2, hours); EXPECT_EQ(4, minutes); PowerStatus::SplitTimeIntoHoursAndMinutes( base::TimeDelta::FromSeconds(2 * 3600 + 3 * 60 + 29), &hours, &minutes); EXPECT_EQ(2, hours); EXPECT_EQ(3, minutes); } } // namespace internal } // namespace ash