Add PowerManagerInterface.
Hide all dbus stuff under the new interface, so that we can implement
a real power_manager for android in the future if needed.
Test: mma
Bug: 28800946
Change-Id: I26c883f4d0bc71f0410dfe4422b22bdd9df70575
diff --git a/Android.mk b/Android.mk
index 9ec55a3..e94e9a4 100644
--- a/Android.mk
+++ b/Android.mk
@@ -28,8 +28,6 @@
local_use_libcros := $(if $(BRILLO_USE_LIBCROS),$(BRILLO_USE_LIBCROS),0)
local_use_mtd := $(if $(BRILLO_USE_MTD),$(BRILLO_USE_MTD),0)
local_use_omaha := $(if $(BRILLO_USE_OMAHA),$(BRILLO_USE_OMAHA),0)
-local_use_power_management := \
- $(if $(BRILLO_USE_POWER_MANAGEMENT),$(BRILLO_USE_POWER_MANAGEMENT),0)
local_use_weave := $(if $(BRILLO_USE_WEAVE),$(BRILLO_USE_WEAVE),0)
ue_common_cflags := \
@@ -39,7 +37,6 @@
-DUSE_LIBCROS=$(local_use_libcros) \
-DUSE_MTD=$(local_use_mtd) \
-DUSE_OMAHA=$(local_use_omaha) \
- -DUSE_POWER_MANAGEMENT=$(local_use_power_management) \
-DUSE_WEAVE=$(local_use_weave) \
-D_FILE_OFFSET_BITS=64 \
-D_POSIX_C_SOURCE=199309L \
@@ -322,6 +319,7 @@
omaha_utils.cc \
p2p_manager.cc \
payload_state.cc \
+ power_manager_android.cc \
proxy_resolver.cc \
real_system_state.cc \
update_attempter.cc \
diff --git a/fake_system_state.h b/fake_system_state.h
index 12d9239..030cb07 100644
--- a/fake_system_state.h
+++ b/fake_system_state.h
@@ -20,8 +20,6 @@
#include <base/logging.h>
#include <gmock/gmock.h>
#include <policy/mock_device_policy.h>
-#include <power_manager/dbus-proxies.h>
-#include <power_manager/dbus-proxy-mocks.h>
#include "metrics/metrics_library_mock.h"
#include "update_engine/common/fake_boot_control.h"
@@ -32,6 +30,7 @@
#include "update_engine/mock_omaha_request_params.h"
#include "update_engine/mock_p2p_manager.h"
#include "update_engine/mock_payload_state.h"
+#include "update_engine/mock_power_manager.h"
#include "update_engine/mock_update_attempter.h"
#include "update_engine/system_state.h"
#include "update_engine/update_manager/fake_update_manager.h"
@@ -97,9 +96,8 @@
return update_manager_;
}
- inline org::chromium::PowerManagerProxyInterface* power_manager_proxy()
- override {
- return power_manager_proxy_;
+ inline PowerManagerInterface* power_manager() override {
+ return power_manager_;
}
inline bool system_rebooted() override { return fake_system_rebooted_; }
@@ -245,7 +243,7 @@
testing::NiceMock<MockOmahaRequestParams> mock_request_params_;
testing::NiceMock<MockP2PManager> mock_p2p_manager_;
chromeos_update_manager::FakeUpdateManager fake_update_manager_;
- org::chromium::PowerManagerProxyMock mock_power_manager_;
+ testing::NiceMock<MockPowerManager> mock_power_manager_;
// Pointers to objects that client code can override. They are initialized to
// the default implementations above.
@@ -261,8 +259,7 @@
OmahaRequestParams* request_params_;
P2PManager* p2p_manager_;
chromeos_update_manager::UpdateManager* update_manager_;
- org::chromium::PowerManagerProxyInterface* power_manager_proxy_{
- &mock_power_manager_};
+ PowerManagerInterface* power_manager_{&mock_power_manager_};
// Other object pointers (not preinitialized).
const policy::DevicePolicy* device_policy_;
diff --git a/mock_power_manager.h b/mock_power_manager.h
new file mode 100644
index 0000000..8363171
--- /dev/null
+++ b/mock_power_manager.h
@@ -0,0 +1,35 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef UPDATE_ENGINE_MOCK_POWER_MANAGER_H_
+#define UPDATE_ENGINE_MOCK_POWER_MANAGER_H_
+
+#include <gmock/gmock.h>
+
+#include "update_engine/power_manager_interface.h"
+
+namespace chromeos_update_engine {
+
+class MockPowerManager : public PowerManagerInterface {
+ public:
+ MockPowerManager() = default;
+
+ MOCK_METHOD0(RequestReboot, bool(void));
+};
+
+} // namespace chromeos_update_engine
+
+#endif // UPDATE_ENGINE_MOCK_POWER_MANAGER_H_
diff --git a/power_manager_android.cc b/power_manager_android.cc
new file mode 100644
index 0000000..6b7e880
--- /dev/null
+++ b/power_manager_android.cc
@@ -0,0 +1,34 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "update_engine/power_manager_android.h"
+
+#include <base/logging.h>
+
+namespace chromeos_update_engine {
+
+namespace power_manager {
+std::unique_ptr<PowerManagerInterface> CreatePowerManager() {
+ return std::unique_ptr<PowerManagerInterface>(new PowerManagerAndroid());
+}
+}
+
+bool PowerManagerAndroid::RequestReboot() {
+ LOG(WARNING) << "PowerManager not implemented.";
+ return false;
+}
+
+} // namespace chromeos_update_engine
diff --git a/power_manager_android.h b/power_manager_android.h
new file mode 100644
index 0000000..86399ab
--- /dev/null
+++ b/power_manager_android.h
@@ -0,0 +1,40 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef UPDATE_ENGINE_POWER_MANAGER_ANDROID_H_
+#define UPDATE_ENGINE_POWER_MANAGER_ANDROID_H_
+
+#include <base/macros.h>
+
+#include "update_engine/power_manager_interface.h"
+
+namespace chromeos_update_engine {
+
+class PowerManagerAndroid : public PowerManagerInterface {
+ public:
+ PowerManagerAndroid() = default;
+ ~PowerManagerAndroid() override = default;
+
+ // PowerManagerInterface overrides.
+ bool RequestReboot() override;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PowerManagerAndroid);
+};
+
+} // namespace chromeos_update_engine
+
+#endif // UPDATE_ENGINE_POWER_MANAGER_ANDROID_H_
diff --git a/power_manager_chromeos.cc b/power_manager_chromeos.cc
new file mode 100644
index 0000000..e175f95
--- /dev/null
+++ b/power_manager_chromeos.cc
@@ -0,0 +1,43 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#include "update_engine/power_manager_chromeos.h"
+
+#include <power_manager/dbus-constants.h>
+#include <power_manager/dbus-proxies.h>
+
+#include "update_engine/dbus_connection.h"
+
+namespace chromeos_update_engine {
+
+namespace power_manager {
+std::unique_ptr<PowerManagerInterface> CreatePowerManager() {
+ return std::unique_ptr<PowerManagerInterface>(new PowerManagerChromeOS());
+}
+}
+
+PowerManagerChromeOS::PowerManagerChromeOS()
+ : power_manager_proxy_(DBusConnection::Get()->GetDBus()) {}
+
+bool PowerManagerChromeOS::RequestReboot() {
+ LOG(INFO) << "Calling " << ::power_manager::kPowerManagerInterface << "."
+ << ::power_manager::kRequestRestartMethod;
+ brillo::ErrorPtr error;
+ return power_manager_proxy_.RequestRestart(
+ ::power_manager::REQUEST_RESTART_FOR_UPDATE, &error);
+}
+
+} // namespace chromeos_update_engine
diff --git a/power_manager_chromeos.h b/power_manager_chromeos.h
new file mode 100644
index 0000000..ad49889
--- /dev/null
+++ b/power_manager_chromeos.h
@@ -0,0 +1,44 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef UPDATE_ENGINE_POWER_MANAGER_H_
+#define UPDATE_ENGINE_POWER_MANAGER_H_
+
+#include <base/macros.h>
+#include <power_manager/dbus-proxies.h>
+
+#include "update_engine/power_manager_interface.h"
+
+namespace chromeos_update_engine {
+
+class PowerManagerChromeOS : public PowerManagerInterface {
+ public:
+ PowerManagerChromeOS();
+ ~PowerManagerChromeOS() override = default;
+
+ // PowerManagerInterface overrides.
+ bool RequestReboot() override;
+
+ private:
+ // Real DBus proxy using the DBus connection.
+ org::chromium::PowerManagerProxy power_manager_proxy_;
+
+ DISALLOW_COPY_AND_ASSIGN(PowerManagerChromeOS);
+};
+
+} // namespace chromeos_update_engine
+
+#endif // UPDATE_ENGINE_POWER_MANAGER_H_
diff --git a/power_manager_interface.h b/power_manager_interface.h
new file mode 100644
index 0000000..be059ec
--- /dev/null
+++ b/power_manager_interface.h
@@ -0,0 +1,47 @@
+//
+// Copyright (C) 2016 The Android Open Source Project
+//
+// Licensed under the Apache License, Version 2.0 (the "License");
+// you may not use this file except in compliance with the License.
+// You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing, software
+// distributed under the License is distributed on an "AS IS" BASIS,
+// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+// See the License for the specific language governing permissions and
+// limitations under the License.
+//
+
+#ifndef UPDATE_ENGINE_POWER_MANAGER_INTERFACE_H_
+#define UPDATE_ENGINE_POWER_MANAGER_INTERFACE_H_
+
+#include <memory>
+
+#include <base/macros.h>
+
+namespace chromeos_update_engine {
+
+class PowerManagerInterface {
+ public:
+ virtual ~PowerManagerInterface() = default;
+
+ // Request the power manager to restart the device. Returns true on success.
+ virtual bool RequestReboot() = 0;
+
+ protected:
+ PowerManagerInterface() = default;
+
+ private:
+ DISALLOW_COPY_AND_ASSIGN(PowerManagerInterface);
+};
+
+namespace power_manager {
+// Factory function which create a PowerManager.
+std::unique_ptr<PowerManagerInterface> CreatePowerManager();
+}
+
+} // namespace chromeos_update_engine
+
+#endif // UPDATE_ENGINE_POWER_MANAGER_INTERFACE_H_
diff --git a/real_system_state.cc b/real_system_state.cc
index 71bedb5..8ab18ff 100644
--- a/real_system_state.cc
+++ b/real_system_state.cc
@@ -39,7 +39,6 @@
RealSystemState::RealSystemState(const scoped_refptr<dbus::Bus>& bus)
: debugd_proxy_(bus),
- power_manager_proxy_(bus),
session_manager_proxy_(bus) {}
RealSystemState::~RealSystemState() {
@@ -74,6 +73,12 @@
return false;
}
+ power_manager_ = power_manager::CreatePowerManager();
+ if (!power_manager_) {
+ LOG(ERROR) << "Error intializing the PowerManagerInterface.";
+ return false;
+ }
+
// Initialize standard and powerwash-safe prefs.
base::FilePath non_volatile_path;
// TODO(deymo): Fall back to in-memory prefs if there's no physical directory
diff --git a/real_system_state.h b/real_system_state.h
index 758c995..8e7acef 100644
--- a/real_system_state.h
+++ b/real_system_state.h
@@ -24,7 +24,6 @@
#include <debugd/dbus-proxies.h>
#include <metrics/metrics_library.h>
#include <policy/device_policy.h>
-#include <power_manager/dbus-proxies.h>
#include <session_manager/dbus-proxies.h>
#include "update_engine/common/boot_control_interface.h"
@@ -37,6 +36,7 @@
#include "update_engine/dbus_connection.h"
#include "update_engine/p2p_manager.h"
#include "update_engine/payload_state.h"
+#include "update_engine/power_manager_interface.h"
#include "update_engine/update_attempter.h"
#include "update_engine/update_manager/update_manager.h"
#include "update_engine/weave_service_interface.h"
@@ -120,9 +120,8 @@
return update_manager_.get();
}
- inline org::chromium::PowerManagerProxyInterface* power_manager_proxy()
- override {
- return &power_manager_proxy_;
+ inline PowerManagerInterface* power_manager() override {
+ return power_manager_.get();
}
inline bool system_rebooted() override { return system_rebooted_; }
@@ -130,10 +129,12 @@
private:
// Real DBus proxies using the DBus connection.
org::chromium::debugdProxy debugd_proxy_;
- org::chromium::PowerManagerProxy power_manager_proxy_;
org::chromium::SessionManagerInterfaceProxy session_manager_proxy_;
LibCrosProxy libcros_proxy_;
+ // Interface for the power manager.
+ std::unique_ptr<PowerManagerInterface> power_manager_;
+
// Interface for the clock.
std::unique_ptr<BootControlInterface> boot_control_;
diff --git a/system_state.h b/system_state.h
index 7923217..4d040ec 100644
--- a/system_state.h
+++ b/system_state.h
@@ -17,12 +17,6 @@
#ifndef UPDATE_ENGINE_SYSTEM_STATE_H_
#define UPDATE_ENGINE_SYSTEM_STATE_H_
-namespace org {
-namespace chromium {
-class PowerManagerProxyInterface;
-} // namespace chromium
-} // namespace org
-
class MetricsLibraryInterface;
namespace chromeos_update_manager {
@@ -49,6 +43,7 @@
class OmahaRequestParams;
class P2PManager;
class PayloadStateInterface;
+class PowerManagerInterface;
class PrefsInterface;
class UpdateAttempter;
class WeaveServiceInterface;
@@ -112,8 +107,8 @@
// Returns a pointer to the UpdateManager singleton.
virtual chromeos_update_manager::UpdateManager* update_manager() = 0;
- // DBus proxies. Mocked during test.
- virtual org::chromium::PowerManagerProxyInterface* power_manager_proxy() = 0;
+ // Gets the power manager object. Mocked during test.
+ virtual PowerManagerInterface* power_manager() = 0;
// If true, this is the first instance of the update engine since the system
// restarted. Important for tracking whether you are running instance of the
diff --git a/update_attempter.cc b/update_attempter.cc
index f9f12bc..57a9074 100644
--- a/update_attempter.cc
+++ b/update_attempter.cc
@@ -37,8 +37,6 @@
#include <debugd/dbus-constants.h>
#include <policy/device_policy.h>
#include <policy/libpolicy.h>
-#include <power_manager/dbus-constants.h>
-#include <power_manager/dbus-proxies.h>
#include <update_engine/dbus-constants.h>
#include "update_engine/common/boot_control_interface.h"
@@ -62,6 +60,7 @@
#include "update_engine/payload_consumer/filesystem_verifier_action.h"
#include "update_engine/payload_consumer/postinstall_runner_action.h"
#include "update_engine/payload_state_interface.h"
+#include "update_engine/power_manager_interface.h"
#include "update_engine/system_state.h"
#include "update_engine/update_manager/policy.h"
#include "update_engine/update_manager/update_manager.h"
@@ -818,7 +817,7 @@
return false;
}
- if (USE_POWER_MANAGEMENT && RequestPowerManagerReboot())
+ if (system_state_->power_manager()->RequestReboot())
return true;
return RebootDirectly();
@@ -834,20 +833,6 @@
prefs_->SetInt64(kPrefsUpdateCompletedBootTime, value);
}
-bool UpdateAttempter::RequestPowerManagerReboot() {
- org::chromium::PowerManagerProxyInterface* power_manager_proxy =
- system_state_->power_manager_proxy();
- if (!power_manager_proxy) {
- LOG(WARNING) << "No PowerManager proxy defined, skipping reboot.";
- return false;
- }
- LOG(INFO) << "Calling " << power_manager::kPowerManagerInterface << "."
- << power_manager::kRequestRestartMethod;
- brillo::ErrorPtr error;
- return power_manager_proxy->RequestRestart(
- power_manager::REQUEST_RESTART_FOR_UPDATE, &error);
-}
-
bool UpdateAttempter::RebootDirectly() {
vector<string> command;
command.push_back("/sbin/shutdown");
diff --git a/update_attempter.h b/update_attempter.h
index b045614..58a41d3 100644
--- a/update_attempter.h
+++ b/update_attempter.h
@@ -381,10 +381,6 @@
// |update_completed_marker_| is empty.
void WriteUpdateCompletedMarker();
- // Sends a D-Bus message to the Chrome OS power manager asking it to reboot
- // the system. Returns true on success.
- bool RequestPowerManagerReboot();
-
// Reboots the system directly by calling /sbin/shutdown. Returns true on
// success.
bool RebootDirectly();
diff --git a/update_engine.gyp b/update_engine.gyp
index d437003..d2f5416 100644
--- a/update_engine.gyp
+++ b/update_engine.gyp
@@ -56,7 +56,6 @@
'USE_LIBCROS=<(USE_libcros)',
'USE_MTD=<(USE_mtd)',
'USE_OMAHA=1',
- 'USE_POWER_MANAGEMENT=<(USE_power_management)',
'USE_WEAVE=<(USE_buffet)',
],
'include_dirs': [
@@ -267,6 +266,7 @@
'omaha_utils.cc',
'p2p_manager.cc',
'payload_state.cc',
+ 'power_manager_chromeos.cc',
'proxy_resolver.cc',
'real_system_state.cc',
'shill_proxy.cc',