blob: c758fbdeeea7d36bd0a7b5e815d05a7549356eb6 [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
Xiaochu Liu6310be62018-10-11 15:09:03 -070081const char kCurrentVersion[] = "0.1.0.0";
Alex Deymo85616652015-10-15 18:48:31 -070082const char kTestAppId[] = "test-app-id";
Aaron Wood7dcdedf2017-09-06 17:17:41 -070083const char kTestAppId2[] = "test-app2-id";
Xiaochu Liu6310be62018-10-11 15:09:03 -070084const char kTestAppIdSkipUpdatecheck[] = "test-app-id-skip-updatecheck";
Alex Deymo85616652015-10-15 18:48:31 -070085
Alex Deymo8e18f932015-03-27 16:16:59 -070086// This is a helper struct to allow unit tests build an update response with the
87// values they care about.
88struct FakeUpdateResponse {
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -070089 string GetRollbackVersionAttributes() const {
90 return (rollback ? " _rollback=\"true\"" : "") +
91 (!rollback_firmware_version.empty()
92 ? " _firmware_version=\"" + rollback_firmware_version + "\""
93 : "") +
94 (!rollback_kernel_version.empty()
95 ? " _kernel_version=\"" + rollback_kernel_version + "\""
96 : "");
97 }
98
Alex Deymo8e18f932015-03-27 16:16:59 -070099 string GetNoUpdateResponse() const {
100 string entity_str;
101 if (include_entity)
102 entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
Sen Jiang81259682017-03-30 15:11:30 -0700103 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + entity_str +
104 "<response protocol=\"3.0\">"
105 "<daystart elapsed_seconds=\"100\"/>"
106 "<app appid=\"" +
107 app_id + "\" " +
108 (include_cohorts
109 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
110 "\" cohortname=\"" + cohortname + "\" "
111 : "") +
112 " status=\"ok\">"
113 "<ping status=\"ok\"/>"
114 "<updatecheck status=\"noupdate\"/></app>" +
115 (multi_app_no_update
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700116 ? "<app appid=\"" + app_id2 +
117 "\"><updatecheck status=\"noupdate\"/></app>"
Sen Jiang81259682017-03-30 15:11:30 -0700118 : "") +
119 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700120 }
121
122 string GetUpdateResponse() const {
Sen Jiang2703ef42017-03-16 13:36:21 -0700123 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
124 "protocol=\"3.0\">"
125 "<daystart elapsed_seconds=\"100\"" +
126 (elapsed_days.empty() ? ""
127 : (" elapsed_days=\"" + elapsed_days + "\"")) +
128 "/>"
129 "<app appid=\"" +
130 app_id + "\" " +
131 (include_cohorts
132 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
133 "\" cohortname=\"" + cohortname + "\" "
134 : "") +
135 " status=\"ok\">"
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700136 "<ping status=\"ok\"/><updatecheck status=\"ok\"" +
137 GetRollbackVersionAttributes() + ">" + "<urls><url codebase=\"" +
Sen Jiang2703ef42017-03-16 13:36:21 -0700138 codebase +
139 "\"/></urls>"
140 "<manifest version=\"" +
141 version +
142 "\">"
143 "<packages><package hash=\"not-used\" name=\"" +
144 filename + "\" size=\"" + base::Int64ToString(size) +
Sen Jiang0affc2c2017-02-10 15:55:05 -0800145 "\" hash_sha256=\"" + hash + "\"/>" +
146 (multi_package ? "<package name=\"package2\" size=\"222\" "
147 "hash_sha256=\"hash2\"/>"
148 : "") +
149 "</packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700150 "<actions><action event=\"postinstall\" MetadataSize=\"11" +
Amin Hassanic482bbd2018-09-21 16:07:20 -0700151 (multi_package ? ":22" : "") + "\" MoreInfo=\"" + more_info_url +
152 "\" Prompt=\"" + prompt +
Sen Jiang2703ef42017-03-16 13:36:21 -0700153 "\" "
Sen Jiangcdd52062017-05-18 15:33:10 -0700154 "IsDeltaPayload=\"true" +
155 (multi_package ? ":false" : "") +
156 "\" "
Sen Jiang2703ef42017-03-16 13:36:21 -0700157 "MaxDaysToScatter=\"" +
158 max_days_to_scatter +
159 "\" "
Amin Hassanic482bbd2018-09-21 16:07:20 -0700160 "sha256=\"not-used\" " +
Sen Jiang2703ef42017-03-16 13:36:21 -0700161 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
162 (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
163 : "") +
164 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Sen Jiangfe284402018-03-21 14:03:50 -0700165 (powerwash ? "Powerwash=\"true\" " : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700166 "/></actions></manifest></updatecheck></app>" +
167 (multi_app
Sen Jiangb1e063a2017-09-15 17:44:31 -0700168 ? "<app appid=\"" + app_id2 + "\"" +
169 (include_cohorts ? " cohort=\"cohort2\"" : "") +
170 "><updatecheck status=\"ok\"><urls><url codebase=\"" +
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700171 codebase2 + "\"/></urls><manifest version=\"" + version2 +
172 "\"><packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700173 "<package name=\"package3\" size=\"333\" "
174 "hash_sha256=\"hash3\"/></packages>"
Sen Jiang00adf7b2017-06-26 15:57:29 -0700175 "<actions><action event=\"postinstall\" " +
176 (multi_app_self_update
177 ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
178 : "IsDeltaPayload=\"false\" ") +
179 "MetadataSize=\"33\"/></actions>"
Sen Jiang81259682017-03-30 15:11:30 -0700180 "</manifest></updatecheck></app>"
181 : "") +
182 (multi_app_no_update
183 ? "<app><updatecheck status=\"noupdate\"/></app>"
184 : "") +
Xiaochu Liu6310be62018-10-11 15:09:03 -0700185 (multi_app_skip_updatecheck
186 ? "<app appid=\"" + app_id_skip_updatecheck + "\"></app>"
187 : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700188 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700189 }
190
191 // Return the payload URL, which is split in two fields in the XML response.
192 string GetPayloadUrl() {
193 return codebase + filename;
194 }
195
Alex Deymo85616652015-10-15 18:48:31 -0700196 string app_id = kTestAppId;
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700197 string app_id2 = kTestAppId2;
Xiaochu Liu6310be62018-10-11 15:09:03 -0700198 string app_id_skip_updatecheck = kTestAppIdSkipUpdatecheck;
199 string current_version = kCurrentVersion;
Alex Deymo8e18f932015-03-27 16:16:59 -0700200 string version = "1.2.3.4";
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700201 string version2 = "2.3.4.5";
Alex Deymo8e18f932015-03-27 16:16:59 -0700202 string more_info_url = "http://more/info";
203 string prompt = "true";
204 string codebase = "http://code/base/";
Sen Jiang81259682017-03-30 15:11:30 -0700205 string codebase2 = "http://code/base/2/";
Alex Deymo8e18f932015-03-27 16:16:59 -0700206 string filename = "file.signed";
Sen Jiang2703ef42017-03-16 13:36:21 -0700207 string hash = "4841534831323334";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800208 uint64_t size = 123;
Alex Deymo8e18f932015-03-27 16:16:59 -0700209 string deadline = "";
210 string max_days_to_scatter = "7";
211 string elapsed_days = "42";
212
213 // P2P setting defaults to allowed.
214 bool disable_p2p_for_downloading = false;
215 bool disable_p2p_for_sharing = false;
216
Sen Jiangfe284402018-03-21 14:03:50 -0700217 bool powerwash = false;
218
Alex Deymo8e18f932015-03-27 16:16:59 -0700219 // Omaha cohorts settings.
220 bool include_cohorts = false;
221 string cohort = "";
222 string cohorthint = "";
223 string cohortname = "";
224
225 // Whether to include the CrOS <!ENTITY> in the XML response.
226 bool include_entity = false;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800227
Sen Jiang81259682017-03-30 15:11:30 -0700228 // Whether to include more than one app.
229 bool multi_app = false;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700230 // Whether to include an app with noupdate="true".
231 bool multi_app_self_update = false;
232 // Whether to include an additional app with status="noupdate".
Sen Jiang81259682017-03-30 15:11:30 -0700233 bool multi_app_no_update = false;
Xiaochu Liu6310be62018-10-11 15:09:03 -0700234 // Whether to include an additional app with no updatecheck tag.
235 bool multi_app_skip_updatecheck = false;
Sen Jiang81259682017-03-30 15:11:30 -0700236 // Whether to include more than one package in an app.
Sen Jiang0affc2c2017-02-10 15:55:05 -0800237 bool multi_package = false;
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700238
239 // Whether the payload is a rollback.
240 bool rollback = false;
241 // The verified boot firmware key version for the rollback image.
242 string rollback_firmware_version = "";
243 // The verified boot kernel key version for the rollback image.
244 string rollback_kernel_version = "";
Alex Deymo8e18f932015-03-27 16:16:59 -0700245};
246
247} // namespace
248
Darin Petkov6a5b3222010-07-13 14:55:28 -0700249namespace chromeos_update_engine {
250
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700251class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
252 public:
253 OmahaRequestActionTestProcessorDelegate()
254 : expected_code_(ErrorCode::kSuccess),
255 interactive_(false),
256 test_http_fetcher_headers_(false) {}
257 ~OmahaRequestActionTestProcessorDelegate() override = default;
258
259 void ProcessingDone(const ActionProcessor* processor,
260 ErrorCode code) override {
261 brillo::MessageLoop::current()->BreakLoop();
262 }
263
264 void ActionCompleted(ActionProcessor* processor,
265 AbstractAction* action,
266 ErrorCode code) override {
267 // Make sure actions always succeed.
268 if (action->Type() == OmahaRequestAction::StaticType()) {
269 EXPECT_EQ(expected_code_, code);
270 // Check that the headers were set in the fetcher during the action. Note
271 // that we set this request as "interactive".
272 auto fetcher = static_cast<const MockHttpFetcher*>(
273 static_cast<OmahaRequestAction*>(action)->http_fetcher_.get());
274
275 if (test_http_fetcher_headers_) {
276 EXPECT_EQ(interactive_ ? "fg" : "bg",
277 fetcher->GetHeader("X-Goog-Update-Interactivity"));
278 EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-Goog-Update-AppId"));
279 EXPECT_NE("", fetcher->GetHeader("X-Goog-Update-Updater"));
280 }
281 post_data_ = fetcher->post_data();
282 } else if (action->Type() ==
283 ObjectCollectorAction<OmahaResponse>::StaticType()) {
284 EXPECT_EQ(ErrorCode::kSuccess, code);
285 auto collector_action =
286 static_cast<ObjectCollectorAction<OmahaResponse>*>(action);
287 omaha_response_.reset(new OmahaResponse(collector_action->object()));
288 EXPECT_TRUE(omaha_response_);
289 } else {
290 EXPECT_EQ(ErrorCode::kSuccess, code);
291 }
292 }
293 ErrorCode expected_code_;
294 brillo::Blob post_data_;
295 bool interactive_;
296 bool test_http_fetcher_headers_;
297 std::unique_ptr<OmahaResponse> omaha_response_;
298};
299
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700300class OmahaRequestActionTest : public ::testing::Test {
301 protected:
Alex Deymo610277e2014-11-11 21:18:11 -0800302 void SetUp() override {
Marton Hunyady2abda312018-04-24 18:21:49 +0200303 request_params_.set_os_sp("service_pack");
304 request_params_.set_os_board("x86-generic");
305 request_params_.set_app_id(kTestAppId);
Xiaochu Liu6310be62018-10-11 15:09:03 -0700306 request_params_.set_app_version(kCurrentVersion);
Marton Hunyady2abda312018-04-24 18:21:49 +0200307 request_params_.set_app_lang("en-US");
308 request_params_.set_current_channel("unittest");
309 request_params_.set_target_channel("unittest");
310 request_params_.set_hwid("OEM MODEL 09235 7471");
311 request_params_.set_fw_version("ChromeOSFirmware.1.0");
312 request_params_.set_ec_version("0X0A1");
313 request_params_.set_delta_okay(true);
314 request_params_.set_interactive(false);
315 request_params_.set_update_url("http://url");
316 request_params_.set_target_version_prefix("");
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200317 request_params_.set_rollback_allowed(false);
Marton Hunyady2abda312018-04-24 18:21:49 +0200318 request_params_.set_is_powerwash_allowed(false);
Xiaochu Liu6310be62018-10-11 15:09:03 -0700319 request_params_.set_is_install(false);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -0800320 request_params_.set_dlc_module_ids({});
Marton Hunyady2abda312018-04-24 18:21:49 +0200321
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700322 fake_system_state_.set_request_params(&request_params_);
323 fake_system_state_.set_prefs(&fake_prefs_);
324 }
325
326 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -0800327 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700328 // is used. |payload_state| may be null, in which case a local mock is used.
329 // |p2p_manager| may be null, in which case a local mock is used.
330 // |connection_manager| may be null, in which case a local mock is used.
331 // out_response may be null. If |fail_http_response_code| is non-negative,
332 // the transfer will fail with that code. |ping_only| is passed through to the
333 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
334 // post-data received by the mock HttpFetcher is returned.
335 //
336 // The |expected_check_result|, |expected_check_reaction| and
337 // |expected_error_code| parameters are for checking expectations
338 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
339 // UMA statistics. Use the appropriate ::kUnset value to specify that
340 // the given metric should not be reported.
Marton Hunyady2abda312018-04-24 18:21:49 +0200341 bool TestUpdateCheck(const string& http_response,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700342 int fail_http_response_code,
343 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800344 bool is_consumer_device,
345 int rollback_allowed_milestones,
346 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700347 ErrorCode expected_code,
348 metrics::CheckResult expected_check_result,
349 metrics::CheckReaction expected_check_reaction,
350 metrics::DownloadErrorCode expected_download_error_code,
351 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700352 brillo::Blob* out_post_data);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700353
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800354 // Overload of TestUpdateCheck that does not supply |is_consumer_device| or
355 // |rollback_allowed_milestones| which are only required for rollback tests.
356 bool TestUpdateCheck(const string& http_response,
357 int fail_http_response_code,
358 bool ping_only,
359 ErrorCode expected_code,
360 metrics::CheckResult expected_check_result,
361 metrics::CheckReaction expected_check_reaction,
362 metrics::DownloadErrorCode expected_download_error_code,
363 OmahaResponse* out_response,
364 brillo::Blob* out_post_data);
365
366 void TestRollbackCheck(bool is_consumer_device,
367 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700368 bool is_policy_loaded,
369 OmahaResponse* out_response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800370
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700371 void TestEvent(OmahaEvent* event,
372 const string& http_response,
373 brillo::Blob* out_post_data);
374
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800375 // Runs and checks a ping test. |ping_only| indicates whether it should send
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700376 // only a ping or also an updatecheck.
377 void PingTest(bool ping_only);
378
379 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -0700380 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700381 OmahaResponse *response);
382
383 // P2P test helper function.
384 void P2PTest(
385 bool initial_allow_p2p_for_downloading,
386 bool initial_allow_p2p_for_sharing,
387 bool omaha_disable_p2p_for_downloading,
388 bool omaha_disable_p2p_for_sharing,
389 bool payload_state_allow_p2p_attempt,
390 bool expect_p2p_client_lookup,
391 const string& p2p_client_result_url,
392 bool expected_allow_p2p_for_downloading,
393 bool expected_allow_p2p_for_sharing,
394 const string& expected_p2p_url);
395
396 FakeSystemState fake_system_state_;
Alex Deymo8e18f932015-03-27 16:16:59 -0700397 FakeUpdateResponse fake_update_response_;
Marton Hunyady2abda312018-04-24 18:21:49 +0200398 // Used by all tests.
399 OmahaRequestParams request_params_{&fake_system_state_};
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700400
401 FakePrefs fake_prefs_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700402
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700403 OmahaRequestActionTestProcessorDelegate delegate_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700404
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700405 bool test_http_fetcher_headers_{false};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700406};
407
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700408bool OmahaRequestActionTest::TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700409 const string& http_response,
410 int fail_http_response_code,
411 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800412 bool is_consumer_device,
413 int rollback_allowed_milestones,
414 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700415 ErrorCode expected_code,
416 metrics::CheckResult expected_check_result,
417 metrics::CheckReaction expected_check_reaction,
418 metrics::DownloadErrorCode expected_download_error_code,
419 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700420 brillo::Blob* out_post_data) {
421 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700422 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700423 auto fetcher = std::make_unique<MockHttpFetcher>(
424 http_response.data(), http_response.size(), nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700425 if (fail_http_response_code >= 0) {
426 fetcher->FailTransfer(fail_http_response_code);
427 }
Marton Hunyady2abda312018-04-24 18:21:49 +0200428 // This ensures the tests didn't forget to update fake_system_state_ if they
429 // are not using the default request_params_.
430 EXPECT_EQ(&request_params_, fake_system_state_.request_params());
431
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700432 auto omaha_request_action = std::make_unique<OmahaRequestAction>(
433 &fake_system_state_, nullptr, std::move(fetcher), ping_only);
434
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800435 auto mock_policy_provider =
436 std::make_unique<NiceMock<policy::MockPolicyProvider>>();
437 EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
438 .WillRepeatedly(Return(is_consumer_device));
439
440 EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
441 .WillRepeatedly(Return(is_policy_loaded));
442
443 const policy::MockDevicePolicy device_policy;
444 const bool get_allowed_milestone_succeeds = rollback_allowed_milestones >= 0;
445 EXPECT_CALL(device_policy, GetRollbackAllowedMilestones(_))
446 .WillRepeatedly(DoAll(SetArgPointee<0>(rollback_allowed_milestones),
447 Return(get_allowed_milestone_succeeds)));
448
449 EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
450 .WillRepeatedly(ReturnRef(device_policy));
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700451 omaha_request_action->policy_provider_ = std::move(mock_policy_provider);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800452
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700453 delegate_.expected_code_ = expected_code;
454 delegate_.interactive_ = request_params_.interactive();
455 delegate_.test_http_fetcher_headers_ = test_http_fetcher_headers_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700456 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700457 processor.set_delegate(&delegate_);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700458
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700459 auto collector_action =
460 std::make_unique<ObjectCollectorAction<OmahaResponse>>();
461 BondActions(omaha_request_action.get(), collector_action.get());
462 processor.EnqueueAction(std::move(omaha_request_action));
463 processor.EnqueueAction(std::move(collector_action));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700464
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700465 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
466 ReportUpdateCheckMetrics(_, _, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800467 .Times(AnyNumber());
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700468
469 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
470 ReportUpdateCheckMetrics(_,
471 expected_check_result,
472 expected_check_reaction,
473 expected_download_error_code))
474 .Times(ping_only ? 0 : 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800475
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700476 loop.PostTask(base::Bind(
477 [](ActionProcessor* processor) { processor->StartProcessing(); },
478 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700479 loop.Run();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700480 EXPECT_FALSE(loop.PendingTasks());
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700481 if (delegate_.omaha_response_ && out_response)
482 *out_response = *delegate_.omaha_response_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700483 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700484 *out_post_data = delegate_.post_data_;
485 return delegate_.omaha_response_ != nullptr;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700486}
487
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800488bool OmahaRequestActionTest::TestUpdateCheck(
489 const string& http_response,
490 int fail_http_response_code,
491 bool ping_only,
492 ErrorCode expected_code,
493 metrics::CheckResult expected_check_result,
494 metrics::CheckReaction expected_check_reaction,
495 metrics::DownloadErrorCode expected_download_error_code,
496 OmahaResponse* out_response,
497 brillo::Blob* out_post_data) {
498 return TestUpdateCheck(http_response,
499 fail_http_response_code,
500 ping_only,
501 true, // is_consumer_device
502 0, // rollback_allowed_milestones
503 false, // is_policy_loaded
504 expected_code,
505 expected_check_result,
506 expected_check_reaction,
507 expected_download_error_code,
508 out_response,
509 out_post_data);
510}
511
512void OmahaRequestActionTest::TestRollbackCheck(bool is_consumer_device,
513 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700514 bool is_policy_loaded,
515 OmahaResponse* out_response) {
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800516 fake_update_response_.deadline = "20101020";
517 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
518 -1,
519 false, // ping_only
520 is_consumer_device,
521 rollback_allowed_milestones,
522 is_policy_loaded,
523 ErrorCode::kSuccess,
524 metrics::CheckResult::kUpdateAvailable,
525 metrics::CheckReaction::kUpdating,
526 metrics::DownloadErrorCode::kUnset,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700527 out_response,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800528 nullptr));
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700529 ASSERT_TRUE(out_response->update_exists);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800530}
531
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700532// Tests Event requests -- they should always succeed. |out_post_data| may be
533// null; if non-null, the post-data received by the mock HttpFetcher is
534// returned.
535void OmahaRequestActionTest::TestEvent(OmahaEvent* event,
536 const string& http_response,
537 brillo::Blob* out_post_data) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700538 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700539 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700540
541 auto action = std::make_unique<OmahaRequestAction>(
542 &fake_system_state_,
543 event,
544 std::make_unique<MockHttpFetcher>(
545 http_response.data(), http_response.size(), nullptr),
546 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700547 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700548 processor.set_delegate(&delegate_);
549 processor.EnqueueAction(std::move(action));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700550
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700551 loop.PostTask(base::Bind(
552 [](ActionProcessor* processor) { processor->StartProcessing(); },
553 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700554 loop.Run();
Alex Deymo72a25672016-03-23 15:44:39 -0700555 EXPECT_FALSE(loop.PendingTasks());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700556
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700557 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700558 *out_post_data = delegate_.post_data_;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700559}
560
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700561TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400562 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700563 fake_update_response_.include_entity = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200564 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
565 -1,
566 false, // ping_only
567 ErrorCode::kOmahaRequestXMLHasEntityDecl,
568 metrics::CheckResult::kParsingError,
569 metrics::CheckReaction::kUnset,
570 metrics::DownloadErrorCode::kUnset,
571 &response,
572 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400573 EXPECT_FALSE(response.update_exists);
574}
575
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700576TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700577 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +0200578 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
579 -1,
580 false, // ping_only
581 ErrorCode::kSuccess,
582 metrics::CheckResult::kNoUpdateAvailable,
583 metrics::CheckReaction::kUnset,
584 metrics::DownloadErrorCode::kUnset,
585 &response,
586 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700587 EXPECT_FALSE(response.update_exists);
588}
589
Sen Jiang81259682017-03-30 15:11:30 -0700590TEST_F(OmahaRequestActionTest, MultiAppNoUpdateTest) {
591 OmahaResponse response;
592 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200593 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700594 -1,
595 false, // ping_only
596 ErrorCode::kSuccess,
597 metrics::CheckResult::kNoUpdateAvailable,
598 metrics::CheckReaction::kUnset,
599 metrics::DownloadErrorCode::kUnset,
600 &response,
601 nullptr));
602 EXPECT_FALSE(response.update_exists);
603}
604
Sen Jiang00adf7b2017-06-26 15:57:29 -0700605TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
606 OmahaResponse response;
607 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200608 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang00adf7b2017-06-26 15:57:29 -0700609 -1,
610 false, // ping_only
611 ErrorCode::kSuccess,
612 metrics::CheckResult::kNoUpdateAvailable,
613 metrics::CheckReaction::kUnset,
614 metrics::DownloadErrorCode::kUnset,
615 &response,
616 nullptr));
617 EXPECT_FALSE(response.update_exists);
618}
619
620TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
621 OmahaResponse response;
622 ASSERT_TRUE(TestUpdateCheck(
Sen Jiang00adf7b2017-06-26 15:57:29 -0700623 "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
624 "event=\"postinstall\" noupdate=\"true\"/></actions>"
625 "</manifest></updatecheck></app></response>",
626 -1,
627 false, // ping_only
628 ErrorCode::kSuccess,
629 metrics::CheckResult::kNoUpdateAvailable,
630 metrics::CheckReaction::kUnset,
631 metrics::DownloadErrorCode::kUnset,
632 &response,
633 nullptr));
634 EXPECT_FALSE(response.update_exists);
635}
636
Alex Deymo8e18f932015-03-27 16:16:59 -0700637// Test that all the values in the response are parsed in a normal update
638// response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700639TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700640 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700641 fake_update_response_.deadline = "20101020";
Marton Hunyady2abda312018-04-24 18:21:49 +0200642 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
643 -1,
644 false, // ping_only
645 ErrorCode::kSuccess,
646 metrics::CheckResult::kUpdateAvailable,
647 metrics::CheckReaction::kUpdating,
648 metrics::DownloadErrorCode::kUnset,
649 &response,
650 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700651 EXPECT_TRUE(response.update_exists);
Alex Deymo8e18f932015-03-27 16:16:59 -0700652 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700653 EXPECT_EQ("", response.system_version);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800654 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
655 response.packages[0].payload_urls[0]);
Alex Deymo8e18f932015-03-27 16:16:59 -0700656 EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800657 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
658 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700659 EXPECT_EQ(true, response.packages[0].is_delta);
Alex Deymo8e18f932015-03-27 16:16:59 -0700660 EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
661 EXPECT_EQ(fake_update_response_.deadline, response.deadline);
Sen Jiangfe284402018-03-21 14:03:50 -0700662 EXPECT_FALSE(response.powerwash_required);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700663 // Omaha cohort attributes are not set in the response, so they should not be
Alex Deymo8e18f932015-03-27 16:16:59 -0700664 // persisted.
665 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
666 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
667 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700668}
669
Sen Jiang0affc2c2017-02-10 15:55:05 -0800670TEST_F(OmahaRequestActionTest, MultiPackageUpdateTest) {
671 OmahaResponse response;
672 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200673 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800674 -1,
675 false, // ping_only
676 ErrorCode::kSuccess,
677 metrics::CheckResult::kUpdateAvailable,
678 metrics::CheckReaction::kUpdating,
679 metrics::DownloadErrorCode::kUnset,
680 &response,
681 nullptr));
682 EXPECT_TRUE(response.update_exists);
683 EXPECT_EQ(fake_update_response_.version, response.version);
684 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
685 response.packages[0].payload_urls[0]);
686 EXPECT_EQ(fake_update_response_.codebase + "package2",
687 response.packages[1].payload_urls[0]);
688 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
689 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700690 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700691 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800692 ASSERT_EQ(2u, response.packages.size());
Sen Jiang81259682017-03-30 15:11:30 -0700693 EXPECT_EQ(string("hash2"), response.packages[1].hash);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800694 EXPECT_EQ(222u, response.packages[1].size);
Sen Jiang81259682017-03-30 15:11:30 -0700695 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700696 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700697}
698
699TEST_F(OmahaRequestActionTest, MultiAppUpdateTest) {
700 OmahaResponse response;
701 fake_update_response_.multi_app = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200702 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700703 -1,
704 false, // ping_only
705 ErrorCode::kSuccess,
706 metrics::CheckResult::kUpdateAvailable,
707 metrics::CheckReaction::kUpdating,
708 metrics::DownloadErrorCode::kUnset,
709 &response,
710 nullptr));
711 EXPECT_TRUE(response.update_exists);
712 EXPECT_EQ(fake_update_response_.version, response.version);
713 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
714 response.packages[0].payload_urls[0]);
715 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
716 response.packages[1].payload_urls[0]);
717 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
718 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
719 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700720 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700721 ASSERT_EQ(2u, response.packages.size());
722 EXPECT_EQ(string("hash3"), response.packages[1].hash);
723 EXPECT_EQ(333u, response.packages[1].size);
724 EXPECT_EQ(33u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700725 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700726}
727
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700728TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
729 OmahaResponse response;
730 fake_update_response_.multi_app = true;
731 // trigger the lining up of the app and system versions
732 request_params_.set_system_app_id(fake_update_response_.app_id2);
733
Marton Hunyady2abda312018-04-24 18:21:49 +0200734 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700735 -1,
736 false, // ping_only
737 ErrorCode::kSuccess,
738 metrics::CheckResult::kUpdateAvailable,
739 metrics::CheckReaction::kUpdating,
740 metrics::DownloadErrorCode::kUnset,
741 &response,
742 nullptr));
743 EXPECT_TRUE(response.update_exists);
744 EXPECT_EQ(fake_update_response_.version, response.version);
745 EXPECT_EQ(fake_update_response_.version2, response.system_version);
746 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
747 response.packages[0].payload_urls[0]);
748 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
749 response.packages[1].payload_urls[0]);
750 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
751 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
752 EXPECT_EQ(11u, response.packages[0].metadata_size);
753 EXPECT_EQ(true, response.packages[0].is_delta);
754 ASSERT_EQ(2u, response.packages.size());
755 EXPECT_EQ(string("hash3"), response.packages[1].hash);
756 EXPECT_EQ(333u, response.packages[1].size);
757 EXPECT_EQ(33u, response.packages[1].metadata_size);
758 EXPECT_EQ(false, response.packages[1].is_delta);
759}
760
Sen Jiang81259682017-03-30 15:11:30 -0700761TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
762 OmahaResponse response;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700763 fake_update_response_.multi_app = true;
764 fake_update_response_.multi_app_self_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200765 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700766 -1,
767 false, // ping_only
768 ErrorCode::kSuccess,
769 metrics::CheckResult::kUpdateAvailable,
770 metrics::CheckReaction::kUpdating,
771 metrics::DownloadErrorCode::kUnset,
772 &response,
773 nullptr));
774 EXPECT_TRUE(response.update_exists);
775 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700776 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700777 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
778 response.packages[0].payload_urls[0]);
779 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
780 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
781 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang00adf7b2017-06-26 15:57:29 -0700782 ASSERT_EQ(2u, response.packages.size());
783 EXPECT_EQ(string("hash3"), response.packages[1].hash);
784 EXPECT_EQ(333u, response.packages[1].size);
785 EXPECT_EQ(33u, response.packages[1].metadata_size);
786 EXPECT_EQ(true, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700787}
788
789TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {
790 OmahaResponse response;
791 fake_update_response_.multi_app = true;
792 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200793 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700794 -1,
795 false, // ping_only
796 ErrorCode::kSuccess,
797 metrics::CheckResult::kUpdateAvailable,
798 metrics::CheckReaction::kUpdating,
799 metrics::DownloadErrorCode::kUnset,
800 &response,
801 nullptr));
802 EXPECT_TRUE(response.update_exists);
803 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700804 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700805 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
806 response.packages[0].payload_urls[0]);
807 EXPECT_EQ(fake_update_response_.codebase + "package2",
808 response.packages[1].payload_urls[0]);
809 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
810 response.packages[2].payload_urls[0]);
811 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
812 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
813 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700814 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700815 ASSERT_EQ(3u, response.packages.size());
816 EXPECT_EQ(string("hash2"), response.packages[1].hash);
817 EXPECT_EQ(222u, response.packages[1].size);
818 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700819 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700820 EXPECT_EQ(string("hash3"), response.packages[2].hash);
821 EXPECT_EQ(333u, response.packages[2].size);
822 EXPECT_EQ(33u, response.packages[2].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700823 EXPECT_EQ(false, response.packages[2].is_delta);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800824}
825
Sen Jiangfe284402018-03-21 14:03:50 -0700826TEST_F(OmahaRequestActionTest, PowerwashTest) {
827 OmahaResponse response;
828 fake_update_response_.powerwash = true;
Amin Hassani3538a882018-05-31 14:11:30 -0700829 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangfe284402018-03-21 14:03:50 -0700830 -1,
831 false, // ping_only
832 ErrorCode::kSuccess,
833 metrics::CheckResult::kUpdateAvailable,
834 metrics::CheckReaction::kUpdating,
835 metrics::DownloadErrorCode::kUnset,
836 &response,
837 nullptr));
838 EXPECT_TRUE(response.update_exists);
839 EXPECT_TRUE(response.powerwash_required);
840}
841
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700842TEST_F(OmahaRequestActionTest, ExtraHeadersSentInteractiveTest) {
843 OmahaResponse response;
Alex Deymo14ad88e2016-06-29 12:30:14 -0700844 request_params_.set_interactive(true);
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700845 test_http_fetcher_headers_ = true;
846 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
847 -1,
848 false, // ping_only
849 ErrorCode::kOmahaRequestXMLParseError,
850 metrics::CheckResult::kParsingError,
851 metrics::CheckReaction::kUnset,
852 metrics::DownloadErrorCode::kUnset,
853 &response,
854 nullptr));
855 EXPECT_FALSE(response.update_exists);
856}
Alex Deymo14ad88e2016-06-29 12:30:14 -0700857
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700858TEST_F(OmahaRequestActionTest, ExtraHeadersSentNoInteractiveTest) {
859 OmahaResponse response;
860 request_params_.set_interactive(false);
861 test_http_fetcher_headers_ = true;
862 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
863 -1,
864 false, // ping_only
865 ErrorCode::kOmahaRequestXMLParseError,
866 metrics::CheckResult::kParsingError,
867 metrics::CheckReaction::kUnset,
868 metrics::DownloadErrorCode::kUnset,
869 &response,
870 nullptr));
871 EXPECT_FALSE(response.update_exists);
Alex Deymo14ad88e2016-06-29 12:30:14 -0700872}
873
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700874TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700875 OmahaResponse response;
876 // Set up a connection manager that doesn't allow a valid update over
877 // the current ethernet connection.
Alex Deymof6ee0162015-07-31 12:35:22 -0700878 MockConnectionManager mock_cm;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700879 fake_system_state_.set_connection_manager(&mock_cm);
880
Alex Deymo30534502015-07-20 15:06:33 -0700881 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
882 .WillRepeatedly(
Ben Chan672c1f52017-10-23 15:41:39 -0700883 DoAll(SetArgPointee<0>(ConnectionType::kEthernet),
884 SetArgPointee<1>(ConnectionTethering::kUnknown),
Alex Deymo30534502015-07-20 15:06:33 -0700885 Return(true)));
Sen Jiang255e22b2016-05-20 16:15:29 -0700886 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
887 .WillRepeatedly(Return(false));
Chris Sosa77f79e82014-06-02 18:16:24 -0700888
Marton Hunyady2abda312018-04-24 18:21:49 +0200889 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
890 -1,
891 false, // ping_only
892 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
893 metrics::CheckResult::kUpdateAvailable,
894 metrics::CheckReaction::kIgnored,
895 metrics::DownloadErrorCode::kUnset,
896 &response,
897 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700898 EXPECT_FALSE(response.update_exists);
899}
900
Weidong Guo421ff332017-04-17 10:08:38 -0700901TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularAllowedByDevicePolicy) {
902 // This test tests that update over cellular is allowed as device policy
903 // says yes.
904 OmahaResponse response;
905 MockConnectionManager mock_cm;
906
907 fake_system_state_.set_connection_manager(&mock_cm);
908
909 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
910 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
911 SetArgPointee<1>(ConnectionTethering::kUnknown),
912 Return(true)));
913 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
914 .WillRepeatedly(Return(true));
915 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
916 .WillRepeatedly(Return(true));
917
Marton Hunyady2abda312018-04-24 18:21:49 +0200918 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700919 -1,
920 false, // ping_only
921 ErrorCode::kSuccess,
922 metrics::CheckResult::kUpdateAvailable,
923 metrics::CheckReaction::kUpdating,
924 metrics::DownloadErrorCode::kUnset,
925 &response,
926 nullptr));
927 EXPECT_TRUE(response.update_exists);
928}
929
930TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularBlockedByDevicePolicy) {
931 // This test tests that update over cellular is blocked as device policy
932 // says no.
933 OmahaResponse response;
934 MockConnectionManager mock_cm;
935
936 fake_system_state_.set_connection_manager(&mock_cm);
937
938 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
939 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
940 SetArgPointee<1>(ConnectionTethering::kUnknown),
941 Return(true)));
942 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
943 .WillRepeatedly(Return(true));
944 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
945 .WillRepeatedly(Return(false));
946
Marton Hunyady2abda312018-04-24 18:21:49 +0200947 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700948 -1,
949 false, // ping_only
950 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
951 metrics::CheckResult::kUpdateAvailable,
952 metrics::CheckReaction::kIgnored,
953 metrics::DownloadErrorCode::kUnset,
954 &response,
955 nullptr));
956 EXPECT_FALSE(response.update_exists);
957}
958
959TEST_F(OmahaRequestActionTest,
960 ValidUpdateOverCellularAllowedByUserPermissionTrue) {
961 // This test tests that, when device policy is not set, update over cellular
962 // is allowed as permission for update over cellular is set to true.
963 OmahaResponse response;
964 MockConnectionManager mock_cm;
965
966 fake_prefs_.SetBoolean(kPrefsUpdateOverCellularPermission, true);
967 fake_system_state_.set_connection_manager(&mock_cm);
968
969 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
970 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
971 SetArgPointee<1>(ConnectionTethering::kUnknown),
972 Return(true)));
973 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
974 .WillRepeatedly(Return(false));
975 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
976 .WillRepeatedly(Return(true));
977
Marton Hunyady2abda312018-04-24 18:21:49 +0200978 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700979 -1,
980 false, // ping_only
981 ErrorCode::kSuccess,
982 metrics::CheckResult::kUpdateAvailable,
983 metrics::CheckReaction::kUpdating,
984 metrics::DownloadErrorCode::kUnset,
985 &response,
986 nullptr));
987 EXPECT_TRUE(response.update_exists);
988}
989
990TEST_F(OmahaRequestActionTest,
991 ValidUpdateOverCellularBlockedByUpdateTargetNotMatch) {
992 // This test tests that, when device policy is not set and permission for
993 // update over cellular is set to false or does not exist, update over
994 // cellular is blocked as update target does not match the omaha response.
995 OmahaResponse response;
996 MockConnectionManager mock_cm;
997 // A version different from the version in omaha response.
998 string diff_version = "99.99.99";
999 // A size different from the size in omaha response.
1000 int64_t diff_size = 999;
1001
1002 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, diff_version);
1003 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, diff_size);
1004 // This test tests cellular (3G) being the only connection type being allowed.
1005 fake_system_state_.set_connection_manager(&mock_cm);
1006
1007 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1008 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1009 SetArgPointee<1>(ConnectionTethering::kUnknown),
1010 Return(true)));
1011 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1012 .WillRepeatedly(Return(false));
1013 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1014 .WillRepeatedly(Return(true));
1015
Marton Hunyady2abda312018-04-24 18:21:49 +02001016 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001017 -1,
1018 false, // ping_only
1019 ErrorCode::kOmahaUpdateIgnoredOverCellular,
1020 metrics::CheckResult::kUpdateAvailable,
1021 metrics::CheckReaction::kIgnored,
1022 metrics::DownloadErrorCode::kUnset,
1023 &response,
1024 nullptr));
1025 EXPECT_FALSE(response.update_exists);
1026}
1027
1028TEST_F(OmahaRequestActionTest,
1029 ValidUpdateOverCellularAllowedByUpdateTargetMatch) {
1030 // This test tests that, when device policy is not set and permission for
1031 // update over cellular is set to false or does not exist, update over
1032 // cellular is allowed as update target matches the omaha response.
1033 OmahaResponse response;
1034 MockConnectionManager mock_cm;
1035 // A version same as the version in omaha response.
1036 string new_version = fake_update_response_.version;
1037 // A size same as the size in omaha response.
1038 int64_t new_size = fake_update_response_.size;
1039
1040 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, new_version);
1041 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, new_size);
1042 fake_system_state_.set_connection_manager(&mock_cm);
1043
1044 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1045 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1046 SetArgPointee<1>(ConnectionTethering::kUnknown),
1047 Return(true)));
1048 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1049 .WillRepeatedly(Return(false));
1050 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1051 .WillRepeatedly(Return(true));
1052
Marton Hunyady2abda312018-04-24 18:21:49 +02001053 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001054 -1,
1055 false, // ping_only
1056 ErrorCode::kSuccess,
1057 metrics::CheckResult::kUpdateAvailable,
1058 metrics::CheckReaction::kUpdating,
1059 metrics::DownloadErrorCode::kUnset,
1060 &response,
1061 nullptr));
1062 EXPECT_TRUE(response.update_exists);
1063}
1064
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001065TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -07001066 string rollback_version = "1234.0.0";
1067 OmahaResponse response;
1068
1069 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001070 fake_system_state_.set_payload_state(&mock_payload_state);
1071
Chris Sosa77f79e82014-06-02 18:16:24 -07001072 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
1073 .WillRepeatedly(Return(rollback_version));
1074
Alex Deymo8e18f932015-03-27 16:16:59 -07001075 fake_update_response_.version = rollback_version;
Marton Hunyady2abda312018-04-24 18:21:49 +02001076 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1077 -1,
1078 false, // ping_only
1079 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
1080 metrics::CheckResult::kUpdateAvailable,
1081 metrics::CheckReaction::kIgnored,
1082 metrics::DownloadErrorCode::kUnset,
1083 &response,
1084 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -07001085 EXPECT_FALSE(response.update_exists);
1086}
1087
Marton Hunyadyc2882062018-05-14 17:28:25 +02001088// Verify that update checks called during OOBE will not try to download an
1089// update if the response doesn't include the deadline field.
Kevin Cernekee2494e282016-03-29 18:03:53 -07001090TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
1091 OmahaResponse response;
Marton Hunyadyc2882062018-05-14 17:28:25 +02001092 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Kevin Cernekee2494e282016-03-29 18:03:53 -07001093
Sen Jiang8cd42342018-01-31 12:06:59 -08001094 // TODO(senj): set better default value for metrics::checkresult in
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001095 // OmahaRequestAction::ActionCompleted.
Marton Hunyady2abda312018-04-24 18:21:49 +02001096 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001097 -1,
1098 false, // ping_only
1099 ErrorCode::kNonCriticalUpdateInOOBE,
1100 metrics::CheckResult::kParsingError,
1101 metrics::CheckReaction::kUnset,
1102 metrics::DownloadErrorCode::kUnset,
1103 &response,
1104 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001105 EXPECT_FALSE(response.update_exists);
Marton Hunyadyc2882062018-05-14 17:28:25 +02001106}
Kevin Cernekee2494e282016-03-29 18:03:53 -07001107
Marton Hunyadyc2882062018-05-14 17:28:25 +02001108// Verify that the IsOOBEComplete() value is ignored when the OOBE flow is not
1109// enabled.
1110TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDisabled) {
1111 OmahaResponse response;
1112 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymo46a9aae2016-05-04 20:20:11 -07001113 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
Alex Deymo46a9aae2016-05-04 20:20:11 -07001114
Marton Hunyady2abda312018-04-24 18:21:49 +02001115 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1116 -1,
1117 false, // ping_only
1118 ErrorCode::kSuccess,
1119 metrics::CheckResult::kUpdateAvailable,
1120 metrics::CheckReaction::kUpdating,
1121 metrics::DownloadErrorCode::kUnset,
1122 &response,
1123 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001124 EXPECT_TRUE(response.update_exists);
1125}
1126
Marton Hunyadyc2882062018-05-14 17:28:25 +02001127// Verify that update checks called during OOBE will still try to download an
1128// update if the response includes the deadline field.
1129TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDeadlineSet) {
1130 OmahaResponse response;
1131 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1132 fake_update_response_.deadline = "20101020";
1133
1134 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1135 -1,
1136 false, // ping_only
1137 ErrorCode::kSuccess,
1138 metrics::CheckResult::kUpdateAvailable,
1139 metrics::CheckReaction::kUpdating,
1140 metrics::DownloadErrorCode::kUnset,
1141 &response,
1142 nullptr));
1143 EXPECT_TRUE(response.update_exists);
1144}
1145
1146// Verify that update checks called during OOBE will not try to download an
1147// update if a rollback happened, even when the response includes the deadline
1148// field.
1149TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBERollback) {
1150 OmahaResponse response;
1151 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1152 fake_update_response_.deadline = "20101020";
1153 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetRollbackHappened())
1154 .WillOnce(Return(true));
1155
1156 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1157 -1,
1158 false, // ping_only
1159 ErrorCode::kNonCriticalUpdateInOOBE,
1160 metrics::CheckResult::kParsingError,
1161 metrics::CheckReaction::kUnset,
1162 metrics::DownloadErrorCode::kUnset,
1163 &response,
1164 nullptr));
1165 EXPECT_FALSE(response.update_exists);
1166}
1167
Toni Barzic61544e62018-10-11 14:37:30 -07001168// Verify that non-critical updates are skipped by reporting the
1169// kNonCriticalUpdateInOOBE error code when attempted over cellular network -
1170// i.e. when the update would need user permission. Note that reporting
1171// kOmahaUpdateIgnoredOverCellular error in this case might cause undesired UX
1172// in OOBE (warning the user about an update that will be skipped).
1173TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesInOOBEOverCellular) {
1174 OmahaResponse response;
1175 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1176
1177 MockConnectionManager mock_cm;
1178 fake_system_state_.set_connection_manager(&mock_cm);
1179
1180 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1181 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1182 SetArgPointee<1>(ConnectionTethering::kUnknown),
1183 Return(true)));
1184 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1185 .WillRepeatedly(Return(false));
1186
1187 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1188 -1,
1189 false, // ping_only
1190 ErrorCode::kNonCriticalUpdateInOOBE,
1191 metrics::CheckResult::kParsingError,
1192 metrics::CheckReaction::kUnset,
1193 metrics::DownloadErrorCode::kUnset,
1194 &response,
1195 nullptr));
1196 EXPECT_FALSE(response.update_exists);
1197}
1198
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001199TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001200 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001201 request_params_.set_wall_clock_based_wait_enabled(true);
1202 request_params_.set_update_check_count_wait_enabled(false);
1203 request_params_.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001204
May Lippert60aa3ca2018-08-15 16:55:29 -07001205 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1206
Marton Hunyady2abda312018-04-24 18:21:49 +02001207 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1208 -1,
1209 false, // ping_only
1210 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1211 metrics::CheckResult::kUpdateAvailable,
1212 metrics::CheckReaction::kDeferring,
1213 metrics::DownloadErrorCode::kUnset,
1214 &response,
1215 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001216 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001217
1218 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001219 request_params_.set_interactive(true);
1220 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1221 -1,
1222 false, // ping_only
1223 ErrorCode::kSuccess,
1224 metrics::CheckResult::kUpdateAvailable,
1225 metrics::CheckReaction::kUpdating,
1226 metrics::DownloadErrorCode::kUnset,
1227 &response,
1228 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001229 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001230}
1231
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001232TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
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(false);
1235 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1236 request_params_.set_update_check_count_wait_enabled(true);
1237 request_params_.set_min_update_checks_needed(1);
1238 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001239
Marton Hunyady2abda312018-04-24 18:21:49 +02001240 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1241 -1,
1242 false, // ping_only
1243 ErrorCode::kSuccess,
1244 metrics::CheckResult::kUpdateAvailable,
1245 metrics::CheckReaction::kUpdating,
1246 metrics::DownloadErrorCode::kUnset,
1247 &response,
1248 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001249 EXPECT_TRUE(response.update_exists);
1250}
1251
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001252TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001253 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001254 request_params_.set_wall_clock_based_wait_enabled(true);
1255 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1256 request_params_.set_update_check_count_wait_enabled(true);
1257 request_params_.set_min_update_checks_needed(1);
1258 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001259
Alex Deymo8e18f932015-03-27 16:16:59 -07001260 fake_update_response_.max_days_to_scatter = "0";
Marton Hunyady2abda312018-04-24 18:21:49 +02001261 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1262 -1,
1263 false, // ping_only
1264 ErrorCode::kSuccess,
1265 metrics::CheckResult::kUpdateAvailable,
1266 metrics::CheckReaction::kUpdating,
1267 metrics::DownloadErrorCode::kUnset,
1268 &response,
1269 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001270 EXPECT_TRUE(response.update_exists);
1271}
1272
1273
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001274TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001275 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001276 request_params_.set_wall_clock_based_wait_enabled(true);
1277 request_params_.set_waiting_period(TimeDelta());
1278 request_params_.set_update_check_count_wait_enabled(true);
1279 request_params_.set_min_update_checks_needed(0);
1280 request_params_.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001281
May Lippert60aa3ca2018-08-15 16:55:29 -07001282 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1283
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001284 ASSERT_TRUE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001285 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001286 -1,
1287 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001288 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001289 metrics::CheckResult::kUpdateAvailable,
1290 metrics::CheckReaction::kUpdating,
1291 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001292 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001293 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001294
Ben Chan9abb7632014-08-07 00:10:53 -07001295 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001296 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001297 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001298 EXPECT_TRUE(response.update_exists);
1299}
1300
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001301TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001302 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001303 request_params_.set_wall_clock_based_wait_enabled(true);
1304 request_params_.set_waiting_period(TimeDelta());
1305 request_params_.set_update_check_count_wait_enabled(true);
1306 request_params_.set_min_update_checks_needed(1);
1307 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001308
May Lippert60aa3ca2018-08-15 16:55:29 -07001309 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1310
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001311 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));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001324 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001325 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001326
1327 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001328 request_params_.set_interactive(true);
1329 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1330 -1,
1331 false, // ping_only
1332 ErrorCode::kSuccess,
1333 metrics::CheckResult::kUpdateAvailable,
1334 metrics::CheckReaction::kUpdating,
1335 metrics::DownloadErrorCode::kUnset,
1336 &response,
1337 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001338 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001339}
1340
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001341TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001342 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001343 request_params_.set_wall_clock_based_wait_enabled(true);
1344 request_params_.set_waiting_period(TimeDelta());
1345 request_params_.set_update_check_count_wait_enabled(true);
1346 request_params_.set_min_update_checks_needed(1);
1347 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001348
May Lippert60aa3ca2018-08-15 16:55:29 -07001349 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1350
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001351 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001352
1353 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001354 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001355 -1,
1356 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001357 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001358 metrics::CheckResult::kUpdateAvailable,
1359 metrics::CheckReaction::kDeferring,
1360 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001361 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001362 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001363
Ben Chan9abb7632014-08-07 00:10:53 -07001364 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001365 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001366 // count remains the same, as the decrementing happens in update_attempter
1367 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001368 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001369 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001370
1371 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001372 request_params_.set_interactive(true);
1373 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1374 -1,
1375 false, // ping_only
1376 ErrorCode::kSuccess,
1377 metrics::CheckResult::kUpdateAvailable,
1378 metrics::CheckReaction::kUpdating,
1379 metrics::DownloadErrorCode::kUnset,
1380 &response,
1381 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001382 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001383}
Jay Srinivasan0a708742012-03-20 11:26:12 -07001384
Adolfo Victoria497044c2018-07-18 07:51:42 -07001385TEST_F(OmahaRequestActionTest, StagingTurnedOnCausesScattering) {
1386 // If staging is on, the value for max days to scatter should be ignored, and
1387 // staging's scatter value should be used.
1388 OmahaResponse response;
1389 request_params_.set_wall_clock_based_wait_enabled(true);
1390 request_params_.set_waiting_period(TimeDelta::FromDays(6));
1391 request_params_.set_update_check_count_wait_enabled(false);
1392
May Lippert60aa3ca2018-08-15 16:55:29 -07001393 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1394
Adolfo Victoria497044c2018-07-18 07:51:42 -07001395 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsWallClockStagingWaitPeriod, 6));
1396 // This should not prevent scattering due to staging.
1397 fake_update_response_.max_days_to_scatter = "0";
1398 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1399 -1,
1400 false, // ping_only
1401 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1402 metrics::CheckResult::kUpdateAvailable,
1403 metrics::CheckReaction::kDeferring,
1404 metrics::DownloadErrorCode::kUnset,
1405 &response,
1406 nullptr));
1407 EXPECT_FALSE(response.update_exists);
1408
1409 // Interactive updates should not be affected.
1410 request_params_.set_interactive(true);
1411 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1412 -1,
1413 false, // ping_only
1414 ErrorCode::kSuccess,
1415 metrics::CheckResult::kUpdateAvailable,
1416 metrics::CheckReaction::kUpdating,
1417 metrics::DownloadErrorCode::kUnset,
1418 &response,
1419 nullptr));
1420 EXPECT_TRUE(response.update_exists);
1421}
1422
Alex Deymo8e18f932015-03-27 16:16:59 -07001423TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
1424 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001425 fake_update_response_.include_cohorts = true;
1426 fake_update_response_.cohort = "s/154454/8479665";
1427 fake_update_response_.cohorthint = "please-put-me-on-beta";
1428 fake_update_response_.cohortname = "stable";
1429
Marton Hunyady2abda312018-04-24 18:21:49 +02001430 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001431 -1,
1432 false, // ping_only
1433 ErrorCode::kSuccess,
1434 metrics::CheckResult::kUpdateAvailable,
1435 metrics::CheckReaction::kUpdating,
1436 metrics::DownloadErrorCode::kUnset,
1437 &response,
1438 nullptr));
1439
1440 string value;
1441 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1442 EXPECT_EQ(fake_update_response_.cohort, value);
1443
1444 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1445 EXPECT_EQ(fake_update_response_.cohorthint, value);
1446
1447 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1448 EXPECT_EQ(fake_update_response_.cohortname, value);
1449}
1450
1451TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
1452 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001453 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1454 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
1455 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
1456 fake_update_response_.include_cohorts = true;
1457 fake_update_response_.cohort = "s/154454/8479665";
1458 fake_update_response_.cohorthint = "please-put-me-on-beta";
1459 fake_update_response_.cohortname = "";
1460
Marton Hunyady2abda312018-04-24 18:21:49 +02001461 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001462 -1,
1463 false, // ping_only
1464 ErrorCode::kSuccess,
1465 metrics::CheckResult::kUpdateAvailable,
1466 metrics::CheckReaction::kUpdating,
1467 metrics::DownloadErrorCode::kUnset,
1468 &response,
1469 nullptr));
1470
1471 string value;
1472 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1473 EXPECT_EQ(fake_update_response_.cohort, value);
1474
1475 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1476 EXPECT_EQ(fake_update_response_.cohorthint, value);
1477
1478 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1479}
1480
1481TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
1482 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001483 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1484
Marton Hunyady2abda312018-04-24 18:21:49 +02001485 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001486 -1,
1487 false, // ping_only
1488 ErrorCode::kSuccess,
1489 metrics::CheckResult::kUpdateAvailable,
1490 metrics::CheckReaction::kUpdating,
1491 metrics::DownloadErrorCode::kUnset,
1492 &response,
1493 nullptr));
1494
1495 string value;
1496 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1497 EXPECT_EQ("old_value", value);
1498
1499 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1500 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1501}
1502
Alex Deymo00d79ac2015-06-29 15:41:49 -07001503TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
1504 OmahaResponse response;
Alex Deymo00d79ac2015-06-29 15:41:49 -07001505 fake_update_response_.include_cohorts = true;
1506 fake_update_response_.cohort = "s/154454/8479665";
1507 fake_update_response_.cohorthint = "please-put-me-on-beta";
1508 fake_update_response_.cohortname = "stable";
1509
Marton Hunyady2abda312018-04-24 18:21:49 +02001510 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Alex Deymo00d79ac2015-06-29 15:41:49 -07001511 -1,
1512 false, // ping_only
1513 ErrorCode::kSuccess,
1514 metrics::CheckResult::kNoUpdateAvailable,
1515 metrics::CheckReaction::kUnset,
1516 metrics::DownloadErrorCode::kUnset,
1517 &response,
1518 nullptr));
1519
1520 string value;
1521 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1522 EXPECT_EQ(fake_update_response_.cohort, value);
1523
1524 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1525 EXPECT_EQ(fake_update_response_.cohorthint, value);
1526
1527 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1528 EXPECT_EQ(fake_update_response_.cohortname, value);
1529}
1530
Sen Jiangb1e063a2017-09-15 17:44:31 -07001531TEST_F(OmahaRequestActionTest, MultiAppCohortTest) {
1532 OmahaResponse response;
Sen Jiangb1e063a2017-09-15 17:44:31 -07001533 fake_update_response_.multi_app = true;
1534 fake_update_response_.include_cohorts = true;
1535 fake_update_response_.cohort = "s/154454/8479665";
1536 fake_update_response_.cohorthint = "please-put-me-on-beta";
1537 fake_update_response_.cohortname = "stable";
1538
Marton Hunyady2abda312018-04-24 18:21:49 +02001539 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangb1e063a2017-09-15 17:44:31 -07001540 -1,
1541 false, // ping_only
1542 ErrorCode::kSuccess,
1543 metrics::CheckResult::kUpdateAvailable,
1544 metrics::CheckReaction::kUpdating,
1545 metrics::DownloadErrorCode::kUnset,
1546 &response,
1547 nullptr));
1548
1549 string value;
1550 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1551 EXPECT_EQ(fake_update_response_.cohort, value);
1552
1553 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1554 EXPECT_EQ(fake_update_response_.cohorthint, value);
1555
1556 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1557 EXPECT_EQ(fake_update_response_.cohortname, value);
1558}
1559
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001560TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Alex Deymo8e18f932015-03-27 16:16:59 -07001561 const string http_response(fake_update_response_.GetNoUpdateResponse());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001562
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001563 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001564 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001565
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001566 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001567 &fake_system_state_,
1568 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001569 std::make_unique<MockHttpFetcher>(
1570 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001571 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001572 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001573 processor.set_delegate(&delegate_);
1574 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001575
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -07001576 loop.PostTask(base::Bind(
1577 [](ActionProcessor* processor) { processor->StartProcessing(); },
1578 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -07001579 loop.Run();
1580 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001581 EXPECT_FALSE(processor.IsRunning());
1582}
1583
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001584TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001585 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001586 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1587 -1,
1588 false, // ping_only
1589 ErrorCode::kOmahaRequestXMLParseError,
1590 metrics::CheckResult::kParsingError,
1591 metrics::CheckReaction::kUnset,
1592 metrics::DownloadErrorCode::kUnset,
1593 &response,
1594 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001595 EXPECT_FALSE(response.update_exists);
1596}
1597
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001598TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001599 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001600 ASSERT_FALSE(TestUpdateCheck("",
1601 -1,
1602 false, // ping_only
1603 ErrorCode::kOmahaRequestEmptyResponseError,
1604 metrics::CheckResult::kParsingError,
1605 metrics::CheckReaction::kUnset,
1606 metrics::DownloadErrorCode::kUnset,
1607 &response,
1608 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001609 EXPECT_FALSE(response.update_exists);
1610}
1611
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001612TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001613 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001614 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001615 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1616 "<daystart elapsed_seconds=\"100\"/>"
1617 "<app appid=\"foo\" status=\"ok\">"
1618 "<ping status=\"ok\"/>"
1619 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001620 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001621 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001622 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001623 metrics::CheckResult::kParsingError,
1624 metrics::CheckReaction::kUnset,
1625 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001626 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001627 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001628 EXPECT_FALSE(response.update_exists);
1629}
1630
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001631TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001632 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001633 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001634 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1635 "<daystart elapsed_seconds=\"100\"/>"
1636 "<app appid=\"foo\" status=\"ok\">"
1637 "<ping status=\"ok\"/>"
1638 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001639 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001640 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001641 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001642 metrics::CheckResult::kParsingError,
1643 metrics::CheckReaction::kUnset,
1644 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001645 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001646 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001647 EXPECT_FALSE(response.update_exists);
1648}
1649
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001650TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001651 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001652 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001653 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1654 "<daystart elapsed_seconds=\"100\"/>"
1655 "<app appid=\"foo\" status=\"ok\">"
1656 "<ping status=\"ok\"/>"
1657 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001658 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001659 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001660 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001661 metrics::CheckResult::kParsingError,
1662 metrics::CheckReaction::kUnset,
1663 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001664 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001665 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001666 EXPECT_FALSE(response.update_exists);
1667}
1668
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001669TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001670 string input_response =
1671 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1672 "<daystart elapsed_seconds=\"100\"/>"
Aaron Wood7dcdedf2017-09-06 17:17:41 -07001673 // the appid needs to match that in the request params
1674 "<app appid=\"" +
1675 fake_update_response_.app_id +
1676 "\" status=\"ok\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001677 "<updatecheck status=\"ok\">"
1678 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001679 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001680 "<packages><package hash=\"not-used\" name=\"f\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001681 "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001682 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001683 "Prompt=\"false\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001684 "IsDeltaPayload=\"false\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001685 "sha256=\"not-used\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001686 "/></actions></manifest></updatecheck></app></response>";
1687 LOG(INFO) << "Input Response = " << input_response;
1688
Darin Petkov6a5b3222010-07-13 14:55:28 -07001689 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001690 ASSERT_TRUE(TestUpdateCheck(input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001691 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001692 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001693 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001694 metrics::CheckResult::kUpdateAvailable,
1695 metrics::CheckReaction::kUpdating,
1696 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001697 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001698 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001699 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001700 EXPECT_EQ("10.2.3.4", response.version);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001701 EXPECT_EQ("http://missing/field/test/f",
1702 response.packages[0].payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001703 EXPECT_EQ("", response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001704 EXPECT_EQ("lkq34j5345", response.packages[0].hash);
1705 EXPECT_EQ(587u, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001706 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001707 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001708}
1709
1710namespace {
1711class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1712 public:
1713 void ProcessingStopped(const ActionProcessor* processor) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001714 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001715 }
Darin Petkov6a5b3222010-07-13 14:55:28 -07001716};
1717
Alex Deymo60ca1a72015-06-18 18:19:15 -07001718void TerminateTransferTestStarter(ActionProcessor* processor) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001719 processor->StartProcessing();
1720 CHECK(processor->IsRunning());
1721 processor->StopProcessing();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001722}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001723} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001724
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001725TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001726 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001727 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001728
Alex Deymo60ca1a72015-06-18 18:19:15 -07001729 string http_response("doesn't matter");
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001730 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001731 &fake_system_state_,
1732 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001733 std::make_unique<MockHttpFetcher>(
1734 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001735 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001736 TerminateEarlyTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001737 ActionProcessor processor;
1738 processor.set_delegate(&delegate);
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001739 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001740
Alex Deymo60ca1a72015-06-18 18:19:15 -07001741 loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
1742 loop.Run();
1743 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001744}
1745
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001746TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Alex Deymob0d74eb2015-03-30 17:59:17 -07001747 string output;
1748 EXPECT_TRUE(XmlEncode("ab", &output));
1749 EXPECT_EQ("ab", output);
1750 EXPECT_TRUE(XmlEncode("a<b", &output));
1751 EXPECT_EQ("a&lt;b", output);
Alex Deymocc457852015-06-18 18:35:50 -07001752 EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1753 EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
Alex Deymob0d74eb2015-03-30 17:59:17 -07001754 EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1755 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
Alex Deymocc457852015-06-18 18:35:50 -07001756 // Check that unterminated UTF-8 strings are handled properly.
Alex Deymob0d74eb2015-03-30 17:59:17 -07001757 EXPECT_FALSE(XmlEncode("\xc2", &output));
1758 // Fail with invalid ASCII-7 chars.
1759 EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1760}
Darin Petkov6a5b3222010-07-13 14:55:28 -07001761
Alex Deymob0d74eb2015-03-30 17:59:17 -07001762TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1763 EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1764 EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1765}
1766
1767TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001768 brillo::Blob post_data;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001769
1770 // Make sure XML Encode is being called on the params
Marton Hunyady2abda312018-04-24 18:21:49 +02001771 request_params_.set_os_sp("testtheservice_pack>");
1772 request_params_.set_os_board("x86 generic<id");
1773 request_params_.set_current_channel("unittest_track&lt;");
1774 request_params_.set_target_channel("unittest_track&lt;");
1775 request_params_.set_hwid("<OEM MODEL>");
Alex Deymo8e18f932015-03-27 16:16:59 -07001776 fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
1777 fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
1778 fake_prefs_.SetString(kPrefsOmahaCohortName,
Alex Vakulenko0103c362016-01-20 07:56:15 -08001779 base::JoinString(
1780 vector<string>(100, "My spoon is too big."), " "));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001781 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001782 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1783 -1,
1784 false, // ping_only
1785 ErrorCode::kOmahaRequestXMLParseError,
1786 metrics::CheckResult::kParsingError,
1787 metrics::CheckReaction::kUnset,
1788 metrics::DownloadErrorCode::kUnset,
1789 &response,
1790 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001791 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001792 string post_str(post_data.begin(), post_data.end());
Alex Deymo8e18f932015-03-27 16:16:59 -07001793 EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
1794 EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
1795 EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
1796 EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
1797 EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
1798 EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
1799 EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
1800 EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
1801 EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
1802 EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
1803 EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
1804 // Values from Prefs that are too big are removed from the XML instead of
1805 // encoded.
1806 EXPECT_EQ(string::npos, post_str.find("cohortname="));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001807}
1808
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001809TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001810 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001811 fake_update_response_.deadline = "&lt;20110101";
1812 fake_update_response_.more_info_url = "testthe&lt;url";
1813 fake_update_response_.codebase = "testthe&amp;codebase/";
Marton Hunyady2abda312018-04-24 18:21:49 +02001814 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1815 -1,
1816 false, // ping_only
1817 ErrorCode::kSuccess,
1818 metrics::CheckResult::kUpdateAvailable,
1819 metrics::CheckReaction::kUpdating,
1820 metrics::DownloadErrorCode::kUnset,
1821 &response,
1822 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001823
Sen Jiang0affc2c2017-02-10 15:55:05 -08001824 EXPECT_EQ("testthe<url", response.more_info_url);
1825 EXPECT_EQ("testthe&codebase/file.signed",
1826 response.packages[0].payload_urls[0]);
1827 EXPECT_EQ("<20110101", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001828}
1829
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001830TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001831 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001832 // overflows int32_t:
Sen Jiang0affc2c2017-02-10 15:55:05 -08001833 fake_update_response_.size = 123123123123123ull;
Marton Hunyady2abda312018-04-24 18:21:49 +02001834 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1835 -1,
1836 false, // ping_only
1837 ErrorCode::kSuccess,
1838 metrics::CheckResult::kUpdateAvailable,
1839 metrics::CheckReaction::kUpdating,
1840 metrics::DownloadErrorCode::kUnset,
1841 &response,
1842 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001843
Sen Jiang0affc2c2017-02-10 15:55:05 -08001844 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001845}
1846
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001847TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001848 brillo::Blob post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001849 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001850 fake_system_state_.set_prefs(&prefs);
1851
Darin Petkov95508da2011-01-05 12:42:29 -08001852 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Ben Chan672c1f52017-10-23 15:41:39 -07001853 .WillOnce(DoAll(SetArgPointee<1>(string("")), Return(true)));
Alex Deymoefb9d832015-11-02 18:39:02 -08001854 // An existing but empty previous version means that we didn't reboot to a new
1855 // update, therefore, no need to update the previous version.
1856 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
Marton Hunyady2abda312018-04-24 18:21:49 +02001857 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001858 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001859 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001860 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001861 metrics::CheckResult::kParsingError,
1862 metrics::CheckReaction::kUnset,
1863 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001864 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001865 &post_data));
1866 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001867 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001868 EXPECT_NE(
1869 post_str.find(" <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1870 " <updatecheck></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001871 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001872 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1873 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001874 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1875 string::npos);
1876 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1877 string::npos);
Alex Deymoefb9d832015-11-02 18:39:02 -08001878 // No <event> tag should be sent if we didn't reboot to an update.
1879 EXPECT_EQ(post_str.find("<event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001880}
1881
Jay Srinivasan0a708742012-03-20 11:26:12 -07001882
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001883TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001884 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001885 TestEvent(new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
Darin Petkove17f86b2010-07-20 09:12:01 -07001886 "invalid xml>",
1887 &post_data);
1888 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001889 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001890 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001891 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001892 OmahaEvent::kTypeUpdateDownloadStarted,
1893 OmahaEvent::kResultSuccess);
1894 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001895 EXPECT_EQ(post_str.find("ping"), string::npos);
1896 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001897}
1898
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001899TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001900 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001901 TestEvent(new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
Darin Petkove17f86b2010-07-20 09:12:01 -07001902 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001903 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001904 "invalid xml>",
1905 &post_data);
1906 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001907 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001908 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001909 " <event eventtype=\"%d\" eventresult=\"%d\" "
1910 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001911 OmahaEvent::kTypeDownloadComplete,
1912 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001913 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001914 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001915 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001916}
1917
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001918TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001919 string http_response("doesn't matter");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001920 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001921 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001922 nullptr,
Ben Chanab5a0af2017-10-12 14:57:50 -07001923 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001924 http_response.size(),
1925 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001926 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001927 EXPECT_FALSE(update_check_action.IsEvent());
1928
1929 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001930 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001931 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Ben Chanab5a0af2017-10-12 14:57:50 -07001932 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001933 http_response.size(),
1934 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001935 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001936 EXPECT_TRUE(event_action.IsEvent());
1937}
1938
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001939TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001940 for (int i = 0; i < 2; i++) {
1941 bool delta_okay = i == 1;
1942 const char* delta_okay_str = delta_okay ? "true" : "false";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001943 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001944
1945 request_params_.set_delta_okay(delta_okay);
1946
1947 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001948 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001949 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001950 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001951 metrics::CheckResult::kParsingError,
1952 metrics::CheckReaction::kUnset,
1953 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001954 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001955 &post_data));
1956 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001957 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001958 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1959 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001960 string::npos)
1961 << "i = " << i;
1962 }
1963}
1964
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001965TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001966 for (int i = 0; i < 2; i++) {
1967 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001968 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001969 brillo::Blob post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001970 FakeSystemState fake_system_state;
Marton Hunyady2abda312018-04-24 18:21:49 +02001971
1972 request_params_.set_interactive(interactive);
1973
1974 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001975 -1,
1976 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001977 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001978 metrics::CheckResult::kParsingError,
1979 metrics::CheckReaction::kUnset,
1980 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001981 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001982 &post_data));
1983 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001984 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001985 EXPECT_NE(post_str.find(
1986 base::StringPrintf("installsource=\"%s\"", interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001987 string::npos)
1988 << "i = " << i;
1989 }
1990}
1991
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001992TEST_F(OmahaRequestActionTest, FormatTargetVersionPrefixOutputTest) {
1993 for (int i = 0; i < 2; i++) {
1994 bool target_version_set = i == 1;
1995 const char* target_version_prefix = target_version_set ? "10032." : "";
1996 brillo::Blob post_data;
1997 FakeSystemState fake_system_state;
1998
1999 request_params_.set_target_version_prefix(target_version_prefix);
2000
2001 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
2002 -1,
2003 false, // ping_only
2004 ErrorCode::kOmahaRequestXMLParseError,
2005 metrics::CheckResult::kParsingError,
2006 metrics::CheckReaction::kUnset,
2007 metrics::DownloadErrorCode::kUnset,
2008 nullptr,
2009 &post_data));
2010 // convert post_data to string
2011 string post_str(post_data.begin(), post_data.end());
2012 if (target_version_set) {
2013 EXPECT_NE(post_str.find("<updatecheck targetversionprefix=\"10032.\">"),
2014 string::npos)
2015 << "i = " << i;
2016 } else {
2017 EXPECT_EQ(post_str.find("targetversionprefix"), string::npos)
2018 << "i = " << i;
2019 }
2020 }
2021}
2022
2023TEST_F(OmahaRequestActionTest, FormatRollbackAllowedOutputTest) {
2024 for (int i = 0; i < 4; i++) {
2025 bool rollback_allowed = i / 2 == 0;
2026 bool target_version_set = i % 2 == 0;
2027 brillo::Blob post_data;
2028 FakeSystemState fake_system_state;
2029
2030 request_params_.set_target_version_prefix(target_version_set ? "10032."
2031 : "");
2032 request_params_.set_rollback_allowed(rollback_allowed);
2033
2034 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
2035 -1,
2036 false, // ping_only
2037 ErrorCode::kOmahaRequestXMLParseError,
2038 metrics::CheckResult::kParsingError,
2039 metrics::CheckReaction::kUnset,
2040 metrics::DownloadErrorCode::kUnset,
2041 nullptr,
2042 &post_data));
2043 // convert post_data to string
2044 string post_str(post_data.begin(), post_data.end());
2045 if (rollback_allowed && target_version_set) {
2046 EXPECT_NE(post_str.find("rollback_allowed=\"true\""), string::npos)
2047 << "i = " << i;
2048 } else {
2049 EXPECT_EQ(post_str.find("rollback_allowed"), string::npos) << "i = " << i;
2050 }
2051 }
2052}
2053
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002054TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07002055 OmahaEvent default_event;
2056 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
2057 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002058 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002059
2060 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
2061 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
2062 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002063 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002064
2065 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
2066 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002067 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07002068 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
2069 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002070 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002071}
2072
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002073void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002074 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002075 fake_system_state_.set_prefs(&prefs);
2076 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2077 .Times(AnyNumber());
2078 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
2079 // Add a few hours to the day difference to test no rounding, etc.
2080 int64_t five_days_ago =
2081 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
2082 int64_t six_days_ago =
2083 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
2084 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002085 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002086 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002087 .WillOnce(DoAll(SetArgPointee<1>(six_days_ago), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002088 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002089 .WillOnce(DoAll(SetArgPointee<1>(five_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002090 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002091 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07002092 -1,
2093 ping_only,
2094 ErrorCode::kSuccess,
2095 metrics::CheckResult::kNoUpdateAvailable,
2096 metrics::CheckReaction::kUnset,
2097 metrics::DownloadErrorCode::kUnset,
2098 nullptr,
2099 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002100 string post_str(post_data.begin(), post_data.end());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002101 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
2102 string::npos);
2103 if (ping_only) {
2104 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
2105 EXPECT_EQ(post_str.find("previousversion"), string::npos);
2106 } else {
2107 EXPECT_NE(post_str.find("updatecheck"), string::npos);
2108 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07002109 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002110}
2111
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002112TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
2113 PingTest(true /* ping_only */);
2114}
2115
2116TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
2117 PingTest(false /* ping_only */);
2118}
2119
2120TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002121 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002122 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002123 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2124 .Times(AnyNumber());
2125 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002126 int64_t three_days_ago =
2127 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
2128 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002129 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002130 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002131 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002132 .WillOnce(DoAll(SetArgPointee<1>(three_days_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002133 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002134 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002135 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002136 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2137 -1,
2138 false, // ping_only
2139 ErrorCode::kSuccess,
2140 metrics::CheckResult::kNoUpdateAvailable,
2141 metrics::CheckReaction::kUnset,
2142 metrics::DownloadErrorCode::kUnset,
2143 nullptr,
2144 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002145 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002146 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07002147 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002148}
2149
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002150TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002151 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002152 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002153 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2154 .Times(AnyNumber());
2155 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002156 int64_t four_days_ago =
2157 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
2158 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002159 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002160 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002161 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002162 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002163 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002164 .WillOnce(DoAll(SetArgPointee<1>(four_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002165 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002166 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2167 -1,
2168 false, // ping_only
2169 ErrorCode::kSuccess,
2170 metrics::CheckResult::kNoUpdateAvailable,
2171 metrics::CheckReaction::kUnset,
2172 metrics::DownloadErrorCode::kUnset,
2173 nullptr,
2174 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002175 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002176 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07002177 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002178}
2179
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002180TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002181 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002182 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002183 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2184 .Times(AnyNumber());
2185 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002186 int64_t one_hour_ago =
2187 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002188 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002189 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002190 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002191 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002192 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002193 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002194 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
2195 // send a ping.
2196 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2197 .WillOnce(Return(true));
2198 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2199 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002200 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002201 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2202 -1,
2203 false, // ping_only
2204 ErrorCode::kSuccess,
2205 metrics::CheckResult::kNoUpdateAvailable,
2206 metrics::CheckReaction::kUnset,
2207 metrics::DownloadErrorCode::kUnset,
2208 nullptr,
2209 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002210 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002211 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002212}
2213
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002214TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07002215 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08002216 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002217 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07002218 int64_t now = Time::Now().ToInternalValue();
2219 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002220 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002221 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002222 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002223 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2224 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002225 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002226 EXPECT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2227 -1,
2228 true, // ping_only
2229 ErrorCode::kSuccess,
2230 metrics::CheckResult::kUnset,
2231 metrics::CheckReaction::kUnset,
2232 metrics::DownloadErrorCode::kUnset,
2233 nullptr,
2234 &post_data));
Alex Deymo80f70ff2016-02-10 16:08:11 -08002235 EXPECT_EQ(0U, post_data.size());
Thieu Leb44e9e82011-06-06 14:34:04 -07002236}
2237
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002238TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002239 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002240 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002241 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2242 .Times(AnyNumber());
2243 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002244 int64_t future =
2245 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002246 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002247 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002248 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002249 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002250 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002251 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002252 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2253 .WillOnce(Return(true));
2254 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2255 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002256 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002257 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002258 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002259 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002260 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002261 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002262 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002263 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002264 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002265 metrics::CheckResult::kNoUpdateAvailable,
2266 metrics::CheckReaction::kUnset,
2267 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002268 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002269 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002270 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002271 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002272}
2273
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002274TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002275 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07002276 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002277 // may fail if it runs for longer than 5 seconds. It shouldn't run
2278 // that long though.
2279 int64_t midnight =
2280 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
2281 int64_t midnight_slack =
2282 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08002283 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002284 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002285 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2286 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002287 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
2288 AllOf(Ge(midnight), Le(midnight_slack))))
2289 .WillOnce(Return(true));
2290 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
2291 AllOf(Ge(midnight), Le(midnight_slack))))
2292 .WillOnce(Return(true));
2293 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002294 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002295 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002296 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002297 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002298 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002299 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002300 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002301 metrics::CheckResult::kNoUpdateAvailable,
2302 metrics::CheckReaction::kUnset,
2303 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002304 nullptr,
2305 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002306}
2307
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002308TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002309 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002310 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002311 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2312 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002313 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2314 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2315 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002316 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002317 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002318 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002319 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002320 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002321 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002322 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002323 metrics::CheckResult::kNoUpdateAvailable,
2324 metrics::CheckReaction::kUnset,
2325 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002326 nullptr,
2327 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002328}
2329
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002330TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002331 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002332 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002333 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2334 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002335 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2336 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2337 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002338 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002339 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002340 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002341 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002342 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002343 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002344 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002345 metrics::CheckResult::kNoUpdateAvailable,
2346 metrics::CheckReaction::kUnset,
2347 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002348 nullptr,
2349 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002350}
2351
Alex Deymob3fa53b2016-04-18 19:57:58 -07002352TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
2353 // Test that the "eol" flags is only parsed from the "_eol" attribute and not
2354 // the "eol" attribute.
2355 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002356 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Alex Deymob3fa53b2016-04-18 19:57:58 -07002357 "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
2358 "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
2359 "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
2360 "</app></response>",
2361 -1,
2362 false, // ping_only
2363 ErrorCode::kSuccess,
2364 metrics::CheckResult::kNoUpdateAvailable,
2365 metrics::CheckReaction::kUnset,
2366 metrics::DownloadErrorCode::kUnset,
2367 nullptr,
2368 nullptr));
2369 string eol_pref;
2370 EXPECT_TRUE(
2371 fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
2372 // Note that the eol="eol" attribute should be ignored and the _eol should be
2373 // used instead.
2374 EXPECT_EQ("security-only", eol_pref);
2375}
2376
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002377TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002378 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002379 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002380 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002381 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002382 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002383 metrics::CheckResult::kParsingError,
2384 metrics::CheckReaction::kUnset,
2385 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002386 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07002387 &post_data));
2388 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002389 string post_str(post_data.begin(), post_data.end());
Darin Petkov84c763c2010-07-29 16:27:58 -07002390 EXPECT_EQ(post_str.find("machineid="), string::npos);
2391 EXPECT_EQ(post_str.find("userid="), string::npos);
2392}
2393
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002394TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002395 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002396 const int http_error_code =
2397 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Marton Hunyady2abda312018-04-24 18:21:49 +02002398 ASSERT_FALSE(TestUpdateCheck("",
2399 501,
2400 false, // ping_only
2401 static_cast<ErrorCode>(http_error_code),
2402 metrics::CheckResult::kDownloadError,
2403 metrics::CheckReaction::kUnset,
2404 static_cast<metrics::DownloadErrorCode>(501),
2405 &response,
2406 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002407 EXPECT_FALSE(response.update_exists);
2408}
2409
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002410TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002411 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002412 const int http_error_code =
2413 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Marton Hunyady2abda312018-04-24 18:21:49 +02002414 ASSERT_FALSE(TestUpdateCheck("",
2415 1500,
2416 false, // ping_only
2417 static_cast<ErrorCode>(http_error_code),
2418 metrics::CheckResult::kDownloadError,
2419 metrics::CheckReaction::kUnset,
2420 metrics::DownloadErrorCode::kHttpStatusOther,
2421 &response,
2422 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002423 EXPECT_FALSE(response.update_exists);
2424}
2425
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002426TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002427 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002428 request_params_.set_wall_clock_based_wait_enabled(true);
2429 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2430 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002431
Sen Jiang7c1171e2016-06-23 11:35:40 -07002432 Time arbitrary_date;
Eric Caruso761be2c2018-05-22 16:23:33 -07002433 ASSERT_TRUE(Time::FromString("6/4/1989", &arbitrary_date));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002434 fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
Marton Hunyady2abda312018-04-24 18:21:49 +02002435 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002436 -1,
2437 false, // ping_only
2438 ErrorCode::kOmahaUpdateDeferredPerPolicy,
2439 metrics::CheckResult::kUpdateAvailable,
2440 metrics::CheckReaction::kDeferring,
2441 metrics::DownloadErrorCode::kUnset,
2442 &response,
2443 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002444
Ben Chan9abb7632014-08-07 00:10:53 -07002445 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002446 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002447 EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002448 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07002449
2450 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02002451 request_params_.set_interactive(true);
2452 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002453 -1,
2454 false, // ping_only
2455 ErrorCode::kSuccess,
2456 metrics::CheckResult::kUpdateAvailable,
2457 metrics::CheckReaction::kUpdating,
2458 metrics::DownloadErrorCode::kUnset,
2459 &response,
2460 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07002461 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002462}
2463
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002464TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002465 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002466 request_params_.set_wall_clock_based_wait_enabled(true);
2467 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2468 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002469
Sen Jiang7c1171e2016-06-23 11:35:40 -07002470 Time t1, t2;
Eric Caruso761be2c2018-05-22 16:23:33 -07002471 ASSERT_TRUE(Time::FromString("1/1/2012", &t1));
2472 ASSERT_TRUE(Time::FromString("1/3/2012", &t2));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002473 ASSERT_TRUE(
2474 fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2475 fake_system_state_.fake_clock()->SetWallclockTime(t2);
Marton Hunyady2abda312018-04-24 18:21:49 +02002476 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002477 -1,
2478 false, // ping_only
2479 ErrorCode::kSuccess,
2480 metrics::CheckResult::kUpdateAvailable,
2481 metrics::CheckReaction::kUpdating,
2482 metrics::DownloadErrorCode::kUnset,
2483 &response,
2484 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002485
2486 EXPECT_TRUE(response.update_exists);
2487
2488 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002489 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002490 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002491 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2492}
2493
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002494TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002495 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002496 base::ScopedTempDir tempdir;
2497 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002498
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002499 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002500 request_params_.set_root(tempdir.GetPath().value());
2501 request_params_.set_app_id("{22222222-2222-2222-2222-222222222222}");
2502 request_params_.set_app_version("1.2.3.4");
2503 request_params_.set_product_components("o.bundle=1");
2504 request_params_.set_current_channel("canary-channel");
2505 EXPECT_TRUE(
2506 request_params_.SetTargetChannel("stable-channel", true, nullptr));
2507 request_params_.UpdateDownloadChannel();
2508 EXPECT_TRUE(request_params_.ShouldPowerwash());
2509 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002510 -1,
2511 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002512 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002513 metrics::CheckResult::kParsingError,
2514 metrics::CheckReaction::kUnset,
2515 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002516 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002517 &post_data));
2518 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002519 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002520 EXPECT_NE(string::npos, post_str.find(
2521 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2522 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2523 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Sen Jiang8cd42342018-01-31 12:06:59 -08002524 EXPECT_EQ(string::npos, post_str.find("o.bundle"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002525}
2526
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002527TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002528 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002529 base::ScopedTempDir tempdir;
2530 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002531
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002532 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002533 request_params_.set_root(tempdir.GetPath().value());
2534 request_params_.set_app_id("{11111111-1111-1111-1111-111111111111}");
2535 request_params_.set_app_version("5.6.7.8");
2536 request_params_.set_product_components("o.bundle=1");
2537 request_params_.set_current_channel("stable-channel");
2538 EXPECT_TRUE(
2539 request_params_.SetTargetChannel("canary-channel", false, nullptr));
2540 request_params_.UpdateDownloadChannel();
2541 EXPECT_FALSE(request_params_.ShouldPowerwash());
2542 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002543 -1,
2544 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002545 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002546 metrics::CheckResult::kParsingError,
2547 metrics::CheckReaction::kUnset,
2548 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002549 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002550 &post_data));
Xiaochu Liu88d90382018-08-29 16:09:11 -07002551 // Convert post_data to string.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002552 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002553 EXPECT_NE(string::npos, post_str.find(
2554 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2555 "version=\"5.6.7.8\" "
2556 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002557 EXPECT_EQ(string::npos, post_str.find("from_version"));
Sen Jiang8cd42342018-01-31 12:06:59 -08002558 EXPECT_NE(string::npos, post_str.find("o.bundle.version=\"1\""));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002559}
2560
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002561// Checks that the initial ping with a=-1 r=-1 is not send when the device
2562// was powerwashed.
2563TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
2564 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2565
2566 // Flag that the device was powerwashed in the past.
2567 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
2568
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002569 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002570 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2571 -1,
2572 false, // ping_only
2573 ErrorCode::kSuccess,
2574 metrics::CheckResult::kNoUpdateAvailable,
2575 metrics::CheckReaction::kUnset,
2576 metrics::DownloadErrorCode::kUnset,
2577 nullptr,
2578 &post_data));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002579 // We shouldn't send a ping in this case since powerwash > 0.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002580 string post_str(post_data.begin(), post_data.end());
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002581 EXPECT_EQ(string::npos, post_str.find("<ping"));
2582}
2583
Amin Hassani1677e812017-06-21 13:36:36 -07002584// Checks that the initial ping with a=-1 r=-1 is not send when the device
2585// first_active_omaha_ping_sent is set.
2586TEST_F(OmahaRequestActionTest, PingWhenFirstActiveOmahaPingIsSent) {
2587 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2588
2589 // Flag that the device was not powerwashed in the past.
2590 fake_system_state_.fake_hardware()->SetPowerwashCount(0);
2591
2592 // Flag that the device has sent first active ping in the past.
2593 fake_system_state_.fake_hardware()->SetFirstActiveOmahaPingSent();
2594
2595 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002596 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2597 -1,
2598 false, // ping_only
2599 ErrorCode::kSuccess,
2600 metrics::CheckResult::kNoUpdateAvailable,
2601 metrics::CheckReaction::kUnset,
2602 metrics::DownloadErrorCode::kUnset,
2603 nullptr,
2604 &post_data));
Amin Hassani1677e812017-06-21 13:36:36 -07002605 // We shouldn't send a ping in this case since
2606 // first_active_omaha_ping_sent=true
2607 string post_str(post_data.begin(), post_data.end());
2608 EXPECT_EQ(string::npos, post_str.find("<ping"));
2609}
2610
Alex Deymo9fded1e2015-11-05 12:31:19 -08002611// Checks that the event 54 is sent on a reboot to a new update.
2612TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
2613 // Flag that the device was updated in a previous boot.
2614 fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
2615
2616 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002617 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2618 -1,
2619 false, // ping_only
2620 ErrorCode::kSuccess,
2621 metrics::CheckResult::kNoUpdateAvailable,
2622 metrics::CheckReaction::kUnset,
2623 metrics::DownloadErrorCode::kUnset,
2624 nullptr,
2625 &post_data));
Alex Deymo9fded1e2015-11-05 12:31:19 -08002626 string post_str(post_data.begin(), post_data.end());
2627
2628 // An event 54 is included and has the right version.
2629 EXPECT_NE(string::npos,
2630 post_str.find(base::StringPrintf(
2631 "<event eventtype=\"%d\"",
2632 OmahaEvent::kTypeRebootedAfterUpdate)));
2633 EXPECT_NE(string::npos,
2634 post_str.find("previousversion=\"1.2.3.4\"></event>"));
2635
2636 // The previous version flag should have been removed.
2637 EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
2638 string prev_version;
2639 EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
2640 EXPECT_TRUE(prev_version.empty());
2641}
2642
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002643void OmahaRequestActionTest::P2PTest(
2644 bool initial_allow_p2p_for_downloading,
2645 bool initial_allow_p2p_for_sharing,
2646 bool omaha_disable_p2p_for_downloading,
2647 bool omaha_disable_p2p_for_sharing,
2648 bool payload_state_allow_p2p_attempt,
2649 bool expect_p2p_client_lookup,
2650 const string& p2p_client_result_url,
2651 bool expected_allow_p2p_for_downloading,
2652 bool expected_allow_p2p_for_sharing,
2653 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07002654 OmahaResponse response;
Gilad Arnold74b5f552014-10-07 08:17:16 -07002655 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
2656 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
2657 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07002658
2659 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002660 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07002661 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2662 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07002663 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
2664 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
2665 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
2666 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
2667 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
2668 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
2669 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
2670 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
2671 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
2672 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
2673
David Zeuthen8f191b22013-08-06 12:27:50 -07002674 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002675 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07002676 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2677
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002678 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2679 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002680 .Times(expect_p2p_client_lookup ? 1 : 0);
2681
Alex Deymo8e18f932015-03-27 16:16:59 -07002682 fake_update_response_.disable_p2p_for_downloading =
2683 omaha_disable_p2p_for_downloading;
2684 fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
Marton Hunyady2abda312018-04-24 18:21:49 +02002685 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2686 -1,
2687 false, // ping_only
2688 ErrorCode::kSuccess,
2689 metrics::CheckResult::kUpdateAvailable,
2690 metrics::CheckReaction::kUpdating,
2691 metrics::DownloadErrorCode::kUnset,
2692 &response,
2693 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002694 EXPECT_TRUE(response.update_exists);
2695
Gilad Arnold74b5f552014-10-07 08:17:16 -07002696 EXPECT_EQ(omaha_disable_p2p_for_downloading,
2697 response.disable_p2p_for_downloading);
2698 EXPECT_EQ(omaha_disable_p2p_for_sharing,
2699 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07002700
Gilad Arnold74b5f552014-10-07 08:17:16 -07002701 EXPECT_EQ(expected_allow_p2p_for_downloading,
2702 actual_allow_p2p_for_downloading);
2703 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
2704 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07002705}
2706
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002707TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002708 P2PTest(true, // initial_allow_p2p_for_downloading
2709 true, // initial_allow_p2p_for_sharing
2710 false, // omaha_disable_p2p_for_downloading
2711 false, // omaha_disable_p2p_for_sharing
2712 true, // payload_state_allow_p2p_attempt
2713 true, // expect_p2p_client_lookup
2714 "http://1.3.5.7/p2p", // p2p_client_result_url
2715 true, // expected_allow_p2p_for_downloading
2716 true, // expected_allow_p2p_for_sharing
2717 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002718}
2719
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002720TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002721 P2PTest(true, // initial_allow_p2p_for_downloading
2722 true, // initial_allow_p2p_for_sharing
2723 false, // omaha_disable_p2p_for_downloading
2724 false, // omaha_disable_p2p_for_sharing
2725 true, // payload_state_allow_p2p_attempt
2726 true, // expect_p2p_client_lookup
2727 "", // p2p_client_result_url
2728 false, // expected_allow_p2p_for_downloading
2729 true, // expected_allow_p2p_for_sharing
2730 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002731}
2732
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002733TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002734 P2PTest(false, // initial_allow_p2p_for_downloading
2735 true, // initial_allow_p2p_for_sharing
2736 false, // omaha_disable_p2p_for_downloading
2737 false, // omaha_disable_p2p_for_sharing
2738 true, // payload_state_allow_p2p_attempt
2739 false, // expect_p2p_client_lookup
2740 "unset", // p2p_client_result_url
2741 false, // expected_allow_p2p_for_downloading
2742 true, // expected_allow_p2p_for_sharing
2743 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002744}
2745
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002746TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002747 P2PTest(true, // initial_allow_p2p_for_downloading
2748 true, // initial_allow_p2p_for_sharing
2749 true, // omaha_disable_p2p_for_downloading
2750 false, // omaha_disable_p2p_for_sharing
2751 true, // payload_state_allow_p2p_attempt
2752 false, // expect_p2p_client_lookup
2753 "unset", // p2p_client_result_url
2754 false, // expected_allow_p2p_for_downloading
2755 true, // expected_allow_p2p_for_sharing
2756 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002757}
2758
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002759TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002760 P2PTest(true, // initial_allow_p2p_for_downloading
2761 true, // initial_allow_p2p_for_sharing
2762 false, // omaha_disable_p2p_for_downloading
2763 true, // omaha_disable_p2p_for_sharing
2764 true, // payload_state_allow_p2p_attempt
2765 true, // expect_p2p_client_lookup
2766 "http://1.3.5.7/p2p", // p2p_client_result_url
2767 true, // expected_allow_p2p_for_downloading
2768 false, // expected_allow_p2p_for_sharing
2769 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002770}
2771
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002772TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002773 P2PTest(true, // initial_allow_p2p_for_downloading
2774 true, // initial_allow_p2p_for_sharing
2775 true, // omaha_disable_p2p_for_downloading
2776 true, // omaha_disable_p2p_for_sharing
2777 true, // payload_state_allow_p2p_attempt
2778 false, // expect_p2p_client_lookup
2779 "unset", // p2p_client_result_url
2780 false, // expected_allow_p2p_for_downloading
2781 false, // expected_allow_p2p_for_sharing
2782 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002783}
2784
Alex Deymof329b932014-10-30 01:37:48 -07002785bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2786 OmahaResponse *response) {
Alex Deymo8e18f932015-03-27 16:16:59 -07002787 fake_update_response_.elapsed_days = elapsed_days;
Marton Hunyady2abda312018-04-24 18:21:49 +02002788 return TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2789 -1,
2790 false, // ping_only
2791 ErrorCode::kSuccess,
2792 metrics::CheckResult::kUpdateAvailable,
2793 metrics::CheckReaction::kUpdating,
2794 metrics::DownloadErrorCode::kUnset,
2795 response,
2796 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002797}
2798
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002799TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002800 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002801
Kevin Cernekee2494e282016-03-29 18:03:53 -07002802 // Simulate a successful update check that happens during OOBE. The
2803 // deadline in the response is needed to force the update attempt to
2804 // occur; responses without a deadline seen during OOBE will normally
2805 // return ErrorCode::kNonCriticalUpdateInOOBE.
2806 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
2807 fake_update_response_.deadline = "20101020";
2808
David Zeuthen639aa362014-02-03 16:23:44 -08002809 // Check that we parse elapsed_days in the Omaha Response correctly.
2810 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002811 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2812 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002813 EXPECT_TRUE(response.update_exists);
2814 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002815 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002816 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002817 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002818 EXPECT_EQ(prefs_days, 42);
2819
2820 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002821 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002822 EXPECT_TRUE(response.update_exists);
2823 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002824 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002825 EXPECT_EQ(prefs_days, 42);
2826
2827 // Note that elapsed_days is not necessarily divisible by 7 so check
2828 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002829 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2830 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002831 EXPECT_TRUE(response.update_exists);
2832 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002833 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002834 EXPECT_EQ(prefs_days, 21);
2835
2836 // Check that we correctly handle elapsed_days not being included in
2837 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002838 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002839 EXPECT_TRUE(response.update_exists);
2840 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002841}
2842
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002843// If there is no prefs and OOBE is not complete, we should not
2844// report anything to Omaha.
2845TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
Kevin Cernekee2494e282016-03-29 18:03:53 -07002846 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002847 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2848 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2849}
David Zeuthen639aa362014-02-03 16:23:44 -08002850
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002851// If OOBE is complete and happened on a valid date (e.g. after Jan
2852// 1 2007 0:00 PST), that date should be used and written to
2853// prefs. However, first try with an invalid date and check we do
2854// nothing.
2855TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2856 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2857 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2858 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2859 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2860}
David Zeuthen639aa362014-02-03 16:23:44 -08002861
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002862// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2863// should yield an InstallDate of 14.
2864TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2865 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2866 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2867 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2868 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002869
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002870 int64_t prefs_days;
2871 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2872 EXPECT_EQ(prefs_days, 14);
2873}
David Zeuthen639aa362014-02-03 16:23:44 -08002874
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002875// Now that we have a valid date in prefs, check that we keep using
2876// that even if OOBE date reports something else. The date Jan 30,
2877// 2007 0:00 PST should yield an InstallDate of 28... but since
2878// there's a prefs file, we should still get 14.
2879TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2880 // Set a valid date in the prefs first.
2881 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002882
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002883 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2884 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2885 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002886
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002887 int64_t prefs_days;
2888 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2889 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002890
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002891 // If we delete the prefs file, we should get 28 days.
2892 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2893 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2894 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2895 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002896}
2897
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002898// Verifies that a device with no device policy, and is not a consumer
2899// device sets the max kernel key version to the current version.
2900// ie. the same behavior as if rollback is enabled.
2901TEST_F(OmahaRequestActionTest, NoPolicyEnterpriseDevicesSetMaxRollback) {
2902 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2903
2904 // Setup and verify some initial default values for the kernel TPM
2905 // values that control verified boot and rollback.
2906 const int min_kernel_version = 4;
2907 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2908 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2909 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2910 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2911
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002912 EXPECT_CALL(
2913 *fake_system_state_.mock_metrics_reporter(),
2914 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2915 .Times(1);
2916
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002917 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002918 TestRollbackCheck(false /* is_consumer_device */,
2919 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002920 false /* is_policy_loaded */,
2921 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002922
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002923 // Verify kernel_max_rollforward was set to the current minimum
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002924 // kernel key version. This has the effect of freezing roll
2925 // forwards indefinitely. This will hold the rollback window
2926 // open until a future change will be able to move this forward
2927 // relative the configured window.
2928 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2929 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2930}
2931
2932// Verifies that a conmsumer device with no device policy sets the
2933// max kernel key version to the current version. ie. the same
2934// behavior as if rollback is enabled.
2935TEST_F(OmahaRequestActionTest, NoPolicyConsumerDevicesSetMaxRollback) {
2936 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2937
2938 // Setup and verify some initial default values for the kernel TPM
2939 // values that control verified boot and rollback.
2940 const int min_kernel_version = 3;
2941 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2942 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2943 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2944 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2945
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002946 EXPECT_CALL(
2947 *fake_system_state_.mock_metrics_reporter(),
2948 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2949 .Times(1);
2950
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002951 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002952 TestRollbackCheck(true /* is_consumer_device */,
2953 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002954 false /* is_policy_loaded */,
2955 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002956
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002957 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002958 // was set to logical infinity. This is the expected behavior for
2959 // consumer devices and matches the existing behavior prior to the
2960 // rollback features.
2961 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2962 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2963}
2964
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002965// Verifies that a device with rollback enabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002966// in the TPM to prevent roll forward.
2967TEST_F(OmahaRequestActionTest, RollbackEnabledDevicesSetMaxRollback) {
2968 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2969
2970 // Setup and verify some initial default values for the kernel TPM
2971 // values that control verified boot and rollback.
2972 const int allowed_milestones = 4;
2973 const int min_kernel_version = 3;
2974 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2975 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2976 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2977 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2978
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002979 EXPECT_CALL(
2980 *fake_system_state_.mock_metrics_reporter(),
2981 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2982 .Times(1);
2983
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002984 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002985 TestRollbackCheck(false /* is_consumer_device */,
2986 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002987 true /* is_policy_loaded */,
2988 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002989
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002990 // Verify that with rollback enabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002991 // was set to the current minimum kernel key version. This has
2992 // the effect of freezing roll forwards indefinitely. This will
2993 // hold the rollback window open until a future change will
2994 // be able to move this forward relative the configured window.
2995 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2996 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2997}
2998
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002999// Verifies that a device with rollback disabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003000// in the TPM to logical infinity, to allow roll forward.
3001TEST_F(OmahaRequestActionTest, RollbackDisabledDevicesSetMaxRollback) {
3002 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
3003
3004 // Setup and verify some initial default values for the kernel TPM
3005 // values that control verified boot and rollback.
3006 const int allowed_milestones = 0;
3007 const int min_kernel_version = 3;
3008 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
3009 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
3010 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
3011 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
3012
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02003013 EXPECT_CALL(
3014 *fake_system_state_.mock_metrics_reporter(),
3015 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
3016 .Times(1);
3017
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003018 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003019 TestRollbackCheck(false /* is_consumer_device */,
3020 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003021 true /* is_policy_loaded */,
3022 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003023
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07003024 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003025 // was set to logical infinity.
3026 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
3027 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
3028}
3029
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003030TEST_F(OmahaRequestActionTest, RollbackResponseParsedNoEntries) {
3031 OmahaResponse response;
3032 fake_update_response_.rollback = true;
3033 TestRollbackCheck(false /* is_consumer_device */,
3034 4 /* rollback_allowed_milestones */,
3035 true /* is_policy_loaded */,
3036 &response);
3037 EXPECT_TRUE(response.is_rollback);
3038}
3039
3040TEST_F(OmahaRequestActionTest, RollbackResponseValidVersionsParsed) {
3041 OmahaResponse response;
3042 fake_update_response_.rollback_firmware_version = "1.2";
3043 fake_update_response_.rollback_kernel_version = "3.4";
3044 fake_update_response_.rollback = true;
3045 TestRollbackCheck(false /* is_consumer_device */,
3046 4 /* rollback_allowed_milestones */,
3047 true /* is_policy_loaded */,
3048 &response);
3049 EXPECT_TRUE(response.is_rollback);
3050 EXPECT_EQ(1, response.rollback_key_version.firmware_key);
3051 EXPECT_EQ(2, response.rollback_key_version.firmware);
3052 EXPECT_EQ(3, response.rollback_key_version.kernel_key);
3053 EXPECT_EQ(4, response.rollback_key_version.kernel);
3054}
3055
May Lippert60aa3ca2018-08-15 16:55:29 -07003056TEST_F(OmahaRequestActionTest,
3057 TestUpdateFirstSeenAtPrefPersistedIfUpdateExists) {
3058 FakeClock fake_clock;
3059 Time now = Time::Now();
3060 fake_clock.SetWallclockTime(now);
3061 fake_system_state_.set_clock(&fake_clock);
3062
3063 OmahaResponse response;
3064 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3065 -1,
3066 false, // ping_only
3067 ErrorCode::kSuccess,
3068 metrics::CheckResult::kUpdateAvailable,
3069 metrics::CheckReaction::kUpdating,
3070 metrics::DownloadErrorCode::kUnset,
3071 &response,
3072 nullptr));
3073 EXPECT_TRUE(response.update_exists);
3074 EXPECT_TRUE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3075
3076 int64_t stored_first_seen_at_time;
3077 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt,
3078 &stored_first_seen_at_time));
3079 EXPECT_EQ(now.ToInternalValue(), stored_first_seen_at_time);
3080}
3081
3082TEST_F(OmahaRequestActionTest,
3083 TestUpdateFirstSeenAtPrefNotPersistedIfUpdateFails) {
3084 FakeClock fake_clock;
3085 Time now = Time::Now();
3086 fake_clock.SetWallclockTime(now);
3087 fake_system_state_.set_clock(&fake_clock);
3088
3089 OmahaResponse response;
3090 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
3091 -1,
3092 false, // ping_only
3093 ErrorCode::kSuccess,
3094 metrics::CheckResult::kNoUpdateAvailable,
3095 metrics::CheckReaction::kUnset,
3096 metrics::DownloadErrorCode::kUnset,
3097 &response,
3098 nullptr));
3099 EXPECT_FALSE(response.update_exists);
3100 EXPECT_FALSE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3101}
3102
Xiaochu Liu88d90382018-08-29 16:09:11 -07003103TEST_F(OmahaRequestActionTest, InstallTest) {
3104 OmahaResponse response;
Xiaochu Liu6310be62018-10-11 15:09:03 -07003105 request_params_.set_is_install(true);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003106 request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
Xiaochu Liu88d90382018-08-29 16:09:11 -07003107 brillo::Blob post_data;
3108 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3109 -1,
3110 false, // ping_only
3111 true, // is_consumer_device
3112 0, // rollback_allowed_milestones
3113 false, // is_policy_loaded
3114 ErrorCode::kSuccess,
3115 metrics::CheckResult::kUpdateAvailable,
3116 metrics::CheckReaction::kUpdating,
3117 metrics::DownloadErrorCode::kUnset,
3118 &response,
3119 &post_data));
3120 // Convert post_data to string.
3121 string post_str(post_data.begin(), post_data.end());
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003122 for (const auto& dlc_module_id : request_params_.dlc_module_ids()) {
Xiaochu Liu88d90382018-08-29 16:09:11 -07003123 EXPECT_NE(string::npos,
Xiaochu Liu6310be62018-10-11 15:09:03 -07003124 post_str.find("appid=\"" + fake_update_response_.app_id + "_" +
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003125 dlc_module_id + "\""));
Xiaochu Liu88d90382018-08-29 16:09:11 -07003126 }
Xiaochu Liu6310be62018-10-11 15:09:03 -07003127 EXPECT_NE(string::npos,
3128 post_str.find("appid=\"" + fake_update_response_.app_id + "\""));
3129
3130 // Count number of updatecheck tag in response.
3131 int updatecheck_count = 0;
3132 size_t pos = 0;
3133 while ((pos = post_str.find("<updatecheck", pos)) != string::npos) {
3134 updatecheck_count++;
3135 pos++;
3136 }
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003137 EXPECT_EQ(request_params_.dlc_module_ids().size(), updatecheck_count);
Xiaochu Liu6310be62018-10-11 15:09:03 -07003138}
3139
3140TEST_F(OmahaRequestActionTest, InstallMissingPlatformVersionTest) {
3141 fake_update_response_.multi_app_skip_updatecheck = true;
3142 fake_update_response_.multi_app_no_update = false;
3143 request_params_.set_is_install(true);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003144 request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
Xiaochu Liu6310be62018-10-11 15:09:03 -07003145 request_params_.set_app_id(fake_update_response_.app_id_skip_updatecheck);
3146 OmahaResponse response;
3147 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3148 -1,
3149 false, // ping_only
3150 ErrorCode::kSuccess,
3151 metrics::CheckResult::kUpdateAvailable,
3152 metrics::CheckReaction::kUpdating,
3153 metrics::DownloadErrorCode::kUnset,
3154 &response,
3155 nullptr));
3156 EXPECT_TRUE(response.update_exists);
3157 EXPECT_EQ(fake_update_response_.current_version, response.version);
Xiaochu Liu88d90382018-08-29 16:09:11 -07003158}
3159
Darin Petkov6a5b3222010-07-13 14:55:28 -07003160} // namespace chromeos_update_engine