blob: c5120318360d51ffb1f070b78967a0eb7a2f5b5f [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//
Darin Petkov6a5b3222010-07-13 14:55:28 -070016
Alex Deymo8427b4a2014-11-05 14:00:32 -080017#include "update_engine/omaha_request_action.h"
18
Ben Chan9abb7632014-08-07 00:10:53 -070019#include <stdint.h>
20
Ben Chanab5a0af2017-10-12 14:57:50 -070021#include <memory>
Darin Petkov6a5b3222010-07-13 14:55:28 -070022#include <string>
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080023#include <utility>
Darin Petkov6a5b3222010-07-13 14:55:28 -070024#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070025
Alex Deymo60ca1a72015-06-18 18:19:15 -070026#include <base/bind.h>
Alex Deymo110e0302015-10-19 20:35:21 -070027#include <base/files/file_util.h>
Sen Jiang297e5832016-03-17 14:45:51 -070028#include <base/files/scoped_temp_dir.h>
Ben Chan5c02c132017-06-27 07:10:36 -070029#include <base/memory/ptr_util.h>
Alex Deymo8e18f932015-03-27 16:16:59 -070030#include <base/strings/string_number_conversions.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070031#include <base/strings/string_util.h>
32#include <base/strings/stringprintf.h>
33#include <base/time/time.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070034#include <brillo/bind_lambda.h>
35#include <brillo/message_loops/fake_message_loop.h>
36#include <brillo/message_loops/message_loop.h>
37#include <brillo/message_loops/message_loop_utils.h>
Alex Deymoe1e3afe2014-10-30 13:02:49 -070038#include <gtest/gtest.h>
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080039#include <policy/libpolicy.h>
40#include <policy/mock_libpolicy.h>
Jay Srinivasand29695d2013-04-08 15:08:05 -070041
Alex Deymo39910dc2015-11-09 17:04:30 -080042#include "update_engine/common/action_pipe.h"
43#include "update_engine/common/constants.h"
44#include "update_engine/common/fake_prefs.h"
45#include "update_engine/common/hash_calculator.h"
46#include "update_engine/common/mock_http_fetcher.h"
47#include "update_engine/common/platform_constants.h"
48#include "update_engine/common/prefs.h"
49#include "update_engine/common/test_utils.h"
Alex Deymoc1c17b42015-11-23 03:53:15 -030050#include "update_engine/fake_system_state.h"
Tianjie Xu282aa1f2017-09-05 13:42:45 -070051#include "update_engine/metrics_reporter_interface.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070052#include "update_engine/mock_connection_manager.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070053#include "update_engine/mock_payload_state.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070054#include "update_engine/omaha_request_params.h"
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080055#include "update_engine/update_manager/rollback_prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070056
Darin Petkov1cbd78f2010-07-29 12:38:34 -070057using base::Time;
58using base::TimeDelta;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080059using chromeos_update_manager::kRollforwardInfinity;
Darin Petkov6a5b3222010-07-13 14:55:28 -070060using std::string;
61using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070062using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070063using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070064using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070065using testing::Ge;
66using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080067using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070068using testing::Return;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080069using testing::ReturnRef;
Gilad Arnold74b5f552014-10-07 08:17:16 -070070using testing::ReturnPointee;
71using testing::SaveArg;
Ben Chan672c1f52017-10-23 15:41:39 -070072using testing::SetArgPointee;
Alex Deymof329b932014-10-30 01:37:48 -070073using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070074
Alex Deymo8e18f932015-03-27 16:16:59 -070075namespace {
76
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080077static_assert(kRollforwardInfinity == 0xfffffffe,
78 "Don't change the value of kRollforward infinity unless its "
79 "size has been changed in firmware.");
80
Alex Deymo85616652015-10-15 18:48:31 -070081const char kTestAppId[] = "test-app-id";
Aaron Wood7dcdedf2017-09-06 17:17:41 -070082const char kTestAppId2[] = "test-app2-id";
Alex Deymo85616652015-10-15 18:48:31 -070083
Alex Deymo8e18f932015-03-27 16:16:59 -070084// This is a helper struct to allow unit tests build an update response with the
85// values they care about.
86struct FakeUpdateResponse {
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -070087 string GetRollbackVersionAttributes() const {
88 return (rollback ? " _rollback=\"true\"" : "") +
89 (!rollback_firmware_version.empty()
90 ? " _firmware_version=\"" + rollback_firmware_version + "\""
91 : "") +
92 (!rollback_kernel_version.empty()
93 ? " _kernel_version=\"" + rollback_kernel_version + "\""
94 : "");
95 }
96
Alex Deymo8e18f932015-03-27 16:16:59 -070097 string GetNoUpdateResponse() const {
98 string entity_str;
99 if (include_entity)
100 entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
Sen Jiang81259682017-03-30 15:11:30 -0700101 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + entity_str +
102 "<response protocol=\"3.0\">"
103 "<daystart elapsed_seconds=\"100\"/>"
104 "<app appid=\"" +
105 app_id + "\" " +
106 (include_cohorts
107 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
108 "\" cohortname=\"" + cohortname + "\" "
109 : "") +
110 " status=\"ok\">"
111 "<ping status=\"ok\"/>"
112 "<updatecheck status=\"noupdate\"/></app>" +
113 (multi_app_no_update
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700114 ? "<app appid=\"" + app_id2 +
115 "\"><updatecheck status=\"noupdate\"/></app>"
Sen Jiang81259682017-03-30 15:11:30 -0700116 : "") +
117 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700118 }
119
120 string GetUpdateResponse() const {
Sen Jiang2703ef42017-03-16 13:36:21 -0700121 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
122 "protocol=\"3.0\">"
123 "<daystart elapsed_seconds=\"100\"" +
124 (elapsed_days.empty() ? ""
125 : (" elapsed_days=\"" + elapsed_days + "\"")) +
126 "/>"
127 "<app appid=\"" +
128 app_id + "\" " +
129 (include_cohorts
130 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
131 "\" cohortname=\"" + cohortname + "\" "
132 : "") +
133 " status=\"ok\">"
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700134 "<ping status=\"ok\"/><updatecheck status=\"ok\"" +
135 GetRollbackVersionAttributes() + ">" + "<urls><url codebase=\"" +
Sen Jiang2703ef42017-03-16 13:36:21 -0700136 codebase +
137 "\"/></urls>"
138 "<manifest version=\"" +
139 version +
140 "\">"
141 "<packages><package hash=\"not-used\" name=\"" +
142 filename + "\" size=\"" + base::Int64ToString(size) +
Sen Jiang0affc2c2017-02-10 15:55:05 -0800143 "\" hash_sha256=\"" + hash + "\"/>" +
144 (multi_package ? "<package name=\"package2\" size=\"222\" "
145 "hash_sha256=\"hash2\"/>"
146 : "") +
147 "</packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700148 "<actions><action event=\"postinstall\" MetadataSize=\"11" +
Amin Hassanic482bbd2018-09-21 16:07:20 -0700149 (multi_package ? ":22" : "") + "\" MoreInfo=\"" + more_info_url +
150 "\" Prompt=\"" + prompt +
Sen Jiang2703ef42017-03-16 13:36:21 -0700151 "\" "
Sen Jiangcdd52062017-05-18 15:33:10 -0700152 "IsDeltaPayload=\"true" +
153 (multi_package ? ":false" : "") +
154 "\" "
Sen Jiang2703ef42017-03-16 13:36:21 -0700155 "MaxDaysToScatter=\"" +
156 max_days_to_scatter +
157 "\" "
Amin Hassanic482bbd2018-09-21 16:07:20 -0700158 "sha256=\"not-used\" " +
Sen Jiang2703ef42017-03-16 13:36:21 -0700159 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
160 (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
161 : "") +
162 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Sen Jiangfe284402018-03-21 14:03:50 -0700163 (powerwash ? "Powerwash=\"true\" " : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700164 "/></actions></manifest></updatecheck></app>" +
165 (multi_app
Sen Jiangb1e063a2017-09-15 17:44:31 -0700166 ? "<app appid=\"" + app_id2 + "\"" +
167 (include_cohorts ? " cohort=\"cohort2\"" : "") +
168 "><updatecheck status=\"ok\"><urls><url codebase=\"" +
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700169 codebase2 + "\"/></urls><manifest version=\"" + version2 +
170 "\"><packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700171 "<package name=\"package3\" size=\"333\" "
172 "hash_sha256=\"hash3\"/></packages>"
Sen Jiang00adf7b2017-06-26 15:57:29 -0700173 "<actions><action event=\"postinstall\" " +
174 (multi_app_self_update
175 ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
176 : "IsDeltaPayload=\"false\" ") +
177 "MetadataSize=\"33\"/></actions>"
Sen Jiang81259682017-03-30 15:11:30 -0700178 "</manifest></updatecheck></app>"
179 : "") +
180 (multi_app_no_update
181 ? "<app><updatecheck status=\"noupdate\"/></app>"
182 : "") +
183 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700184 }
185
186 // Return the payload URL, which is split in two fields in the XML response.
187 string GetPayloadUrl() {
188 return codebase + filename;
189 }
190
Alex Deymo85616652015-10-15 18:48:31 -0700191 string app_id = kTestAppId;
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700192 string app_id2 = kTestAppId2;
Alex Deymo8e18f932015-03-27 16:16:59 -0700193 string version = "1.2.3.4";
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700194 string version2 = "2.3.4.5";
Alex Deymo8e18f932015-03-27 16:16:59 -0700195 string more_info_url = "http://more/info";
196 string prompt = "true";
197 string codebase = "http://code/base/";
Sen Jiang81259682017-03-30 15:11:30 -0700198 string codebase2 = "http://code/base/2/";
Alex Deymo8e18f932015-03-27 16:16:59 -0700199 string filename = "file.signed";
Sen Jiang2703ef42017-03-16 13:36:21 -0700200 string hash = "4841534831323334";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800201 uint64_t size = 123;
Alex Deymo8e18f932015-03-27 16:16:59 -0700202 string deadline = "";
203 string max_days_to_scatter = "7";
204 string elapsed_days = "42";
205
206 // P2P setting defaults to allowed.
207 bool disable_p2p_for_downloading = false;
208 bool disable_p2p_for_sharing = false;
209
Sen Jiangfe284402018-03-21 14:03:50 -0700210 bool powerwash = false;
211
Alex Deymo8e18f932015-03-27 16:16:59 -0700212 // Omaha cohorts settings.
213 bool include_cohorts = false;
214 string cohort = "";
215 string cohorthint = "";
216 string cohortname = "";
217
218 // Whether to include the CrOS <!ENTITY> in the XML response.
219 bool include_entity = false;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800220
Sen Jiang81259682017-03-30 15:11:30 -0700221 // Whether to include more than one app.
222 bool multi_app = false;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700223 // Whether to include an app with noupdate="true".
224 bool multi_app_self_update = false;
225 // Whether to include an additional app with status="noupdate".
Sen Jiang81259682017-03-30 15:11:30 -0700226 bool multi_app_no_update = false;
227 // Whether to include more than one package in an app.
Sen Jiang0affc2c2017-02-10 15:55:05 -0800228 bool multi_package = false;
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700229
230 // Whether the payload is a rollback.
231 bool rollback = false;
232 // The verified boot firmware key version for the rollback image.
233 string rollback_firmware_version = "";
234 // The verified boot kernel key version for the rollback image.
235 string rollback_kernel_version = "";
Alex Deymo8e18f932015-03-27 16:16:59 -0700236};
237
238} // namespace
239
Darin Petkov6a5b3222010-07-13 14:55:28 -0700240namespace chromeos_update_engine {
241
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700242class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
243 public:
244 OmahaRequestActionTestProcessorDelegate()
245 : expected_code_(ErrorCode::kSuccess),
246 interactive_(false),
247 test_http_fetcher_headers_(false) {}
248 ~OmahaRequestActionTestProcessorDelegate() override = default;
249
250 void ProcessingDone(const ActionProcessor* processor,
251 ErrorCode code) override {
252 brillo::MessageLoop::current()->BreakLoop();
253 }
254
255 void ActionCompleted(ActionProcessor* processor,
256 AbstractAction* action,
257 ErrorCode code) override {
258 // Make sure actions always succeed.
259 if (action->Type() == OmahaRequestAction::StaticType()) {
260 EXPECT_EQ(expected_code_, code);
261 // Check that the headers were set in the fetcher during the action. Note
262 // that we set this request as "interactive".
263 auto fetcher = static_cast<const MockHttpFetcher*>(
264 static_cast<OmahaRequestAction*>(action)->http_fetcher_.get());
265
266 if (test_http_fetcher_headers_) {
267 EXPECT_EQ(interactive_ ? "fg" : "bg",
268 fetcher->GetHeader("X-Goog-Update-Interactivity"));
269 EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-Goog-Update-AppId"));
270 EXPECT_NE("", fetcher->GetHeader("X-Goog-Update-Updater"));
271 }
272 post_data_ = fetcher->post_data();
273 } else if (action->Type() ==
274 ObjectCollectorAction<OmahaResponse>::StaticType()) {
275 EXPECT_EQ(ErrorCode::kSuccess, code);
276 auto collector_action =
277 static_cast<ObjectCollectorAction<OmahaResponse>*>(action);
278 omaha_response_.reset(new OmahaResponse(collector_action->object()));
279 EXPECT_TRUE(omaha_response_);
280 } else {
281 EXPECT_EQ(ErrorCode::kSuccess, code);
282 }
283 }
284 ErrorCode expected_code_;
285 brillo::Blob post_data_;
286 bool interactive_;
287 bool test_http_fetcher_headers_;
288 std::unique_ptr<OmahaResponse> omaha_response_;
289};
290
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700291class OmahaRequestActionTest : public ::testing::Test {
292 protected:
Alex Deymo610277e2014-11-11 21:18:11 -0800293 void SetUp() override {
Marton Hunyady2abda312018-04-24 18:21:49 +0200294 request_params_.set_os_sp("service_pack");
295 request_params_.set_os_board("x86-generic");
296 request_params_.set_app_id(kTestAppId);
297 request_params_.set_app_version("0.1.0.0");
298 request_params_.set_app_lang("en-US");
299 request_params_.set_current_channel("unittest");
300 request_params_.set_target_channel("unittest");
301 request_params_.set_hwid("OEM MODEL 09235 7471");
302 request_params_.set_fw_version("ChromeOSFirmware.1.0");
303 request_params_.set_ec_version("0X0A1");
304 request_params_.set_delta_okay(true);
305 request_params_.set_interactive(false);
306 request_params_.set_update_url("http://url");
307 request_params_.set_target_version_prefix("");
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200308 request_params_.set_rollback_allowed(false);
Marton Hunyady2abda312018-04-24 18:21:49 +0200309 request_params_.set_is_powerwash_allowed(false);
310
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700311 fake_system_state_.set_request_params(&request_params_);
312 fake_system_state_.set_prefs(&fake_prefs_);
313 }
314
315 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -0800316 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700317 // is used. |payload_state| may be null, in which case a local mock is used.
318 // |p2p_manager| may be null, in which case a local mock is used.
319 // |connection_manager| may be null, in which case a local mock is used.
320 // out_response may be null. If |fail_http_response_code| is non-negative,
321 // the transfer will fail with that code. |ping_only| is passed through to the
322 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
323 // post-data received by the mock HttpFetcher is returned.
324 //
325 // The |expected_check_result|, |expected_check_reaction| and
326 // |expected_error_code| parameters are for checking expectations
327 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
328 // UMA statistics. Use the appropriate ::kUnset value to specify that
329 // the given metric should not be reported.
Marton Hunyady2abda312018-04-24 18:21:49 +0200330 bool TestUpdateCheck(const string& http_response,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700331 int fail_http_response_code,
332 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800333 bool is_consumer_device,
334 int rollback_allowed_milestones,
335 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700336 ErrorCode expected_code,
337 metrics::CheckResult expected_check_result,
338 metrics::CheckReaction expected_check_reaction,
339 metrics::DownloadErrorCode expected_download_error_code,
340 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700341 brillo::Blob* out_post_data);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700342
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800343 // Overload of TestUpdateCheck that does not supply |is_consumer_device| or
344 // |rollback_allowed_milestones| which are only required for rollback tests.
345 bool TestUpdateCheck(const string& http_response,
346 int fail_http_response_code,
347 bool ping_only,
348 ErrorCode expected_code,
349 metrics::CheckResult expected_check_result,
350 metrics::CheckReaction expected_check_reaction,
351 metrics::DownloadErrorCode expected_download_error_code,
352 OmahaResponse* out_response,
353 brillo::Blob* out_post_data);
354
355 void TestRollbackCheck(bool is_consumer_device,
356 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700357 bool is_policy_loaded,
358 OmahaResponse* out_response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800359
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700360 void TestEvent(OmahaEvent* event,
361 const string& http_response,
362 brillo::Blob* out_post_data);
363
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800364 // Runs and checks a ping test. |ping_only| indicates whether it should send
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700365 // only a ping or also an updatecheck.
366 void PingTest(bool ping_only);
367
368 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -0700369 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700370 OmahaResponse *response);
371
372 // P2P test helper function.
373 void P2PTest(
374 bool initial_allow_p2p_for_downloading,
375 bool initial_allow_p2p_for_sharing,
376 bool omaha_disable_p2p_for_downloading,
377 bool omaha_disable_p2p_for_sharing,
378 bool payload_state_allow_p2p_attempt,
379 bool expect_p2p_client_lookup,
380 const string& p2p_client_result_url,
381 bool expected_allow_p2p_for_downloading,
382 bool expected_allow_p2p_for_sharing,
383 const string& expected_p2p_url);
384
385 FakeSystemState fake_system_state_;
Alex Deymo8e18f932015-03-27 16:16:59 -0700386 FakeUpdateResponse fake_update_response_;
Marton Hunyady2abda312018-04-24 18:21:49 +0200387 // Used by all tests.
388 OmahaRequestParams request_params_{&fake_system_state_};
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700389
390 FakePrefs fake_prefs_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700391
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700392 OmahaRequestActionTestProcessorDelegate delegate_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700393
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700394 bool test_http_fetcher_headers_{false};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700395};
396
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700397bool OmahaRequestActionTest::TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700398 const string& http_response,
399 int fail_http_response_code,
400 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800401 bool is_consumer_device,
402 int rollback_allowed_milestones,
403 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700404 ErrorCode expected_code,
405 metrics::CheckResult expected_check_result,
406 metrics::CheckReaction expected_check_reaction,
407 metrics::DownloadErrorCode expected_download_error_code,
408 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700409 brillo::Blob* out_post_data) {
410 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700411 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700412 auto fetcher = std::make_unique<MockHttpFetcher>(
413 http_response.data(), http_response.size(), nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700414 if (fail_http_response_code >= 0) {
415 fetcher->FailTransfer(fail_http_response_code);
416 }
Marton Hunyady2abda312018-04-24 18:21:49 +0200417 // This ensures the tests didn't forget to update fake_system_state_ if they
418 // are not using the default request_params_.
419 EXPECT_EQ(&request_params_, fake_system_state_.request_params());
420
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700421 auto omaha_request_action = std::make_unique<OmahaRequestAction>(
422 &fake_system_state_, nullptr, std::move(fetcher), ping_only);
423
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800424 auto mock_policy_provider =
425 std::make_unique<NiceMock<policy::MockPolicyProvider>>();
426 EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
427 .WillRepeatedly(Return(is_consumer_device));
428
429 EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
430 .WillRepeatedly(Return(is_policy_loaded));
431
432 const policy::MockDevicePolicy device_policy;
433 const bool get_allowed_milestone_succeeds = rollback_allowed_milestones >= 0;
434 EXPECT_CALL(device_policy, GetRollbackAllowedMilestones(_))
435 .WillRepeatedly(DoAll(SetArgPointee<0>(rollback_allowed_milestones),
436 Return(get_allowed_milestone_succeeds)));
437
438 EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
439 .WillRepeatedly(ReturnRef(device_policy));
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700440 omaha_request_action->policy_provider_ = std::move(mock_policy_provider);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800441
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700442 delegate_.expected_code_ = expected_code;
443 delegate_.interactive_ = request_params_.interactive();
444 delegate_.test_http_fetcher_headers_ = test_http_fetcher_headers_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700445 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700446 processor.set_delegate(&delegate_);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700447
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700448 auto collector_action =
449 std::make_unique<ObjectCollectorAction<OmahaResponse>>();
450 BondActions(omaha_request_action.get(), collector_action.get());
451 processor.EnqueueAction(std::move(omaha_request_action));
452 processor.EnqueueAction(std::move(collector_action));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700453
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700454 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
455 ReportUpdateCheckMetrics(_, _, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800456 .Times(AnyNumber());
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700457
458 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
459 ReportUpdateCheckMetrics(_,
460 expected_check_result,
461 expected_check_reaction,
462 expected_download_error_code))
463 .Times(ping_only ? 0 : 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800464
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700465 loop.PostTask(base::Bind(
466 [](ActionProcessor* processor) { processor->StartProcessing(); },
467 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700468 loop.Run();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700469 EXPECT_FALSE(loop.PendingTasks());
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700470 if (delegate_.omaha_response_ && out_response)
471 *out_response = *delegate_.omaha_response_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700472 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700473 *out_post_data = delegate_.post_data_;
474 return delegate_.omaha_response_ != nullptr;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700475}
476
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800477bool OmahaRequestActionTest::TestUpdateCheck(
478 const string& http_response,
479 int fail_http_response_code,
480 bool ping_only,
481 ErrorCode expected_code,
482 metrics::CheckResult expected_check_result,
483 metrics::CheckReaction expected_check_reaction,
484 metrics::DownloadErrorCode expected_download_error_code,
485 OmahaResponse* out_response,
486 brillo::Blob* out_post_data) {
487 return TestUpdateCheck(http_response,
488 fail_http_response_code,
489 ping_only,
490 true, // is_consumer_device
491 0, // rollback_allowed_milestones
492 false, // is_policy_loaded
493 expected_code,
494 expected_check_result,
495 expected_check_reaction,
496 expected_download_error_code,
497 out_response,
498 out_post_data);
499}
500
501void OmahaRequestActionTest::TestRollbackCheck(bool is_consumer_device,
502 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700503 bool is_policy_loaded,
504 OmahaResponse* out_response) {
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800505 fake_update_response_.deadline = "20101020";
506 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
507 -1,
508 false, // ping_only
509 is_consumer_device,
510 rollback_allowed_milestones,
511 is_policy_loaded,
512 ErrorCode::kSuccess,
513 metrics::CheckResult::kUpdateAvailable,
514 metrics::CheckReaction::kUpdating,
515 metrics::DownloadErrorCode::kUnset,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700516 out_response,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800517 nullptr));
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700518 ASSERT_TRUE(out_response->update_exists);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800519}
520
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700521// Tests Event requests -- they should always succeed. |out_post_data| may be
522// null; if non-null, the post-data received by the mock HttpFetcher is
523// returned.
524void OmahaRequestActionTest::TestEvent(OmahaEvent* event,
525 const string& http_response,
526 brillo::Blob* out_post_data) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700527 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700528 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700529
530 auto action = std::make_unique<OmahaRequestAction>(
531 &fake_system_state_,
532 event,
533 std::make_unique<MockHttpFetcher>(
534 http_response.data(), http_response.size(), nullptr),
535 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700536 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700537 processor.set_delegate(&delegate_);
538 processor.EnqueueAction(std::move(action));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700539
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700540 loop.PostTask(base::Bind(
541 [](ActionProcessor* processor) { processor->StartProcessing(); },
542 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700543 loop.Run();
Alex Deymo72a25672016-03-23 15:44:39 -0700544 EXPECT_FALSE(loop.PendingTasks());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700545
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700546 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700547 *out_post_data = delegate_.post_data_;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700548}
549
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700550TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400551 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700552 fake_update_response_.include_entity = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200553 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
554 -1,
555 false, // ping_only
556 ErrorCode::kOmahaRequestXMLHasEntityDecl,
557 metrics::CheckResult::kParsingError,
558 metrics::CheckReaction::kUnset,
559 metrics::DownloadErrorCode::kUnset,
560 &response,
561 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400562 EXPECT_FALSE(response.update_exists);
563}
564
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700565TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700566 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +0200567 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
568 -1,
569 false, // ping_only
570 ErrorCode::kSuccess,
571 metrics::CheckResult::kNoUpdateAvailable,
572 metrics::CheckReaction::kUnset,
573 metrics::DownloadErrorCode::kUnset,
574 &response,
575 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700576 EXPECT_FALSE(response.update_exists);
577}
578
Sen Jiang81259682017-03-30 15:11:30 -0700579TEST_F(OmahaRequestActionTest, MultiAppNoUpdateTest) {
580 OmahaResponse response;
581 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200582 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700583 -1,
584 false, // ping_only
585 ErrorCode::kSuccess,
586 metrics::CheckResult::kNoUpdateAvailable,
587 metrics::CheckReaction::kUnset,
588 metrics::DownloadErrorCode::kUnset,
589 &response,
590 nullptr));
591 EXPECT_FALSE(response.update_exists);
592}
593
Sen Jiang00adf7b2017-06-26 15:57:29 -0700594TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
595 OmahaResponse response;
596 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200597 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang00adf7b2017-06-26 15:57:29 -0700598 -1,
599 false, // ping_only
600 ErrorCode::kSuccess,
601 metrics::CheckResult::kNoUpdateAvailable,
602 metrics::CheckReaction::kUnset,
603 metrics::DownloadErrorCode::kUnset,
604 &response,
605 nullptr));
606 EXPECT_FALSE(response.update_exists);
607}
608
609TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
610 OmahaResponse response;
611 ASSERT_TRUE(TestUpdateCheck(
Sen Jiang00adf7b2017-06-26 15:57:29 -0700612 "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
613 "event=\"postinstall\" noupdate=\"true\"/></actions>"
614 "</manifest></updatecheck></app></response>",
615 -1,
616 false, // ping_only
617 ErrorCode::kSuccess,
618 metrics::CheckResult::kNoUpdateAvailable,
619 metrics::CheckReaction::kUnset,
620 metrics::DownloadErrorCode::kUnset,
621 &response,
622 nullptr));
623 EXPECT_FALSE(response.update_exists);
624}
625
Alex Deymo8e18f932015-03-27 16:16:59 -0700626// Test that all the values in the response are parsed in a normal update
627// response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700628TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700629 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700630 fake_update_response_.deadline = "20101020";
Marton Hunyady2abda312018-04-24 18:21:49 +0200631 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
632 -1,
633 false, // ping_only
634 ErrorCode::kSuccess,
635 metrics::CheckResult::kUpdateAvailable,
636 metrics::CheckReaction::kUpdating,
637 metrics::DownloadErrorCode::kUnset,
638 &response,
639 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700640 EXPECT_TRUE(response.update_exists);
Alex Deymo8e18f932015-03-27 16:16:59 -0700641 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700642 EXPECT_EQ("", response.system_version);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800643 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
644 response.packages[0].payload_urls[0]);
Alex Deymo8e18f932015-03-27 16:16:59 -0700645 EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800646 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
647 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700648 EXPECT_EQ(true, response.packages[0].is_delta);
Alex Deymo8e18f932015-03-27 16:16:59 -0700649 EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
650 EXPECT_EQ(fake_update_response_.deadline, response.deadline);
Sen Jiangfe284402018-03-21 14:03:50 -0700651 EXPECT_FALSE(response.powerwash_required);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700652 // Omaha cohort attributes are not set in the response, so they should not be
Alex Deymo8e18f932015-03-27 16:16:59 -0700653 // persisted.
654 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
655 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
656 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700657}
658
Sen Jiang0affc2c2017-02-10 15:55:05 -0800659TEST_F(OmahaRequestActionTest, MultiPackageUpdateTest) {
660 OmahaResponse response;
661 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200662 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800663 -1,
664 false, // ping_only
665 ErrorCode::kSuccess,
666 metrics::CheckResult::kUpdateAvailable,
667 metrics::CheckReaction::kUpdating,
668 metrics::DownloadErrorCode::kUnset,
669 &response,
670 nullptr));
671 EXPECT_TRUE(response.update_exists);
672 EXPECT_EQ(fake_update_response_.version, response.version);
673 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
674 response.packages[0].payload_urls[0]);
675 EXPECT_EQ(fake_update_response_.codebase + "package2",
676 response.packages[1].payload_urls[0]);
677 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
678 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700679 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700680 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800681 ASSERT_EQ(2u, response.packages.size());
Sen Jiang81259682017-03-30 15:11:30 -0700682 EXPECT_EQ(string("hash2"), response.packages[1].hash);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800683 EXPECT_EQ(222u, response.packages[1].size);
Sen Jiang81259682017-03-30 15:11:30 -0700684 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700685 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700686}
687
688TEST_F(OmahaRequestActionTest, MultiAppUpdateTest) {
689 OmahaResponse response;
690 fake_update_response_.multi_app = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200691 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700692 -1,
693 false, // ping_only
694 ErrorCode::kSuccess,
695 metrics::CheckResult::kUpdateAvailable,
696 metrics::CheckReaction::kUpdating,
697 metrics::DownloadErrorCode::kUnset,
698 &response,
699 nullptr));
700 EXPECT_TRUE(response.update_exists);
701 EXPECT_EQ(fake_update_response_.version, response.version);
702 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
703 response.packages[0].payload_urls[0]);
704 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
705 response.packages[1].payload_urls[0]);
706 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
707 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
708 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700709 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700710 ASSERT_EQ(2u, response.packages.size());
711 EXPECT_EQ(string("hash3"), response.packages[1].hash);
712 EXPECT_EQ(333u, response.packages[1].size);
713 EXPECT_EQ(33u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700714 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700715}
716
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700717TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
718 OmahaResponse response;
719 fake_update_response_.multi_app = true;
720 // trigger the lining up of the app and system versions
721 request_params_.set_system_app_id(fake_update_response_.app_id2);
722
Marton Hunyady2abda312018-04-24 18:21:49 +0200723 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700724 -1,
725 false, // ping_only
726 ErrorCode::kSuccess,
727 metrics::CheckResult::kUpdateAvailable,
728 metrics::CheckReaction::kUpdating,
729 metrics::DownloadErrorCode::kUnset,
730 &response,
731 nullptr));
732 EXPECT_TRUE(response.update_exists);
733 EXPECT_EQ(fake_update_response_.version, response.version);
734 EXPECT_EQ(fake_update_response_.version2, response.system_version);
735 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
736 response.packages[0].payload_urls[0]);
737 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
738 response.packages[1].payload_urls[0]);
739 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
740 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
741 EXPECT_EQ(11u, response.packages[0].metadata_size);
742 EXPECT_EQ(true, response.packages[0].is_delta);
743 ASSERT_EQ(2u, response.packages.size());
744 EXPECT_EQ(string("hash3"), response.packages[1].hash);
745 EXPECT_EQ(333u, response.packages[1].size);
746 EXPECT_EQ(33u, response.packages[1].metadata_size);
747 EXPECT_EQ(false, response.packages[1].is_delta);
748}
749
Sen Jiang81259682017-03-30 15:11:30 -0700750TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
751 OmahaResponse response;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700752 fake_update_response_.multi_app = true;
753 fake_update_response_.multi_app_self_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200754 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700755 -1,
756 false, // ping_only
757 ErrorCode::kSuccess,
758 metrics::CheckResult::kUpdateAvailable,
759 metrics::CheckReaction::kUpdating,
760 metrics::DownloadErrorCode::kUnset,
761 &response,
762 nullptr));
763 EXPECT_TRUE(response.update_exists);
764 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700765 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700766 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
767 response.packages[0].payload_urls[0]);
768 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
769 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
770 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang00adf7b2017-06-26 15:57:29 -0700771 ASSERT_EQ(2u, response.packages.size());
772 EXPECT_EQ(string("hash3"), response.packages[1].hash);
773 EXPECT_EQ(333u, response.packages[1].size);
774 EXPECT_EQ(33u, response.packages[1].metadata_size);
775 EXPECT_EQ(true, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700776}
777
778TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {
779 OmahaResponse response;
780 fake_update_response_.multi_app = true;
781 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200782 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700783 -1,
784 false, // ping_only
785 ErrorCode::kSuccess,
786 metrics::CheckResult::kUpdateAvailable,
787 metrics::CheckReaction::kUpdating,
788 metrics::DownloadErrorCode::kUnset,
789 &response,
790 nullptr));
791 EXPECT_TRUE(response.update_exists);
792 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700793 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700794 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
795 response.packages[0].payload_urls[0]);
796 EXPECT_EQ(fake_update_response_.codebase + "package2",
797 response.packages[1].payload_urls[0]);
798 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
799 response.packages[2].payload_urls[0]);
800 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
801 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
802 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700803 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700804 ASSERT_EQ(3u, response.packages.size());
805 EXPECT_EQ(string("hash2"), response.packages[1].hash);
806 EXPECT_EQ(222u, response.packages[1].size);
807 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700808 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700809 EXPECT_EQ(string("hash3"), response.packages[2].hash);
810 EXPECT_EQ(333u, response.packages[2].size);
811 EXPECT_EQ(33u, response.packages[2].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700812 EXPECT_EQ(false, response.packages[2].is_delta);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800813}
814
Sen Jiangfe284402018-03-21 14:03:50 -0700815TEST_F(OmahaRequestActionTest, PowerwashTest) {
816 OmahaResponse response;
817 fake_update_response_.powerwash = true;
Amin Hassani3538a882018-05-31 14:11:30 -0700818 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangfe284402018-03-21 14:03:50 -0700819 -1,
820 false, // ping_only
821 ErrorCode::kSuccess,
822 metrics::CheckResult::kUpdateAvailable,
823 metrics::CheckReaction::kUpdating,
824 metrics::DownloadErrorCode::kUnset,
825 &response,
826 nullptr));
827 EXPECT_TRUE(response.update_exists);
828 EXPECT_TRUE(response.powerwash_required);
829}
830
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700831TEST_F(OmahaRequestActionTest, ExtraHeadersSentInteractiveTest) {
832 OmahaResponse response;
Alex Deymo14ad88e2016-06-29 12:30:14 -0700833 request_params_.set_interactive(true);
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700834 test_http_fetcher_headers_ = true;
835 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
836 -1,
837 false, // ping_only
838 ErrorCode::kOmahaRequestXMLParseError,
839 metrics::CheckResult::kParsingError,
840 metrics::CheckReaction::kUnset,
841 metrics::DownloadErrorCode::kUnset,
842 &response,
843 nullptr));
844 EXPECT_FALSE(response.update_exists);
845}
Alex Deymo14ad88e2016-06-29 12:30:14 -0700846
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700847TEST_F(OmahaRequestActionTest, ExtraHeadersSentNoInteractiveTest) {
848 OmahaResponse response;
849 request_params_.set_interactive(false);
850 test_http_fetcher_headers_ = true;
851 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
852 -1,
853 false, // ping_only
854 ErrorCode::kOmahaRequestXMLParseError,
855 metrics::CheckResult::kParsingError,
856 metrics::CheckReaction::kUnset,
857 metrics::DownloadErrorCode::kUnset,
858 &response,
859 nullptr));
860 EXPECT_FALSE(response.update_exists);
Alex Deymo14ad88e2016-06-29 12:30:14 -0700861}
862
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700863TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700864 OmahaResponse response;
865 // Set up a connection manager that doesn't allow a valid update over
866 // the current ethernet connection.
Alex Deymof6ee0162015-07-31 12:35:22 -0700867 MockConnectionManager mock_cm;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700868 fake_system_state_.set_connection_manager(&mock_cm);
869
Alex Deymo30534502015-07-20 15:06:33 -0700870 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
871 .WillRepeatedly(
Ben Chan672c1f52017-10-23 15:41:39 -0700872 DoAll(SetArgPointee<0>(ConnectionType::kEthernet),
873 SetArgPointee<1>(ConnectionTethering::kUnknown),
Alex Deymo30534502015-07-20 15:06:33 -0700874 Return(true)));
Sen Jiang255e22b2016-05-20 16:15:29 -0700875 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
876 .WillRepeatedly(Return(false));
Chris Sosa77f79e82014-06-02 18:16:24 -0700877
Marton Hunyady2abda312018-04-24 18:21:49 +0200878 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
879 -1,
880 false, // ping_only
881 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
882 metrics::CheckResult::kUpdateAvailable,
883 metrics::CheckReaction::kIgnored,
884 metrics::DownloadErrorCode::kUnset,
885 &response,
886 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700887 EXPECT_FALSE(response.update_exists);
888}
889
Weidong Guo421ff332017-04-17 10:08:38 -0700890TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularAllowedByDevicePolicy) {
891 // This test tests that update over cellular is allowed as device policy
892 // says yes.
893 OmahaResponse response;
894 MockConnectionManager mock_cm;
895
896 fake_system_state_.set_connection_manager(&mock_cm);
897
898 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
899 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
900 SetArgPointee<1>(ConnectionTethering::kUnknown),
901 Return(true)));
902 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
903 .WillRepeatedly(Return(true));
904 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
905 .WillRepeatedly(Return(true));
906
Marton Hunyady2abda312018-04-24 18:21:49 +0200907 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700908 -1,
909 false, // ping_only
910 ErrorCode::kSuccess,
911 metrics::CheckResult::kUpdateAvailable,
912 metrics::CheckReaction::kUpdating,
913 metrics::DownloadErrorCode::kUnset,
914 &response,
915 nullptr));
916 EXPECT_TRUE(response.update_exists);
917}
918
919TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularBlockedByDevicePolicy) {
920 // This test tests that update over cellular is blocked as device policy
921 // says no.
922 OmahaResponse response;
923 MockConnectionManager mock_cm;
924
925 fake_system_state_.set_connection_manager(&mock_cm);
926
927 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
928 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
929 SetArgPointee<1>(ConnectionTethering::kUnknown),
930 Return(true)));
931 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
932 .WillRepeatedly(Return(true));
933 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
934 .WillRepeatedly(Return(false));
935
Marton Hunyady2abda312018-04-24 18:21:49 +0200936 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700937 -1,
938 false, // ping_only
939 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
940 metrics::CheckResult::kUpdateAvailable,
941 metrics::CheckReaction::kIgnored,
942 metrics::DownloadErrorCode::kUnset,
943 &response,
944 nullptr));
945 EXPECT_FALSE(response.update_exists);
946}
947
948TEST_F(OmahaRequestActionTest,
949 ValidUpdateOverCellularAllowedByUserPermissionTrue) {
950 // This test tests that, when device policy is not set, update over cellular
951 // is allowed as permission for update over cellular is set to true.
952 OmahaResponse response;
953 MockConnectionManager mock_cm;
954
955 fake_prefs_.SetBoolean(kPrefsUpdateOverCellularPermission, true);
956 fake_system_state_.set_connection_manager(&mock_cm);
957
958 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
959 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
960 SetArgPointee<1>(ConnectionTethering::kUnknown),
961 Return(true)));
962 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
963 .WillRepeatedly(Return(false));
964 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
965 .WillRepeatedly(Return(true));
966
Marton Hunyady2abda312018-04-24 18:21:49 +0200967 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700968 -1,
969 false, // ping_only
970 ErrorCode::kSuccess,
971 metrics::CheckResult::kUpdateAvailable,
972 metrics::CheckReaction::kUpdating,
973 metrics::DownloadErrorCode::kUnset,
974 &response,
975 nullptr));
976 EXPECT_TRUE(response.update_exists);
977}
978
979TEST_F(OmahaRequestActionTest,
980 ValidUpdateOverCellularBlockedByUpdateTargetNotMatch) {
981 // This test tests that, when device policy is not set and permission for
982 // update over cellular is set to false or does not exist, update over
983 // cellular is blocked as update target does not match the omaha response.
984 OmahaResponse response;
985 MockConnectionManager mock_cm;
986 // A version different from the version in omaha response.
987 string diff_version = "99.99.99";
988 // A size different from the size in omaha response.
989 int64_t diff_size = 999;
990
991 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, diff_version);
992 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, diff_size);
993 // This test tests cellular (3G) being the only connection type being allowed.
994 fake_system_state_.set_connection_manager(&mock_cm);
995
996 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
997 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
998 SetArgPointee<1>(ConnectionTethering::kUnknown),
999 Return(true)));
1000 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1001 .WillRepeatedly(Return(false));
1002 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1003 .WillRepeatedly(Return(true));
1004
Marton Hunyady2abda312018-04-24 18:21:49 +02001005 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001006 -1,
1007 false, // ping_only
1008 ErrorCode::kOmahaUpdateIgnoredOverCellular,
1009 metrics::CheckResult::kUpdateAvailable,
1010 metrics::CheckReaction::kIgnored,
1011 metrics::DownloadErrorCode::kUnset,
1012 &response,
1013 nullptr));
1014 EXPECT_FALSE(response.update_exists);
1015}
1016
1017TEST_F(OmahaRequestActionTest,
1018 ValidUpdateOverCellularAllowedByUpdateTargetMatch) {
1019 // This test tests that, when device policy is not set and permission for
1020 // update over cellular is set to false or does not exist, update over
1021 // cellular is allowed as update target matches the omaha response.
1022 OmahaResponse response;
1023 MockConnectionManager mock_cm;
1024 // A version same as the version in omaha response.
1025 string new_version = fake_update_response_.version;
1026 // A size same as the size in omaha response.
1027 int64_t new_size = fake_update_response_.size;
1028
1029 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, new_version);
1030 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, new_size);
1031 fake_system_state_.set_connection_manager(&mock_cm);
1032
1033 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1034 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1035 SetArgPointee<1>(ConnectionTethering::kUnknown),
1036 Return(true)));
1037 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1038 .WillRepeatedly(Return(false));
1039 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1040 .WillRepeatedly(Return(true));
1041
Marton Hunyady2abda312018-04-24 18:21:49 +02001042 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001043 -1,
1044 false, // ping_only
1045 ErrorCode::kSuccess,
1046 metrics::CheckResult::kUpdateAvailable,
1047 metrics::CheckReaction::kUpdating,
1048 metrics::DownloadErrorCode::kUnset,
1049 &response,
1050 nullptr));
1051 EXPECT_TRUE(response.update_exists);
1052}
1053
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001054TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -07001055 string rollback_version = "1234.0.0";
1056 OmahaResponse response;
1057
1058 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001059 fake_system_state_.set_payload_state(&mock_payload_state);
1060
Chris Sosa77f79e82014-06-02 18:16:24 -07001061 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
1062 .WillRepeatedly(Return(rollback_version));
1063
Alex Deymo8e18f932015-03-27 16:16:59 -07001064 fake_update_response_.version = rollback_version;
Marton Hunyady2abda312018-04-24 18:21:49 +02001065 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1066 -1,
1067 false, // ping_only
1068 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
1069 metrics::CheckResult::kUpdateAvailable,
1070 metrics::CheckReaction::kIgnored,
1071 metrics::DownloadErrorCode::kUnset,
1072 &response,
1073 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -07001074 EXPECT_FALSE(response.update_exists);
1075}
1076
Marton Hunyadyc2882062018-05-14 17:28:25 +02001077// Verify that update checks called during OOBE will not try to download an
1078// update if the response doesn't include the deadline field.
Kevin Cernekee2494e282016-03-29 18:03:53 -07001079TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
1080 OmahaResponse response;
Marton Hunyadyc2882062018-05-14 17:28:25 +02001081 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Kevin Cernekee2494e282016-03-29 18:03:53 -07001082
Sen Jiang8cd42342018-01-31 12:06:59 -08001083 // TODO(senj): set better default value for metrics::checkresult in
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001084 // OmahaRequestAction::ActionCompleted.
Marton Hunyady2abda312018-04-24 18:21:49 +02001085 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001086 -1,
1087 false, // ping_only
1088 ErrorCode::kNonCriticalUpdateInOOBE,
1089 metrics::CheckResult::kParsingError,
1090 metrics::CheckReaction::kUnset,
1091 metrics::DownloadErrorCode::kUnset,
1092 &response,
1093 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001094 EXPECT_FALSE(response.update_exists);
Marton Hunyadyc2882062018-05-14 17:28:25 +02001095}
Kevin Cernekee2494e282016-03-29 18:03:53 -07001096
Marton Hunyadyc2882062018-05-14 17:28:25 +02001097// Verify that the IsOOBEComplete() value is ignored when the OOBE flow is not
1098// enabled.
1099TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDisabled) {
1100 OmahaResponse response;
1101 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymo46a9aae2016-05-04 20:20:11 -07001102 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
Alex Deymo46a9aae2016-05-04 20:20:11 -07001103
Marton Hunyady2abda312018-04-24 18:21:49 +02001104 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1105 -1,
1106 false, // ping_only
1107 ErrorCode::kSuccess,
1108 metrics::CheckResult::kUpdateAvailable,
1109 metrics::CheckReaction::kUpdating,
1110 metrics::DownloadErrorCode::kUnset,
1111 &response,
1112 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001113 EXPECT_TRUE(response.update_exists);
1114}
1115
Marton Hunyadyc2882062018-05-14 17:28:25 +02001116// Verify that update checks called during OOBE will still try to download an
1117// update if the response includes the deadline field.
1118TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDeadlineSet) {
1119 OmahaResponse response;
1120 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1121 fake_update_response_.deadline = "20101020";
1122
1123 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1124 -1,
1125 false, // ping_only
1126 ErrorCode::kSuccess,
1127 metrics::CheckResult::kUpdateAvailable,
1128 metrics::CheckReaction::kUpdating,
1129 metrics::DownloadErrorCode::kUnset,
1130 &response,
1131 nullptr));
1132 EXPECT_TRUE(response.update_exists);
1133}
1134
1135// Verify that update checks called during OOBE will not try to download an
1136// update if a rollback happened, even when the response includes the deadline
1137// field.
1138TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBERollback) {
1139 OmahaResponse response;
1140 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1141 fake_update_response_.deadline = "20101020";
1142 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetRollbackHappened())
1143 .WillOnce(Return(true));
1144
1145 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1146 -1,
1147 false, // ping_only
1148 ErrorCode::kNonCriticalUpdateInOOBE,
1149 metrics::CheckResult::kParsingError,
1150 metrics::CheckReaction::kUnset,
1151 metrics::DownloadErrorCode::kUnset,
1152 &response,
1153 nullptr));
1154 EXPECT_FALSE(response.update_exists);
1155}
1156
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001157TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001158 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001159 request_params_.set_wall_clock_based_wait_enabled(true);
1160 request_params_.set_update_check_count_wait_enabled(false);
1161 request_params_.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001162
May Lippert60aa3ca2018-08-15 16:55:29 -07001163 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1164
Marton Hunyady2abda312018-04-24 18:21:49 +02001165 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1166 -1,
1167 false, // ping_only
1168 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1169 metrics::CheckResult::kUpdateAvailable,
1170 metrics::CheckReaction::kDeferring,
1171 metrics::DownloadErrorCode::kUnset,
1172 &response,
1173 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001174 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001175
1176 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001177 request_params_.set_interactive(true);
1178 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1179 -1,
1180 false, // ping_only
1181 ErrorCode::kSuccess,
1182 metrics::CheckResult::kUpdateAvailable,
1183 metrics::CheckReaction::kUpdating,
1184 metrics::DownloadErrorCode::kUnset,
1185 &response,
1186 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001187 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001188}
1189
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001190TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001191 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001192 request_params_.set_wall_clock_based_wait_enabled(false);
1193 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1194 request_params_.set_update_check_count_wait_enabled(true);
1195 request_params_.set_min_update_checks_needed(1);
1196 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001197
Marton Hunyady2abda312018-04-24 18:21:49 +02001198 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1199 -1,
1200 false, // ping_only
1201 ErrorCode::kSuccess,
1202 metrics::CheckResult::kUpdateAvailable,
1203 metrics::CheckReaction::kUpdating,
1204 metrics::DownloadErrorCode::kUnset,
1205 &response,
1206 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001207 EXPECT_TRUE(response.update_exists);
1208}
1209
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001210TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001211 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001212 request_params_.set_wall_clock_based_wait_enabled(true);
1213 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1214 request_params_.set_update_check_count_wait_enabled(true);
1215 request_params_.set_min_update_checks_needed(1);
1216 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001217
Alex Deymo8e18f932015-03-27 16:16:59 -07001218 fake_update_response_.max_days_to_scatter = "0";
Marton Hunyady2abda312018-04-24 18:21:49 +02001219 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1220 -1,
1221 false, // ping_only
1222 ErrorCode::kSuccess,
1223 metrics::CheckResult::kUpdateAvailable,
1224 metrics::CheckReaction::kUpdating,
1225 metrics::DownloadErrorCode::kUnset,
1226 &response,
1227 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001228 EXPECT_TRUE(response.update_exists);
1229}
1230
1231
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001232TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001233 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001234 request_params_.set_wall_clock_based_wait_enabled(true);
1235 request_params_.set_waiting_period(TimeDelta());
1236 request_params_.set_update_check_count_wait_enabled(true);
1237 request_params_.set_min_update_checks_needed(0);
1238 request_params_.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001239
May Lippert60aa3ca2018-08-15 16:55:29 -07001240 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1241
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001242 ASSERT_TRUE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001243 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001244 -1,
1245 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001246 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001247 metrics::CheckResult::kUpdateAvailable,
1248 metrics::CheckReaction::kUpdating,
1249 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001250 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001251 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001252
Ben Chan9abb7632014-08-07 00:10:53 -07001253 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001254 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001255 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001256 EXPECT_TRUE(response.update_exists);
1257}
1258
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001259TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001260 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001261 request_params_.set_wall_clock_based_wait_enabled(true);
1262 request_params_.set_waiting_period(TimeDelta());
1263 request_params_.set_update_check_count_wait_enabled(true);
1264 request_params_.set_min_update_checks_needed(1);
1265 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001266
May Lippert60aa3ca2018-08-15 16:55:29 -07001267 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1268
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001269 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001270 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001271 -1,
1272 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001273 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001274 metrics::CheckResult::kUpdateAvailable,
1275 metrics::CheckReaction::kDeferring,
1276 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001277 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001278 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001279
Ben Chan9abb7632014-08-07 00:10:53 -07001280 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001281 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001282 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001283 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001284
1285 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001286 request_params_.set_interactive(true);
1287 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1288 -1,
1289 false, // ping_only
1290 ErrorCode::kSuccess,
1291 metrics::CheckResult::kUpdateAvailable,
1292 metrics::CheckReaction::kUpdating,
1293 metrics::DownloadErrorCode::kUnset,
1294 &response,
1295 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001296 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001297}
1298
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001299TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001300 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001301 request_params_.set_wall_clock_based_wait_enabled(true);
1302 request_params_.set_waiting_period(TimeDelta());
1303 request_params_.set_update_check_count_wait_enabled(true);
1304 request_params_.set_min_update_checks_needed(1);
1305 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001306
May Lippert60aa3ca2018-08-15 16:55:29 -07001307 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1308
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001309 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001310
1311 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001312 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001313 -1,
1314 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001315 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001316 metrics::CheckResult::kUpdateAvailable,
1317 metrics::CheckReaction::kDeferring,
1318 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001319 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001320 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001321
Ben Chan9abb7632014-08-07 00:10:53 -07001322 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001323 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001324 // count remains the same, as the decrementing happens in update_attempter
1325 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001326 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001327 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001328
1329 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001330 request_params_.set_interactive(true);
1331 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1332 -1,
1333 false, // ping_only
1334 ErrorCode::kSuccess,
1335 metrics::CheckResult::kUpdateAvailable,
1336 metrics::CheckReaction::kUpdating,
1337 metrics::DownloadErrorCode::kUnset,
1338 &response,
1339 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001340 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001341}
Jay Srinivasan0a708742012-03-20 11:26:12 -07001342
Adolfo Victoria497044c2018-07-18 07:51:42 -07001343TEST_F(OmahaRequestActionTest, StagingTurnedOnCausesScattering) {
1344 // If staging is on, the value for max days to scatter should be ignored, and
1345 // staging's scatter value should be used.
1346 OmahaResponse response;
1347 request_params_.set_wall_clock_based_wait_enabled(true);
1348 request_params_.set_waiting_period(TimeDelta::FromDays(6));
1349 request_params_.set_update_check_count_wait_enabled(false);
1350
May Lippert60aa3ca2018-08-15 16:55:29 -07001351 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1352
Adolfo Victoria497044c2018-07-18 07:51:42 -07001353 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsWallClockStagingWaitPeriod, 6));
1354 // This should not prevent scattering due to staging.
1355 fake_update_response_.max_days_to_scatter = "0";
1356 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1357 -1,
1358 false, // ping_only
1359 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1360 metrics::CheckResult::kUpdateAvailable,
1361 metrics::CheckReaction::kDeferring,
1362 metrics::DownloadErrorCode::kUnset,
1363 &response,
1364 nullptr));
1365 EXPECT_FALSE(response.update_exists);
1366
1367 // Interactive updates should not be affected.
1368 request_params_.set_interactive(true);
1369 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1370 -1,
1371 false, // ping_only
1372 ErrorCode::kSuccess,
1373 metrics::CheckResult::kUpdateAvailable,
1374 metrics::CheckReaction::kUpdating,
1375 metrics::DownloadErrorCode::kUnset,
1376 &response,
1377 nullptr));
1378 EXPECT_TRUE(response.update_exists);
1379}
1380
Alex Deymo8e18f932015-03-27 16:16:59 -07001381TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
1382 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001383 fake_update_response_.include_cohorts = true;
1384 fake_update_response_.cohort = "s/154454/8479665";
1385 fake_update_response_.cohorthint = "please-put-me-on-beta";
1386 fake_update_response_.cohortname = "stable";
1387
Marton Hunyady2abda312018-04-24 18:21:49 +02001388 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001389 -1,
1390 false, // ping_only
1391 ErrorCode::kSuccess,
1392 metrics::CheckResult::kUpdateAvailable,
1393 metrics::CheckReaction::kUpdating,
1394 metrics::DownloadErrorCode::kUnset,
1395 &response,
1396 nullptr));
1397
1398 string value;
1399 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1400 EXPECT_EQ(fake_update_response_.cohort, value);
1401
1402 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1403 EXPECT_EQ(fake_update_response_.cohorthint, value);
1404
1405 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1406 EXPECT_EQ(fake_update_response_.cohortname, value);
1407}
1408
1409TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
1410 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001411 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1412 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
1413 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
1414 fake_update_response_.include_cohorts = true;
1415 fake_update_response_.cohort = "s/154454/8479665";
1416 fake_update_response_.cohorthint = "please-put-me-on-beta";
1417 fake_update_response_.cohortname = "";
1418
Marton Hunyady2abda312018-04-24 18:21:49 +02001419 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001420 -1,
1421 false, // ping_only
1422 ErrorCode::kSuccess,
1423 metrics::CheckResult::kUpdateAvailable,
1424 metrics::CheckReaction::kUpdating,
1425 metrics::DownloadErrorCode::kUnset,
1426 &response,
1427 nullptr));
1428
1429 string value;
1430 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1431 EXPECT_EQ(fake_update_response_.cohort, value);
1432
1433 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1434 EXPECT_EQ(fake_update_response_.cohorthint, value);
1435
1436 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1437}
1438
1439TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
1440 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001441 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1442
Marton Hunyady2abda312018-04-24 18:21:49 +02001443 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001444 -1,
1445 false, // ping_only
1446 ErrorCode::kSuccess,
1447 metrics::CheckResult::kUpdateAvailable,
1448 metrics::CheckReaction::kUpdating,
1449 metrics::DownloadErrorCode::kUnset,
1450 &response,
1451 nullptr));
1452
1453 string value;
1454 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1455 EXPECT_EQ("old_value", value);
1456
1457 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1458 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1459}
1460
Alex Deymo00d79ac2015-06-29 15:41:49 -07001461TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
1462 OmahaResponse response;
Alex Deymo00d79ac2015-06-29 15:41:49 -07001463 fake_update_response_.include_cohorts = true;
1464 fake_update_response_.cohort = "s/154454/8479665";
1465 fake_update_response_.cohorthint = "please-put-me-on-beta";
1466 fake_update_response_.cohortname = "stable";
1467
Marton Hunyady2abda312018-04-24 18:21:49 +02001468 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Alex Deymo00d79ac2015-06-29 15:41:49 -07001469 -1,
1470 false, // ping_only
1471 ErrorCode::kSuccess,
1472 metrics::CheckResult::kNoUpdateAvailable,
1473 metrics::CheckReaction::kUnset,
1474 metrics::DownloadErrorCode::kUnset,
1475 &response,
1476 nullptr));
1477
1478 string value;
1479 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1480 EXPECT_EQ(fake_update_response_.cohort, value);
1481
1482 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1483 EXPECT_EQ(fake_update_response_.cohorthint, value);
1484
1485 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1486 EXPECT_EQ(fake_update_response_.cohortname, value);
1487}
1488
Sen Jiangb1e063a2017-09-15 17:44:31 -07001489TEST_F(OmahaRequestActionTest, MultiAppCohortTest) {
1490 OmahaResponse response;
Sen Jiangb1e063a2017-09-15 17:44:31 -07001491 fake_update_response_.multi_app = true;
1492 fake_update_response_.include_cohorts = true;
1493 fake_update_response_.cohort = "s/154454/8479665";
1494 fake_update_response_.cohorthint = "please-put-me-on-beta";
1495 fake_update_response_.cohortname = "stable";
1496
Marton Hunyady2abda312018-04-24 18:21:49 +02001497 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangb1e063a2017-09-15 17:44:31 -07001498 -1,
1499 false, // ping_only
1500 ErrorCode::kSuccess,
1501 metrics::CheckResult::kUpdateAvailable,
1502 metrics::CheckReaction::kUpdating,
1503 metrics::DownloadErrorCode::kUnset,
1504 &response,
1505 nullptr));
1506
1507 string value;
1508 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1509 EXPECT_EQ(fake_update_response_.cohort, value);
1510
1511 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1512 EXPECT_EQ(fake_update_response_.cohorthint, value);
1513
1514 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1515 EXPECT_EQ(fake_update_response_.cohortname, value);
1516}
1517
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001518TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Alex Deymo8e18f932015-03-27 16:16:59 -07001519 const string http_response(fake_update_response_.GetNoUpdateResponse());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001520
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001521 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001522 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001523
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001524 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001525 &fake_system_state_,
1526 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001527 std::make_unique<MockHttpFetcher>(
1528 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001529 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001530 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001531 processor.set_delegate(&delegate_);
1532 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001533
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -07001534 loop.PostTask(base::Bind(
1535 [](ActionProcessor* processor) { processor->StartProcessing(); },
1536 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -07001537 loop.Run();
1538 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001539 EXPECT_FALSE(processor.IsRunning());
1540}
1541
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001542TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001543 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001544 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1545 -1,
1546 false, // ping_only
1547 ErrorCode::kOmahaRequestXMLParseError,
1548 metrics::CheckResult::kParsingError,
1549 metrics::CheckReaction::kUnset,
1550 metrics::DownloadErrorCode::kUnset,
1551 &response,
1552 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001553 EXPECT_FALSE(response.update_exists);
1554}
1555
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001556TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001557 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001558 ASSERT_FALSE(TestUpdateCheck("",
1559 -1,
1560 false, // ping_only
1561 ErrorCode::kOmahaRequestEmptyResponseError,
1562 metrics::CheckResult::kParsingError,
1563 metrics::CheckReaction::kUnset,
1564 metrics::DownloadErrorCode::kUnset,
1565 &response,
1566 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001567 EXPECT_FALSE(response.update_exists);
1568}
1569
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001570TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001571 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001572 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001573 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1574 "<daystart elapsed_seconds=\"100\"/>"
1575 "<app appid=\"foo\" status=\"ok\">"
1576 "<ping status=\"ok\"/>"
1577 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001578 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001579 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001580 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001581 metrics::CheckResult::kParsingError,
1582 metrics::CheckReaction::kUnset,
1583 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001584 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001585 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001586 EXPECT_FALSE(response.update_exists);
1587}
1588
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001589TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001590 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001591 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001592 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1593 "<daystart elapsed_seconds=\"100\"/>"
1594 "<app appid=\"foo\" status=\"ok\">"
1595 "<ping status=\"ok\"/>"
1596 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001597 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001598 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001599 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001600 metrics::CheckResult::kParsingError,
1601 metrics::CheckReaction::kUnset,
1602 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001603 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001604 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001605 EXPECT_FALSE(response.update_exists);
1606}
1607
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001608TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001609 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001610 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001611 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1612 "<daystart elapsed_seconds=\"100\"/>"
1613 "<app appid=\"foo\" status=\"ok\">"
1614 "<ping status=\"ok\"/>"
1615 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001616 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001617 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001618 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001619 metrics::CheckResult::kParsingError,
1620 metrics::CheckReaction::kUnset,
1621 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001622 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001623 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001624 EXPECT_FALSE(response.update_exists);
1625}
1626
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001627TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001628 string input_response =
1629 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1630 "<daystart elapsed_seconds=\"100\"/>"
Aaron Wood7dcdedf2017-09-06 17:17:41 -07001631 // the appid needs to match that in the request params
1632 "<app appid=\"" +
1633 fake_update_response_.app_id +
1634 "\" status=\"ok\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001635 "<updatecheck status=\"ok\">"
1636 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001637 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001638 "<packages><package hash=\"not-used\" name=\"f\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001639 "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001640 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001641 "Prompt=\"false\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001642 "IsDeltaPayload=\"false\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001643 "sha256=\"not-used\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001644 "/></actions></manifest></updatecheck></app></response>";
1645 LOG(INFO) << "Input Response = " << input_response;
1646
Darin Petkov6a5b3222010-07-13 14:55:28 -07001647 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001648 ASSERT_TRUE(TestUpdateCheck(input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001649 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001650 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001651 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001652 metrics::CheckResult::kUpdateAvailable,
1653 metrics::CheckReaction::kUpdating,
1654 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001655 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001656 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001657 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001658 EXPECT_EQ("10.2.3.4", response.version);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001659 EXPECT_EQ("http://missing/field/test/f",
1660 response.packages[0].payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001661 EXPECT_EQ("", response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001662 EXPECT_EQ("lkq34j5345", response.packages[0].hash);
1663 EXPECT_EQ(587u, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001664 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001665 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001666}
1667
1668namespace {
1669class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1670 public:
1671 void ProcessingStopped(const ActionProcessor* processor) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001672 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001673 }
Darin Petkov6a5b3222010-07-13 14:55:28 -07001674};
1675
Alex Deymo60ca1a72015-06-18 18:19:15 -07001676void TerminateTransferTestStarter(ActionProcessor* processor) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001677 processor->StartProcessing();
1678 CHECK(processor->IsRunning());
1679 processor->StopProcessing();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001680}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001681} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001682
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001683TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001684 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001685 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001686
Alex Deymo60ca1a72015-06-18 18:19:15 -07001687 string http_response("doesn't matter");
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001688 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001689 &fake_system_state_,
1690 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001691 std::make_unique<MockHttpFetcher>(
1692 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001693 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001694 TerminateEarlyTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001695 ActionProcessor processor;
1696 processor.set_delegate(&delegate);
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001697 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001698
Alex Deymo60ca1a72015-06-18 18:19:15 -07001699 loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
1700 loop.Run();
1701 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001702}
1703
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001704TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Alex Deymob0d74eb2015-03-30 17:59:17 -07001705 string output;
1706 EXPECT_TRUE(XmlEncode("ab", &output));
1707 EXPECT_EQ("ab", output);
1708 EXPECT_TRUE(XmlEncode("a<b", &output));
1709 EXPECT_EQ("a&lt;b", output);
Alex Deymocc457852015-06-18 18:35:50 -07001710 EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1711 EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
Alex Deymob0d74eb2015-03-30 17:59:17 -07001712 EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1713 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
Alex Deymocc457852015-06-18 18:35:50 -07001714 // Check that unterminated UTF-8 strings are handled properly.
Alex Deymob0d74eb2015-03-30 17:59:17 -07001715 EXPECT_FALSE(XmlEncode("\xc2", &output));
1716 // Fail with invalid ASCII-7 chars.
1717 EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1718}
Darin Petkov6a5b3222010-07-13 14:55:28 -07001719
Alex Deymob0d74eb2015-03-30 17:59:17 -07001720TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1721 EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1722 EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1723}
1724
1725TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001726 brillo::Blob post_data;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001727
1728 // Make sure XML Encode is being called on the params
Marton Hunyady2abda312018-04-24 18:21:49 +02001729 request_params_.set_os_sp("testtheservice_pack>");
1730 request_params_.set_os_board("x86 generic<id");
1731 request_params_.set_current_channel("unittest_track&lt;");
1732 request_params_.set_target_channel("unittest_track&lt;");
1733 request_params_.set_hwid("<OEM MODEL>");
Alex Deymo8e18f932015-03-27 16:16:59 -07001734 fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
1735 fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
1736 fake_prefs_.SetString(kPrefsOmahaCohortName,
Alex Vakulenko0103c362016-01-20 07:56:15 -08001737 base::JoinString(
1738 vector<string>(100, "My spoon is too big."), " "));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001739 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001740 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1741 -1,
1742 false, // ping_only
1743 ErrorCode::kOmahaRequestXMLParseError,
1744 metrics::CheckResult::kParsingError,
1745 metrics::CheckReaction::kUnset,
1746 metrics::DownloadErrorCode::kUnset,
1747 &response,
1748 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001749 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001750 string post_str(post_data.begin(), post_data.end());
Alex Deymo8e18f932015-03-27 16:16:59 -07001751 EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
1752 EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
1753 EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
1754 EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
1755 EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
1756 EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
1757 EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
1758 EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
1759 EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
1760 EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
1761 EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
1762 // Values from Prefs that are too big are removed from the XML instead of
1763 // encoded.
1764 EXPECT_EQ(string::npos, post_str.find("cohortname="));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001765}
1766
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001767TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001768 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001769 fake_update_response_.deadline = "&lt;20110101";
1770 fake_update_response_.more_info_url = "testthe&lt;url";
1771 fake_update_response_.codebase = "testthe&amp;codebase/";
Marton Hunyady2abda312018-04-24 18:21:49 +02001772 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1773 -1,
1774 false, // ping_only
1775 ErrorCode::kSuccess,
1776 metrics::CheckResult::kUpdateAvailable,
1777 metrics::CheckReaction::kUpdating,
1778 metrics::DownloadErrorCode::kUnset,
1779 &response,
1780 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001781
Sen Jiang0affc2c2017-02-10 15:55:05 -08001782 EXPECT_EQ("testthe<url", response.more_info_url);
1783 EXPECT_EQ("testthe&codebase/file.signed",
1784 response.packages[0].payload_urls[0]);
1785 EXPECT_EQ("<20110101", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001786}
1787
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001788TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001789 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001790 // overflows int32_t:
Sen Jiang0affc2c2017-02-10 15:55:05 -08001791 fake_update_response_.size = 123123123123123ull;
Marton Hunyady2abda312018-04-24 18:21:49 +02001792 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1793 -1,
1794 false, // ping_only
1795 ErrorCode::kSuccess,
1796 metrics::CheckResult::kUpdateAvailable,
1797 metrics::CheckReaction::kUpdating,
1798 metrics::DownloadErrorCode::kUnset,
1799 &response,
1800 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001801
Sen Jiang0affc2c2017-02-10 15:55:05 -08001802 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001803}
1804
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001805TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001806 brillo::Blob post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001807 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001808 fake_system_state_.set_prefs(&prefs);
1809
Darin Petkov95508da2011-01-05 12:42:29 -08001810 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Ben Chan672c1f52017-10-23 15:41:39 -07001811 .WillOnce(DoAll(SetArgPointee<1>(string("")), Return(true)));
Alex Deymoefb9d832015-11-02 18:39:02 -08001812 // An existing but empty previous version means that we didn't reboot to a new
1813 // update, therefore, no need to update the previous version.
1814 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
Marton Hunyady2abda312018-04-24 18:21:49 +02001815 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001816 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001817 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001818 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001819 metrics::CheckResult::kParsingError,
1820 metrics::CheckReaction::kUnset,
1821 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001822 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001823 &post_data));
1824 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001825 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001826 EXPECT_NE(
1827 post_str.find(" <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1828 " <updatecheck></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001829 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001830 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1831 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001832 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1833 string::npos);
1834 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1835 string::npos);
Alex Deymoefb9d832015-11-02 18:39:02 -08001836 // No <event> tag should be sent if we didn't reboot to an update.
1837 EXPECT_EQ(post_str.find("<event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001838}
1839
Jay Srinivasan0a708742012-03-20 11:26:12 -07001840
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001841TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001842 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001843 TestEvent(new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
Darin Petkove17f86b2010-07-20 09:12:01 -07001844 "invalid xml>",
1845 &post_data);
1846 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001847 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001848 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001849 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001850 OmahaEvent::kTypeUpdateDownloadStarted,
1851 OmahaEvent::kResultSuccess);
1852 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001853 EXPECT_EQ(post_str.find("ping"), string::npos);
1854 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001855}
1856
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001857TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001858 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001859 TestEvent(new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
Darin Petkove17f86b2010-07-20 09:12:01 -07001860 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001861 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001862 "invalid xml>",
1863 &post_data);
1864 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001865 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001866 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001867 " <event eventtype=\"%d\" eventresult=\"%d\" "
1868 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001869 OmahaEvent::kTypeDownloadComplete,
1870 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001871 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001872 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001873 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001874}
1875
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001876TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001877 string http_response("doesn't matter");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001878 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001879 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001880 nullptr,
Ben Chanab5a0af2017-10-12 14:57:50 -07001881 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001882 http_response.size(),
1883 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001884 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001885 EXPECT_FALSE(update_check_action.IsEvent());
1886
1887 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001888 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001889 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Ben Chanab5a0af2017-10-12 14:57:50 -07001890 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001891 http_response.size(),
1892 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001893 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001894 EXPECT_TRUE(event_action.IsEvent());
1895}
1896
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001897TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001898 for (int i = 0; i < 2; i++) {
1899 bool delta_okay = i == 1;
1900 const char* delta_okay_str = delta_okay ? "true" : "false";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001901 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001902
1903 request_params_.set_delta_okay(delta_okay);
1904
1905 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001906 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001907 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001908 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001909 metrics::CheckResult::kParsingError,
1910 metrics::CheckReaction::kUnset,
1911 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001912 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001913 &post_data));
1914 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001915 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001916 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1917 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001918 string::npos)
1919 << "i = " << i;
1920 }
1921}
1922
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001923TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001924 for (int i = 0; i < 2; i++) {
1925 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001926 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001927 brillo::Blob post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001928 FakeSystemState fake_system_state;
Marton Hunyady2abda312018-04-24 18:21:49 +02001929
1930 request_params_.set_interactive(interactive);
1931
1932 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001933 -1,
1934 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001935 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001936 metrics::CheckResult::kParsingError,
1937 metrics::CheckReaction::kUnset,
1938 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001939 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001940 &post_data));
1941 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001942 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001943 EXPECT_NE(post_str.find(
1944 base::StringPrintf("installsource=\"%s\"", interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001945 string::npos)
1946 << "i = " << i;
1947 }
1948}
1949
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001950TEST_F(OmahaRequestActionTest, FormatTargetVersionPrefixOutputTest) {
1951 for (int i = 0; i < 2; i++) {
1952 bool target_version_set = i == 1;
1953 const char* target_version_prefix = target_version_set ? "10032." : "";
1954 brillo::Blob post_data;
1955 FakeSystemState fake_system_state;
1956
1957 request_params_.set_target_version_prefix(target_version_prefix);
1958
1959 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1960 -1,
1961 false, // ping_only
1962 ErrorCode::kOmahaRequestXMLParseError,
1963 metrics::CheckResult::kParsingError,
1964 metrics::CheckReaction::kUnset,
1965 metrics::DownloadErrorCode::kUnset,
1966 nullptr,
1967 &post_data));
1968 // convert post_data to string
1969 string post_str(post_data.begin(), post_data.end());
1970 if (target_version_set) {
1971 EXPECT_NE(post_str.find("<updatecheck targetversionprefix=\"10032.\">"),
1972 string::npos)
1973 << "i = " << i;
1974 } else {
1975 EXPECT_EQ(post_str.find("targetversionprefix"), string::npos)
1976 << "i = " << i;
1977 }
1978 }
1979}
1980
1981TEST_F(OmahaRequestActionTest, FormatRollbackAllowedOutputTest) {
1982 for (int i = 0; i < 4; i++) {
1983 bool rollback_allowed = i / 2 == 0;
1984 bool target_version_set = i % 2 == 0;
1985 brillo::Blob post_data;
1986 FakeSystemState fake_system_state;
1987
1988 request_params_.set_target_version_prefix(target_version_set ? "10032."
1989 : "");
1990 request_params_.set_rollback_allowed(rollback_allowed);
1991
1992 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1993 -1,
1994 false, // ping_only
1995 ErrorCode::kOmahaRequestXMLParseError,
1996 metrics::CheckResult::kParsingError,
1997 metrics::CheckReaction::kUnset,
1998 metrics::DownloadErrorCode::kUnset,
1999 nullptr,
2000 &post_data));
2001 // convert post_data to string
2002 string post_str(post_data.begin(), post_data.end());
2003 if (rollback_allowed && target_version_set) {
2004 EXPECT_NE(post_str.find("rollback_allowed=\"true\""), string::npos)
2005 << "i = " << i;
2006 } else {
2007 EXPECT_EQ(post_str.find("rollback_allowed"), string::npos) << "i = " << i;
2008 }
2009 }
2010}
2011
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002012TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07002013 OmahaEvent default_event;
2014 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
2015 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002016 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002017
2018 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
2019 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
2020 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002021 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002022
2023 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
2024 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002025 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07002026 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
2027 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002028 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002029}
2030
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002031void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002032 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002033 fake_system_state_.set_prefs(&prefs);
2034 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2035 .Times(AnyNumber());
2036 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
2037 // Add a few hours to the day difference to test no rounding, etc.
2038 int64_t five_days_ago =
2039 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
2040 int64_t six_days_ago =
2041 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
2042 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002043 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002044 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002045 .WillOnce(DoAll(SetArgPointee<1>(six_days_ago), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002046 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002047 .WillOnce(DoAll(SetArgPointee<1>(five_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002048 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002049 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07002050 -1,
2051 ping_only,
2052 ErrorCode::kSuccess,
2053 metrics::CheckResult::kNoUpdateAvailable,
2054 metrics::CheckReaction::kUnset,
2055 metrics::DownloadErrorCode::kUnset,
2056 nullptr,
2057 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002058 string post_str(post_data.begin(), post_data.end());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002059 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
2060 string::npos);
2061 if (ping_only) {
2062 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
2063 EXPECT_EQ(post_str.find("previousversion"), string::npos);
2064 } else {
2065 EXPECT_NE(post_str.find("updatecheck"), string::npos);
2066 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07002067 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002068}
2069
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002070TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
2071 PingTest(true /* ping_only */);
2072}
2073
2074TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
2075 PingTest(false /* ping_only */);
2076}
2077
2078TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002079 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002080 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002081 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2082 .Times(AnyNumber());
2083 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002084 int64_t three_days_ago =
2085 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
2086 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002087 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002088 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002089 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002090 .WillOnce(DoAll(SetArgPointee<1>(three_days_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002091 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002092 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002093 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002094 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2095 -1,
2096 false, // ping_only
2097 ErrorCode::kSuccess,
2098 metrics::CheckResult::kNoUpdateAvailable,
2099 metrics::CheckReaction::kUnset,
2100 metrics::DownloadErrorCode::kUnset,
2101 nullptr,
2102 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002103 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002104 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07002105 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002106}
2107
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002108TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002109 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002110 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002111 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2112 .Times(AnyNumber());
2113 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002114 int64_t four_days_ago =
2115 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
2116 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002117 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002118 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002119 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002120 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002121 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002122 .WillOnce(DoAll(SetArgPointee<1>(four_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002123 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002124 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2125 -1,
2126 false, // ping_only
2127 ErrorCode::kSuccess,
2128 metrics::CheckResult::kNoUpdateAvailable,
2129 metrics::CheckReaction::kUnset,
2130 metrics::DownloadErrorCode::kUnset,
2131 nullptr,
2132 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002133 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002134 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07002135 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002136}
2137
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002138TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002139 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002140 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002141 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2142 .Times(AnyNumber());
2143 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002144 int64_t one_hour_ago =
2145 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002146 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002147 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002148 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002149 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002150 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002151 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002152 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
2153 // send a ping.
2154 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2155 .WillOnce(Return(true));
2156 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2157 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002158 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002159 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2160 -1,
2161 false, // ping_only
2162 ErrorCode::kSuccess,
2163 metrics::CheckResult::kNoUpdateAvailable,
2164 metrics::CheckReaction::kUnset,
2165 metrics::DownloadErrorCode::kUnset,
2166 nullptr,
2167 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002168 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002169 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002170}
2171
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002172TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07002173 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08002174 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002175 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07002176 int64_t now = Time::Now().ToInternalValue();
2177 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002178 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002179 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002180 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002181 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2182 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002183 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002184 EXPECT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2185 -1,
2186 true, // ping_only
2187 ErrorCode::kSuccess,
2188 metrics::CheckResult::kUnset,
2189 metrics::CheckReaction::kUnset,
2190 metrics::DownloadErrorCode::kUnset,
2191 nullptr,
2192 &post_data));
Alex Deymo80f70ff2016-02-10 16:08:11 -08002193 EXPECT_EQ(0U, post_data.size());
Thieu Leb44e9e82011-06-06 14:34:04 -07002194}
2195
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002196TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002197 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002198 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002199 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2200 .Times(AnyNumber());
2201 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002202 int64_t future =
2203 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002204 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002205 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002206 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002207 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002208 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002209 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002210 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2211 .WillOnce(Return(true));
2212 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2213 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002214 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002215 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002216 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002217 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002218 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002219 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002220 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002221 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002222 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002223 metrics::CheckResult::kNoUpdateAvailable,
2224 metrics::CheckReaction::kUnset,
2225 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002226 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002227 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002228 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002229 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002230}
2231
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002232TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002233 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07002234 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002235 // may fail if it runs for longer than 5 seconds. It shouldn't run
2236 // that long though.
2237 int64_t midnight =
2238 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
2239 int64_t midnight_slack =
2240 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08002241 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002242 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002243 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2244 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002245 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
2246 AllOf(Ge(midnight), Le(midnight_slack))))
2247 .WillOnce(Return(true));
2248 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
2249 AllOf(Ge(midnight), Le(midnight_slack))))
2250 .WillOnce(Return(true));
2251 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002252 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002253 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002254 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002255 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002256 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002257 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002258 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002259 metrics::CheckResult::kNoUpdateAvailable,
2260 metrics::CheckReaction::kUnset,
2261 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002262 nullptr,
2263 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002264}
2265
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002266TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002267 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002268 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002269 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2270 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002271 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2272 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2273 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002274 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002275 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002276 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002277 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002278 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002279 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002280 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002281 metrics::CheckResult::kNoUpdateAvailable,
2282 metrics::CheckReaction::kUnset,
2283 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002284 nullptr,
2285 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002286}
2287
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002288TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002289 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002290 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002291 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2292 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002293 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2294 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2295 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002296 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002297 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002298 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002299 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002300 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002301 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002302 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002303 metrics::CheckResult::kNoUpdateAvailable,
2304 metrics::CheckReaction::kUnset,
2305 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002306 nullptr,
2307 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002308}
2309
Alex Deymob3fa53b2016-04-18 19:57:58 -07002310TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
2311 // Test that the "eol" flags is only parsed from the "_eol" attribute and not
2312 // the "eol" attribute.
2313 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002314 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Alex Deymob3fa53b2016-04-18 19:57:58 -07002315 "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
2316 "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
2317 "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
2318 "</app></response>",
2319 -1,
2320 false, // ping_only
2321 ErrorCode::kSuccess,
2322 metrics::CheckResult::kNoUpdateAvailable,
2323 metrics::CheckReaction::kUnset,
2324 metrics::DownloadErrorCode::kUnset,
2325 nullptr,
2326 nullptr));
2327 string eol_pref;
2328 EXPECT_TRUE(
2329 fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
2330 // Note that the eol="eol" attribute should be ignored and the _eol should be
2331 // used instead.
2332 EXPECT_EQ("security-only", eol_pref);
2333}
2334
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002335TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002336 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002337 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002338 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002339 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002340 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002341 metrics::CheckResult::kParsingError,
2342 metrics::CheckReaction::kUnset,
2343 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002344 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07002345 &post_data));
2346 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002347 string post_str(post_data.begin(), post_data.end());
Darin Petkov84c763c2010-07-29 16:27:58 -07002348 EXPECT_EQ(post_str.find("machineid="), string::npos);
2349 EXPECT_EQ(post_str.find("userid="), string::npos);
2350}
2351
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002352TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002353 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002354 const int http_error_code =
2355 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Marton Hunyady2abda312018-04-24 18:21:49 +02002356 ASSERT_FALSE(TestUpdateCheck("",
2357 501,
2358 false, // ping_only
2359 static_cast<ErrorCode>(http_error_code),
2360 metrics::CheckResult::kDownloadError,
2361 metrics::CheckReaction::kUnset,
2362 static_cast<metrics::DownloadErrorCode>(501),
2363 &response,
2364 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002365 EXPECT_FALSE(response.update_exists);
2366}
2367
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002368TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002369 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002370 const int http_error_code =
2371 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Marton Hunyady2abda312018-04-24 18:21:49 +02002372 ASSERT_FALSE(TestUpdateCheck("",
2373 1500,
2374 false, // ping_only
2375 static_cast<ErrorCode>(http_error_code),
2376 metrics::CheckResult::kDownloadError,
2377 metrics::CheckReaction::kUnset,
2378 metrics::DownloadErrorCode::kHttpStatusOther,
2379 &response,
2380 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002381 EXPECT_FALSE(response.update_exists);
2382}
2383
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002384TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002385 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002386 request_params_.set_wall_clock_based_wait_enabled(true);
2387 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2388 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002389
Sen Jiang7c1171e2016-06-23 11:35:40 -07002390 Time arbitrary_date;
Eric Caruso761be2c2018-05-22 16:23:33 -07002391 ASSERT_TRUE(Time::FromString("6/4/1989", &arbitrary_date));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002392 fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
Marton Hunyady2abda312018-04-24 18:21:49 +02002393 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002394 -1,
2395 false, // ping_only
2396 ErrorCode::kOmahaUpdateDeferredPerPolicy,
2397 metrics::CheckResult::kUpdateAvailable,
2398 metrics::CheckReaction::kDeferring,
2399 metrics::DownloadErrorCode::kUnset,
2400 &response,
2401 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002402
Ben Chan9abb7632014-08-07 00:10:53 -07002403 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002404 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002405 EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002406 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07002407
2408 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02002409 request_params_.set_interactive(true);
2410 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002411 -1,
2412 false, // ping_only
2413 ErrorCode::kSuccess,
2414 metrics::CheckResult::kUpdateAvailable,
2415 metrics::CheckReaction::kUpdating,
2416 metrics::DownloadErrorCode::kUnset,
2417 &response,
2418 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07002419 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002420}
2421
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002422TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002423 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002424 request_params_.set_wall_clock_based_wait_enabled(true);
2425 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2426 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002427
Sen Jiang7c1171e2016-06-23 11:35:40 -07002428 Time t1, t2;
Eric Caruso761be2c2018-05-22 16:23:33 -07002429 ASSERT_TRUE(Time::FromString("1/1/2012", &t1));
2430 ASSERT_TRUE(Time::FromString("1/3/2012", &t2));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002431 ASSERT_TRUE(
2432 fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2433 fake_system_state_.fake_clock()->SetWallclockTime(t2);
Marton Hunyady2abda312018-04-24 18:21:49 +02002434 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002435 -1,
2436 false, // ping_only
2437 ErrorCode::kSuccess,
2438 metrics::CheckResult::kUpdateAvailable,
2439 metrics::CheckReaction::kUpdating,
2440 metrics::DownloadErrorCode::kUnset,
2441 &response,
2442 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002443
2444 EXPECT_TRUE(response.update_exists);
2445
2446 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002447 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002448 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002449 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2450}
2451
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002452TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002453 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002454 base::ScopedTempDir tempdir;
2455 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002456
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002457 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002458 request_params_.set_root(tempdir.GetPath().value());
2459 request_params_.set_app_id("{22222222-2222-2222-2222-222222222222}");
2460 request_params_.set_app_version("1.2.3.4");
2461 request_params_.set_product_components("o.bundle=1");
2462 request_params_.set_current_channel("canary-channel");
2463 EXPECT_TRUE(
2464 request_params_.SetTargetChannel("stable-channel", true, nullptr));
2465 request_params_.UpdateDownloadChannel();
2466 EXPECT_TRUE(request_params_.ShouldPowerwash());
2467 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002468 -1,
2469 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002470 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002471 metrics::CheckResult::kParsingError,
2472 metrics::CheckReaction::kUnset,
2473 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002474 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002475 &post_data));
2476 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002477 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002478 EXPECT_NE(string::npos, post_str.find(
2479 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2480 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2481 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Sen Jiang8cd42342018-01-31 12:06:59 -08002482 EXPECT_EQ(string::npos, post_str.find("o.bundle"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002483}
2484
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002485TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002486 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002487 base::ScopedTempDir tempdir;
2488 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002489
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002490 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002491 request_params_.set_root(tempdir.GetPath().value());
2492 request_params_.set_app_id("{11111111-1111-1111-1111-111111111111}");
2493 request_params_.set_app_version("5.6.7.8");
2494 request_params_.set_product_components("o.bundle=1");
2495 request_params_.set_current_channel("stable-channel");
2496 EXPECT_TRUE(
2497 request_params_.SetTargetChannel("canary-channel", false, nullptr));
2498 request_params_.UpdateDownloadChannel();
2499 EXPECT_FALSE(request_params_.ShouldPowerwash());
2500 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002501 -1,
2502 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002503 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002504 metrics::CheckResult::kParsingError,
2505 metrics::CheckReaction::kUnset,
2506 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002507 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002508 &post_data));
Xiaochu Liu88d90382018-08-29 16:09:11 -07002509 // Convert post_data to string.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002510 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002511 EXPECT_NE(string::npos, post_str.find(
2512 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2513 "version=\"5.6.7.8\" "
2514 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002515 EXPECT_EQ(string::npos, post_str.find("from_version"));
Sen Jiang8cd42342018-01-31 12:06:59 -08002516 EXPECT_NE(string::npos, post_str.find("o.bundle.version=\"1\""));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002517}
2518
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002519// Checks that the initial ping with a=-1 r=-1 is not send when the device
2520// was powerwashed.
2521TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
2522 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2523
2524 // Flag that the device was powerwashed in the past.
2525 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
2526
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002527 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002528 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2529 -1,
2530 false, // ping_only
2531 ErrorCode::kSuccess,
2532 metrics::CheckResult::kNoUpdateAvailable,
2533 metrics::CheckReaction::kUnset,
2534 metrics::DownloadErrorCode::kUnset,
2535 nullptr,
2536 &post_data));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002537 // We shouldn't send a ping in this case since powerwash > 0.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002538 string post_str(post_data.begin(), post_data.end());
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002539 EXPECT_EQ(string::npos, post_str.find("<ping"));
2540}
2541
Amin Hassani1677e812017-06-21 13:36:36 -07002542// Checks that the initial ping with a=-1 r=-1 is not send when the device
2543// first_active_omaha_ping_sent is set.
2544TEST_F(OmahaRequestActionTest, PingWhenFirstActiveOmahaPingIsSent) {
2545 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2546
2547 // Flag that the device was not powerwashed in the past.
2548 fake_system_state_.fake_hardware()->SetPowerwashCount(0);
2549
2550 // Flag that the device has sent first active ping in the past.
2551 fake_system_state_.fake_hardware()->SetFirstActiveOmahaPingSent();
2552
2553 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002554 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2555 -1,
2556 false, // ping_only
2557 ErrorCode::kSuccess,
2558 metrics::CheckResult::kNoUpdateAvailable,
2559 metrics::CheckReaction::kUnset,
2560 metrics::DownloadErrorCode::kUnset,
2561 nullptr,
2562 &post_data));
Amin Hassani1677e812017-06-21 13:36:36 -07002563 // We shouldn't send a ping in this case since
2564 // first_active_omaha_ping_sent=true
2565 string post_str(post_data.begin(), post_data.end());
2566 EXPECT_EQ(string::npos, post_str.find("<ping"));
2567}
2568
Alex Deymo9fded1e2015-11-05 12:31:19 -08002569// Checks that the event 54 is sent on a reboot to a new update.
2570TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
2571 // Flag that the device was updated in a previous boot.
2572 fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
2573
2574 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002575 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2576 -1,
2577 false, // ping_only
2578 ErrorCode::kSuccess,
2579 metrics::CheckResult::kNoUpdateAvailable,
2580 metrics::CheckReaction::kUnset,
2581 metrics::DownloadErrorCode::kUnset,
2582 nullptr,
2583 &post_data));
Alex Deymo9fded1e2015-11-05 12:31:19 -08002584 string post_str(post_data.begin(), post_data.end());
2585
2586 // An event 54 is included and has the right version.
2587 EXPECT_NE(string::npos,
2588 post_str.find(base::StringPrintf(
2589 "<event eventtype=\"%d\"",
2590 OmahaEvent::kTypeRebootedAfterUpdate)));
2591 EXPECT_NE(string::npos,
2592 post_str.find("previousversion=\"1.2.3.4\"></event>"));
2593
2594 // The previous version flag should have been removed.
2595 EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
2596 string prev_version;
2597 EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
2598 EXPECT_TRUE(prev_version.empty());
2599}
2600
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002601void OmahaRequestActionTest::P2PTest(
2602 bool initial_allow_p2p_for_downloading,
2603 bool initial_allow_p2p_for_sharing,
2604 bool omaha_disable_p2p_for_downloading,
2605 bool omaha_disable_p2p_for_sharing,
2606 bool payload_state_allow_p2p_attempt,
2607 bool expect_p2p_client_lookup,
2608 const string& p2p_client_result_url,
2609 bool expected_allow_p2p_for_downloading,
2610 bool expected_allow_p2p_for_sharing,
2611 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07002612 OmahaResponse response;
Gilad Arnold74b5f552014-10-07 08:17:16 -07002613 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
2614 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
2615 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07002616
2617 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002618 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07002619 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2620 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07002621 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
2622 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
2623 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
2624 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
2625 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
2626 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
2627 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
2628 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
2629 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
2630 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
2631
David Zeuthen8f191b22013-08-06 12:27:50 -07002632 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002633 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07002634 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2635
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002636 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2637 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002638 .Times(expect_p2p_client_lookup ? 1 : 0);
2639
Alex Deymo8e18f932015-03-27 16:16:59 -07002640 fake_update_response_.disable_p2p_for_downloading =
2641 omaha_disable_p2p_for_downloading;
2642 fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
Marton Hunyady2abda312018-04-24 18:21:49 +02002643 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2644 -1,
2645 false, // ping_only
2646 ErrorCode::kSuccess,
2647 metrics::CheckResult::kUpdateAvailable,
2648 metrics::CheckReaction::kUpdating,
2649 metrics::DownloadErrorCode::kUnset,
2650 &response,
2651 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002652 EXPECT_TRUE(response.update_exists);
2653
Gilad Arnold74b5f552014-10-07 08:17:16 -07002654 EXPECT_EQ(omaha_disable_p2p_for_downloading,
2655 response.disable_p2p_for_downloading);
2656 EXPECT_EQ(omaha_disable_p2p_for_sharing,
2657 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07002658
Gilad Arnold74b5f552014-10-07 08:17:16 -07002659 EXPECT_EQ(expected_allow_p2p_for_downloading,
2660 actual_allow_p2p_for_downloading);
2661 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
2662 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07002663}
2664
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002665TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002666 P2PTest(true, // initial_allow_p2p_for_downloading
2667 true, // initial_allow_p2p_for_sharing
2668 false, // omaha_disable_p2p_for_downloading
2669 false, // omaha_disable_p2p_for_sharing
2670 true, // payload_state_allow_p2p_attempt
2671 true, // expect_p2p_client_lookup
2672 "http://1.3.5.7/p2p", // p2p_client_result_url
2673 true, // expected_allow_p2p_for_downloading
2674 true, // expected_allow_p2p_for_sharing
2675 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002676}
2677
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002678TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002679 P2PTest(true, // initial_allow_p2p_for_downloading
2680 true, // initial_allow_p2p_for_sharing
2681 false, // omaha_disable_p2p_for_downloading
2682 false, // omaha_disable_p2p_for_sharing
2683 true, // payload_state_allow_p2p_attempt
2684 true, // expect_p2p_client_lookup
2685 "", // p2p_client_result_url
2686 false, // expected_allow_p2p_for_downloading
2687 true, // expected_allow_p2p_for_sharing
2688 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002689}
2690
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002691TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002692 P2PTest(false, // initial_allow_p2p_for_downloading
2693 true, // initial_allow_p2p_for_sharing
2694 false, // omaha_disable_p2p_for_downloading
2695 false, // omaha_disable_p2p_for_sharing
2696 true, // payload_state_allow_p2p_attempt
2697 false, // expect_p2p_client_lookup
2698 "unset", // p2p_client_result_url
2699 false, // expected_allow_p2p_for_downloading
2700 true, // expected_allow_p2p_for_sharing
2701 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002702}
2703
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002704TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002705 P2PTest(true, // initial_allow_p2p_for_downloading
2706 true, // initial_allow_p2p_for_sharing
2707 true, // omaha_disable_p2p_for_downloading
2708 false, // omaha_disable_p2p_for_sharing
2709 true, // payload_state_allow_p2p_attempt
2710 false, // expect_p2p_client_lookup
2711 "unset", // p2p_client_result_url
2712 false, // expected_allow_p2p_for_downloading
2713 true, // expected_allow_p2p_for_sharing
2714 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002715}
2716
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002717TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002718 P2PTest(true, // initial_allow_p2p_for_downloading
2719 true, // initial_allow_p2p_for_sharing
2720 false, // omaha_disable_p2p_for_downloading
2721 true, // omaha_disable_p2p_for_sharing
2722 true, // payload_state_allow_p2p_attempt
2723 true, // expect_p2p_client_lookup
2724 "http://1.3.5.7/p2p", // p2p_client_result_url
2725 true, // expected_allow_p2p_for_downloading
2726 false, // expected_allow_p2p_for_sharing
2727 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002728}
2729
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002730TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002731 P2PTest(true, // initial_allow_p2p_for_downloading
2732 true, // initial_allow_p2p_for_sharing
2733 true, // omaha_disable_p2p_for_downloading
2734 true, // omaha_disable_p2p_for_sharing
2735 true, // payload_state_allow_p2p_attempt
2736 false, // expect_p2p_client_lookup
2737 "unset", // p2p_client_result_url
2738 false, // expected_allow_p2p_for_downloading
2739 false, // expected_allow_p2p_for_sharing
2740 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002741}
2742
Alex Deymof329b932014-10-30 01:37:48 -07002743bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2744 OmahaResponse *response) {
Alex Deymo8e18f932015-03-27 16:16:59 -07002745 fake_update_response_.elapsed_days = elapsed_days;
Marton Hunyady2abda312018-04-24 18:21:49 +02002746 return TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2747 -1,
2748 false, // ping_only
2749 ErrorCode::kSuccess,
2750 metrics::CheckResult::kUpdateAvailable,
2751 metrics::CheckReaction::kUpdating,
2752 metrics::DownloadErrorCode::kUnset,
2753 response,
2754 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002755}
2756
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002757TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002758 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002759
Kevin Cernekee2494e282016-03-29 18:03:53 -07002760 // Simulate a successful update check that happens during OOBE. The
2761 // deadline in the response is needed to force the update attempt to
2762 // occur; responses without a deadline seen during OOBE will normally
2763 // return ErrorCode::kNonCriticalUpdateInOOBE.
2764 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
2765 fake_update_response_.deadline = "20101020";
2766
David Zeuthen639aa362014-02-03 16:23:44 -08002767 // Check that we parse elapsed_days in the Omaha Response correctly.
2768 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002769 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2770 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002771 EXPECT_TRUE(response.update_exists);
2772 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002773 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002774 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002775 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002776 EXPECT_EQ(prefs_days, 42);
2777
2778 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002779 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002780 EXPECT_TRUE(response.update_exists);
2781 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002782 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002783 EXPECT_EQ(prefs_days, 42);
2784
2785 // Note that elapsed_days is not necessarily divisible by 7 so check
2786 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002787 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2788 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002789 EXPECT_TRUE(response.update_exists);
2790 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002791 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002792 EXPECT_EQ(prefs_days, 21);
2793
2794 // Check that we correctly handle elapsed_days not being included in
2795 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002796 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002797 EXPECT_TRUE(response.update_exists);
2798 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002799}
2800
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002801// If there is no prefs and OOBE is not complete, we should not
2802// report anything to Omaha.
2803TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
Kevin Cernekee2494e282016-03-29 18:03:53 -07002804 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002805 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2806 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2807}
David Zeuthen639aa362014-02-03 16:23:44 -08002808
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002809// If OOBE is complete and happened on a valid date (e.g. after Jan
2810// 1 2007 0:00 PST), that date should be used and written to
2811// prefs. However, first try with an invalid date and check we do
2812// nothing.
2813TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2814 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2815 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2816 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2817 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2818}
David Zeuthen639aa362014-02-03 16:23:44 -08002819
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002820// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2821// should yield an InstallDate of 14.
2822TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2823 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2824 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2825 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2826 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002827
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002828 int64_t prefs_days;
2829 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2830 EXPECT_EQ(prefs_days, 14);
2831}
David Zeuthen639aa362014-02-03 16:23:44 -08002832
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002833// Now that we have a valid date in prefs, check that we keep using
2834// that even if OOBE date reports something else. The date Jan 30,
2835// 2007 0:00 PST should yield an InstallDate of 28... but since
2836// there's a prefs file, we should still get 14.
2837TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2838 // Set a valid date in the prefs first.
2839 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002840
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002841 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2842 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2843 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002844
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002845 int64_t prefs_days;
2846 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2847 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002848
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002849 // If we delete the prefs file, we should get 28 days.
2850 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2851 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2852 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2853 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002854}
2855
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002856// Verifies that a device with no device policy, and is not a consumer
2857// device sets the max kernel key version to the current version.
2858// ie. the same behavior as if rollback is enabled.
2859TEST_F(OmahaRequestActionTest, NoPolicyEnterpriseDevicesSetMaxRollback) {
2860 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2861
2862 // Setup and verify some initial default values for the kernel TPM
2863 // values that control verified boot and rollback.
2864 const int min_kernel_version = 4;
2865 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2866 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2867 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2868 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2869
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002870 EXPECT_CALL(
2871 *fake_system_state_.mock_metrics_reporter(),
2872 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2873 .Times(1);
2874
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002875 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002876 TestRollbackCheck(false /* is_consumer_device */,
2877 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002878 false /* is_policy_loaded */,
2879 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002880
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002881 // Verify kernel_max_rollforward was set to the current minimum
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002882 // kernel key version. This has the effect of freezing roll
2883 // forwards indefinitely. This will hold the rollback window
2884 // open until a future change will be able to move this forward
2885 // relative the configured window.
2886 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2887 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2888}
2889
2890// Verifies that a conmsumer device with no device policy sets the
2891// max kernel key version to the current version. ie. the same
2892// behavior as if rollback is enabled.
2893TEST_F(OmahaRequestActionTest, NoPolicyConsumerDevicesSetMaxRollback) {
2894 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2895
2896 // Setup and verify some initial default values for the kernel TPM
2897 // values that control verified boot and rollback.
2898 const int min_kernel_version = 3;
2899 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2900 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2901 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2902 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2903
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002904 EXPECT_CALL(
2905 *fake_system_state_.mock_metrics_reporter(),
2906 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2907 .Times(1);
2908
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002909 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002910 TestRollbackCheck(true /* is_consumer_device */,
2911 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002912 false /* is_policy_loaded */,
2913 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002914
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002915 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002916 // was set to logical infinity. This is the expected behavior for
2917 // consumer devices and matches the existing behavior prior to the
2918 // rollback features.
2919 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2920 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2921}
2922
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002923// Verifies that a device with rollback enabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002924// in the TPM to prevent roll forward.
2925TEST_F(OmahaRequestActionTest, RollbackEnabledDevicesSetMaxRollback) {
2926 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2927
2928 // Setup and verify some initial default values for the kernel TPM
2929 // values that control verified boot and rollback.
2930 const int allowed_milestones = 4;
2931 const int min_kernel_version = 3;
2932 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2933 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2934 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2935 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2936
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002937 EXPECT_CALL(
2938 *fake_system_state_.mock_metrics_reporter(),
2939 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2940 .Times(1);
2941
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002942 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002943 TestRollbackCheck(false /* is_consumer_device */,
2944 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002945 true /* is_policy_loaded */,
2946 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002947
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002948 // Verify that with rollback enabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002949 // was set to the current minimum kernel key version. This has
2950 // the effect of freezing roll forwards indefinitely. This will
2951 // hold the rollback window open until a future change will
2952 // be able to move this forward relative the configured window.
2953 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2954 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2955}
2956
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002957// Verifies that a device with rollback disabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002958// in the TPM to logical infinity, to allow roll forward.
2959TEST_F(OmahaRequestActionTest, RollbackDisabledDevicesSetMaxRollback) {
2960 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2961
2962 // Setup and verify some initial default values for the kernel TPM
2963 // values that control verified boot and rollback.
2964 const int allowed_milestones = 0;
2965 const int min_kernel_version = 3;
2966 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2967 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2968 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2969 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2970
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002971 EXPECT_CALL(
2972 *fake_system_state_.mock_metrics_reporter(),
2973 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2974 .Times(1);
2975
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002976 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002977 TestRollbackCheck(false /* is_consumer_device */,
2978 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002979 true /* is_policy_loaded */,
2980 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002981
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002982 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002983 // was set to logical infinity.
2984 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2985 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2986}
2987
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002988TEST_F(OmahaRequestActionTest, RollbackResponseParsedNoEntries) {
2989 OmahaResponse response;
2990 fake_update_response_.rollback = true;
2991 TestRollbackCheck(false /* is_consumer_device */,
2992 4 /* rollback_allowed_milestones */,
2993 true /* is_policy_loaded */,
2994 &response);
2995 EXPECT_TRUE(response.is_rollback);
2996}
2997
2998TEST_F(OmahaRequestActionTest, RollbackResponseValidVersionsParsed) {
2999 OmahaResponse response;
3000 fake_update_response_.rollback_firmware_version = "1.2";
3001 fake_update_response_.rollback_kernel_version = "3.4";
3002 fake_update_response_.rollback = true;
3003 TestRollbackCheck(false /* is_consumer_device */,
3004 4 /* rollback_allowed_milestones */,
3005 true /* is_policy_loaded */,
3006 &response);
3007 EXPECT_TRUE(response.is_rollback);
3008 EXPECT_EQ(1, response.rollback_key_version.firmware_key);
3009 EXPECT_EQ(2, response.rollback_key_version.firmware);
3010 EXPECT_EQ(3, response.rollback_key_version.kernel_key);
3011 EXPECT_EQ(4, response.rollback_key_version.kernel);
3012}
3013
May Lippert60aa3ca2018-08-15 16:55:29 -07003014TEST_F(OmahaRequestActionTest,
3015 TestUpdateFirstSeenAtPrefPersistedIfUpdateExists) {
3016 FakeClock fake_clock;
3017 Time now = Time::Now();
3018 fake_clock.SetWallclockTime(now);
3019 fake_system_state_.set_clock(&fake_clock);
3020
3021 OmahaResponse response;
3022 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3023 -1,
3024 false, // ping_only
3025 ErrorCode::kSuccess,
3026 metrics::CheckResult::kUpdateAvailable,
3027 metrics::CheckReaction::kUpdating,
3028 metrics::DownloadErrorCode::kUnset,
3029 &response,
3030 nullptr));
3031 EXPECT_TRUE(response.update_exists);
3032 EXPECT_TRUE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3033
3034 int64_t stored_first_seen_at_time;
3035 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt,
3036 &stored_first_seen_at_time));
3037 EXPECT_EQ(now.ToInternalValue(), stored_first_seen_at_time);
3038}
3039
3040TEST_F(OmahaRequestActionTest,
3041 TestUpdateFirstSeenAtPrefNotPersistedIfUpdateFails) {
3042 FakeClock fake_clock;
3043 Time now = Time::Now();
3044 fake_clock.SetWallclockTime(now);
3045 fake_system_state_.set_clock(&fake_clock);
3046
3047 OmahaResponse response;
3048 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
3049 -1,
3050 false, // ping_only
3051 ErrorCode::kSuccess,
3052 metrics::CheckResult::kNoUpdateAvailable,
3053 metrics::CheckReaction::kUnset,
3054 metrics::DownloadErrorCode::kUnset,
3055 &response,
3056 nullptr));
3057 EXPECT_FALSE(response.update_exists);
3058 EXPECT_FALSE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3059}
3060
Xiaochu Liu88d90382018-08-29 16:09:11 -07003061TEST_F(OmahaRequestActionTest, InstallTest) {
3062 OmahaResponse response;
3063 request_params_.set_dlc_ids({"dlc_no_0", "dlc_no_1"});
3064 brillo::Blob post_data;
3065 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3066 -1,
3067 false, // ping_only
3068 true, // is_consumer_device
3069 0, // rollback_allowed_milestones
3070 false, // is_policy_loaded
3071 ErrorCode::kSuccess,
3072 metrics::CheckResult::kUpdateAvailable,
3073 metrics::CheckReaction::kUpdating,
3074 metrics::DownloadErrorCode::kUnset,
3075 &response,
3076 &post_data));
3077 // Convert post_data to string.
3078 string post_str(post_data.begin(), post_data.end());
3079 for (const auto& dlc_id : request_params_.dlc_ids()) {
3080 EXPECT_NE(string::npos,
3081 post_str.find("appid=\"test-app-id_" + dlc_id + "\""));
3082 }
3083}
3084
Darin Petkov6a5b3222010-07-13 14:55:28 -07003085} // namespace chromeos_update_engine