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