blob: 9a5cd10d3d9b958ceb375686faf83602b0d021f2 [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/message_loops/fake_message_loop.h>
35#include <brillo/message_loops/message_loop.h>
36#include <brillo/message_loops/message_loop_utils.h>
Alex Deymoe1e3afe2014-10-30 13:02:49 -070037#include <gtest/gtest.h>
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080038#include <policy/libpolicy.h>
39#include <policy/mock_libpolicy.h>
Jay Srinivasand29695d2013-04-08 15:08:05 -070040
Alex Deymo39910dc2015-11-09 17:04:30 -080041#include "update_engine/common/action_pipe.h"
42#include "update_engine/common/constants.h"
43#include "update_engine/common/fake_prefs.h"
44#include "update_engine/common/hash_calculator.h"
45#include "update_engine/common/mock_http_fetcher.h"
46#include "update_engine/common/platform_constants.h"
47#include "update_engine/common/prefs.h"
48#include "update_engine/common/test_utils.h"
Alex Deymoc1c17b42015-11-23 03:53:15 -030049#include "update_engine/fake_system_state.h"
Tianjie Xu282aa1f2017-09-05 13:42:45 -070050#include "update_engine/metrics_reporter_interface.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070051#include "update_engine/mock_connection_manager.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070052#include "update_engine/mock_payload_state.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070053#include "update_engine/omaha_request_params.h"
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080054#include "update_engine/update_manager/rollback_prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070055
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056using base::Time;
57using base::TimeDelta;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080058using chromeos_update_manager::kRollforwardInfinity;
Darin Petkov6a5b3222010-07-13 14:55:28 -070059using std::string;
60using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070061using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070062using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070063using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070064using testing::Ge;
65using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080066using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070067using testing::Return;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080068using testing::ReturnRef;
Gilad Arnold74b5f552014-10-07 08:17:16 -070069using testing::ReturnPointee;
70using testing::SaveArg;
Ben Chan672c1f52017-10-23 15:41:39 -070071using testing::SetArgPointee;
Alex Deymof329b932014-10-30 01:37:48 -070072using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070073
Alex Deymo8e18f932015-03-27 16:16:59 -070074namespace {
75
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -080076static_assert(kRollforwardInfinity == 0xfffffffe,
77 "Don't change the value of kRollforward infinity unless its "
78 "size has been changed in firmware.");
79
Xiaochu Liu6310be62018-10-11 15:09:03 -070080const char kCurrentVersion[] = "0.1.0.0";
Alex Deymo85616652015-10-15 18:48:31 -070081const char kTestAppId[] = "test-app-id";
Aaron Wood7dcdedf2017-09-06 17:17:41 -070082const char kTestAppId2[] = "test-app2-id";
Xiaochu Liu6310be62018-10-11 15:09:03 -070083const char kTestAppIdSkipUpdatecheck[] = "test-app-id-skip-updatecheck";
Alex Deymo85616652015-10-15 18:48:31 -070084
Alex Deymo8e18f932015-03-27 16:16:59 -070085// This is a helper struct to allow unit tests build an update response with the
86// values they care about.
87struct FakeUpdateResponse {
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -070088 string GetRollbackVersionAttributes() const {
89 return (rollback ? " _rollback=\"true\"" : "") +
90 (!rollback_firmware_version.empty()
91 ? " _firmware_version=\"" + rollback_firmware_version + "\""
92 : "") +
93 (!rollback_kernel_version.empty()
94 ? " _kernel_version=\"" + rollback_kernel_version + "\""
95 : "");
96 }
97
Alex Deymo8e18f932015-03-27 16:16:59 -070098 string GetNoUpdateResponse() const {
99 string entity_str;
100 if (include_entity)
101 entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
Sen Jiang81259682017-03-30 15:11:30 -0700102 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + entity_str +
103 "<response protocol=\"3.0\">"
104 "<daystart elapsed_seconds=\"100\"/>"
105 "<app appid=\"" +
106 app_id + "\" " +
107 (include_cohorts
108 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
109 "\" cohortname=\"" + cohortname + "\" "
110 : "") +
111 " status=\"ok\">"
112 "<ping status=\"ok\"/>"
113 "<updatecheck status=\"noupdate\"/></app>" +
114 (multi_app_no_update
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700115 ? "<app appid=\"" + app_id2 +
116 "\"><updatecheck status=\"noupdate\"/></app>"
Sen Jiang81259682017-03-30 15:11:30 -0700117 : "") +
118 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700119 }
120
121 string GetUpdateResponse() const {
Sen Jiang2703ef42017-03-16 13:36:21 -0700122 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
123 "protocol=\"3.0\">"
124 "<daystart elapsed_seconds=\"100\"" +
125 (elapsed_days.empty() ? ""
126 : (" elapsed_days=\"" + elapsed_days + "\"")) +
127 "/>"
128 "<app appid=\"" +
129 app_id + "\" " +
130 (include_cohorts
131 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
132 "\" cohortname=\"" + cohortname + "\" "
133 : "") +
134 " status=\"ok\">"
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700135 "<ping status=\"ok\"/><updatecheck status=\"ok\"" +
136 GetRollbackVersionAttributes() + ">" + "<urls><url codebase=\"" +
Sen Jiang2703ef42017-03-16 13:36:21 -0700137 codebase +
138 "\"/></urls>"
139 "<manifest version=\"" +
140 version +
141 "\">"
142 "<packages><package hash=\"not-used\" name=\"" +
143 filename + "\" size=\"" + base::Int64ToString(size) +
Sen Jiang0affc2c2017-02-10 15:55:05 -0800144 "\" hash_sha256=\"" + hash + "\"/>" +
145 (multi_package ? "<package name=\"package2\" size=\"222\" "
146 "hash_sha256=\"hash2\"/>"
147 : "") +
148 "</packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700149 "<actions><action event=\"postinstall\" MetadataSize=\"11" +
Amin Hassanic482bbd2018-09-21 16:07:20 -0700150 (multi_package ? ":22" : "") + "\" MoreInfo=\"" + more_info_url +
151 "\" Prompt=\"" + prompt +
Sen Jiang2703ef42017-03-16 13:36:21 -0700152 "\" "
Sen Jiangcdd52062017-05-18 15:33:10 -0700153 "IsDeltaPayload=\"true" +
154 (multi_package ? ":false" : "") +
155 "\" "
Sen Jiang2703ef42017-03-16 13:36:21 -0700156 "MaxDaysToScatter=\"" +
157 max_days_to_scatter +
158 "\" "
Amin Hassanic482bbd2018-09-21 16:07:20 -0700159 "sha256=\"not-used\" " +
Sen Jiang2703ef42017-03-16 13:36:21 -0700160 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
161 (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
162 : "") +
163 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Sen Jiangfe284402018-03-21 14:03:50 -0700164 (powerwash ? "Powerwash=\"true\" " : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700165 "/></actions></manifest></updatecheck></app>" +
166 (multi_app
Sen Jiangb1e063a2017-09-15 17:44:31 -0700167 ? "<app appid=\"" + app_id2 + "\"" +
168 (include_cohorts ? " cohort=\"cohort2\"" : "") +
169 "><updatecheck status=\"ok\"><urls><url codebase=\"" +
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700170 codebase2 + "\"/></urls><manifest version=\"" + version2 +
171 "\"><packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700172 "<package name=\"package3\" size=\"333\" "
173 "hash_sha256=\"hash3\"/></packages>"
Sen Jiang00adf7b2017-06-26 15:57:29 -0700174 "<actions><action event=\"postinstall\" " +
175 (multi_app_self_update
176 ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
177 : "IsDeltaPayload=\"false\" ") +
178 "MetadataSize=\"33\"/></actions>"
Sen Jiang81259682017-03-30 15:11:30 -0700179 "</manifest></updatecheck></app>"
180 : "") +
181 (multi_app_no_update
182 ? "<app><updatecheck status=\"noupdate\"/></app>"
183 : "") +
Xiaochu Liu6310be62018-10-11 15:09:03 -0700184 (multi_app_skip_updatecheck
185 ? "<app appid=\"" + app_id_skip_updatecheck + "\"></app>"
186 : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700187 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700188 }
189
190 // Return the payload URL, which is split in two fields in the XML response.
191 string GetPayloadUrl() {
192 return codebase + filename;
193 }
194
Alex Deymo85616652015-10-15 18:48:31 -0700195 string app_id = kTestAppId;
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700196 string app_id2 = kTestAppId2;
Xiaochu Liu6310be62018-10-11 15:09:03 -0700197 string app_id_skip_updatecheck = kTestAppIdSkipUpdatecheck;
198 string current_version = kCurrentVersion;
Alex Deymo8e18f932015-03-27 16:16:59 -0700199 string version = "1.2.3.4";
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700200 string version2 = "2.3.4.5";
Alex Deymo8e18f932015-03-27 16:16:59 -0700201 string more_info_url = "http://more/info";
202 string prompt = "true";
203 string codebase = "http://code/base/";
Sen Jiang81259682017-03-30 15:11:30 -0700204 string codebase2 = "http://code/base/2/";
Alex Deymo8e18f932015-03-27 16:16:59 -0700205 string filename = "file.signed";
Sen Jiang2703ef42017-03-16 13:36:21 -0700206 string hash = "4841534831323334";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800207 uint64_t size = 123;
Alex Deymo8e18f932015-03-27 16:16:59 -0700208 string deadline = "";
209 string max_days_to_scatter = "7";
210 string elapsed_days = "42";
211
212 // P2P setting defaults to allowed.
213 bool disable_p2p_for_downloading = false;
214 bool disable_p2p_for_sharing = false;
215
Sen Jiangfe284402018-03-21 14:03:50 -0700216 bool powerwash = false;
217
Alex Deymo8e18f932015-03-27 16:16:59 -0700218 // Omaha cohorts settings.
219 bool include_cohorts = false;
220 string cohort = "";
221 string cohorthint = "";
222 string cohortname = "";
223
224 // Whether to include the CrOS <!ENTITY> in the XML response.
225 bool include_entity = false;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800226
Sen Jiang81259682017-03-30 15:11:30 -0700227 // Whether to include more than one app.
228 bool multi_app = false;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700229 // Whether to include an app with noupdate="true".
230 bool multi_app_self_update = false;
231 // Whether to include an additional app with status="noupdate".
Sen Jiang81259682017-03-30 15:11:30 -0700232 bool multi_app_no_update = false;
Xiaochu Liu6310be62018-10-11 15:09:03 -0700233 // Whether to include an additional app with no updatecheck tag.
234 bool multi_app_skip_updatecheck = false;
Sen Jiang81259682017-03-30 15:11:30 -0700235 // Whether to include more than one package in an app.
Sen Jiang0affc2c2017-02-10 15:55:05 -0800236 bool multi_package = false;
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700237
238 // Whether the payload is a rollback.
239 bool rollback = false;
240 // The verified boot firmware key version for the rollback image.
241 string rollback_firmware_version = "";
242 // The verified boot kernel key version for the rollback image.
243 string rollback_kernel_version = "";
Alex Deymo8e18f932015-03-27 16:16:59 -0700244};
245
246} // namespace
247
Darin Petkov6a5b3222010-07-13 14:55:28 -0700248namespace chromeos_update_engine {
249
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700250class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
251 public:
252 OmahaRequestActionTestProcessorDelegate()
253 : expected_code_(ErrorCode::kSuccess),
254 interactive_(false),
255 test_http_fetcher_headers_(false) {}
256 ~OmahaRequestActionTestProcessorDelegate() override = default;
257
258 void ProcessingDone(const ActionProcessor* processor,
259 ErrorCode code) override {
260 brillo::MessageLoop::current()->BreakLoop();
261 }
262
263 void ActionCompleted(ActionProcessor* processor,
264 AbstractAction* action,
265 ErrorCode code) override {
266 // Make sure actions always succeed.
267 if (action->Type() == OmahaRequestAction::StaticType()) {
268 EXPECT_EQ(expected_code_, code);
269 // Check that the headers were set in the fetcher during the action. Note
270 // that we set this request as "interactive".
271 auto fetcher = static_cast<const MockHttpFetcher*>(
272 static_cast<OmahaRequestAction*>(action)->http_fetcher_.get());
273
274 if (test_http_fetcher_headers_) {
275 EXPECT_EQ(interactive_ ? "fg" : "bg",
276 fetcher->GetHeader("X-Goog-Update-Interactivity"));
277 EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-Goog-Update-AppId"));
278 EXPECT_NE("", fetcher->GetHeader("X-Goog-Update-Updater"));
279 }
280 post_data_ = fetcher->post_data();
281 } else if (action->Type() ==
282 ObjectCollectorAction<OmahaResponse>::StaticType()) {
283 EXPECT_EQ(ErrorCode::kSuccess, code);
284 auto collector_action =
285 static_cast<ObjectCollectorAction<OmahaResponse>*>(action);
286 omaha_response_.reset(new OmahaResponse(collector_action->object()));
287 EXPECT_TRUE(omaha_response_);
288 } else {
289 EXPECT_EQ(ErrorCode::kSuccess, code);
290 }
291 }
292 ErrorCode expected_code_;
293 brillo::Blob post_data_;
294 bool interactive_;
295 bool test_http_fetcher_headers_;
296 std::unique_ptr<OmahaResponse> omaha_response_;
297};
298
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700299class OmahaRequestActionTest : public ::testing::Test {
300 protected:
Alex Deymo610277e2014-11-11 21:18:11 -0800301 void SetUp() override {
Marton Hunyady2abda312018-04-24 18:21:49 +0200302 request_params_.set_os_sp("service_pack");
303 request_params_.set_os_board("x86-generic");
304 request_params_.set_app_id(kTestAppId);
Xiaochu Liu6310be62018-10-11 15:09:03 -0700305 request_params_.set_app_version(kCurrentVersion);
Marton Hunyady2abda312018-04-24 18:21:49 +0200306 request_params_.set_app_lang("en-US");
307 request_params_.set_current_channel("unittest");
308 request_params_.set_target_channel("unittest");
309 request_params_.set_hwid("OEM MODEL 09235 7471");
310 request_params_.set_fw_version("ChromeOSFirmware.1.0");
311 request_params_.set_ec_version("0X0A1");
312 request_params_.set_delta_okay(true);
313 request_params_.set_interactive(false);
314 request_params_.set_update_url("http://url");
315 request_params_.set_target_version_prefix("");
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200316 request_params_.set_rollback_allowed(false);
Marton Hunyady2abda312018-04-24 18:21:49 +0200317 request_params_.set_is_powerwash_allowed(false);
Xiaochu Liu6310be62018-10-11 15:09:03 -0700318 request_params_.set_is_install(false);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -0800319 request_params_.set_dlc_module_ids({});
Marton Hunyady2abda312018-04-24 18:21:49 +0200320
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700321 fake_system_state_.set_request_params(&request_params_);
322 fake_system_state_.set_prefs(&fake_prefs_);
323 }
324
325 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -0800326 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700327 // is used. |payload_state| may be null, in which case a local mock is used.
328 // |p2p_manager| may be null, in which case a local mock is used.
329 // |connection_manager| may be null, in which case a local mock is used.
330 // out_response may be null. If |fail_http_response_code| is non-negative,
331 // the transfer will fail with that code. |ping_only| is passed through to the
332 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
333 // post-data received by the mock HttpFetcher is returned.
334 //
335 // The |expected_check_result|, |expected_check_reaction| and
336 // |expected_error_code| parameters are for checking expectations
337 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
338 // UMA statistics. Use the appropriate ::kUnset value to specify that
339 // the given metric should not be reported.
Marton Hunyady2abda312018-04-24 18:21:49 +0200340 bool TestUpdateCheck(const string& http_response,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700341 int fail_http_response_code,
342 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800343 bool is_consumer_device,
344 int rollback_allowed_milestones,
345 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700346 ErrorCode expected_code,
347 metrics::CheckResult expected_check_result,
348 metrics::CheckReaction expected_check_reaction,
349 metrics::DownloadErrorCode expected_download_error_code,
350 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700351 brillo::Blob* out_post_data);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700352
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800353 // Overload of TestUpdateCheck that does not supply |is_consumer_device| or
354 // |rollback_allowed_milestones| which are only required for rollback tests.
355 bool TestUpdateCheck(const string& http_response,
356 int fail_http_response_code,
357 bool ping_only,
358 ErrorCode expected_code,
359 metrics::CheckResult expected_check_result,
360 metrics::CheckReaction expected_check_reaction,
361 metrics::DownloadErrorCode expected_download_error_code,
362 OmahaResponse* out_response,
363 brillo::Blob* out_post_data);
364
365 void TestRollbackCheck(bool is_consumer_device,
366 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700367 bool is_policy_loaded,
368 OmahaResponse* out_response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800369
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700370 void TestEvent(OmahaEvent* event,
371 const string& http_response,
372 brillo::Blob* out_post_data);
373
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800374 // Runs and checks a ping test. |ping_only| indicates whether it should send
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700375 // only a ping or also an updatecheck.
376 void PingTest(bool ping_only);
377
378 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -0700379 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700380 OmahaResponse *response);
381
382 // P2P test helper function.
383 void P2PTest(
384 bool initial_allow_p2p_for_downloading,
385 bool initial_allow_p2p_for_sharing,
386 bool omaha_disable_p2p_for_downloading,
387 bool omaha_disable_p2p_for_sharing,
388 bool payload_state_allow_p2p_attempt,
389 bool expect_p2p_client_lookup,
390 const string& p2p_client_result_url,
391 bool expected_allow_p2p_for_downloading,
392 bool expected_allow_p2p_for_sharing,
393 const string& expected_p2p_url);
394
395 FakeSystemState fake_system_state_;
Alex Deymo8e18f932015-03-27 16:16:59 -0700396 FakeUpdateResponse fake_update_response_;
Marton Hunyady2abda312018-04-24 18:21:49 +0200397 // Used by all tests.
398 OmahaRequestParams request_params_{&fake_system_state_};
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700399
400 FakePrefs fake_prefs_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700401
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700402 OmahaRequestActionTestProcessorDelegate delegate_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700403
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700404 bool test_http_fetcher_headers_{false};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700405};
406
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700407bool OmahaRequestActionTest::TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700408 const string& http_response,
409 int fail_http_response_code,
410 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800411 bool is_consumer_device,
412 int rollback_allowed_milestones,
413 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700414 ErrorCode expected_code,
415 metrics::CheckResult expected_check_result,
416 metrics::CheckReaction expected_check_reaction,
417 metrics::DownloadErrorCode expected_download_error_code,
418 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700419 brillo::Blob* out_post_data) {
420 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700421 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700422 auto fetcher = std::make_unique<MockHttpFetcher>(
423 http_response.data(), http_response.size(), nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700424 if (fail_http_response_code >= 0) {
425 fetcher->FailTransfer(fail_http_response_code);
426 }
Marton Hunyady2abda312018-04-24 18:21:49 +0200427 // This ensures the tests didn't forget to update fake_system_state_ if they
428 // are not using the default request_params_.
429 EXPECT_EQ(&request_params_, fake_system_state_.request_params());
430
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700431 auto omaha_request_action = std::make_unique<OmahaRequestAction>(
432 &fake_system_state_, nullptr, std::move(fetcher), ping_only);
433
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800434 auto mock_policy_provider =
435 std::make_unique<NiceMock<policy::MockPolicyProvider>>();
436 EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
437 .WillRepeatedly(Return(is_consumer_device));
438
439 EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
440 .WillRepeatedly(Return(is_policy_loaded));
441
442 const policy::MockDevicePolicy device_policy;
443 const bool get_allowed_milestone_succeeds = rollback_allowed_milestones >= 0;
444 EXPECT_CALL(device_policy, GetRollbackAllowedMilestones(_))
445 .WillRepeatedly(DoAll(SetArgPointee<0>(rollback_allowed_milestones),
446 Return(get_allowed_milestone_succeeds)));
447
448 EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
449 .WillRepeatedly(ReturnRef(device_policy));
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700450 omaha_request_action->policy_provider_ = std::move(mock_policy_provider);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800451
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700452 delegate_.expected_code_ = expected_code;
453 delegate_.interactive_ = request_params_.interactive();
454 delegate_.test_http_fetcher_headers_ = test_http_fetcher_headers_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700455 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700456 processor.set_delegate(&delegate_);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700457
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700458 auto collector_action =
459 std::make_unique<ObjectCollectorAction<OmahaResponse>>();
460 BondActions(omaha_request_action.get(), collector_action.get());
461 processor.EnqueueAction(std::move(omaha_request_action));
462 processor.EnqueueAction(std::move(collector_action));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700463
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700464 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
465 ReportUpdateCheckMetrics(_, _, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800466 .Times(AnyNumber());
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700467
468 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
469 ReportUpdateCheckMetrics(_,
470 expected_check_result,
471 expected_check_reaction,
472 expected_download_error_code))
473 .Times(ping_only ? 0 : 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800474
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700475 loop.PostTask(base::Bind(
476 [](ActionProcessor* processor) { processor->StartProcessing(); },
477 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700478 loop.Run();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700479 EXPECT_FALSE(loop.PendingTasks());
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700480 if (delegate_.omaha_response_ && out_response)
481 *out_response = *delegate_.omaha_response_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700482 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700483 *out_post_data = delegate_.post_data_;
484 return delegate_.omaha_response_ != nullptr;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700485}
486
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800487bool OmahaRequestActionTest::TestUpdateCheck(
488 const string& http_response,
489 int fail_http_response_code,
490 bool ping_only,
491 ErrorCode expected_code,
492 metrics::CheckResult expected_check_result,
493 metrics::CheckReaction expected_check_reaction,
494 metrics::DownloadErrorCode expected_download_error_code,
495 OmahaResponse* out_response,
496 brillo::Blob* out_post_data) {
497 return TestUpdateCheck(http_response,
498 fail_http_response_code,
499 ping_only,
500 true, // is_consumer_device
501 0, // rollback_allowed_milestones
502 false, // is_policy_loaded
503 expected_code,
504 expected_check_result,
505 expected_check_reaction,
506 expected_download_error_code,
507 out_response,
508 out_post_data);
509}
510
511void OmahaRequestActionTest::TestRollbackCheck(bool is_consumer_device,
512 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700513 bool is_policy_loaded,
514 OmahaResponse* out_response) {
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800515 fake_update_response_.deadline = "20101020";
516 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
517 -1,
518 false, // ping_only
519 is_consumer_device,
520 rollback_allowed_milestones,
521 is_policy_loaded,
522 ErrorCode::kSuccess,
523 metrics::CheckResult::kUpdateAvailable,
524 metrics::CheckReaction::kUpdating,
525 metrics::DownloadErrorCode::kUnset,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700526 out_response,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800527 nullptr));
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700528 ASSERT_TRUE(out_response->update_exists);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800529}
530
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700531// Tests Event requests -- they should always succeed. |out_post_data| may be
532// null; if non-null, the post-data received by the mock HttpFetcher is
533// returned.
534void OmahaRequestActionTest::TestEvent(OmahaEvent* event,
535 const string& http_response,
536 brillo::Blob* out_post_data) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700537 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700538 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700539
540 auto action = std::make_unique<OmahaRequestAction>(
541 &fake_system_state_,
542 event,
543 std::make_unique<MockHttpFetcher>(
544 http_response.data(), http_response.size(), nullptr),
545 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700546 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700547 processor.set_delegate(&delegate_);
548 processor.EnqueueAction(std::move(action));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700549
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700550 loop.PostTask(base::Bind(
551 [](ActionProcessor* processor) { processor->StartProcessing(); },
552 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700553 loop.Run();
Alex Deymo72a25672016-03-23 15:44:39 -0700554 EXPECT_FALSE(loop.PendingTasks());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700555
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700556 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700557 *out_post_data = delegate_.post_data_;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700558}
559
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700560TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400561 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700562 fake_update_response_.include_entity = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200563 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
564 -1,
565 false, // ping_only
566 ErrorCode::kOmahaRequestXMLHasEntityDecl,
567 metrics::CheckResult::kParsingError,
568 metrics::CheckReaction::kUnset,
569 metrics::DownloadErrorCode::kUnset,
570 &response,
571 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400572 EXPECT_FALSE(response.update_exists);
573}
574
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700575TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700576 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +0200577 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
578 -1,
579 false, // ping_only
580 ErrorCode::kSuccess,
581 metrics::CheckResult::kNoUpdateAvailable,
582 metrics::CheckReaction::kUnset,
583 metrics::DownloadErrorCode::kUnset,
584 &response,
585 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700586 EXPECT_FALSE(response.update_exists);
587}
588
Sen Jiang81259682017-03-30 15:11:30 -0700589TEST_F(OmahaRequestActionTest, MultiAppNoUpdateTest) {
590 OmahaResponse response;
591 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200592 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700593 -1,
594 false, // ping_only
595 ErrorCode::kSuccess,
596 metrics::CheckResult::kNoUpdateAvailable,
597 metrics::CheckReaction::kUnset,
598 metrics::DownloadErrorCode::kUnset,
599 &response,
600 nullptr));
601 EXPECT_FALSE(response.update_exists);
602}
603
Sen Jiang00adf7b2017-06-26 15:57:29 -0700604TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
605 OmahaResponse response;
606 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200607 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang00adf7b2017-06-26 15:57:29 -0700608 -1,
609 false, // ping_only
610 ErrorCode::kSuccess,
611 metrics::CheckResult::kNoUpdateAvailable,
612 metrics::CheckReaction::kUnset,
613 metrics::DownloadErrorCode::kUnset,
614 &response,
615 nullptr));
616 EXPECT_FALSE(response.update_exists);
617}
618
619TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
620 OmahaResponse response;
621 ASSERT_TRUE(TestUpdateCheck(
Sen Jiang00adf7b2017-06-26 15:57:29 -0700622 "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
623 "event=\"postinstall\" noupdate=\"true\"/></actions>"
624 "</manifest></updatecheck></app></response>",
625 -1,
626 false, // ping_only
627 ErrorCode::kSuccess,
628 metrics::CheckResult::kNoUpdateAvailable,
629 metrics::CheckReaction::kUnset,
630 metrics::DownloadErrorCode::kUnset,
631 &response,
632 nullptr));
633 EXPECT_FALSE(response.update_exists);
634}
635
Alex Deymo8e18f932015-03-27 16:16:59 -0700636// Test that all the values in the response are parsed in a normal update
637// response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700638TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700639 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700640 fake_update_response_.deadline = "20101020";
Marton Hunyady2abda312018-04-24 18:21:49 +0200641 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
642 -1,
643 false, // ping_only
644 ErrorCode::kSuccess,
645 metrics::CheckResult::kUpdateAvailable,
646 metrics::CheckReaction::kUpdating,
647 metrics::DownloadErrorCode::kUnset,
648 &response,
649 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700650 EXPECT_TRUE(response.update_exists);
Alex Deymo8e18f932015-03-27 16:16:59 -0700651 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700652 EXPECT_EQ("", response.system_version);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800653 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
654 response.packages[0].payload_urls[0]);
Alex Deymo8e18f932015-03-27 16:16:59 -0700655 EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800656 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
657 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700658 EXPECT_EQ(true, response.packages[0].is_delta);
Alex Deymo8e18f932015-03-27 16:16:59 -0700659 EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
660 EXPECT_EQ(fake_update_response_.deadline, response.deadline);
Sen Jiangfe284402018-03-21 14:03:50 -0700661 EXPECT_FALSE(response.powerwash_required);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700662 // Omaha cohort attributes are not set in the response, so they should not be
Alex Deymo8e18f932015-03-27 16:16:59 -0700663 // persisted.
664 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
665 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
666 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700667}
668
Sen Jiang0affc2c2017-02-10 15:55:05 -0800669TEST_F(OmahaRequestActionTest, MultiPackageUpdateTest) {
670 OmahaResponse response;
671 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200672 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800673 -1,
674 false, // ping_only
675 ErrorCode::kSuccess,
676 metrics::CheckResult::kUpdateAvailable,
677 metrics::CheckReaction::kUpdating,
678 metrics::DownloadErrorCode::kUnset,
679 &response,
680 nullptr));
681 EXPECT_TRUE(response.update_exists);
682 EXPECT_EQ(fake_update_response_.version, response.version);
683 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
684 response.packages[0].payload_urls[0]);
685 EXPECT_EQ(fake_update_response_.codebase + "package2",
686 response.packages[1].payload_urls[0]);
687 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
688 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700689 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700690 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800691 ASSERT_EQ(2u, response.packages.size());
Sen Jiang81259682017-03-30 15:11:30 -0700692 EXPECT_EQ(string("hash2"), response.packages[1].hash);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800693 EXPECT_EQ(222u, response.packages[1].size);
Sen Jiang81259682017-03-30 15:11:30 -0700694 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700695 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700696}
697
698TEST_F(OmahaRequestActionTest, MultiAppUpdateTest) {
699 OmahaResponse response;
700 fake_update_response_.multi_app = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200701 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700702 -1,
703 false, // ping_only
704 ErrorCode::kSuccess,
705 metrics::CheckResult::kUpdateAvailable,
706 metrics::CheckReaction::kUpdating,
707 metrics::DownloadErrorCode::kUnset,
708 &response,
709 nullptr));
710 EXPECT_TRUE(response.update_exists);
711 EXPECT_EQ(fake_update_response_.version, response.version);
712 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
713 response.packages[0].payload_urls[0]);
714 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
715 response.packages[1].payload_urls[0]);
716 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
717 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
718 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700719 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700720 ASSERT_EQ(2u, response.packages.size());
721 EXPECT_EQ(string("hash3"), response.packages[1].hash);
722 EXPECT_EQ(333u, response.packages[1].size);
723 EXPECT_EQ(33u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700724 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700725}
726
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700727TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
728 OmahaResponse response;
729 fake_update_response_.multi_app = true;
730 // trigger the lining up of the app and system versions
731 request_params_.set_system_app_id(fake_update_response_.app_id2);
732
Marton Hunyady2abda312018-04-24 18:21:49 +0200733 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700734 -1,
735 false, // ping_only
736 ErrorCode::kSuccess,
737 metrics::CheckResult::kUpdateAvailable,
738 metrics::CheckReaction::kUpdating,
739 metrics::DownloadErrorCode::kUnset,
740 &response,
741 nullptr));
742 EXPECT_TRUE(response.update_exists);
743 EXPECT_EQ(fake_update_response_.version, response.version);
744 EXPECT_EQ(fake_update_response_.version2, response.system_version);
745 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
746 response.packages[0].payload_urls[0]);
747 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
748 response.packages[1].payload_urls[0]);
749 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
750 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
751 EXPECT_EQ(11u, response.packages[0].metadata_size);
752 EXPECT_EQ(true, response.packages[0].is_delta);
753 ASSERT_EQ(2u, response.packages.size());
754 EXPECT_EQ(string("hash3"), response.packages[1].hash);
755 EXPECT_EQ(333u, response.packages[1].size);
756 EXPECT_EQ(33u, response.packages[1].metadata_size);
757 EXPECT_EQ(false, response.packages[1].is_delta);
758}
759
Sen Jiang81259682017-03-30 15:11:30 -0700760TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
761 OmahaResponse response;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700762 fake_update_response_.multi_app = true;
763 fake_update_response_.multi_app_self_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200764 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700765 -1,
766 false, // ping_only
767 ErrorCode::kSuccess,
768 metrics::CheckResult::kUpdateAvailable,
769 metrics::CheckReaction::kUpdating,
770 metrics::DownloadErrorCode::kUnset,
771 &response,
772 nullptr));
773 EXPECT_TRUE(response.update_exists);
774 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700775 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700776 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
777 response.packages[0].payload_urls[0]);
778 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
779 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
780 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang00adf7b2017-06-26 15:57:29 -0700781 ASSERT_EQ(2u, response.packages.size());
782 EXPECT_EQ(string("hash3"), response.packages[1].hash);
783 EXPECT_EQ(333u, response.packages[1].size);
784 EXPECT_EQ(33u, response.packages[1].metadata_size);
785 EXPECT_EQ(true, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700786}
787
788TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {
789 OmahaResponse response;
790 fake_update_response_.multi_app = true;
791 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200792 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700793 -1,
794 false, // ping_only
795 ErrorCode::kSuccess,
796 metrics::CheckResult::kUpdateAvailable,
797 metrics::CheckReaction::kUpdating,
798 metrics::DownloadErrorCode::kUnset,
799 &response,
800 nullptr));
801 EXPECT_TRUE(response.update_exists);
802 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700803 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700804 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
805 response.packages[0].payload_urls[0]);
806 EXPECT_EQ(fake_update_response_.codebase + "package2",
807 response.packages[1].payload_urls[0]);
808 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
809 response.packages[2].payload_urls[0]);
810 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
811 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
812 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700813 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700814 ASSERT_EQ(3u, response.packages.size());
815 EXPECT_EQ(string("hash2"), response.packages[1].hash);
816 EXPECT_EQ(222u, response.packages[1].size);
817 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700818 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700819 EXPECT_EQ(string("hash3"), response.packages[2].hash);
820 EXPECT_EQ(333u, response.packages[2].size);
821 EXPECT_EQ(33u, response.packages[2].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700822 EXPECT_EQ(false, response.packages[2].is_delta);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800823}
824
Sen Jiangfe284402018-03-21 14:03:50 -0700825TEST_F(OmahaRequestActionTest, PowerwashTest) {
826 OmahaResponse response;
827 fake_update_response_.powerwash = true;
Amin Hassani3538a882018-05-31 14:11:30 -0700828 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangfe284402018-03-21 14:03:50 -0700829 -1,
830 false, // ping_only
831 ErrorCode::kSuccess,
832 metrics::CheckResult::kUpdateAvailable,
833 metrics::CheckReaction::kUpdating,
834 metrics::DownloadErrorCode::kUnset,
835 &response,
836 nullptr));
837 EXPECT_TRUE(response.update_exists);
838 EXPECT_TRUE(response.powerwash_required);
839}
840
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700841TEST_F(OmahaRequestActionTest, ExtraHeadersSentInteractiveTest) {
842 OmahaResponse response;
Alex Deymo14ad88e2016-06-29 12:30:14 -0700843 request_params_.set_interactive(true);
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700844 test_http_fetcher_headers_ = true;
845 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
846 -1,
847 false, // ping_only
848 ErrorCode::kOmahaRequestXMLParseError,
849 metrics::CheckResult::kParsingError,
850 metrics::CheckReaction::kUnset,
851 metrics::DownloadErrorCode::kUnset,
852 &response,
853 nullptr));
854 EXPECT_FALSE(response.update_exists);
855}
Alex Deymo14ad88e2016-06-29 12:30:14 -0700856
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700857TEST_F(OmahaRequestActionTest, ExtraHeadersSentNoInteractiveTest) {
858 OmahaResponse response;
859 request_params_.set_interactive(false);
860 test_http_fetcher_headers_ = true;
861 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
862 -1,
863 false, // ping_only
864 ErrorCode::kOmahaRequestXMLParseError,
865 metrics::CheckResult::kParsingError,
866 metrics::CheckReaction::kUnset,
867 metrics::DownloadErrorCode::kUnset,
868 &response,
869 nullptr));
870 EXPECT_FALSE(response.update_exists);
Alex Deymo14ad88e2016-06-29 12:30:14 -0700871}
872
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700873TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700874 OmahaResponse response;
875 // Set up a connection manager that doesn't allow a valid update over
876 // the current ethernet connection.
Alex Deymof6ee0162015-07-31 12:35:22 -0700877 MockConnectionManager mock_cm;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700878 fake_system_state_.set_connection_manager(&mock_cm);
879
Alex Deymo30534502015-07-20 15:06:33 -0700880 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
881 .WillRepeatedly(
Ben Chan672c1f52017-10-23 15:41:39 -0700882 DoAll(SetArgPointee<0>(ConnectionType::kEthernet),
883 SetArgPointee<1>(ConnectionTethering::kUnknown),
Alex Deymo30534502015-07-20 15:06:33 -0700884 Return(true)));
Sen Jiang255e22b2016-05-20 16:15:29 -0700885 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
886 .WillRepeatedly(Return(false));
Chris Sosa77f79e82014-06-02 18:16:24 -0700887
Marton Hunyady2abda312018-04-24 18:21:49 +0200888 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
889 -1,
890 false, // ping_only
891 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
892 metrics::CheckResult::kUpdateAvailable,
893 metrics::CheckReaction::kIgnored,
894 metrics::DownloadErrorCode::kUnset,
895 &response,
896 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700897 EXPECT_FALSE(response.update_exists);
898}
899
Weidong Guo421ff332017-04-17 10:08:38 -0700900TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularAllowedByDevicePolicy) {
901 // This test tests that update over cellular is allowed as device policy
902 // says yes.
903 OmahaResponse response;
904 MockConnectionManager mock_cm;
905
906 fake_system_state_.set_connection_manager(&mock_cm);
907
908 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
909 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
910 SetArgPointee<1>(ConnectionTethering::kUnknown),
911 Return(true)));
912 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
913 .WillRepeatedly(Return(true));
914 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
915 .WillRepeatedly(Return(true));
916
Marton Hunyady2abda312018-04-24 18:21:49 +0200917 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700918 -1,
919 false, // ping_only
920 ErrorCode::kSuccess,
921 metrics::CheckResult::kUpdateAvailable,
922 metrics::CheckReaction::kUpdating,
923 metrics::DownloadErrorCode::kUnset,
924 &response,
925 nullptr));
926 EXPECT_TRUE(response.update_exists);
927}
928
929TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularBlockedByDevicePolicy) {
930 // This test tests that update over cellular is blocked as device policy
931 // says no.
932 OmahaResponse response;
933 MockConnectionManager mock_cm;
934
935 fake_system_state_.set_connection_manager(&mock_cm);
936
937 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
938 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
939 SetArgPointee<1>(ConnectionTethering::kUnknown),
940 Return(true)));
941 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
942 .WillRepeatedly(Return(true));
943 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
944 .WillRepeatedly(Return(false));
945
Marton Hunyady2abda312018-04-24 18:21:49 +0200946 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700947 -1,
948 false, // ping_only
949 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
950 metrics::CheckResult::kUpdateAvailable,
951 metrics::CheckReaction::kIgnored,
952 metrics::DownloadErrorCode::kUnset,
953 &response,
954 nullptr));
955 EXPECT_FALSE(response.update_exists);
956}
957
958TEST_F(OmahaRequestActionTest,
959 ValidUpdateOverCellularAllowedByUserPermissionTrue) {
960 // This test tests that, when device policy is not set, update over cellular
961 // is allowed as permission for update over cellular is set to true.
962 OmahaResponse response;
963 MockConnectionManager mock_cm;
964
965 fake_prefs_.SetBoolean(kPrefsUpdateOverCellularPermission, true);
966 fake_system_state_.set_connection_manager(&mock_cm);
967
968 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
969 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
970 SetArgPointee<1>(ConnectionTethering::kUnknown),
971 Return(true)));
972 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
973 .WillRepeatedly(Return(false));
974 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
975 .WillRepeatedly(Return(true));
976
Marton Hunyady2abda312018-04-24 18:21:49 +0200977 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700978 -1,
979 false, // ping_only
980 ErrorCode::kSuccess,
981 metrics::CheckResult::kUpdateAvailable,
982 metrics::CheckReaction::kUpdating,
983 metrics::DownloadErrorCode::kUnset,
984 &response,
985 nullptr));
986 EXPECT_TRUE(response.update_exists);
987}
988
989TEST_F(OmahaRequestActionTest,
990 ValidUpdateOverCellularBlockedByUpdateTargetNotMatch) {
991 // This test tests that, when device policy is not set and permission for
992 // update over cellular is set to false or does not exist, update over
993 // cellular is blocked as update target does not match the omaha response.
994 OmahaResponse response;
995 MockConnectionManager mock_cm;
996 // A version different from the version in omaha response.
997 string diff_version = "99.99.99";
998 // A size different from the size in omaha response.
999 int64_t diff_size = 999;
1000
1001 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, diff_version);
1002 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, diff_size);
1003 // This test tests cellular (3G) being the only connection type being allowed.
1004 fake_system_state_.set_connection_manager(&mock_cm);
1005
1006 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1007 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1008 SetArgPointee<1>(ConnectionTethering::kUnknown),
1009 Return(true)));
1010 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1011 .WillRepeatedly(Return(false));
1012 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1013 .WillRepeatedly(Return(true));
1014
Marton Hunyady2abda312018-04-24 18:21:49 +02001015 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001016 -1,
1017 false, // ping_only
1018 ErrorCode::kOmahaUpdateIgnoredOverCellular,
1019 metrics::CheckResult::kUpdateAvailable,
1020 metrics::CheckReaction::kIgnored,
1021 metrics::DownloadErrorCode::kUnset,
1022 &response,
1023 nullptr));
1024 EXPECT_FALSE(response.update_exists);
1025}
1026
1027TEST_F(OmahaRequestActionTest,
1028 ValidUpdateOverCellularAllowedByUpdateTargetMatch) {
1029 // This test tests that, when device policy is not set and permission for
1030 // update over cellular is set to false or does not exist, update over
1031 // cellular is allowed as update target matches the omaha response.
1032 OmahaResponse response;
1033 MockConnectionManager mock_cm;
1034 // A version same as the version in omaha response.
1035 string new_version = fake_update_response_.version;
1036 // A size same as the size in omaha response.
1037 int64_t new_size = fake_update_response_.size;
1038
1039 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, new_version);
1040 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, new_size);
1041 fake_system_state_.set_connection_manager(&mock_cm);
1042
1043 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1044 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1045 SetArgPointee<1>(ConnectionTethering::kUnknown),
1046 Return(true)));
1047 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1048 .WillRepeatedly(Return(false));
1049 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1050 .WillRepeatedly(Return(true));
1051
Marton Hunyady2abda312018-04-24 18:21:49 +02001052 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001053 -1,
1054 false, // ping_only
1055 ErrorCode::kSuccess,
1056 metrics::CheckResult::kUpdateAvailable,
1057 metrics::CheckReaction::kUpdating,
1058 metrics::DownloadErrorCode::kUnset,
1059 &response,
1060 nullptr));
1061 EXPECT_TRUE(response.update_exists);
1062}
1063
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001064TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -07001065 string rollback_version = "1234.0.0";
1066 OmahaResponse response;
1067
1068 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001069 fake_system_state_.set_payload_state(&mock_payload_state);
1070
Chris Sosa77f79e82014-06-02 18:16:24 -07001071 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
1072 .WillRepeatedly(Return(rollback_version));
1073
Alex Deymo8e18f932015-03-27 16:16:59 -07001074 fake_update_response_.version = rollback_version;
Marton Hunyady2abda312018-04-24 18:21:49 +02001075 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1076 -1,
1077 false, // ping_only
1078 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
1079 metrics::CheckResult::kUpdateAvailable,
1080 metrics::CheckReaction::kIgnored,
1081 metrics::DownloadErrorCode::kUnset,
1082 &response,
1083 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -07001084 EXPECT_FALSE(response.update_exists);
1085}
1086
Marton Hunyadyc2882062018-05-14 17:28:25 +02001087// Verify that update checks called during OOBE will not try to download an
1088// update if the response doesn't include the deadline field.
Kevin Cernekee2494e282016-03-29 18:03:53 -07001089TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
1090 OmahaResponse response;
Marton Hunyadyc2882062018-05-14 17:28:25 +02001091 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Kevin Cernekee2494e282016-03-29 18:03:53 -07001092
Sen Jiang8cd42342018-01-31 12:06:59 -08001093 // TODO(senj): set better default value for metrics::checkresult in
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001094 // OmahaRequestAction::ActionCompleted.
Marton Hunyady2abda312018-04-24 18:21:49 +02001095 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001096 -1,
1097 false, // ping_only
1098 ErrorCode::kNonCriticalUpdateInOOBE,
1099 metrics::CheckResult::kParsingError,
1100 metrics::CheckReaction::kUnset,
1101 metrics::DownloadErrorCode::kUnset,
1102 &response,
1103 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001104 EXPECT_FALSE(response.update_exists);
Marton Hunyadyc2882062018-05-14 17:28:25 +02001105}
Kevin Cernekee2494e282016-03-29 18:03:53 -07001106
Marton Hunyadyc2882062018-05-14 17:28:25 +02001107// Verify that the IsOOBEComplete() value is ignored when the OOBE flow is not
1108// enabled.
1109TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDisabled) {
1110 OmahaResponse response;
1111 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymo46a9aae2016-05-04 20:20:11 -07001112 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
Alex Deymo46a9aae2016-05-04 20:20:11 -07001113
Marton Hunyady2abda312018-04-24 18:21:49 +02001114 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1115 -1,
1116 false, // ping_only
1117 ErrorCode::kSuccess,
1118 metrics::CheckResult::kUpdateAvailable,
1119 metrics::CheckReaction::kUpdating,
1120 metrics::DownloadErrorCode::kUnset,
1121 &response,
1122 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001123 EXPECT_TRUE(response.update_exists);
1124}
1125
Marton Hunyadyc2882062018-05-14 17:28:25 +02001126// Verify that update checks called during OOBE will still try to download an
1127// update if the response includes the deadline field.
1128TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDeadlineSet) {
1129 OmahaResponse response;
1130 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1131 fake_update_response_.deadline = "20101020";
1132
1133 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1134 -1,
1135 false, // ping_only
1136 ErrorCode::kSuccess,
1137 metrics::CheckResult::kUpdateAvailable,
1138 metrics::CheckReaction::kUpdating,
1139 metrics::DownloadErrorCode::kUnset,
1140 &response,
1141 nullptr));
1142 EXPECT_TRUE(response.update_exists);
1143}
1144
1145// Verify that update checks called during OOBE will not try to download an
1146// update if a rollback happened, even when the response includes the deadline
1147// field.
1148TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBERollback) {
1149 OmahaResponse response;
1150 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1151 fake_update_response_.deadline = "20101020";
1152 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetRollbackHappened())
1153 .WillOnce(Return(true));
1154
1155 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1156 -1,
1157 false, // ping_only
1158 ErrorCode::kNonCriticalUpdateInOOBE,
1159 metrics::CheckResult::kParsingError,
1160 metrics::CheckReaction::kUnset,
1161 metrics::DownloadErrorCode::kUnset,
1162 &response,
1163 nullptr));
1164 EXPECT_FALSE(response.update_exists);
1165}
1166
Toni Barzic61544e62018-10-11 14:37:30 -07001167// Verify that non-critical updates are skipped by reporting the
1168// kNonCriticalUpdateInOOBE error code when attempted over cellular network -
1169// i.e. when the update would need user permission. Note that reporting
1170// kOmahaUpdateIgnoredOverCellular error in this case might cause undesired UX
1171// in OOBE (warning the user about an update that will be skipped).
1172TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesInOOBEOverCellular) {
1173 OmahaResponse response;
1174 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1175
1176 MockConnectionManager mock_cm;
1177 fake_system_state_.set_connection_manager(&mock_cm);
1178
1179 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1180 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1181 SetArgPointee<1>(ConnectionTethering::kUnknown),
1182 Return(true)));
1183 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1184 .WillRepeatedly(Return(false));
1185
1186 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1187 -1,
1188 false, // ping_only
1189 ErrorCode::kNonCriticalUpdateInOOBE,
1190 metrics::CheckResult::kParsingError,
1191 metrics::CheckReaction::kUnset,
1192 metrics::DownloadErrorCode::kUnset,
1193 &response,
1194 nullptr));
1195 EXPECT_FALSE(response.update_exists);
1196}
1197
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001198TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001199 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001200 request_params_.set_wall_clock_based_wait_enabled(true);
1201 request_params_.set_update_check_count_wait_enabled(false);
1202 request_params_.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001203
May Lippert60aa3ca2018-08-15 16:55:29 -07001204 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1205
Marton Hunyady2abda312018-04-24 18:21:49 +02001206 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1207 -1,
1208 false, // ping_only
1209 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1210 metrics::CheckResult::kUpdateAvailable,
1211 metrics::CheckReaction::kDeferring,
1212 metrics::DownloadErrorCode::kUnset,
1213 &response,
1214 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001215 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001216
1217 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001218 request_params_.set_interactive(true);
1219 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1220 -1,
1221 false, // ping_only
1222 ErrorCode::kSuccess,
1223 metrics::CheckResult::kUpdateAvailable,
1224 metrics::CheckReaction::kUpdating,
1225 metrics::DownloadErrorCode::kUnset,
1226 &response,
1227 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001228 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001229}
1230
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001231TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001232 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001233 request_params_.set_wall_clock_based_wait_enabled(false);
1234 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1235 request_params_.set_update_check_count_wait_enabled(true);
1236 request_params_.set_min_update_checks_needed(1);
1237 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001238
Marton Hunyady2abda312018-04-24 18:21:49 +02001239 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1240 -1,
1241 false, // ping_only
1242 ErrorCode::kSuccess,
1243 metrics::CheckResult::kUpdateAvailable,
1244 metrics::CheckReaction::kUpdating,
1245 metrics::DownloadErrorCode::kUnset,
1246 &response,
1247 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001248 EXPECT_TRUE(response.update_exists);
1249}
1250
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001251TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001252 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001253 request_params_.set_wall_clock_based_wait_enabled(true);
1254 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1255 request_params_.set_update_check_count_wait_enabled(true);
1256 request_params_.set_min_update_checks_needed(1);
1257 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001258
Alex Deymo8e18f932015-03-27 16:16:59 -07001259 fake_update_response_.max_days_to_scatter = "0";
Marton Hunyady2abda312018-04-24 18:21:49 +02001260 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1261 -1,
1262 false, // ping_only
1263 ErrorCode::kSuccess,
1264 metrics::CheckResult::kUpdateAvailable,
1265 metrics::CheckReaction::kUpdating,
1266 metrics::DownloadErrorCode::kUnset,
1267 &response,
1268 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001269 EXPECT_TRUE(response.update_exists);
1270}
1271
1272
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001273TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001274 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001275 request_params_.set_wall_clock_based_wait_enabled(true);
1276 request_params_.set_waiting_period(TimeDelta());
1277 request_params_.set_update_check_count_wait_enabled(true);
1278 request_params_.set_min_update_checks_needed(0);
1279 request_params_.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001280
May Lippert60aa3ca2018-08-15 16:55:29 -07001281 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1282
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001283 ASSERT_TRUE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001284 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001285 -1,
1286 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001287 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001288 metrics::CheckResult::kUpdateAvailable,
1289 metrics::CheckReaction::kUpdating,
1290 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001291 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001292 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001293
Ben Chan9abb7632014-08-07 00:10:53 -07001294 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001295 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001296 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001297 EXPECT_TRUE(response.update_exists);
1298}
1299
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001300TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001301 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001302 request_params_.set_wall_clock_based_wait_enabled(true);
1303 request_params_.set_waiting_period(TimeDelta());
1304 request_params_.set_update_check_count_wait_enabled(true);
1305 request_params_.set_min_update_checks_needed(1);
1306 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001307
May Lippert60aa3ca2018-08-15 16:55:29 -07001308 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1309
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001310 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001311 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001312 -1,
1313 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001314 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001315 metrics::CheckResult::kUpdateAvailable,
1316 metrics::CheckReaction::kDeferring,
1317 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001318 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001319 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001320
Ben Chan9abb7632014-08-07 00:10:53 -07001321 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001322 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001323 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001324 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001325
1326 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001327 request_params_.set_interactive(true);
1328 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1329 -1,
1330 false, // ping_only
1331 ErrorCode::kSuccess,
1332 metrics::CheckResult::kUpdateAvailable,
1333 metrics::CheckReaction::kUpdating,
1334 metrics::DownloadErrorCode::kUnset,
1335 &response,
1336 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001337 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001338}
1339
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001340TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001341 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001342 request_params_.set_wall_clock_based_wait_enabled(true);
1343 request_params_.set_waiting_period(TimeDelta());
1344 request_params_.set_update_check_count_wait_enabled(true);
1345 request_params_.set_min_update_checks_needed(1);
1346 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001347
May Lippert60aa3ca2018-08-15 16:55:29 -07001348 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1349
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001350 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001351
1352 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001353 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001354 -1,
1355 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001356 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001357 metrics::CheckResult::kUpdateAvailable,
1358 metrics::CheckReaction::kDeferring,
1359 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001360 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001361 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001362
Ben Chan9abb7632014-08-07 00:10:53 -07001363 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001364 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001365 // count remains the same, as the decrementing happens in update_attempter
1366 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001367 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001368 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001369
1370 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001371 request_params_.set_interactive(true);
1372 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1373 -1,
1374 false, // ping_only
1375 ErrorCode::kSuccess,
1376 metrics::CheckResult::kUpdateAvailable,
1377 metrics::CheckReaction::kUpdating,
1378 metrics::DownloadErrorCode::kUnset,
1379 &response,
1380 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001381 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001382}
Jay Srinivasan0a708742012-03-20 11:26:12 -07001383
Adolfo Victoria497044c2018-07-18 07:51:42 -07001384TEST_F(OmahaRequestActionTest, StagingTurnedOnCausesScattering) {
1385 // If staging is on, the value for max days to scatter should be ignored, and
1386 // staging's scatter value should be used.
1387 OmahaResponse response;
1388 request_params_.set_wall_clock_based_wait_enabled(true);
1389 request_params_.set_waiting_period(TimeDelta::FromDays(6));
1390 request_params_.set_update_check_count_wait_enabled(false);
1391
May Lippert60aa3ca2018-08-15 16:55:29 -07001392 fake_system_state_.fake_clock()->SetWallclockTime(Time::Now());
1393
Adolfo Victoria497044c2018-07-18 07:51:42 -07001394 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsWallClockStagingWaitPeriod, 6));
1395 // This should not prevent scattering due to staging.
1396 fake_update_response_.max_days_to_scatter = "0";
1397 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1398 -1,
1399 false, // ping_only
1400 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1401 metrics::CheckResult::kUpdateAvailable,
1402 metrics::CheckReaction::kDeferring,
1403 metrics::DownloadErrorCode::kUnset,
1404 &response,
1405 nullptr));
1406 EXPECT_FALSE(response.update_exists);
1407
1408 // Interactive updates should not be affected.
1409 request_params_.set_interactive(true);
1410 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1411 -1,
1412 false, // ping_only
1413 ErrorCode::kSuccess,
1414 metrics::CheckResult::kUpdateAvailable,
1415 metrics::CheckReaction::kUpdating,
1416 metrics::DownloadErrorCode::kUnset,
1417 &response,
1418 nullptr));
1419 EXPECT_TRUE(response.update_exists);
1420}
1421
Alex Deymo8e18f932015-03-27 16:16:59 -07001422TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
1423 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001424 fake_update_response_.include_cohorts = true;
1425 fake_update_response_.cohort = "s/154454/8479665";
1426 fake_update_response_.cohorthint = "please-put-me-on-beta";
1427 fake_update_response_.cohortname = "stable";
1428
Marton Hunyady2abda312018-04-24 18:21:49 +02001429 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001430 -1,
1431 false, // ping_only
1432 ErrorCode::kSuccess,
1433 metrics::CheckResult::kUpdateAvailable,
1434 metrics::CheckReaction::kUpdating,
1435 metrics::DownloadErrorCode::kUnset,
1436 &response,
1437 nullptr));
1438
1439 string value;
1440 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1441 EXPECT_EQ(fake_update_response_.cohort, value);
1442
1443 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1444 EXPECT_EQ(fake_update_response_.cohorthint, value);
1445
1446 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1447 EXPECT_EQ(fake_update_response_.cohortname, value);
1448}
1449
1450TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
1451 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001452 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1453 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
1454 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
1455 fake_update_response_.include_cohorts = true;
1456 fake_update_response_.cohort = "s/154454/8479665";
1457 fake_update_response_.cohorthint = "please-put-me-on-beta";
1458 fake_update_response_.cohortname = "";
1459
Marton Hunyady2abda312018-04-24 18:21:49 +02001460 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001461 -1,
1462 false, // ping_only
1463 ErrorCode::kSuccess,
1464 metrics::CheckResult::kUpdateAvailable,
1465 metrics::CheckReaction::kUpdating,
1466 metrics::DownloadErrorCode::kUnset,
1467 &response,
1468 nullptr));
1469
1470 string value;
1471 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1472 EXPECT_EQ(fake_update_response_.cohort, value);
1473
1474 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1475 EXPECT_EQ(fake_update_response_.cohorthint, value);
1476
1477 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1478}
1479
1480TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
1481 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001482 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1483
Marton Hunyady2abda312018-04-24 18:21:49 +02001484 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001485 -1,
1486 false, // ping_only
1487 ErrorCode::kSuccess,
1488 metrics::CheckResult::kUpdateAvailable,
1489 metrics::CheckReaction::kUpdating,
1490 metrics::DownloadErrorCode::kUnset,
1491 &response,
1492 nullptr));
1493
1494 string value;
1495 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1496 EXPECT_EQ("old_value", value);
1497
1498 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1499 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1500}
1501
Alex Deymo00d79ac2015-06-29 15:41:49 -07001502TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
1503 OmahaResponse response;
Alex Deymo00d79ac2015-06-29 15:41:49 -07001504 fake_update_response_.include_cohorts = true;
1505 fake_update_response_.cohort = "s/154454/8479665";
1506 fake_update_response_.cohorthint = "please-put-me-on-beta";
1507 fake_update_response_.cohortname = "stable";
1508
Marton Hunyady2abda312018-04-24 18:21:49 +02001509 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Alex Deymo00d79ac2015-06-29 15:41:49 -07001510 -1,
1511 false, // ping_only
1512 ErrorCode::kSuccess,
1513 metrics::CheckResult::kNoUpdateAvailable,
1514 metrics::CheckReaction::kUnset,
1515 metrics::DownloadErrorCode::kUnset,
1516 &response,
1517 nullptr));
1518
1519 string value;
1520 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1521 EXPECT_EQ(fake_update_response_.cohort, value);
1522
1523 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1524 EXPECT_EQ(fake_update_response_.cohorthint, value);
1525
1526 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1527 EXPECT_EQ(fake_update_response_.cohortname, value);
1528}
1529
Sen Jiangb1e063a2017-09-15 17:44:31 -07001530TEST_F(OmahaRequestActionTest, MultiAppCohortTest) {
1531 OmahaResponse response;
Sen Jiangb1e063a2017-09-15 17:44:31 -07001532 fake_update_response_.multi_app = true;
1533 fake_update_response_.include_cohorts = true;
1534 fake_update_response_.cohort = "s/154454/8479665";
1535 fake_update_response_.cohorthint = "please-put-me-on-beta";
1536 fake_update_response_.cohortname = "stable";
1537
Marton Hunyady2abda312018-04-24 18:21:49 +02001538 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangb1e063a2017-09-15 17:44:31 -07001539 -1,
1540 false, // ping_only
1541 ErrorCode::kSuccess,
1542 metrics::CheckResult::kUpdateAvailable,
1543 metrics::CheckReaction::kUpdating,
1544 metrics::DownloadErrorCode::kUnset,
1545 &response,
1546 nullptr));
1547
1548 string value;
1549 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1550 EXPECT_EQ(fake_update_response_.cohort, value);
1551
1552 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1553 EXPECT_EQ(fake_update_response_.cohorthint, value);
1554
1555 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1556 EXPECT_EQ(fake_update_response_.cohortname, value);
1557}
1558
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001559TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Alex Deymo8e18f932015-03-27 16:16:59 -07001560 const string http_response(fake_update_response_.GetNoUpdateResponse());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001561
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001562 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001563 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001564
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001565 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001566 &fake_system_state_,
1567 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001568 std::make_unique<MockHttpFetcher>(
1569 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001570 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001571 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001572 processor.set_delegate(&delegate_);
1573 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001574
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -07001575 loop.PostTask(base::Bind(
1576 [](ActionProcessor* processor) { processor->StartProcessing(); },
1577 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -07001578 loop.Run();
1579 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001580 EXPECT_FALSE(processor.IsRunning());
1581}
1582
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001583TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001584 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001585 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1586 -1,
1587 false, // ping_only
1588 ErrorCode::kOmahaRequestXMLParseError,
1589 metrics::CheckResult::kParsingError,
1590 metrics::CheckReaction::kUnset,
1591 metrics::DownloadErrorCode::kUnset,
1592 &response,
1593 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001594 EXPECT_FALSE(response.update_exists);
1595}
1596
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001597TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001598 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001599 ASSERT_FALSE(TestUpdateCheck("",
1600 -1,
1601 false, // ping_only
1602 ErrorCode::kOmahaRequestEmptyResponseError,
1603 metrics::CheckResult::kParsingError,
1604 metrics::CheckReaction::kUnset,
1605 metrics::DownloadErrorCode::kUnset,
1606 &response,
1607 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001608 EXPECT_FALSE(response.update_exists);
1609}
1610
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001611TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001612 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001613 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001614 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1615 "<daystart elapsed_seconds=\"100\"/>"
1616 "<app appid=\"foo\" status=\"ok\">"
1617 "<ping status=\"ok\"/>"
1618 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001619 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001620 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001621 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001622 metrics::CheckResult::kParsingError,
1623 metrics::CheckReaction::kUnset,
1624 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001625 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001626 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001627 EXPECT_FALSE(response.update_exists);
1628}
1629
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001630TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001631 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001632 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001633 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1634 "<daystart elapsed_seconds=\"100\"/>"
1635 "<app appid=\"foo\" status=\"ok\">"
1636 "<ping status=\"ok\"/>"
1637 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001638 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001639 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001640 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001641 metrics::CheckResult::kParsingError,
1642 metrics::CheckReaction::kUnset,
1643 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001644 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001645 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001646 EXPECT_FALSE(response.update_exists);
1647}
1648
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001649TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001650 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001651 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001652 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1653 "<daystart elapsed_seconds=\"100\"/>"
1654 "<app appid=\"foo\" status=\"ok\">"
1655 "<ping status=\"ok\"/>"
1656 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001657 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001658 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001659 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001660 metrics::CheckResult::kParsingError,
1661 metrics::CheckReaction::kUnset,
1662 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001663 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001664 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001665 EXPECT_FALSE(response.update_exists);
1666}
1667
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001668TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001669 string input_response =
1670 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1671 "<daystart elapsed_seconds=\"100\"/>"
Aaron Wood7dcdedf2017-09-06 17:17:41 -07001672 // the appid needs to match that in the request params
1673 "<app appid=\"" +
1674 fake_update_response_.app_id +
1675 "\" status=\"ok\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001676 "<updatecheck status=\"ok\">"
1677 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001678 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001679 "<packages><package hash=\"not-used\" name=\"f\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001680 "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001681 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001682 "Prompt=\"false\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001683 "IsDeltaPayload=\"false\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001684 "sha256=\"not-used\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001685 "/></actions></manifest></updatecheck></app></response>";
1686 LOG(INFO) << "Input Response = " << input_response;
1687
Darin Petkov6a5b3222010-07-13 14:55:28 -07001688 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001689 ASSERT_TRUE(TestUpdateCheck(input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001690 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001691 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001692 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001693 metrics::CheckResult::kUpdateAvailable,
1694 metrics::CheckReaction::kUpdating,
1695 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001696 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001697 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001698 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001699 EXPECT_EQ("10.2.3.4", response.version);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001700 EXPECT_EQ("http://missing/field/test/f",
1701 response.packages[0].payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001702 EXPECT_EQ("", response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001703 EXPECT_EQ("lkq34j5345", response.packages[0].hash);
1704 EXPECT_EQ(587u, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001705 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001706 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001707}
1708
1709namespace {
1710class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1711 public:
1712 void ProcessingStopped(const ActionProcessor* processor) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001713 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001714 }
Darin Petkov6a5b3222010-07-13 14:55:28 -07001715};
1716
Alex Deymo60ca1a72015-06-18 18:19:15 -07001717void TerminateTransferTestStarter(ActionProcessor* processor) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001718 processor->StartProcessing();
1719 CHECK(processor->IsRunning());
1720 processor->StopProcessing();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001721}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001722} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001723
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001724TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001725 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001726 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001727
Alex Deymo60ca1a72015-06-18 18:19:15 -07001728 string http_response("doesn't matter");
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001729 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001730 &fake_system_state_,
1731 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001732 std::make_unique<MockHttpFetcher>(
1733 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001734 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001735 TerminateEarlyTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001736 ActionProcessor processor;
1737 processor.set_delegate(&delegate);
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001738 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001739
Alex Deymo60ca1a72015-06-18 18:19:15 -07001740 loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
1741 loop.Run();
1742 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001743}
1744
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001745TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Alex Deymob0d74eb2015-03-30 17:59:17 -07001746 string output;
1747 EXPECT_TRUE(XmlEncode("ab", &output));
1748 EXPECT_EQ("ab", output);
1749 EXPECT_TRUE(XmlEncode("a<b", &output));
1750 EXPECT_EQ("a&lt;b", output);
Alex Deymocc457852015-06-18 18:35:50 -07001751 EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1752 EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
Alex Deymob0d74eb2015-03-30 17:59:17 -07001753 EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1754 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
Alex Deymocc457852015-06-18 18:35:50 -07001755 // Check that unterminated UTF-8 strings are handled properly.
Alex Deymob0d74eb2015-03-30 17:59:17 -07001756 EXPECT_FALSE(XmlEncode("\xc2", &output));
1757 // Fail with invalid ASCII-7 chars.
1758 EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1759}
Darin Petkov6a5b3222010-07-13 14:55:28 -07001760
Alex Deymob0d74eb2015-03-30 17:59:17 -07001761TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1762 EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1763 EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1764}
1765
1766TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001767 brillo::Blob post_data;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001768
1769 // Make sure XML Encode is being called on the params
Marton Hunyady2abda312018-04-24 18:21:49 +02001770 request_params_.set_os_sp("testtheservice_pack>");
1771 request_params_.set_os_board("x86 generic<id");
1772 request_params_.set_current_channel("unittest_track&lt;");
1773 request_params_.set_target_channel("unittest_track&lt;");
1774 request_params_.set_hwid("<OEM MODEL>");
Alex Deymo8e18f932015-03-27 16:16:59 -07001775 fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
1776 fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
1777 fake_prefs_.SetString(kPrefsOmahaCohortName,
Alex Vakulenko0103c362016-01-20 07:56:15 -08001778 base::JoinString(
1779 vector<string>(100, "My spoon is too big."), " "));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001780 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001781 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1782 -1,
1783 false, // ping_only
1784 ErrorCode::kOmahaRequestXMLParseError,
1785 metrics::CheckResult::kParsingError,
1786 metrics::CheckReaction::kUnset,
1787 metrics::DownloadErrorCode::kUnset,
1788 &response,
1789 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001790 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001791 string post_str(post_data.begin(), post_data.end());
Alex Deymo8e18f932015-03-27 16:16:59 -07001792 EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
1793 EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
1794 EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
1795 EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
1796 EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
1797 EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
1798 EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
1799 EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
1800 EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
1801 EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
1802 EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
1803 // Values from Prefs that are too big are removed from the XML instead of
1804 // encoded.
1805 EXPECT_EQ(string::npos, post_str.find("cohortname="));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001806}
1807
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001808TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001809 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001810 fake_update_response_.deadline = "&lt;20110101";
1811 fake_update_response_.more_info_url = "testthe&lt;url";
1812 fake_update_response_.codebase = "testthe&amp;codebase/";
Marton Hunyady2abda312018-04-24 18:21:49 +02001813 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1814 -1,
1815 false, // ping_only
1816 ErrorCode::kSuccess,
1817 metrics::CheckResult::kUpdateAvailable,
1818 metrics::CheckReaction::kUpdating,
1819 metrics::DownloadErrorCode::kUnset,
1820 &response,
1821 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001822
Sen Jiang0affc2c2017-02-10 15:55:05 -08001823 EXPECT_EQ("testthe<url", response.more_info_url);
1824 EXPECT_EQ("testthe&codebase/file.signed",
1825 response.packages[0].payload_urls[0]);
1826 EXPECT_EQ("<20110101", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001827}
1828
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001829TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001830 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001831 // overflows int32_t:
Sen Jiang0affc2c2017-02-10 15:55:05 -08001832 fake_update_response_.size = 123123123123123ull;
Marton Hunyady2abda312018-04-24 18:21:49 +02001833 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1834 -1,
1835 false, // ping_only
1836 ErrorCode::kSuccess,
1837 metrics::CheckResult::kUpdateAvailable,
1838 metrics::CheckReaction::kUpdating,
1839 metrics::DownloadErrorCode::kUnset,
1840 &response,
1841 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001842
Sen Jiang0affc2c2017-02-10 15:55:05 -08001843 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001844}
1845
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001846TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001847 brillo::Blob post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001848 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001849 fake_system_state_.set_prefs(&prefs);
1850
Darin Petkov95508da2011-01-05 12:42:29 -08001851 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Ben Chan672c1f52017-10-23 15:41:39 -07001852 .WillOnce(DoAll(SetArgPointee<1>(string("")), Return(true)));
Alex Deymoefb9d832015-11-02 18:39:02 -08001853 // An existing but empty previous version means that we didn't reboot to a new
1854 // update, therefore, no need to update the previous version.
1855 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
Marton Hunyady2abda312018-04-24 18:21:49 +02001856 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001857 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001858 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001859 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001860 metrics::CheckResult::kParsingError,
1861 metrics::CheckReaction::kUnset,
1862 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001863 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001864 &post_data));
1865 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001866 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001867 EXPECT_NE(
1868 post_str.find(" <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1869 " <updatecheck></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001870 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001871 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1872 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001873 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1874 string::npos);
1875 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1876 string::npos);
Alex Deymoefb9d832015-11-02 18:39:02 -08001877 // No <event> tag should be sent if we didn't reboot to an update.
1878 EXPECT_EQ(post_str.find("<event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001879}
1880
Jay Srinivasan0a708742012-03-20 11:26:12 -07001881
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001882TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001883 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001884 TestEvent(new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
Darin Petkove17f86b2010-07-20 09:12:01 -07001885 "invalid xml>",
1886 &post_data);
1887 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001888 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001889 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001890 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001891 OmahaEvent::kTypeUpdateDownloadStarted,
1892 OmahaEvent::kResultSuccess);
1893 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001894 EXPECT_EQ(post_str.find("ping"), string::npos);
1895 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001896}
1897
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001898TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001899 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001900 TestEvent(new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
Darin Petkove17f86b2010-07-20 09:12:01 -07001901 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001902 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001903 "invalid xml>",
1904 &post_data);
1905 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001906 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001907 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001908 " <event eventtype=\"%d\" eventresult=\"%d\" "
1909 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001910 OmahaEvent::kTypeDownloadComplete,
1911 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001912 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001913 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001914 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001915}
1916
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001917TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001918 string http_response("doesn't matter");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001919 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001920 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001921 nullptr,
Ben Chanab5a0af2017-10-12 14:57:50 -07001922 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001923 http_response.size(),
1924 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001925 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001926 EXPECT_FALSE(update_check_action.IsEvent());
1927
1928 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001929 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001930 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Ben Chanab5a0af2017-10-12 14:57:50 -07001931 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001932 http_response.size(),
1933 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001934 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001935 EXPECT_TRUE(event_action.IsEvent());
1936}
1937
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001938TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001939 for (int i = 0; i < 2; i++) {
1940 bool delta_okay = i == 1;
1941 const char* delta_okay_str = delta_okay ? "true" : "false";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001942 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001943
1944 request_params_.set_delta_okay(delta_okay);
1945
1946 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001947 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001948 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001949 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001950 metrics::CheckResult::kParsingError,
1951 metrics::CheckReaction::kUnset,
1952 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001953 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001954 &post_data));
1955 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001956 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001957 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1958 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001959 string::npos)
1960 << "i = " << i;
1961 }
1962}
1963
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001964TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001965 for (int i = 0; i < 2; i++) {
1966 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001967 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001968 brillo::Blob post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001969 FakeSystemState fake_system_state;
Marton Hunyady2abda312018-04-24 18:21:49 +02001970
1971 request_params_.set_interactive(interactive);
1972
1973 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001974 -1,
1975 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001976 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001977 metrics::CheckResult::kParsingError,
1978 metrics::CheckReaction::kUnset,
1979 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001980 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001981 &post_data));
1982 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001983 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001984 EXPECT_NE(post_str.find(
1985 base::StringPrintf("installsource=\"%s\"", interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001986 string::npos)
1987 << "i = " << i;
1988 }
1989}
1990
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001991TEST_F(OmahaRequestActionTest, FormatTargetVersionPrefixOutputTest) {
1992 for (int i = 0; i < 2; i++) {
1993 bool target_version_set = i == 1;
1994 const char* target_version_prefix = target_version_set ? "10032." : "";
1995 brillo::Blob post_data;
1996 FakeSystemState fake_system_state;
1997
1998 request_params_.set_target_version_prefix(target_version_prefix);
1999
2000 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
2001 -1,
2002 false, // ping_only
2003 ErrorCode::kOmahaRequestXMLParseError,
2004 metrics::CheckResult::kParsingError,
2005 metrics::CheckReaction::kUnset,
2006 metrics::DownloadErrorCode::kUnset,
2007 nullptr,
2008 &post_data));
2009 // convert post_data to string
2010 string post_str(post_data.begin(), post_data.end());
2011 if (target_version_set) {
2012 EXPECT_NE(post_str.find("<updatecheck targetversionprefix=\"10032.\">"),
2013 string::npos)
2014 << "i = " << i;
2015 } else {
2016 EXPECT_EQ(post_str.find("targetversionprefix"), string::npos)
2017 << "i = " << i;
2018 }
2019 }
2020}
2021
2022TEST_F(OmahaRequestActionTest, FormatRollbackAllowedOutputTest) {
2023 for (int i = 0; i < 4; i++) {
2024 bool rollback_allowed = i / 2 == 0;
2025 bool target_version_set = i % 2 == 0;
2026 brillo::Blob post_data;
2027 FakeSystemState fake_system_state;
2028
2029 request_params_.set_target_version_prefix(target_version_set ? "10032."
2030 : "");
2031 request_params_.set_rollback_allowed(rollback_allowed);
2032
2033 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
2034 -1,
2035 false, // ping_only
2036 ErrorCode::kOmahaRequestXMLParseError,
2037 metrics::CheckResult::kParsingError,
2038 metrics::CheckReaction::kUnset,
2039 metrics::DownloadErrorCode::kUnset,
2040 nullptr,
2041 &post_data));
2042 // convert post_data to string
2043 string post_str(post_data.begin(), post_data.end());
2044 if (rollback_allowed && target_version_set) {
2045 EXPECT_NE(post_str.find("rollback_allowed=\"true\""), string::npos)
2046 << "i = " << i;
2047 } else {
2048 EXPECT_EQ(post_str.find("rollback_allowed"), string::npos) << "i = " << i;
2049 }
2050 }
2051}
2052
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002053TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07002054 OmahaEvent default_event;
2055 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
2056 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002057 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002058
2059 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
2060 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
2061 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002062 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002063
2064 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
2065 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002066 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07002067 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
2068 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002069 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002070}
2071
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002072void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002073 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002074 fake_system_state_.set_prefs(&prefs);
2075 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2076 .Times(AnyNumber());
2077 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
2078 // Add a few hours to the day difference to test no rounding, etc.
2079 int64_t five_days_ago =
2080 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
2081 int64_t six_days_ago =
2082 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
2083 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002084 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002085 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002086 .WillOnce(DoAll(SetArgPointee<1>(six_days_ago), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002087 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002088 .WillOnce(DoAll(SetArgPointee<1>(five_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002089 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002090 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07002091 -1,
2092 ping_only,
2093 ErrorCode::kSuccess,
2094 metrics::CheckResult::kNoUpdateAvailable,
2095 metrics::CheckReaction::kUnset,
2096 metrics::DownloadErrorCode::kUnset,
2097 nullptr,
2098 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002099 string post_str(post_data.begin(), post_data.end());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002100 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
2101 string::npos);
2102 if (ping_only) {
2103 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
2104 EXPECT_EQ(post_str.find("previousversion"), string::npos);
2105 } else {
2106 EXPECT_NE(post_str.find("updatecheck"), string::npos);
2107 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07002108 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002109}
2110
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002111TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
2112 PingTest(true /* ping_only */);
2113}
2114
2115TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
2116 PingTest(false /* ping_only */);
2117}
2118
2119TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002120 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002121 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002122 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2123 .Times(AnyNumber());
2124 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002125 int64_t three_days_ago =
2126 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
2127 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002128 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002129 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002130 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002131 .WillOnce(DoAll(SetArgPointee<1>(three_days_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002132 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002133 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002134 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002135 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2136 -1,
2137 false, // ping_only
2138 ErrorCode::kSuccess,
2139 metrics::CheckResult::kNoUpdateAvailable,
2140 metrics::CheckReaction::kUnset,
2141 metrics::DownloadErrorCode::kUnset,
2142 nullptr,
2143 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002144 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002145 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07002146 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002147}
2148
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002149TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002150 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002151 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002152 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2153 .Times(AnyNumber());
2154 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002155 int64_t four_days_ago =
2156 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
2157 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002158 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002159 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002160 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002161 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002162 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002163 .WillOnce(DoAll(SetArgPointee<1>(four_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002164 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002165 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2166 -1,
2167 false, // ping_only
2168 ErrorCode::kSuccess,
2169 metrics::CheckResult::kNoUpdateAvailable,
2170 metrics::CheckReaction::kUnset,
2171 metrics::DownloadErrorCode::kUnset,
2172 nullptr,
2173 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002174 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002175 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07002176 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002177}
2178
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002179TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002180 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002181 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002182 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2183 .Times(AnyNumber());
2184 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002185 int64_t one_hour_ago =
2186 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002187 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002188 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002189 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002190 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002191 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002192 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002193 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
2194 // send a ping.
2195 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2196 .WillOnce(Return(true));
2197 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2198 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002199 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002200 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2201 -1,
2202 false, // ping_only
2203 ErrorCode::kSuccess,
2204 metrics::CheckResult::kNoUpdateAvailable,
2205 metrics::CheckReaction::kUnset,
2206 metrics::DownloadErrorCode::kUnset,
2207 nullptr,
2208 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002209 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002210 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002211}
2212
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002213TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07002214 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08002215 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002216 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07002217 int64_t now = Time::Now().ToInternalValue();
2218 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002219 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002220 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002221 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002222 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2223 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002224 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002225 EXPECT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2226 -1,
2227 true, // ping_only
2228 ErrorCode::kSuccess,
2229 metrics::CheckResult::kUnset,
2230 metrics::CheckReaction::kUnset,
2231 metrics::DownloadErrorCode::kUnset,
2232 nullptr,
2233 &post_data));
Alex Deymo80f70ff2016-02-10 16:08:11 -08002234 EXPECT_EQ(0U, post_data.size());
Thieu Leb44e9e82011-06-06 14:34:04 -07002235}
2236
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002237TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002238 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002239 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002240 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2241 .Times(AnyNumber());
2242 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002243 int64_t future =
2244 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002245 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002246 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002247 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002248 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002249 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002250 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002251 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2252 .WillOnce(Return(true));
2253 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2254 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002255 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002256 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002257 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002258 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002259 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002260 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002261 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002262 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002263 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002264 metrics::CheckResult::kNoUpdateAvailable,
2265 metrics::CheckReaction::kUnset,
2266 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002267 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002268 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002269 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002270 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002271}
2272
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002273TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002274 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07002275 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002276 // may fail if it runs for longer than 5 seconds. It shouldn't run
2277 // that long though.
2278 int64_t midnight =
2279 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
2280 int64_t midnight_slack =
2281 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08002282 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002283 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002284 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2285 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002286 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
2287 AllOf(Ge(midnight), Le(midnight_slack))))
2288 .WillOnce(Return(true));
2289 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
2290 AllOf(Ge(midnight), Le(midnight_slack))))
2291 .WillOnce(Return(true));
2292 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002293 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002294 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002295 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002296 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002297 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002298 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002299 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002300 metrics::CheckResult::kNoUpdateAvailable,
2301 metrics::CheckReaction::kUnset,
2302 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002303 nullptr,
2304 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002305}
2306
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002307TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002308 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002309 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002310 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2311 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002312 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2313 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2314 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002315 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002316 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002317 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002318 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002319 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002320 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002321 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002322 metrics::CheckResult::kNoUpdateAvailable,
2323 metrics::CheckReaction::kUnset,
2324 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002325 nullptr,
2326 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002327}
2328
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002329TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002330 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002331 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002332 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2333 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002334 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2335 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2336 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002337 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002338 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002339 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002340 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002341 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002342 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002343 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002344 metrics::CheckResult::kNoUpdateAvailable,
2345 metrics::CheckReaction::kUnset,
2346 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002347 nullptr,
2348 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002349}
2350
Alex Deymob3fa53b2016-04-18 19:57:58 -07002351TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
2352 // Test that the "eol" flags is only parsed from the "_eol" attribute and not
2353 // the "eol" attribute.
2354 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002355 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Alex Deymob3fa53b2016-04-18 19:57:58 -07002356 "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
2357 "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
2358 "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
2359 "</app></response>",
2360 -1,
2361 false, // ping_only
2362 ErrorCode::kSuccess,
2363 metrics::CheckResult::kNoUpdateAvailable,
2364 metrics::CheckReaction::kUnset,
2365 metrics::DownloadErrorCode::kUnset,
2366 nullptr,
2367 nullptr));
2368 string eol_pref;
2369 EXPECT_TRUE(
2370 fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
2371 // Note that the eol="eol" attribute should be ignored and the _eol should be
2372 // used instead.
2373 EXPECT_EQ("security-only", eol_pref);
2374}
2375
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002376TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002377 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002378 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002379 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002380 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002381 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002382 metrics::CheckResult::kParsingError,
2383 metrics::CheckReaction::kUnset,
2384 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002385 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07002386 &post_data));
2387 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002388 string post_str(post_data.begin(), post_data.end());
Darin Petkov84c763c2010-07-29 16:27:58 -07002389 EXPECT_EQ(post_str.find("machineid="), string::npos);
2390 EXPECT_EQ(post_str.find("userid="), string::npos);
2391}
2392
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002393TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002394 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002395 const int http_error_code =
2396 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Marton Hunyady2abda312018-04-24 18:21:49 +02002397 ASSERT_FALSE(TestUpdateCheck("",
2398 501,
2399 false, // ping_only
2400 static_cast<ErrorCode>(http_error_code),
2401 metrics::CheckResult::kDownloadError,
2402 metrics::CheckReaction::kUnset,
2403 static_cast<metrics::DownloadErrorCode>(501),
2404 &response,
2405 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002406 EXPECT_FALSE(response.update_exists);
2407}
2408
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002409TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002410 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002411 const int http_error_code =
2412 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Marton Hunyady2abda312018-04-24 18:21:49 +02002413 ASSERT_FALSE(TestUpdateCheck("",
2414 1500,
2415 false, // ping_only
2416 static_cast<ErrorCode>(http_error_code),
2417 metrics::CheckResult::kDownloadError,
2418 metrics::CheckReaction::kUnset,
2419 metrics::DownloadErrorCode::kHttpStatusOther,
2420 &response,
2421 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002422 EXPECT_FALSE(response.update_exists);
2423}
2424
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002425TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002426 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002427 request_params_.set_wall_clock_based_wait_enabled(true);
2428 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2429 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002430
Sen Jiang7c1171e2016-06-23 11:35:40 -07002431 Time arbitrary_date;
Eric Caruso761be2c2018-05-22 16:23:33 -07002432 ASSERT_TRUE(Time::FromString("6/4/1989", &arbitrary_date));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002433 fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
Marton Hunyady2abda312018-04-24 18:21:49 +02002434 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002435 -1,
2436 false, // ping_only
2437 ErrorCode::kOmahaUpdateDeferredPerPolicy,
2438 metrics::CheckResult::kUpdateAvailable,
2439 metrics::CheckReaction::kDeferring,
2440 metrics::DownloadErrorCode::kUnset,
2441 &response,
2442 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002443
Ben Chan9abb7632014-08-07 00:10:53 -07002444 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002445 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002446 EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002447 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07002448
2449 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02002450 request_params_.set_interactive(true);
2451 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002452 -1,
2453 false, // ping_only
2454 ErrorCode::kSuccess,
2455 metrics::CheckResult::kUpdateAvailable,
2456 metrics::CheckReaction::kUpdating,
2457 metrics::DownloadErrorCode::kUnset,
2458 &response,
2459 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07002460 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002461}
2462
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002463TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002464 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002465 request_params_.set_wall_clock_based_wait_enabled(true);
2466 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2467 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002468
Sen Jiang7c1171e2016-06-23 11:35:40 -07002469 Time t1, t2;
Eric Caruso761be2c2018-05-22 16:23:33 -07002470 ASSERT_TRUE(Time::FromString("1/1/2012", &t1));
2471 ASSERT_TRUE(Time::FromString("1/3/2012", &t2));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002472 ASSERT_TRUE(
2473 fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2474 fake_system_state_.fake_clock()->SetWallclockTime(t2);
Marton Hunyady2abda312018-04-24 18:21:49 +02002475 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002476 -1,
2477 false, // ping_only
2478 ErrorCode::kSuccess,
2479 metrics::CheckResult::kUpdateAvailable,
2480 metrics::CheckReaction::kUpdating,
2481 metrics::DownloadErrorCode::kUnset,
2482 &response,
2483 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002484
2485 EXPECT_TRUE(response.update_exists);
2486
2487 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002488 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002489 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002490 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2491}
2492
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002493TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002494 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002495 base::ScopedTempDir tempdir;
2496 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002497
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002498 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002499 request_params_.set_root(tempdir.GetPath().value());
2500 request_params_.set_app_id("{22222222-2222-2222-2222-222222222222}");
2501 request_params_.set_app_version("1.2.3.4");
2502 request_params_.set_product_components("o.bundle=1");
2503 request_params_.set_current_channel("canary-channel");
2504 EXPECT_TRUE(
2505 request_params_.SetTargetChannel("stable-channel", true, nullptr));
2506 request_params_.UpdateDownloadChannel();
2507 EXPECT_TRUE(request_params_.ShouldPowerwash());
2508 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002509 -1,
2510 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002511 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002512 metrics::CheckResult::kParsingError,
2513 metrics::CheckReaction::kUnset,
2514 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002515 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002516 &post_data));
2517 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002518 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002519 EXPECT_NE(string::npos, post_str.find(
2520 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2521 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2522 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Sen Jiang8cd42342018-01-31 12:06:59 -08002523 EXPECT_EQ(string::npos, post_str.find("o.bundle"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002524}
2525
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002526TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002527 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002528 base::ScopedTempDir tempdir;
2529 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002530
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002531 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002532 request_params_.set_root(tempdir.GetPath().value());
2533 request_params_.set_app_id("{11111111-1111-1111-1111-111111111111}");
2534 request_params_.set_app_version("5.6.7.8");
2535 request_params_.set_product_components("o.bundle=1");
2536 request_params_.set_current_channel("stable-channel");
2537 EXPECT_TRUE(
2538 request_params_.SetTargetChannel("canary-channel", false, nullptr));
2539 request_params_.UpdateDownloadChannel();
2540 EXPECT_FALSE(request_params_.ShouldPowerwash());
2541 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002542 -1,
2543 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002544 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002545 metrics::CheckResult::kParsingError,
2546 metrics::CheckReaction::kUnset,
2547 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002548 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002549 &post_data));
Xiaochu Liu88d90382018-08-29 16:09:11 -07002550 // Convert post_data to string.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002551 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002552 EXPECT_NE(string::npos, post_str.find(
2553 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2554 "version=\"5.6.7.8\" "
2555 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002556 EXPECT_EQ(string::npos, post_str.find("from_version"));
Sen Jiang8cd42342018-01-31 12:06:59 -08002557 EXPECT_NE(string::npos, post_str.find("o.bundle.version=\"1\""));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002558}
2559
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002560// Checks that the initial ping with a=-1 r=-1 is not send when the device
2561// was powerwashed.
2562TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
2563 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2564
2565 // Flag that the device was powerwashed in the past.
2566 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
2567
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002568 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002569 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2570 -1,
2571 false, // ping_only
2572 ErrorCode::kSuccess,
2573 metrics::CheckResult::kNoUpdateAvailable,
2574 metrics::CheckReaction::kUnset,
2575 metrics::DownloadErrorCode::kUnset,
2576 nullptr,
2577 &post_data));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002578 // We shouldn't send a ping in this case since powerwash > 0.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002579 string post_str(post_data.begin(), post_data.end());
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002580 EXPECT_EQ(string::npos, post_str.find("<ping"));
2581}
2582
Amin Hassani1677e812017-06-21 13:36:36 -07002583// Checks that the initial ping with a=-1 r=-1 is not send when the device
2584// first_active_omaha_ping_sent is set.
2585TEST_F(OmahaRequestActionTest, PingWhenFirstActiveOmahaPingIsSent) {
2586 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2587
2588 // Flag that the device was not powerwashed in the past.
2589 fake_system_state_.fake_hardware()->SetPowerwashCount(0);
2590
2591 // Flag that the device has sent first active ping in the past.
2592 fake_system_state_.fake_hardware()->SetFirstActiveOmahaPingSent();
2593
2594 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002595 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2596 -1,
2597 false, // ping_only
2598 ErrorCode::kSuccess,
2599 metrics::CheckResult::kNoUpdateAvailable,
2600 metrics::CheckReaction::kUnset,
2601 metrics::DownloadErrorCode::kUnset,
2602 nullptr,
2603 &post_data));
Amin Hassani1677e812017-06-21 13:36:36 -07002604 // We shouldn't send a ping in this case since
2605 // first_active_omaha_ping_sent=true
2606 string post_str(post_data.begin(), post_data.end());
2607 EXPECT_EQ(string::npos, post_str.find("<ping"));
2608}
2609
Alex Deymo9fded1e2015-11-05 12:31:19 -08002610// Checks that the event 54 is sent on a reboot to a new update.
2611TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
2612 // Flag that the device was updated in a previous boot.
2613 fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
2614
2615 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002616 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2617 -1,
2618 false, // ping_only
2619 ErrorCode::kSuccess,
2620 metrics::CheckResult::kNoUpdateAvailable,
2621 metrics::CheckReaction::kUnset,
2622 metrics::DownloadErrorCode::kUnset,
2623 nullptr,
2624 &post_data));
Alex Deymo9fded1e2015-11-05 12:31:19 -08002625 string post_str(post_data.begin(), post_data.end());
2626
2627 // An event 54 is included and has the right version.
2628 EXPECT_NE(string::npos,
2629 post_str.find(base::StringPrintf(
2630 "<event eventtype=\"%d\"",
2631 OmahaEvent::kTypeRebootedAfterUpdate)));
2632 EXPECT_NE(string::npos,
2633 post_str.find("previousversion=\"1.2.3.4\"></event>"));
2634
2635 // The previous version flag should have been removed.
2636 EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
2637 string prev_version;
2638 EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
2639 EXPECT_TRUE(prev_version.empty());
2640}
2641
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002642void OmahaRequestActionTest::P2PTest(
2643 bool initial_allow_p2p_for_downloading,
2644 bool initial_allow_p2p_for_sharing,
2645 bool omaha_disable_p2p_for_downloading,
2646 bool omaha_disable_p2p_for_sharing,
2647 bool payload_state_allow_p2p_attempt,
2648 bool expect_p2p_client_lookup,
2649 const string& p2p_client_result_url,
2650 bool expected_allow_p2p_for_downloading,
2651 bool expected_allow_p2p_for_sharing,
2652 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07002653 OmahaResponse response;
Gilad Arnold74b5f552014-10-07 08:17:16 -07002654 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
2655 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
2656 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07002657
2658 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002659 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07002660 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2661 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07002662 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
2663 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
2664 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
2665 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
2666 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
2667 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
2668 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
2669 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
2670 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
2671 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
2672
David Zeuthen8f191b22013-08-06 12:27:50 -07002673 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002674 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07002675 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2676
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002677 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2678 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002679 .Times(expect_p2p_client_lookup ? 1 : 0);
2680
Alex Deymo8e18f932015-03-27 16:16:59 -07002681 fake_update_response_.disable_p2p_for_downloading =
2682 omaha_disable_p2p_for_downloading;
2683 fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
Marton Hunyady2abda312018-04-24 18:21:49 +02002684 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2685 -1,
2686 false, // ping_only
2687 ErrorCode::kSuccess,
2688 metrics::CheckResult::kUpdateAvailable,
2689 metrics::CheckReaction::kUpdating,
2690 metrics::DownloadErrorCode::kUnset,
2691 &response,
2692 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002693 EXPECT_TRUE(response.update_exists);
2694
Gilad Arnold74b5f552014-10-07 08:17:16 -07002695 EXPECT_EQ(omaha_disable_p2p_for_downloading,
2696 response.disable_p2p_for_downloading);
2697 EXPECT_EQ(omaha_disable_p2p_for_sharing,
2698 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07002699
Gilad Arnold74b5f552014-10-07 08:17:16 -07002700 EXPECT_EQ(expected_allow_p2p_for_downloading,
2701 actual_allow_p2p_for_downloading);
2702 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
2703 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07002704}
2705
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002706TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002707 P2PTest(true, // initial_allow_p2p_for_downloading
2708 true, // initial_allow_p2p_for_sharing
2709 false, // omaha_disable_p2p_for_downloading
2710 false, // omaha_disable_p2p_for_sharing
2711 true, // payload_state_allow_p2p_attempt
2712 true, // expect_p2p_client_lookup
2713 "http://1.3.5.7/p2p", // p2p_client_result_url
2714 true, // expected_allow_p2p_for_downloading
2715 true, // expected_allow_p2p_for_sharing
2716 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002717}
2718
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002719TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002720 P2PTest(true, // initial_allow_p2p_for_downloading
2721 true, // initial_allow_p2p_for_sharing
2722 false, // omaha_disable_p2p_for_downloading
2723 false, // omaha_disable_p2p_for_sharing
2724 true, // payload_state_allow_p2p_attempt
2725 true, // expect_p2p_client_lookup
2726 "", // p2p_client_result_url
2727 false, // expected_allow_p2p_for_downloading
2728 true, // expected_allow_p2p_for_sharing
2729 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002730}
2731
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002732TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002733 P2PTest(false, // initial_allow_p2p_for_downloading
2734 true, // initial_allow_p2p_for_sharing
2735 false, // omaha_disable_p2p_for_downloading
2736 false, // omaha_disable_p2p_for_sharing
2737 true, // payload_state_allow_p2p_attempt
2738 false, // expect_p2p_client_lookup
2739 "unset", // p2p_client_result_url
2740 false, // expected_allow_p2p_for_downloading
2741 true, // expected_allow_p2p_for_sharing
2742 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002743}
2744
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002745TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002746 P2PTest(true, // initial_allow_p2p_for_downloading
2747 true, // initial_allow_p2p_for_sharing
2748 true, // omaha_disable_p2p_for_downloading
2749 false, // omaha_disable_p2p_for_sharing
2750 true, // payload_state_allow_p2p_attempt
2751 false, // expect_p2p_client_lookup
2752 "unset", // p2p_client_result_url
2753 false, // expected_allow_p2p_for_downloading
2754 true, // expected_allow_p2p_for_sharing
2755 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002756}
2757
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002758TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002759 P2PTest(true, // initial_allow_p2p_for_downloading
2760 true, // initial_allow_p2p_for_sharing
2761 false, // omaha_disable_p2p_for_downloading
2762 true, // omaha_disable_p2p_for_sharing
2763 true, // payload_state_allow_p2p_attempt
2764 true, // expect_p2p_client_lookup
2765 "http://1.3.5.7/p2p", // p2p_client_result_url
2766 true, // expected_allow_p2p_for_downloading
2767 false, // expected_allow_p2p_for_sharing
2768 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002769}
2770
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002771TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002772 P2PTest(true, // initial_allow_p2p_for_downloading
2773 true, // initial_allow_p2p_for_sharing
2774 true, // omaha_disable_p2p_for_downloading
2775 true, // omaha_disable_p2p_for_sharing
2776 true, // payload_state_allow_p2p_attempt
2777 false, // expect_p2p_client_lookup
2778 "unset", // p2p_client_result_url
2779 false, // expected_allow_p2p_for_downloading
2780 false, // expected_allow_p2p_for_sharing
2781 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002782}
2783
Alex Deymof329b932014-10-30 01:37:48 -07002784bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2785 OmahaResponse *response) {
Alex Deymo8e18f932015-03-27 16:16:59 -07002786 fake_update_response_.elapsed_days = elapsed_days;
Marton Hunyady2abda312018-04-24 18:21:49 +02002787 return TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2788 -1,
2789 false, // ping_only
2790 ErrorCode::kSuccess,
2791 metrics::CheckResult::kUpdateAvailable,
2792 metrics::CheckReaction::kUpdating,
2793 metrics::DownloadErrorCode::kUnset,
2794 response,
2795 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002796}
2797
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002798TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002799 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002800
Kevin Cernekee2494e282016-03-29 18:03:53 -07002801 // Simulate a successful update check that happens during OOBE. The
2802 // deadline in the response is needed to force the update attempt to
2803 // occur; responses without a deadline seen during OOBE will normally
2804 // return ErrorCode::kNonCriticalUpdateInOOBE.
2805 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
2806 fake_update_response_.deadline = "20101020";
2807
David Zeuthen639aa362014-02-03 16:23:44 -08002808 // Check that we parse elapsed_days in the Omaha Response correctly.
2809 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002810 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2811 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002812 EXPECT_TRUE(response.update_exists);
2813 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002814 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002815 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002816 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002817 EXPECT_EQ(prefs_days, 42);
2818
2819 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002820 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002821 EXPECT_TRUE(response.update_exists);
2822 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002823 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002824 EXPECT_EQ(prefs_days, 42);
2825
2826 // Note that elapsed_days is not necessarily divisible by 7 so check
2827 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002828 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2829 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002830 EXPECT_TRUE(response.update_exists);
2831 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002832 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002833 EXPECT_EQ(prefs_days, 21);
2834
2835 // Check that we correctly handle elapsed_days not being included in
2836 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002837 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002838 EXPECT_TRUE(response.update_exists);
2839 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002840}
2841
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002842// If there is no prefs and OOBE is not complete, we should not
2843// report anything to Omaha.
2844TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
Kevin Cernekee2494e282016-03-29 18:03:53 -07002845 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002846 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2847 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2848}
David Zeuthen639aa362014-02-03 16:23:44 -08002849
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002850// If OOBE is complete and happened on a valid date (e.g. after Jan
2851// 1 2007 0:00 PST), that date should be used and written to
2852// prefs. However, first try with an invalid date and check we do
2853// nothing.
2854TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2855 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2856 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2857 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2858 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2859}
David Zeuthen639aa362014-02-03 16:23:44 -08002860
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002861// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2862// should yield an InstallDate of 14.
2863TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2864 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2865 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2866 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2867 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002868
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002869 int64_t prefs_days;
2870 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2871 EXPECT_EQ(prefs_days, 14);
2872}
David Zeuthen639aa362014-02-03 16:23:44 -08002873
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002874// Now that we have a valid date in prefs, check that we keep using
2875// that even if OOBE date reports something else. The date Jan 30,
2876// 2007 0:00 PST should yield an InstallDate of 28... but since
2877// there's a prefs file, we should still get 14.
2878TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2879 // Set a valid date in the prefs first.
2880 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002881
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002882 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2883 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2884 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002885
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002886 int64_t prefs_days;
2887 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2888 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002889
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002890 // If we delete the prefs file, we should get 28 days.
2891 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2892 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2893 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2894 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002895}
2896
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002897// Verifies that a device with no device policy, and is not a consumer
2898// device sets the max kernel key version to the current version.
2899// ie. the same behavior as if rollback is enabled.
2900TEST_F(OmahaRequestActionTest, NoPolicyEnterpriseDevicesSetMaxRollback) {
2901 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2902
2903 // Setup and verify some initial default values for the kernel TPM
2904 // values that control verified boot and rollback.
2905 const int min_kernel_version = 4;
2906 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2907 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2908 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2909 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2910
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002911 EXPECT_CALL(
2912 *fake_system_state_.mock_metrics_reporter(),
2913 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2914 .Times(1);
2915
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002916 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002917 TestRollbackCheck(false /* is_consumer_device */,
2918 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002919 false /* is_policy_loaded */,
2920 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002921
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002922 // Verify kernel_max_rollforward was set to the current minimum
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002923 // kernel key version. This has the effect of freezing roll
2924 // forwards indefinitely. This will hold the rollback window
2925 // open until a future change will be able to move this forward
2926 // relative the configured window.
2927 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2928 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2929}
2930
2931// Verifies that a conmsumer device with no device policy sets the
2932// max kernel key version to the current version. ie. the same
2933// behavior as if rollback is enabled.
2934TEST_F(OmahaRequestActionTest, NoPolicyConsumerDevicesSetMaxRollback) {
2935 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2936
2937 // Setup and verify some initial default values for the kernel TPM
2938 // values that control verified boot and rollback.
2939 const int min_kernel_version = 3;
2940 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2941 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2942 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2943 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2944
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002945 EXPECT_CALL(
2946 *fake_system_state_.mock_metrics_reporter(),
2947 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2948 .Times(1);
2949
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002950 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002951 TestRollbackCheck(true /* is_consumer_device */,
2952 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002953 false /* is_policy_loaded */,
2954 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002955
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002956 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002957 // was set to logical infinity. This is the expected behavior for
2958 // consumer devices and matches the existing behavior prior to the
2959 // rollback features.
2960 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2961 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2962}
2963
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002964// Verifies that a device with rollback enabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002965// in the TPM to prevent roll forward.
2966TEST_F(OmahaRequestActionTest, RollbackEnabledDevicesSetMaxRollback) {
2967 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2968
2969 // Setup and verify some initial default values for the kernel TPM
2970 // values that control verified boot and rollback.
2971 const int allowed_milestones = 4;
2972 const int min_kernel_version = 3;
2973 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2974 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2975 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2976 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2977
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002978 EXPECT_CALL(
2979 *fake_system_state_.mock_metrics_reporter(),
2980 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2981 .Times(1);
2982
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002983 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002984 TestRollbackCheck(false /* is_consumer_device */,
2985 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002986 true /* is_policy_loaded */,
2987 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002988
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002989 // Verify that with rollback enabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002990 // was set to the current minimum kernel key version. This has
2991 // the effect of freezing roll forwards indefinitely. This will
2992 // hold the rollback window open until a future change will
2993 // be able to move this forward relative the configured window.
2994 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2995 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2996}
2997
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002998// Verifies that a device with rollback disabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002999// in the TPM to logical infinity, to allow roll forward.
3000TEST_F(OmahaRequestActionTest, RollbackDisabledDevicesSetMaxRollback) {
3001 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
3002
3003 // Setup and verify some initial default values for the kernel TPM
3004 // values that control verified boot and rollback.
3005 const int allowed_milestones = 0;
3006 const int min_kernel_version = 3;
3007 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
3008 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
3009 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
3010 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
3011
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02003012 EXPECT_CALL(
3013 *fake_system_state_.mock_metrics_reporter(),
3014 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
3015 .Times(1);
3016
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003017 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003018 TestRollbackCheck(false /* is_consumer_device */,
3019 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003020 true /* is_policy_loaded */,
3021 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003022
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07003023 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08003024 // was set to logical infinity.
3025 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
3026 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
3027}
3028
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07003029TEST_F(OmahaRequestActionTest, RollbackResponseParsedNoEntries) {
3030 OmahaResponse response;
3031 fake_update_response_.rollback = true;
3032 TestRollbackCheck(false /* is_consumer_device */,
3033 4 /* rollback_allowed_milestones */,
3034 true /* is_policy_loaded */,
3035 &response);
3036 EXPECT_TRUE(response.is_rollback);
3037}
3038
3039TEST_F(OmahaRequestActionTest, RollbackResponseValidVersionsParsed) {
3040 OmahaResponse response;
3041 fake_update_response_.rollback_firmware_version = "1.2";
3042 fake_update_response_.rollback_kernel_version = "3.4";
3043 fake_update_response_.rollback = true;
3044 TestRollbackCheck(false /* is_consumer_device */,
3045 4 /* rollback_allowed_milestones */,
3046 true /* is_policy_loaded */,
3047 &response);
3048 EXPECT_TRUE(response.is_rollback);
3049 EXPECT_EQ(1, response.rollback_key_version.firmware_key);
3050 EXPECT_EQ(2, response.rollback_key_version.firmware);
3051 EXPECT_EQ(3, response.rollback_key_version.kernel_key);
3052 EXPECT_EQ(4, response.rollback_key_version.kernel);
3053}
3054
May Lippert60aa3ca2018-08-15 16:55:29 -07003055TEST_F(OmahaRequestActionTest,
3056 TestUpdateFirstSeenAtPrefPersistedIfUpdateExists) {
3057 FakeClock fake_clock;
3058 Time now = Time::Now();
3059 fake_clock.SetWallclockTime(now);
3060 fake_system_state_.set_clock(&fake_clock);
3061
3062 OmahaResponse response;
3063 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3064 -1,
3065 false, // ping_only
3066 ErrorCode::kSuccess,
3067 metrics::CheckResult::kUpdateAvailable,
3068 metrics::CheckReaction::kUpdating,
3069 metrics::DownloadErrorCode::kUnset,
3070 &response,
3071 nullptr));
3072 EXPECT_TRUE(response.update_exists);
3073 EXPECT_TRUE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3074
3075 int64_t stored_first_seen_at_time;
3076 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt,
3077 &stored_first_seen_at_time));
3078 EXPECT_EQ(now.ToInternalValue(), stored_first_seen_at_time);
3079}
3080
3081TEST_F(OmahaRequestActionTest,
3082 TestUpdateFirstSeenAtPrefNotPersistedIfUpdateFails) {
3083 FakeClock fake_clock;
3084 Time now = Time::Now();
3085 fake_clock.SetWallclockTime(now);
3086 fake_system_state_.set_clock(&fake_clock);
3087
3088 OmahaResponse response;
3089 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
3090 -1,
3091 false, // ping_only
3092 ErrorCode::kSuccess,
3093 metrics::CheckResult::kNoUpdateAvailable,
3094 metrics::CheckReaction::kUnset,
3095 metrics::DownloadErrorCode::kUnset,
3096 &response,
3097 nullptr));
3098 EXPECT_FALSE(response.update_exists);
3099 EXPECT_FALSE(fake_prefs_.Exists(kPrefsUpdateFirstSeenAt));
3100}
3101
Xiaochu Liu88d90382018-08-29 16:09:11 -07003102TEST_F(OmahaRequestActionTest, InstallTest) {
3103 OmahaResponse response;
Xiaochu Liu6310be62018-10-11 15:09:03 -07003104 request_params_.set_is_install(true);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003105 request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
Xiaochu Liu88d90382018-08-29 16:09:11 -07003106 brillo::Blob post_data;
3107 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3108 -1,
3109 false, // ping_only
3110 true, // is_consumer_device
3111 0, // rollback_allowed_milestones
3112 false, // is_policy_loaded
3113 ErrorCode::kSuccess,
3114 metrics::CheckResult::kUpdateAvailable,
3115 metrics::CheckReaction::kUpdating,
3116 metrics::DownloadErrorCode::kUnset,
3117 &response,
3118 &post_data));
3119 // Convert post_data to string.
3120 string post_str(post_data.begin(), post_data.end());
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003121 for (const auto& dlc_module_id : request_params_.dlc_module_ids()) {
Xiaochu Liu88d90382018-08-29 16:09:11 -07003122 EXPECT_NE(string::npos,
Xiaochu Liu6310be62018-10-11 15:09:03 -07003123 post_str.find("appid=\"" + fake_update_response_.app_id + "_" +
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003124 dlc_module_id + "\""));
Xiaochu Liu88d90382018-08-29 16:09:11 -07003125 }
Xiaochu Liu6310be62018-10-11 15:09:03 -07003126 EXPECT_NE(string::npos,
3127 post_str.find("appid=\"" + fake_update_response_.app_id + "\""));
3128
3129 // Count number of updatecheck tag in response.
3130 int updatecheck_count = 0;
3131 size_t pos = 0;
3132 while ((pos = post_str.find("<updatecheck", pos)) != string::npos) {
3133 updatecheck_count++;
3134 pos++;
3135 }
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003136 EXPECT_EQ(request_params_.dlc_module_ids().size(), updatecheck_count);
Xiaochu Liu6310be62018-10-11 15:09:03 -07003137}
3138
3139TEST_F(OmahaRequestActionTest, InstallMissingPlatformVersionTest) {
3140 fake_update_response_.multi_app_skip_updatecheck = true;
3141 fake_update_response_.multi_app_no_update = false;
3142 request_params_.set_is_install(true);
Xiaochu Liuf53a5d32018-11-26 13:48:59 -08003143 request_params_.set_dlc_module_ids({"dlc_no_0", "dlc_no_1"});
Xiaochu Liu6310be62018-10-11 15:09:03 -07003144 request_params_.set_app_id(fake_update_response_.app_id_skip_updatecheck);
3145 OmahaResponse response;
3146 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
3147 -1,
3148 false, // ping_only
3149 ErrorCode::kSuccess,
3150 metrics::CheckResult::kUpdateAvailable,
3151 metrics::CheckReaction::kUpdating,
3152 metrics::DownloadErrorCode::kUnset,
3153 &response,
3154 nullptr));
3155 EXPECT_TRUE(response.update_exists);
3156 EXPECT_EQ(fake_update_response_.current_version, response.version);
Xiaochu Liu88d90382018-08-29 16:09:11 -07003157}
3158
Darin Petkov6a5b3222010-07-13 14:55:28 -07003159} // namespace chromeos_update_engine