summaryrefslogtreecommitdiffstats
path: root/chromeos
diff options
context:
space:
mode:
authorsivachandra@chromium.org <sivachandra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-18 02:06:06 +0000
committersivachandra@chromium.org <sivachandra@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2013-12-18 02:06:06 +0000
commitc53d79b5f356f482b8f44be244929c1e7b47e586 (patch)
treece196570ed363ec7df991a1eda491b7bd78c7f5b /chromeos
parent82ca7c8720626d61491ceff114dc67681500de6d (diff)
downloadchromium_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.gyp3
-rw-r--r--chromeos/power/power_data_collector.cc70
-rw-r--r--chromeos/power/power_data_collector.h72
-rw-r--r--chromeos/power/power_data_collector_unittest.cc60
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