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/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_