payload_state_unittest.cc revision 19409b74019d787100b768306e75ab3e5882898d
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 72b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan#include "base/stringprintf.h" 86f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "gmock/gmock.h" 92b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan#include "gtest/gtest.h" 102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 11d29695df35b7192faef4009d42a62c37bdd90a8fJay Srinivasan#include "update_engine/constants.h" 1219409b74019d787100b768306e75ab3e5882898dJay Srinivasan#include "update_engine/mock_system_state.h" 136f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/omaha_request_action.h" 146f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/payload_state.h" 156f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/prefs_mock.h" 166f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/test_utils.h" 176f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/utils.h" 186f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 19082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::Time; 20082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::TimeDelta; 216f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing std::string; 226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::_; 236f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::NiceMock; 242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanusing testing::Return; 256f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::SetArgumentPointee; 269a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthenusing testing::AtLeast; 276f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 286f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasannamespace chromeos_update_engine { 296f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3019409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttps = 3119409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpsServer"; 3219409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttps = 3319409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpsServer"; 3419409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttp = 3519409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpServer"; 3619409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttp = 3719409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpServer"; 3819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanstatic void SetupPayloadStateWith2Urls(string hash, 402b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState* payload_state, 412b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse* response) { 422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.clear(); 432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("http://test"); 442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("https://test"); 452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->size = 523456789; 462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->hash = hash; 472b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_size = 558123; 482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_signature = "metasign"; 492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->max_failure_count_per_url = 3; 502b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state->SetResponse(*response); 51082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state->GetResponseSignature(); 52082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = StringPrintf( 532b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "NumURLs = 2\n" 542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "Url0 = http://test\n" 552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "Url1 = https://test\n" 562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "Payload Size = 523456789\n" 572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "Payload Sha256 Hash = %s\n" 582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "Metadata Size = 558123\n" 59082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = metasign\n" 60082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = %d\n" 61082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = %d\n" 62082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = %d\n", 63082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan hash.c_str(), 64082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response->is_delta_payload, 65082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response->max_failure_count_per_url, 66082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response->disable_payload_backoff); 67082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 706f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanclass PayloadStateTest : public ::testing::Test { }; 716f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 722b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, DidYouAddANewActionExitCode) { 731c0fe79c7ef2b43946d756b54c8505d2bf48b93bJay Srinivasan if (kActionCodeUmaReportedMax != 43) { 742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan LOG(ERROR) << "The following failure is intentional. If you added a new " 752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << "ActionExitCode enum value, make sure to add it to the " 762b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << "PayloadState::UpdateFailed method and then update this test " 772b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << "to the new value of kActionCodeUmaReportedMax, which is " 782b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << kActionCodeUmaReportedMax; 792b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_FALSE("Please see the log line above"); 802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan } 812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 836f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) { 846f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 8519409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 8619409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 8719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 8819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 8919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 9019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1)); 9119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 9219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 9319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 9419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 9519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 9619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 9719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 9819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 9919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 10019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 10119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 1026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 10319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 1046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 105082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 106082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 0\n" 107082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 0\n" 108082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = \n" 109082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 0\n" 110082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = \n" 111082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 112082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 113082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 114082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 1156f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 1162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 1176f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1186f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1196f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithSingleUrl) { 1206f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 1216f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("http://single.url.test"); 1226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 123456789; 1236f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "hash"; 1246f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 58123; 1256f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "msign"; 12619409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 12719409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 12819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 12919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 13019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 13119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 13219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 13319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 13419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 13519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 13619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 13719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 13819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 13919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 14019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 14119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 14219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 14319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 14419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 1456f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 14619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 1476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 148082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 149082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 1\n" 150082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Url0 = http://single.url.test\n" 151082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 123456789\n" 152082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = hash\n" 153082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 58123\n" 154082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = msign\n" 155082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 156082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 157082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 158082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 1596f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 1602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 1616f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1626f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1636f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) { 1646f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 1656f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("http://multiple.url.test"); 1666f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("https://multiple.url.test"); 1676f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 523456789; 1686f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "rhash"; 1696f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 558123; 1706f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "metasign"; 17119409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 17219409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 17319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 17419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 17519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 17719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 17919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 18019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 18119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 18219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 18319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 18419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 18519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 1866f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 18719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 1886f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 189082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 190082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 2\n" 191082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Url0 = http://multiple.url.test\n" 192082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Url1 = https://multiple.url.test\n" 193082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 523456789\n" 194082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = rhash\n" 195082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 558123\n" 196082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = metasign\n" 197082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 198082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 199082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 200082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 2016f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 2022b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 2036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) { 2066f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 20719409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 20819409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 2096f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 21119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 2122b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Payload attempt should start with 0 and then advance to 1. 21319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 21419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 21619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2)); 2189a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 2192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Url index should go from 0 to 1 twice. 22019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 22119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1)); 2222b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2232b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Failure count should be called each times url index is set, so that's 2242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // 4 times for this test. 22519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 22619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(4)); 2272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 22819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 2292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2302b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This does a SetResponse which causes all the states to be set to 0 for 2312b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // the first time. 2322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash1235", &payload_state, &response); 2336f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 2346f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2356f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the first error, the URL index advances to 1. 2366f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch; 2376f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 2386f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 2396f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2406f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, the URL index wraps around to 0. 2416f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 2426f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 2436f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, it again advances to 1. 2456f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 2466f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 2476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2496f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, NewResponseResetsPayloadState) { 2506f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 25119409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 2526f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2532b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 25419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 2552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Set the first response. 2572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response); 2586f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2596f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Advance the URL index to 1 by faking an error. 2606f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch; 2616f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 2626f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 2636f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2646f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Now, slightly change the response and set it again. 2652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash8225", &payload_state, &response); 2662b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2672b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 2682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 2692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 27019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 27119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 27219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 27319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 27419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 27519409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 27619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 27719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 2782b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 2792b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2802b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) { 2812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 2822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 28319409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 28419409b74019d787100b768306e75ab3e5882898dJay Srinivasan int progress_bytes = 100; 28519409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 28619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 28719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 28819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 28919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 29019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 29119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 29219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2)) 29319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 29419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 29519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4)); 29619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 29719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4)); 29819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2)); 29919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 30019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 30119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(7)); 30219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1)) 30319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 30419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2)) 30519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 30619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 30719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 30819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 30919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 31019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 31119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 31219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 31319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 31419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 31519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 31619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes)) 31719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 31819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes)) 31919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 32019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 32119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 3222b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3232b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash5873", &payload_state, &response); 3242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 3262b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 3272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 3282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 3292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 3302b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3312b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 3322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadTransferError); 3332b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 3342b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 3352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 3362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3372b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 3382b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadTransferError); 3392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 3402b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 3412b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetUrlFailureCount()); 3422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index as we've reached the 3442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // max failure count and reset the failure count for the new URL index. 3452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should also wrap around the URL index and thus cause the payload 3462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // attempt number to be incremented. 3472b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadTransferError); 3482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 3492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 3502b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 351082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 3522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3532b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 3542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodePayloadHashMismatchError); 3552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 3562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 3572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 358082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 3592b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index and payload attempt number due to 3612b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // wrap-around of URL index. 3622b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMissingError); 3632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 3642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 3652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 366082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 3672b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This HTTP error code should only increase the failure count. 3692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(static_cast<ActionExitCode>( 3702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan kActionCodeOmahaRequestHTTPResponseBase + 404)); 3712b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 3722b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 3732b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 374082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 3752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3762b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // And that failure count should be reset when we download some bytes 3772b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // afterwards. 37819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(progress_bytes); 3792b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 3802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 3812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 382082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 3832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3842b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, slightly change the response and set it again. 3852b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash8532", &payload_state, &response); 3866f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3876f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 3882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 3896f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 3902b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 391082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 3926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 3936f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3942b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDownload) { 3952b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 3962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 39719409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 39819409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs(); 3992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 40019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 40119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 40219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 40319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 40419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 405082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 40619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 40719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 4082b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 40919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 41019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 41119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 41219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 4139a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 41419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 4152b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash8593", &payload_state, &response); 4172b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should just advance the payload attempt number; 4192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 4202b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 4212b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 4222b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 4232b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 4242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 4252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4262b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) { 4272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 4282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 42919409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 4302b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 43119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 4322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response); 4332b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4342b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Generate enough events to advance URL index, failure count and 4352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // payload attempt number all to 1. 4362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 4372b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 4382b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadTransferError); 4392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 4402b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlIndex()); 4412b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 4422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, simulate a corrupted url index on persisted store which gets 4442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // loaded when update_engine restarts. Using a different prefs object 4452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // so as to not bother accounting for the uninteresting calls above. 44619409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state2; 44719409b74019d787100b768306e75ab3e5882898dJay Srinivasan NiceMock<PrefsMock>* prefs2 = mock_system_state2.mock_prefs(); 44819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true)); 44919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(_,_)).Times(AtLeast(1)); 45019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _)) 45119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 45219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _)) 45319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true))); 45419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _)) 45519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 4562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Note: This will be a different payload object, but the response should 4582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // have the same hash as before so as to not trivially reset because the 4592b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response was different. We want to specifically test that even if the 4602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response is same, we should reset the state if we find it corrupted. 46119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state2)); 4622b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response); 4632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure all counters get reset to 0 because of the corrupted URL index 4652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // we supplied above. 4662b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 4672b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 4682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 4692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 470082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 471082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, NoBackoffForDeltaPayloads) { 472082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 473082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = true; 474082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 47519409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 476082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 47719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 478082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan SetupPayloadStateWith2Urls("Hash6437", &payload_state, &response); 479082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 480082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we're ready to download 481082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff as this is a delta payload. 482082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 483082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 484082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 485082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 486082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate two failures (enough to cause payload backoff) and check 487082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again that we're ready to re-download without any backoff as this is 488082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // a delta payload. 489082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 490082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 491082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlIndex()); 492082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 493082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 494082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 495082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 496082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanstatic void CheckPayloadBackoffState(PayloadState* payload_state, 497082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan int expected_attempt_number, 498082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta expected_days) { 499082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state->DownloadComplete(); 500082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_attempt_number, payload_state->GetPayloadAttemptNumber()); 501082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state->ShouldBackoffDownload()); 502082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time backoff_expiry_time = payload_state->GetBackoffExpiryTime(); 503082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases. 504082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta max_fuzz_delta = TimeDelta::FromHours(7); 505082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta; 506082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta; 507082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_LT(expected_min_time.ToInternalValue(), 508082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 509082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_GT(expected_max_time.ToInternalValue(), 510082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 511082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 512082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 513082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) { 514082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 515082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = false; 516082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 51719409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 518082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 51919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 520082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response); 521082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 522082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1)); 523082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2)); 524082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4)); 525082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8)); 526082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16)); 527082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16)); 528082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16)); 529082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16)); 530082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16)); 531082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16)); 532082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 533082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 534082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffLogicCanBeDisabled) { 535082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 536082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.disable_payload_backoff = true; 537082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 53819409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 539082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 54019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 541082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response); 542082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 543082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we are ready to download 544082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff. 545082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 546082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 547082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 548082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 549082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Test again, this time by simulating two errors that would cause 550082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // the payload attempt number to increment due to wrap around. And 551082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // check that we are still ready to re-download without any backoff. 552082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 553082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch); 554082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 555082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 556082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 557082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 55819409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) { 55919409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 56019409b74019d787100b768306e75ab3e5882898dJay Srinivasan response.disable_payload_backoff = true; 56119409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 56219409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 56319409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_total = 0; 56419409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_total = 0; 56519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 56619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 56719409b74019d787100b768306e75ab3e5882898dJay Srinivasan SetupPayloadStateWith2Urls("Hash3286", &payload_state, &response); 56819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 56919409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate a successful download and see that we are ready to download 57019409b74019d787100b768306e75ab3e5882898dJay Srinivasan // again without any backoff. 57119409b74019d787100b768306e75ab3e5882898dJay Srinivasan int first_chunk = 5000000; 57219409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += first_chunk; 57319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(first_chunk); 57419409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that first all progress is made on HTTP and none on HTTPs. 57519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 57619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 57719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 57819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 57919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 58019409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 58119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 58219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 58319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 58419409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate an error that'll cause the url index to point to https. 58519409b74019d787100b768306e75ab3e5882898dJay Srinivasan ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch; 58619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 58719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 58819409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that no new progress is made on HTTP and new progress is on HTTPs. 58919409b74019d787100b768306e75ab3e5882898dJay Srinivasan int second_chunk = 23456789; 59019409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total += second_chunk; 59119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(second_chunk); 59219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 59319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 59419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 59519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 59619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 59719409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 59819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 59919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 60019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 60119409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate error to go back to http. 60219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 60319409b74019d787100b768306e75ab3e5882898dJay Srinivasan int third_chunk = 32345678; 60419409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_chunk = first_chunk + third_chunk; 60519409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += third_chunk; 60619409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_chunk = second_chunk; 60719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(third_chunk); 60819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 60919409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that third chunk is again back on HTTP. HTTPS remains on second chunk. 61019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_chunk, 61119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 61219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_chunk, 61319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 61419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 61519409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 61619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 61719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 61819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 61919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 62019409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpServer", 62119409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_chunk / kNumBytesInOneMiB, _, _, _)); 62219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 62319409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpServer", 62419409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total / kNumBytesInOneMiB, _, _, _)); 62519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 62619409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpsServer", 62719409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_chunk / kNumBytesInOneMiB, _, _, _)); 62819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA( 62919409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpsServer", 63019409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total / kNumBytesInOneMiB, _, _, _)); 63119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 63219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateSucceeded(); 63319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 63419409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the metrics are reset after a successful update. 63519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 63619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 63719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 63819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 63919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 64019409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 64119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 64219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 64319409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 64419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 64519409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, RestartingUpdateResetsMetrics) { 64619409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 64719409b74019d787100b768306e75ab3e5882898dJay Srinivasan MockSystemState mock_system_state; 64819409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 64919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 65019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_TRUE(payload_state.Initialize(&mock_system_state)); 65119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 65219409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Set the first response. 65319409b74019d787100b768306e75ab3e5882898dJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response); 65419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 65519409b74019d787100b768306e75ab3e5882898dJay Srinivasan int num_bytes = 10000; 65619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(num_bytes); 65719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 65819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 65919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 66019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 66119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 66219409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 66319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 66419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 66519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 66619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateRestarted(); 66719409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the current bytes downloaded is reset, but not the total bytes. 66819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 66919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 67019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 67119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 67219409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 67319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 67419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 67519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 6766f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 677