blob: 2be5896f38d0cf9c3c54e5c95d6e8c12d0757e34 [file] [log] [blame]
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#include <glib.h>
6
Chris Sosabe45bef2013-04-09 18:25:12 -07007#include "base/file_path.h"
8#include "base/file_util.h"
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -08009#include "base/stringprintf.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080010#include "gmock/gmock.h"
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080011#include "gtest/gtest.h"
12
Jay Srinivasand29695d2013-04-08 15:08:05 -070013#include "update_engine/constants.h"
Jay Srinivasan19409b72013-04-12 19:23:36 -070014#include "update_engine/mock_system_state.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080015#include "update_engine/omaha_request_action.h"
16#include "update_engine/payload_state.h"
17#include "update_engine/prefs_mock.h"
18#include "update_engine/test_utils.h"
19#include "update_engine/utils.h"
20
Jay Srinivasan08262882012-12-28 19:29:43 -080021using base::Time;
22using base::TimeDelta;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080023using std::string;
24using testing::_;
25using testing::NiceMock;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080026using testing::Return;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080027using testing::SetArgumentPointee;
David Zeuthen9a017f22013-04-11 16:10:26 -070028using testing::AtLeast;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080029
30namespace chromeos_update_engine {
31
Jay Srinivasan19409b72013-04-12 19:23:36 -070032const char* kCurrentBytesDownloadedFromHttps =
33 "current-bytes-downloaded-from-HttpsServer";
34const char* kTotalBytesDownloadedFromHttps =
35 "total-bytes-downloaded-from-HttpsServer";
36const char* kCurrentBytesDownloadedFromHttp =
37 "current-bytes-downloaded-from-HttpServer";
38const char* kTotalBytesDownloadedFromHttp =
39 "total-bytes-downloaded-from-HttpServer";
40
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080041static void SetupPayloadStateWith2Urls(string hash,
42 PayloadState* payload_state,
43 OmahaResponse* response) {
44 response->payload_urls.clear();
45 response->payload_urls.push_back("http://test");
46 response->payload_urls.push_back("https://test");
47 response->size = 523456789;
48 response->hash = hash;
49 response->metadata_size = 558123;
50 response->metadata_signature = "metasign";
51 response->max_failure_count_per_url = 3;
52 payload_state->SetResponse(*response);
Jay Srinivasan08262882012-12-28 19:29:43 -080053 string stored_response_sign = payload_state->GetResponseSignature();
54 string expected_response_sign = StringPrintf(
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080055 "NumURLs = 2\n"
56 "Url0 = http://test\n"
57 "Url1 = https://test\n"
58 "Payload Size = 523456789\n"
59 "Payload Sha256 Hash = %s\n"
60 "Metadata Size = 558123\n"
Jay Srinivasan08262882012-12-28 19:29:43 -080061 "Metadata Signature = metasign\n"
62 "Is Delta Payload = %d\n"
63 "Max Failure Count Per Url = %d\n"
64 "Disable Payload Backoff = %d\n",
65 hash.c_str(),
66 response->is_delta_payload,
67 response->max_failure_count_per_url,
68 response->disable_payload_backoff);
69 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080070}
71
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080072class PayloadStateTest : public ::testing::Test { };
73
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080074TEST(PayloadStateTest, DidYouAddANewActionExitCode) {
Jay Srinivasan1c0fe792013-03-28 16:45:25 -070075 if (kActionCodeUmaReportedMax != 43) {
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080076 LOG(ERROR) << "The following failure is intentional. If you added a new "
77 << "ActionExitCode enum value, make sure to add it to the "
78 << "PayloadState::UpdateFailed method and then update this test "
79 << "to the new value of kActionCodeUmaReportedMax, which is "
80 << kActionCodeUmaReportedMax;
81 EXPECT_FALSE("Please see the log line above");
82 }
83}
84
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080085TEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) {
86 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -070087 MockSystemState mock_system_state;
88 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
89 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
90 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
91 .Times(AtLeast(1));
92 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
93 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
94 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
95 .Times(AtLeast(1));
96 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
97 .Times(AtLeast(1));
98 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
99 .Times(AtLeast(1));
100 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
101 .Times(AtLeast(1));
102 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
103 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700104 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800105 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700106 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800107 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800108 string stored_response_sign = payload_state.GetResponseSignature();
109 string expected_response_sign = "NumURLs = 0\n"
110 "Payload Size = 0\n"
111 "Payload Sha256 Hash = \n"
112 "Metadata Size = 0\n"
113 "Metadata Signature = \n"
114 "Is Delta Payload = 0\n"
115 "Max Failure Count Per Url = 0\n"
116 "Disable Payload Backoff = 0\n";
117 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800118 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800119 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700120 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800121}
122
123TEST(PayloadStateTest, SetResponseWorksWithSingleUrl) {
124 OmahaResponse response;
125 response.payload_urls.push_back("http://single.url.test");
126 response.size = 123456789;
127 response.hash = "hash";
128 response.metadata_size = 58123;
129 response.metadata_signature = "msign";
Jay Srinivasan19409b72013-04-12 19:23:36 -0700130 MockSystemState mock_system_state;
131 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
132 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
133 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
134 .Times(AtLeast(1));
135 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
136 .Times(AtLeast(1));
137 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
138 .Times(AtLeast(1));
139 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
140 .Times(AtLeast(1));
141 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
142 .Times(AtLeast(1));
143 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
144 .Times(AtLeast(1));
145 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
146 .Times(AtLeast(1));
147 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
148 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700149 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
150 .Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800151 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700152 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800153 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800154 string stored_response_sign = payload_state.GetResponseSignature();
155 string expected_response_sign = "NumURLs = 1\n"
156 "Url0 = http://single.url.test\n"
157 "Payload Size = 123456789\n"
158 "Payload Sha256 Hash = hash\n"
159 "Metadata Size = 58123\n"
160 "Metadata Signature = msign\n"
161 "Is Delta Payload = 0\n"
162 "Max Failure Count Per Url = 0\n"
163 "Disable Payload Backoff = 0\n";
164 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800165 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800166 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700167 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800168}
169
170TEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) {
171 OmahaResponse response;
172 response.payload_urls.push_back("http://multiple.url.test");
173 response.payload_urls.push_back("https://multiple.url.test");
174 response.size = 523456789;
175 response.hash = "rhash";
176 response.metadata_size = 558123;
177 response.metadata_signature = "metasign";
Jay Srinivasan19409b72013-04-12 19:23:36 -0700178 MockSystemState mock_system_state;
179 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
180 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
181 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
182 .Times(AtLeast(1));
183 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
184 .Times(AtLeast(1));
185 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
186 .Times(AtLeast(1));
187 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
188 .Times(AtLeast(1));
189 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
190 .Times(AtLeast(1));
191 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
192 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700193 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
194 .Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800195 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700196 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800197 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800198 string stored_response_sign = payload_state.GetResponseSignature();
199 string expected_response_sign = "NumURLs = 2\n"
200 "Url0 = http://multiple.url.test\n"
201 "Url1 = https://multiple.url.test\n"
202 "Payload Size = 523456789\n"
203 "Payload Sha256 Hash = rhash\n"
204 "Metadata Size = 558123\n"
205 "Metadata Signature = metasign\n"
206 "Is Delta Payload = 0\n"
207 "Max Failure Count Per Url = 0\n"
208 "Disable Payload Backoff = 0\n";
209 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800210 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800211 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700212 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800213}
214
215TEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) {
216 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700217 MockSystemState mock_system_state;
218 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800219 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800220
Jay Srinivasan19409b72013-04-12 19:23:36 -0700221 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800222 // Payload attempt should start with 0 and then advance to 1.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700223 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
224 .Times(AtLeast(1));
225 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
226 .Times(AtLeast(1));
227 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2));
David Zeuthen9a017f22013-04-11 16:10:26 -0700228
Chris Sosabe45bef2013-04-09 18:25:12 -0700229 // Reboots will be set
230 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1));
231
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800232 // Url index should go from 0 to 1 twice.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700233 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
234 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800235
236 // Failure count should be called each times url index is set, so that's
237 // 4 times for this test.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700238 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
239 .Times(AtLeast(4));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800240
Jay Srinivasan19409b72013-04-12 19:23:36 -0700241 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800242
243 // This does a SetResponse which causes all the states to be set to 0 for
244 // the first time.
245 SetupPayloadStateWith2Urls("Hash1235", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800246 EXPECT_EQ(0, payload_state.GetUrlIndex());
247
248 // Verify that on the first error, the URL index advances to 1.
249 ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch;
250 payload_state.UpdateFailed(error);
251 EXPECT_EQ(1, payload_state.GetUrlIndex());
252
253 // Verify that on the next error, the URL index wraps around to 0.
254 payload_state.UpdateFailed(error);
255 EXPECT_EQ(0, payload_state.GetUrlIndex());
256
257 // Verify that on the next error, it again advances to 1.
258 payload_state.UpdateFailed(error);
259 EXPECT_EQ(1, payload_state.GetUrlIndex());
David Zeuthencc6f9962013-04-18 11:57:24 -0700260
261 // Verify that we switched URLs three times
262 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800263}
264
265TEST(PayloadStateTest, NewResponseResetsPayloadState) {
266 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700267 MockSystemState mock_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800268 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800269
Jay Srinivasan19409b72013-04-12 19:23:36 -0700270 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800271
272 // Set the first response.
273 SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800274
275 // Advance the URL index to 1 by faking an error.
276 ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch;
277 payload_state.UpdateFailed(error);
278 EXPECT_EQ(1, payload_state.GetUrlIndex());
David Zeuthencc6f9962013-04-18 11:57:24 -0700279 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800280
281 // Now, slightly change the response and set it again.
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800282 SetupPayloadStateWith2Urls("Hash8225", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800283
284 // Make sure the url index was reset to 0 because of the new response.
285 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800286 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700287 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700288 EXPECT_EQ(0,
289 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
290 EXPECT_EQ(0,
291 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
292 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
293 kDownloadSourceHttpsServer));
294 EXPECT_EQ(0,
295 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800296}
297
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800298TEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) {
299 OmahaResponse response;
300 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700301 MockSystemState mock_system_state;
302 int progress_bytes = 100;
303 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800304
Jay Srinivasan19409b72013-04-12 19:23:36 -0700305 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
306 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
307 .Times(AtLeast(2));
308 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
309 .Times(AtLeast(1));
310 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2))
311 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800312
Jay Srinivasan19409b72013-04-12 19:23:36 -0700313 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4));
Jay Srinivasan08262882012-12-28 19:29:43 -0800314
Jay Srinivasan19409b72013-04-12 19:23:36 -0700315 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4));
316 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800317
Jay Srinivasan19409b72013-04-12 19:23:36 -0700318 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
319 .Times(AtLeast(7));
320 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1))
321 .Times(AtLeast(2));
322 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2))
323 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800324
Jay Srinivasan19409b72013-04-12 19:23:36 -0700325 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
326 .Times(AtLeast(1));
327 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
328 .Times(AtLeast(1));
David Zeuthen9a017f22013-04-11 16:10:26 -0700329
Jay Srinivasan19409b72013-04-12 19:23:36 -0700330 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
331 .Times(AtLeast(1));
332 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
333 .Times(AtLeast(1));
334 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes))
335 .Times(AtLeast(1));
336 EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes))
337 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700338 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
339 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700340
341 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800342
343 SetupPayloadStateWith2Urls("Hash5873", &payload_state, &response);
344
345 // This should advance the URL index.
346 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
347 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
348 EXPECT_EQ(1, payload_state.GetUrlIndex());
349 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700350 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800351
352 // This should advance the failure count only.
353 payload_state.UpdateFailed(kActionCodeDownloadTransferError);
354 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
355 EXPECT_EQ(1, payload_state.GetUrlIndex());
356 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700357 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800358
359 // This should advance the failure count only.
360 payload_state.UpdateFailed(kActionCodeDownloadTransferError);
361 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
362 EXPECT_EQ(1, payload_state.GetUrlIndex());
363 EXPECT_EQ(2, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700364 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800365
366 // This should advance the URL index as we've reached the
367 // max failure count and reset the failure count for the new URL index.
368 // This should also wrap around the URL index and thus cause the payload
369 // attempt number to be incremented.
370 payload_state.UpdateFailed(kActionCodeDownloadTransferError);
371 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
372 EXPECT_EQ(0, payload_state.GetUrlIndex());
373 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700374 EXPECT_EQ(2, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800375 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800376
377 // This should advance the URL index.
378 payload_state.UpdateFailed(kActionCodePayloadHashMismatchError);
379 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
380 EXPECT_EQ(1, payload_state.GetUrlIndex());
381 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700382 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800383 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800384
385 // This should advance the URL index and payload attempt number due to
386 // wrap-around of URL index.
387 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMissingError);
388 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
389 EXPECT_EQ(0, payload_state.GetUrlIndex());
390 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700391 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800392 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800393
394 // This HTTP error code should only increase the failure count.
395 payload_state.UpdateFailed(static_cast<ActionExitCode>(
396 kActionCodeOmahaRequestHTTPResponseBase + 404));
397 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
398 EXPECT_EQ(0, payload_state.GetUrlIndex());
399 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700400 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800401 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800402
403 // And that failure count should be reset when we download some bytes
404 // afterwards.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700405 payload_state.DownloadProgress(progress_bytes);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800406 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
407 EXPECT_EQ(0, payload_state.GetUrlIndex());
408 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700409 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800410 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800411
412 // Now, slightly change the response and set it again.
413 SetupPayloadStateWith2Urls("Hash8532", &payload_state, &response);
414
415 // Make sure the url index was reset to 0 because of the new response.
416 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
417 EXPECT_EQ(0, payload_state.GetUrlIndex());
418 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700419 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800420 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800421}
422
423TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDownload) {
424 OmahaResponse response;
425 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700426 MockSystemState mock_system_state;
427 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800428
Jay Srinivasan19409b72013-04-12 19:23:36 -0700429 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
430 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
431 .Times(AtLeast(1));
432 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
433 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800434
Jay Srinivasan19409b72013-04-12 19:23:36 -0700435 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _))
436 .Times(AtLeast(2));
Jay Srinivasan08262882012-12-28 19:29:43 -0800437
Jay Srinivasan19409b72013-04-12 19:23:36 -0700438 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
439 .Times(AtLeast(1));
440 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
441 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800442
Jay Srinivasan19409b72013-04-12 19:23:36 -0700443 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800444
445 SetupPayloadStateWith2Urls("Hash8593", &payload_state, &response);
446
447 // This should just advance the payload attempt number;
448 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
449 payload_state.DownloadComplete();
450 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
451 EXPECT_EQ(0, payload_state.GetUrlIndex());
452 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700453 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800454}
455
456TEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) {
457 OmahaResponse response;
458 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700459 MockSystemState mock_system_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800460
Jay Srinivasan19409b72013-04-12 19:23:36 -0700461 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800462 SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response);
463
464 // Generate enough events to advance URL index, failure count and
465 // payload attempt number all to 1.
466 payload_state.DownloadComplete();
467 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
468 payload_state.UpdateFailed(kActionCodeDownloadTransferError);
469 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
470 EXPECT_EQ(1, payload_state.GetUrlIndex());
471 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700472 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800473
474 // Now, simulate a corrupted url index on persisted store which gets
475 // loaded when update_engine restarts. Using a different prefs object
476 // so as to not bother accounting for the uninteresting calls above.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700477 MockSystemState mock_system_state2;
478 NiceMock<PrefsMock>* prefs2 = mock_system_state2.mock_prefs();
479 EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true));
480 EXPECT_CALL(*prefs2, GetInt64(_,_)).Times(AtLeast(1));
481 EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _))
482 .Times(AtLeast(1));
483 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _))
484 .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true)));
485 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _))
486 .Times(AtLeast(1));
David Zeuthencc6f9962013-04-18 11:57:24 -0700487 EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _))
488 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800489
490 // Note: This will be a different payload object, but the response should
491 // have the same hash as before so as to not trivially reset because the
492 // response was different. We want to specifically test that even if the
493 // response is same, we should reset the state if we find it corrupted.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700494 EXPECT_TRUE(payload_state.Initialize(&mock_system_state2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800495 SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response);
496
497 // Make sure all counters get reset to 0 because of the corrupted URL index
498 // we supplied above.
499 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
500 EXPECT_EQ(0, payload_state.GetUrlIndex());
501 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700502 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800503}
Jay Srinivasan08262882012-12-28 19:29:43 -0800504
505TEST(PayloadStateTest, NoBackoffForDeltaPayloads) {
506 OmahaResponse response;
507 response.is_delta_payload = true;
508 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700509 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800510
Jay Srinivasan19409b72013-04-12 19:23:36 -0700511 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800512 SetupPayloadStateWith2Urls("Hash6437", &payload_state, &response);
513
514 // Simulate a successful download and see that we're ready to download
515 // again without any backoff as this is a delta payload.
516 payload_state.DownloadComplete();
517 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
518 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
519
520 // Simulate two failures (enough to cause payload backoff) and check
521 // again that we're ready to re-download without any backoff as this is
522 // a delta payload.
523 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
524 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
525 EXPECT_EQ(0, payload_state.GetUrlIndex());
526 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
527 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
528}
529
530static void CheckPayloadBackoffState(PayloadState* payload_state,
531 int expected_attempt_number,
532 TimeDelta expected_days) {
533 payload_state->DownloadComplete();
534 EXPECT_EQ(expected_attempt_number, payload_state->GetPayloadAttemptNumber());
535 EXPECT_TRUE(payload_state->ShouldBackoffDownload());
536 Time backoff_expiry_time = payload_state->GetBackoffExpiryTime();
537 // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases.
538 TimeDelta max_fuzz_delta = TimeDelta::FromHours(7);
539 Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta;
540 Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta;
541 EXPECT_LT(expected_min_time.ToInternalValue(),
542 backoff_expiry_time.ToInternalValue());
543 EXPECT_GT(expected_max_time.ToInternalValue(),
544 backoff_expiry_time.ToInternalValue());
545}
546
547TEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) {
548 OmahaResponse response;
549 response.is_delta_payload = false;
550 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700551 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800552
Jay Srinivasan19409b72013-04-12 19:23:36 -0700553 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800554 SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response);
555
556 CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1));
557 CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2));
558 CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4));
559 CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8));
560 CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16));
561 CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16));
562 CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16));
563 CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16));
564 CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16));
565 CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16));
566}
567
568TEST(PayloadStateTest, BackoffLogicCanBeDisabled) {
569 OmahaResponse response;
570 response.disable_payload_backoff = true;
571 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700572 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800573
Jay Srinivasan19409b72013-04-12 19:23:36 -0700574 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800575 SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response);
576
577 // Simulate a successful download and see that we are ready to download
578 // again without any backoff.
579 payload_state.DownloadComplete();
580 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
581 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
582
583 // Test again, this time by simulating two errors that would cause
584 // the payload attempt number to increment due to wrap around. And
585 // check that we are still ready to re-download without any backoff.
586 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
587 payload_state.UpdateFailed(kActionCodeDownloadMetadataSignatureMismatch);
588 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
589 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
590}
591
Jay Srinivasan19409b72013-04-12 19:23:36 -0700592TEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) {
593 OmahaResponse response;
594 response.disable_payload_backoff = true;
595 PayloadState payload_state;
596 MockSystemState mock_system_state;
597 int https_total = 0;
598 int http_total = 0;
599
600 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
601 SetupPayloadStateWith2Urls("Hash3286", &payload_state, &response);
602
603 // Simulate a successful download and see that we are ready to download
604 // again without any backoff.
605 int first_chunk = 5000000;
606 http_total += first_chunk;
607 payload_state.DownloadProgress(first_chunk);
608 // Test that first all progress is made on HTTP and none on HTTPs.
609 EXPECT_EQ(first_chunk,
610 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
611 EXPECT_EQ(http_total,
612 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
613 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
614 kDownloadSourceHttpsServer));
615 EXPECT_EQ(https_total,
616 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
617
618 // Simulate an error that'll cause the url index to point to https.
619 ActionExitCode error = kActionCodeDownloadMetadataSignatureMismatch;
620 payload_state.UpdateFailed(error);
621
622 // Test that no new progress is made on HTTP and new progress is on HTTPs.
623 int second_chunk = 23456789;
624 https_total += second_chunk;
625 payload_state.DownloadProgress(second_chunk);
626 EXPECT_EQ(first_chunk,
627 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
628 EXPECT_EQ(http_total,
629 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
630 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
631 kDownloadSourceHttpsServer));
632 EXPECT_EQ(https_total,
633 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
634
635 // Simulate error to go back to http.
636 payload_state.UpdateFailed(error);
637 int third_chunk = 32345678;
638 int http_chunk = first_chunk + third_chunk;
639 http_total += third_chunk;
640 int https_chunk = second_chunk;
641 payload_state.DownloadProgress(third_chunk);
642
643 // Test that third chunk is again back on HTTP. HTTPS remains on second chunk.
644 EXPECT_EQ(http_chunk,
645 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
646 EXPECT_EQ(http_chunk,
647 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
648 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
649 kDownloadSourceHttpsServer));
650 EXPECT_EQ(https_total,
651 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
652
Chris Sosabe45bef2013-04-09 18:25:12 -0700653 // Don't care about other metrics in this test.
654 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
655 _,_,_,_,_)).Times(AtLeast(0));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700656 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
657 "Installer.SuccessfulMBsDownloadedFromHttpServer",
658 http_chunk / kNumBytesInOneMiB, _, _, _));
659 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
660 "Installer.TotalMBsDownloadedFromHttpServer",
661 http_total / kNumBytesInOneMiB, _, _, _));
662 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
663 "Installer.SuccessfulMBsDownloadedFromHttpsServer",
664 https_chunk / kNumBytesInOneMiB, _, _, _));
665 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
666 "Installer.TotalMBsDownloadedFromHttpsServer",
667 https_total / kNumBytesInOneMiB, _, _, _));
David Zeuthencc6f9962013-04-18 11:57:24 -0700668 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
669 "Installer.UpdateURLSwitches",
670 2, _, _, _));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700671
672 payload_state.UpdateSucceeded();
673
674 // Make sure the metrics are reset after a successful update.
675 EXPECT_EQ(0,
676 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
677 EXPECT_EQ(0,
678 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
679 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
680 kDownloadSourceHttpsServer));
681 EXPECT_EQ(0,
682 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
683}
684
685TEST(PayloadStateTest, RestartingUpdateResetsMetrics) {
686 OmahaResponse response;
687 MockSystemState mock_system_state;
688 PayloadState payload_state;
689
690 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
691
692 // Set the first response.
693 SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response);
694
695 int num_bytes = 10000;
696 payload_state.DownloadProgress(num_bytes);
697 EXPECT_EQ(num_bytes,
698 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
699 EXPECT_EQ(num_bytes,
700 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
701 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
702 kDownloadSourceHttpsServer));
703 EXPECT_EQ(0,
704 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
705
706 payload_state.UpdateRestarted();
707 // Make sure the current bytes downloaded is reset, but not the total bytes.
708 EXPECT_EQ(0,
709 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
710 EXPECT_EQ(num_bytes,
711 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
712}
713
Chris Sosabe45bef2013-04-09 18:25:12 -0700714TEST(PayloadStateTest, NumRebootsIncrementsCorrectly) {
715 MockSystemState mock_system_state;
716 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700717
Chris Sosabe45bef2013-04-09 18:25:12 -0700718 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
719 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
720 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1));
721
722 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
723
724 payload_state.UpdateRestarted();
725 EXPECT_EQ(0, payload_state.GetNumReboots());
726
727 EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(true));
728 payload_state.UpdateResumed();
729 // Num reboots should be incremented because system rebooted detected.
730 EXPECT_EQ(1, payload_state.GetNumReboots());
731
732 EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(false));
733 payload_state.UpdateResumed();
734 // Num reboots should now be 1 as reboot was not detected.
735 EXPECT_EQ(1, payload_state.GetNumReboots());
736
737 // Restart the update again to verify we set the num of reboots back to 0.
738 payload_state.UpdateRestarted();
739 EXPECT_EQ(0, payload_state.GetNumReboots());
740}
Jay Srinivasan19409b72013-04-12 19:23:36 -0700741
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800742}