Extract new system version from Omaha responses
When processing an Omaha response, line up the app elements for the main
product and system apps, by their appid fields. This allows the (product)
version and system version to be differentiated and recorded in the
InstallPlan.
Bug: 65422956
Test: Unit-tests, and using a live OTA
Change-Id: I5217b7ac6fbf6f7ae595c1cec6fbc329051925eb
(cherry picked from commit 19ef6db4885387a5e3fbd2affcbd57a9a40d8b9b)
diff --git a/omaha_request_action_unittest.cc b/omaha_request_action_unittest.cc
index 9091031..7e38956 100644
--- a/omaha_request_action_unittest.cc
+++ b/omaha_request_action_unittest.cc
@@ -68,6 +68,7 @@
namespace {
const char kTestAppId[] = "test-app-id";
+const char kTestAppId2[] = "test-app2-id";
// This is a helper struct to allow unit tests build an update response with the
// values they care about.
@@ -89,7 +90,8 @@
"<ping status=\"ok\"/>"
"<updatecheck status=\"noupdate\"/></app>" +
(multi_app_no_update
- ? "<app><updatecheck status=\"noupdate\"/></app>"
+ ? "<app appid=\"" + app_id2 +
+ "\"><updatecheck status=\"noupdate\"/></app>"
: "") +
"</response>";
}
@@ -142,9 +144,10 @@
(disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
"/></actions></manifest></updatecheck></app>" +
(multi_app
- ? "<app><updatecheck status=\"ok\"><urls><url codebase=\"" +
- codebase2 +
- "\"/></urls><manifest><packages>"
+ ? "<app appid=\"" + app_id2 +
+ "\"><updatecheck status=\"ok\"><urls><url codebase=\"" +
+ codebase2 + "\"/></urls><manifest version=\"" + version2 +
+ "\"><packages>"
"<package name=\"package3\" size=\"333\" "
"hash_sha256=\"hash3\"/></packages>"
"<actions><action event=\"postinstall\" " +
@@ -166,7 +169,9 @@
}
string app_id = kTestAppId;
+ string app_id2 = kTestAppId2;
string version = "1.2.3.4";
+ string version2 = "2.3.4.5";
string more_info_url = "http://more/info";
string prompt = "true";
string codebase = "http://code/base/";
@@ -549,6 +554,7 @@
nullptr));
EXPECT_TRUE(response.update_exists);
EXPECT_EQ(fake_update_response_.version, response.version);
+ EXPECT_EQ("", response.system_version);
EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
response.packages[0].payload_urls[0]);
EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
@@ -557,7 +563,7 @@
EXPECT_EQ(true, response.packages[0].is_delta);
EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
EXPECT_EQ(fake_update_response_.deadline, response.deadline);
- // Omaha cohort attribets are not set in the response, so they should not be
+ // Omaha cohort attributes are not set in the response, so they should not be
// persisted.
EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
@@ -624,6 +630,40 @@
EXPECT_EQ(false, response.packages[1].is_delta);
}
+TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
+ OmahaResponse response;
+ fake_update_response_.multi_app = true;
+ // trigger the lining up of the app and system versions
+ request_params_.set_system_app_id(fake_update_response_.app_id2);
+
+ ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
+ fake_update_response_.GetUpdateResponse(),
+ -1,
+ false, // ping_only
+ ErrorCode::kSuccess,
+ metrics::CheckResult::kUpdateAvailable,
+ metrics::CheckReaction::kUpdating,
+ metrics::DownloadErrorCode::kUnset,
+ &response,
+ nullptr));
+ EXPECT_TRUE(response.update_exists);
+ EXPECT_EQ(fake_update_response_.version, response.version);
+ EXPECT_EQ(fake_update_response_.version2, response.system_version);
+ EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
+ response.packages[0].payload_urls[0]);
+ EXPECT_EQ(fake_update_response_.codebase2 + "package3",
+ response.packages[1].payload_urls[0]);
+ 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);
+ EXPECT_EQ(true, response.packages[0].is_delta);
+ 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(false, response.packages[1].is_delta);
+}
+
TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
OmahaResponse response;
fake_update_response_.multi_app = true;
@@ -640,6 +680,7 @@
nullptr));
EXPECT_TRUE(response.update_exists);
EXPECT_EQ(fake_update_response_.version, response.version);
+ EXPECT_EQ("", response.system_version);
EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
response.packages[0].payload_urls[0]);
EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
@@ -668,6 +709,7 @@
nullptr));
EXPECT_TRUE(response.update_exists);
EXPECT_EQ(fake_update_response_.version, response.version);
+ EXPECT_EQ("", response.system_version);
EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
response.packages[0].payload_urls[0]);
EXPECT_EQ(fake_update_response_.codebase + "package2",
@@ -1263,7 +1305,10 @@
string input_response =
"<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
"<daystart elapsed_seconds=\"100\"/>"
- "<app appid=\"xyz\" status=\"ok\">"
+ // the appid needs to match that in the request params
+ "<app appid=\"" +
+ fake_update_response_.app_id +
+ "\" status=\"ok\">"
"<updatecheck status=\"ok\">"
"<urls><url codebase=\"http://missing/field/test/\"/></urls>"
"<manifest version=\"10.2.3.4\">"