payload_state_unittest.cc revision 820cc706c5ef60a3be96f5487f616bfed2b1d207
16f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan// Copyright (c) 2012 The Chromium OS Authors. All rights reserved. 26f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan// Use of this source code is governed by a BSD-style license that can be 36f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan// found in the LICENSE file. 46f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 56f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include <glib.h> 66f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 7be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa#include "base/file_path.h" 8be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa#include "base/file_util.h" 92b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan#include "base/stringprintf.h" 106f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "gmock/gmock.h" 112b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan#include "gtest/gtest.h" 122b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 13d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan#include "update_engine/constants.h" 14f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen#include "update_engine/fake_clock.h" 1519409b74019d787100b768306e75ab3e5882898dJay Srinivasan#include "update_engine/mock_system_state.h" 166f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/omaha_request_action.h" 176f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/payload_state.h" 18f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen#include "update_engine/prefs.h" 196f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/prefs_mock.h" 206f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/test_utils.h" 216f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/utils.h" 226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 23082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::Time; 24082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::TimeDelta; 256f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing std::string; 266f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::_; 276f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::NiceMock; 282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanusing testing::Return; 296f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::SetArgumentPointee; 309a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthenusing testing::AtLeast; 31dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasanusing testing::AnyNumber; 326f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 336f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasannamespace chromeos_update_engine { 346f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3519409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttps = 3619409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpsServer"; 3719409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttps = 3819409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpsServer"; 3919409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttp = 4019409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpServer"; 4119409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttp = 4219409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpServer"; 4319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanstatic void SetupPayloadStateWith2Urls(string hash, 4553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan bool http_enabled, 462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState* payload_state, 472b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse* response) { 482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.clear(); 492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("http://test"); 502b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("https://test"); 512b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->size = 523456789; 522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->hash = hash; 532b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_size = 558123; 542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_signature = "metasign"; 552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->max_failure_count_per_url = 3; 562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state->SetResponse(*response); 57082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state->GetResponseSignature(); 5853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 5953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_url_https_only = 6053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "NumURLs = 1\n" 6153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://test\n"; 6253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 6353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_urls_both = 642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "NumURLs = 2\n" 6553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://test\n" 6653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://test\n"; 6753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 6853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_response_sign = 6953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan (http_enabled ? expected_urls_both : expected_url_https_only) + 7053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan StringPrintf("Payload Size = 523456789\n" 7153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Payload Sha256 Hash = %s\n" 7253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Metadata Size = 558123\n" 7353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Metadata Signature = metasign\n" 7453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Is Delta Payload = %d\n" 7553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Max Failure Count Per Url = %d\n" 7653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Disable Payload Backoff = %d\n", 7753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan hash.c_str(), 7853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response->is_delta_payload, 7953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response->max_failure_count_per_url, 8053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response->disable_payload_backoff); 81082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 846f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanclass PayloadStateTest : public ::testing::Test { }; 856f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 86a99981fda75fe0b17e96c700e3ddc93eca1cebe5David ZeuthenTEST(PayloadStateTest, DidYouAddANewErrorCode) { 87a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen if (kErrorCodeUmaReportedMax != 43) { 882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan LOG(ERROR) << "The following failure is intentional. If you added a new " 89a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << "ErrorCode enum value, make sure to add it to the " 902b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << "PayloadState::UpdateFailed method and then update this test " 91a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << "to the new value of kErrorCodeUmaReportedMax, which is " 92a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << kErrorCodeUmaReportedMax; 932b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_FALSE("Please see the log line above"); 942b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan } 952b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) { 986f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 9919409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 10019409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 101dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 10219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 10319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 104820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 105820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 10619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1)); 10719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 10819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 10919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 11119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 11319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 11519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 11719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 118be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1)); 1196f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 12019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 1216f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 122082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 123082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 0\n" 124082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 0\n" 125082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = \n" 126082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 0\n" 127082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = \n" 128082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 129082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 130082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 131082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 13253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("", payload_state.GetCurrentUrl()); 1332b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 134cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 135a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1366f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1376f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1386f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithSingleUrl) { 1396f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 14053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response.payload_urls.push_back("https://single.url.test"); 1416f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 123456789; 1426f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "hash"; 1436f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 58123; 1446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "msign"; 14519409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 14619409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 147dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 14819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 14919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 150820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 151820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 15219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 15319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 15419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 15519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 15619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 15719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 15819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 15919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 16119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 16319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 16519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 166be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 167be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 1686f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 16919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 1706f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 171082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 172082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 1\n" 17353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://single.url.test\n" 174082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 123456789\n" 175082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = hash\n" 176082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 58123\n" 177082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = msign\n" 178082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 179082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 180082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 181082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 18253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://single.url.test", payload_state.GetCurrentUrl()); 1832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 184cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 185a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1866f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1876f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1886f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) { 1896f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 1906f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("http://multiple.url.test"); 1916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("https://multiple.url.test"); 1926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 523456789; 1936f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "rhash"; 1946f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 558123; 1956f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "metasign"; 19619409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 19719409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 198dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 19919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 20019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 201820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 202820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 20319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 20419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 20519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 20619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 20719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 20819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 20919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 21019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 21219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 213be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 214be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 21553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 2166f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 21719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 2186f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 219082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 220082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 2\n" 22153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://multiple.url.test\n" 22253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://multiple.url.test\n" 223082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 523456789\n" 224082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = rhash\n" 225082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 558123\n" 226082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = metasign\n" 227082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 228082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 229082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 230082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 23153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://multiple.url.test", payload_state.GetCurrentUrl()); 2322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 233cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 234a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 2356f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2366f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2376f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) { 2386f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 23919409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 24019409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 2416f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 243dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 2442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Payload attempt should start with 0 and then advance to 1. 24519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 24619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 24719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 24819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 249820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 250820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 251820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 252820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 25319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2)); 2549a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 255be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Reboots will be set 256be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1)); 257be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 2582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Url index should go from 0 to 1 twice. 25919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 26019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1)); 2612b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2622b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Failure count should be called each times url index is set, so that's 2632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // 4 times for this test. 26419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 26519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(4)); 2662b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 26719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 2682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This does a SetResponse which causes all the states to be set to 0 for 2702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // the first time. 27153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash1235", true, &payload_state, &response); 27253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2736f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2746f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the first error, the URL index advances to 1. 275a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 2766f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 27753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 2786f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2796f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, the URL index wraps around to 0. 2806f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 28153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2826f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2836f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, it again advances to 1. 2846f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 28553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 286cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen 287cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen // Verify that we switched URLs three times 288cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(3, payload_state.GetUrlSwitchCount()); 2896f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2906f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, NewResponseResetsPayloadState) { 2926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 29319409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 2946f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2952b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 29619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 2972b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2982b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Set the first response. 29953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 300a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 3016f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Advance the URL index to 1 by faking an error. 303a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 3046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 30553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 306cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 3076f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3086f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Now, slightly change the response and set it again. 30953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8225", true, &payload_state, &response); 310a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 3112b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3122b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 31353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 3142b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 315cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 31619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 31719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 31819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 31919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 32019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 32119409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 32219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 32319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 3242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 3252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3262b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) { 3272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 3282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 32919409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 33019409b74019d787100b768306e75ab3e5882898dJay Srinivasan int progress_bytes = 100; 33119409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 33219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 333dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 33419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 33519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 33619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 33719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 33819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2)) 33919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 34019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 341820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 342820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(2)); 343820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 344820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 345820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 2)) 346820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 347820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 34819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4)); 34919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 35019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4)); 35119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2)); 35219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 35319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 35419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(7)); 35519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1)) 35619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 35719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2)) 35819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 35919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 36019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 36119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 36319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 36519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 36619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 36819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes)) 37019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 37119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes)) 37219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 373be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 374be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 37519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 37619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 3772b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 37853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5873", true, &payload_state, &response); 379a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 3802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 382a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 3832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 384820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 38553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 3862b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 387cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 3882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3892b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 390a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 3912b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 392820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 39353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 3942b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 395cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 3962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3972b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 398a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 3992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 400820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 40153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4022b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetUrlFailureCount()); 403cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 4042b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4052b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index as we've reached the 4062b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // max failure count and reset the failure count for the new URL index. 4072b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should also wrap around the URL index and thus cause the payload 4082b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // attempt number to be incremented. 409a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 4102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 411820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 41253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4132b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 414cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(2, payload_state.GetUrlSwitchCount()); 415082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4172b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 418a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodePayloadHashMismatchError); 4192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 420820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 42153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4222b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 423cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(3, payload_state.GetUrlSwitchCount()); 424082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4262b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index and payload attempt number due to 4272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // wrap-around of URL index. 428a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMissingError); 4292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 430820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 43153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 433cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 434082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This HTTP error code should only increase the failure count. 437a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(static_cast<ErrorCode>( 438a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen kErrorCodeOmahaRequestHTTPResponseBase + 404)); 4392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 440820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 44153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 443cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 444082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // And that failure count should be reset when we download some bytes 4472b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // afterwards. 44819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(progress_bytes); 4492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 450820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 45153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 453cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 454082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, slightly change the response and set it again. 45753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8532", true, &payload_state, &response); 458a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 4596f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 4606f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 4612b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 462820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 46353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 465cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 466082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 4676f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 4686f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 469820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulFullDownload) { 4702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 471820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = false; 4722b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 47319409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 47419409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 4752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 476dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 47719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 47819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 47919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 48019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 481082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 482820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 483820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 484820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 485820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 486820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 48719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 48819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 4892b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 49019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 49119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 49219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 49319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 4949a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 49519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 4962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 49753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 4982b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should just advance the payload attempt number; 5002b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 501820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 502820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state.DownloadComplete(); 503820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 504820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 505820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 506820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 507820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 508820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo} 509820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 510820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDeltaDownload) { 511820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo OmahaResponse response; 512820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = true; 513820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo PayloadState payload_state; 514820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo MockSystemState mock_system_state; 515820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 516820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 517820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 518820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 519820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 520820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 521820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 522820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 523820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // kPrefsFullPayloadAttemptNumber is not incremented for delta payloads. 524820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 525820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 526820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 527820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 528820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(1); 529820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 530820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 531820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 532820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 533820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 534820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 535820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 536820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 537820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 538820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 539820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // This should just advance the payload attempt number; 540820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 541820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 5422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 5432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 544820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 54553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 5462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 547cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 5482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 5492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5502b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) { 5512b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 5522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 55319409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 5542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 55519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 55653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 5572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Generate enough events to advance URL index, failure count and 5592b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // payload attempt number all to 1. 5602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 561a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 562a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 5632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 564820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 56553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 5662b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 567cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 5682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, simulate a corrupted url index on persisted store which gets 5702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // loaded when update_engine restarts. Using a different prefs object 5712b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // so as to not bother accounting for the uninteresting calls above. 57219409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state2; 57319409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs2 = mock_system_state2.mock_prefs(); 57419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true)); 57519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(_,_)).Times(AtLeast(1)); 57619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _)) 57719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 578820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs2, GetInt64(kPrefsFullPayloadAttemptNumber, _)) 579820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 58019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _)) 58119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true))); 58219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _)) 58319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 584cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _)) 585cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen .Times(AtLeast(1)); 5862b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5872b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Note: This will be a different payload object, but the response should 5882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // have the same hash as before so as to not trivially reset because the 5892b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response was different. We want to specifically test that even if the 5902b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response is same, we should reset the state if we find it corrupted. 59119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state2)); 59253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 5932b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5942b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure all counters get reset to 0 because of the corrupted URL index 5952b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // we supplied above. 5962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 597820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 59853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 5992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 600cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 6012b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 602082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 603082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, NoBackoffForDeltaPayloads) { 604082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 605082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = true; 606082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 60719409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 608082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 60919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 61053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 611082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 612082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we're ready to download 613082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff as this is a delta payload. 614082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 615820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 616820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 617082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 618082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 619082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate two failures (enough to cause payload backoff) and check 620082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again that we're ready to re-download without any backoff as this is 621082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // a delta payload. 622a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 623a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 62453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 625820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 626820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 627082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 628082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 629082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 630082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanstatic void CheckPayloadBackoffState(PayloadState* payload_state, 631082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan int expected_attempt_number, 632082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta expected_days) { 633082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state->DownloadComplete(); 634820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(expected_attempt_number, 635820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state->GetFullPayloadAttemptNumber()); 636082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state->ShouldBackoffDownload()); 637082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time backoff_expiry_time = payload_state->GetBackoffExpiryTime(); 638082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases. 639082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta max_fuzz_delta = TimeDelta::FromHours(7); 640082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta; 641082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta; 642082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_LT(expected_min_time.ToInternalValue(), 643082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 644082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_GT(expected_max_time.ToInternalValue(), 645082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 646082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 647082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 648082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) { 649082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 650082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = false; 651082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 65219409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 653082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 65419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 65553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response); 656082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 657082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1)); 658082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2)); 659082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4)); 660082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8)); 661082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16)); 662082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16)); 663082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16)); 664082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16)); 665082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16)); 666082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16)); 667082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 668082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 669082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffLogicCanBeDisabled) { 670082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 671082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.disable_payload_backoff = true; 672082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 67319409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 674082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 67519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 67653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response); 677082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 678082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we are ready to download 679082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff. 680082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 681082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 682820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 683082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 684082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 685082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Test again, this time by simulating two errors that would cause 686082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // the payload attempt number to increment due to wrap around. And 687082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // check that we are still ready to re-download without any backoff. 688a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 689a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 690082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 691820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 692082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 693082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 694082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 69519409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) { 69619409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 69719409b74019d787100b768306e75ab3e5882898dJay Srinivasan response.disable_payload_backoff = true; 69819409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 69919409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 70019409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_total = 0; 70119409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_total = 0; 70219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 70319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 70453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response); 705a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 70619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 707dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Simulate a previous attempt with in order to set an initial non-zero value 708dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // for the total bytes downloaded for HTTP. 709dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan int prev_chunk = 323456789; 710dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan http_total += prev_chunk; 711dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.DownloadProgress(prev_chunk); 712dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 713dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Ensure that the initial values for HTTP reflect this attempt. 714dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(prev_chunk, 715dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 716dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 717dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 718dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 719dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Change the response hash so as to simulate a new response which will 720dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // reset the current bytes downloaded, but not the total bytes downloaded. 72153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response); 722a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 723dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 724dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // First, simulate successful download of a few bytes over HTTP. 72519409b74019d787100b768306e75ab3e5882898dJay Srinivasan int first_chunk = 5000000; 72619409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += first_chunk; 72719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(first_chunk); 72853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that first all progress is made on HTTP and none on HTTPS. 72919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 73019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 73119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 73219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 73319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 73419409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 73519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 73619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 73719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 73819409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate an error that'll cause the url index to point to https. 739a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 74019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 74119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 74253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that no new progress is made on HTTP and new progress is on HTTPS. 74319409b74019d787100b768306e75ab3e5882898dJay Srinivasan int second_chunk = 23456789; 74419409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total += second_chunk; 74519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(second_chunk); 74619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 74719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 74819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 74919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 75019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 75119409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 75219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 75319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 75419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 75519409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate error to go back to http. 75619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 75719409b74019d787100b768306e75ab3e5882898dJay Srinivasan int third_chunk = 32345678; 75819409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_chunk = first_chunk + third_chunk; 75919409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += third_chunk; 76019409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_chunk = second_chunk; 76119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(third_chunk); 76219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 76319409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that third chunk is again back on HTTP. HTTPS remains on second chunk. 76419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_chunk, 76519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 766dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 76719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 76819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 76919409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 77019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 77119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 77219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 773dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 774dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan .Times(AnyNumber()); 77519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 77619409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpServer", 77719409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_chunk / kNumBytesInOneMiB, _, _, _)); 77819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 77919409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpServer", 78019409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total / kNumBytesInOneMiB, _, _, _)); 78119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 78219409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpsServer", 78319409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_chunk / kNumBytesInOneMiB, _, _, _)); 78419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 78519409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpsServer", 78619409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total / kNumBytesInOneMiB, _, _, _)); 787cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 788cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen "Installer.UpdateURLSwitches", 789cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen 2, _, _, _)); 790674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 791674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen "Installer.UpdateDurationMinutes", 792674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen _, _, _, _)); 793674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 794674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen "Installer.UpdateDurationUptimeMinutes", 795674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen _, _, _, _)); 796dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 797dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan "Installer.DownloadSourcesUsed", 3, _, _, _)); 798dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 799dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan "Installer.DownloadOverheadPercentage", 542, _, _, _)); 8001c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA( 8011c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes)); 802820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 803820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo "Installer.AttemptsCount.Total", 1, _, _, _)); 80419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 80519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateSucceeded(); 80619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 80719409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the metrics are reset after a successful update. 80819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 80919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 81019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 81119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 81219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 81319409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 81419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 81519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 816a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(0, payload_state.GetNumResponsesSeen()); 81719409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 81819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 81919409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, RestartingUpdateResetsMetrics) { 82019409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 82119409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 82219409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 82319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 82419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 82519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 82619409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Set the first response. 82753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 82819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 82919409b74019d787100b768306e75ab3e5882898dJay Srinivasan int num_bytes = 10000; 83019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(num_bytes); 83119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 83219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 83319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 83419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 83519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 83619409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 83719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 83819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 83919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 84019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateRestarted(); 84119409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the current bytes downloaded is reset, but not the total bytes. 84219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 84319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 84419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 84519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 84619409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 84719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 848be45bef9e283188b00e7def8967f81843669a7f1Chris SosaTEST(PayloadStateTest, NumRebootsIncrementsCorrectly) { 849be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa MockSystemState mock_system_state; 850be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa PayloadState payload_state; 851be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 852be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 853be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 854be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1)); 85519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 856be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 857be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 858be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 859be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(0, payload_state.GetNumReboots()); 860be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 861be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(true)); 862be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 863be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should be incremented because system rebooted detected. 864be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(1, payload_state.GetNumReboots()); 865be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 866be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(false)); 867be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 868be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should now be 1 as reboot was not detected. 869be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(1, payload_state.GetNumReboots()); 870be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 871be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Restart the update again to verify we set the num of reboots back to 0. 872be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 873be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(0, payload_state.GetNumReboots()); 874be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa} 87519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 876aa18e1641879f2df5993c2b02eb6f50d4443a649Chris SosaTEST(PayloadStateTest, RollbackVersion) { 877aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa MockSystemState mock_system_state; 878aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa PayloadState payload_state; 879aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 880aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa NiceMock<PrefsMock>* mock_powerwash_safe_prefs = 881aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa mock_system_state.mock_powerwash_safe_prefs(); 882aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 883aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 884aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Verify pre-conditions are good. 885aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_TRUE(payload_state.GetRollbackVersion().empty()); 886aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 887aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Mock out the os version and make sure it's blacklisted correctly. 888aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa string rollback_version = "2345.0.0"; 889aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa OmahaRequestParams params(&mock_system_state); 890aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa params.Init(rollback_version, "", false); 891aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa mock_system_state.set_request_params(¶ms); 892aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 893aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion, 894aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa rollback_version)); 895aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa payload_state.Rollback(); 896aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 897aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion()); 898aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa} 899aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 900f413fe59759c73d6a5624c2158260b4302d01fe2David ZeuthenTEST(PayloadStateTest, DurationsAreCorrect) { 901f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen OmahaResponse response; 902f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state; 903f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen MockSystemState mock_system_state; 904f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen FakeClock fake_clock; 905f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen Prefs prefs; 906f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen string temp_dir; 907f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 908f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Set the clock to a well-known time - 1 second on the wall-clock 909f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and 2 seconds on the monotonic clock 910f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(1000000)); 911f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000)); 912f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 913f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // We need persistent preferences for this test 914f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_TRUE(utils::MakeTempDirectory("/tmp/PayloadStateDurationTests.XXXXXX", 915f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen &temp_dir)); 916f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen prefs.Init(FilePath(temp_dir)); 917f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 918f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen mock_system_state.set_clock(&fake_clock); 919f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen mock_system_state.set_prefs(&prefs); 920f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 921f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 922f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are correct for a successful update where 923f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // time has advanced 7 seconds on the wall clock and 4 seconds on 924f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // the monotonic clock. 92553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 926f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(8000000)); 927f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000)); 928f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.UpdateSucceeded(); 929f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000); 930f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000); 931f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 932f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are reset when a new response comes in. 93353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8594", true, &payload_state, &response); 934f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0); 935f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0); 936f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 937f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance time a bit (10 secs), simulate download progress and 938f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // check that durations are updated. 939f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(18000000)); 940f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000)); 941f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.DownloadProgress(10); 942f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000); 943f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000); 944f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 945f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Now simulate a reboot by resetting monotonic time (to 5000) and 946f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // creating a new PayloadState object and check that we load the 947f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // durations correctly (e.g. they are the same as before). 948f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(5000)); 949f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state2; 950f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_TRUE(payload_state2.Initialize(&mock_system_state)); 951f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000); 952f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),10000000); 953f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 954f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds 955f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and check that the durations are increased accordingly. 956f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(25000000)); 957f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000)); 958f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state2.UpdateSucceeded(); 959f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000); 960f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),16000000); 961f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 962f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 963f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} 964f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 965e4c58bf01b6ccc915c6b261007dbb75241ed69b8David ZeuthenTEST(PayloadStateTest, RebootAfterSuccessfulUpdateTest) { 966e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen OmahaResponse response; 967e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state; 968e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen MockSystemState mock_system_state; 969e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen FakeClock fake_clock; 970e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen Prefs prefs; 971e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen string temp_dir; 972e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 973e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Set the clock to a well-known time (t = 30 seconds). 974e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 975e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 30 * Time::kMicrosecondsPerSecond)); 976e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 977e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // We need persistent preferences for this test 978e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(utils::MakeTempDirectory( 979e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen "/tmp/RebootAfterSuccessfulUpdateTest.XXXXXX", &temp_dir)); 980e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen prefs.Init(FilePath(temp_dir)); 981e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 982e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen mock_system_state.set_clock(&fake_clock); 983e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen mock_system_state.set_prefs(&prefs); 984e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 985e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 986e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Make the update succeed. 987e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 988e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state.UpdateSucceeded(); 989e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 990e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was written. 991e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(prefs.Exists(kPrefsSystemUpdatedMarker)); 992e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 993e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Now simulate a reboot and set the wallclock time to a later point 994e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // (t = 500 seconds). We do this by using a new PayloadState object 995e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // and checking that it emits the right UMA metric with the right 996e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // value. 997e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 998e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 500 * Time::kMicrosecondsPerSecond)); 999e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state2; 1000e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(payload_state2.Initialize(&mock_system_state)); 1001e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1002e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Expect 500 - 30 seconds = 470 seconds ~= 7 min 50 sec 1003e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 1004e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen "Installer.TimeToRebootMinutes", 1005e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 7, _, _, _)); 1006e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1007e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state2.UpdateEngineStarted(); 1008e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1009e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was nuked. 1010e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_FALSE(prefs.Exists(kPrefsSystemUpdatedMarker)); 1011e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1012e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1013e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen} 1014e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 101553173b964f6f43c89dbaba41875fcadd7077b2eaJay SrinivasanTEST(PayloadStateTest, CandidateUrlsComputedCorrectly) { 101653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan OmahaResponse response; 101753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan MockSystemState mock_system_state; 101853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan PayloadState payload_state; 101953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 102053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Pretend that this is an offical build so that the HTTP download policy 102153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // is honored. 102253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(mock_system_state, IsOfficialBuild()) 102353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(Return(true)); 102453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 102553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy disable_http_policy; 102653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(mock_system_state, device_policy()) 102753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(Return(&disable_http_policy)); 102853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_)) 102953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true))); 103053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 103153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 103253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 103353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Set the first response. 103453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8433", false, &payload_state, &response); 103553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 103653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we skip the HTTP URL and use only the HTTPS url. 103753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 103853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 103953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Advance the URL index to 1 by faking an error. 104053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 104153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 104253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 104353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 104453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 104553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 104653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 104753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, slightly change the response and set it again. 104853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", false, &payload_state, &response); 104953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 105053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 105153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 105253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 105353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, pretend that the HTTP policy is turned on. We want to make sure 105453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the new policy is honored. 105553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy enable_http_policy; 105653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(mock_system_state, device_policy()) 105753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(Return(&enable_http_policy)); 105853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(enable_http_policy, GetHttpDownloadsEnabled(_)) 105953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 106053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 106153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, set the same response using the same hash 106253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // so that we can test that the state is reset not because of the 106353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // hash but because of the policy change which results in candidate url 106453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // list change. 106553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", true, &payload_state, &response); 106653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 106753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we use the HTTP URL now and the failure count is reset. 106853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 106953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 107053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 107153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Fake a failure and see if we're moving over to the HTTPS url and update 107253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the URL switch count properly. 107353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 107453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 107553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 107653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 107753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan} 107853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 10791c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsDelta) { 10801c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 10811c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = true; 10821c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 10831c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo MockSystemState mock_system_state; 10841c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 10851c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 10861c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 10871c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 10881c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 10891c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 10901c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 10911c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA( 10921c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes)); 10931c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 10941c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 10951c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled but Omaha sends 10961c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // a delta anyway and test again. 10971c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaRequestParams params(&mock_system_state); 10981c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 10991c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo mock_system_state.set_request_params(¶ms); 11001c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11011c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 11021c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 11031c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11041c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 11051c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11061c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA( 11071c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes)); 11081c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 11091c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 11101c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11111c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsForcedFull) { 11121c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 11131c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 11141c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 11151c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo MockSystemState mock_system_state; 11161c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11171c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 11181c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 11191c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11201c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled. 11211c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaRequestParams params(&mock_system_state); 11221c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 11231c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo mock_system_state.set_request_params(¶ms); 11241c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11251c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 11261c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 11271c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11281c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA( 11291c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeForcedFull, kNumPayloadTypes)); 11301c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 11311c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 11321c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11331c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsFull) { 11341c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 11351c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 11361c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 11371c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo MockSystemState mock_system_state; 11381c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11391c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 11401c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 11411c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 1142820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // Mock the request to a request where the delta is enabled, although the 1143820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // result is full. 11441c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaRequestParams params(&mock_system_state); 11451c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(true); 11461c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo mock_system_state.set_request_params(¶ms); 11471c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11481c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 11491c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 11501c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11511c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendEnumToUMA( 11521c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes)); 11531c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 11541c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 11551c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 11566f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1157