diff options
author | sivachandra@chromium.org <sivachandra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-18 02:06:06 +0000 |
---|---|---|
committer | sivachandra@chromium.org <sivachandra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2013-12-18 02:06:06 +0000 |
commit | c53d79b5f356f482b8f44be244929c1e7b47e586 (patch) | |
tree | ce196570ed363ec7df991a1eda491b7bd78c7f5b /chromeos | |
parent | 82ca7c8720626d61491ceff114dc67681500de6d (diff) | |
download | chromium_src-c53d79b5f356f482b8f44be244929c1e7b47e586.zip chromium_src-c53d79b5f356f482b8f44be244929c1e7b47e586.tar.gz chromium_src-c53d79b5f356f482b8f44be244929c1e7b47e586.tar.bz2 |
[chromeos] New PowerManagerClient observer to collect power data.
The observer currently only collects power supply data. This CL
should be treated as the first in a series to address the
marked issue.
BUG=312956
Review URL: https://codereview.chromium.org/101963004
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@241445 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chromeos')
-rw-r--r-- | chromeos/chromeos.gyp | 3 | ||||
-rw-r--r-- | chromeos/power/power_data_collector.cc | 70 | ||||
-rw-r--r-- | chromeos/power/power_data_collector.h | 72 | ||||
-rw-r--r-- | chromeos/power/power_data_collector_unittest.cc | 60 |
4 files changed, 205 insertions, 0 deletions
diff --git a/chromeos/chromeos.gyp b/chromeos/chromeos.gyp index 635c705..3d74363 100644 --- a/chromeos/chromeos.gyp +++ b/chromeos/chromeos.gyp @@ -320,6 +320,8 @@ 'network/shill_property_util.h', 'network/dhcp_proxy_script_fetcher_chromeos.cc', 'network/dhcp_proxy_script_fetcher_chromeos.h', + 'power/power_data_collector.cc', + 'power/power_data_collector.h', 'process_proxy/process_output_watcher.cc', 'process_proxy/process_output_watcher.h', 'process_proxy/process_proxy.cc', @@ -515,6 +517,7 @@ 'network/onc/onc_validator_unittest.cc', 'network/shill_property_handler_unittest.cc', 'network/shill_property_util_unittest.cc', + 'power/power_data_collector_unittest.cc', 'process_proxy/process_output_watcher_unittest.cc', 'process_proxy/process_proxy_unittest.cc', 'system/name_value_pairs_parser_unittest.cc', diff --git a/chromeos/power/power_data_collector.cc b/chromeos/power/power_data_collector.cc new file mode 100644 index 0000000..cc84e5c --- /dev/null +++ b/chromeos/power/power_data_collector.cc @@ -0,0 +1,70 @@ +// Copyright 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 "chromeos/power/power_data_collector.h" + +#include "base/logging.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/power_manager/power_supply_properties.pb.h" + +namespace chromeos { + +namespace { + +// The global PowerDataCollector instance. +PowerDataCollector* g_power_data_collector = NULL; + +} // namespace + +// static +void PowerDataCollector::Initialize() { + // Check that power data collector is initialized only after the + // DBusThreadManager is initialized. + CHECK(DBusThreadManager::Get()); + CHECK(g_power_data_collector == NULL); + g_power_data_collector = new PowerDataCollector(); +} + +// static +void PowerDataCollector::Shutdown() { + // Shutdown only if initialized. + CHECK(g_power_data_collector); + delete g_power_data_collector; + g_power_data_collector = NULL; +} + +// static +PowerDataCollector* PowerDataCollector::Get() { + CHECK(g_power_data_collector); + return g_power_data_collector; +} + +void PowerDataCollector::PowerChanged( + const power_manager::PowerSupplyProperties& prop) { + PowerSupplySnapshot snapshot; + snapshot.time = base::TimeTicks::Now(); + snapshot.external_power = (prop.external_power() != + power_manager::PowerSupplyProperties::DISCONNECTED); + snapshot.battery_percent = prop.battery_percent(); + + power_supply_data_.push_back(snapshot); +} + +PowerDataCollector::PowerDataCollector() { + DBusThreadManager::Get()->GetPowerManagerClient()->AddObserver(this); +} + +PowerDataCollector::~PowerDataCollector() { + DBusThreadManager* dbus_manager = DBusThreadManager::Get(); + CHECK(dbus_manager); + dbus_manager->GetPowerManagerClient()->RemoveObserver(this); +} + +PowerDataCollector::PowerSupplySnapshot::PowerSupplySnapshot() + : time(base::TimeTicks::Now()), + external_power(false), + battery_percent(0) { +} + +} // namespace chromeos diff --git a/chromeos/power/power_data_collector.h b/chromeos/power/power_data_collector.h new file mode 100644 index 0000000..581faa0 --- /dev/null +++ b/chromeos/power/power_data_collector.h @@ -0,0 +1,72 @@ +// Copyright 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. + +#ifndef CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ +#define CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ + +#include <vector> + +#include "base/basictypes.h" +#include "base/compiler_specific.h" +#include "base/time/time.h" +#include "chromeos/chromeos_export.h" +#include "chromeos/dbus/power_manager_client.h" + +namespace power_manager { +class PowerSupplyProperties; +} + +namespace chromeos { + +// A class which starts collecting power metrics, like the battery charge, as +// soon as it is initialized via Initialize(). +// +// This class is implemented as a global singleton, initialized after +// DBusThreadManager which it depends on. +class CHROMEOS_EXPORT PowerDataCollector : public PowerManagerClient::Observer { + public: + struct PowerSupplySnapshot { + PowerSupplySnapshot(); + + // Time when the snapshot was captured. + base::TimeTicks time; + + // True if connected to external power at the time of the snapshot. + bool external_power; + + // The battery charge as a percentage of full charge in range [0.0, 100.00]. + double battery_percent; + }; + + const std::vector<PowerSupplySnapshot>& power_supply_data() const { + return power_supply_data_; + } + + // Can be called only after DBusThreadManager is initialized. + static void Initialize(); + + // Can be called only if initialized via Initialize, and before + // DBusThreadManager is destroyed. + static void Shutdown(); + + // Returns the global instance of PowerDataCollector. + static PowerDataCollector* Get(); + + // PowerManagerClient::Observer implementation: + virtual void PowerChanged( + const power_manager::PowerSupplyProperties& prop) OVERRIDE; + + private: + PowerDataCollector(); + + virtual ~PowerDataCollector(); + + std::vector<PowerSupplySnapshot> power_supply_data_; + + DISALLOW_COPY_AND_ASSIGN(PowerDataCollector); +}; + +} // namespace chromeos + +#endif // CHROMEOS_POWER_POWER_DATA_COLLECTOR_H_ diff --git a/chromeos/power/power_data_collector_unittest.cc b/chromeos/power/power_data_collector_unittest.cc new file mode 100644 index 0000000..a04a4d8 --- /dev/null +++ b/chromeos/power/power_data_collector_unittest.cc @@ -0,0 +1,60 @@ +// Copyright 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 "chromeos/power/power_data_collector.h" +#include "chromeos/dbus/dbus_thread_manager.h" +#include "chromeos/dbus/fake_dbus_thread_manager.h" +#include "chromeos/dbus/power_manager/power_supply_properties.pb.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace chromeos { + +class PowerDataCollectorTest : public testing::Test { + public: + PowerDataCollectorTest() : power_data_collector_(NULL) {} + virtual ~PowerDataCollectorTest() {} + + virtual void SetUp() OVERRIDE { + FakeDBusThreadManager* fake_dbus_thread_manager = new FakeDBusThreadManager; + fake_dbus_thread_manager->SetFakeClients(); + DBusThreadManager::InitializeForTesting(fake_dbus_thread_manager); + PowerDataCollector::Initialize(); + power_data_collector_ = PowerDataCollector::Get(); + } + + virtual void TearDown() OVERRIDE { + PowerDataCollector::Shutdown(); + DBusThreadManager::Shutdown(); + power_data_collector_ = NULL; + } + + protected: + PowerDataCollector* power_data_collector_; +}; + +TEST_F(PowerDataCollectorTest, PowerChanged) { + power_manager::PowerSupplyProperties prop1, prop2; + + prop1.set_external_power(power_manager::PowerSupplyProperties::DISCONNECTED); + prop1.set_battery_percent(20.00); + + power_data_collector_->PowerChanged(prop1); + const std::vector<PowerDataCollector::PowerSupplySnapshot>& data1 = + power_data_collector_->power_supply_data(); + ASSERT_EQ(static_cast<size_t>(1), data1.size()); + EXPECT_DOUBLE_EQ(prop1.battery_percent(), data1[0].battery_percent); + EXPECT_FALSE(data1[0].external_power); + + prop2.set_external_power(power_manager::PowerSupplyProperties::AC); + prop2.set_battery_percent(100.00); + + power_data_collector_->PowerChanged(prop2); + const std::vector<PowerDataCollector::PowerSupplySnapshot>& data2 = + power_data_collector_->power_supply_data(); + ASSERT_EQ(static_cast<size_t>(2), data2.size()); + EXPECT_DOUBLE_EQ(prop2.battery_percent(), data1[1].battery_percent); + EXPECT_TRUE(data2[1].external_power); +} + +} // namespace chromeos |