blob: 869c24eb5bc9adfd73cf172cec125da80010811d [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
Alex Deymo39910dc2015-11-09 17:04:30 -080025#include "update_engine/common/constants.h"
26#include "update_engine/common/fake_clock.h"
27#include "update_engine/common/fake_hardware.h"
28#include "update_engine/common/fake_prefs.h"
29#include "update_engine/common/mock_prefs.h"
30#include "update_engine/common/prefs.h"
31#include "update_engine/common/test_utils.h"
32#include "update_engine/common/utils.h"
Gilad Arnold5bb4c902014-04-10 12:32:13 -070033#include "update_engine/fake_system_state.h"
Tianjie Xu282aa1f2017-09-05 13:42:45 -070034#include "update_engine/metrics_reporter_interface.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080035#include "update_engine/omaha_request_action.h"
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080036
Jay Srinivasan08262882012-12-28 19:29:43 -080037using base::Time;
38using base::TimeDelta;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080039using std::string;
Amin Hassani7cc8bb02019-01-14 16:29:47 -080040using testing::_;
Alex Deymo42432912013-07-12 20:21:15 -070041using testing::AnyNumber;
42using testing::AtLeast;
43using testing::Mock;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080044using testing::NiceMock;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080045using testing::Return;
Ben Chan672c1f52017-10-23 15:41:39 -070046using testing::SetArgPointee;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -080047
48namespace chromeos_update_engine {
49
Jay Srinivasan19409b72013-04-12 19:23:36 -070050const char* kCurrentBytesDownloadedFromHttps =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080051 "current-bytes-downloaded-from-HttpsServer";
Jay Srinivasan19409b72013-04-12 19:23:36 -070052const char* kTotalBytesDownloadedFromHttps =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080053 "total-bytes-downloaded-from-HttpsServer";
Jay Srinivasan19409b72013-04-12 19:23:36 -070054const char* kCurrentBytesDownloadedFromHttp =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080055 "current-bytes-downloaded-from-HttpServer";
Jay Srinivasan19409b72013-04-12 19:23:36 -070056const char* kTotalBytesDownloadedFromHttp =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080057 "total-bytes-downloaded-from-HttpServer";
David Zeuthenbb8bdc72013-09-03 13:43:48 -070058const char* kCurrentBytesDownloadedFromHttpPeer =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080059 "current-bytes-downloaded-from-HttpPeer";
David Zeuthenbb8bdc72013-09-03 13:43:48 -070060const char* kTotalBytesDownloadedFromHttpPeer =
Amin Hassani7cc8bb02019-01-14 16:29:47 -080061 "total-bytes-downloaded-from-HttpPeer";
Jay Srinivasan19409b72013-04-12 19:23:36 -070062
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080063static void SetupPayloadStateWith2Urls(string hash,
Jay Srinivasan53173b92013-05-17 17:13:01 -070064 bool http_enabled,
Sen Jiangcdd52062017-05-18 15:33:10 -070065 bool is_delta_payload,
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080066 PayloadState* payload_state,
67 OmahaResponse* response) {
Sen Jiang0affc2c2017-02-10 15:55:05 -080068 response->packages.clear();
69 response->packages.push_back({.payload_urls = {"http://test", "https://test"},
70 .size = 523456789,
71 .metadata_size = 558123,
72 .metadata_signature = "metasign",
Sen Jiangcdd52062017-05-18 15:33:10 -070073 .hash = hash,
74 .is_delta = is_delta_payload});
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -080075 response->max_failure_count_per_url = 3;
76 payload_state->SetResponse(*response);
Jay Srinivasan08262882012-12-28 19:29:43 -080077 string stored_response_sign = payload_state->GetResponseSignature();
Jay Srinivasan53173b92013-05-17 17:13:01 -070078
79 string expected_url_https_only =
Sen Jiang0affc2c2017-02-10 15:55:05 -080080 " NumURLs = 1\n"
81 " Candidate Url0 = https://test\n";
Jay Srinivasan53173b92013-05-17 17:13:01 -070082
83 string expected_urls_both =
Sen Jiang0affc2c2017-02-10 15:55:05 -080084 " NumURLs = 2\n"
85 " Candidate Url0 = http://test\n"
86 " Candidate Url1 = https://test\n";
Jay Srinivasan53173b92013-05-17 17:13:01 -070087
Sen Jiang0affc2c2017-02-10 15:55:05 -080088 string expected_response_sign = base::StringPrintf(
89 "Payload 0:\n"
90 " Size = 523456789\n"
91 " Sha256 Hash = %s\n"
92 " Metadata Size = 558123\n"
93 " Metadata Signature = metasign\n"
Sen Jiangcdd52062017-05-18 15:33:10 -070094 " Is Delta = %d\n"
Sen Jiang0affc2c2017-02-10 15:55:05 -080095 "%s"
Sen Jiang0affc2c2017-02-10 15:55:05 -080096 "Max Failure Count Per Url = %d\n"
97 "Disable Payload Backoff = %d\n",
98 hash.c_str(),
Sen Jiangcdd52062017-05-18 15:33:10 -070099 response->packages[0].is_delta,
Sen Jiang0affc2c2017-02-10 15:55:05 -0800100 (http_enabled ? expected_urls_both : expected_url_https_only).c_str(),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800101 response->max_failure_count_per_url,
102 response->disable_payload_backoff);
Jay Srinivasan08262882012-12-28 19:29:43 -0800103 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800104}
105
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800106class PayloadStateTest : public ::testing::Test {};
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800107
108TEST(PayloadStateTest, SetResponseWorksWithEmptyResponse) {
109 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700110 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800111 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700112 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700113 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800114 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700115 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800116 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700117 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
118 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
119 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800120 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700121 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800122 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700123 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800124 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700125 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800126 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700127 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800128 .Times(AtLeast(1));
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700129 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800130 .Times(AtLeast(1));
Chris Sosabe45bef2013-04-09 18:25:12 -0700131 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800132 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700133 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800134 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800135 string stored_response_sign = payload_state.GetResponseSignature();
Sen Jiang0affc2c2017-02-10 15:55:05 -0800136 string expected_response_sign =
Sen Jiang0affc2c2017-02-10 15:55:05 -0800137 "Max Failure Count Per Url = 0\n"
138 "Disable Payload Backoff = 0\n";
Jay Srinivasan08262882012-12-28 19:29:43 -0800139 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700140 EXPECT_EQ("", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800141 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
142 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700143 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800144}
145
146TEST(PayloadStateTest, SetResponseWorksWithSingleUrl) {
147 OmahaResponse response;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800148 response.packages.push_back({.payload_urls = {"https://single.url.test"},
149 .size = 123456789,
150 .metadata_size = 58123,
151 .metadata_signature = "msign",
152 .hash = "hash"});
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700153 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800154 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700155 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700156 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Chris Sosabe45bef2013-04-09 18:25:12 -0700157 .Times(AtLeast(1));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800158 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
159 .Times(AtLeast(1));
160 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
161 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
162 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
163 .Times(AtLeast(1));
164 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
165 .Times(AtLeast(1));
166 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
167 .Times(AtLeast(1));
168 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
169 .Times(AtLeast(1));
170 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
171 .Times(AtLeast(1));
172 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
173 .Times(AtLeast(1));
174 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800175 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700176 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800177 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800178 string stored_response_sign = payload_state.GetResponseSignature();
Sen Jiang0affc2c2017-02-10 15:55:05 -0800179 string expected_response_sign =
180 "Payload 0:\n"
181 " Size = 123456789\n"
182 " Sha256 Hash = hash\n"
183 " Metadata Size = 58123\n"
184 " Metadata Signature = msign\n"
Sen Jiangcdd52062017-05-18 15:33:10 -0700185 " Is Delta = 0\n"
Sen Jiang0affc2c2017-02-10 15:55:05 -0800186 " NumURLs = 1\n"
187 " Candidate Url0 = https://single.url.test\n"
Sen Jiang0affc2c2017-02-10 15:55:05 -0800188 "Max Failure Count Per Url = 0\n"
189 "Disable Payload Backoff = 0\n";
Jay Srinivasan08262882012-12-28 19:29:43 -0800190 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700191 EXPECT_EQ("https://single.url.test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800192 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
193 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700194 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800195}
196
197TEST(PayloadStateTest, SetResponseWorksWithMultipleUrls) {
198 OmahaResponse response;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800199 response.packages.push_back({.payload_urls = {"http://multiple.url.test",
200 "https://multiple.url.test"},
201 .size = 523456789,
202 .metadata_size = 558123,
203 .metadata_signature = "metasign",
204 .hash = "rhash"});
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700205 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800206 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700207 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700208 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Chris Sosabe45bef2013-04-09 18:25:12 -0700209 .Times(AtLeast(1));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800210 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
211 .Times(AtLeast(1));
212 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, 0)).Times(AtLeast(1));
213 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
214 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
215 .Times(AtLeast(1));
216 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
217 .Times(AtLeast(1));
218 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
219 .Times(AtLeast(1));
220 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
221 .Times(AtLeast(1));
222 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan53173b92013-05-17 17:13:01 -0700223
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800224 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700225 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800226 payload_state.SetResponse(response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800227 string stored_response_sign = payload_state.GetResponseSignature();
Sen Jiang0affc2c2017-02-10 15:55:05 -0800228 string expected_response_sign =
229 "Payload 0:\n"
230 " Size = 523456789\n"
231 " Sha256 Hash = rhash\n"
232 " Metadata Size = 558123\n"
233 " Metadata Signature = metasign\n"
Sen Jiangcdd52062017-05-18 15:33:10 -0700234 " Is Delta = 0\n"
Sen Jiang0affc2c2017-02-10 15:55:05 -0800235 " NumURLs = 2\n"
236 " Candidate Url0 = http://multiple.url.test\n"
237 " Candidate Url1 = https://multiple.url.test\n"
Sen Jiang0affc2c2017-02-10 15:55:05 -0800238 "Max Failure Count Per Url = 0\n"
239 "Disable Payload Backoff = 0\n";
Jay Srinivasan08262882012-12-28 19:29:43 -0800240 EXPECT_EQ(expected_response_sign, stored_response_sign);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700241 EXPECT_EQ("http://multiple.url.test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800242 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
243 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
David Zeuthena573d6f2013-06-14 16:13:36 -0700244 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800245}
246
247TEST(PayloadStateTest, CanAdvanceUrlIndexCorrectly) {
248 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700249 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800250 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800251 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800252
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700253 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800254 // Payload attempt should start with 0 and then advance to 1.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700255 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800256 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700257 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800258 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700259 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800260 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700261 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800262 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700263 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2));
David Zeuthen9a017f22013-04-11 16:10:26 -0700264
Chris Sosabe45bef2013-04-09 18:25:12 -0700265 // Reboots will be set
266 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, _)).Times(AtLeast(1));
267
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800268 // Url index should go from 0 to 1 twice.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700269 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
270 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800271
272 // Failure count should be called each times url index is set, so that's
273 // 4 times for this test.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700274 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800275 .Times(AtLeast(4));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800276
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700277 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800278
279 // This does a SetResponse which causes all the states to be set to 0 for
280 // the first time.
Sen Jiangcdd52062017-05-18 15:33:10 -0700281 SetupPayloadStateWith2Urls(
282 "Hash1235", true, false, &payload_state, &response);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700283 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800284
285 // Verify that on the first error, the URL index advances to 1.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700286 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800287 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700288 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800289
290 // Verify that on the next error, the URL index wraps around to 0.
291 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700292 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800293
294 // Verify that on the next error, it again advances to 1.
295 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700296 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
David Zeuthencc6f9962013-04-18 11:57:24 -0700297
298 // Verify that we switched URLs three times
Alex Deymo80f70ff2016-02-10 16:08:11 -0800299 EXPECT_EQ(3U, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800300}
301
302TEST(PayloadStateTest, NewResponseResetsPayloadState) {
303 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700304 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800305 PayloadState payload_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800306
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700307 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800308
309 // Set the first response.
Sen Jiangcdd52062017-05-18 15:33:10 -0700310 SetupPayloadStateWith2Urls(
311 "Hash5823", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700312 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800313
314 // Advance the URL index to 1 by faking an error.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700315 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800316 payload_state.UpdateFailed(error);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700317 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800318 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800319
320 // Now, slightly change the response and set it again.
Sen Jiangcdd52062017-05-18 15:33:10 -0700321 SetupPayloadStateWith2Urls(
322 "Hash8225", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700323 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800324
Alex Deymob33b0f02013-08-08 21:10:02 -0700325 // Fake an error again.
326 payload_state.UpdateFailed(error);
327 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800328 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Alex Deymob33b0f02013-08-08 21:10:02 -0700329
Alex Deymob33b0f02013-08-08 21:10:02 -0700330 // Return a third different response.
Sen Jiangcdd52062017-05-18 15:33:10 -0700331 SetupPayloadStateWith2Urls(
332 "Hash9999", true, false, &payload_state, &response);
Alex Deymob33b0f02013-08-08 21:10:02 -0700333 EXPECT_EQ(3, payload_state.GetNumResponsesSeen());
334
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800335 // Make sure the url index was reset to 0 because of the new response.
Jay Srinivasan53173b92013-05-17 17:13:01 -0700336 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800337 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
338 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
339 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700340 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800341 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700342 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800343 EXPECT_EQ(
344 0U, payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
345 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700346 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800347}
348
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800349TEST(PayloadStateTest, AllCountersGetUpdatedProperlyOnErrorCodesAndEvents) {
350 OmahaResponse response;
351 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700352 FakeSystemState fake_system_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700353 int progress_bytes = 100;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800354 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800355
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700356 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700357 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800358 .Times(AtLeast(2));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700359 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800360 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700361 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 2))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800362 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800363
Alex Deymo820cc702013-06-28 15:43:46 -0700364 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800365 .Times(AtLeast(2));
Alex Deymo820cc702013-06-28 15:43:46 -0700366 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800367 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700368 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 2))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800369 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700370
Jay Srinivasan19409b72013-04-12 19:23:36 -0700371 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(4));
Jay Srinivasan08262882012-12-28 19:29:43 -0800372
Jay Srinivasan19409b72013-04-12 19:23:36 -0700373 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(4));
374 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 1)).Times(AtLeast(2));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800375
Jay Srinivasan19409b72013-04-12 19:23:36 -0700376 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800377 .Times(AtLeast(7));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700378 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800379 .Times(AtLeast(2));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700380 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 2))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800381 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800382
Jay Srinivasan19409b72013-04-12 19:23:36 -0700383 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateTimestampStart, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800384 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700385 EXPECT_CALL(*prefs, SetInt64(kPrefsUpdateDurationUptime, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800386 .Times(AtLeast(1));
David Zeuthen9a017f22013-04-11 16:10:26 -0700387
Jay Srinivasan19409b72013-04-12 19:23:36 -0700388 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttps, 0))
Chris Sosabe45bef2013-04-09 18:25:12 -0700389 .Times(AtLeast(1));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800390 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, 0))
391 .Times(AtLeast(1));
392 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttpPeer, 0))
393 .Times(AtLeast(1));
394 EXPECT_CALL(*prefs, SetInt64(kCurrentBytesDownloadedFromHttp, progress_bytes))
395 .Times(AtLeast(1));
396 EXPECT_CALL(*prefs, SetInt64(kTotalBytesDownloadedFromHttp, progress_bytes))
397 .Times(AtLeast(1));
398 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 0)).Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700399
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700400 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800401
Sen Jiangcdd52062017-05-18 15:33:10 -0700402 SetupPayloadStateWith2Urls(
403 "Hash5873", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700404 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800405
406 // This should advance the URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700407 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800408 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700409 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700410 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800411 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
412 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800413
414 // This should advance the failure count only.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700415 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800416 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700417 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700418 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800419 EXPECT_EQ(1U, payload_state.GetUrlFailureCount());
420 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800421
422 // This should advance the failure count only.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700423 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800424 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700425 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700426 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800427 EXPECT_EQ(2U, payload_state.GetUrlFailureCount());
428 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800429
430 // This should advance the URL index as we've reached the
431 // max failure count and reset the failure count for the new URL index.
432 // This should also wrap around the URL index and thus cause the payload
433 // attempt number to be incremented.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700434 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800435 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700436 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700437 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800438 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
439 EXPECT_EQ(2U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800440 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800441
442 // This should advance the URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700443 payload_state.UpdateFailed(ErrorCode::kPayloadHashMismatchError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800444 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700445 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700446 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800447 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
448 EXPECT_EQ(3U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800449 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800450
451 // This should advance the URL index and payload attempt number due to
452 // wrap-around of URL index.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700453 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMissingError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800454 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700455 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700456 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800457 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
458 EXPECT_EQ(4U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800459 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800460
461 // This HTTP error code should only increase the failure count.
David Zeuthena99981f2013-04-29 13:42:47 -0700462 payload_state.UpdateFailed(static_cast<ErrorCode>(
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700463 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 404));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800464 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700465 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700466 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800467 EXPECT_EQ(1U, payload_state.GetUrlFailureCount());
468 EXPECT_EQ(4U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800469 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800470
471 // And that failure count should be reset when we download some bytes
472 // afterwards.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700473 payload_state.DownloadProgress(progress_bytes);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800474 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700475 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700476 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800477 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
478 EXPECT_EQ(4U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800479 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800480
481 // Now, slightly change the response and set it again.
Sen Jiangcdd52062017-05-18 15:33:10 -0700482 SetupPayloadStateWith2Urls(
483 "Hash8532", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700484 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800485
486 // Make sure the url index was reset to 0 because of the new response.
487 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700488 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700489 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800490 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
491 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
Jay Srinivasan08262882012-12-28 19:29:43 -0800492 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800493}
494
Alex Deymo820cc702013-06-28 15:43:46 -0700495TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulFullDownload) {
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800496 OmahaResponse response;
497 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700498 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800499 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800500
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700501 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700502 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800503 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700504 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800505 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800506
Alex Deymo820cc702013-06-28 15:43:46 -0700507 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800508 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700509 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800510 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700511
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800512 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(AtLeast(2));
Jay Srinivasan08262882012-12-28 19:29:43 -0800513
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800514 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700515 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800516 .Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800517
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700518 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800519
Sen Jiangcdd52062017-05-18 15:33:10 -0700520 SetupPayloadStateWith2Urls(
521 "Hash8593", true, false, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800522
523 // This should just advance the payload attempt number;
524 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700525 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800526 payload_state.DownloadComplete();
527 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700528 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
529 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800530 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
531 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
Alex Deymo820cc702013-06-28 15:43:46 -0700532}
533
534TEST(PayloadStateTest, PayloadAttemptNumberIncreasesOnSuccessfulDeltaDownload) {
535 OmahaResponse response;
Alex Deymo820cc702013-06-28 15:43:46 -0700536 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700537 FakeSystemState fake_system_state;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800538 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Deymo820cc702013-06-28 15:43:46 -0700539
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700540 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AnyNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700541 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800542 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700543 EXPECT_CALL(*prefs, SetInt64(kPrefsPayloadAttemptNumber, 1))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800544 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700545
546 // kPrefsFullPayloadAttemptNumber is not incremented for delta payloads.
547 EXPECT_CALL(*prefs, SetInt64(kPrefsFullPayloadAttemptNumber, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800548 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700549
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800550 EXPECT_CALL(*prefs, SetInt64(kPrefsBackoffExpiryTime, _)).Times(1);
Alex Deymo820cc702013-06-28 15:43:46 -0700551
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800552 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlIndex, 0)).Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700553 EXPECT_CALL(*prefs, SetInt64(kPrefsCurrentUrlFailureCount, 0))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800554 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700555
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700556 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo820cc702013-06-28 15:43:46 -0700557
Sen Jiangcdd52062017-05-18 15:33:10 -0700558 SetupPayloadStateWith2Urls("Hash8593", true, true, &payload_state, &response);
Alex Deymo820cc702013-06-28 15:43:46 -0700559
560 // This should just advance the payload attempt number;
561 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
562 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
563 payload_state.DownloadComplete();
564 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
565 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700566 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800567 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
568 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800569}
570
571TEST(PayloadStateTest, SetResponseResetsInvalidUrlIndex) {
572 OmahaResponse response;
573 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700574 FakeSystemState fake_system_state;
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800575
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700576 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700577 SetupPayloadStateWith2Urls(
578 "Hash4427", true, false, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800579
580 // Generate enough events to advance URL index, failure count and
581 // payload attempt number all to 1.
582 payload_state.DownloadComplete();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700583 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
584 payload_state.UpdateFailed(ErrorCode::kDownloadTransferError);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800585 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700586 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700587 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800588 EXPECT_EQ(1U, payload_state.GetUrlFailureCount());
589 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800590
591 // Now, simulate a corrupted url index on persisted store which gets
592 // loaded when update_engine restarts. Using a different prefs object
593 // so as to not bother accounting for the uninteresting calls above.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700594 FakeSystemState fake_system_state2;
Alex Deymo8427b4a2014-11-05 14:00:32 -0800595 NiceMock<MockPrefs>* prefs2 = fake_system_state2.mock_prefs();
Jay Srinivasan19409b72013-04-12 19:23:36 -0700596 EXPECT_CALL(*prefs2, Exists(_)).WillRepeatedly(Return(true));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700597 EXPECT_CALL(*prefs2, GetInt64(_, _)).Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700598 EXPECT_CALL(*prefs2, GetInt64(kPrefsPayloadAttemptNumber, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800599 .Times(AtLeast(1));
Alex Deymo820cc702013-06-28 15:43:46 -0700600 EXPECT_CALL(*prefs2, GetInt64(kPrefsFullPayloadAttemptNumber, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800601 .Times(AtLeast(1));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700602 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlIndex, _))
Ben Chan672c1f52017-10-23 15:41:39 -0700603 .WillRepeatedly(DoAll(SetArgPointee<1>(2), Return(true)));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700604 EXPECT_CALL(*prefs2, GetInt64(kPrefsCurrentUrlFailureCount, _))
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800605 .Times(AtLeast(1));
606 EXPECT_CALL(*prefs2, GetInt64(kPrefsUrlSwitchCount, _)).Times(AtLeast(1));
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800607
608 // Note: This will be a different payload object, but the response should
609 // have the same hash as before so as to not trivially reset because the
610 // response was different. We want to specifically test that even if the
611 // response is same, we should reset the state if we find it corrupted.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700612 EXPECT_TRUE(payload_state.Initialize(&fake_system_state2));
Sen Jiangcdd52062017-05-18 15:33:10 -0700613 SetupPayloadStateWith2Urls(
614 "Hash4427", true, false, &payload_state, &response);
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800615
616 // Make sure all counters get reset to 0 because of the corrupted URL index
617 // we supplied above.
618 EXPECT_EQ(0, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700619 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan53173b92013-05-17 17:13:01 -0700620 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -0800621 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
622 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
Jay Srinivasan2b5a0f02012-12-19 17:25:56 -0800623}
Jay Srinivasan08262882012-12-28 19:29:43 -0800624
Chris Sosa20f005c2013-09-05 13:53:08 -0700625TEST(PayloadStateTest, NoBackoffInteractiveChecks) {
626 OmahaResponse response;
Chris Sosa20f005c2013-09-05 13:53:08 -0700627 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700628 FakeSystemState fake_system_state;
629 OmahaRequestParams params(&fake_system_state);
Amin Hassanied37d682018-04-06 13:22:00 -0700630 params.Init("", "", true); // interactive = True.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700631 fake_system_state.set_request_params(&params);
Chris Sosa20f005c2013-09-05 13:53:08 -0700632
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700633 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700634 SetupPayloadStateWith2Urls(
635 "Hash6437", true, false, &payload_state, &response);
Chris Sosa20f005c2013-09-05 13:53:08 -0700636
637 // Simulate two failures (enough to cause payload backoff) and check
638 // again that we're ready to re-download without any backoff as this is
639 // an interactive check.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700640 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
641 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Chris Sosa20f005c2013-09-05 13:53:08 -0700642 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
643 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
644 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
645 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
646}
647
648TEST(PayloadStateTest, NoBackoffForP2PUpdates) {
649 OmahaResponse response;
Chris Sosa20f005c2013-09-05 13:53:08 -0700650 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700651 FakeSystemState fake_system_state;
652 OmahaRequestParams params(&fake_system_state);
Amin Hassanied37d682018-04-06 13:22:00 -0700653 params.Init("", "", false); // interactive = False.
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700654 fake_system_state.set_request_params(&params);
Chris Sosa20f005c2013-09-05 13:53:08 -0700655
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700656 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700657 SetupPayloadStateWith2Urls(
658 "Hash6437", true, false, &payload_state, &response);
Chris Sosa20f005c2013-09-05 13:53:08 -0700659
660 // Simulate two failures (enough to cause payload backoff) and check
661 // again that we're ready to re-download without any backoff as this is
662 // an interactive check.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700663 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
664 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Chris Sosa20f005c2013-09-05 13:53:08 -0700665 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
666 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
667 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
668 // Set p2p url.
Gilad Arnold74b5f552014-10-07 08:17:16 -0700669 payload_state.SetUsingP2PForDownloading(true);
670 payload_state.SetP2PUrl("http://mypeer:52909/path/to/file");
Chris Sosa20f005c2013-09-05 13:53:08 -0700671 // Should not backoff for p2p updates.
672 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
673
Gilad Arnold74b5f552014-10-07 08:17:16 -0700674 payload_state.SetP2PUrl("");
Chris Sosa20f005c2013-09-05 13:53:08 -0700675 // No actual p2p update if no url is provided.
676 EXPECT_TRUE(payload_state.ShouldBackoffDownload());
677}
678
Jay Srinivasan08262882012-12-28 19:29:43 -0800679TEST(PayloadStateTest, NoBackoffForDeltaPayloads) {
680 OmahaResponse response;
Jay Srinivasan08262882012-12-28 19:29:43 -0800681 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700682 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800683
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700684 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700685 SetupPayloadStateWith2Urls("Hash6437", true, true, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800686
687 // Simulate a successful download and see that we're ready to download
688 // again without any backoff as this is a delta payload.
689 payload_state.DownloadComplete();
Alex Deymo820cc702013-06-28 15:43:46 -0700690 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
691 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800692 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
693
694 // Simulate two failures (enough to cause payload backoff) and check
695 // again that we're ready to re-download without any backoff as this is
696 // a delta payload.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700697 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
698 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700699 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo820cc702013-06-28 15:43:46 -0700700 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
701 EXPECT_EQ(0, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800702 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
703}
704
705static void CheckPayloadBackoffState(PayloadState* payload_state,
706 int expected_attempt_number,
707 TimeDelta expected_days) {
708 payload_state->DownloadComplete();
Alex Deymo820cc702013-06-28 15:43:46 -0700709 EXPECT_EQ(expected_attempt_number,
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800710 payload_state->GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800711 EXPECT_TRUE(payload_state->ShouldBackoffDownload());
712 Time backoff_expiry_time = payload_state->GetBackoffExpiryTime();
713 // Add 1 hour extra to the 6 hour fuzz check to tolerate edge cases.
714 TimeDelta max_fuzz_delta = TimeDelta::FromHours(7);
715 Time expected_min_time = Time::Now() + expected_days - max_fuzz_delta;
716 Time expected_max_time = Time::Now() + expected_days + max_fuzz_delta;
717 EXPECT_LT(expected_min_time.ToInternalValue(),
718 backoff_expiry_time.ToInternalValue());
719 EXPECT_GT(expected_max_time.ToInternalValue(),
720 backoff_expiry_time.ToInternalValue());
721}
722
723TEST(PayloadStateTest, BackoffPeriodsAreInCorrectRange) {
724 OmahaResponse response;
Jay Srinivasan08262882012-12-28 19:29:43 -0800725 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700726 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800727
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700728 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700729 SetupPayloadStateWith2Urls(
730 "Hash8939", true, false, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800731
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800732 CheckPayloadBackoffState(&payload_state, 1, TimeDelta::FromDays(1));
733 CheckPayloadBackoffState(&payload_state, 2, TimeDelta::FromDays(2));
734 CheckPayloadBackoffState(&payload_state, 3, TimeDelta::FromDays(4));
735 CheckPayloadBackoffState(&payload_state, 4, TimeDelta::FromDays(8));
736 CheckPayloadBackoffState(&payload_state, 5, TimeDelta::FromDays(16));
737 CheckPayloadBackoffState(&payload_state, 6, TimeDelta::FromDays(16));
738 CheckPayloadBackoffState(&payload_state, 7, TimeDelta::FromDays(16));
739 CheckPayloadBackoffState(&payload_state, 8, TimeDelta::FromDays(16));
740 CheckPayloadBackoffState(&payload_state, 9, TimeDelta::FromDays(16));
741 CheckPayloadBackoffState(&payload_state, 10, TimeDelta::FromDays(16));
Jay Srinivasan08262882012-12-28 19:29:43 -0800742}
743
744TEST(PayloadStateTest, BackoffLogicCanBeDisabled) {
745 OmahaResponse response;
746 response.disable_payload_backoff = true;
747 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700748 FakeSystemState fake_system_state;
Jay Srinivasan08262882012-12-28 19:29:43 -0800749
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700750 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700751 SetupPayloadStateWith2Urls(
752 "Hash8939", true, false, &payload_state, &response);
Jay Srinivasan08262882012-12-28 19:29:43 -0800753
754 // Simulate a successful download and see that we are ready to download
755 // again without any backoff.
756 payload_state.DownloadComplete();
757 EXPECT_EQ(1, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700758 EXPECT_EQ(1, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800759 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
760
761 // Test again, this time by simulating two errors that would cause
762 // the payload attempt number to increment due to wrap around. And
763 // check that we are still ready to re-download without any backoff.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700764 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
765 payload_state.UpdateFailed(ErrorCode::kDownloadMetadataSignatureMismatch);
Jay Srinivasan08262882012-12-28 19:29:43 -0800766 EXPECT_EQ(2, payload_state.GetPayloadAttemptNumber());
Alex Deymo820cc702013-06-28 15:43:46 -0700767 EXPECT_EQ(2, payload_state.GetFullPayloadAttemptNumber());
Jay Srinivasan08262882012-12-28 19:29:43 -0800768 EXPECT_FALSE(payload_state.ShouldBackoffDownload());
769}
770
Jay Srinivasan19409b72013-04-12 19:23:36 -0700771TEST(PayloadStateTest, BytesDownloadedMetricsGetAddedToCorrectSources) {
772 OmahaResponse response;
773 response.disable_payload_backoff = true;
774 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700775 FakeSystemState fake_system_state;
Alex Deymo80f70ff2016-02-10 16:08:11 -0800776 uint64_t https_total = 0;
777 uint64_t http_total = 0;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700778
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700779 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700780 SetupPayloadStateWith2Urls(
781 "Hash3286", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700782 EXPECT_EQ(1, payload_state.GetNumResponsesSeen());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700783
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700784 // Simulate a previous attempt with in order to set an initial non-zero value
785 // for the total bytes downloaded for HTTP.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800786 uint64_t prev_chunk = 323456789;
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700787 http_total += prev_chunk;
788 payload_state.DownloadProgress(prev_chunk);
789
790 // Ensure that the initial values for HTTP reflect this attempt.
791 EXPECT_EQ(prev_chunk,
792 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
793 EXPECT_EQ(http_total,
794 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
795
796 // Change the response hash so as to simulate a new response which will
797 // reset the current bytes downloaded, but not the total bytes downloaded.
Sen Jiangcdd52062017-05-18 15:33:10 -0700798 SetupPayloadStateWith2Urls(
799 "Hash9904", true, false, &payload_state, &response);
David Zeuthena573d6f2013-06-14 16:13:36 -0700800 EXPECT_EQ(2, payload_state.GetNumResponsesSeen());
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700801
802 // First, simulate successful download of a few bytes over HTTP.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800803 uint64_t first_chunk = 5000000;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700804 http_total += first_chunk;
805 payload_state.DownloadProgress(first_chunk);
Jay Srinivasan53173b92013-05-17 17:13:01 -0700806 // Test that first all progress is made on HTTP and none on HTTPS.
Jay Srinivasan19409b72013-04-12 19:23:36 -0700807 EXPECT_EQ(first_chunk,
808 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
809 EXPECT_EQ(http_total,
810 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800811 EXPECT_EQ(
812 0U, payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700813 EXPECT_EQ(https_total,
814 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
815
816 // Simulate an error that'll cause the url index to point to https.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700817 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700818 payload_state.UpdateFailed(error);
819
Jay Srinivasan53173b92013-05-17 17:13:01 -0700820 // Test that no new progress is made on HTTP and new progress is on HTTPS.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800821 uint64_t second_chunk = 23456789;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700822 https_total += second_chunk;
823 payload_state.DownloadProgress(second_chunk);
824 EXPECT_EQ(first_chunk,
825 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
826 EXPECT_EQ(http_total,
827 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800828 EXPECT_EQ(
829 second_chunk,
830 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700831 EXPECT_EQ(https_total,
832 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
833
834 // Simulate error to go back to http.
835 payload_state.UpdateFailed(error);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800836 uint64_t third_chunk = 32345678;
837 uint64_t http_chunk = first_chunk + third_chunk;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700838 http_total += third_chunk;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700839 payload_state.DownloadProgress(third_chunk);
840
841 // Test that third chunk is again back on HTTP. HTTPS remains on second chunk.
842 EXPECT_EQ(http_chunk,
843 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
Jay Srinivasandbd9ea22013-04-22 17:45:19 -0700844 EXPECT_EQ(http_total,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700845 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800846 EXPECT_EQ(
847 second_chunk,
848 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700849 EXPECT_EQ(https_total,
850 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
851
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700852 // Simulate error (will cause URL switch), set p2p is to be used and
853 // then do 42MB worth of progress
854 payload_state.UpdateFailed(error);
855 payload_state.SetUsingP2PForDownloading(true);
Alex Deymo80f70ff2016-02-10 16:08:11 -0800856 uint64_t p2p_total = 42 * 1000 * 1000;
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700857 payload_state.DownloadProgress(p2p_total);
858
859 EXPECT_EQ(p2p_total,
860 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpPeer));
861
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700862 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
863 ReportSuccessfulUpdateMetrics(
Sen Jiang8712e962018-05-08 12:12:28 -0700864 1, _, kPayloadTypeFull, _, _, 314, _, _, _, 3));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700865
866 payload_state.UpdateSucceeded();
867
868 // Make sure the metrics are reset after a successful update.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800869 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700870 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800871 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700872 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800873 EXPECT_EQ(
874 0U, payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800875 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700876 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
David Zeuthena573d6f2013-06-14 16:13:36 -0700877 EXPECT_EQ(0, payload_state.GetNumResponsesSeen());
Jay Srinivasan19409b72013-04-12 19:23:36 -0700878}
879
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700880TEST(PayloadStateTest, DownloadSourcesUsedIsCorrect) {
881 OmahaResponse response;
882 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700883 FakeSystemState fake_system_state;
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700884
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700885 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -0700886 SetupPayloadStateWith2Urls(
887 "Hash3286", true, false, &payload_state, &response);
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700888
889 // Simulate progress in order to mark HTTP as one of the sources used.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800890 uint64_t num_bytes = 42 * 1000 * 1000;
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700891 payload_state.DownloadProgress(num_bytes);
892
893 // Check that this was done via HTTP.
894 EXPECT_EQ(num_bytes,
895 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
896 EXPECT_EQ(num_bytes,
897 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
898
899 // Check that only HTTP is reported as a download source.
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700900 int64_t total_bytes[kNumDownloadSources] = {};
901 total_bytes[kDownloadSourceHttpServer] = num_bytes;
902
903 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
904 ReportSuccessfulUpdateMetrics(
Tianjie Xud4777a12017-10-24 14:54:18 -0700905 _,
906 _,
907 _,
908 _,
909 test_utils::DownloadSourceMatcher(total_bytes),
910 _,
911 _,
912 _,
Sen Jiang8712e962018-05-08 12:12:28 -0700913 _,
Tianjie Xud4777a12017-10-24 14:54:18 -0700914 _))
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700915 .Times(1);
David Zeuthenbb8bdc72013-09-03 13:43:48 -0700916
917 payload_state.UpdateSucceeded();
918}
919
Jay Srinivasan19409b72013-04-12 19:23:36 -0700920TEST(PayloadStateTest, RestartingUpdateResetsMetrics) {
921 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700922 FakeSystemState fake_system_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700923 PayloadState payload_state;
924
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700925 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Jay Srinivasan19409b72013-04-12 19:23:36 -0700926
927 // Set the first response.
Sen Jiangcdd52062017-05-18 15:33:10 -0700928 SetupPayloadStateWith2Urls(
929 "Hash5823", true, false, &payload_state, &response);
Jay Srinivasan19409b72013-04-12 19:23:36 -0700930
Alex Deymo80f70ff2016-02-10 16:08:11 -0800931 uint64_t num_bytes = 10000;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700932 payload_state.DownloadProgress(num_bytes);
933 EXPECT_EQ(num_bytes,
934 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
935 EXPECT_EQ(num_bytes,
936 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
Amin Hassani7cc8bb02019-01-14 16:29:47 -0800937 EXPECT_EQ(
938 0U, payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpsServer));
Alex Deymo80f70ff2016-02-10 16:08:11 -0800939 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700940 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpsServer));
941
942 payload_state.UpdateRestarted();
943 // Make sure the current bytes downloaded is reset, but not the total bytes.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800944 EXPECT_EQ(0U,
Jay Srinivasan19409b72013-04-12 19:23:36 -0700945 payload_state.GetCurrentBytesDownloaded(kDownloadSourceHttpServer));
946 EXPECT_EQ(num_bytes,
947 payload_state.GetTotalBytesDownloaded(kDownloadSourceHttpServer));
948}
949
Chris Sosabe45bef2013-04-09 18:25:12 -0700950TEST(PayloadStateTest, NumRebootsIncrementsCorrectly) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700951 FakeSystemState fake_system_state;
Chris Sosabe45bef2013-04-09 18:25:12 -0700952 PayloadState payload_state;
Jay Srinivasan19409b72013-04-12 19:23:36 -0700953
Alex Deymo8427b4a2014-11-05 14:00:32 -0800954 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700955 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(AtLeast(0));
Chris Sosabe45bef2013-04-09 18:25:12 -0700956 EXPECT_CALL(*prefs, SetInt64(kPrefsNumReboots, 1)).Times(AtLeast(1));
957
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700958 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosabe45bef2013-04-09 18:25:12 -0700959
960 payload_state.UpdateRestarted();
Alex Deymo80f70ff2016-02-10 16:08:11 -0800961 EXPECT_EQ(0U, payload_state.GetNumReboots());
Chris Sosabe45bef2013-04-09 18:25:12 -0700962
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700963 fake_system_state.set_system_rebooted(true);
Chris Sosabe45bef2013-04-09 18:25:12 -0700964 payload_state.UpdateResumed();
965 // Num reboots should be incremented because system rebooted detected.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800966 EXPECT_EQ(1U, payload_state.GetNumReboots());
Chris Sosabe45bef2013-04-09 18:25:12 -0700967
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700968 fake_system_state.set_system_rebooted(false);
Chris Sosabe45bef2013-04-09 18:25:12 -0700969 payload_state.UpdateResumed();
970 // Num reboots should now be 1 as reboot was not detected.
Alex Deymo80f70ff2016-02-10 16:08:11 -0800971 EXPECT_EQ(1U, payload_state.GetNumReboots());
Chris Sosabe45bef2013-04-09 18:25:12 -0700972
973 // Restart the update again to verify we set the num of reboots back to 0.
974 payload_state.UpdateRestarted();
Alex Deymo80f70ff2016-02-10 16:08:11 -0800975 EXPECT_EQ(0U, payload_state.GetNumReboots());
Chris Sosabe45bef2013-04-09 18:25:12 -0700976}
Jay Srinivasan19409b72013-04-12 19:23:36 -0700977
Marton Hunyadye58bddb2018-04-10 20:27:26 +0200978TEST(PayloadStateTest, RollbackHappened) {
979 FakeSystemState fake_system_state;
980 PayloadState payload_state;
981
982 NiceMock<MockPrefs>* mock_powerwash_safe_prefs =
983 fake_system_state.mock_powerwash_safe_prefs();
984 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
985
986 // Verify pre-conditions are good.
987 EXPECT_FALSE(payload_state.GetRollbackHappened());
988
989 // Set to true.
990 EXPECT_CALL(*mock_powerwash_safe_prefs,
991 SetBoolean(kPrefsRollbackHappened, true));
992 payload_state.SetRollbackHappened(true);
993 EXPECT_TRUE(payload_state.GetRollbackHappened());
994
995 // Set to false.
996 EXPECT_CALL(*mock_powerwash_safe_prefs, Delete(kPrefsRollbackHappened));
997 payload_state.SetRollbackHappened(false);
998 EXPECT_FALSE(payload_state.GetRollbackHappened());
999
1000 // Let's verify we can reload it correctly.
1001 EXPECT_CALL(*mock_powerwash_safe_prefs, GetBoolean(kPrefsRollbackHappened, _))
1002 .WillOnce(DoAll(SetArgPointee<1>(true), Return(true)));
1003 EXPECT_CALL(*mock_powerwash_safe_prefs,
1004 SetBoolean(kPrefsRollbackHappened, true));
1005 payload_state.LoadRollbackHappened();
1006 EXPECT_TRUE(payload_state.GetRollbackHappened());
1007}
1008
Chris Sosaaa18e162013-06-20 13:20:30 -07001009TEST(PayloadStateTest, RollbackVersion) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001010 FakeSystemState fake_system_state;
Chris Sosaaa18e162013-06-20 13:20:30 -07001011 PayloadState payload_state;
1012
Alex Deymo8427b4a2014-11-05 14:00:32 -08001013 NiceMock<MockPrefs>* mock_powerwash_safe_prefs =
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001014 fake_system_state.mock_powerwash_safe_prefs();
1015 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosaaa18e162013-06-20 13:20:30 -07001016
1017 // Verify pre-conditions are good.
1018 EXPECT_TRUE(payload_state.GetRollbackVersion().empty());
1019
1020 // Mock out the os version and make sure it's blacklisted correctly.
1021 string rollback_version = "2345.0.0";
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001022 OmahaRequestParams params(&fake_system_state);
Chris Sosaaa18e162013-06-20 13:20:30 -07001023 params.Init(rollback_version, "", false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001024 fake_system_state.set_request_params(&params);
Chris Sosaaa18e162013-06-20 13:20:30 -07001025
Amin Hassani7cc8bb02019-01-14 16:29:47 -08001026 EXPECT_CALL(*mock_powerwash_safe_prefs,
1027 SetString(kPrefsRollbackVersion, rollback_version));
Chris Sosaaa18e162013-06-20 13:20:30 -07001028 payload_state.Rollback();
1029
1030 EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion());
Chris Sosab3dcdb32013-09-04 15:22:12 -07001031
1032 // Change it up a little and verify we load it correctly.
1033 rollback_version = "2345.0.1";
1034 // Let's verify we can reload it correctly.
Amin Hassani7cc8bb02019-01-14 16:29:47 -08001035 EXPECT_CALL(*mock_powerwash_safe_prefs, GetString(kPrefsRollbackVersion, _))
1036 .WillOnce(DoAll(SetArgPointee<1>(rollback_version), Return(true)));
1037 EXPECT_CALL(*mock_powerwash_safe_prefs,
1038 SetString(kPrefsRollbackVersion, rollback_version));
Chris Sosab3dcdb32013-09-04 15:22:12 -07001039 payload_state.LoadRollbackVersion();
1040 EXPECT_EQ(rollback_version, payload_state.GetRollbackVersion());
David Zeuthenafed4a12014-04-09 15:28:44 -07001041
David Zeuthen96197df2014-04-16 12:22:39 -07001042 // Check that we report only UpdateEngine.Rollback.* metrics in
1043 // UpdateSucceeded().
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001044 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1045 ReportRollbackMetrics(metrics::RollbackResult::kSuccess))
1046 .Times(1);
1047
David Zeuthenafed4a12014-04-09 15:28:44 -07001048 payload_state.UpdateSucceeded();
Chris Sosaaa18e162013-06-20 13:20:30 -07001049}
1050
David Zeuthenf413fe52013-04-22 14:04:39 -07001051TEST(PayloadStateTest, DurationsAreCorrect) {
1052 OmahaResponse response;
Sen Jiang0affc2c2017-02-10 15:55:05 -08001053 response.packages.resize(1);
David Zeuthenf413fe52013-04-22 14:04:39 -07001054 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001055 FakeSystemState fake_system_state;
David Zeuthenf413fe52013-04-22 14:04:39 -07001056 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001057 FakePrefs fake_prefs;
David Zeuthenf413fe52013-04-22 14:04:39 -07001058
1059 // Set the clock to a well-known time - 1 second on the wall-clock
1060 // and 2 seconds on the monotonic clock
1061 fake_clock.SetWallclockTime(Time::FromInternalValue(1000000));
1062 fake_clock.SetMonotonicTime(Time::FromInternalValue(2000000));
1063
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001064 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001065 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001066 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthenf413fe52013-04-22 14:04:39 -07001067
1068 // Check that durations are correct for a successful update where
1069 // time has advanced 7 seconds on the wall clock and 4 seconds on
1070 // the monotonic clock.
Sen Jiangcdd52062017-05-18 15:33:10 -07001071 SetupPayloadStateWith2Urls(
1072 "Hash8593", true, false, &payload_state, &response);
David Zeuthenf413fe52013-04-22 14:04:39 -07001073 fake_clock.SetWallclockTime(Time::FromInternalValue(8000000));
1074 fake_clock.SetMonotonicTime(Time::FromInternalValue(6000000));
1075 payload_state.UpdateSucceeded();
1076 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 7000000);
1077 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 4000000);
1078
1079 // Check that durations are reset when a new response comes in.
Sen Jiangcdd52062017-05-18 15:33:10 -07001080 SetupPayloadStateWith2Urls(
1081 "Hash8594", true, false, &payload_state, &response);
David Zeuthenf413fe52013-04-22 14:04:39 -07001082 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 0);
1083 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 0);
1084
1085 // Advance time a bit (10 secs), simulate download progress and
1086 // check that durations are updated.
1087 fake_clock.SetWallclockTime(Time::FromInternalValue(18000000));
1088 fake_clock.SetMonotonicTime(Time::FromInternalValue(16000000));
1089 payload_state.DownloadProgress(10);
1090 EXPECT_EQ(payload_state.GetUpdateDuration().InMicroseconds(), 10000000);
1091 EXPECT_EQ(payload_state.GetUpdateDurationUptime().InMicroseconds(), 10000000);
1092
1093 // Now simulate a reboot by resetting monotonic time (to 5000) and
1094 // creating a new PayloadState object and check that we load the
1095 // durations correctly (e.g. they are the same as before).
1096 fake_clock.SetMonotonicTime(Time::FromInternalValue(5000));
1097 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001098 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
Sen Jiang0affc2c2017-02-10 15:55:05 -08001099 payload_state2.SetResponse(response);
David Zeuthenf413fe52013-04-22 14:04:39 -07001100 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 10000000);
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001101 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),
1102 10000000);
David Zeuthenf413fe52013-04-22 14:04:39 -07001103
1104 // Advance wall-clock by 7 seconds and monotonic clock by 6 seconds
1105 // and check that the durations are increased accordingly.
1106 fake_clock.SetWallclockTime(Time::FromInternalValue(25000000));
1107 fake_clock.SetMonotonicTime(Time::FromInternalValue(6005000));
1108 payload_state2.UpdateSucceeded();
1109 EXPECT_EQ(payload_state2.GetUpdateDuration().InMicroseconds(), 17000000);
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001110 EXPECT_EQ(payload_state2.GetUpdateDurationUptime().InMicroseconds(),
1111 16000000);
David Zeuthenf413fe52013-04-22 14:04:39 -07001112}
1113
David Zeuthene4c58bf2013-06-18 17:26:50 -07001114TEST(PayloadStateTest, RebootAfterSuccessfulUpdateTest) {
1115 OmahaResponse response;
1116 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001117 FakeSystemState fake_system_state;
David Zeuthene4c58bf2013-06-18 17:26:50 -07001118 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001119 FakePrefs fake_prefs;
David Zeuthene4c58bf2013-06-18 17:26:50 -07001120
1121 // Set the clock to a well-known time (t = 30 seconds).
Tianjie Xu90aaa102017-10-10 17:39:03 -07001122 fake_clock.SetMonotonicTime(
1123 Time::FromInternalValue(30 * Time::kMicrosecondsPerSecond));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001124
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001125 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001126 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001127 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001128
1129 // Make the update succeed.
Sen Jiangcdd52062017-05-18 15:33:10 -07001130 SetupPayloadStateWith2Urls(
1131 "Hash8593", true, false, &payload_state, &response);
David Zeuthene4c58bf2013-06-18 17:26:50 -07001132 payload_state.UpdateSucceeded();
1133
1134 // Check that the marker was written.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001135 EXPECT_TRUE(fake_prefs.Exists(kPrefsSystemUpdatedMarker));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001136
1137 // Now simulate a reboot and set the wallclock time to a later point
1138 // (t = 500 seconds). We do this by using a new PayloadState object
1139 // and checking that it emits the right UMA metric with the right
1140 // value.
Tianjie Xu90aaa102017-10-10 17:39:03 -07001141 fake_clock.SetMonotonicTime(
1142 Time::FromInternalValue(500 * Time::kMicrosecondsPerSecond));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001143 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001144 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001145
1146 // Expect 500 - 30 seconds = 470 seconds ~= 7 min 50 sec
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001147 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1148 ReportTimeToReboot(7));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001149 fake_system_state.set_system_rebooted(true);
David Zeuthene4c58bf2013-06-18 17:26:50 -07001150
1151 payload_state2.UpdateEngineStarted();
1152
1153 // Check that the marker was nuked.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001154 EXPECT_FALSE(fake_prefs.Exists(kPrefsSystemUpdatedMarker));
David Zeuthene4c58bf2013-06-18 17:26:50 -07001155}
1156
Alex Deymo569c4242013-07-24 12:01:01 -07001157TEST(PayloadStateTest, RestartAfterCrash) {
1158 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001159 FakeSystemState fake_system_state;
Tianjie Xu1f93d092017-10-09 12:13:29 -07001160 testing::StrictMock<MockMetricsReporter> mock_metrics_reporter;
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001161 fake_system_state.set_metrics_reporter(&mock_metrics_reporter);
Alex Deymo8427b4a2014-11-05 14:00:32 -08001162 NiceMock<MockPrefs>* prefs = fake_system_state.mock_prefs();
Alex Deymo569c4242013-07-24 12:01:01 -07001163
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001164 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo569c4242013-07-24 12:01:01 -07001165
David Zeuthen4e1d1492014-04-25 13:12:27 -07001166 // Only the |kPrefsAttemptInProgress| state variable should be read.
Alex Deymo569c4242013-07-24 12:01:01 -07001167 EXPECT_CALL(*prefs, Exists(_)).Times(0);
1168 EXPECT_CALL(*prefs, SetString(_, _)).Times(0);
1169 EXPECT_CALL(*prefs, SetInt64(_, _)).Times(0);
1170 EXPECT_CALL(*prefs, SetBoolean(_, _)).Times(0);
1171 EXPECT_CALL(*prefs, GetString(_, _)).Times(0);
1172 EXPECT_CALL(*prefs, GetInt64(_, _)).Times(0);
1173 EXPECT_CALL(*prefs, GetBoolean(_, _)).Times(0);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001174 EXPECT_CALL(*prefs, GetBoolean(kPrefsAttemptInProgress, _));
Alex Deymo569c4242013-07-24 12:01:01 -07001175
Alex Deymo569c4242013-07-24 12:01:01 -07001176 // Simulate an update_engine restart without a reboot.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001177 fake_system_state.set_system_rebooted(false);
Alex Deymo569c4242013-07-24 12:01:01 -07001178
1179 payload_state.UpdateEngineStarted();
1180}
1181
David Zeuthen4e1d1492014-04-25 13:12:27 -07001182TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsNoReporting) {
1183 PayloadState payload_state;
1184 FakeSystemState fake_system_state;
1185
1186 // If there's no marker at startup, ensure we don't report a metric.
1187 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001188 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1189 ReportAbnormallyTerminatedUpdateAttemptMetrics())
1190 .Times(0);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001191 payload_state.UpdateEngineStarted();
1192}
1193
1194TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsReported) {
1195 PayloadState payload_state;
1196 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001197 FakePrefs fake_prefs;
David Zeuthen4e1d1492014-04-25 13:12:27 -07001198
1199 // If we have a marker at startup, ensure it's reported and the
1200 // marker is then cleared.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001201 fake_system_state.set_prefs(&fake_prefs);
1202 fake_prefs.SetBoolean(kPrefsAttemptInProgress, true);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001203
1204 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
1205
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001206 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1207 ReportAbnormallyTerminatedUpdateAttemptMetrics())
1208 .Times(1);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001209 payload_state.UpdateEngineStarted();
1210
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001211 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001212}
1213
1214TEST(PayloadStateTest, AbnormalTerminationAttemptMetricsClearedOnSucceess) {
1215 PayloadState payload_state;
1216 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001217 FakePrefs fake_prefs;
David Zeuthen4e1d1492014-04-25 13:12:27 -07001218
1219 // Make sure the marker is written and cleared during an attempt and
1220 // also that we DO NOT emit the metric (since the attempt didn't end
1221 // abnormally).
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001222 fake_system_state.set_prefs(&fake_prefs);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001223 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiang0affc2c2017-02-10 15:55:05 -08001224 OmahaResponse response;
1225 response.packages.resize(1);
1226 payload_state.SetResponse(response);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001227
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001228 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1229 ReportAbnormallyTerminatedUpdateAttemptMetrics())
1230 .Times(0);
David Zeuthen4e1d1492014-04-25 13:12:27 -07001231
1232 // Attempt not in progress, should be clear.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001233 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001234
1235 payload_state.UpdateRestarted();
1236
1237 // Attempt not in progress, should be set.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001238 EXPECT_TRUE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001239
1240 payload_state.UpdateSucceeded();
1241
1242 // Attempt not in progress, should be clear.
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001243 EXPECT_FALSE(fake_prefs.Exists(kPrefsAttemptInProgress));
David Zeuthen4e1d1492014-04-25 13:12:27 -07001244}
1245
Jay Srinivasan53173b92013-05-17 17:13:01 -07001246TEST(PayloadStateTest, CandidateUrlsComputedCorrectly) {
1247 OmahaResponse response;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001248 FakeSystemState fake_system_state;
Jay Srinivasan53173b92013-05-17 17:13:01 -07001249 PayloadState payload_state;
1250
Jay Srinivasan53173b92013-05-17 17:13:01 -07001251 policy::MockDevicePolicy disable_http_policy;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001252 fake_system_state.set_device_policy(&disable_http_policy);
1253 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Chris Sosaf7d80042013-08-22 16:45:17 -07001254
1255 // Test with no device policy. Should default to allowing http.
1256 EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_))
1257 .WillRepeatedly(Return(false));
1258
1259 // Set the first response.
Sen Jiangcdd52062017-05-18 15:33:10 -07001260 SetupPayloadStateWith2Urls(
1261 "Hash8433", true, false, &payload_state, &response);
Chris Sosaf7d80042013-08-22 16:45:17 -07001262
1263 // Check that we use the HTTP URL since there is no value set for allowing
1264 // http.
1265 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
1266
1267 // Test with device policy not allowing http updates.
Jay Srinivasan53173b92013-05-17 17:13:01 -07001268 EXPECT_CALL(disable_http_policy, GetHttpDownloadsEnabled(_))
Ben Chan672c1f52017-10-23 15:41:39 -07001269 .WillRepeatedly(DoAll(SetArgPointee<0>(false), Return(true)));
Jay Srinivasan53173b92013-05-17 17:13:01 -07001270
Chris Sosaf7d80042013-08-22 16:45:17 -07001271 // Reset state and set again.
Sen Jiangcdd52062017-05-18 15:33:10 -07001272 SetupPayloadStateWith2Urls(
1273 "Hash8433", false, false, &payload_state, &response);
Jay Srinivasan53173b92013-05-17 17:13:01 -07001274
1275 // Check that we skip the HTTP URL and use only the HTTPS url.
1276 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1277
1278 // Advance the URL index to 1 by faking an error.
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001279 ErrorCode error = ErrorCode::kDownloadMetadataSignatureMismatch;
Jay Srinivasan53173b92013-05-17 17:13:01 -07001280 payload_state.UpdateFailed(error);
1281
1282 // Check that we still skip the HTTP URL and use only the HTTPS url.
1283 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -08001284 EXPECT_EQ(0U, payload_state.GetUrlSwitchCount());
Jay Srinivasan53173b92013-05-17 17:13:01 -07001285
1286 // Now, slightly change the response and set it again.
Sen Jiangcdd52062017-05-18 15:33:10 -07001287 SetupPayloadStateWith2Urls(
1288 "Hash2399", false, false, &payload_state, &response);
Jay Srinivasan53173b92013-05-17 17:13:01 -07001289
1290 // Check that we still skip the HTTP URL and use only the HTTPS url.
1291 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
1292
1293 // Now, pretend that the HTTP policy is turned on. We want to make sure
1294 // the new policy is honored.
1295 policy::MockDevicePolicy enable_http_policy;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001296 fake_system_state.set_device_policy(&enable_http_policy);
Jay Srinivasan53173b92013-05-17 17:13:01 -07001297 EXPECT_CALL(enable_http_policy, GetHttpDownloadsEnabled(_))
Ben Chan672c1f52017-10-23 15:41:39 -07001298 .WillRepeatedly(DoAll(SetArgPointee<0>(true), Return(true)));
Jay Srinivasan53173b92013-05-17 17:13:01 -07001299
1300 // Now, set the same response using the same hash
1301 // so that we can test that the state is reset not because of the
1302 // hash but because of the policy change which results in candidate url
1303 // list change.
Sen Jiangcdd52062017-05-18 15:33:10 -07001304 SetupPayloadStateWith2Urls(
1305 "Hash2399", true, false, &payload_state, &response);
Jay Srinivasan53173b92013-05-17 17:13:01 -07001306
1307 // Check that we use the HTTP URL now and the failure count is reset.
1308 EXPECT_EQ("http://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -08001309 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
Jay Srinivasan53173b92013-05-17 17:13:01 -07001310
1311 // Fake a failure and see if we're moving over to the HTTPS url and update
1312 // the URL switch count properly.
1313 payload_state.UpdateFailed(error);
1314 EXPECT_EQ("https://test", payload_state.GetCurrentUrl());
Alex Deymo80f70ff2016-02-10 16:08:11 -08001315 EXPECT_EQ(1U, payload_state.GetUrlSwitchCount());
1316 EXPECT_EQ(0U, payload_state.GetUrlFailureCount());
Jay Srinivasan53173b92013-05-17 17:13:01 -07001317}
1318
Alex Deymo1c656c42013-06-28 11:02:14 -07001319TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsDelta) {
1320 OmahaResponse response;
Alex Deymo1c656c42013-06-28 11:02:14 -07001321 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001322 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001323
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001324 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001325 SetupPayloadStateWith2Urls("Hash6437", true, true, &payload_state, &response);
Alex Deymo1c656c42013-06-28 11:02:14 -07001326
1327 // Simulate a successful download and update.
1328 payload_state.DownloadComplete();
Sen Jiang8712e962018-05-08 12:12:28 -07001329 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1330 ReportSuccessfulUpdateMetrics(
1331 _, _, kPayloadTypeDelta, _, _, _, _, _, _, _));
Alex Deymo1c656c42013-06-28 11:02:14 -07001332 payload_state.UpdateSucceeded();
1333
1334 // Mock the request to a request where the delta was disabled but Omaha sends
1335 // a delta anyway and test again.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001336 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001337 params.set_delta_okay(false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001338 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001339
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001340 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001341 SetupPayloadStateWith2Urls("Hash6437", true, true, &payload_state, &response);
Alex Deymo1c656c42013-06-28 11:02:14 -07001342
1343 payload_state.DownloadComplete();
1344
Sen Jiang8712e962018-05-08 12:12:28 -07001345 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1346 ReportSuccessfulUpdateMetrics(
1347 _, _, kPayloadTypeDelta, _, _, _, _, _, _, _));
Alex Deymo1c656c42013-06-28 11:02:14 -07001348 payload_state.UpdateSucceeded();
1349}
1350
1351TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsForcedFull) {
1352 OmahaResponse response;
Alex Deymo1c656c42013-06-28 11:02:14 -07001353 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001354 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001355
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001356 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001357 SetupPayloadStateWith2Urls(
1358 "Hash6437", true, false, &payload_state, &response);
Alex Deymo1c656c42013-06-28 11:02:14 -07001359
1360 // Mock the request to a request where the delta was disabled.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001361 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001362 params.set_delta_okay(false);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001363 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001364
1365 // Simulate a successful download and update.
1366 payload_state.DownloadComplete();
1367
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001368 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1369 ReportSuccessfulUpdateMetrics(
Sen Jiang8712e962018-05-08 12:12:28 -07001370 _, _, kPayloadTypeForcedFull, _, _, _, _, _, _, _));
Alex Deymo1c656c42013-06-28 11:02:14 -07001371 payload_state.UpdateSucceeded();
1372}
1373
1374TEST(PayloadStateTest, PayloadTypeMetricWhenTypeIsFull) {
1375 OmahaResponse response;
Alex Deymo1c656c42013-06-28 11:02:14 -07001376 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001377 FakeSystemState fake_system_state;
Alex Deymo1c656c42013-06-28 11:02:14 -07001378
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001379 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001380 SetupPayloadStateWith2Urls(
1381 "Hash6437", true, false, &payload_state, &response);
Alex Deymo1c656c42013-06-28 11:02:14 -07001382
Alex Deymo820cc702013-06-28 15:43:46 -07001383 // Mock the request to a request where the delta is enabled, although the
1384 // result is full.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001385 OmahaRequestParams params(&fake_system_state);
Alex Deymo1c656c42013-06-28 11:02:14 -07001386 params.set_delta_okay(true);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001387 fake_system_state.set_request_params(&params);
Alex Deymo1c656c42013-06-28 11:02:14 -07001388
1389 // Simulate a successful download and update.
1390 payload_state.DownloadComplete();
1391
Sen Jiang8712e962018-05-08 12:12:28 -07001392 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1393 ReportSuccessfulUpdateMetrics(
1394 _, _, kPayloadTypeFull, _, _, _, _, _, _, _));
Alex Deymo1c656c42013-06-28 11:02:14 -07001395 payload_state.UpdateSucceeded();
1396}
1397
Alex Deymo42432912013-07-12 20:21:15 -07001398TEST(PayloadStateTest, RebootAfterUpdateFailedMetric) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001399 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001400 OmahaResponse response;
1401 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001402 FakePrefs fake_prefs;
1403 fake_system_state.set_prefs(&fake_prefs);
Alex Deymo42432912013-07-12 20:21:15 -07001404
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001405 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001406 SetupPayloadStateWith2Urls(
1407 "Hash3141", true, false, &payload_state, &response);
Alex Deymo42432912013-07-12 20:21:15 -07001408
1409 // Simulate a successful download and update.
1410 payload_state.DownloadComplete();
1411 payload_state.UpdateSucceeded();
1412 payload_state.ExpectRebootInNewVersion("Version:12345678");
1413
1414 // Reboot into the same environment to get an UMA metric with a value of 1.
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001415 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1416 ReportFailedUpdateCount(1));
Alex Deymo42432912013-07-12 20:21:15 -07001417 payload_state.ReportFailedBootIfNeeded();
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001418 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_reporter());
Alex Deymo42432912013-07-12 20:21:15 -07001419
1420 // Simulate a second update and reboot into the same environment, this should
1421 // send a value of 2.
1422 payload_state.ExpectRebootInNewVersion("Version:12345678");
1423
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001424 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1425 ReportFailedUpdateCount(2));
Alex Deymo42432912013-07-12 20:21:15 -07001426 payload_state.ReportFailedBootIfNeeded();
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001427 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_reporter());
Alex Deymo42432912013-07-12 20:21:15 -07001428
1429 // Simulate a third failed reboot to new version, but this time for a
1430 // different payload. This should send a value of 1 this time.
1431 payload_state.ExpectRebootInNewVersion("Version:3141592");
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001432 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1433 ReportFailedUpdateCount(1));
Alex Deymo42432912013-07-12 20:21:15 -07001434 payload_state.ReportFailedBootIfNeeded();
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001435 Mock::VerifyAndClearExpectations(fake_system_state.mock_metrics_reporter());
Alex Deymo42432912013-07-12 20:21:15 -07001436}
1437
1438TEST(PayloadStateTest, RebootAfterUpdateSucceed) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001439 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001440 OmahaResponse response;
1441 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001442 FakePrefs fake_prefs;
1443 fake_system_state.set_prefs(&fake_prefs);
Alex Deymo42432912013-07-12 20:21:15 -07001444
Alex Deymo763e7db2015-08-27 21:08:08 -07001445 FakeBootControl* fake_boot_control = fake_system_state.fake_boot_control();
1446 fake_boot_control->SetCurrentSlot(0);
Alex Deymo42432912013-07-12 20:21:15 -07001447
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001448 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001449 SetupPayloadStateWith2Urls(
1450 "Hash3141", true, false, &payload_state, &response);
Alex Deymo42432912013-07-12 20:21:15 -07001451
1452 // Simulate a successful download and update.
1453 payload_state.DownloadComplete();
1454 payload_state.UpdateSucceeded();
1455 payload_state.ExpectRebootInNewVersion("Version:12345678");
1456
1457 // Change the BootDevice to a different one, no metric should be sent.
Alex Deymo763e7db2015-08-27 21:08:08 -07001458 fake_boot_control->SetCurrentSlot(1);
Alex Deymo42432912013-07-12 20:21:15 -07001459
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001460 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1461 ReportFailedUpdateCount(_))
David Zeuthen33bae492014-02-25 16:16:18 -08001462 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001463 payload_state.ReportFailedBootIfNeeded();
1464
Alex Deymo763e7db2015-08-27 21:08:08 -07001465 // A second reboot in either partition should not send a metric.
Alex Deymo42432912013-07-12 20:21:15 -07001466 payload_state.ReportFailedBootIfNeeded();
Alex Deymo763e7db2015-08-27 21:08:08 -07001467 fake_boot_control->SetCurrentSlot(0);
Alex Deymo42432912013-07-12 20:21:15 -07001468 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001469}
1470
1471TEST(PayloadStateTest, RebootAfterCanceledUpdate) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001472 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001473 OmahaResponse response;
1474 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001475 FakePrefs fake_prefs;
Alex Deymo42432912013-07-12 20:21:15 -07001476
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001477 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001478 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001479 SetupPayloadStateWith2Urls(
1480 "Hash3141", true, false, &payload_state, &response);
Alex Deymo42432912013-07-12 20:21:15 -07001481
1482 // Simulate a successful download and update.
1483 payload_state.DownloadComplete();
1484 payload_state.UpdateSucceeded();
1485 payload_state.ExpectRebootInNewVersion("Version:12345678");
1486
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001487 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1488 ReportFailedUpdateCount(_))
David Zeuthen33bae492014-02-25 16:16:18 -08001489 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001490
1491 // Cancel the applied update.
1492 payload_state.ResetUpdateStatus();
1493
1494 // Simulate a reboot.
1495 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001496}
1497
1498TEST(PayloadStateTest, UpdateSuccessWithWipedPrefs) {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001499 FakeSystemState fake_system_state;
Alex Deymo42432912013-07-12 20:21:15 -07001500 PayloadState payload_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001501 FakePrefs fake_prefs;
Alex Deymo42432912013-07-12 20:21:15 -07001502
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001503 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001504 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Alex Deymo42432912013-07-12 20:21:15 -07001505
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001506 EXPECT_CALL(*fake_system_state.mock_metrics_reporter(),
1507 ReportFailedUpdateCount(_))
David Zeuthen33bae492014-02-25 16:16:18 -08001508 .Times(0);
Alex Deymo42432912013-07-12 20:21:15 -07001509
1510 // Simulate a reboot in this environment.
1511 payload_state.ReportFailedBootIfNeeded();
Alex Deymo42432912013-07-12 20:21:15 -07001512}
1513
David Zeuthendcba8092013-08-06 12:16:35 -07001514TEST(PayloadStateTest, DisallowP2PAfterTooManyAttempts) {
1515 OmahaResponse response;
1516 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001517 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001518 FakePrefs fake_prefs;
1519 fake_system_state.set_prefs(&fake_prefs);
David Zeuthendcba8092013-08-06 12:16:35 -07001520
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001521 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001522 SetupPayloadStateWith2Urls(
1523 "Hash8593", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001524
1525 // Should allow exactly kMaxP2PAttempts...
1526 for (int n = 0; n < kMaxP2PAttempts; n++) {
1527 payload_state.P2PNewAttempt();
1528 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1529 }
1530 // ... but not more than that.
1531 payload_state.P2PNewAttempt();
1532 EXPECT_FALSE(payload_state.P2PAttemptAllowed());
David Zeuthendcba8092013-08-06 12:16:35 -07001533}
1534
1535TEST(PayloadStateTest, DisallowP2PAfterDeadline) {
1536 OmahaResponse response;
1537 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001538 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001539 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001540 FakePrefs fake_prefs;
David Zeuthendcba8092013-08-06 12:16:35 -07001541
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001542 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001543 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001544 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001545 SetupPayloadStateWith2Urls(
1546 "Hash8593", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001547
1548 // Set the clock to 1 second.
1549 Time epoch = Time::FromInternalValue(1000000);
1550 fake_clock.SetWallclockTime(epoch);
1551
1552 // Do an attempt - this will set the timestamp.
1553 payload_state.P2PNewAttempt();
1554
1555 // Check that the timestamp equals what we just set.
1556 EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp());
1557
1558 // Time hasn't advanced - this should work.
1559 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1560
1561 // Set clock to half the deadline - this should work.
Amin Hassani7cc8bb02019-01-14 16:29:47 -08001562 fake_clock.SetWallclockTime(
1563 epoch + TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds) / 2);
David Zeuthendcba8092013-08-06 12:16:35 -07001564 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1565
1566 // Check that the first attempt timestamp hasn't changed just
1567 // because the wall-clock time changed.
1568 EXPECT_EQ(epoch, payload_state.GetP2PFirstAttemptTimestamp());
1569
1570 // Set clock to _just_ before the deadline - this should work.
Amin Hassani7cc8bb02019-01-14 16:29:47 -08001571 fake_clock.SetWallclockTime(
1572 epoch + TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds - 1));
David Zeuthendcba8092013-08-06 12:16:35 -07001573 EXPECT_TRUE(payload_state.P2PAttemptAllowed());
1574
1575 // Set clock to _just_ after the deadline - this should not work.
Amin Hassani7cc8bb02019-01-14 16:29:47 -08001576 fake_clock.SetWallclockTime(
1577 epoch + TimeDelta::FromSeconds(kMaxP2PAttemptTimeSeconds + 1));
David Zeuthendcba8092013-08-06 12:16:35 -07001578 EXPECT_FALSE(payload_state.P2PAttemptAllowed());
David Zeuthendcba8092013-08-06 12:16:35 -07001579}
1580
1581TEST(PayloadStateTest, P2PStateVarsInitialValue) {
1582 OmahaResponse response;
1583 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001584 FakeSystemState fake_system_state;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001585 FakePrefs fake_prefs;
David Zeuthendcba8092013-08-06 12:16:35 -07001586
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001587 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001588 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001589 SetupPayloadStateWith2Urls(
1590 "Hash8593", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001591
1592 Time null_time = Time();
1593 EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp());
1594 EXPECT_EQ(0, payload_state.GetP2PNumAttempts());
David Zeuthendcba8092013-08-06 12:16:35 -07001595}
1596
1597TEST(PayloadStateTest, P2PStateVarsArePersisted) {
1598 OmahaResponse response;
1599 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001600 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001601 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001602 FakePrefs fake_prefs;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001603 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001604 fake_system_state.set_prefs(&fake_prefs);
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001605 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001606 SetupPayloadStateWith2Urls(
1607 "Hash8593", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001608
1609 // Set the clock to something known.
1610 Time time = Time::FromInternalValue(12345);
1611 fake_clock.SetWallclockTime(time);
1612
1613 // New p2p attempt - as a side-effect this will update the p2p state vars.
1614 payload_state.P2PNewAttempt();
1615 EXPECT_EQ(1, payload_state.GetP2PNumAttempts());
1616 EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp());
1617
1618 // Now create a new PayloadState and check that it loads the state
1619 // vars correctly.
1620 PayloadState payload_state2;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001621 EXPECT_TRUE(payload_state2.Initialize(&fake_system_state));
David Zeuthendcba8092013-08-06 12:16:35 -07001622 EXPECT_EQ(1, payload_state2.GetP2PNumAttempts());
1623 EXPECT_EQ(time, payload_state2.GetP2PFirstAttemptTimestamp());
David Zeuthendcba8092013-08-06 12:16:35 -07001624}
1625
1626TEST(PayloadStateTest, P2PStateVarsAreClearedOnNewResponse) {
1627 OmahaResponse response;
1628 PayloadState payload_state;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001629 FakeSystemState fake_system_state;
David Zeuthendcba8092013-08-06 12:16:35 -07001630 FakeClock fake_clock;
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001631 FakePrefs fake_prefs;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001632 fake_system_state.set_clock(&fake_clock);
Alex Deymo2c0db7b2014-11-04 12:23:39 -08001633 fake_system_state.set_prefs(&fake_prefs);
1634
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001635 EXPECT_TRUE(payload_state.Initialize(&fake_system_state));
Sen Jiangcdd52062017-05-18 15:33:10 -07001636 SetupPayloadStateWith2Urls(
1637 "Hash8593", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001638
1639 // Set the clock to something known.
1640 Time time = Time::FromInternalValue(12345);
1641 fake_clock.SetWallclockTime(time);
1642
1643 // New p2p attempt - as a side-effect this will update the p2p state vars.
1644 payload_state.P2PNewAttempt();
1645 EXPECT_EQ(1, payload_state.GetP2PNumAttempts());
1646 EXPECT_EQ(time, payload_state.GetP2PFirstAttemptTimestamp());
1647
1648 // Set a new response...
Sen Jiangcdd52062017-05-18 15:33:10 -07001649 SetupPayloadStateWith2Urls(
1650 "Hash9904", true, false, &payload_state, &response);
David Zeuthendcba8092013-08-06 12:16:35 -07001651
1652 // ... and check that it clears the P2P state vars.
1653 Time null_time = Time();
1654 EXPECT_EQ(0, payload_state.GetP2PNumAttempts());
1655 EXPECT_EQ(null_time, payload_state.GetP2PFirstAttemptTimestamp());
David Zeuthendcba8092013-08-06 12:16:35 -07001656}
1657
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001658} // namespace chromeos_update_engine