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