PM: New system provider variable for whether OOBE is complete.

This uses logic found in Hardware::IsOOBEComplete(). It is needed for
deciding whether scattering should be applied.

BUG=chromium:358323
TEST=Unit tests.

Change-Id: I745365e84fc09dd234cd5f65ec0a2012a9024cdd
Reviewed-on: https://chromium-review.googlesource.com/200571
Reviewed-by: Alex Deymo <deymo@chromium.org>
Tested-by: Gilad Arnold <garnold@chromium.org>
Commit-Queue: Gilad Arnold <garnold@chromium.org>
diff --git a/policy_manager/fake_system_provider.h b/policy_manager/fake_system_provider.h
index 5886828..d86e015 100644
--- a/policy_manager/fake_system_provider.h
+++ b/policy_manager/fake_system_provider.h
@@ -23,11 +23,17 @@
     return &var_is_official_build_;
   }
 
+  virtual FakeVariable<bool>* var_is_oobe_complete() override {
+    return &var_is_oobe_complete_;
+  }
+
  private:
   FakeVariable<bool> var_is_normal_boot_mode_{
       "is_normal_boot_mode", kVariableModeConst};
   FakeVariable<bool> var_is_official_build_{
       "is_official_build", kVariableModeConst};
+  FakeVariable<bool> var_is_oobe_complete_{
+      "is_oobe_complete", kVariableModePoll};
 
   DISALLOW_COPY_AND_ASSIGN(FakeSystemProvider);
 };
diff --git a/policy_manager/real_system_provider.cc b/policy_manager/real_system_provider.cc
index 6b19268..e00c87b 100644
--- a/policy_manager/real_system_provider.cc
+++ b/policy_manager/real_system_provider.cc
@@ -4,15 +4,25 @@
 
 #include "update_engine/policy_manager/real_system_provider.h"
 
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
 #include <string>
 #include <vector>
 
 #include <base/logging.h>
+#include <base/strings/stringprintf.h>
+#include <base/time/time.h>
 #include <vboot/crossystem.h>
 
 #include "update_engine/policy_manager/generic_variables.h"
 #include "update_engine/utils.h"
 
+using base::StringPrintf;
+using base::Time;
+using base::TimeDelta;
 using std::string;
 using std::vector;
 
@@ -24,9 +34,15 @@
                                   VbGetSystemPropertyInt("devsw_boot") != 0));
 
   var_is_official_build_.reset(
-      new ConstCopyVariable<bool>("var_is_official_build",
+      new ConstCopyVariable<bool>("is_official_build",
                                   VbGetSystemPropertyInt("debug_build") == 0));
 
+  var_is_oobe_complete_.reset(
+      new CallCopyVariable<bool>(
+          "is_oobe_complete",
+          base::Bind(&chromeos_update_engine::HardwareInterface::IsOOBEComplete,
+                     base::Unretained(hardware_), nullptr)));
+
   return true;
 }
 
diff --git a/policy_manager/real_system_provider.h b/policy_manager/real_system_provider.h
index 01491ac..8d95387 100644
--- a/policy_manager/real_system_provider.h
+++ b/policy_manager/real_system_provider.h
@@ -9,6 +9,7 @@
 
 #include <string>
 
+#include "update_engine/hardware_interface.h"
 #include "update_engine/policy_manager/system_provider.h"
 
 namespace chromeos_policy_manager {
@@ -16,7 +17,9 @@
 // SystemProvider concrete implementation.
 class RealSystemProvider : public SystemProvider {
  public:
-  RealSystemProvider() {}
+  explicit RealSystemProvider(
+      chromeos_update_engine::HardwareInterface* hardware)
+      : hardware_(hardware) {}
 
   // Initializes the provider and returns whether it succeeded.
   bool Init();
@@ -29,9 +32,16 @@
     return var_is_official_build_.get();
   }
 
+  virtual Variable<bool>* var_is_oobe_complete() override {
+    return var_is_oobe_complete_.get();
+  }
+
  private:
   scoped_ptr<Variable<bool>> var_is_normal_boot_mode_;
   scoped_ptr<Variable<bool>> var_is_official_build_;
+  scoped_ptr<Variable<bool>> var_is_oobe_complete_;
+
+  chromeos_update_engine::HardwareInterface* hardware_;
 
   DISALLOW_COPY_AND_ASSIGN(RealSystemProvider);
 };
diff --git a/policy_manager/real_system_provider_unittest.cc b/policy_manager/real_system_provider_unittest.cc
index 3082e8f..d82c3bd 100644
--- a/policy_manager/real_system_provider_unittest.cc
+++ b/policy_manager/real_system_provider_unittest.cc
@@ -5,8 +5,10 @@
 #include "update_engine/policy_manager/real_system_provider.h"
 
 #include <base/memory/scoped_ptr.h>
+#include <base/time/time.h>
 #include <gtest/gtest.h>
 
+#include "update_engine/fake_hardware.h"
 #include "update_engine/policy_manager/pmtest_utils.h"
 
 namespace chromeos_policy_manager {
@@ -14,16 +16,28 @@
 class PmRealSystemProviderTest : public ::testing::Test {
  protected:
   virtual void SetUp() {
-    provider_.reset(new RealSystemProvider());
+    provider_.reset(new RealSystemProvider(&fake_hardware_));
     EXPECT_TRUE(provider_->Init());
   }
 
+  chromeos_update_engine::FakeHardware fake_hardware_;
   scoped_ptr<RealSystemProvider> provider_;
 };
 
 TEST_F(PmRealSystemProviderTest, InitTest) {
   PMTEST_EXPECT_NOT_NULL(provider_->var_is_normal_boot_mode());
   PMTEST_EXPECT_NOT_NULL(provider_->var_is_official_build());
+  PMTEST_EXPECT_NOT_NULL(provider_->var_is_oobe_complete());
+}
+
+TEST_F(PmRealSystemProviderTest, IsOOBECompleteTrue) {
+  fake_hardware_.SetIsOOBEComplete(base::Time());
+  PmTestUtils::ExpectVariableHasValue(true, provider_->var_is_oobe_complete());
+}
+
+TEST_F(PmRealSystemProviderTest, IsOOBECompleteFalse) {
+  fake_hardware_.UnsetIsOOBEComplete();
+  PmTestUtils::ExpectVariableHasValue(false, provider_->var_is_oobe_complete());
 }
 
 }  // namespace chromeos_policy_manager
diff --git a/policy_manager/state_factory.cc b/policy_manager/state_factory.cc
index c692522..88a8ee0 100644
--- a/policy_manager/state_factory.cc
+++ b/policy_manager/state_factory.cc
@@ -23,14 +23,15 @@
                            chromeos_update_engine::DBusWrapperInterface* dbus,
                            chromeos_update_engine::SystemState* system_state) {
   chromeos_update_engine::ClockInterface* const clock = system_state->clock();
-  scoped_ptr<RealConfigProvider> config_provider(new RealConfigProvider(
-      system_state->hardware()));
+  scoped_ptr<RealConfigProvider> config_provider(
+      new RealConfigProvider(system_state->hardware()));
   scoped_ptr<RealDevicePolicyProvider> device_policy_provider(
       new RealDevicePolicyProvider(policy_provider));
   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<RealSystemProvider> system_provider(
+      new RealSystemProvider(system_state->hardware()));
   scoped_ptr<RealTimeProvider> time_provider(new RealTimeProvider(clock));
   scoped_ptr<RealUpdaterProvider> updater_provider(
       new RealUpdaterProvider(system_state));
diff --git a/policy_manager/system_provider.h b/policy_manager/system_provider.h
index d18955b..dae3a9a 100644
--- a/policy_manager/system_provider.h
+++ b/policy_manager/system_provider.h
@@ -24,6 +24,9 @@
   // Returns whether this is an official Chrome OS build.
   virtual Variable<bool>* var_is_official_build() = 0;
 
+  // Returns a variable that tells whether OOBE was completed.
+  virtual Variable<bool>* var_is_oobe_complete() = 0;
+
  protected:
   SystemProvider() {}