1aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 2aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Copyright (C) 2012 The Android Open Source Project 3aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 4aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Licensed under the Apache License, Version 2.0 (the "License"); 5aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// you may not use this file except in compliance with the License. 6aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// You may obtain a copy of the License at 7aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 8aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// http://www.apache.org/licenses/LICENSE-2.0 9aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 10aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// Unless required by applicable law or agreed to in writing, software 11aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// distributed under the License is distributed on an "AS IS" BASIS, 12aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// See the License for the specific language governing permissions and 14aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// limitations under the License. 15aea4c1cea20dda7ae7e85fc8924a2d784f70d806Alex Deymo// 166f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 172c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo#include "update_engine/payload_state.h" 182c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo 1975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/files/file_path.h> 202c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo#include <base/files/file_util.h> 2175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko#include <base/strings/stringprintf.h> 222c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo#include <gmock/gmock.h> 232c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo#include <gtest/gtest.h> 242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2539910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/constants.h" 2639910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_clock.h" 2739910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_hardware.h" 2839910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/fake_prefs.h" 2939910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/mock_prefs.h" 3039910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/prefs.h" 3139910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/test_utils.h" 3239910dcd1d68987ccee7c3031dc269233a8490bbAlex Deymo#include "update_engine/common/utils.h" 335bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold#include "update_engine/fake_system_state.h" 346f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan#include "update_engine/omaha_request_action.h" 356f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 36082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::Time; 37082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanusing base::TimeDelta; 386f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing std::string; 394243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::AnyNumber; 404243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::AtLeast; 414243291a6655972fe89d4747a0089834c9e47c20Alex Deymousing testing::Mock; 426f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::NiceMock; 432b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanusing testing::Return; 446f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanusing testing::SetArgumentPointee; 45f329b933db41d26644a97afef928eb1b319d6d99Alex Deymousing testing::_; 466f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasannamespace chromeos_update_engine { 486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 4919409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttps = 5019409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpsServer"; 5119409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttps = 5219409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpsServer"; 5319409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kCurrentBytesDownloadedFromHttp = 5419409b74019d787100b768306e75ab3e5882898dJay Srinivasan "current-bytes-downloaded-from-HttpServer"; 5519409b74019d787100b768306e75ab3e5882898dJay Srinivasanconst char* kTotalBytesDownloadedFromHttp = 5619409b74019d787100b768306e75ab3e5882898dJay Srinivasan "total-bytes-downloaded-from-HttpServer"; 57bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthenconst char* kCurrentBytesDownloadedFromHttpPeer = 58bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "current-bytes-downloaded-from-HttpPeer"; 59bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthenconst char* kTotalBytesDownloadedFromHttpPeer = 60bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen "total-bytes-downloaded-from-HttpPeer"; 6119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 622b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasanstatic void SetupPayloadStateWith2Urls(string hash, 6353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan bool http_enabled, 642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState* payload_state, 652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse* response) { 662b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.clear(); 672b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("http://test"); 682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->payload_urls.push_back("https://test"); 692b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->size = 523456789; 702b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->hash = hash; 712b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_size = 558123; 722b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->metadata_signature = "metasign"; 732b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan response->max_failure_count_per_url = 3; 742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state->SetResponse(*response); 75082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state->GetResponseSignature(); 7653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 7753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_url_https_only = 7853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "NumURLs = 1\n" 7953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://test\n"; 8053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 8153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_urls_both = 822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan "NumURLs = 2\n" 8353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://test\n" 8453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://test\n"; 8553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 8653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan string expected_response_sign = 8753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan (http_enabled ? expected_urls_both : expected_url_https_only) + 8875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko base::StringPrintf("Payload Size = 523456789\n" 8975039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Payload Sha256 Hash = %s\n" 9075039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Metadata Size = 558123\n" 9175039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Metadata Signature = metasign\n" 9275039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Is Delta Payload = %d\n" 9375039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Max Failure Count Per Url = %d\n" 9475039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko "Disable Payload Backoff = %d\n", 9575039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko hash.c_str(), 9675039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->is_delta_payload, 9775039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->max_failure_count_per_url, 9875039d7397f03dff77bdf4e26398049ff88edc4cAlex Vakulenko response->disable_payload_backoff); 99082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 1002b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 1012b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 1026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasanclass PayloadStateTest : public ::testing::Test { }; 1036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) { 1056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 1065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1078427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 108d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 10919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 11019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 111820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 112820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 11319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1)); 11419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 11519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 11619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 11819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 11919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 12019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 12119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 12219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 12319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 12419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 125bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 126bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 127be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1)); 1286f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 1295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1306f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 131082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 132082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 0\n" 133082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 0\n" 134082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = \n" 135082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 0\n" 136082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = \n" 137082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 138082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 139082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 140082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 14153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("", payload_state.GetCurrentUrl()); 14280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 14380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 144a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1456f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1466f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1476f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithSingleUrl) { 1486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 14953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan response.payload_urls.push_back("https://single.url.test"); 1506f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 123456789; 1516f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "hash"; 1526f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 58123; 1536f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "msign"; 1545bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1558427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 156d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 15719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 15819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 159820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 160820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 16119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 16219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 16419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 16619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 16819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 16919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 17019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 17219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 17319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 17419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 175bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 176bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 177be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 178be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 1796f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 1805bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1816f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 182082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 183082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 1\n" 18453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = https://single.url.test\n" 185082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 123456789\n" 186082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = hash\n" 187082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 58123\n" 188082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = msign\n" 189082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 190082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 191082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 192082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 19353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://single.url.test", payload_state.GetCurrentUrl()); 19480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 19580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 196a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 1976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 1986f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 1996f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) { 2006f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 2016f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("http://multiple.url.test"); 2026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.payload_urls.push_back("https://multiple.url.test"); 2036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.size = 523456789; 2046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.hash = "rhash"; 2056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_size = 558123; 2066f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan response.metadata_signature = "metasign"; 2075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 2088427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 209d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 21019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 21119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 212820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 213820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 21419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)) 21519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 21719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 21819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 21919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 22019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 22119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 22219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 22319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 224bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 225bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 226be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 227be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 22853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 2296f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2305bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 2316f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.SetResponse(response); 232082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string stored_response_sign = payload_state.GetResponseSignature(); 233082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan string expected_response_sign = "NumURLs = 2\n" 23453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url0 = http://multiple.url.test\n" 23553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan "Candidate Url1 = https://multiple.url.test\n" 236082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Size = 523456789\n" 237082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Payload Sha256 Hash = rhash\n" 238082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Size = 558123\n" 239082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Metadata Signature = metasign\n" 240082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Is Delta Payload = 0\n" 241082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Max Failure Count Per Url = 0\n" 242082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan "Disable Payload Backoff = 0\n"; 243082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(expected_response_sign, stored_response_sign); 24453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://multiple.url.test", payload_state.GetCurrentUrl()); 24580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 24680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 247a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 2486f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 2496f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2506f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) { 2516f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 2525bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 2538427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 2546f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 2552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 256d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 2572b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Payload attempt should start with 0 and then advance to 1. 25819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 25919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 26019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 26119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 262820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 263820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 264820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 265820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 26619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2)); 2679a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 268be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Reboots will be set 269be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1)); 270be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 2712b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Url index should go from 0 to 1 twice. 27219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1)); 27319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1)); 2742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Failure count should be called each times url index is set, so that's 2762b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // 4 times for this test. 27719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 27819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(4)); 2792b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2805bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 2812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 2822b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This does a SetResponse which causes all the states to be set to 0 for 2832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // the first time. 28453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash1235", true, &payload_state, &response); 28553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2866f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2876f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the first error, the URL index advances to 1. 288d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch; 2896f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 29053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 2916f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2926f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, the URL index wraps around to 0. 2936f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 29453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 2956f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 2966f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Verify that on the next error, it again advances to 1. 2976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 29853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 299cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen 300cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen // Verify that we switched URLs three times 30180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(3U, payload_state.GetUrlSwitchCount()); 3026f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 3036f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3046f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay SrinivasanTEST(PayloadStateTest, NewResponseResetsPayloadState) { 3056f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan OmahaResponse response; 3065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 3076f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan PayloadState payload_state; 3082b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3095bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 3102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3115bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 31233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 3135bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 31433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 31533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 3162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Set the first response. 31753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 318a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 3196f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3206f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Advance the URL index to 1 by faking an error. 321d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch; 3226f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan payload_state.UpdateFailed(error); 32353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 32480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 3256f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 3266f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Now, slightly change the response and set it again. 32753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8225", true, &payload_state, &response); 328a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 3292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 330b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo // Fake an error again. 331b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo payload_state.UpdateFailed(error); 332b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 33380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 334b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 335b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo // Return a third different response. 336b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo SetupPayloadStateWith2Urls("Hash9999", true, &payload_state, &response); 337b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo EXPECT_EQ(3, payload_state.GetNumResponsesSeen()); 338b33b0f0a0d8648542a0633cc708de149d52829b6Alex Deymo 3392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 34053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 34180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 34280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 34380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 34419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 34580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 34619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 34780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ( 34880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo 0U, payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer)); 34980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 35019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 3512b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 3522b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 3532b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) { 3542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 3552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 3565bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 35719409b74019d787100b768306e75ab3e5882898dJay Srinivasan int progress_bytes = 100; 3588427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 35919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 360d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 36119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 36219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 36319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 36419409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2)) 36619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 36719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 368820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 369820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(2)); 370820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 371820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 372820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 2)) 373820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 374820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 37519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4)); 37619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 37719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4)); 37819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2)); 37919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 38019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 38119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(7)); 38219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1)) 38319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 38419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2)) 38519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 38619409b74019d787100b768306e75ab3e5882898dJay Srinivasan 38719409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _)) 38819409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 38919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _)) 39019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 39119409b74019d787100b768306e75ab3e5882898dJay Srinivasan 39219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0)) 39319409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 39419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0)) 39519409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 396bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0)) 397bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AtLeast(1)); 39819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes)) 39919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 40019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes)) 40119409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 402be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)) 403be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa .Times(AtLeast(1)); 40419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 4055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 4062b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 40753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5873", true, &payload_state, &response); 408a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 4092b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4102b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 411d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 4122b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 413820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 41453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 41580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 41680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 4172b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 419d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadTransferError); 4202b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 421820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 42253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 42380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlFailureCount()); 42480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 4252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4262b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the failure count only. 427d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadTransferError); 4282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 429820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 43053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 43180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(2U, payload_state.GetUrlFailureCount()); 43280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 4332b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4342b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index as we've reached the 4352b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // max failure count and reset the failure count for the new URL index. 4362b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should also wrap around the URL index and thus cause the payload 4372b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // attempt number to be incremented. 438d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadTransferError); 4392b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 440820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 44153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 44280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 44380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(2U, payload_state.GetUrlSwitchCount()); 444082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4452b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4462b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index. 447d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kPayloadHashMismatchError); 4482b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 449820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 45053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 45180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 45280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(3U, payload_state.GetUrlSwitchCount()); 453082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4542b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4552b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should advance the URL index and payload attempt number due to 4562b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // wrap-around of URL index. 457d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMissingError); 4582b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 459820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 46053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 46180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 46280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(4U, payload_state.GetUrlSwitchCount()); 463082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4642b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4652b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This HTTP error code should only increase the failure count. 466a99981fda75fe0b17e96c700e3ddc93eca1cebe5David Zeuthen payload_state.UpdateFailed(static_cast<ErrorCode>( 467d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 404)); 4682b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 469820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 47053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 47180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlFailureCount()); 47280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(4U, payload_state.GetUrlSwitchCount()); 473082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4742b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4752b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // And that failure count should be reset when we download some bytes 4762b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // afterwards. 47719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(progress_bytes); 4782b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 479820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 48053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 48180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 48280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(4U, payload_state.GetUrlSwitchCount()); 483082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 4842b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 4852b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, slightly change the response and set it again. 48653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8532", true, &payload_state, &response); 487a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 4886f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 4896f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan // Make sure the url index was reset to 0 because of the new response. 4902b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 491820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 49253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 49380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 49480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 495082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 4966f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan} 4976f6ea00aa8c4cf54b6842be32ca1226854c24f78Jay Srinivasan 498820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulFullDownload) { 4992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 500820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = false; 5012b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 5025bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 5038427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 5042b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 505d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 50619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 50719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 50819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 50919409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 510082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 511820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 512820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 513820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1)) 514820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 515820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 51619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 51719409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(2)); 5182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 51919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 52019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 52119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 52219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 5239a017f2c5ae41c04a7c7c15b5dbd08faadae7606David Zeuthen 5245bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 5252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 52653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 5272b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5282b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // This should just advance the payload attempt number; 5292b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 530820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 531820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state.DownloadComplete(); 532820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 533820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 534820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 53580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 53680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 537820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo} 538820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 539820cc706c5ef60a3be96f5487f616bfed2b1d207Alex DeymoTEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDeltaDownload) { 540820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo OmahaResponse response; 541820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo response.is_delta_payload = true; 542820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo PayloadState payload_state; 5435bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 5448427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 545820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 546d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber()); 547820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0)) 548820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 549820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1)) 550820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 551820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 552820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // kPrefsFullPayloadAttemptNumber is not incremented for delta payloads. 553820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0)) 554820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 555820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 556820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)) 557820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(1); 558820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 559820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)) 560820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 561820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0)) 562820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 563820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 5645bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 565820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 566820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 567820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo 568820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // This should just advance the payload attempt number; 569820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 570820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 5712b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 5722b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 573820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 57453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 57580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 57680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 5772b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 5782b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5792b5a0f065187fd19179e3809148dbfc376ada7a0Jay SrinivasanTEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) { 5802b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan OmahaResponse response; 5812b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan PayloadState payload_state; 5825bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 5832b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5845bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 58553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 5862b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5872b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Generate enough events to advance URL index, failure count and 5882b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // payload attempt number all to 1. 5892b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan payload_state.DownloadComplete(); 590d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 591d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadTransferError); 5922b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 593820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 59453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 59580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlFailureCount()); 59680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 5972b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 5982b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Now, simulate a corrupted url index on persisted store which gets 5992b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // loaded when update_engine restarts. Using a different prefs object 6002b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // so as to not bother accounting for the uninteresting calls above. 6015bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state2; 6028427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs2 = fake_system_state2.mock_prefs(); 60319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true)); 604d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs2, GetInt64(_, _)).Times(AtLeast(1)); 60519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _)) 60619409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 607820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_CALL(*prefs2, GetInt64(kPrefsFullPayloadAttemptNumber, _)) 608820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo .Times(AtLeast(1)); 60919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _)) 61019409b74019d787100b768306e75ab3e5882898dJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true))); 61119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _)) 61219409b74019d787100b768306e75ab3e5882898dJay Srinivasan .Times(AtLeast(1)); 613cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _)) 614cc6f99600b3354cfe3a0d212241e1ee1dc3421b6David Zeuthen .Times(AtLeast(1)); 6152b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6162b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Note: This will be a different payload object, but the response should 6172b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // have the same hash as before so as to not trivially reset because the 6182b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response was different. We want to specifically test that even if the 6192b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // response is same, we should reset the state if we find it corrupted. 6205bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state2)); 62153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response); 6222b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan 6232b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // Make sure all counters get reset to 0 because of the corrupted URL index 6242b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan // we supplied above. 6252b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber()); 626820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 62753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 62880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 62980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 6302b5a0f065187fd19179e3809148dbfc376ada7a0Jay Srinivasan} 631082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 63220f005c62b55471d3ed8f6fd55e23564adeb59feChris SosaTEST(PayloadStateTest, NoBackoffInteractiveChecks) { 63320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa OmahaResponse response; 63420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa response.is_delta_payload = false; 63520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa PayloadState payload_state; 6365bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 6375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 638d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko params.Init("", "", true); // is_interactive = True. 6395bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 64020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 6415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 64220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 64320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 64420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Simulate two failures (enough to cause payload backoff) and check 64520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // again that we're ready to re-download without any backoff as this is 64620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // an interactive check. 647d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 648d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 64920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 65020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 65120f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 65220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 65320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa} 65420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 65520f005c62b55471d3ed8f6fd55e23564adeb59feChris SosaTEST(PayloadStateTest, NoBackoffForP2PUpdates) { 65620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa OmahaResponse response; 65720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa response.is_delta_payload = false; 65820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa PayloadState payload_state; 6595bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 6605bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 661d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko params.Init("", "", false); // is_interactive = False. 6625bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 66320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 6645bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 66520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 66620f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 66720f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Simulate two failures (enough to cause payload backoff) and check 66820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // again that we're ready to re-download without any backoff as this is 66920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // an interactive check. 670d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 671d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 67220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 67320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 67420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 67520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Set p2p url. 67674b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state.SetUsingP2PForDownloading(true); 67774b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state.SetP2PUrl("http://mypeer:52909/path/to/file"); 67820f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // Should not backoff for p2p updates. 67920f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 68020f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 68174b5f55e6ff608857664fe151f54d78bfe0b75bbGilad Arnold payload_state.SetP2PUrl(""); 68220f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa // No actual p2p update if no url is provided. 68320f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa EXPECT_TRUE(payload_state.ShouldBackoffDownload()); 68420f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa} 68520f005c62b55471d3ed8f6fd55e23564adeb59feChris Sosa 686082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, NoBackoffForDeltaPayloads) { 687082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 688082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = true; 689082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 6905bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 691082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 6925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 69353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 694082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 695082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate a successful download and see that we're ready to download 696082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff as this is a delta payload. 697082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 698820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 699820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 700082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 701082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 702082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Simulate two failures (enough to cause payload backoff) and check 703082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again that we're ready to re-download without any backoff as this is 704082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // a delta payload. 705d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 706d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 70753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 708820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 709820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber()); 710082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 711082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 712082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 713082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasanstatic void CheckPayloadBackoffState(PayloadState* payload_state, 714082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan int expected_attempt_number, 715082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta expected_days) { 716082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state->DownloadComplete(); 717820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(expected_attempt_number, 718820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo payload_state->GetFullPayloadAttemptNumber()); 719082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_TRUE(payload_state->ShouldBackoffDownload()); 720082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time backoff_expiry_time = payload_state->GetBackoffExpiryTime(); 721082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases. 722082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan TimeDelta max_fuzz_delta = TimeDelta::FromHours(7); 723082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta; 724082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta; 725082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_LT(expected_min_time.ToInternalValue(), 726082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 727082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_GT(expected_max_time.ToInternalValue(), 728082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan backoff_expiry_time.ToInternalValue()); 729082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 730082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 731082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) { 732082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 733082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.is_delta_payload = false; 734082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan PayloadState payload_state; 7355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 736082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 7375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 73853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response); 739082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 740082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1)); 741082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2)); 742082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4)); 743082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8)); 744082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16)); 745082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16)); 746082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16)); 747082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16)); 748082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16)); 749082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16)); 750082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 751082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 752082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay SrinivasanTEST(PayloadStateTest, BackoffLogicCanBeDisabled) { 753082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan OmahaResponse response; 754082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan response.disable_payload_backoff = true; 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 // Simulate a successful download and see that we are ready to download 762082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // again without any backoff. 763082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan payload_state.DownloadComplete(); 764082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber()); 765820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber()); 766082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 767082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 768082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // Test again, this time by simulating two errors that would cause 769082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // the payload attempt number to increment due to wrap around. And 770082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan // check that we are still ready to re-download without any backoff. 771d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 772d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch); 773082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber()); 774820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber()); 775082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan EXPECT_FALSE(payload_state.ShouldBackoffDownload()); 776082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan} 777082628869ed3ee3e173c08354d3fc40cdb7df2c0Jay Srinivasan 77819409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) { 77919409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 78019409b74019d787100b768306e75ab3e5882898dJay Srinivasan response.disable_payload_backoff = true; 78119409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 7825bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 78380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t https_total = 0; 78480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t http_total = 0; 78519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 7865bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 78753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response); 788a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(1, payload_state.GetNumResponsesSeen()); 78919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 790dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Simulate a previous attempt with in order to set an initial non-zero value 791dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // for the total bytes downloaded for HTTP. 79280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t prev_chunk = 323456789; 793dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan http_total += prev_chunk; 794dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.DownloadProgress(prev_chunk); 795dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 796dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Ensure that the initial values for HTTP reflect this attempt. 797dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(prev_chunk, 798dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 799dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 800dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 801dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 802dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // Change the response hash so as to simulate a new response which will 803dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // reset the current bytes downloaded, but not the total bytes downloaded. 80453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response); 805a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(2, payload_state.GetNumResponsesSeen()); 806dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan 807dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan // First, simulate successful download of a few bytes over HTTP. 80880f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t first_chunk = 5000000; 80919409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += first_chunk; 81019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(first_chunk); 81153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that first all progress is made on HTTP and none on HTTPS. 81219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 81319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 81419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 81519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 81680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetCurrentBytesDownloaded( 81719409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 81819409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 81919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 82019409b74019d787100b768306e75ab3e5882898dJay Srinivasan 82119409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate an error that'll cause the url index to point to https. 822d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch; 82319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 82419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 82553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Test that no new progress is made on HTTP and new progress is on HTTPS. 82680f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t second_chunk = 23456789; 82719409b74019d787100b768306e75ab3e5882898dJay Srinivasan https_total += second_chunk; 82819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(second_chunk); 82919409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(first_chunk, 83019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 83119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_total, 83219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 83319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 83419409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 83519409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 83619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 83719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 83819409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Simulate error to go back to http. 83919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateFailed(error); 84080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t third_chunk = 32345678; 84180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t http_chunk = first_chunk + third_chunk; 84219409b74019d787100b768306e75ab3e5882898dJay Srinivasan http_total += third_chunk; 84319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(third_chunk); 84419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 84519409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Test that third chunk is again back on HTTP. HTTPS remains on second chunk. 84619409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(http_chunk, 84719409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 848dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan EXPECT_EQ(http_total, 84919409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 85019409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded( 85119409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 85219409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(https_total, 85319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 85419409b74019d787100b768306e75ab3e5882898dJay Srinivasan 855bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Simulate error (will cause URL switch), set p2p is to be used and 856bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // then do 42MB worth of progress 857bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.UpdateFailed(error); 858bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.SetUsingP2PForDownloading(true); 85980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t p2p_total = 42 * 1000 * 1000; 860bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.DownloadProgress(p2p_total); 861bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 862bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(p2p_total, 863bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpPeer)); 864bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 8655bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 866dbd9ea2ad94c3d1ac3e9fdac66c4b5ed11c7cf22Jay Srinivasan .Times(AnyNumber()); 8675bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 86833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 8695bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 87033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateUrlSwitchCount, 87133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 3, _, _, _)); 8725bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 87333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateTotalDurationMinutes, 87433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen _, _, _, _)); 8755bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 87633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage, 87733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 314, _, _, _)); 8785bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 87933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeFull, kNumPayloadTypes)); 8805bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 88133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull, 88233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 8835bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 88433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateAttemptCount, 1, _, _, _)); 88519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 88619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateSucceeded(); 88719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 88819409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the metrics are reset after a successful update. 88980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 89019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 89180f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 89219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 89380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetCurrentBytesDownloaded( 89419409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 89580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 89619409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 897a573d6fd046dc203b96bff6df8e57b35319906fdDavid Zeuthen EXPECT_EQ(0, payload_state.GetNumResponsesSeen()); 89819409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 89919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 900bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid ZeuthenTEST(PayloadStateTest, DownloadSourcesUsedIsCorrect) { 901bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen OmahaResponse response; 902bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen PayloadState payload_state; 9035bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 904bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 9055bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 906bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response); 907bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 908bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Simulate progress in order to mark HTTP as one of the sources used. 90980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t num_bytes = 42 * 1000 * 1000; 910bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.DownloadProgress(num_bytes); 911bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 912bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Check that this was done via HTTP. 913bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(num_bytes, 914bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 915bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen EXPECT_EQ(num_bytes, 916bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 917bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 918bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen // Check that only HTTP is reported as a download source. 9195bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 920bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen .Times(AnyNumber()); 9215bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 92233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdateDownloadSourcesUsed, 92333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen (1 << kDownloadSourceHttpServer), 92433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen _, _, _)); 925bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 926bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen payload_state.UpdateSucceeded(); 927bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen} 928bb8bdc7dd7e54afe181045cc17d5a0dbde99739bDavid Zeuthen 92919409b74019d787100b768306e75ab3e5882898dJay SrinivasanTEST(PayloadStateTest, RestartingUpdateResetsMetrics) { 93019409b74019d787100b768306e75ab3e5882898dJay Srinivasan OmahaResponse response; 9315bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 93219409b74019d787100b768306e75ab3e5882898dJay Srinivasan PayloadState payload_state; 93319409b74019d787100b768306e75ab3e5882898dJay Srinivasan 9345bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 93519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 93619409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Set the first response. 93753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response); 93819409b74019d787100b768306e75ab3e5882898dJay Srinivasan 93980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo uint64_t num_bytes = 10000; 94019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.DownloadProgress(num_bytes); 94119409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 94219409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 94319409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 94419409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 94580f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetCurrentBytesDownloaded( 94619409b74019d787100b768306e75ab3e5882898dJay Srinivasan kDownloadSourceHttpsServer)); 94780f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 94819409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer)); 94919409b74019d787100b768306e75ab3e5882898dJay Srinivasan 95019409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.UpdateRestarted(); 95119409b74019d787100b768306e75ab3e5882898dJay Srinivasan // Make sure the current bytes downloaded is reset, but not the total bytes. 95280f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, 95319409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer)); 95419409b74019d787100b768306e75ab3e5882898dJay Srinivasan EXPECT_EQ(num_bytes, 95519409b74019d787100b768306e75ab3e5882898dJay Srinivasan payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer)); 95619409b74019d787100b768306e75ab3e5882898dJay Srinivasan} 95719409b74019d787100b768306e75ab3e5882898dJay Srinivasan 958be45bef9e283188b00e7def8967f81843669a7f1Chris SosaTEST(PayloadStateTest, NumRebootsIncrementsCorrectly) { 9595bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 960be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa PayloadState payload_state; 961be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 9628427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 963d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AtLeast(0)); 964be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1)); 96519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 9665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 967be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 968be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 96980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetNumReboots()); 970be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 9715bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(true); 972be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 973be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should be incremented because system rebooted detected. 97480f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetNumReboots()); 975be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 9765bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(false); 977be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateResumed(); 978be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Num reboots should now be 1 as reboot was not detected. 97980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetNumReboots()); 980be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa 981be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa // Restart the update again to verify we set the num of reboots back to 0. 982be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa payload_state.UpdateRestarted(); 98380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetNumReboots()); 984be45bef9e283188b00e7def8967f81843669a7f1Chris Sosa} 98519409b74019d787100b768306e75ab3e5882898dJay Srinivasan 986aa18e1641879f2df5993c2b02eb6f50d4443a649Chris SosaTEST(PayloadStateTest, RollbackVersion) { 9875bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 988aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa PayloadState payload_state; 989aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 9908427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* mock_powerwash_safe_prefs = 9915bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.mock_powerwash_safe_prefs(); 9925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 993aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 994aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Verify pre-conditions are good. 995aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_TRUE(payload_state.GetRollbackVersion().empty()); 996aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 997aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa // Mock out the os version and make sure it's blacklisted correctly. 998aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa string rollback_version = "2345.0.0"; 9995bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 1000aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa params.Init(rollback_version, "", false); 10015bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 1002aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1003aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion, 1004aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa rollback_version)); 1005aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa payload_state.Rollback(); 1006aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1007aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion()); 1008b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa 1009b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa // Change it up a little and verify we load it correctly. 1010b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa rollback_version = "2345.0.1"; 1011b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa // Let's verify we can reload it correctly. 1012b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, GetString( 1013b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa kPrefsRollbackVersion, _)).WillOnce(DoAll( 1014b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa SetArgumentPointee<1>(rollback_version), Return(true))); 1015b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion, 1016b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa rollback_version)); 1017b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa payload_state.LoadRollbackVersion(); 1018b3dcdb309615b8ec280584319f37b187924b6694Chris Sosa EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion()); 1019afed4a1a355c8416d496901234932e99864d6215David Zeuthen 102096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen // Check that we report only UpdateEngine.Rollback.* metrics in 102196197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen // UpdateSucceeded(). 1022afed4a1a355c8416d496901234932e99864d6215David Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 1023afed4a1a355c8416d496901234932e99864d6215David Zeuthen .Times(0); 1024afed4a1a355c8416d496901234932e99864d6215David Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 1025afed4a1a355c8416d496901234932e99864d6215David Zeuthen .Times(0); 102696197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 102796197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen SendEnumToUMA( 102896197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen metrics::kMetricRollbackResult, 102996197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen static_cast<int>(metrics::RollbackResult::kSuccess), 103096197df73f6c804d96eb3a1390eb817f354089d2David Zeuthen static_cast<int>(metrics::RollbackResult::kNumConstants))); 1031afed4a1a355c8416d496901234932e99864d6215David Zeuthen payload_state.UpdateSucceeded(); 1032aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa} 1033aa18e1641879f2df5993c2b02eb6f50d4443a649Chris Sosa 1034f413fe59759c73d6a5624c2158260b4302d01fe2David ZeuthenTEST(PayloadStateTest, DurationsAreCorrect) { 1035f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen OmahaResponse response; 1036f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state; 10375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1038f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen FakeClock fake_clock; 10392c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 1040f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1041f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Set the clock to a well-known time - 1 second on the wall-clock 1042f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and 2 seconds on the monotonic clock 1043f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(1000000)); 1044f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000)); 1045f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 10465bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 10472c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 10485bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1049f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1050f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are correct for a successful update where 1051f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // time has advanced 7 seconds on the wall clock and 4 seconds on 1052f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // the monotonic clock. 105353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1054f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(8000000)); 1055f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000)); 1056f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.UpdateSucceeded(); 1057f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000); 1058f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000); 1059f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1060f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Check that durations are reset when a new response comes in. 106153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8594", true, &payload_state, &response); 1062f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0); 1063f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0); 1064f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1065f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance time a bit (10 secs), simulate download progress and 1066f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // check that durations are updated. 1067f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(18000000)); 1068f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000)); 1069f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state.DownloadProgress(10); 1070f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000); 1071f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000); 1072f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1073f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Now simulate a reboot by resetting monotonic time (to 5000) and 1074f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // creating a new PayloadState object and check that we load the 1075f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // durations correctly (e.g. they are the same as before). 1076f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(5000)); 1077f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen PayloadState payload_state2; 10785bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1079f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000); 1080d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(), 1081d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko 10000000); 1082f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1083f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds 1084f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen // and check that the durations are increased accordingly. 1085f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue(25000000)); 1086f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000)); 1087f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen payload_state2.UpdateSucceeded(); 1088f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000); 1089d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(), 1090d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko 16000000); 1091f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen} 1092f413fe59759c73d6a5624c2158260b4302d01fe2David Zeuthen 1093e4c58bf01b6ccc915c6b261007dbb75241ed69b8David ZeuthenTEST(PayloadStateTest, RebootAfterSuccessfulUpdateTest) { 1094e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen OmahaResponse response; 1095e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state; 10965bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1097e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen FakeClock fake_clock; 10982c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 1099e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1100e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Set the clock to a well-known time (t = 30 seconds). 1101e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 1102e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 30 * Time::kMicrosecondsPerSecond)); 1103e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 11045bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 11052c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 11065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1107e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1108e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Make the update succeed. 1109e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1110e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state.UpdateSucceeded(); 1111e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1112e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was written. 11132c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_TRUE(fake_prefs.Exists(kPrefsSystemUpdatedMarker)); 1114e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1115e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Now simulate a reboot and set the wallclock time to a later point 1116e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // (t = 500 seconds). We do this by using a new PayloadState object 1117e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // and checking that it emits the right UMA metric with the right 1118e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // value. 1119e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen fake_clock.SetWallclockTime(Time::FromInternalValue( 1120e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 500 * Time::kMicrosecondsPerSecond)); 1121e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen PayloadState payload_state2; 11225bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1123e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1124e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Expect 500 - 30 seconds = 470 seconds ~= 7 min 50 sec 11255bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 112633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricTimeToRebootMinutes, 112733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen 7, _, _, _)); 11285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(true); 1129e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1130e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen payload_state2.UpdateEngineStarted(); 1131e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1132e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen // Check that the marker was nuked. 11332c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_FALSE(fake_prefs.Exists(kPrefsSystemUpdatedMarker)); 1134e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen} 1135e4c58bf01b6ccc915c6b261007dbb75241ed69b8David Zeuthen 1136569c42413bed641f297d8e0751a04574d04d9dc7Alex DeymoTEST(PayloadStateTest, RestartAfterCrash) { 1137569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo PayloadState payload_state; 11385bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 11398427b4a6d0e6e02beedbb53798272f8ddc39386fAlex Deymo NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs(); 1140569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 11415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1142569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 11434e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // Only the |kPrefsAttemptInProgress| state variable should be read. 1144569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, Exists(_)).Times(0); 1145569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetString(_, _)).Times(0); 1146569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetInt64(_, _)).Times(0); 1147569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, SetBoolean(_, _)).Times(0); 1148569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetString(_, _)).Times(0); 1149569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetInt64(_, _)).Times(0); 1150569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo EXPECT_CALL(*prefs, GetBoolean(_, _)).Times(0); 11514e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*prefs, GetBoolean(kPrefsAttemptInProgress, _)); 1152569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1153569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo // No metrics are reported after a crash. 11545bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 1155569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo SendToUMA(_, _, _, _, _)).Times(0); 1156569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1157569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo // Simulate an update_engine restart without a reboot. 11585bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_system_rebooted(false); 1159569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 1160569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo payload_state.UpdateEngineStarted(); 1161569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo} 1162569c42413bed641f297d8e0751a04574d04d9dc7Alex Deymo 11634e1d1495c034c8a81c989622481b6cdf94a50c3cDavid ZeuthenTEST(PayloadStateTest, AbnormalTerminationAttemptMetricsNoReporting) { 11644e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen PayloadState payload_state; 11654e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen FakeSystemState fake_system_state; 11664e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11674e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // If there's no marker at startup, ensure we don't report a metric. 11684e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 11694e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 11704e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen SendEnumToUMA( 11714e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen metrics::kMetricAttemptResult, 11724e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen static_cast<int>(metrics::AttemptResult::kAbnormalTermination), 11734e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen _)).Times(0); 11744e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen payload_state.UpdateEngineStarted(); 11754e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen} 11764e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11774e1d1495c034c8a81c989622481b6cdf94a50c3cDavid ZeuthenTEST(PayloadStateTest, AbnormalTerminationAttemptMetricsReported) { 11784e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen PayloadState payload_state; 11794e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen FakeSystemState fake_system_state; 11802c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 11814e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11824e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // If we have a marker at startup, ensure it's reported and the 11834e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // marker is then cleared. 11842c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 11852c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_prefs.SetBoolean(kPrefsAttemptInProgress, true); 11864e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11874e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 11884e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11894e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 11904e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen SendEnumToUMA( 11914e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen metrics::kMetricAttemptResult, 11924e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen static_cast<int>(metrics::AttemptResult::kAbnormalTermination), 11934e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen _)).Times(1); 11944e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen payload_state.UpdateEngineStarted(); 11954e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11962c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress)); 11974e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen} 11984e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 11994e1d1495c034c8a81c989622481b6cdf94a50c3cDavid ZeuthenTEST(PayloadStateTest, AbnormalTerminationAttemptMetricsClearedOnSucceess) { 12004e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen PayloadState payload_state; 12014e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen FakeSystemState fake_system_state; 12022c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 12034e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12044e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // Make sure the marker is written and cleared during an attempt and 12054e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // also that we DO NOT emit the metric (since the attempt didn't end 12064e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // abnormally). 12072c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 12084e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 12094e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12104e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _)) 12114e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen .Times(AnyNumber()); 12124e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 12134e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen .Times(AnyNumber()); 12144e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen EXPECT_CALL(*fake_system_state.mock_metrics_lib(), 12154e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen SendEnumToUMA( 12164e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen metrics::kMetricAttemptResult, 12174e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen static_cast<int>(metrics::AttemptResult::kAbnormalTermination), 12184e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen _)).Times(0); 12194e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12204e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // Attempt not in progress, should be clear. 12212c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress)); 12224e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12234e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen payload_state.UpdateRestarted(); 12244e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12254e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // Attempt not in progress, should be set. 12262c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_TRUE(fake_prefs.Exists(kPrefsAttemptInProgress)); 12274e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12284e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen payload_state.UpdateSucceeded(); 12294e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 12304e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen // Attempt not in progress, should be clear. 12312c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress)); 12324e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen} 12334e1d1495c034c8a81c989622481b6cdf94a50c3cDavid Zeuthen 123453173b964f6f43c89dbaba41875fcadd7077b2eaJay SrinivasanTEST(PayloadStateTest, CandidateUrlsComputedCorrectly) { 123553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan OmahaResponse response; 12365bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 123753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan PayloadState payload_state; 123853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 123953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy disable_http_policy; 12405bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_device_policy(&disable_http_policy); 12415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 124253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 1243f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Test with no device policy. Should default to allowing http. 1244f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_)) 1245f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa .WillRepeatedly(Return(false)); 1246f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 124753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Set the first response. 1248f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa SetupPayloadStateWith2Urls("Hash8433", true, &payload_state, &response); 1249f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1250f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Check that we use the HTTP URL since there is no value set for allowing 1251f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // http. 1252f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 1253f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1254f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Test with device policy not allowing http updates. 1255f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_)) 1256f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa .WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true))); 1257f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa 1258f7d8004834f54aaf642da6488521511e6b637fdcChris Sosa // Reset state and set again. 125953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash8433", false, &payload_state, &response); 126053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 126153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we skip the HTTP URL and use only the HTTPS url. 126253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 126353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 126453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Advance the URL index to 1 by faking an error. 1265d1c4d2dd3daed1d507038046c0355fbafb85260cGilad Arnold ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch; 126653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 126753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 126853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 126953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 127080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlSwitchCount()); 127153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, slightly change the response and set it again. 127353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", false, &payload_state, &response); 127453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we still skip the HTTP URL and use only the HTTPS url. 127653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 127753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 127853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, pretend that the HTTP policy is turned on. We want to make sure 127953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the new policy is honored. 128053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan policy::MockDevicePolicy enable_http_policy; 12815bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_device_policy(&enable_http_policy); 128253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_CALL(enable_http_policy, GetHttpDownloadsEnabled(_)) 128353173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan .WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true))); 128453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 128553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Now, set the same response using the same hash 128653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // so that we can test that the state is reset not because of the 128753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // hash but because of the policy change which results in candidate url 128853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // list change. 128953173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan SetupPayloadStateWith2Urls("Hash2399", true, &payload_state, &response); 129053173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 129153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Check that we use the HTTP URL now and the failure count is reset. 129253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("http://test", payload_state.GetCurrentUrl()); 129380f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 129453173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 129553173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // Fake a failure and see if we're moving over to the HTTPS url and update 129653173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan // the URL switch count properly. 129753173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan payload_state.UpdateFailed(error); 129853173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan EXPECT_EQ("https://test", payload_state.GetCurrentUrl()); 129980f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(1U, payload_state.GetUrlSwitchCount()); 130080f70ff45f8ea9a679c0c3ed0dc143dd2fe2b63eAlex Deymo EXPECT_EQ(0U, payload_state.GetUrlFailureCount()); 130153173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan} 130253173b964f6f43c89dbaba41875fcadd7077b2eaJay Srinivasan 13031c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsDelta) { 13041c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13051c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = true; 13061c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13075bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13081c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13095bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13101c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13111c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13121c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13131c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13141c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13155bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 131633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 13175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 131833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeDelta, kNumPayloadTypes)); 13195bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 132033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta, 132133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13221c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13231c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13241c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled but Omaha sends 13251c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // a delta anyway and test again. 13265bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13271c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 13285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13291c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13305bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13311c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13321c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13331c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13341c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13355bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 133633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeDelta, 133733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13385bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 133933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta, 134033bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13411c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13421c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 13431c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13441c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsForcedFull) { 13451c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13461c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 13471c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13485bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13491c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13505bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13511c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13521c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13531c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Mock the request to a request where the delta was disabled. 13545bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13551c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(false); 13565bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13571c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13581c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13591c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13601c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13615bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 136233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 13635bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 136433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeForcedFull, 136533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13665bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 136733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeForcedFull, 136833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13691c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13701c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 13711c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13721c656c48886cf5054b526ed7e95b05903d7644dbAlex DeymoTEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsFull) { 13731c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo OmahaResponse response; 13741c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo response.is_delta_payload = false; 13751c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo PayloadState payload_state; 13765bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 13771c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13785bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 13791c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response); 13801c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 1381820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // Mock the request to a request where the delta is enabled, although the 1382820cc706c5ef60a3be96f5487f616bfed2b1d207Alex Deymo // result is full. 13835bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold OmahaRequestParams params(&fake_system_state); 13841c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo params.set_delta_okay(true); 13855bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_request_params(¶ms); 13861c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13871c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo // Simulate a successful download and update. 13881c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.DownloadComplete(); 13891c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 13905bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _)) 139133bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(AnyNumber()); 13925bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 139333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricAttemptPayloadType, kPayloadTypeFull, 139433bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13955bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA( 139633bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull, 139733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen kNumPayloadTypes)); 13981c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo payload_state.UpdateSucceeded(); 13991c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo} 14001c656c48886cf5054b526ed7e95b05903d7644dbAlex Deymo 14014243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterUpdateFailedMetric) { 14025bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 14034243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 14044243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 14052c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 14062c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 14074243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14085bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 14094243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 14104243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14114243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 14124243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 14134243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 14144243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14154243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14164243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Reboot into the same environment to get an UMA metric with a value of 1. 14175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 141833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 1, _, _, _)); 14194243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14205bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14214243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14224243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a second update and reboot into the same environment, this should 14234243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // send a value of 2. 14244243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14254243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14265bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 142733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 2, _, _, _)); 14284243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14295bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14304243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14314243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a third failed reboot to new version, but this time for a 14324243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // different payload. This should send a value of 1 this time. 14334243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:3141592"); 14345bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 143533bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, 1, _, _, _)); 14364243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib()); 14384243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 14394243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14404243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterUpdateSucceed) { 14415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 14424243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 14434243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 14442c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 14452c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 14464243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 1447763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo FakeBootControl* fake_boot_control = fake_system_state.fake_boot_control(); 1448763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo fake_boot_control->SetCurrentSlot(0); 14494243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14505bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 14514243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 14524243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14534243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 14544243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 14554243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 14564243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14574243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14584243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Change the BootDevice to a different one, no metric should be sent. 1459763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo fake_boot_control->SetCurrentSlot(1); 14604243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14615bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 146233bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 146333bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 14644243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14654243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 1466763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo // A second reboot in either partition should not send a metric. 14674243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 1468763e7dbaac735da0ae802933a1015b6b7874bce2Alex Deymo fake_boot_control->SetCurrentSlot(0); 14694243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14704243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 14714243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14724243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, RebootAfterCanceledUpdate) { 14735bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 14744243291a6655972fe89d4747a0089834c9e47c20Alex Deymo OmahaResponse response; 14754243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 14762c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 14774243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14782c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 14795bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 14804243291a6655972fe89d4747a0089834c9e47c20Alex Deymo SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response); 14814243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14824243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a successful download and update. 14834243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.DownloadComplete(); 14844243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.UpdateSucceeded(); 14854243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ExpectRebootInNewVersion("Version:12345678"); 14864243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14875bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 148833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 148933bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 14904243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14914243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Cancel the applied update. 14924243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ResetUpdateStatus(); 14934243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14944243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a reboot. 14954243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 14964243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 14974243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 14984243291a6655972fe89d4747a0089834c9e47c20Alex DeymoTEST(PayloadStateTest, UpdateSuccessWithWipedPrefs) { 14995bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 15004243291a6655972fe89d4747a0089834c9e47c20Alex Deymo PayloadState payload_state; 15012c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 15024243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15032c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 15045bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 15054243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15065bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA( 150733bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen metrics::kMetricFailedUpdateCount, _, _, _, _)) 150833bae491eded4ef4f1eb4f4ef0f01ef0e5463f3aDavid Zeuthen .Times(0); 15094243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 15104243291a6655972fe89d4747a0089834c9e47c20Alex Deymo // Simulate a reboot in this environment. 15114243291a6655972fe89d4747a0089834c9e47c20Alex Deymo payload_state.ReportFailedBootIfNeeded(); 15124243291a6655972fe89d4747a0089834c9e47c20Alex Deymo} 15134243291a6655972fe89d4747a0089834c9e47c20Alex Deymo 1514dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, DisallowP2PAfterTooManyAttempts) { 1515dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1516dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 15175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 15182c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 15192c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 1520dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 15215bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1522dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1523dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1524dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Should allow exactly kMaxP2PAttempts... 1525dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen for (int n = 0; n < kMaxP2PAttempts; n++) { 1526dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1527dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1528dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen } 1529dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // ... but not more than that. 1530dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1531dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_FALSE(payload_state.P2PAttemptAllowed()); 1532dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1533dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1534dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, DisallowP2PAfterDeadline) { 1535dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1536dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 15375bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1538dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 15392c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 1540dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 15415bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 15422c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 15435bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1544dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1545dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1546dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to 1 second. 1547dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time epoch = Time::FromInternalValue(1000000); 1548dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch); 1549dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1550dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Do an attempt - this will set the timestamp. 1551dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1552dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1553dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Check that the timestamp equals what we just set. 1554dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp()); 1555dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1556dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Time hasn't advanced - this should work. 1557dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1558dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1559dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to half the deadline - this should work. 1560dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1561dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds) / 2); 1562dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1563dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1564dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Check that the first attempt timestamp hasn't changed just 1565dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // because the wall-clock time changed. 1566dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp()); 1567dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1568dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to _just_ before the deadline - this should work. 1569dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1570dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds - 1)); 1571dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_TRUE(payload_state.P2PAttemptAllowed()); 1572dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1573dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set clock to _just_ after the deadline - this should not work. 1574dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(epoch + 1575dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds + 1)); 1576dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_FALSE(payload_state.P2PAttemptAllowed()); 1577dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1578dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1579dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsInitialValue) { 1580dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1581dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 15825bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 15832c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 1584dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 15852c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 15865bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1587dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1588dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1589dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time null_time = Time(); 1590dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp()); 1591dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(0, payload_state.GetP2PNumAttempts()); 1592dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1593dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1594dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsArePersisted) { 1595dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1596dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 15975bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1598dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 15992c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 16005bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 16012c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 16025bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1603dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1604dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1605dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to something known. 1606dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time time = Time::FromInternalValue(12345); 1607dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(time); 1608dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1609dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // New p2p attempt - as a side-effect this will update the p2p state vars. 1610dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1611dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state.GetP2PNumAttempts()); 1612dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp()); 1613dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1614dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Now create a new PayloadState and check that it loads the state 1615dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // vars correctly. 1616dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state2; 16175bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state2.Initialize(&fake_system_state)); 1618dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state2.GetP2PNumAttempts()); 1619dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state2.GetP2PFirstAttemptTimestamp()); 1620dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1621dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1622dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid ZeuthenTEST(PayloadStateTest, P2PStateVarsAreClearedOnNewResponse) { 1623dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen OmahaResponse response; 1624dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen PayloadState payload_state; 16255bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold FakeSystemState fake_system_state; 1626dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen FakeClock fake_clock; 16272c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo FakePrefs fake_prefs; 16285bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold fake_system_state.set_clock(&fake_clock); 16292c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo fake_system_state.set_prefs(&fake_prefs); 16302c0db7b68d1f1fa4538b0c34e2fb5c58930ae0c8Alex Deymo 16315bb4c90b8bdf931426d1926b21b0316a86b4b4e4Gilad Arnold EXPECT_TRUE(payload_state.Initialize(&fake_system_state)); 1632dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response); 1633dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1634dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set the clock to something known. 1635dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time time = Time::FromInternalValue(12345); 1636dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen fake_clock.SetWallclockTime(time); 1637dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1638dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // New p2p attempt - as a side-effect this will update the p2p state vars. 1639dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen payload_state.P2PNewAttempt(); 1640dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(1, payload_state.GetP2PNumAttempts()); 1641dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp()); 1642dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1643dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // Set a new response... 1644dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response); 1645dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1646dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen // ... and check that it clears the P2P state vars. 1647dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen Time null_time = Time(); 1648dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(0, payload_state.GetP2PNumAttempts()); 1649dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp()); 1650dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen} 1651dcba8098a905018e6fe2e8e4e3b121a255f0d99eDavid Zeuthen 1652d2779df63aaad8b65fc5d4badee7dbc9bed7f2b6Alex Vakulenko} // namespace chromeos_update_engine 1653