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() {}