Create a PolicyManager instance on the SystemState.

This patch creates the PolicyManager object on the update engine's
SystemState class, which aggregates all the singleton classes.

This patch doesn't add any functionality, other than initialize and
destroy the PolicyManager, State and Providers from the SystemState.

BUG=chromium:354079
TEST=Build.

Change-Id: Ib06d9c3d24926eaca43de2d11770ef6da7d16985
Reviewed-on: https://chromium-review.googlesource.com/191502
Reviewed-by: Gilad Arnold <garnold@chromium.org>
Tested-by: Alex Deymo <deymo@chromium.org>
Commit-Queue: Alex Deymo <deymo@chromium.org>
diff --git a/SConstruct b/SConstruct
index 7c0b2a8..96f4bfb 100644
--- a/SConstruct
+++ b/SConstruct
@@ -238,9 +238,9 @@
                    policy_manager/policy_manager.cc
                    policy_manager/real_random_provider.cc
                    policy_manager/real_shill_provider.cc
-                   policy_manager/real_state.cc
                    policy_manager/real_system_provider.cc
                    policy_manager/real_time_provider.cc
+                   policy_manager/state_factory.cc
                    postinstall_runner_action.cc
                    prefs.cc
                    proxy_resolver.cc
@@ -298,7 +298,6 @@
                             policy_manager/policy_manager_unittest.cc
                             policy_manager/real_random_provider_unittest.cc
                             policy_manager/real_shill_provider_unittest.cc
-                            policy_manager/real_state_unittest.cc
                             policy_manager/real_system_provider_unittest.cc
                             policy_manager/real_time_provider_unittest.cc
                             policy_manager/variable_unittest.cc
diff --git a/mock_system_state.cc b/mock_system_state.cc
index ddd294e..fa6622b 100644
--- a/mock_system_state.cc
+++ b/mock_system_state.cc
@@ -3,8 +3,11 @@
 // found in the LICENSE file.
 
 #include "update_engine/mock_system_state.h"
+#include "update_engine/policy_manager/fake_state.h"
 #include "update_engine/update_attempter_mock.h"
 
+using chromeos_policy_manager::FakeState;
+
 namespace chromeos_update_engine {
 
 // Mock the SystemStateInterface so that we could lie that
@@ -16,12 +19,14 @@
     prefs_(&mock_prefs_),
     powerwash_safe_prefs_(&mock_powerwash_safe_prefs_),
     p2p_manager_(&mock_p2p_manager_),
-    payload_state_(&mock_payload_state_) {
+    payload_state_(&mock_payload_state_),
+    policy_manager_(&fake_policy_manager_) {
   request_params_ = &default_request_params_;
   mock_payload_state_.Initialize(this);
   mock_gpio_handler_ = new testing::NiceMock<MockGpioHandler>();
   mock_update_attempter_ = new testing::NiceMock<UpdateAttempterMock>(
       this, &dbus_);
+  fake_policy_manager_.Init(FakeState::Construct());
 }
 
 MockSystemState::~MockSystemState() {
@@ -32,4 +37,4 @@
   return mock_update_attempter_;
 }
 
-} // namespeace chromeos_update_engine
+}  // namespace chromeos_update_engine
diff --git a/mock_system_state.h b/mock_system_state.h
index c24528e..16cf701 100644
--- a/mock_system_state.h
+++ b/mock_system_state.h
@@ -10,12 +10,13 @@
 #include <metrics/metrics_library_mock.h>
 #include <policy/mock_device_policy.h>
 
+#include "update_engine/clock.h"
+#include "update_engine/fake_hardware.h"
 #include "update_engine/mock_dbus_wrapper.h"
 #include "update_engine/mock_gpio_handler.h"
 #include "update_engine/mock_p2p_manager.h"
 #include "update_engine/mock_payload_state.h"
-#include "update_engine/clock.h"
-#include "update_engine/fake_hardware.h"
+#include "update_engine/policy_manager/fake_policy_manager.h"
 #include "update_engine/prefs_mock.h"
 #include "update_engine/system_state.h"
 
@@ -79,6 +80,10 @@
     return p2p_manager_;
   }
 
+  inline virtual chromeos_policy_manager::PolicyManager* policy_manager() {
+    return policy_manager_;
+  }
+
   // MockSystemState-specific public method.
   inline void set_connection_manager(ConnectionManager* connection_manager) {
     connection_manager_ = connection_manager;
@@ -128,6 +133,11 @@
     p2p_manager_ = p2p_manager;
   }
 
+  inline void set_policy_manager(
+      chromeos_policy_manager::PolicyManager *policy_manager) {
+    policy_manager_ = policy_manager;
+  }
+
   inline void set_payload_state(PayloadStateInterface *payload_state) {
     payload_state_ = payload_state;
   }
@@ -146,6 +156,7 @@
   // These are the other object we own.
   Clock default_clock_;
   FakeHardware default_hardware_;
+  chromeos_policy_manager::FakePolicyManager fake_policy_manager_;
   OmahaRequestParams default_request_params_;
 
   // These are pointers to objects which caller can override.
@@ -155,10 +166,11 @@
   PrefsInterface* powerwash_safe_prefs_;
   ConnectionManager* connection_manager_;
   OmahaRequestParams* request_params_;
-  P2PManager *p2p_manager_;
-  PayloadStateInterface *payload_state_;
+  P2PManager* p2p_manager_;
+  PayloadStateInterface* payload_state_;
+  chromeos_policy_manager::PolicyManager* policy_manager_;
 };
 
-} // namespeace chromeos_update_engine
+}  // namespace chromeos_update_engine
 
 #endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_MOCK_SYSTEM_STATE_H_
diff --git a/policy_manager/fake_policy_manager.h b/policy_manager/fake_policy_manager.h
new file mode 100644
index 0000000..6b126cb
--- /dev/null
+++ b/policy_manager/fake_policy_manager.h
@@ -0,0 +1,27 @@
+// Copyright (c) 2014 The Chromium OS 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_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_POLICY_MANAGER_H_
+#define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_POLICY_MANAGER_H_
+
+#include "update_engine/policy_manager/policy_manager.h"
+
+#include "update_engine/policy_manager/default_policy.h"
+
+namespace chromeos_policy_manager {
+
+class FakePolicyManager : public PolicyManager {
+ public:
+  FakePolicyManager() {
+    // The FakePolicyManager uses a DefaultPolicy.
+    set_policy(new DefaultPolicy());
+  }
+
+ private:
+  DISALLOW_COPY_AND_ASSIGN(FakePolicyManager);
+};
+
+}  // namespace chromeos_policy_manager
+
+#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_POLICY_MANAGER_H_
diff --git a/policy_manager/fake_state.cc b/policy_manager/fake_state.cc
index 3dcec18..4f4c787 100644
--- a/policy_manager/fake_state.cc
+++ b/policy_manager/fake_state.cc
@@ -2,19 +2,27 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
-#include "update_engine/policy_manager/fake_random_provider.h"
-#include "update_engine/policy_manager/fake_shill_provider.h"
 #include "update_engine/policy_manager/fake_state.h"
-#include "update_engine/policy_manager/fake_system_provider.h"
-#include "update_engine/policy_manager/fake_time_provider.h"
+
+#include "base/memory/scoped_ptr.h"
 
 namespace chromeos_policy_manager {
 
-FakeState::FakeState() {
-  set_random_provider(new FakeRandomProvider());
-  set_shill_provider(new FakeShillProvider());
-  set_system_provider(new FakeSystemProvider());
-  set_time_provider(new FakeTimeProvider());
+FakeState::FakeState() : State(new FakeRandomProvider(),
+                               new FakeShillProvider(),
+                               new FakeSystemProvider(),
+                               new FakeTimeProvider()) {
+}
+
+FakeState* FakeState::Construct() {
+  scoped_ptr<FakeState> fake_state(new FakeState());
+  if (!(fake_state->random_provider()->Init() &&
+        fake_state->shill_provider()->Init() &&
+        fake_state->system_provider()->Init() &&
+        fake_state->time_provider()->Init())) {
+    return NULL;
+  }
+  return fake_state.release();
 }
 
 }  // namespace chromeos_policy_manager
diff --git a/policy_manager/fake_state.h b/policy_manager/fake_state.h
index 159b96b..2d5b9c9 100644
--- a/policy_manager/fake_state.h
+++ b/policy_manager/fake_state.h
@@ -5,18 +5,41 @@
 #ifndef CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_STATE_H_
 #define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_FAKE_STATE_H_
 
+#include "update_engine/policy_manager/fake_random_provider.h"
+#include "update_engine/policy_manager/fake_shill_provider.h"
+#include "update_engine/policy_manager/fake_system_provider.h"
+#include "update_engine/policy_manager/fake_time_provider.h"
 #include "update_engine/policy_manager/state.h"
 
 namespace chromeos_policy_manager {
 
-// A fake State class that creates Fake providers for all the providers.
+// A fake State class that creates fake providers for all the providers.
 class FakeState : public State {
  public:
-  // Initializes the State with fake providers.
-  FakeState();
+  // Creates and initializes the FakeState using fake providers. Returns NULL
+  // if the initialization fails.
+  static FakeState* Construct();
+
   virtual ~FakeState() {}
 
+  // Downcasted getters, to allow access to the fake instances during testing.
+  virtual FakeRandomProvider* random_provider() override {
+    return reinterpret_cast<FakeRandomProvider*>(State::random_provider());
+  }
+  virtual FakeShillProvider* shill_provider() override {
+    return reinterpret_cast<FakeShillProvider*>(State::shill_provider());
+  }
+  virtual FakeTimeProvider* time_provider() override {
+    return reinterpret_cast<FakeTimeProvider*>(State::time_provider());
+  }
+  virtual FakeSystemProvider* system_provider() override {
+    return reinterpret_cast<FakeSystemProvider*>(State::system_provider());
+  }
+
  private:
+  // Creates a FakeState instance using FakeProviders.
+  FakeState();
+
   DISALLOW_COPY_AND_ASSIGN(FakeState);
 };
 
diff --git a/policy_manager/policy_manager.cc b/policy_manager/policy_manager.cc
index 4f19f99..c8e7d4e 100644
--- a/policy_manager/policy_manager.cc
+++ b/policy_manager/policy_manager.cc
@@ -5,7 +5,7 @@
 #include "update_engine/policy_manager/policy_manager.h"
 
 #include "update_engine/policy_manager/chromeos_policy.h"
-#include "update_engine/policy_manager/real_state.h"
+#include "update_engine/policy_manager/state.h"
 
 using base::Closure;
 
diff --git a/policy_manager/policy_manager.h b/policy_manager/policy_manager.h
index 4e4cc68..5b89bf2 100644
--- a/policy_manager/policy_manager.h
+++ b/policy_manager/policy_manager.h
@@ -57,6 +57,12 @@
       base::Callback<void(EvalStatus, const R& result)> callback,
       T policy_method, Args... args);
 
+ protected:
+  // The PolicyManager receives ownership of the passed Policy instance.
+  void set_policy(const Policy* policy) {
+    policy_.reset(policy);
+  }
+
  private:
   friend class PmPolicyManagerTest;
   FRIEND_TEST(PmPolicyManagerTest, PolicyRequestCallsPolicy);
diff --git a/policy_manager/policy_manager_unittest.cc b/policy_manager/policy_manager_unittest.cc
index 00a83b4..1562727 100644
--- a/policy_manager/policy_manager_unittest.cc
+++ b/policy_manager/policy_manager_unittest.cc
@@ -4,6 +4,7 @@
 
 #include <algorithm>
 #include <string>
+#include <utility>
 #include <vector>
 
 #include <base/bind.h>
@@ -32,11 +33,12 @@
 class PmPolicyManagerTest : public ::testing::Test {
  protected:
   virtual void SetUp() {
-    FakeState* fake_state = new FakeState();
-    ASSERT_TRUE(fake_state->Init());
-    EXPECT_TRUE(pmut_.Init(fake_state));
+    fake_state_ = FakeState::Construct();
+    PMTEST_ASSERT_NOT_NULL(fake_state_);
+    EXPECT_TRUE(pmut_.Init(fake_state_));
   }
 
+  FakeState* fake_state_;
   PolicyManager pmut_;
 };
 
diff --git a/policy_manager/real_state.cc b/policy_manager/real_state.cc
deleted file mode 100644
index 8b0086f..0000000
--- a/policy_manager/real_state.cc
+++ /dev/null
@@ -1,23 +0,0 @@
-// Copyright (c) 2014 The Chromium OS 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 "update_engine/policy_manager/real_state.h"
-
-#include "update_engine/policy_manager/real_random_provider.h"
-#include "update_engine/policy_manager/real_shill_provider.h"
-#include "update_engine/policy_manager/real_time_provider.h"
-
-namespace chromeos_policy_manager {
-
-RealState::RealState(RandomProvider* random_provider,
-                     ShillProvider* shill_provider,
-                     SystemProvider* system_provider,
-                     TimeProvider* time_provider) {
-  set_random_provider(random_provider);
-  set_shill_provider(shill_provider);
-  set_system_provider(system_provider);
-  set_time_provider(time_provider);
-}
-
-}  // namespace chromeos_policy_manager
diff --git a/policy_manager/real_state.h b/policy_manager/real_state.h
deleted file mode 100644
index b080c2d..0000000
--- a/policy_manager/real_state.h
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2014 The Chromium OS 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_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_STATE_H_
-#define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_STATE_H_
-
-#include "update_engine/policy_manager/state.h"
-
-namespace chromeos_policy_manager {
-
-// State implementation class.
-class RealState : public State {
- public:
-  // Instantiate with given providers, assuming ownership of them.
-  RealState(RandomProvider* random_provider,
-            ShillProvider* shill_provider,
-            SystemProvider* system_provider,
-            TimeProvider* time_provider);
-
-  ~RealState() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(RealState);
-};
-
-}  // namespace chromeos_policy_manager
-
-#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_REAL_STATE_H_
diff --git a/policy_manager/real_state_unittest.cc b/policy_manager/real_state_unittest.cc
deleted file mode 100644
index 792d4d8..0000000
--- a/policy_manager/real_state_unittest.cc
+++ /dev/null
@@ -1,37 +0,0 @@
-// Copyright (c) 2014 The Chromium OS 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 "update_engine/policy_manager/real_state.h"
-
-#include <gtest/gtest.h>
-
-#include "update_engine/policy_manager/fake_random_provider.h"
-#include "update_engine/policy_manager/fake_shill_provider.h"
-#include "update_engine/policy_manager/fake_system_provider.h"
-#include "update_engine/policy_manager/fake_time_provider.h"
-#include "update_engine/policy_manager/pmtest_utils.h"
-
-namespace chromeos_policy_manager {
-
-TEST(PmRealStateTest, InitTest) {
-  RealState state(new FakeRandomProvider(),
-                  new FakeShillProvider(),
-                  new FakeSystemProvider(),
-                  new FakeTimeProvider());
-  EXPECT_TRUE(state.Init());
-
-  // Check that the providers are being initialized. Beyond ensuring that we get
-  // non-null provider handles, verifying that we can get a single variable from
-  // each provider is enough of an indication that it has initialized.
-  PMTEST_ASSERT_NOT_NULL(state.random_provider());
-  PMTEST_EXPECT_NOT_NULL(state.random_provider()->var_seed());
-  PMTEST_ASSERT_NOT_NULL(state.shill_provider());
-  PMTEST_EXPECT_NOT_NULL(state.shill_provider()->var_is_connected());
-  PMTEST_ASSERT_NOT_NULL(state.system_provider());
-  PMTEST_ASSERT_NOT_NULL(state.system_provider()->var_is_normal_boot_mode());
-  PMTEST_ASSERT_NOT_NULL(state.time_provider());
-  PMTEST_ASSERT_NOT_NULL(state.time_provider()->var_curr_date());
-}
-
-}  // namespace chromeos_policy_manager
diff --git a/policy_manager/state.h b/policy_manager/state.h
index dd1e6af..8d93dea 100644
--- a/policy_manager/state.h
+++ b/policy_manager/state.h
@@ -17,39 +17,18 @@
 class State {
  public:
   virtual ~State() {}
+  State(RandomProvider* random_provider, ShillProvider* shill_provider,
+        SystemProvider* system_provider, TimeProvider* time_provider) :
+      random_provider_(random_provider),
+      shill_provider_(shill_provider),
+      system_provider_(system_provider),
+      time_provider_(time_provider) {}
 
-  // Initializes the State instance. Returns whether the initialization
-  // succeeded.
-  bool Init() {
-    return (random_provider_ && random_provider_->Init() &&
-            shill_provider_ && shill_provider_->Init() &&
-            system_provider_ && system_provider_->Init() &&
-            time_provider_ && time_provider_->Init());
-  }
-
-  // These functions return the given provider.
-  RandomProvider* random_provider() { return random_provider_.get(); }
-  ShillProvider* shill_provider() { return shill_provider_.get(); }
-  TimeProvider* time_provider() { return time_provider_.get(); }
-  SystemProvider* system_provider() { return system_provider_.get(); }
-
- protected:
-  // Initialize the private scoped_ptr for each provider.
-  void set_random_provider(RandomProvider* random_provider) {
-    return random_provider_.reset(random_provider);
-  }
-
-  void set_shill_provider(ShillProvider* shill_provider) {
-    return shill_provider_.reset(shill_provider);
-  }
-
-  void set_system_provider(SystemProvider* system_provider) {
-    return system_provider_.reset(system_provider);
-  }
-
-  void set_time_provider(TimeProvider* time_provider) {
-    return time_provider_.reset(time_provider);
-  }
+  // These methods return the given provider.
+  virtual RandomProvider* random_provider() { return random_provider_.get(); }
+  virtual ShillProvider* shill_provider() { return shill_provider_.get(); }
+  virtual TimeProvider* time_provider() { return time_provider_.get(); }
+  virtual SystemProvider* system_provider() { return system_provider_.get(); }
 
  private:
   // Instances of the providers.
diff --git a/policy_manager/state_factory.cc b/policy_manager/state_factory.cc
new file mode 100644
index 0000000..cab9d5e
--- /dev/null
+++ b/policy_manager/state_factory.cc
@@ -0,0 +1,39 @@
+// Copyright (c) 2014 The Chromium OS 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 "update_engine/policy_manager/state_factory.h"
+
+#include <base/logging.h>
+
+#include "update_engine/policy_manager/real_random_provider.h"
+#include "update_engine/policy_manager/real_shill_provider.h"
+#include "update_engine/policy_manager/real_system_provider.h"
+#include "update_engine/policy_manager/real_time_provider.h"
+
+namespace chromeos_policy_manager {
+
+State* DefaultStateFactory(
+    chromeos_update_engine::DBusWrapperInterface* dbus,
+    chromeos_update_engine::ClockInterface* clock) {
+  scoped_ptr<RealRandomProvider> random_provider(new RealRandomProvider());
+  scoped_ptr<RealShillProvider> shill_provider(
+      new RealShillProvider(dbus, clock));
+  scoped_ptr<RealSystemProvider> system_provider(new RealSystemProvider());
+  scoped_ptr<RealTimeProvider> time_provider(new RealTimeProvider(clock));
+
+  if (!(random_provider->Init() &&
+        shill_provider->Init() &&
+        system_provider->Init() &&
+        time_provider->Init())) {
+    LOG(ERROR) << "Error initializing providers";
+    return NULL;
+  }
+
+  return new State(random_provider.release(),
+                   shill_provider.release(),
+                   system_provider.release(),
+                   time_provider.release());
+}
+
+}  // namespace chromeos_policy_manager
diff --git a/policy_manager/state_factory.h b/policy_manager/state_factory.h
new file mode 100644
index 0000000..d0b93a1
--- /dev/null
+++ b/policy_manager/state_factory.h
@@ -0,0 +1,26 @@
+// Copyright (c) 2014 The Chromium OS 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_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_STATE_FACTORY_H_
+#define CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_STATE_FACTORY_H_
+
+#include "update_engine/clock_interface.h"
+#include "update_engine/dbus_wrapper_interface.h"
+#include "update_engine/policy_manager/state.h"
+
+namespace chromeos_policy_manager {
+
+// Creates and initializes a new State instance using the real providers
+// instantiated using the passed interfaces when needed. The State doesn't
+// take ownership of the passed interfaces, which need to remain available
+// during the life of this instance.
+// If one of the underlying providers fails to initialize, this function returns
+// NULL.
+State* DefaultStateFactory(
+    chromeos_update_engine::DBusWrapperInterface* dbus,
+    chromeos_update_engine::ClockInterface* clock);
+
+}  // namespace chromeos_policy_manager
+
+#endif  // CHROMEOS_PLATFORM_UPDATE_ENGINE_POLICY_MANAGER_STATE_FACTORY_H_
diff --git a/real_system_state.cc b/real_system_state.cc
index b554eb4..936e819 100644
--- a/real_system_state.cc
+++ b/real_system_state.cc
@@ -2,11 +2,13 @@
 // Use of this source code is governed by a BSD-style license that can be
 // found in the LICENSE file.
 
+#include "update_engine/real_system_state.h"
+
 #include <base/file_util.h>
 #include <base/time/time.h>
 
 #include "update_engine/constants.h"
-#include "update_engine/real_system_state.h"
+#include "update_engine/policy_manager/state_factory.h"
 #include "update_engine/utils.h"
 
 namespace chromeos_update_engine {
@@ -44,6 +46,10 @@
   p2p_manager_.reset(P2PManager::Construct(NULL, &prefs_, "cros_au",
                                            kMaxP2PFilesToKeep));
 
+  // Initialize the PolicyManager using the default State Factory.
+  policy_manager_.Init(
+      chromeos_policy_manager::DefaultStateFactory(&dbus_, &clock_));
+
   if (!payload_state_.Initialize(this))
     return false;
 
diff --git a/real_system_state.h b/real_system_state.h
index 7c411f8..baa9c60 100644
--- a/real_system_state.h
+++ b/real_system_state.h
@@ -11,18 +11,19 @@
 #include "update_engine/connection_manager.h"
 #include "update_engine/gpio_handler.h"
 #include "update_engine/hardware.h"
+#include "update_engine/p2p_manager.h"
 #include "update_engine/payload_state.h"
+#include "update_engine/policy_manager/policy_manager.h"
 #include "update_engine/prefs.h"
 #include "update_engine/real_dbus_wrapper.h"
 #include "update_engine/update_attempter.h"
-#include "update_engine/p2p_manager.h"
 
 namespace chromeos_update_engine {
 
 // A real implementation of the SystemStateInterface which is
 // used by the actual product code.
 class RealSystemState : public SystemState {
-public:
+ public:
   // Constructors and destructors.
   RealSystemState();
   virtual ~RealSystemState() {}
@@ -84,7 +85,11 @@
     return p2p_manager_.get();
   }
 
-  virtual inline bool system_rebooted(){
+  virtual inline chromeos_policy_manager::PolicyManager* policy_manager() {
+    return &policy_manager_;
+  }
+
+  virtual inline bool system_rebooted() {
     return system_rebooted_;
   }
 
@@ -92,7 +97,7 @@
   // if the object has been initialized successfully.
   bool Initialize(bool enable_gpio);
 
-private:
+ private:
   // Interface for the clock.
   Clock clock_;
 
@@ -137,6 +142,8 @@
 
   scoped_ptr<P2PManager> p2p_manager_;
 
+  chromeos_policy_manager::PolicyManager policy_manager_;
+
   // If true, this is the first instance of the update engine since the system
   // rebooted. Important for tracking whether you are running instance of the
   // update engine on first boot or due to a crash/restart.
diff --git a/system_state.h b/system_state.h
index 8668542..2148b51 100644
--- a/system_state.h
+++ b/system_state.h
@@ -13,6 +13,12 @@
 #include "update_engine/gpio_handler.h"
 #include "update_engine/omaha_request_params.h"
 
+namespace chromeos_policy_manager {
+
+class PolicyManager;
+
+}  // namespace chromeos_policy_manager
+
 namespace chromeos_update_engine {
 
 // SystemState is the root class within the update engine. So we should avoid
@@ -20,12 +26,12 @@
 // the required classes.
 class ClockInterface;
 class ConnectionManager;
-class HardwareInterface;
-class PrefsInterface;
-class PayloadStateInterface;
 class GpioHandler;
-class UpdateAttempter;
+class HardwareInterface;
 class P2PManager;
+class PayloadStateInterface;
+class PrefsInterface;
+class UpdateAttempter;
 
 // An interface to global system context, including platform resources,
 // the current state of the system, high-level objects whose lifetime is same
@@ -33,7 +39,7 @@
 // Carved out separately so it can be mocked for unit tests.
 // Currently it has only one method, but we should start migrating other
 // methods to use this as and when needed to unit test them.
-// TODO (jaysri): Consider renaming this to something like GlobalContext.
+// TODO(jaysri): Consider renaming this to something like GlobalContext.
 class SystemState {
  public:
   // Destructs this object.
@@ -85,6 +91,9 @@
   // Returns a pointer to the P2PManager singleton.
   virtual P2PManager* p2p_manager() = 0;
 
+  // Returns a pointer to the PolicyManager singleton.
+  virtual chromeos_policy_manager::PolicyManager* policy_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
   // update engine on first boot or due to a crash/restart.