payload_state_unittest.cc revision afed4a1a355c8416d496901234932e99864d6215
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 775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/files/file_path.h> 8be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa#include "base/file_util.h" 975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/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" 154243291a6655972fe89d4747a0089834c9e47c20Alex Deymo#include "update_engine/fake_hardware.h" 165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold#include "update_engine/fake_system_state.h" 176f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/omaha_request_action.h" 186f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/payload_state.h" 19f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen#include "update_engine/prefs.h" 206f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/prefs_mock.h" 216f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/test_utils.h" 226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/utils.h" 236f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 24082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::Time; 25082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::TimeDelta; 266f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing std::string; 276f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::_; 284243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::AnyNumber; 294243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::AtLeast; 304243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::Mock; 316f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::NiceMock; 322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanusing testing::Return; 336f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::SetArgumentPointee; 346f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 356f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasannamespace chromeos_update_engine { 366f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3719409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttps = 3819409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpsServer"; 3919409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttps = 4019409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpsServer"; 4119409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttp = 4219409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpServer"; 4319409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttp = 4419409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpServer"; 45bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthenconst char* kCurrentBytesDownloadedFromHttpPeer = 46bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "current-bytes-downloaded-from-HttpPeer"; 47bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthenconst char* kTotalBytesDownloadedFromHttpPeer = 48bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "total-bytes-downloaded-from-HttpPeer"; 4919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 502b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanstatic void SetupPayloadStateWith2Urls(string hash, 5153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan bool http_enabled, 522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState* payload_state, 532b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse* response) { 542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.clear(); 552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("http://test"); 562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("https://test"); 572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->size = 523456789; 582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->hash = hash; 592b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_size = 558123; 602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_signature = "metasign"; 612b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->max_failure_count_per_url = 3; 622b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state->SetResponse(*response); 63082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state->GetResponseSignature(); 6453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 6553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_url_https_only = 6653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "NumURLs = 1\n" 6753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://test\n"; 6853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 6953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_urls_both = 702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "NumURLs = 2\n" 7153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://test\n" 7253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://test\n"; 7353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 7453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_response_sign = 7553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan (http_enabled ? expected_urls_both : expected_url_https_only) + 7675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko base::StringPrintf("Payload Size = 523456789\n" 7775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Payload Sha256 Hash = %s\n" 7875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Metadata Size = 558123\n" 7975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Metadata Signature = metasign\n" 8075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Is Delta Payload = %d\n" 8175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Max Failure Count Per Url = %d\n" 8275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Disable Payload Backoff = %d\n", 8375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko hash.c_str(), 8475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->is_delta_payload, 8575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->max_failure_count_per_url, 8675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->disable_payload_backoff); 87082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 892b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 906f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanclass PayloadStateTest : public ::testing::Test { }; 916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 92a99981fda75fe0b17e96c700e3ddc93eca1cebe5David ZeuthenTEST(PayloadStateTest, DidYouAddANewErrorCode) { 934d039449ae2b9a218660d6ac92d610f50b308837Don Garrett if (kErrorCodeUmaReportedMax != 46) { 942b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan LOG(ERROR) << "The following failure is intentional. If you added a new " 95a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << "ErrorCode enum value, make sure to add it to the " 962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan << "PayloadState::UpdateFailed method and then update this test " 97a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << "to the new value of kErrorCodeUmaReportedMax, which is " 98a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen << kErrorCodeUmaReportedMax; 992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_FALSE("Please see the log line above"); 1002b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan } 1012b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 1022b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 1036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) { 1046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 1055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 107dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 10819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 10919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 110820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 111820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 11219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1)); 11319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 11419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 11519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 11719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 11919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 12019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 12119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 12219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 12319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 124bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 125bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 126be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1)); 1276f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 1285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1296f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 130082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 131082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 0\n" 132082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 0\n" 133082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = \n" 134082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 0\n" 135082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = \n" 136082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 137082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 138082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 139082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 14053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("", payload_state.GetCurrentUrl()); 1412b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 142cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 143a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1456f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1466f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithSingleUrl) { 1476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 14853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response.payload_urls.push_back("https://single.url.test"); 1496f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 123456789; 1506f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "hash"; 1516f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 58123; 1526f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "msign"; 1535bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1545bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 155dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 15619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 15719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 158820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 159820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 16019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 16119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 16319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 16519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 16719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 16919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 17119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 17319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 174bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 175bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 176be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 177be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 1786f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 1795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1806f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 181082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 182082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 1\n" 18353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://single.url.test\n" 184082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 123456789\n" 185082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = hash\n" 186082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 58123\n" 187082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = msign\n" 188082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 189082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 190082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 191082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 19253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://single.url.test", payload_state.GetCurrentUrl()); 1932b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 194cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 195a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1966f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1986f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) { 1996f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 2006f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("http://multiple.url.test"); 2016f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("https://multiple.url.test"); 2026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 523456789; 2036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "rhash"; 2046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 558123; 2056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "metasign"; 2065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 2075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 208dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 20919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 21019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 211820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 212820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 21319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 21419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 21619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 21819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 22019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 22119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 22219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 223bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 224bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 225be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 226be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 22753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 2286f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 2306f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 231082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 232082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 2\n" 23353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://multiple.url.test\n" 23453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://multiple.url.test\n" 235082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 523456789\n" 236082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = rhash\n" 237082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 558123\n" 238082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = metasign\n" 239082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 240082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 241082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 242082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 24353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://multiple.url.test", payload_state.GetCurrentUrl()); 2442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 245cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 246a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 2476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2496f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) { 2506f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 2515bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 2525bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 2536f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 255dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 2562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Payload attempt should start with 0 and then advance to 1. 25719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 25819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 25919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 26019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 261820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 262820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 263820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 264820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 26519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2)); 2669a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 267be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Reboots will be set 268be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1)); 269be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 2702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Url index should go from 0 to 1 twice. 27119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 27219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1)); 2732b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Failure count should be called each times url index is set, so that's 2752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // 4 times for this test. 27619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 27719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(4)); 2782b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 2802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This does a SetResponse which causes all the states to be set to 0 for 2822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // the first time. 28353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash1235", true, &payload_state, &response); 28453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2856f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2866f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the first error, the URL index advances to 1. 287a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 2886f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 28953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 2906f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, the URL index wraps around to 0. 2926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 29353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2946f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2956f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, it again advances to 1. 2966f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 29753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 298cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen 299cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen // Verify that we switched URLs three times 300cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(3, payload_state.GetUrlSwitchCount()); 3016f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 3026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, NewResponseResetsPayloadState) { 3046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 3055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 3066f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 3072b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3085bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 3092b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3105bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 31133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 3125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 31333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 31433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 315b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo // The first response doesn't send an abandoned event. 3165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 317b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo "Installer.UpdatesAbandonedEventCount", 0, _, _, _)).Times(0); 318b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 3192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Set the first response. 32053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 321a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 3226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3236f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Advance the URL index to 1 by faking an error. 324a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 3256f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 32653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 327cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 3286f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 330b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo "Installer.UpdatesAbandonedEventCount", 1, _, _, _)); 331b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 3326f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Now, slightly change the response and set it again. 33353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8225", true, &payload_state, &response); 334a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 3352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 336b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo // Fake an error again. 337b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo payload_state.UpdateFailed(error); 338b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 339b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 340b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 3415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 342b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo "Installer.UpdatesAbandonedEventCount", 2, _, _, _)); 343b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 344b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo // Return a third different response. 345b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo SetupPayloadStateWith2Urls("Hash9999", true, &payload_state, &response); 346b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo EXPECT_EQ(3, payload_state.GetNumResponsesSeen()); 347b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 3482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 34953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 3502b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 351cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 35219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 35319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 35419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 35519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 35619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 35719409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 35819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 35919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 3602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 3612b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3622b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) { 3632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 3642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 3655bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 36619409b74019d787100b768306e75ab3e5882898dJay Srinivasan int progress_bytes = 100; 3675bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 36819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 369dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 37019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 37119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 37219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 37319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 37419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2)) 37519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 37619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 377820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 378820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(2)); 379820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 380820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 381820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 2)) 382820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 383820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 38419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4)); 38519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 38619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4)); 38719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2)); 38819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 38919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 39019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(7)); 39119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1)) 39219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 39319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2)) 39419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 39519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 39619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 39719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 39819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 39919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 40019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 40119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 40219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 40319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 40419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 405bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 406bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 40719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes)) 40819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 40919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes)) 41019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 411be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 412be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 41319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 4145bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 4152b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 41653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5873", true, &payload_state, &response); 417a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 4182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 420a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 4212b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 422820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 42353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 425cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 4262b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 428a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 4292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 430820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 43153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4322b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 433cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 4342b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 436a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 4372b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 438820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 43953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4402b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetUrlFailureCount()); 441cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 4422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index as we've reached the 4442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // max failure count and reset the failure count for the new URL index. 4452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should also wrap around the URL index and thus cause the payload 4462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // attempt number to be incremented. 447a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 4482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 449820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 45053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4512b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 452cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(2, payload_state.GetUrlSwitchCount()); 453082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 456a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodePayloadHashMismatchError); 4572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 458820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 45953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 4602b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 461cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(3, payload_state.GetUrlSwitchCount()); 462082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4632b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index and payload attempt number due to 4652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // wrap-around of URL index. 466a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMissingError); 4672b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 468820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 46953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 471cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 472082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4732b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This HTTP error code should only increase the failure count. 475a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(static_cast<ErrorCode>( 476a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen kErrorCodeOmahaRequestHTTPResponseBase + 404)); 4772b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 478820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 47953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 481cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 482082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4842b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // And that failure count should be reset when we download some bytes 4852b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // afterwards. 48619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(progress_bytes); 4872b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 488820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 48953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 4902b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 491cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(4, payload_state.GetUrlSwitchCount()); 492082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4932b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4942b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, slightly change the response and set it again. 49553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8532", true, &payload_state, &response); 496a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 4976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 4986f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 4992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 500820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 50153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 5022b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 503cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 504082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 5056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 5066f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 507820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulFullDownload) { 5082b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 509820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = false; 5102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 5115bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 5125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 5132b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 514dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 51519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 51619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 51719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 51819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 519082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 520820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 521820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 522820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 523820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 524820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 52519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 52619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 5272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 52819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 52919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 53019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 53119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 5329a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 5335bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 5342b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 53553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 5362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 53829b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo "Installer.PayloadAttemptNumber", 1, _, _, _)); 5395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 54029b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo "Installer.FullPayloadAttemptNumber", 1, _, _, _)); 54129b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo 5422b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should just advance the payload attempt number; 5432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 544820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 545820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state.DownloadComplete(); 546820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 547820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 548820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 549820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 550820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 551820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo} 552820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 553820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDeltaDownload) { 554820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo OmahaResponse response; 555820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = true; 556820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo PayloadState payload_state; 5575bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 5585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 559820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 560820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AnyNumber()); 561820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 562820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 563820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 564820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 565820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 566820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // kPrefsFullPayloadAttemptNumber is not incremented for delta payloads. 567820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 568820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 569820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 570820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 571820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(1); 572820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 573820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 574820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 575820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 576820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 577820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 5785bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 579820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 580820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 581820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 58229b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo // Metrics for Full payload attempt number is not sent with Delta payloads. 5835bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 58429b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo "Installer.PayloadAttemptNumber", 1, _, _, _)); 5855bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 58629b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo "Installer.FullPayloadAttemptNumber", _, _, _, _)) 58729b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo .Times(0); 58829b51d980038eb5a9b01861b601ba2e9730c9458Alex Deymo 589820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // This should just advance the payload attempt number; 590820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 591820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 5922b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 5932b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 594820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 59553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 5962b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 597cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 5982b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 5992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6002b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) { 6012b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 6022b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 6035bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 6042b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 60653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 6072b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6082b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Generate enough events to advance URL index, failure count and 6092b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // payload attempt number all to 1. 6102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 611a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 612a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadTransferError); 6132b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 614820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 61553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 6162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetUrlFailureCount()); 617cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 6182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, simulate a corrupted url index on persisted store which gets 6202b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // loaded when update_engine restarts. Using a different prefs object 6212b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // so as to not bother accounting for the uninteresting calls above. 6225bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state2; 6235bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs2 = fake_system_state2.mock_prefs(); 62419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true)); 62519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(_,_)).Times(AtLeast(1)); 62619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _)) 62719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 628820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs2, GetInt64(kPrefsFullPayloadAttemptNumber, _)) 629820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 63019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _)) 63119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true))); 63219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _)) 63319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 634cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _)) 635cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen .Times(AtLeast(1)); 6362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6372b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Note: This will be a different payload object, but the response should 6382b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // have the same hash as before so as to not trivially reset because the 6392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response was different. We want to specifically test that even if the 6402b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response is same, we should reset the state if we find it corrupted. 6415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state2)); 64253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 6432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6442b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure all counters get reset to 0 because of the corrupted URL index 6452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // we supplied above. 6462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 647820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 64853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 6492b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 650cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 6512b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 652082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 65320f005c62b55471d3ed8f6fd55e23564adeb59feChris SosaTEST(PayloadStateTest, NoBackoffInteractiveChecks) { 65420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa OmahaResponse response; 65520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa response.is_delta_payload = false; 65620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa PayloadState payload_state; 6575bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 6585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 65920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa params.Init("", "", true); // is_interactive = True. 6605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 66120f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 6625bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 66320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 66420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 66520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Simulate two failures (enough to cause payload backoff) and check 66620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // again that we're ready to re-download without any backoff as this is 66720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // an interactive check. 66820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 66920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 67020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 67120f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 67220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 67320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 67420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa} 67520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 67620f005c62b55471d3ed8f6fd55e23564adeb59feChris SosaTEST(PayloadStateTest, NoBackoffForP2PUpdates) { 67720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa OmahaResponse response; 67820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa response.is_delta_payload = false; 67920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa PayloadState payload_state; 6805bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 6815bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 68220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa params.Init("", "", false); // is_interactive = False. 6835bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 68420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 6855bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 68620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 68720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 68820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Simulate two failures (enough to cause payload backoff) and check 68920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // again that we're ready to re-download without any backoff as this is 69020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // an interactive check. 69120f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 69220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 69320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 69420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 69520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 69620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Set p2p url. 69720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa params.set_use_p2p_for_downloading(true); 69820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa params.set_p2p_url("http://mypeer:52909/path/to/file"); 69920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Should not backoff for p2p updates. 70020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 70120f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 70220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa params.set_p2p_url(""); 70320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // No actual p2p update if no url is provided. 70420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 70520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa} 70620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 707082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, NoBackoffForDeltaPayloads) { 708082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 709082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = true; 710082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 7115bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 712082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 7135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 71453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 715082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 716082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we're ready to download 717082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff as this is a delta payload. 718082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 719820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 720820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 721082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 722082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 723082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate two failures (enough to cause payload backoff) and check 724082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again that we're ready to re-download without any backoff as this is 725082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // a delta payload. 726a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 727a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 72853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 729820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 730820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 731082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 732082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 733082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 734082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanstatic void CheckPayloadBackoffState(PayloadState* payload_state, 735082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan int expected_attempt_number, 736082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta expected_days) { 737082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state->DownloadComplete(); 738820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(expected_attempt_number, 739820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state->GetFullPayloadAttemptNumber()); 740082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state->ShouldBackoffDownload()); 741082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time backoff_expiry_time = payload_state->GetBackoffExpiryTime(); 742082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases. 743082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta max_fuzz_delta = TimeDelta::FromHours(7); 744082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta; 745082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta; 746082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_LT(expected_min_time.ToInternalValue(), 747082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 748082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_GT(expected_max_time.ToInternalValue(), 749082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 750082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 751082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 752082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) { 753082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 754082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = false; 755082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 7565bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 757082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 7585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 75953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response); 760082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 761082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1)); 762082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2)); 763082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4)); 764082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8)); 765082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16)); 766082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16)); 767082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16)); 768082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16)); 769082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16)); 770082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16)); 771082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 772082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 773082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffLogicCanBeDisabled) { 774082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 775082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.disable_payload_backoff = true; 776082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 7775bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 778082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 7795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 78053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response); 781082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 782082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we are ready to download 783082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff. 784082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 785082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 786820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 787082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 788082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 789082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Test again, this time by simulating two errors that would cause 790082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // the payload attempt number to increment due to wrap around. And 791082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // check that we are still ready to re-download without any backoff. 792a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 793a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch); 794082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 795820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 796082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 797082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 798082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 79919409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) { 80019409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 80119409b74019d787100b768306e75ab3e5882898dJay Srinivasan response.disable_payload_backoff = true; 80219409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 8035bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 80419409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_total = 0; 80519409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_total = 0; 80619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 8075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 80853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response); 809a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 81019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 811dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Simulate a previous attempt with in order to set an initial non-zero value 812dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // for the total bytes downloaded for HTTP. 813dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan int prev_chunk = 323456789; 814dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan http_total += prev_chunk; 815dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.DownloadProgress(prev_chunk); 816dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 817dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Ensure that the initial values for HTTP reflect this attempt. 818dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(prev_chunk, 819dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 820dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 821dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 822dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 823dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Change the response hash so as to simulate a new response which will 824dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // reset the current bytes downloaded, but not the total bytes downloaded. 82553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response); 826a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 827dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 828dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // First, simulate successful download of a few bytes over HTTP. 82919409b74019d787100b768306e75ab3e5882898dJay Srinivasan int first_chunk = 5000000; 83019409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += first_chunk; 83119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(first_chunk); 83253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that first all progress is made on HTTP and none on HTTPS. 83319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 83419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 83519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 83619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 83719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 83819409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 83919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 84019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 84119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 84219409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate an error that'll cause the url index to point to https. 843a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 84419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 84519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 84653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that no new progress is made on HTTP and new progress is on HTTPS. 84719409b74019d787100b768306e75ab3e5882898dJay Srinivasan int second_chunk = 23456789; 84819409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total += second_chunk; 84919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(second_chunk); 85019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 85119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 85219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 85319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 85419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 85519409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 85619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 85719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 85819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 85919409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate error to go back to http. 86019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 86119409b74019d787100b768306e75ab3e5882898dJay Srinivasan int third_chunk = 32345678; 86219409b74019d787100b768306e75ab3e5882898dJay Srinivasan int http_chunk = first_chunk + third_chunk; 86319409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += third_chunk; 86419409b74019d787100b768306e75ab3e5882898dJay Srinivasan int https_chunk = second_chunk; 86519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(third_chunk); 86619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 86719409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that third chunk is again back on HTTP. HTTPS remains on second chunk. 86819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_chunk, 86919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 870dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 87119409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 87219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 87319409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 87419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 87519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 87619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 877bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Simulate error (will cause URL switch), set p2p is to be used and 878bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // then do 42MB worth of progress 879bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.UpdateFailed(error); 880bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.SetUsingP2PForDownloading(true); 881bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen int p2p_total = 42 * 1000 * 1000; 882bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.DownloadProgress(p2p_total); 883bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 884bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(p2p_total, 885bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpPeer)); 886bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 8875bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 888dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan .Times(AnyNumber()); 8895bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 89033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 8915bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 89219409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpServer", 89319409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_chunk / kNumBytesInOneMiB, _, _, _)); 8945bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 89519409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpServer", 89619409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total / kNumBytesInOneMiB, _, _, _)); 8975bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 89819409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.SuccessfulMBsDownloadedFromHttpsServer", 89919409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_chunk / kNumBytesInOneMiB, _, _, _)); 9005bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 90119409b74019d787100b768306e75ab3e5882898dJay Srinivasan "Installer.TotalMBsDownloadedFromHttpsServer", 90219409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total / kNumBytesInOneMiB, _, _, _)); 9035bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 904bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "Installer.SuccessfulMBsDownloadedFromHttpPeer", 905bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen p2p_total / kNumBytesInOneMiB, _, _, _)); 9065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 907bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "Installer.TotalMBsDownloadedFromHttpPeer", 908bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen p2p_total / kNumBytesInOneMiB, _, _, _)); 9095bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 910cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen "Installer.UpdateURLSwitches", 911bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 3, _, _, _)); 9125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 91333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateUrlSwitchCount, 91433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 3, _, _, _)); 9155bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 916674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen "Installer.UpdateDurationMinutes", 917674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen _, _, _, _)); 9185bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 91933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateTotalDurationMinutes, 92033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen _, _, _, _)); 9215bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 922674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen "Installer.UpdateDurationUptimeMinutes", 923674c318a84e4344fce0fdaee039784ed7900d188David Zeuthen _, _, _, _)); 9245bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 925bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "Installer.DownloadSourcesUsed", 926bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen (1 << kDownloadSourceHttpsServer) | (1 << kDownloadSourceHttpServer) | 927bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen (1 << kDownloadSourceHttpPeer), 928bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen _, _, _)); 9295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 930bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "Installer.DownloadOverheadPercentage", 318, _, _, _)); 9315bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 93233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage, 93333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 314, _, _, _)); 9345bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 9351c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes)); 9365bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 93733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeFull, kNumPayloadTypes)); 9385bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 93933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull, 94033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 9415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 942820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo "Installer.AttemptsCount.Total", 1, _, _, _)); 9435bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 94433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateAttemptCount, 1, _, _, _)); 94519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 94619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateSucceeded(); 94719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 94819409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the metrics are reset after a successful update. 94919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 95019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 95119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 95219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 95319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 95419409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 95519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 95619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 957a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(0, payload_state.GetNumResponsesSeen()); 95819409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 95919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 960bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid ZeuthenTEST(PayloadStateTest, DownloadSourcesUsedIsCorrect) { 961bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen OmahaResponse response; 962bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen PayloadState payload_state; 9635bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 964bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 9655bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 966bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response); 967bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 968bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Simulate progress in order to mark HTTP as one of the sources used. 969bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen int num_bytes = 42 * 1000 * 1000; 970bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.DownloadProgress(num_bytes); 971bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 972bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Check that this was done via HTTP. 973bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(num_bytes, 974bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 975bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(num_bytes, 976bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 977bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 978bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Check that only HTTP is reported as a download source. 9795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 980bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AnyNumber()); 9815bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 982bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "Installer.DownloadSourcesUsed", 983bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen (1 << kDownloadSourceHttpServer), 984bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen _, _, _)); 9855bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 98633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateDownloadSourcesUsed, 98733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen (1 << kDownloadSourceHttpServer), 98833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen _, _, _)); 989bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 990bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.UpdateSucceeded(); 991bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen} 992bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 99319409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, RestartingUpdateResetsMetrics) { 99419409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 9955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 99619409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 99719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 9985bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 99919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 100019409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Set the first response. 100153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 100219409b74019d787100b768306e75ab3e5882898dJay Srinivasan 100319409b74019d787100b768306e75ab3e5882898dJay Srinivasan int num_bytes = 10000; 100419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(num_bytes); 100519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 100619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 100719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 100819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 100919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded( 101019409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 101119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 101219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 101319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 101419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateRestarted(); 101519409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the current bytes downloaded is reset, but not the total bytes. 101619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(0, 101719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 101819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 101919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 102019409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 102119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 1022be45bef9e283188b00e7def8967f81843669a7f1Chris SosaTEST(PayloadStateTest, NumRebootsIncrementsCorrectly) { 10235bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1024be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa PayloadState payload_state; 1025be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 10265bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 1027be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0)); 1028be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1)); 102919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 10305bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1031be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 1032be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 1033be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(0, payload_state.GetNumReboots()); 1034be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 10355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(true); 1036be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 1037be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should be incremented because system rebooted detected. 1038be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(1, payload_state.GetNumReboots()); 1039be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 10405bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(false); 1041be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 1042be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should now be 1 as reboot was not detected. 1043be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(1, payload_state.GetNumReboots()); 1044be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 1045be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Restart the update again to verify we set the num of reboots back to 0. 1046be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 1047be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_EQ(0, payload_state.GetNumReboots()); 1048be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa} 104919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 1050aa18e1641879f2df5993c2b02eb6f50d4443a649Chris SosaTEST(PayloadStateTest, RollbackVersion) { 10515bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1052aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa PayloadState payload_state; 1053aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1054aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa NiceMock<PrefsMock>* mock_powerwash_safe_prefs = 10555bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.mock_powerwash_safe_prefs(); 10565bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1057aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1058aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Verify pre-conditions are good. 1059aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_TRUE(payload_state.GetRollbackVersion().empty()); 1060aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1061aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Mock out the os version and make sure it's blacklisted correctly. 1062aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa string rollback_version = "2345.0.0"; 10635bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 1064aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa params.Init(rollback_version, "", false); 10655bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 1066aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1067aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion, 1068aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa rollback_version)); 1069aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa payload_state.Rollback(); 1070aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1071aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion()); 1072b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa 1073b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa // Change it up a little and verify we load it correctly. 1074b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa rollback_version = "2345.0.1"; 1075b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa // Let's verify we can reload it correctly. 1076b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, GetString( 1077b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa kPrefsRollbackVersion, _)).WillOnce(DoAll( 1078b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa SetArgumentPointee<1>(rollback_version), Return(true))); 1079b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion, 1080b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa rollback_version)); 1081b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa payload_state.LoadRollbackVersion(); 1082b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion()); 1083afed4a1a355c8416d496901234932e99864d6215David Zeuthen 1084afed4a1a355c8416d496901234932e99864d6215David Zeuthen // Check that we don't report any metrics in UpdateSucceeded(). 1085afed4a1a355c8416d496901234932e99864d6215David Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 1086afed4a1a355c8416d496901234932e99864d6215David Zeuthen .Times(0); 1087afed4a1a355c8416d496901234932e99864d6215David Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 1088afed4a1a355c8416d496901234932e99864d6215David Zeuthen .Times(0); 1089afed4a1a355c8416d496901234932e99864d6215David Zeuthen payload_state.UpdateSucceeded(); 1090aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa} 1091aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1092f413fe59759c73d6a5624c2158260b4302d01fe2David ZeuthenTEST(PayloadStateTest, DurationsAreCorrect) { 1093f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen OmahaResponse response; 1094f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state; 10955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1096f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen FakeClock fake_clock; 1097f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen Prefs prefs; 1098f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen string temp_dir; 1099f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1100f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Set the clock to a well-known time - 1 second on the wall-clock 1101f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and 2 seconds on the monotonic clock 1102f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(1000000)); 1103f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000)); 1104f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1105f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // We need persistent preferences for this test 1106a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateDurationTests.XXXXXX", 1107f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen &temp_dir)); 110875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 1109f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 11105bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 11115bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 11125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1113f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1114f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are correct for a successful update where 1115f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // time has advanced 7 seconds on the wall clock and 4 seconds on 1116f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // the monotonic clock. 111753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1118f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(8000000)); 1119f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000)); 1120f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.UpdateSucceeded(); 1121f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000); 1122f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000); 1123f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1124f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are reset when a new response comes in. 112553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8594", true, &payload_state, &response); 1126f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0); 1127f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0); 1128f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1129f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance time a bit (10 secs), simulate download progress and 1130f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // check that durations are updated. 1131f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(18000000)); 1132f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000)); 1133f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.DownloadProgress(10); 1134f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000); 1135f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000); 1136f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1137f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Now simulate a reboot by resetting monotonic time (to 5000) and 1138f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // creating a new PayloadState object and check that we load the 1139f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // durations correctly (e.g. they are the same as before). 1140f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(5000)); 1141f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state2; 11425bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1143f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000); 1144f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),10000000); 1145f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1146f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds 1147f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and check that the durations are increased accordingly. 1148f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(25000000)); 1149f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000)); 1150f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state2.UpdateSucceeded(); 1151f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000); 1152f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),16000000); 1153f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1154f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1155f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} 1156f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1157e4c58bf01b6ccc915c6b261007dbb75241ed69b8David ZeuthenTEST(PayloadStateTest, RebootAfterSuccessfulUpdateTest) { 1158e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen OmahaResponse response; 1159e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state; 11605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1161e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen FakeClock fake_clock; 1162e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen Prefs prefs; 1163e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen string temp_dir; 1164e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1165e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Set the clock to a well-known time (t = 30 seconds). 1166e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 1167e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 30 * Time::kMicrosecondsPerSecond)); 1168e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1169e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // We need persistent preferences for this test 1170e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(utils::MakeTempDirectory( 1171a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold "RebootAfterSuccessfulUpdateTest.XXXXXX", &temp_dir)); 117275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 1173e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 11745bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 11755bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 11765bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1177e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1178e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Make the update succeed. 1179e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1180e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state.UpdateSucceeded(); 1181e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1182e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was written. 1183e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(prefs.Exists(kPrefsSystemUpdatedMarker)); 1184e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1185e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Now simulate a reboot and set the wallclock time to a later point 1186e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // (t = 500 seconds). We do this by using a new PayloadState object 1187e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // and checking that it emits the right UMA metric with the right 1188e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // value. 1189e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 1190e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 500 * Time::kMicrosecondsPerSecond)); 1191e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state2; 11925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1193e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1194e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Expect 500 - 30 seconds = 470 seconds ~= 7 min 50 sec 11955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 1196e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen "Installer.TimeToRebootMinutes", 1197e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 7, _, _, _)); 11985bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 119933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricTimeToRebootMinutes, 120033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 7, _, _, _)); 12015bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(true); 1202e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1203e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state2.UpdateEngineStarted(); 1204e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1205e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was nuked. 1206e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_FALSE(prefs.Exists(kPrefsSystemUpdatedMarker)); 1207e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1208e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1209e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen} 1210e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1211569c42413bed641f297d8e0751a04574d04d9dc7Alex DeymoTEST(PayloadStateTest, RestartAfterCrash) { 1212569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo PayloadState payload_state; 12135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 12145bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold NiceMock<PrefsMock>* prefs = fake_system_state.mock_prefs(); 1215569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 12165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1217569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1218569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo // No prefs should be used after a crash. 1219569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, Exists(_)).Times(0); 1220569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetString(_, _)).Times(0); 1221569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetInt64(_, _)).Times(0); 1222569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetBoolean(_, _)).Times(0); 1223569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetString(_, _)).Times(0); 1224569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetInt64(_, _)).Times(0); 1225569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetBoolean(_, _)).Times(0); 1226569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1227569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo // No metrics are reported after a crash. 12285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 1229569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo SendToUMA(_, _, _, _, _)).Times(0); 1230569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1231569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo // Simulate an update_engine restart without a reboot. 12325bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(false); 1233569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1234569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo payload_state.UpdateEngineStarted(); 1235569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo} 1236569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 123753173b964f6f43c89dbaba41875fcadd7077b2eaJay SrinivasanTEST(PayloadStateTest, CandidateUrlsComputedCorrectly) { 123853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan OmahaResponse response; 12395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 124053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan PayloadState payload_state; 124153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 124253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy disable_http_policy; 12435bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_device_policy(&disable_http_policy); 12445bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 124553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 1246f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Test with no device policy. Should default to allowing http. 1247f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_)) 1248f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa .WillRepeatedly(Return(false)); 1249f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 125053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Set the first response. 1251f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa SetupPayloadStateWith2Urls("Hash8433", true, &payload_state, &response); 1252f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1253f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Check that we use the HTTP URL since there is no value set for allowing 1254f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // http. 1255f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 1256f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1257f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Test with device policy not allowing http updates. 1258f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_)) 1259f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa .WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true))); 1260f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1261f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Reset state and set again. 126253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8433", false, &payload_state, &response); 126353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 126453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we skip the HTTP URL and use only the HTTPS url. 126553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 126653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 126753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Advance the URL index to 1 by faking an error. 126853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch; 126953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 127053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 127253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 127353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlSwitchCount()); 127453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, slightly change the response and set it again. 127653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", false, &payload_state, &response); 127753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 127953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 128053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 128153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, pretend that the HTTP policy is turned on. We want to make sure 128253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the new policy is honored. 128353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy enable_http_policy; 12845bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_device_policy(&enable_http_policy); 128553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(enable_http_policy, GetHttpDownloadsEnabled(_)) 128653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 128753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 128853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, set the same response using the same hash 128953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // so that we can test that the state is reset not because of the 129053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // hash but because of the policy change which results in candidate url 129153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // list change. 129253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", true, &payload_state, &response); 129353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 129453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we use the HTTP URL now and the failure count is reset. 129553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 129653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 129753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 129853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Fake a failure and see if we're moving over to the HTTPS url and update 129953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the URL switch count properly. 130053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 130153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 130253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(1, payload_state.GetUrlSwitchCount()); 130353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ(0, payload_state.GetUrlFailureCount()); 130453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan} 130553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 13061c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsDelta) { 13071c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13081c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = true; 13091c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13105bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13111c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13131c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13141c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13151c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13161c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13171c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13185bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 131933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 13205bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 13211c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes)); 13225bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 132333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeDelta, kNumPayloadTypes)); 13245bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 132533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta, 132633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13271c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13281c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13291c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled but Omaha sends 13301c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // a delta anyway and test again. 13315bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13321c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 13335bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13341c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13361c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13371c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13381c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13391c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13405bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 13411c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes)); 13425bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 134333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeDelta, 134433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13455bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 134633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta, 134733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13481c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13491c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 13501c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13511c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsForcedFull) { 13521c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13531c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 13541c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13555bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13561c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13575bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13581c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13591c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13601c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled. 13615bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13621c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 13635bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13641c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13651c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13661c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13671c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13685bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 136933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 13705bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 13711c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeForcedFull, kNumPayloadTypes)); 13725bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 137333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeForcedFull, 137433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13755bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 137633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeForcedFull, 137733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13781c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13791c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 13801c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13811c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsFull) { 13821c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13831c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 13841c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13855bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13861c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13875bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13881c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13891c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 1390820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // Mock the request to a request where the delta is enabled, although the 1391820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // result is full. 13925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13931c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(true); 13945bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13951c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13961c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13971c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13981c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13995bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 140033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 14015bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 14021c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes)); 14035bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 140433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeFull, 140533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 14065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 140733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull, 140833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 14091c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 14101c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 14111c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 14124243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterUpdateFailedMetric) { 14135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 14144243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 14154243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 14164243291a6655972fe89d4747a0089834c9e47c20Alex Deymo Prefs prefs; 14174243291a6655972fe89d4747a0089834c9e47c20Alex Deymo string temp_dir; 14184243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14194243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Setup an environment with persistent prefs across simulated reboots. 1420a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateReboot.XXXXXX", 14214243291a6655972fe89d4747a0089834c9e47c20Alex Deymo &temp_dir)); 142275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 14235bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 14244243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14255bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeHardware* fake_hardware = fake_system_state.fake_hardware(); 14266646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett fake_hardware->SetBootDevice("/dev/sda3"); 14274243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 14294243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 14304243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14314243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 14324243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 14334243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 14344243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14354243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14364243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Reboot into the same environment to get an UMA metric with a value of 1. 14375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 14384243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", 1, _, _, _)); 14395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 144033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 1, _, _, _)); 14414243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14425bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14434243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14444243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a second update and reboot into the same environment, this should 14454243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // send a value of 2. 14464243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14474243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14485bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 14494243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", 2, _, _, _)); 14505bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 145133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 2, _, _, _)); 14524243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14535bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14544243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14554243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a third failed reboot to new version, but this time for a 14564243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // different payload. This should send a value of 1 this time. 14574243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:3141592"); 14585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 14594243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", 1, _, _, _)); 14605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 146133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 1, _, _, _)); 14624243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14635bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14644243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14654243291a6655972fe89d4747a0089834c9e47c20Alex Deymo EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 14664243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 14674243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14684243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterUpdateSucceed) { 14695bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 14704243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 14714243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 14724243291a6655972fe89d4747a0089834c9e47c20Alex Deymo Prefs prefs; 14734243291a6655972fe89d4747a0089834c9e47c20Alex Deymo string temp_dir; 14744243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14754243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Setup an environment with persistent prefs across simulated reboots. 1476a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateReboot.XXXXXX", 14774243291a6655972fe89d4747a0089834c9e47c20Alex Deymo &temp_dir)); 147875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 14795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 14804243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14815bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeHardware* fake_hardware = fake_system_state.fake_hardware(); 14826646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett fake_hardware->SetBootDevice("/dev/sda3"); 14834243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14845bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 14854243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 14864243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14874243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 14884243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 14894243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 14904243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14914243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14924243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Change the BootDevice to a different one, no metric should be sent. 14936646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett fake_hardware->SetBootDevice("/dev/sda5"); 14944243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 14964243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", _, _, _, _)) 14974243291a6655972fe89d4747a0089834c9e47c20Alex Deymo .Times(0); 14985bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 149933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 150033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 15014243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15024243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15034243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // A second reboot in eiher partition should not send a metric. 15044243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15056646b44ac128d07b33435d0bbf7cfd140af15eb9Don Garrett fake_hardware->SetBootDevice("/dev/sda3"); 15064243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15074243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15084243291a6655972fe89d4747a0089834c9e47c20Alex Deymo EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 15094243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 15104243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15114243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterCanceledUpdate) { 15125bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 15134243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 15144243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 15154243291a6655972fe89d4747a0089834c9e47c20Alex Deymo Prefs prefs; 15164243291a6655972fe89d4747a0089834c9e47c20Alex Deymo string temp_dir; 15174243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15184243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Setup an environment with persistent prefs across simulated reboots. 1519a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateReboot.XXXXXX", 15204243291a6655972fe89d4747a0089834c9e47c20Alex Deymo &temp_dir)); 152175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 15225bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 15234243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15245bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 15254243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 15264243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15274243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 15284243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 15294243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 15304243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 15314243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15325bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 15334243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", _, _, _, _)) 15344243291a6655972fe89d4747a0089834c9e47c20Alex Deymo .Times(0); 15355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 153633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 153733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 15384243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15394243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Cancel the applied update. 15404243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ResetUpdateStatus(); 15414243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15424243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a reboot. 15434243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15444243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15454243291a6655972fe89d4747a0089834c9e47c20Alex Deymo EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 15464243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 15474243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15484243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, UpdateSuccessWithWipedPrefs) { 15495bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 15504243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 15514243291a6655972fe89d4747a0089834c9e47c20Alex Deymo Prefs prefs; 15524243291a6655972fe89d4747a0089834c9e47c20Alex Deymo string temp_dir; 15534243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15544243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Setup an environment with persistent but initially empty prefs. 1555a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateReboot.XXXXXX", 15564243291a6655972fe89d4747a0089834c9e47c20Alex Deymo &temp_dir)); 155775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 15585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 15594243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 15614243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15625bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 15634243291a6655972fe89d4747a0089834c9e47c20Alex Deymo "Installer.RebootToNewPartitionAttempt", _, _, _, _)) 15644243291a6655972fe89d4747a0089834c9e47c20Alex Deymo .Times(0); 15655bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 156633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 156733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 15684243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15694243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a reboot in this environment. 15704243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15714243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15724243291a6655972fe89d4747a0089834c9e47c20Alex Deymo EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 15734243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 15744243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 1575dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, DisallowP2PAfterTooManyAttempts) { 1576dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1577dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 15785bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1579dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Prefs prefs; 1580dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen string temp_dir; 1581dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1582dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // We need persistent preferences for this test. 1583a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateP2PTests.XXXXXX", 1584dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen &temp_dir)); 158575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 1586dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 15875bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 15885bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1589dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1590dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1591dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Should allow exactly kMaxP2PAttempts... 1592dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen for (int n = 0; n < kMaxP2PAttempts; n++) { 1593dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1594dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1595dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen } 1596dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // ... but not more than that. 1597dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1598dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_FALSE(payload_state.P2PAttemptAllowed()); 1599dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1600dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1601dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1602dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1603dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, DisallowP2PAfterDeadline) { 1604dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1605dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 16065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1607dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 1608dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Prefs prefs; 1609dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen string temp_dir; 1610dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1611dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // We need persistent preferences for this test. 1612a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateP2PTests.XXXXXX", 1613dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen &temp_dir)); 161475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 1615dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 16165bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 16175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 16185bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1619dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1620dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1621dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to 1 second. 1622dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time epoch = Time::FromInternalValue(1000000); 1623dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch); 1624dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1625dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Do an attempt - this will set the timestamp. 1626dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1627dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1628dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Check that the timestamp equals what we just set. 1629dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp()); 1630dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1631dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Time hasn't advanced - this should work. 1632dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1633dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1634dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to half the deadline - this should work. 1635dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1636dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds) / 2); 1637dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1638dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1639dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Check that the first attempt timestamp hasn't changed just 1640dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // because the wall-clock time changed. 1641dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp()); 1642dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1643dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to _just_ before the deadline - this should work. 1644dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1645dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds - 1)); 1646dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1647dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1648dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to _just_ after the deadline - this should not work. 1649dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1650dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds + 1)); 1651dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_FALSE(payload_state.P2PAttemptAllowed()); 1652dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1653dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1654dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1655dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1656dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsInitialValue) { 1657dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1658dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 16595bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1660dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Prefs prefs; 1661dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen string temp_dir; 1662dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1663a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateP2PTests.XXXXXX", 1664dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen &temp_dir)); 166575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 16665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 16675bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1668dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1669dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1670dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time null_time = Time(); 1671dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp()); 1672dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(0, payload_state.GetP2PNumAttempts()); 1673dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1674dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1675dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1676dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1677dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsArePersisted) { 1678dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1679dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 16805bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1681dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 1682dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Prefs prefs; 1683dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen string temp_dir; 1684dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1685a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateP2PTests.XXXXXX", 1686dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen &temp_dir)); 168775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 16885bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 16895bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 16905bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1691dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1692dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1693dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to something known. 1694dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time time = Time::FromInternalValue(12345); 1695dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(time); 1696dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1697dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // New p2p attempt - as a side-effect this will update the p2p state vars. 1698dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1699dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state.GetP2PNumAttempts()); 1700dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp()); 1701dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1702dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Now create a new PayloadState and check that it loads the state 1703dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // vars correctly. 1704dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state2; 17055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1706dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state2.GetP2PNumAttempts()); 1707dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state2.GetP2PFirstAttemptTimestamp()); 1708dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1709dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1710dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1711dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1712dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsAreClearedOnNewResponse) { 1713dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1714dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 17155bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1716dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 1717dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Prefs prefs; 1718dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen string temp_dir; 1719dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1720a6742b35938b6f58e24e3f1c550fe92d4d33eb74Gilad Arnold EXPECT_TRUE(utils::MakeTempDirectory("PayloadStateP2PTests.XXXXXX", 1721dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen &temp_dir)); 172275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko prefs.Init(base::FilePath(temp_dir)); 17235bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 17245bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_prefs(&prefs); 17255bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1726dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1727dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1728dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to something known. 1729dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time time = Time::FromInternalValue(12345); 1730dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(time); 1731dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1732dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // New p2p attempt - as a side-effect this will update the p2p state vars. 1733dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1734dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state.GetP2PNumAttempts()); 1735dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp()); 1736dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1737dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set a new response... 1738dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response); 1739dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1740dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // ... and check that it clears the P2P state vars. 1741dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time null_time = Time(); 1742dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(0, payload_state.GetP2PNumAttempts()); 1743dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp()); 1744dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1745dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir)); 1746dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1747dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 17486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1749