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