blob: f7688c2c396df22784e52bab194e5f38a049f27f [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"
David Zeuthenf413fe52013-04-22 14:04:39 -070014#include "update_engine/fake_clock.h"
Jay Srinivasan19409b72013-04-12 19:23:36 -070015#include "update_engine/mock_system_state.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080016#include "update_engine/omaha_request_action.h"
17#include "update_engine/payload_state.h"
David Zeuthenf413fe52013-04-22 14:04:39 -070018#include "update_engine/prefs.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080019#include "update_engine/prefs_mock.h"
20#include "update_engine/test_utils.h"
21#include "update_engine/utils.h"
22
Jay Srinivasan08262882012-12-28 19:29:43 -080023using base::Time;
24using base::TimeDelta;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080025using std::string;
26using testing::_;
27using testing::NiceMock;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080028using testing::Return;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080029using testing::SetArgumentPointee;
David Zeuthen9a017f22013-04-11 16:10:26 -070030using testing::AtLeast;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080031
32namespace chromeos_update_engine {
33
Jay Srinivasan19409b72013-04-12 19:23:36 -070034const char* kCurrentBytesDownloadedFromHttps =
35 "current-bytes-downloaded-from-HttpsServer";
36const char* kTotalBytesDownloadedFromHttps =
37 "total-bytes-downloaded-from-HttpsServer";
38const char* kCurrentBytesDownloadedFromHttp =
39 "current-bytes-downloaded-from-HttpServer";
40const char* kTotalBytesDownloadedFromHttp =
41 "total-bytes-downloaded-from-HttpServer";
42
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080043static void SetupPayloadStateWith2Urls(string hash,
44 PayloadState* payload_state,
45 OmahaResponse* response) {
46 response->payload_urls.clear();
47 response->payload_urls.push_back("http://test");
48 response->payload_urls.push_back("https://test");
49 response->size = 523456789;
50 response->hash = hash;
51 response->metadata_size = 558123;
52 response->metadata_signature = "metasign";
53 response->max_failure_count_per_url = 3;
54 payload_state->SetResponse(*response);
Jay Srinivasan08262882012-12-28 19:29:43 -080055 string stored_response_sign = payload_state->GetResponseSignature();
56 string expected_response_sign = StringPrintf(
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080057 "NumURLs = 2\n"
58 "Url0 = http://test\n"
59 "Url1 = https://test\n"
60 "Payload Size = 523456789\n"
61 "Payload Sha256 Hash = %s\n"
62 "Metadata Size = 558123\n"
Jay Srinivasan08262882012-12-28 19:29:43 -080063 "Metadata Signature = metasign\n"
64 "Is Delta Payload = %d\n"
65 "Max Failure Count Per Url = %d\n"
66 "Disable Payload Backoff = %d\n",
67 hash.c_str(),
68 response->is_delta_payload,
69 response->max_failure_count_per_url,
70 response->disable_payload_backoff);
71 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080072}
73
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080074class PayloadStateTest : public ::testing::Test { };
75
David Zeuthena99981f2013-04-29 13:42:47 -070076TEST(PayloadStateTest, DidYouAddANewErrorCode) {
77 if (kErrorCodeUmaReportedMax != 43) {
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080078 LOG(ERROR) << "The following failure is intentional. If you added a new "
David Zeuthena99981f2013-04-29 13:42:47 -070079 << "ErrorCode enum value, make sure to add it to the "
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080080 << "PayloadState::UpdateFailed method and then update this test "
David Zeuthena99981f2013-04-29 13:42:47 -070081 << "to the new value of kErrorCodeUmaReportedMax, which is "
82 << kErrorCodeUmaReportedMax;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080083 EXPECT_FALSE("Please see the log line above");
84 }
85}
86
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080087TEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) {
88 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -070089 MockSystemState mock_system_state;
90 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
91 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
92 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
93 .Times(AtLeast(1));
94 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
95 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
96 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
97 .Times(AtLeast(1));
98 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
99 .Times(AtLeast(1));
100 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
101 .Times(AtLeast(1));
102 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
103 .Times(AtLeast(1));
104 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
105 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700106 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800107 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700108 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800109 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800110 string stored_response_sign = payload_state.GetResponseSignature();
111 string expected_response_sign = "NumURLs = 0\n"
112 "Payload Size = 0\n"
113 "Payload Sha256 Hash = \n"
114 "Metadata Size = 0\n"
115 "Metadata Signature = \n"
116 "Is Delta Payload = 0\n"
117 "Max Failure Count Per Url = 0\n"
118 "Disable Payload Backoff = 0\n";
119 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800120 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800121 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700122 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800123}
124
125TEST(PayloadStateTest, SetResponseWorksWithSingleUrl) {
126 OmahaResponse response;
127 response.payload_urls.push_back("http://single.url.test");
128 response.size = 123456789;
129 response.hash = "hash";
130 response.metadata_size = 58123;
131 response.metadata_signature = "msign";
Jay Srinivasan19409b72013-04-12 19:23:36 -0700132 MockSystemState mock_system_state;
133 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
134 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
135 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
136 .Times(AtLeast(1));
137 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
138 .Times(AtLeast(1));
139 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
140 .Times(AtLeast(1));
141 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
142 .Times(AtLeast(1));
143 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
144 .Times(AtLeast(1));
145 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
146 .Times(AtLeast(1));
147 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
148 .Times(AtLeast(1));
149 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
150 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700151 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
152 .Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800153 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700154 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800155 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800156 string stored_response_sign = payload_state.GetResponseSignature();
157 string expected_response_sign = "NumURLs = 1\n"
158 "Url0 = http://single.url.test\n"
159 "Payload Size = 123456789\n"
160 "Payload Sha256 Hash = hash\n"
161 "Metadata Size = 58123\n"
162 "Metadata Signature = msign\n"
163 "Is Delta Payload = 0\n"
164 "Max Failure Count Per Url = 0\n"
165 "Disable Payload Backoff = 0\n";
166 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800167 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800168 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700169 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800170}
171
172TEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) {
173 OmahaResponse response;
174 response.payload_urls.push_back("http://multiple.url.test");
175 response.payload_urls.push_back("https://multiple.url.test");
176 response.size = 523456789;
177 response.hash = "rhash";
178 response.metadata_size = 558123;
179 response.metadata_signature = "metasign";
Jay Srinivasan19409b72013-04-12 19:23:36 -0700180 MockSystemState mock_system_state;
181 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
182 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
183 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
184 .Times(AtLeast(1));
185 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0))
186 .Times(AtLeast(1));
187 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
188 .Times(AtLeast(1));
189 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
190 .Times(AtLeast(1));
191 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
192 .Times(AtLeast(1));
193 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
194 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700195 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
196 .Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800197 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700198 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800199 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800200 string stored_response_sign = payload_state.GetResponseSignature();
201 string expected_response_sign = "NumURLs = 2\n"
202 "Url0 = http://multiple.url.test\n"
203 "Url1 = https://multiple.url.test\n"
204 "Payload Size = 523456789\n"
205 "Payload Sha256 Hash = rhash\n"
206 "Metadata Size = 558123\n"
207 "Metadata Signature = metasign\n"
208 "Is Delta Payload = 0\n"
209 "Max Failure Count Per Url = 0\n"
210 "Disable Payload Backoff = 0\n";
211 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800212 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800213 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700214 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800215}
216
217TEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) {
218 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700219 MockSystemState mock_system_state;
220 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800221 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800222
Jay Srinivasan19409b72013-04-12 19:23:36 -0700223 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800224 // Payload attempt should start with 0 and then advance to 1.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700225 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
226 .Times(AtLeast(1));
227 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
228 .Times(AtLeast(1));
229 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2));
David Zeuthen9a017f22013-04-11 16:10:26 -0700230
Chris Sosabe45bef2013-04-09 18:25:12 -0700231 // Reboots will be set
232 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1));
233
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800234 // Url index should go from 0 to 1 twice.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700235 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
236 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800237
238 // Failure count should be called each times url index is set, so that's
239 // 4 times for this test.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700240 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
241 .Times(AtLeast(4));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800242
Jay Srinivasan19409b72013-04-12 19:23:36 -0700243 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800244
245 // This does a SetResponse which causes all the states to be set to 0 for
246 // the first time.
247 SetupPayloadStateWith2Urls("Hash1235", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800248 EXPECT_EQ(0, payload_state.GetUrlIndex());
249
250 // Verify that on the first error, the URL index advances to 1.
David Zeuthena99981f2013-04-29 13:42:47 -0700251 ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800252 payload_state.UpdateFailed(error);
253 EXPECT_EQ(1, payload_state.GetUrlIndex());
254
255 // Verify that on the next error, the URL index wraps around to 0.
256 payload_state.UpdateFailed(error);
257 EXPECT_EQ(0, payload_state.GetUrlIndex());
258
259 // Verify that on the next error, it again advances to 1.
260 payload_state.UpdateFailed(error);
261 EXPECT_EQ(1, payload_state.GetUrlIndex());
David Zeuthencc6f9962013-04-18 11:57:24 -0700262
263 // Verify that we switched URLs three times
264 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800265}
266
267TEST(PayloadStateTest, NewResponseResetsPayloadState) {
268 OmahaResponse response;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700269 MockSystemState mock_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800270 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800271
Jay Srinivasan19409b72013-04-12 19:23:36 -0700272 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800273
274 // Set the first response.
275 SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800276
277 // Advance the URL index to 1 by faking an error.
David Zeuthena99981f2013-04-29 13:42:47 -0700278 ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800279 payload_state.UpdateFailed(error);
280 EXPECT_EQ(1, payload_state.GetUrlIndex());
David Zeuthencc6f9962013-04-18 11:57:24 -0700281 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800282
283 // Now, slightly change the response and set it again.
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800284 SetupPayloadStateWith2Urls("Hash8225", &payload_state, &response);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800285
286 // Make sure the url index was reset to 0 because of the new response.
287 EXPECT_EQ(0, payload_state.GetUrlIndex());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800288 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700289 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700290 EXPECT_EQ(0,
291 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
292 EXPECT_EQ(0,
293 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
294 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
295 kDownloadSourceHttpsServer));
296 EXPECT_EQ(0,
297 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800298}
299
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800300TEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) {
301 OmahaResponse response;
302 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700303 MockSystemState mock_system_state;
304 int progress_bytes = 100;
305 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800306
Jay Srinivasan19409b72013-04-12 19:23:36 -0700307 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
308 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
309 .Times(AtLeast(2));
310 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
311 .Times(AtLeast(1));
312 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2))
313 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800314
Jay Srinivasan19409b72013-04-12 19:23:36 -0700315 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4));
Jay Srinivasan08262882012-12-28 19:29:43 -0800316
Jay Srinivasan19409b72013-04-12 19:23:36 -0700317 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4));
318 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800319
Jay Srinivasan19409b72013-04-12 19:23:36 -0700320 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
321 .Times(AtLeast(7));
322 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1))
323 .Times(AtLeast(2));
324 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2))
325 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800326
Jay Srinivasan19409b72013-04-12 19:23:36 -0700327 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
328 .Times(AtLeast(1));
329 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
330 .Times(AtLeast(1));
David Zeuthen9a017f22013-04-11 16:10:26 -0700331
Jay Srinivasan19409b72013-04-12 19:23:36 -0700332 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
333 .Times(AtLeast(1));
334 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
335 .Times(AtLeast(1));
336 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes))
337 .Times(AtLeast(1));
338 EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes))
339 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700340 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0))
341 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700342
343 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800344
345 SetupPayloadStateWith2Urls("Hash5873", &payload_state, &response);
346
347 // This should advance the URL index.
David Zeuthena99981f2013-04-29 13:42:47 -0700348 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800349 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
350 EXPECT_EQ(1, payload_state.GetUrlIndex());
351 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700352 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800353
354 // This should advance the failure count only.
David Zeuthena99981f2013-04-29 13:42:47 -0700355 payload_state.UpdateFailed(kErrorCodeDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800356 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
357 EXPECT_EQ(1, payload_state.GetUrlIndex());
358 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700359 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800360
361 // This should advance the failure count only.
David Zeuthena99981f2013-04-29 13:42:47 -0700362 payload_state.UpdateFailed(kErrorCodeDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800363 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
364 EXPECT_EQ(1, payload_state.GetUrlIndex());
365 EXPECT_EQ(2, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700366 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800367
368 // This should advance the URL index as we've reached the
369 // max failure count and reset the failure count for the new URL index.
370 // This should also wrap around the URL index and thus cause the payload
371 // attempt number to be incremented.
David Zeuthena99981f2013-04-29 13:42:47 -0700372 payload_state.UpdateFailed(kErrorCodeDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800373 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
374 EXPECT_EQ(0, payload_state.GetUrlIndex());
375 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700376 EXPECT_EQ(2, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800377 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800378
379 // This should advance the URL index.
David Zeuthena99981f2013-04-29 13:42:47 -0700380 payload_state.UpdateFailed(kErrorCodePayloadHashMismatchError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800381 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
382 EXPECT_EQ(1, payload_state.GetUrlIndex());
383 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700384 EXPECT_EQ(3, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800385 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800386
387 // This should advance the URL index and payload attempt number due to
388 // wrap-around of URL index.
David Zeuthena99981f2013-04-29 13:42:47 -0700389 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMissingError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800390 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
391 EXPECT_EQ(0, payload_state.GetUrlIndex());
392 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700393 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800394 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800395
396 // This HTTP error code should only increase the failure count.
David Zeuthena99981f2013-04-29 13:42:47 -0700397 payload_state.UpdateFailed(static_cast<ErrorCode>(
398 kErrorCodeOmahaRequestHTTPResponseBase + 404));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800399 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
400 EXPECT_EQ(0, payload_state.GetUrlIndex());
401 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700402 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800403 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800404
405 // And that failure count should be reset when we download some bytes
406 // afterwards.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700407 payload_state.DownloadProgress(progress_bytes);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800408 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
409 EXPECT_EQ(0, payload_state.GetUrlIndex());
410 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700411 EXPECT_EQ(4, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800412 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800413
414 // Now, slightly change the response and set it again.
415 SetupPayloadStateWith2Urls("Hash8532", &payload_state, &response);
416
417 // Make sure the url index was reset to 0 because of the new response.
418 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
419 EXPECT_EQ(0, payload_state.GetUrlIndex());
420 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700421 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800422 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800423}
424
425TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDownload) {
426 OmahaResponse response;
427 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700428 MockSystemState mock_system_state;
429 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800430
Jay Srinivasan19409b72013-04-12 19:23:36 -0700431 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
432 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
433 .Times(AtLeast(1));
434 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
435 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800436
Jay Srinivasan19409b72013-04-12 19:23:36 -0700437 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _))
438 .Times(AtLeast(2));
Jay Srinivasan08262882012-12-28 19:29:43 -0800439
Jay Srinivasan19409b72013-04-12 19:23:36 -0700440 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0))
441 .Times(AtLeast(1));
442 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
443 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800444
Jay Srinivasan19409b72013-04-12 19:23:36 -0700445 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800446
447 SetupPayloadStateWith2Urls("Hash8593", &payload_state, &response);
448
449 // This should just advance the payload attempt number;
450 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
451 payload_state.DownloadComplete();
452 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
453 EXPECT_EQ(0, payload_state.GetUrlIndex());
454 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700455 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800456}
457
458TEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) {
459 OmahaResponse response;
460 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700461 MockSystemState mock_system_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800462
Jay Srinivasan19409b72013-04-12 19:23:36 -0700463 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800464 SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response);
465
466 // Generate enough events to advance URL index, failure count and
467 // payload attempt number all to 1.
468 payload_state.DownloadComplete();
David Zeuthena99981f2013-04-29 13:42:47 -0700469 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
470 payload_state.UpdateFailed(kErrorCodeDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800471 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
472 EXPECT_EQ(1, payload_state.GetUrlIndex());
473 EXPECT_EQ(1, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700474 EXPECT_EQ(1, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800475
476 // Now, simulate a corrupted url index on persisted store which gets
477 // loaded when update_engine restarts. Using a different prefs object
478 // so as to not bother accounting for the uninteresting calls above.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700479 MockSystemState mock_system_state2;
480 NiceMock<PrefsMock>* prefs2 = mock_system_state2.mock_prefs();
481 EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true));
482 EXPECT_CALL(*prefs2, GetInt64(_,_)).Times(AtLeast(1));
483 EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _))
484 .Times(AtLeast(1));
485 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _))
486 .WillRepeatedly(DoAll(SetArgumentPointee<1>(2), Return(true)));
487 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _))
488 .Times(AtLeast(1));
David Zeuthencc6f9962013-04-18 11:57:24 -0700489 EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _))
490 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800491
492 // Note: This will be a different payload object, but the response should
493 // have the same hash as before so as to not trivially reset because the
494 // response was different. We want to specifically test that even if the
495 // response is same, we should reset the state if we find it corrupted.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700496 EXPECT_TRUE(payload_state.Initialize(&mock_system_state2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800497 SetupPayloadStateWith2Urls("Hash4427", &payload_state, &response);
498
499 // Make sure all counters get reset to 0 because of the corrupted URL index
500 // we supplied above.
501 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
502 EXPECT_EQ(0, payload_state.GetUrlIndex());
503 EXPECT_EQ(0, payload_state.GetUrlFailureCount());
David Zeuthencc6f9962013-04-18 11:57:24 -0700504 EXPECT_EQ(0, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800505}
Jay Srinivasan08262882012-12-28 19:29:43 -0800506
507TEST(PayloadStateTest, NoBackoffForDeltaPayloads) {
508 OmahaResponse response;
509 response.is_delta_payload = true;
510 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700511 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800512
Jay Srinivasan19409b72013-04-12 19:23:36 -0700513 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800514 SetupPayloadStateWith2Urls("Hash6437", &payload_state, &response);
515
516 // Simulate a successful download and see that we're ready to download
517 // again without any backoff as this is a delta payload.
518 payload_state.DownloadComplete();
519 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
520 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
521
522 // Simulate two failures (enough to cause payload backoff) and check
523 // again that we're ready to re-download without any backoff as this is
524 // a delta payload.
David Zeuthena99981f2013-04-29 13:42:47 -0700525 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
526 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
Jay Srinivasan08262882012-12-28 19:29:43 -0800527 EXPECT_EQ(0, payload_state.GetUrlIndex());
528 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
529 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
530}
531
532static void CheckPayloadBackoffState(PayloadState* payload_state,
533 int expected_attempt_number,
534 TimeDelta expected_days) {
535 payload_state->DownloadComplete();
536 EXPECT_EQ(expected_attempt_number, payload_state->GetPayloadAttemptNumber());
537 EXPECT_TRUE(payload_state->ShouldBackoffDownload());
538 Time backoff_expiry_time = payload_state->GetBackoffExpiryTime();
539 // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases.
540 TimeDelta max_fuzz_delta = TimeDelta::FromHours(7);
541 Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta;
542 Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta;
543 EXPECT_LT(expected_min_time.ToInternalValue(),
544 backoff_expiry_time.ToInternalValue());
545 EXPECT_GT(expected_max_time.ToInternalValue(),
546 backoff_expiry_time.ToInternalValue());
547}
548
549TEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) {
550 OmahaResponse response;
551 response.is_delta_payload = false;
552 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700553 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800554
Jay Srinivasan19409b72013-04-12 19:23:36 -0700555 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800556 SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response);
557
558 CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1));
559 CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2));
560 CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4));
561 CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8));
562 CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16));
563 CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16));
564 CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16));
565 CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16));
566 CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16));
567 CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16));
568}
569
570TEST(PayloadStateTest, BackoffLogicCanBeDisabled) {
571 OmahaResponse response;
572 response.disable_payload_backoff = true;
573 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700574 MockSystemState mock_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800575
Jay Srinivasan19409b72013-04-12 19:23:36 -0700576 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
Jay Srinivasan08262882012-12-28 19:29:43 -0800577 SetupPayloadStateWith2Urls("Hash8939", &payload_state, &response);
578
579 // Simulate a successful download and see that we are ready to download
580 // again without any backoff.
581 payload_state.DownloadComplete();
582 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
583 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
584
585 // Test again, this time by simulating two errors that would cause
586 // the payload attempt number to increment due to wrap around. And
587 // check that we are still ready to re-download without any backoff.
David Zeuthena99981f2013-04-29 13:42:47 -0700588 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
589 payload_state.UpdateFailed(kErrorCodeDownloadMetadataSignatureMismatch);
Jay Srinivasan08262882012-12-28 19:29:43 -0800590 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
591 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
592}
593
Jay Srinivasan19409b72013-04-12 19:23:36 -0700594TEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) {
595 OmahaResponse response;
596 response.disable_payload_backoff = true;
597 PayloadState payload_state;
598 MockSystemState mock_system_state;
599 int https_total = 0;
600 int http_total = 0;
601
602 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
603 SetupPayloadStateWith2Urls("Hash3286", &payload_state, &response);
604
605 // Simulate a successful download and see that we are ready to download
606 // again without any backoff.
607 int first_chunk = 5000000;
608 http_total += first_chunk;
609 payload_state.DownloadProgress(first_chunk);
610 // Test that first all progress is made on HTTP and none on HTTPs.
611 EXPECT_EQ(first_chunk,
612 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
613 EXPECT_EQ(http_total,
614 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
615 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
616 kDownloadSourceHttpsServer));
617 EXPECT_EQ(https_total,
618 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
619
620 // Simulate an error that'll cause the url index to point to https.
David Zeuthena99981f2013-04-29 13:42:47 -0700621 ErrorCode error = kErrorCodeDownloadMetadataSignatureMismatch;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700622 payload_state.UpdateFailed(error);
623
624 // Test that no new progress is made on HTTP and new progress is on HTTPs.
625 int second_chunk = 23456789;
626 https_total += second_chunk;
627 payload_state.DownloadProgress(second_chunk);
628 EXPECT_EQ(first_chunk,
629 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
630 EXPECT_EQ(http_total,
631 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
632 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
633 kDownloadSourceHttpsServer));
634 EXPECT_EQ(https_total,
635 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
636
637 // Simulate error to go back to http.
638 payload_state.UpdateFailed(error);
639 int third_chunk = 32345678;
640 int http_chunk = first_chunk + third_chunk;
641 http_total += third_chunk;
642 int https_chunk = second_chunk;
643 payload_state.DownloadProgress(third_chunk);
644
645 // Test that third chunk is again back on HTTP. HTTPS remains on second chunk.
646 EXPECT_EQ(http_chunk,
647 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
648 EXPECT_EQ(http_chunk,
649 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
650 EXPECT_EQ(second_chunk, payload_state.GetCurrentBytesDownloaded(
651 kDownloadSourceHttpsServer));
652 EXPECT_EQ(https_total,
653 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
654
Chris Sosabe45bef2013-04-09 18:25:12 -0700655 // Don't care about other metrics in this test.
656 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
657 _,_,_,_,_)).Times(AtLeast(0));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700658 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
659 "Installer.SuccessfulMBsDownloadedFromHttpServer",
660 http_chunk / kNumBytesInOneMiB, _, _, _));
661 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
662 "Installer.TotalMBsDownloadedFromHttpServer",
663 http_total / kNumBytesInOneMiB, _, _, _));
664 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
665 "Installer.SuccessfulMBsDownloadedFromHttpsServer",
666 https_chunk / kNumBytesInOneMiB, _, _, _));
667 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
668 "Installer.TotalMBsDownloadedFromHttpsServer",
669 https_total / kNumBytesInOneMiB, _, _, _));
David Zeuthencc6f9962013-04-18 11:57:24 -0700670 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
671 "Installer.UpdateURLSwitches",
672 2, _, _, _));
David Zeuthen674c3182013-04-18 14:05:20 -0700673 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
674 "Installer.UpdateDurationMinutes",
675 _, _, _, _));
676 EXPECT_CALL(*mock_system_state.mock_metrics_lib(), SendToUMA(
677 "Installer.UpdateDurationUptimeMinutes",
678 _, _, _, _));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700679
680 payload_state.UpdateSucceeded();
681
682 // Make sure the metrics are reset after a successful update.
683 EXPECT_EQ(0,
684 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
685 EXPECT_EQ(0,
686 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
687 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
688 kDownloadSourceHttpsServer));
689 EXPECT_EQ(0,
690 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
691}
692
693TEST(PayloadStateTest, RestartingUpdateResetsMetrics) {
694 OmahaResponse response;
695 MockSystemState mock_system_state;
696 PayloadState payload_state;
697
698 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
699
700 // Set the first response.
701 SetupPayloadStateWith2Urls("Hash5823", &payload_state, &response);
702
703 int num_bytes = 10000;
704 payload_state.DownloadProgress(num_bytes);
705 EXPECT_EQ(num_bytes,
706 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
707 EXPECT_EQ(num_bytes,
708 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
709 EXPECT_EQ(0, payload_state.GetCurrentBytesDownloaded(
710 kDownloadSourceHttpsServer));
711 EXPECT_EQ(0,
712 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
713
714 payload_state.UpdateRestarted();
715 // Make sure the current bytes downloaded is reset, but not the total bytes.
716 EXPECT_EQ(0,
717 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
718 EXPECT_EQ(num_bytes,
719 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
720}
721
Chris Sosabe45bef2013-04-09 18:25:12 -0700722TEST(PayloadStateTest, NumRebootsIncrementsCorrectly) {
723 MockSystemState mock_system_state;
724 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700725
Chris Sosabe45bef2013-04-09 18:25:12 -0700726 NiceMock<PrefsMock>* prefs = mock_system_state.mock_prefs();
727 EXPECT_CALL(*prefs, SetInt64(_,_)).Times(AtLeast(0));
728 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1));
729
730 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
731
732 payload_state.UpdateRestarted();
733 EXPECT_EQ(0, payload_state.GetNumReboots());
734
735 EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(true));
736 payload_state.UpdateResumed();
737 // Num reboots should be incremented because system rebooted detected.
738 EXPECT_EQ(1, payload_state.GetNumReboots());
739
740 EXPECT_CALL(mock_system_state, system_rebooted()).WillOnce(Return(false));
741 payload_state.UpdateResumed();
742 // Num reboots should now be 1 as reboot was not detected.
743 EXPECT_EQ(1, payload_state.GetNumReboots());
744
745 // Restart the update again to verify we set the num of reboots back to 0.
746 payload_state.UpdateRestarted();
747 EXPECT_EQ(0, payload_state.GetNumReboots());
748}
Jay Srinivasan19409b72013-04-12 19:23:36 -0700749
David Zeuthenf413fe52013-04-22 14:04:39 -0700750TEST(PayloadStateTest, DurationsAreCorrect) {
751 OmahaResponse response;
752 PayloadState payload_state;
753 MockSystemState mock_system_state;
754 FakeClock fake_clock;
755 Prefs prefs;
756 string temp_dir;
757
758 // Set the clock to a well-known time - 1 second on the wall-clock
759 // and 2 seconds on the monotonic clock
760 fake_clock.SetWallclockTime(Time::FromInternalValue(1000000));
761 fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000));
762
763 // We need persistent preferences for this test
764 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/PayloadStateDurationTests.XXXXXX",
765 &temp_dir));
766 prefs.Init(FilePath(temp_dir));
767
768 mock_system_state.set_clock(&fake_clock);
769 mock_system_state.set_prefs(&prefs);
770 EXPECT_TRUE(payload_state.Initialize(&mock_system_state));
771
772 // Check that durations are correct for a successful update where
773 // time has advanced 7 seconds on the wall clock and 4 seconds on
774 // the monotonic clock.
775 SetupPayloadStateWith2Urls("Hash8593", &payload_state, &response);
776 fake_clock.SetWallclockTime(Time::FromInternalValue(8000000));
777 fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000));
778 payload_state.UpdateSucceeded();
779 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000);
780 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000);
781
782 // Check that durations are reset when a new response comes in.
783 SetupPayloadStateWith2Urls("Hash8594", &payload_state, &response);
784 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0);
785 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0);
786
787 // Advance time a bit (10 secs), simulate download progress and
788 // check that durations are updated.
789 fake_clock.SetWallclockTime(Time::FromInternalValue(18000000));
790 fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000));
791 payload_state.DownloadProgress(10);
792 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000);
793 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000);
794
795 // Now simulate a reboot by resetting monotonic time (to 5000) and
796 // creating a new PayloadState object and check that we load the
797 // durations correctly (e.g. they are the same as before).
798 fake_clock.SetMonotonicTime(Time::FromInternalValue(5000));
799 PayloadState payload_state2;
800 EXPECT_TRUE(payload_state2.Initialize(&mock_system_state));
801 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000);
802 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),10000000);
803
804 // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds
805 // and check that the durations are increased accordingly.
806 fake_clock.SetWallclockTime(Time::FromInternalValue(25000000));
807 fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000));
808 payload_state2.UpdateSucceeded();
809 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000);
810 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),16000000);
811
812 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
813}
814
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800815}