Implement the update engine portion for new enterprise policies.

Enterprises need the ability to stop the auto updates and pin clients
to a given target version. This CL adds support for these features in
the update_engine.

BUG=27307: Implement StopAutoUpdate based on enterprise policy
TEST=Added new unit tests, manually tested all cases on ZGB.
CQ-DEPEND=I523c3f67e0cb07fd24744dc0a30382ff2fe2128a
Change-Id: Id576401afc6d2c93f0e9ece7c6c0ddcf4b1bc00d
Reviewed-on: https://gerrit.chromium.org/gerrit/17867
Commit-Ready: Jay Srinivasan <jaysri@chromium.org>
Reviewed-by: Jay Srinivasan <jaysri@chromium.org>
Tested-by: Jay Srinivasan <jaysri@chromium.org>
diff --git a/update_attempter_unittest.cc b/update_attempter_unittest.cc
index 463d5a6..6402bb6 100644
--- a/update_attempter_unittest.cc
+++ b/update_attempter_unittest.cc
@@ -75,6 +75,13 @@
   void ReadTrackFromPolicyTestStart();
   static gboolean StaticReadTrackFromPolicyTestStart(gpointer data);
 
+  void ReadUpdateDisabledFromPolicyTestStart();
+  static gboolean StaticReadUpdateDisabledFromPolicyTestStart(gpointer data);
+
+  void ReadTargetVersionPrefixFromPolicyTestStart();
+  static gboolean StaticReadTargetVersionPrefixFromPolicyTestStart(
+      gpointer data);
+
   MockDbusGlib dbus_;
   UpdateAttempterUnderTest attempter_;
   ActionProcessorMock* processor_;
@@ -272,6 +279,20 @@
   return FALSE;
 }
 
+gboolean UpdateAttempterTest::StaticReadUpdateDisabledFromPolicyTestStart(
+    gpointer data) {
+  UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
+  ua_test->ReadUpdateDisabledFromPolicyTestStart();
+  return FALSE;
+}
+
+gboolean UpdateAttempterTest::StaticReadTargetVersionPrefixFromPolicyTestStart(
+    gpointer data) {
+  UpdateAttempterTest* ua_test = reinterpret_cast<UpdateAttempterTest*>(data);
+  ua_test->ReadTargetVersionPrefixFromPolicyTestStart();
+  return FALSE;
+}
+
 namespace {
 const string kActionTypes[] = {
   OmahaRequestAction::StaticType(),
@@ -404,4 +425,64 @@
   g_idle_add(&StaticQuitMainLoop, this);
 }
 
+TEST_F(UpdateAttempterTest, ReadUpdateDisabledFromPolicy) {
+  loop_ = g_main_loop_new(g_main_context_default(), FALSE);
+  g_idle_add(&StaticReadUpdateDisabledFromPolicyTestStart, this);
+  g_main_loop_run(loop_);
+  g_main_loop_unref(loop_);
+  loop_ = NULL;
+}
+
+void UpdateAttempterTest::ReadUpdateDisabledFromPolicyTestStart() {
+  // Tests that the update_disbled flag is properly fetched
+  // from the device policy.
+
+  policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
+  attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
+
+  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
+
+  EXPECT_CALL(*device_policy, GetUpdateDisabled(_))
+      .WillRepeatedly(DoAll(
+          SetArgumentPointee<0>(true),
+          Return(true)));
+
+  attempter_.Update("", "", false, false, false);
+  EXPECT_TRUE(attempter_.omaha_request_params_.update_disabled);
+
+  g_idle_add(&StaticQuitMainLoop, this);
+}
+
+TEST_F(UpdateAttempterTest, ReadTargetVersionPrefixFromPolicy) {
+  loop_ = g_main_loop_new(g_main_context_default(), FALSE);
+  g_idle_add(&StaticReadTargetVersionPrefixFromPolicyTestStart, this);
+  g_main_loop_run(loop_);
+  g_main_loop_unref(loop_);
+  loop_ = NULL;
+}
+
+void UpdateAttempterTest::ReadTargetVersionPrefixFromPolicyTestStart() {
+  // Tests that the target_version_prefix value is properly fetched
+  // from the device policy.
+
+  const std::string target_version_prefix = "1412.";
+
+  policy::MockDevicePolicy* device_policy = new policy::MockDevicePolicy();
+  attempter_.policy_provider_.reset(new policy::PolicyProvider(device_policy));
+
+  EXPECT_CALL(*device_policy, LoadPolicy()).WillRepeatedly(Return(true));
+
+  EXPECT_CALL(*device_policy, GetTargetVersionPrefix(_))
+      .WillRepeatedly(DoAll(
+          SetArgumentPointee<0>(target_version_prefix),
+          Return(true)));
+
+  attempter_.Update("", "", false, false, false);
+  EXPECT_EQ(target_version_prefix.c_str(),
+            attempter_.omaha_request_params_.target_version_prefix);
+
+  g_idle_add(&StaticQuitMainLoop, this);
+}
+
+
 }  // namespace chromeos_update_engine