Don't update if any app has status="noupdate".

Only update if all apps have status="ok" and at least one app doesn't
have noupdate="true".

Bug: 62985600
Test: update_engine_unittests
Change-Id: I4171989e474408cea914e97f408db2ec83a94d8c
(cherry picked from commit d869bd816b8635ed2df5b2b74fdebe393bdcbd90)
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index bf2f1a0..9091031 100644
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -147,8 +147,11 @@
                       "\"/></urls><manifest><packages>"
                       "<package name=\"package3\" size=\"333\" "
                       "hash_sha256=\"hash3\"/></packages>"
-                      "<actions><action event=\"postinstall\" "
-                      "MetadataSize=\"33\" IsDeltaPayload=\"false\"/></actions>"
+                      "<actions><action event=\"postinstall\" " +
+                      (multi_app_self_update
+                           ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
+                           : "IsDeltaPayload=\"false\" ") +
+                      "MetadataSize=\"33\"/></actions>"
                       "</manifest></updatecheck></app>"
                 : "") +
            (multi_app_no_update
@@ -191,7 +194,9 @@
 
   // Whether to include more than one app.
   bool multi_app = false;
-  // Whether to include an additional app with no update.
+  // Whether to include an app with noupdate="true".
+  bool multi_app_self_update = false;
+  // Whether to include an additional app with status="noupdate".
   bool multi_app_no_update = false;
   // Whether to include more than one package in an app.
   bool multi_package = false;
@@ -492,6 +497,40 @@
   EXPECT_FALSE(response.update_exists);
 }
 
+TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
+  OmahaResponse response;
+  fake_update_response_.multi_app_no_update = true;
+  ASSERT_TRUE(TestUpdateCheck(nullptr,  // request_params
+                              fake_update_response_.GetUpdateResponse(),
+                              -1,
+                              false,  // ping_only
+                              ErrorCode::kSuccess,
+                              metrics::CheckResult::kNoUpdateAvailable,
+                              metrics::CheckReaction::kUnset,
+                              metrics::DownloadErrorCode::kUnset,
+                              &response,
+                              nullptr));
+  EXPECT_FALSE(response.update_exists);
+}
+
+TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
+  OmahaResponse response;
+  ASSERT_TRUE(TestUpdateCheck(
+      nullptr,  // request_params
+      "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
+      "event=\"postinstall\" noupdate=\"true\"/></actions>"
+      "</manifest></updatecheck></app></response>",
+      -1,
+      false,  // ping_only
+      ErrorCode::kSuccess,
+      metrics::CheckResult::kNoUpdateAvailable,
+      metrics::CheckReaction::kUnset,
+      metrics::DownloadErrorCode::kUnset,
+      &response,
+      nullptr));
+  EXPECT_FALSE(response.update_exists);
+}
+
 // Test that all the values in the response are parsed in a normal update
 // response.
 TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
@@ -587,7 +626,8 @@
 
 TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
   OmahaResponse response;
-  fake_update_response_.multi_app_no_update = true;
+  fake_update_response_.multi_app = true;
+  fake_update_response_.multi_app_self_update = true;
   ASSERT_TRUE(TestUpdateCheck(nullptr,  // request_params
                               fake_update_response_.GetUpdateResponse(),
                               -1,
@@ -605,7 +645,11 @@
   EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
   EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
   EXPECT_EQ(11u, response.packages[0].metadata_size);
-  ASSERT_EQ(1u, response.packages.size());
+  ASSERT_EQ(2u, response.packages.size());
+  EXPECT_EQ(string("hash3"), response.packages[1].hash);
+  EXPECT_EQ(333u, response.packages[1].size);
+  EXPECT_EQ(33u, response.packages[1].metadata_size);
+  EXPECT_EQ(true, response.packages[1].is_delta);
 }
 
 TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {