blob: e4eca89b53627642f187f02c0efdf9dd7242b9f1 [file] [log] [blame]
Alex Deymoaea4c1c2015-08-19 20:24:43 -07001//
2// Copyright (C) 2012 The Android Open Source Project
3//
4// Licensed under the Apache License, Version 2.0 (the "License");
5// you may not use this file except in compliance with the License.
6// You may obtain a copy of the License at
7//
8// http://www.apache.org/licenses/LICENSE-2.0
9//
10// Unless required by applicable law or agreed to in writing, software
11// distributed under the License is distributed on an "AS IS" BASIS,
12// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13// See the License for the specific language governing permissions and
14// limitations under the License.
15//
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080016
Alex Deymo2c0db7b2014-11-04 12:23:39 -080017#include "update_engine/payload_state.h"
18
Alex Vakulenko75039d72014-03-25 12:36:28 -070019#include <base/files/file_path.h>
Alex Deymo2c0db7b2014-11-04 12:23:39 -080020#include <base/files/file_util.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070021#include <base/strings/stringprintf.h>
Alex Deymo2c0db7b2014-11-04 12:23:39 -080022#include <gmock/gmock.h>
23#include <gtest/gtest.h>
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080024
Jay Srinivasand29695d2013-04-08 15:08:05 -070025#include "update_engine/constants.h"
David Zeuthenf413fe52013-04-22 14:04:39 -070026#include "update_engine/fake_clock.h"
Alex Deymo42432912013-07-12 20:21:15 -070027#include "update_engine/fake_hardware.h"
David Zeuthen4e1d1492014-04-25 13:12:27 -070028#include "update_engine/fake_prefs.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070029#include "update_engine/fake_system_state.h"
Alex Deymo8427b4a2014-11-05 14:00:32 -080030#include "update_engine/mock_prefs.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080031#include "update_engine/omaha_request_action.h"
David Zeuthenf413fe52013-04-22 14:04:39 -070032#include "update_engine/prefs.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080033#include "update_engine/test_utils.h"
34#include "update_engine/utils.h"
35
Jay Srinivasan08262882012-12-28 19:29:43 -080036using base::Time;
37using base::TimeDelta;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080038using std::string;
Alex Deymo42432912013-07-12 20:21:15 -070039using testing::AnyNumber;
40using testing::AtLeast;
41using testing::Mock;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080042using testing::NiceMock;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080043using testing::Return;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080044using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070045using testing::_;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080046
47namespace chromeos_update_engine {
48
Jay Srinivasan19409b72013-04-12 19:23:36 -070049const char* kCurrentBytesDownloadedFromHttps =
50 "current-bytes-downloaded-from-HttpsServer";
51const char* kTotalBytesDownloadedFromHttps =
52 "total-bytes-downloaded-from-HttpsServer";
53const char* kCurrentBytesDownloadedFromHttp =
54 "current-bytes-downloaded-from-HttpServer";
55const char* kTotalBytesDownloadedFromHttp =
56 "total-bytes-downloaded-from-HttpServer";
David Zeuthenbb8bdc72013-09-03 13:43:48 -070057const char* kCurrentBytesDownloadedFromHttpPeer =
58 "current-bytes-downloaded-from-HttpPeer";
59const char* kTotalBytesDownloadedFromHttpPeer =
60 "total-bytes-downloaded-from-HttpPeer";
Jay Srinivasan19409b72013-04-12 19:23:36 -070061
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080062static void SetupPayloadStateWith2Urls(string hash,
Jay Srinivasan53173b92013-05-17 17:13:01 -070063 bool http_enabled,
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080064 PayloadState* payload_state,
65 OmahaResponse* response) {
66 response->payload_urls.clear();
67 response->payload_urls.push_back("http://test");
68 response->payload_urls.push_back("https://test");
69 response->size = 523456789;
70 response->hash = hash;
71 response->metadata_size = 558123;
72 response->metadata_signature = "metasign";
73 response->max_failure_count_per_url = 3;
74 payload_state->SetResponse(*response);
Jay Srinivasan08262882012-12-28 19:29:43 -080075 string stored_response_sign = payload_state->GetResponseSignature();
Jay Srinivasan53173b92013-05-17 17:13:01 -070076
77 string expected_url_https_only =
78 "NumURLs = 1\n"
79 "Candidate Url0 = https://test\n";
80
81 string expected_urls_both =
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080082 "NumURLs = 2\n"
Jay Srinivasan53173b92013-05-17 17:13:01 -070083 "Candidate Url0 = http://test\n"
84 "Candidate Url1 = https://test\n";
85
86 string expected_response_sign =
87 (http_enabled ? expected_urls_both : expected_url_https_only) +
Alex Vakulenko75039d72014-03-25 12:36:28 -070088 base::StringPrintf("Payload Size = 523456789\n"
89 "Payload Sha256 Hash = %s\n"
90 "Metadata Size = 558123\n"
91 "Metadata Signature = metasign\n"
92 "Is Delta Payload = %d\n"
93 "Max Failure Count Per Url = %d\n"
94 "Disable Payload Backoff = %d\n",
95 hash.c_str(),
96 response->is_delta_payload,
97 response->max_failure_count_per_url,
98 response->disable_payload_backoff);
Jay Srinivasan08262882012-12-28 19:29:43 -080099 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800100}
101
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800102class PayloadStateTest : public ::testing::Test { };
103
David Zeuthena99981f2013-04-29 13:42:47 -0700104TEST(PayloadStateTest, DidYouAddANewErrorCode) {
Allie Woodeb9e6d82015-04-17 13:55:30 -0700105 if (static_cast<int>(ErrorCode::kUmaReportedMax) != 48) {
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800106 LOG(ERROR) << "The following failure is intentional. If you added a new "
David Zeuthena99981f2013-04-29 13:42:47 -0700107 << "ErrorCode enum value, make sure to add it to the "
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800108 << "PayloadState::UpdateFailed method and then update this test "
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700109 << "to the new value of ErrorCode::kUmaReportedMax, which is "
110 << ErrorCode::kUmaReportedMax;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800111 EXPECT_FALSE("Please see the log line above");
112 }
113}
114
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800115TEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) {
116 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700117 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800118 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700119 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700120 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
121 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700122 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
123 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700124 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
125 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
126 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
127 .Times(AtLeast(1));
128 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
129 .Times(AtLeast(1));
130 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
131 .Times(AtLeast(1));
132 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
133 .Times(AtLeast(1));
134 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
135 .Times(AtLeast(1));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700136 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
137 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700138 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800139 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700140 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800141 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800142 string stored_response_sign = payload_state.GetResponseSignature();
143 string expected_response_sign = "NumURLs = 0\n"
144 "Payload Size = 0\n"
145 "Payload Sha256 Hash = \n"
146 "Metadata Size = 0\n"
147 "Metadata Signature = \n"
148 "Is Delta Payload = 0\n"
149 "Max Failure Count Per Url = 0\n"
150 "Disable Payload Backoff = 0\n";
151 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700152 EXPECT_EQ("", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800153 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700154 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700155 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800156}
157
158TEST(PayloadStateTest, SetResponseWorksWithSingleUrl) {
159 OmahaResponse response;
Jay Srinivasan53173b92013-05-17 17:13:01 -0700160 response.payload_urls.push_back("https://single.url.test");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800161 response.size = 123456789;
162 response.hash = "hash";
163 response.metadata_size = 58123;
164 response.metadata_signature = "msign";
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700165 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800166 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700167 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700168 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
169 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700170 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
171 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700172 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
173 .Times(AtLeast(1));
174 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
175 .Times(AtLeast(1));
176 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
177 .Times(AtLeast(1));
178 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
179 .Times(AtLeast(1));
180 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
181 .Times(AtLeast(1));
182 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
183 .Times(AtLeast(1));
184 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
185 .Times(AtLeast(1));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700186 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
187 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700188 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
189 .Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800190 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700191 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800192 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800193 string stored_response_sign = payload_state.GetResponseSignature();
194 string expected_response_sign = "NumURLs = 1\n"
Jay Srinivasan53173b92013-05-17 17:13:01 -0700195 "Candidate Url0 = https://single.url.test\n"
Jay Srinivasan08262882012-12-28 19:29:43 -0800196 "Payload Size = 123456789\n"
197 "Payload Sha256 Hash = hash\n"
198 "Metadata Size = 58123\n"
199 "Metadata Signature = msign\n"
200 "Is Delta Payload = 0\n"
201 "Max Failure Count Per Url = 0\n"
202 "Disable Payload Backoff = 0\n";
203 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700204 EXPECT_EQ("https://single.url.test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800205 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700206 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700207 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800208}
209
210TEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) {
211 OmahaResponse response;
212 response.payload_urls.push_back("http://multiple.url.test");
213 response.payload_urls.push_back("https://multiple.url.test");
214 response.size = 523456789;
215 response.hash = "rhash";
216 response.metadata_size = 558123;
217 response.metadata_signature = "metasign";
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700218 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800219 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700220 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700221 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
222 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700223 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
224 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700225 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
226 .Times(AtLeast(1));
227 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
228 .Times(AtLeast(1));
229 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
230 .Times(AtLeast(1));
231 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
232 .Times(AtLeast(1));
233 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
234 .Times(AtLeast(1));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700235 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
236 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700237 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
238 .Times(AtLeast(1));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700239
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800240 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700241 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800242 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800243 string stored_response_sign = payload_state.GetResponseSignature();
244 string expected_response_sign = "NumURLs = 2\n"
Jay Srinivasan53173b92013-05-17 17:13:01 -0700245 "Candidate Url0 = http://multiple.url.test\n"
246 "Candidate Url1 = https://multiple.url.test\n"
Jay Srinivasan08262882012-12-28 19:29:43 -0800247 "Payload Size = 523456789\n"
248 "Payload Sha256 Hash = rhash\n"
249 "Metadata Size = 558123\n"
250 "Metadata Signature = metasign\n"
251 "Is Delta Payload = 0\n"
252 "Max Failure Count Per Url = 0\n"
253 "Disable Payload Backoff = 0\n";
254 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700255 EXPECT_EQ("http://multiple.url.test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800256 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700257 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700258 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800259}
260
261TEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) {
262 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700263 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800264 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800265 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800266
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700267 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800268 // Payload attempt should start with 0 and then advance to 1.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700269 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
270 .Times(AtLeast(1));
271 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
272 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700273 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
274 .Times(AtLeast(1));
275 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
276 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700277 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2));
David Zeuthen9a017f22013-04-11 16:10:26 -0700278
Chris Sosabe45bef2013-04-09 18:25:12 -0700279 // Reboots will be set
280 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1));
281
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800282 // Url index should go from 0 to 1 twice.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700283 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
284 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800285
286 // Failure count should be called each times url index is set, so that's
287 // 4 times for this test.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700288 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
289 .Times(AtLeast(4));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800290
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700291 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800292
293 // This does a SetResponse which causes all the states to be set to 0 for
294 // the first time.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700295 SetupPayloadStateWith2Urls("Hash1235", true, &payload_state, &response);
296 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800297
298 // Verify that on the first error, the URL index advances to 1.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700299 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800300 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700301 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800302
303 // Verify that on the next error, the URL index wraps around to 0.
304 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700305 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306
307 // Verify that on the next error, it again advances to 1.
308 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700309 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
David Zeuthencc6f9962013-04-18 11:57:24 -0700310
311 // Verify that we switched URLs three times
312 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800313}
314
315TEST(PayloadStateTest, NewResponseResetsPayloadState) {
316 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700317 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800318 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800319
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700320 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800321
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700322 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800323 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700324 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800325 .Times(AnyNumber());
326
Alex Deymob33b0f02013-08-08 21:10:02 -0700327 // The first response doesn't send an abandoned event.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700328 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymob33b0f02013-08-08 21:10:02 -0700329 "Installer.UpdatesAbandonedEventCount", 0, _, _, _)).Times(0);
330
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800331 // Set the first response.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700332 SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700333 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800334
335 // Advance the URL index to 1 by faking an error.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700336 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800337 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700338 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
David Zeuthencc6f9962013-04-18 11:57:24 -0700339 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800340
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700341 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymob33b0f02013-08-08 21:10:02 -0700342 "Installer.UpdatesAbandonedEventCount", 1, _, _, _));
343
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800344 // Now, slightly change the response and set it again.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700345 SetupPayloadStateWith2Urls("Hash8225", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700346 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800347
Alex Deymob33b0f02013-08-08 21:10:02 -0700348 // Fake an error again.
349 payload_state.UpdateFailed(error);
350 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
351 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
352
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700353 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymob33b0f02013-08-08 21:10:02 -0700354 "Installer.UpdatesAbandonedEventCount", 2, _, _, _));
355
356 // Return a third different response.
357 SetupPayloadStateWith2Urls("Hash9999", true, &payload_state, &response);
358 EXPECT_EQ(3, payload_state.GetNumResponsesSeen());
359
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800360 // Make sure the url index was reset to 0 because of the new response.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700361 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800362 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700363 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700364 EXPECT_EQ(0,
365 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
366 EXPECT_EQ(0,
367 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
368 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
369 kDownloadSourceHttpsServer));
370 EXPECT_EQ(0,
371 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800372}
373
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800374TEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) {
375 OmahaResponse response;
376 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700377 FakeSystemState fake_system_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700378 int progress_bytes = 100;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800379 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800380
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700381 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700382 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
383 .Times(AtLeast(2));
384 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
385 .Times(AtLeast(1));
386 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2))
387 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800388
Alex Deymo820cc702013-06-28 15:43:46 -0700389 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
390 .Times(AtLeast(2));
391 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
392 .Times(AtLeast(1));
393 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 2))
394 .Times(AtLeast(1));
395
Jay Srinivasan19409b72013-04-12 19:23:36 -0700396 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4));
Jay Srinivasan08262882012-12-28 19:29:43 -0800397
Jay Srinivasan19409b72013-04-12 19:23:36 -0700398 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4));
399 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800400
Jay Srinivasan19409b72013-04-12 19:23:36 -0700401 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
402 .Times(AtLeast(7));
403 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1))
404 .Times(AtLeast(2));
405 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2))
406 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800407
Jay Srinivasan19409b72013-04-12 19:23:36 -0700408 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
409 .Times(AtLeast(1));
410 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
411 .Times(AtLeast(1));
David Zeuthen9a017f22013-04-11 16:10:26 -0700412
Jay Srinivasan19409b72013-04-12 19:23:36 -0700413 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
414 .Times(AtLeast(1));
415 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
416 .Times(AtLeast(1));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700417 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
418 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700419 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes))
420 .Times(AtLeast(1));
421 EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes))
422 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700423 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
424 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700425
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700426 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800427
Jay Srinivasan53173b92013-05-17 17:13:01 -0700428 SetupPayloadStateWith2Urls("Hash5873", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700429 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800430
431 // This should advance the URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700432 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800433 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700434 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700435 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800436 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700437 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800438
439 // This should advance the failure count only.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700440 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800441 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700442 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700443 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800444 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700445 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800446
447 // This should advance the failure count only.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700448 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800449 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700450 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700451 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800452 EXPECT_EQ(2, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700453 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800454
455 // This should advance the URL index as we've reached the
456 // max failure count and reset the failure count for the new URL index.
457 // This should also wrap around the URL index and thus cause the payload
458 // attempt number to be incremented.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700459 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800460 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700461 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700462 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800463 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700464 EXPECT_EQ(2, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800465 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800466
467 // This should advance the URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700468 payload_state.UpdateFailed(ErrorCode::kPayloadHashMismatchError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800469 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700470 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700471 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800472 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700473 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800474 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800475
476 // This should advance the URL index and payload attempt number due to
477 // wrap-around of URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700478 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMissingError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800479 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700480 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700481 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800482 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700483 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800484 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800485
486 // This HTTP error code should only increase the failure count.
David Zeuthena99981f2013-04-29 13:42:47 -0700487 payload_state.UpdateFailed(static_cast<ErrorCode>(
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700488 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 404));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800489 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700490 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700491 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800492 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700493 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800494 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800495
496 // And that failure count should be reset when we download some bytes
497 // afterwards.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700498 payload_state.DownloadProgress(progress_bytes);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800499 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700500 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700501 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800502 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700503 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800504 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800505
506 // Now, slightly change the response and set it again.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700507 SetupPayloadStateWith2Urls("Hash8532", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700508 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800509
510 // Make sure the url index was reset to 0 because of the new response.
511 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700512 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700513 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800514 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700515 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800516 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800517}
518
Alex Deymo820cc702013-06-28 15:43:46 -0700519TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulFullDownload) {
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800520 OmahaResponse response;
Alex Deymo820cc702013-06-28 15:43:46 -0700521 response.is_delta_payload = false;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800522 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700523 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800524 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800525
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700526 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700527 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
528 .Times(AtLeast(1));
529 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
530 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800531
Alex Deymo820cc702013-06-28 15:43:46 -0700532 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
533 .Times(AtLeast(1));
534 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
535 .Times(AtLeast(1));
536
Jay Srinivasan19409b72013-04-12 19:23:36 -0700537 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _))
538 .Times(AtLeast(2));
Jay Srinivasan08262882012-12-28 19:29:43 -0800539
Jay Srinivasan19409b72013-04-12 19:23:36 -0700540 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
541 .Times(AtLeast(1));
542 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
543 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800544
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700545 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800546
Jay Srinivasan53173b92013-05-17 17:13:01 -0700547 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800548
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700549 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo29b51d92013-07-09 15:26:24 -0700550 "Installer.PayloadAttemptNumber", 1, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700551 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo29b51d92013-07-09 15:26:24 -0700552 "Installer.FullPayloadAttemptNumber", 1, _, _, _));
553
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800554 // This should just advance the payload attempt number;
555 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700556 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800557 payload_state.DownloadComplete();
558 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700559 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
560 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
561 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
562 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
563}
564
565TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDeltaDownload) {
566 OmahaResponse response;
567 response.is_delta_payload = true;
568 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700569 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800570 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Deymo820cc702013-06-28 15:43:46 -0700571
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700572 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700573 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
574 .Times(AtLeast(1));
575 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
576 .Times(AtLeast(1));
577
578 // kPrefsFullPayloadAttemptNumber is not incremented for delta payloads.
579 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
580 .Times(AtLeast(1));
581
582 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _))
583 .Times(1);
584
585 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
586 .Times(AtLeast(1));
587 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
588 .Times(AtLeast(1));
589
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700590 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo820cc702013-06-28 15:43:46 -0700591
592 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
593
Alex Deymo29b51d92013-07-09 15:26:24 -0700594 // Metrics for Full payload attempt number is not sent with Delta payloads.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700595 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo29b51d92013-07-09 15:26:24 -0700596 "Installer.PayloadAttemptNumber", 1, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700597 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo29b51d92013-07-09 15:26:24 -0700598 "Installer.FullPayloadAttemptNumber", _, _, _, _))
599 .Times(0);
600
Alex Deymo820cc702013-06-28 15:43:46 -0700601 // This should just advance the payload attempt number;
602 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
603 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
604 payload_state.DownloadComplete();
605 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
606 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700607 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800608 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700609 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800610}
611
612TEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) {
613 OmahaResponse response;
614 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700615 FakeSystemState fake_system_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800616
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700617 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700618 SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800619
620 // Generate enough events to advance URL index, failure count and
621 // payload attempt number all to 1.
622 payload_state.DownloadComplete();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700623 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
624 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800625 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700626 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700627 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800628 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700629 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800630
631 // Now, simulate a corrupted url index on persisted store which gets
632 // loaded when update_engine restarts. Using a different prefs object
633 // so as to not bother accounting for the uninteresting calls above.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700634 FakeSystemState fake_system_state2;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800635 NiceMock<MockPrefs>* prefs2 = fake_system_state2.mock_prefs();
Jay Srinivasan19409b72013-04-12 19:23:36 -0700636 EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700637 EXPECT_CALL(*prefs2, GetInt64(_, _)).Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700638 EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _))
639 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700640 EXPECT_CALL(*prefs2, GetInt64(kPrefsFullPayloadAttemptNumber, _))
641 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700642 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _))
643 .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true)));
644 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _))
645 .Times(AtLeast(1));
David Zeuthencc6f9962013-04-18 11:57:24 -0700646 EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _))
647 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800648
649 // Note: This will be a different payload object, but the response should
650 // have the same hash as before so as to not trivially reset because the
651 // response was different. We want to specifically test that even if the
652 // response is same, we should reset the state if we find it corrupted.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700653 EXPECT_TRUE(payload_state.Initialize(&fake_system_state2));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700654 SetupPayloadStateWith2Urls("Hash4427", true, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800655
656 // Make sure all counters get reset to 0 because of the corrupted URL index
657 // we supplied above.
658 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700659 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700660 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800661 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700662 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800663}
Jay Srinivasan08262882012-12-28 19:29:43 -0800664
Chris Sosa20f005c2013-09-05 13:53:08 -0700665TEST(PayloadStateTest, NoBackoffInteractiveChecks) {
666 OmahaResponse response;
667 response.is_delta_payload = false;
668 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700669 FakeSystemState fake_system_state;
670 OmahaRequestParams params(&fake_system_state);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700671 params.Init("", "", true); // is_interactive = True.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700672 fake_system_state.set_request_params(&params);
Chris Sosa20f005c2013-09-05 13:53:08 -0700673
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700674 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosa20f005c2013-09-05 13:53:08 -0700675 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
676
677 // Simulate two failures (enough to cause payload backoff) and check
678 // again that we're ready to re-download without any backoff as this is
679 // an interactive check.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700680 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
681 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Chris Sosa20f005c2013-09-05 13:53:08 -0700682 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
683 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
684 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
685 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
686}
687
688TEST(PayloadStateTest, NoBackoffForP2PUpdates) {
689 OmahaResponse response;
690 response.is_delta_payload = false;
691 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700692 FakeSystemState fake_system_state;
693 OmahaRequestParams params(&fake_system_state);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700694 params.Init("", "", false); // is_interactive = False.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700695 fake_system_state.set_request_params(&params);
Chris Sosa20f005c2013-09-05 13:53:08 -0700696
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700697 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosa20f005c2013-09-05 13:53:08 -0700698 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
699
700 // Simulate two failures (enough to cause payload backoff) and check
701 // again that we're ready to re-download without any backoff as this is
702 // an interactive check.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700703 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
704 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Chris Sosa20f005c2013-09-05 13:53:08 -0700705 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
706 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
707 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
708 // Set p2p url.
Gilad Arnold74b5f552014-10-07 08:17:16 -0700709 payload_state.SetUsingP2PForDownloading(true);
710 payload_state.SetP2PUrl("http://mypeer:52909/path/to/file");
Chris Sosa20f005c2013-09-05 13:53:08 -0700711 // Should not backoff for p2p updates.
712 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
713
Gilad Arnold74b5f552014-10-07 08:17:16 -0700714 payload_state.SetP2PUrl("");
Chris Sosa20f005c2013-09-05 13:53:08 -0700715 // No actual p2p update if no url is provided.
716 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
717}
718
Jay Srinivasan08262882012-12-28 19:29:43 -0800719TEST(PayloadStateTest, NoBackoffForDeltaPayloads) {
720 OmahaResponse response;
721 response.is_delta_payload = true;
722 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700723 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800724
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700725 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700726 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800727
728 // Simulate a successful download and see that we're ready to download
729 // again without any backoff as this is a delta payload.
730 payload_state.DownloadComplete();
Alex Deymo820cc702013-06-28 15:43:46 -0700731 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
732 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800733 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
734
735 // Simulate two failures (enough to cause payload backoff) and check
736 // again that we're ready to re-download without any backoff as this is
737 // a delta payload.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700738 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
739 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700740 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo820cc702013-06-28 15:43:46 -0700741 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
742 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800743 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
744}
745
746static void CheckPayloadBackoffState(PayloadState* payload_state,
747 int expected_attempt_number,
748 TimeDelta expected_days) {
749 payload_state->DownloadComplete();
Alex Deymo820cc702013-06-28 15:43:46 -0700750 EXPECT_EQ(expected_attempt_number,
751 payload_state->GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800752 EXPECT_TRUE(payload_state->ShouldBackoffDownload());
753 Time backoff_expiry_time = payload_state->GetBackoffExpiryTime();
754 // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases.
755 TimeDelta max_fuzz_delta = TimeDelta::FromHours(7);
756 Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta;
757 Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta;
758 EXPECT_LT(expected_min_time.ToInternalValue(),
759 backoff_expiry_time.ToInternalValue());
760 EXPECT_GT(expected_max_time.ToInternalValue(),
761 backoff_expiry_time.ToInternalValue());
762}
763
764TEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) {
765 OmahaResponse response;
766 response.is_delta_payload = false;
767 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700768 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800769
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700770 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700771 SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800772
773 CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1));
774 CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2));
775 CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4));
776 CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8));
777 CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16));
778 CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16));
779 CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16));
780 CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16));
781 CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16));
782 CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16));
783}
784
785TEST(PayloadStateTest, BackoffLogicCanBeDisabled) {
786 OmahaResponse response;
787 response.disable_payload_backoff = true;
788 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700789 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800790
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700791 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700792 SetupPayloadStateWith2Urls("Hash8939", true, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800793
794 // Simulate a successful download and see that we are ready to download
795 // again without any backoff.
796 payload_state.DownloadComplete();
797 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700798 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800799 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
800
801 // Test again, this time by simulating two errors that would cause
802 // the payload attempt number to increment due to wrap around. And
803 // check that we are still ready to re-download without any backoff.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700804 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
805 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan08262882012-12-28 19:29:43 -0800806 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700807 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800808 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
809}
810
Jay Srinivasan19409b72013-04-12 19:23:36 -0700811TEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) {
812 OmahaResponse response;
813 response.disable_payload_backoff = true;
814 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700815 FakeSystemState fake_system_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700816 int https_total = 0;
817 int http_total = 0;
818
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700819 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700820 SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700821 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700822
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700823 // Simulate a previous attempt with in order to set an initial non-zero value
824 // for the total bytes downloaded for HTTP.
825 int prev_chunk = 323456789;
826 http_total += prev_chunk;
827 payload_state.DownloadProgress(prev_chunk);
828
829 // Ensure that the initial values for HTTP reflect this attempt.
830 EXPECT_EQ(prev_chunk,
831 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
832 EXPECT_EQ(http_total,
833 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
834
835 // Change the response hash so as to simulate a new response which will
836 // reset the current bytes downloaded, but not the total bytes downloaded.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700837 SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700838 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700839
840 // First, simulate successful download of a few bytes over HTTP.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700841 int first_chunk = 5000000;
842 http_total += first_chunk;
843 payload_state.DownloadProgress(first_chunk);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700844 // Test that first all progress is made on HTTP and none on HTTPS.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700845 EXPECT_EQ(first_chunk,
846 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
847 EXPECT_EQ(http_total,
848 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
849 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
850 kDownloadSourceHttpsServer));
851 EXPECT_EQ(https_total,
852 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
853
854 // Simulate an error that'll cause the url index to point to https.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700855 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700856 payload_state.UpdateFailed(error);
857
Jay Srinivasan53173b92013-05-17 17:13:01 -0700858 // Test that no new progress is made on HTTP and new progress is on HTTPS.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700859 int second_chunk = 23456789;
860 https_total += second_chunk;
861 payload_state.DownloadProgress(second_chunk);
862 EXPECT_EQ(first_chunk,
863 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
864 EXPECT_EQ(http_total,
865 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
866 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
867 kDownloadSourceHttpsServer));
868 EXPECT_EQ(https_total,
869 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
870
871 // Simulate error to go back to http.
872 payload_state.UpdateFailed(error);
873 int third_chunk = 32345678;
874 int http_chunk = first_chunk + third_chunk;
875 http_total += third_chunk;
876 int https_chunk = second_chunk;
877 payload_state.DownloadProgress(third_chunk);
878
879 // Test that third chunk is again back on HTTP. HTTPS remains on second chunk.
880 EXPECT_EQ(http_chunk,
881 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700882 EXPECT_EQ(http_total,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700883 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
884 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
885 kDownloadSourceHttpsServer));
886 EXPECT_EQ(https_total,
887 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
888
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700889 // Simulate error (will cause URL switch), set p2p is to be used and
890 // then do 42MB worth of progress
891 payload_state.UpdateFailed(error);
892 payload_state.SetUsingP2PForDownloading(true);
893 int p2p_total = 42 * 1000 * 1000;
894 payload_state.DownloadProgress(p2p_total);
895
896 EXPECT_EQ(p2p_total,
897 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpPeer));
898
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700899 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _))
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700900 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700901 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800902 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700903 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Jay Srinivasan19409b72013-04-12 19:23:36 -0700904 "Installer.SuccessfulMBsDownloadedFromHttpServer",
905 http_chunk / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700906 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Jay Srinivasan19409b72013-04-12 19:23:36 -0700907 "Installer.TotalMBsDownloadedFromHttpServer",
908 http_total / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700909 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Jay Srinivasan19409b72013-04-12 19:23:36 -0700910 "Installer.SuccessfulMBsDownloadedFromHttpsServer",
911 https_chunk / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700912 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Jay Srinivasan19409b72013-04-12 19:23:36 -0700913 "Installer.TotalMBsDownloadedFromHttpsServer",
914 https_total / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700915 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700916 "Installer.SuccessfulMBsDownloadedFromHttpPeer",
917 p2p_total / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700918 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700919 "Installer.TotalMBsDownloadedFromHttpPeer",
920 p2p_total / kNumBytesInOneMiB, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700921 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthencc6f9962013-04-18 11:57:24 -0700922 "Installer.UpdateURLSwitches",
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700923 3, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700924 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800925 metrics::kMetricSuccessfulUpdateUrlSwitchCount,
926 3, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700927 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen674c3182013-04-18 14:05:20 -0700928 "Installer.UpdateDurationMinutes",
929 _, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700930 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800931 metrics::kMetricSuccessfulUpdateTotalDurationMinutes,
932 _, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700933 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen674c3182013-04-18 14:05:20 -0700934 "Installer.UpdateDurationUptimeMinutes",
935 _, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700936 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700937 "Installer.DownloadSourcesUsed",
938 (1 << kDownloadSourceHttpsServer) | (1 << kDownloadSourceHttpServer) |
939 (1 << kDownloadSourceHttpPeer),
940 _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700941 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700942 "Installer.DownloadOverheadPercentage", 318, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700943 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800944 metrics::kMetricSuccessfulUpdateDownloadOverheadPercentage,
945 314, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700946 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
Alex Deymo1c656c42013-06-28 11:02:14 -0700947 "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700948 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800949 metrics::kMetricAttemptPayloadType, kPayloadTypeFull, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700950 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800951 metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull,
952 kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700953 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo820cc702013-06-28 15:43:46 -0700954 "Installer.AttemptsCount.Total", 1, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700955 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800956 metrics::kMetricSuccessfulUpdateAttemptCount, 1, _, _, _));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700957
958 payload_state.UpdateSucceeded();
959
960 // Make sure the metrics are reset after a successful update.
961 EXPECT_EQ(0,
962 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
963 EXPECT_EQ(0,
964 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
965 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
966 kDownloadSourceHttpsServer));
967 EXPECT_EQ(0,
968 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
David Zeuthena573d6f2013-06-14 16:13:36 -0700969 EXPECT_EQ(0, payload_state.GetNumResponsesSeen());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700970}
971
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700972TEST(PayloadStateTest, DownloadSourcesUsedIsCorrect) {
973 OmahaResponse response;
974 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700975 FakeSystemState fake_system_state;
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700976
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700977 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700978 SetupPayloadStateWith2Urls("Hash3286", true, &payload_state, &response);
979
980 // Simulate progress in order to mark HTTP as one of the sources used.
981 int num_bytes = 42 * 1000 * 1000;
982 payload_state.DownloadProgress(num_bytes);
983
984 // Check that this was done via HTTP.
985 EXPECT_EQ(num_bytes,
986 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
987 EXPECT_EQ(num_bytes,
988 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
989
990 // Check that only HTTP is reported as a download source.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700991 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _))
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700992 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700993 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700994 "Installer.DownloadSourcesUsed",
995 (1 << kDownloadSourceHttpServer),
996 _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700997 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -0800998 metrics::kMetricSuccessfulUpdateDownloadSourcesUsed,
999 (1 << kDownloadSourceHttpServer),
1000 _, _, _));
David Zeuthenbb8bdc72013-09-03 13:43:48 -07001001
1002 payload_state.UpdateSucceeded();
1003}
1004
Jay Srinivasan19409b72013-04-12 19:23:36 -07001005TEST(PayloadStateTest, RestartingUpdateResetsMetrics) {
1006 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001007 FakeSystemState fake_system_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -07001008 PayloadState payload_state;
1009
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001010 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan19409b72013-04-12 19:23:36 -07001011
1012 // Set the first response.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001013 SetupPayloadStateWith2Urls("Hash5823", true, &payload_state, &response);
Jay Srinivasan19409b72013-04-12 19:23:36 -07001014
1015 int num_bytes = 10000;
1016 payload_state.DownloadProgress(num_bytes);
1017 EXPECT_EQ(num_bytes,
1018 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
1019 EXPECT_EQ(num_bytes,
1020 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
1021 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
1022 kDownloadSourceHttpsServer));
1023 EXPECT_EQ(0,
1024 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
1025
1026 payload_state.UpdateRestarted();
1027 // Make sure the current bytes downloaded is reset, but not the total bytes.
1028 EXPECT_EQ(0,
1029 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
1030 EXPECT_EQ(num_bytes,
1031 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
1032}
1033
Chris Sosabe45bef2013-04-09 18:25:12 -07001034TEST(PayloadStateTest, NumRebootsIncrementsCorrectly) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001035 FakeSystemState fake_system_state;
Chris Sosabe45bef2013-04-09 18:25:12 -07001036 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -07001037
Alex Deymo8427b4a2014-11-05 14:00:32 -08001038 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001039 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AtLeast(0));
Chris Sosabe45bef2013-04-09 18:25:12 -07001040 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1));
1041
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001042 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosabe45bef2013-04-09 18:25:12 -07001043
1044 payload_state.UpdateRestarted();
1045 EXPECT_EQ(0, payload_state.GetNumReboots());
1046
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001047 fake_system_state.set_system_rebooted(true);
Chris Sosabe45bef2013-04-09 18:25:12 -07001048 payload_state.UpdateResumed();
1049 // Num reboots should be incremented because system rebooted detected.
1050 EXPECT_EQ(1, payload_state.GetNumReboots());
1051
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001052 fake_system_state.set_system_rebooted(false);
Chris Sosabe45bef2013-04-09 18:25:12 -07001053 payload_state.UpdateResumed();
1054 // Num reboots should now be 1 as reboot was not detected.
1055 EXPECT_EQ(1, payload_state.GetNumReboots());
1056
1057 // Restart the update again to verify we set the num of reboots back to 0.
1058 payload_state.UpdateRestarted();
1059 EXPECT_EQ(0, payload_state.GetNumReboots());
1060}
Jay Srinivasan19409b72013-04-12 19:23:36 -07001061
Chris Sosaaa18e162013-06-20 13:20:30 -07001062TEST(PayloadStateTest, RollbackVersion) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001063 FakeSystemState fake_system_state;
Chris Sosaaa18e162013-06-20 13:20:30 -07001064 PayloadState payload_state;
1065
Alex Deymo8427b4a2014-11-05 14:00:32 -08001066 NiceMock<MockPrefs>* mock_powerwash_safe_prefs =
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001067 fake_system_state.mock_powerwash_safe_prefs();
1068 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosaaa18e162013-06-20 13:20:30 -07001069
1070 // Verify pre-conditions are good.
1071 EXPECT_TRUE(payload_state.GetRollbackVersion().empty());
1072
1073 // Mock out the os version and make sure it's blacklisted correctly.
1074 string rollback_version = "2345.0.0";
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001075 OmahaRequestParams params(&fake_system_state);
Chris Sosaaa18e162013-06-20 13:20:30 -07001076 params.Init(rollback_version, "", false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001077 fake_system_state.set_request_params(&params);
Chris Sosaaa18e162013-06-20 13:20:30 -07001078
1079 EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion,
1080 rollback_version));
1081 payload_state.Rollback();
1082
1083 EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion());
Chris Sosab3dcdb32013-09-04 15:22:12 -07001084
1085 // Change it up a little and verify we load it correctly.
1086 rollback_version = "2345.0.1";
1087 // Let's verify we can reload it correctly.
1088 EXPECT_CALL(*mock_powerwash_safe_prefs, GetString(
1089 kPrefsRollbackVersion, _)).WillOnce(DoAll(
1090 SetArgumentPointee<1>(rollback_version), Return(true)));
1091 EXPECT_CALL(*mock_powerwash_safe_prefs, SetString(kPrefsRollbackVersion,
1092 rollback_version));
1093 payload_state.LoadRollbackVersion();
1094 EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion());
David Zeuthenafed4a12014-04-09 15:28:44 -07001095
David Zeuthen96197df2014-04-16 12:22:39 -07001096 // Check that we report only UpdateEngine.Rollback.* metrics in
1097 // UpdateSucceeded().
David Zeuthenafed4a12014-04-09 15:28:44 -07001098 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _))
1099 .Times(0);
1100 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
1101 .Times(0);
David Zeuthen96197df2014-04-16 12:22:39 -07001102 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
1103 SendEnumToUMA(
1104 metrics::kMetricRollbackResult,
1105 static_cast<int>(metrics::RollbackResult::kSuccess),
1106 static_cast<int>(metrics::RollbackResult::kNumConstants)));
David Zeuthenafed4a12014-04-09 15:28:44 -07001107 payload_state.UpdateSucceeded();
Chris Sosaaa18e162013-06-20 13:20:30 -07001108}
1109
David Zeuthenf413fe52013-04-22 14:04:39 -07001110TEST(PayloadStateTest, DurationsAreCorrect) {
1111 OmahaResponse response;
1112 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001113 FakeSystemState fake_system_state;
David Zeuthenf413fe52013-04-22 14:04:39 -07001114 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001115 FakePrefs fake_prefs;
David Zeuthenf413fe52013-04-22 14:04:39 -07001116
1117 // Set the clock to a well-known time - 1 second on the wall-clock
1118 // and 2 seconds on the monotonic clock
1119 fake_clock.SetWallclockTime(Time::FromInternalValue(1000000));
1120 fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000));
1121
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001122 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001123 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001124 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthenf413fe52013-04-22 14:04:39 -07001125
1126 // Check that durations are correct for a successful update where
1127 // time has advanced 7 seconds on the wall clock and 4 seconds on
1128 // the monotonic clock.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001129 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
David Zeuthenf413fe52013-04-22 14:04:39 -07001130 fake_clock.SetWallclockTime(Time::FromInternalValue(8000000));
1131 fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000));
1132 payload_state.UpdateSucceeded();
1133 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000);
1134 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000);
1135
1136 // Check that durations are reset when a new response comes in.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001137 SetupPayloadStateWith2Urls("Hash8594", true, &payload_state, &response);
David Zeuthenf413fe52013-04-22 14:04:39 -07001138 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0);
1139 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0);
1140
1141 // Advance time a bit (10 secs), simulate download progress and
1142 // check that durations are updated.
1143 fake_clock.SetWallclockTime(Time::FromInternalValue(18000000));
1144 fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000));
1145 payload_state.DownloadProgress(10);
1146 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000);
1147 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000);
1148
1149 // Now simulate a reboot by resetting monotonic time (to 5000) and
1150 // creating a new PayloadState object and check that we load the
1151 // durations correctly (e.g. they are the same as before).
1152 fake_clock.SetMonotonicTime(Time::FromInternalValue(5000));
1153 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001154 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
David Zeuthenf413fe52013-04-22 14:04:39 -07001155 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000);
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001156 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),
1157 10000000);
David Zeuthenf413fe52013-04-22 14:04:39 -07001158
1159 // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds
1160 // and check that the durations are increased accordingly.
1161 fake_clock.SetWallclockTime(Time::FromInternalValue(25000000));
1162 fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000));
1163 payload_state2.UpdateSucceeded();
1164 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000);
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001165 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),
1166 16000000);
David Zeuthenf413fe52013-04-22 14:04:39 -07001167}
1168
David Zeuthene4c58bf2013-06-18 17:26:50 -07001169TEST(PayloadStateTest, RebootAfterSuccessfulUpdateTest) {
1170 OmahaResponse response;
1171 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001172 FakeSystemState fake_system_state;
David Zeuthene4c58bf2013-06-18 17:26:50 -07001173 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001174 FakePrefs fake_prefs;
David Zeuthene4c58bf2013-06-18 17:26:50 -07001175
1176 // Set the clock to a well-known time (t = 30 seconds).
1177 fake_clock.SetWallclockTime(Time::FromInternalValue(
1178 30 * Time::kMicrosecondsPerSecond));
1179
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001180 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001181 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001182 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001183
1184 // Make the update succeed.
1185 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1186 payload_state.UpdateSucceeded();
1187
1188 // Check that the marker was written.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001189 EXPECT_TRUE(fake_prefs.Exists(kPrefsSystemUpdatedMarker));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001190
1191 // Now simulate a reboot and set the wallclock time to a later point
1192 // (t = 500 seconds). We do this by using a new PayloadState object
1193 // and checking that it emits the right UMA metric with the right
1194 // value.
1195 fake_clock.SetWallclockTime(Time::FromInternalValue(
1196 500 * Time::kMicrosecondsPerSecond));
1197 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001198 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001199
1200 // Expect 500 - 30 seconds = 470 seconds ~= 7 min 50 sec
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001201 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthene4c58bf2013-06-18 17:26:50 -07001202 "Installer.TimeToRebootMinutes",
1203 7, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001204 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001205 metrics::kMetricTimeToRebootMinutes,
1206 7, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001207 fake_system_state.set_system_rebooted(true);
David Zeuthene4c58bf2013-06-18 17:26:50 -07001208
1209 payload_state2.UpdateEngineStarted();
1210
1211 // Check that the marker was nuked.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001212 EXPECT_FALSE(fake_prefs.Exists(kPrefsSystemUpdatedMarker));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001213}
1214
Alex Deymo569c4242013-07-24 12:01:01 -07001215TEST(PayloadStateTest, RestartAfterCrash) {
1216 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001217 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001218 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Deymo569c4242013-07-24 12:01:01 -07001219
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001220 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo569c4242013-07-24 12:01:01 -07001221
David Zeuthen4e1d1492014-04-25 13:12:27 -07001222 // Only the |kPrefsAttemptInProgress| state variable should be read.
Alex Deymo569c4242013-07-24 12:01:01 -07001223 EXPECT_CALL(*prefs, Exists(_)).Times(0);
1224 EXPECT_CALL(*prefs, SetString(_, _)).Times(0);
1225 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(0);
1226 EXPECT_CALL(*prefs, SetBoolean(_, _)).Times(0);
1227 EXPECT_CALL(*prefs, GetString(_, _)).Times(0);
1228 EXPECT_CALL(*prefs, GetInt64(_, _)).Times(0);
1229 EXPECT_CALL(*prefs, GetBoolean(_, _)).Times(0);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001230 EXPECT_CALL(*prefs, GetBoolean(kPrefsAttemptInProgress, _));
Alex Deymo569c4242013-07-24 12:01:01 -07001231
1232 // No metrics are reported after a crash.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001233 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
Alex Deymo569c4242013-07-24 12:01:01 -07001234 SendToUMA(_, _, _, _, _)).Times(0);
1235
1236 // Simulate an update_engine restart without a reboot.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001237 fake_system_state.set_system_rebooted(false);
Alex Deymo569c4242013-07-24 12:01:01 -07001238
1239 payload_state.UpdateEngineStarted();
1240}
1241
David Zeuthen4e1d1492014-04-25 13:12:27 -07001242TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsNoReporting) {
1243 PayloadState payload_state;
1244 FakeSystemState fake_system_state;
1245
1246 // If there's no marker at startup, ensure we don't report a metric.
1247 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
1248 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
1249 SendEnumToUMA(
1250 metrics::kMetricAttemptResult,
1251 static_cast<int>(metrics::AttemptResult::kAbnormalTermination),
1252 _)).Times(0);
1253 payload_state.UpdateEngineStarted();
1254}
1255
1256TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsReported) {
1257 PayloadState payload_state;
1258 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001259 FakePrefs fake_prefs;
David Zeuthen4e1d1492014-04-25 13:12:27 -07001260
1261 // If we have a marker at startup, ensure it's reported and the
1262 // marker is then cleared.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001263 fake_system_state.set_prefs(&fake_prefs);
1264 fake_prefs.SetBoolean(kPrefsAttemptInProgress, true);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001265
1266 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
1267
1268 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
1269 SendEnumToUMA(
1270 metrics::kMetricAttemptResult,
1271 static_cast<int>(metrics::AttemptResult::kAbnormalTermination),
1272 _)).Times(1);
1273 payload_state.UpdateEngineStarted();
1274
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001275 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001276}
1277
1278TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsClearedOnSucceess) {
1279 PayloadState payload_state;
1280 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001281 FakePrefs fake_prefs;
David Zeuthen4e1d1492014-04-25 13:12:27 -07001282
1283 // Make sure the marker is written and cleared during an attempt and
1284 // also that we DO NOT emit the metric (since the attempt didn't end
1285 // abnormally).
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001286 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001287 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
1288
1289 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(_, _, _, _, _))
1290 .Times(AnyNumber());
1291 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
1292 .Times(AnyNumber());
1293 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
1294 SendEnumToUMA(
1295 metrics::kMetricAttemptResult,
1296 static_cast<int>(metrics::AttemptResult::kAbnormalTermination),
1297 _)).Times(0);
1298
1299 // Attempt not in progress, should be clear.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001300 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001301
1302 payload_state.UpdateRestarted();
1303
1304 // Attempt not in progress, should be set.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001305 EXPECT_TRUE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001306
1307 payload_state.UpdateSucceeded();
1308
1309 // Attempt not in progress, should be clear.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001310 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001311}
1312
Jay Srinivasan53173b92013-05-17 17:13:01 -07001313TEST(PayloadStateTest, CandidateUrlsComputedCorrectly) {
1314 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001315 FakeSystemState fake_system_state;
Jay Srinivasan53173b92013-05-17 17:13:01 -07001316 PayloadState payload_state;
1317
Jay Srinivasan53173b92013-05-17 17:13:01 -07001318 policy::MockDevicePolicy disable_http_policy;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001319 fake_system_state.set_device_policy(&disable_http_policy);
1320 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosaf7d80042013-08-22 16:45:17 -07001321
1322 // Test with no device policy. Should default to allowing http.
1323 EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_))
1324 .WillRepeatedly(Return(false));
1325
1326 // Set the first response.
1327 SetupPayloadStateWith2Urls("Hash8433", true, &payload_state, &response);
1328
1329 // Check that we use the HTTP URL since there is no value set for allowing
1330 // http.
1331 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
1332
1333 // Test with device policy not allowing http updates.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001334 EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_))
1335 .WillRepeatedly(DoAll(SetArgumentPointee<0>(false), Return(true)));
1336
Chris Sosaf7d80042013-08-22 16:45:17 -07001337 // Reset state and set again.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001338 SetupPayloadStateWith2Urls("Hash8433", false, &payload_state, &response);
1339
1340 // Check that we skip the HTTP URL and use only the HTTPS url.
1341 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1342
1343 // Advance the URL index to 1 by faking an error.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001344 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan53173b92013-05-17 17:13:01 -07001345 payload_state.UpdateFailed(error);
1346
1347 // Check that we still skip the HTTP URL and use only the HTTPS url.
1348 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1349 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
1350
1351 // Now, slightly change the response and set it again.
1352 SetupPayloadStateWith2Urls("Hash2399", false, &payload_state, &response);
1353
1354 // Check that we still skip the HTTP URL and use only the HTTPS url.
1355 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1356
1357 // Now, pretend that the HTTP policy is turned on. We want to make sure
1358 // the new policy is honored.
1359 policy::MockDevicePolicy enable_http_policy;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001360 fake_system_state.set_device_policy(&enable_http_policy);
Jay Srinivasan53173b92013-05-17 17:13:01 -07001361 EXPECT_CALL(enable_http_policy, GetHttpDownloadsEnabled(_))
1362 .WillRepeatedly(DoAll(SetArgumentPointee<0>(true), Return(true)));
1363
1364 // Now, set the same response using the same hash
1365 // so that we can test that the state is reset not because of the
1366 // hash but because of the policy change which results in candidate url
1367 // list change.
1368 SetupPayloadStateWith2Urls("Hash2399", true, &payload_state, &response);
1369
1370 // Check that we use the HTTP URL now and the failure count is reset.
1371 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
1372 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
1373
1374 // Fake a failure and see if we're moving over to the HTTPS url and update
1375 // the URL switch count properly.
1376 payload_state.UpdateFailed(error);
1377 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1378 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
1379 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
1380}
1381
Alex Deymo1c656c42013-06-28 11:02:14 -07001382TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsDelta) {
1383 OmahaResponse response;
1384 response.is_delta_payload = true;
1385 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001386 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001387
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001388 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo1c656c42013-06-28 11:02:14 -07001389 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
1390
1391 // Simulate a successful download and update.
1392 payload_state.DownloadComplete();
1393
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001394 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -08001395 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001396 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
Alex Deymo1c656c42013-06-28 11:02:14 -07001397 "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001398 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001399 metrics::kMetricAttemptPayloadType, kPayloadTypeDelta, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001400 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001401 metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta,
1402 kNumPayloadTypes));
Alex Deymo1c656c42013-06-28 11:02:14 -07001403 payload_state.UpdateSucceeded();
1404
1405 // Mock the request to a request where the delta was disabled but Omaha sends
1406 // a delta anyway and test again.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001407 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001408 params.set_delta_okay(false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001409 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001410
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001411 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo1c656c42013-06-28 11:02:14 -07001412 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
1413
1414 payload_state.DownloadComplete();
1415
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001416 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
Alex Deymo1c656c42013-06-28 11:02:14 -07001417 "Installer.PayloadFormat", kPayloadTypeDelta, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001418 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001419 metrics::kMetricAttemptPayloadType, kPayloadTypeDelta,
1420 kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001421 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001422 metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeDelta,
1423 kNumPayloadTypes));
Alex Deymo1c656c42013-06-28 11:02:14 -07001424 payload_state.UpdateSucceeded();
1425}
1426
1427TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsForcedFull) {
1428 OmahaResponse response;
1429 response.is_delta_payload = false;
1430 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001431 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001432
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001433 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo1c656c42013-06-28 11:02:14 -07001434 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
1435
1436 // Mock the request to a request where the delta was disabled.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001437 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001438 params.set_delta_okay(false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001439 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001440
1441 // Simulate a successful download and update.
1442 payload_state.DownloadComplete();
1443
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001444 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -08001445 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001446 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
Alex Deymo1c656c42013-06-28 11:02:14 -07001447 "Installer.PayloadFormat", kPayloadTypeForcedFull, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001448 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001449 metrics::kMetricAttemptPayloadType, kPayloadTypeForcedFull,
1450 kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001451 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001452 metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeForcedFull,
1453 kNumPayloadTypes));
Alex Deymo1c656c42013-06-28 11:02:14 -07001454 payload_state.UpdateSucceeded();
1455}
1456
1457TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsFull) {
1458 OmahaResponse response;
1459 response.is_delta_payload = false;
1460 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001461 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001462
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001463 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo1c656c42013-06-28 11:02:14 -07001464 SetupPayloadStateWith2Urls("Hash6437", true, &payload_state, &response);
1465
Alex Deymo820cc702013-06-28 15:43:46 -07001466 // Mock the request to a request where the delta is enabled, although the
1467 // result is full.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001468 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001469 params.set_delta_okay(true);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001470 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001471
1472 // Simulate a successful download and update.
1473 payload_state.DownloadComplete();
1474
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001475 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -08001476 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001477 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
Alex Deymo1c656c42013-06-28 11:02:14 -07001478 "Installer.PayloadFormat", kPayloadTypeFull, kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001479 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001480 metrics::kMetricAttemptPayloadType, kPayloadTypeFull,
1481 kNumPayloadTypes));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001482 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001483 metrics::kMetricSuccessfulUpdatePayloadType, kPayloadTypeFull,
1484 kNumPayloadTypes));
Alex Deymo1c656c42013-06-28 11:02:14 -07001485 payload_state.UpdateSucceeded();
1486}
1487
Alex Deymo42432912013-07-12 20:21:15 -07001488TEST(PayloadStateTest, RebootAfterUpdateFailedMetric) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001489 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001490 OmahaResponse response;
1491 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001492 FakePrefs fake_prefs;
1493 fake_system_state.set_prefs(&fake_prefs);
Alex Deymo42432912013-07-12 20:21:15 -07001494
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001495 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo42432912013-07-12 20:21:15 -07001496 SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response);
1497
1498 // Simulate a successful download and update.
1499 payload_state.DownloadComplete();
1500 payload_state.UpdateSucceeded();
1501 payload_state.ExpectRebootInNewVersion("Version:12345678");
1502
1503 // Reboot into the same environment to get an UMA metric with a value of 1.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001504 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001505 "Installer.RebootToNewPartitionAttempt", 1, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001506 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001507 metrics::kMetricFailedUpdateCount, 1, _, _, _));
Alex Deymo42432912013-07-12 20:21:15 -07001508 payload_state.ReportFailedBootIfNeeded();
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001509 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib());
Alex Deymo42432912013-07-12 20:21:15 -07001510
1511 // Simulate a second update and reboot into the same environment, this should
1512 // send a value of 2.
1513 payload_state.ExpectRebootInNewVersion("Version:12345678");
1514
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001515 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001516 "Installer.RebootToNewPartitionAttempt", 2, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001517 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001518 metrics::kMetricFailedUpdateCount, 2, _, _, _));
Alex Deymo42432912013-07-12 20:21:15 -07001519 payload_state.ReportFailedBootIfNeeded();
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001520 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib());
Alex Deymo42432912013-07-12 20:21:15 -07001521
1522 // Simulate a third failed reboot to new version, but this time for a
1523 // different payload. This should send a value of 1 this time.
1524 payload_state.ExpectRebootInNewVersion("Version:3141592");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001525 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001526 "Installer.RebootToNewPartitionAttempt", 1, _, _, _));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001527 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001528 metrics::kMetricFailedUpdateCount, 1, _, _, _));
Alex Deymo42432912013-07-12 20:21:15 -07001529 payload_state.ReportFailedBootIfNeeded();
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001530 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_lib());
Alex Deymo42432912013-07-12 20:21:15 -07001531}
1532
1533TEST(PayloadStateTest, RebootAfterUpdateSucceed) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001534 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001535 OmahaResponse response;
1536 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001537 FakePrefs fake_prefs;
1538 fake_system_state.set_prefs(&fake_prefs);
Alex Deymo42432912013-07-12 20:21:15 -07001539
Alex Deymo763e7db2015-08-27 21:08:08 -07001540 FakeBootControl* fake_boot_control = fake_system_state.fake_boot_control();
1541 fake_boot_control->SetCurrentSlot(0);
Alex Deymo42432912013-07-12 20:21:15 -07001542
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001543 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo42432912013-07-12 20:21:15 -07001544 SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response);
1545
1546 // Simulate a successful download and update.
1547 payload_state.DownloadComplete();
1548 payload_state.UpdateSucceeded();
1549 payload_state.ExpectRebootInNewVersion("Version:12345678");
1550
1551 // Change the BootDevice to a different one, no metric should be sent.
Alex Deymo763e7db2015-08-27 21:08:08 -07001552 fake_boot_control->SetCurrentSlot(1);
Alex Deymo42432912013-07-12 20:21:15 -07001553
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001554 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001555 "Installer.RebootToNewPartitionAttempt", _, _, _, _))
1556 .Times(0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001557 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001558 metrics::kMetricFailedUpdateCount, _, _, _, _))
1559 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001560 payload_state.ReportFailedBootIfNeeded();
1561
Alex Deymo763e7db2015-08-27 21:08:08 -07001562 // A second reboot in either partition should not send a metric.
Alex Deymo42432912013-07-12 20:21:15 -07001563 payload_state.ReportFailedBootIfNeeded();
Alex Deymo763e7db2015-08-27 21:08:08 -07001564 fake_boot_control->SetCurrentSlot(0);
Alex Deymo42432912013-07-12 20:21:15 -07001565 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001566}
1567
1568TEST(PayloadStateTest, RebootAfterCanceledUpdate) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001569 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001570 OmahaResponse response;
1571 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001572 FakePrefs fake_prefs;
Alex Deymo42432912013-07-12 20:21:15 -07001573
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001574 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001575 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo42432912013-07-12 20:21:15 -07001576 SetupPayloadStateWith2Urls("Hash3141", true, &payload_state, &response);
1577
1578 // Simulate a successful download and update.
1579 payload_state.DownloadComplete();
1580 payload_state.UpdateSucceeded();
1581 payload_state.ExpectRebootInNewVersion("Version:12345678");
1582
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001583 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001584 "Installer.RebootToNewPartitionAttempt", _, _, _, _))
1585 .Times(0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001586 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001587 metrics::kMetricFailedUpdateCount, _, _, _, _))
1588 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001589
1590 // Cancel the applied update.
1591 payload_state.ResetUpdateStatus();
1592
1593 // Simulate a reboot.
1594 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001595}
1596
1597TEST(PayloadStateTest, UpdateSuccessWithWipedPrefs) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001598 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001599 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001600 FakePrefs fake_prefs;
Alex Deymo42432912013-07-12 20:21:15 -07001601
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001602 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001603 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo42432912013-07-12 20:21:15 -07001604
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001605 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
Alex Deymo42432912013-07-12 20:21:15 -07001606 "Installer.RebootToNewPartitionAttempt", _, _, _, _))
1607 .Times(0);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001608 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendToUMA(
David Zeuthen33bae492014-02-25 16:16:18 -08001609 metrics::kMetricFailedUpdateCount, _, _, _, _))
1610 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001611
1612 // Simulate a reboot in this environment.
1613 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001614}
1615
David Zeuthendcba8092013-08-06 12:16:35 -07001616TEST(PayloadStateTest, DisallowP2PAfterTooManyAttempts) {
1617 OmahaResponse response;
1618 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001619 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001620 FakePrefs fake_prefs;
1621 fake_system_state.set_prefs(&fake_prefs);
David Zeuthendcba8092013-08-06 12:16:35 -07001622
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001623 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001624 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1625
1626 // Should allow exactly kMaxP2PAttempts...
1627 for (int n = 0; n < kMaxP2PAttempts; n++) {
1628 payload_state.P2PNewAttempt();
1629 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1630 }
1631 // ... but not more than that.
1632 payload_state.P2PNewAttempt();
1633 EXPECT_FALSE(payload_state.P2PAttemptAllowed());
David Zeuthendcba8092013-08-06 12:16:35 -07001634}
1635
1636TEST(PayloadStateTest, DisallowP2PAfterDeadline) {
1637 OmahaResponse response;
1638 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001639 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001640 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001641 FakePrefs fake_prefs;
David Zeuthendcba8092013-08-06 12:16:35 -07001642
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001643 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001644 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001645 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001646 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1647
1648 // Set the clock to 1 second.
1649 Time epoch = Time::FromInternalValue(1000000);
1650 fake_clock.SetWallclockTime(epoch);
1651
1652 // Do an attempt - this will set the timestamp.
1653 payload_state.P2PNewAttempt();
1654
1655 // Check that the timestamp equals what we just set.
1656 EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp());
1657
1658 // Time hasn't advanced - this should work.
1659 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1660
1661 // Set clock to half the deadline - this should work.
1662 fake_clock.SetWallclockTime(epoch +
1663 TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds) / 2);
1664 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1665
1666 // Check that the first attempt timestamp hasn't changed just
1667 // because the wall-clock time changed.
1668 EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp());
1669
1670 // Set clock to _just_ before the deadline - this should work.
1671 fake_clock.SetWallclockTime(epoch +
1672 TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds - 1));
1673 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1674
1675 // Set clock to _just_ after the deadline - this should not work.
1676 fake_clock.SetWallclockTime(epoch +
1677 TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds + 1));
1678 EXPECT_FALSE(payload_state.P2PAttemptAllowed());
David Zeuthendcba8092013-08-06 12:16:35 -07001679}
1680
1681TEST(PayloadStateTest, P2PStateVarsInitialValue) {
1682 OmahaResponse response;
1683 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001684 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001685 FakePrefs fake_prefs;
David Zeuthendcba8092013-08-06 12:16:35 -07001686
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001687 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001688 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001689 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1690
1691 Time null_time = Time();
1692 EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp());
1693 EXPECT_EQ(0, payload_state.GetP2PNumAttempts());
David Zeuthendcba8092013-08-06 12:16:35 -07001694}
1695
1696TEST(PayloadStateTest, P2PStateVarsArePersisted) {
1697 OmahaResponse response;
1698 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001699 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001700 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001701 FakePrefs fake_prefs;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001702 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001703 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001704 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001705 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1706
1707 // Set the clock to something known.
1708 Time time = Time::FromInternalValue(12345);
1709 fake_clock.SetWallclockTime(time);
1710
1711 // New p2p attempt - as a side-effect this will update the p2p state vars.
1712 payload_state.P2PNewAttempt();
1713 EXPECT_EQ(1, payload_state.GetP2PNumAttempts());
1714 EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp());
1715
1716 // Now create a new PayloadState and check that it loads the state
1717 // vars correctly.
1718 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001719 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001720 EXPECT_EQ(1, payload_state2.GetP2PNumAttempts());
1721 EXPECT_EQ(time, payload_state2.GetP2PFirstAttemptTimestamp());
David Zeuthendcba8092013-08-06 12:16:35 -07001722}
1723
1724TEST(PayloadStateTest, P2PStateVarsAreClearedOnNewResponse) {
1725 OmahaResponse response;
1726 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001727 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001728 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001729 FakePrefs fake_prefs;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001730 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001731 fake_system_state.set_prefs(&fake_prefs);
1732
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001733 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001734 SetupPayloadStateWith2Urls("Hash8593", true, &payload_state, &response);
1735
1736 // Set the clock to something known.
1737 Time time = Time::FromInternalValue(12345);
1738 fake_clock.SetWallclockTime(time);
1739
1740 // New p2p attempt - as a side-effect this will update the p2p state vars.
1741 payload_state.P2PNewAttempt();
1742 EXPECT_EQ(1, payload_state.GetP2PNumAttempts());
1743 EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp());
1744
1745 // Set a new response...
1746 SetupPayloadStateWith2Urls("Hash9904", true, &payload_state, &response);
1747
1748 // ... and check that it clears the P2P state vars.
1749 Time null_time = Time();
1750 EXPECT_EQ(0, payload_state.GetP2PNumAttempts());
1751 EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp());
David Zeuthendcba8092013-08-06 12:16:35 -07001752}
1753
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001754} // namespace chromeos_update_engine