blob: 019b723bda46987ffe7accb26da95dd9ea98a15a [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
Alex Deymo85616652015-10-15 18:48:31 -070080const char kTestAppId[] = "test-app-id";
Aaron Wood7dcdedf2017-09-06 17:17:41 -070081const char kTestAppId2[] = "test-app2-id";
Alex Deymo85616652015-10-15 18:48:31 -070082
Alex Deymo8e18f932015-03-27 16:16:59 -070083// This is a helper struct to allow unit tests build an update response with the
84// values they care about.
85struct FakeUpdateResponse {
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -070086 string GetRollbackVersionAttributes() const {
87 return (rollback ? " _rollback=\"true\"" : "") +
88 (!rollback_firmware_version.empty()
89 ? " _firmware_version=\"" + rollback_firmware_version + "\""
90 : "") +
91 (!rollback_kernel_version.empty()
92 ? " _kernel_version=\"" + rollback_kernel_version + "\""
93 : "");
94 }
95
Alex Deymo8e18f932015-03-27 16:16:59 -070096 string GetNoUpdateResponse() const {
97 string entity_str;
98 if (include_entity)
99 entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
Sen Jiang81259682017-03-30 15:11:30 -0700100 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + entity_str +
101 "<response protocol=\"3.0\">"
102 "<daystart elapsed_seconds=\"100\"/>"
103 "<app appid=\"" +
104 app_id + "\" " +
105 (include_cohorts
106 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
107 "\" cohortname=\"" + cohortname + "\" "
108 : "") +
109 " status=\"ok\">"
110 "<ping status=\"ok\"/>"
111 "<updatecheck status=\"noupdate\"/></app>" +
112 (multi_app_no_update
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700113 ? "<app appid=\"" + app_id2 +
114 "\"><updatecheck status=\"noupdate\"/></app>"
Sen Jiang81259682017-03-30 15:11:30 -0700115 : "") +
116 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700117 }
118
119 string GetUpdateResponse() const {
Sen Jiang2703ef42017-03-16 13:36:21 -0700120 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
121 "protocol=\"3.0\">"
122 "<daystart elapsed_seconds=\"100\"" +
123 (elapsed_days.empty() ? ""
124 : (" elapsed_days=\"" + elapsed_days + "\"")) +
125 "/>"
126 "<app appid=\"" +
127 app_id + "\" " +
128 (include_cohorts
129 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
130 "\" cohortname=\"" + cohortname + "\" "
131 : "") +
132 " status=\"ok\">"
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700133 "<ping status=\"ok\"/><updatecheck status=\"ok\"" +
134 GetRollbackVersionAttributes() + ">" + "<urls><url codebase=\"" +
Sen Jiang2703ef42017-03-16 13:36:21 -0700135 codebase +
136 "\"/></urls>"
137 "<manifest version=\"" +
138 version +
139 "\">"
140 "<packages><package hash=\"not-used\" name=\"" +
141 filename + "\" size=\"" + base::Int64ToString(size) +
Sen Jiang0affc2c2017-02-10 15:55:05 -0800142 "\" hash_sha256=\"" + hash + "\"/>" +
143 (multi_package ? "<package name=\"package2\" size=\"222\" "
144 "hash_sha256=\"hash2\"/>"
145 : "") +
146 "</packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700147 "<actions><action event=\"postinstall\" MetadataSize=\"11" +
148 (multi_package ? ":22" : "") + "\" ChromeOSVersion=\"" + version +
149 "\" MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt +
Sen Jiang2703ef42017-03-16 13:36:21 -0700150 "\" "
151 "IsDelta=\"true\" "
Sen Jiangcdd52062017-05-18 15:33:10 -0700152 "IsDeltaPayload=\"true" +
153 (multi_package ? ":false" : "") +
154 "\" "
Sen Jiang2703ef42017-03-16 13:36:21 -0700155 "MaxDaysToScatter=\"" +
156 max_days_to_scatter +
157 "\" "
158 "sha256=\"not-used\" "
159 "needsadmin=\"" +
160 needsadmin + "\" " +
161 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
162 (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
163 : "") +
164 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Sen Jiangfe284402018-03-21 14:03:50 -0700165 (powerwash ? "Powerwash=\"true\" " : "") +
Sen Jiang81259682017-03-30 15:11:30 -0700166 "/></actions></manifest></updatecheck></app>" +
167 (multi_app
Sen Jiangb1e063a2017-09-15 17:44:31 -0700168 ? "<app appid=\"" + app_id2 + "\"" +
169 (include_cohorts ? " cohort=\"cohort2\"" : "") +
170 "><updatecheck status=\"ok\"><urls><url codebase=\"" +
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700171 codebase2 + "\"/></urls><manifest version=\"" + version2 +
172 "\"><packages>"
Sen Jiang81259682017-03-30 15:11:30 -0700173 "<package name=\"package3\" size=\"333\" "
174 "hash_sha256=\"hash3\"/></packages>"
Sen Jiang00adf7b2017-06-26 15:57:29 -0700175 "<actions><action event=\"postinstall\" " +
176 (multi_app_self_update
177 ? "noupdate=\"true\" IsDeltaPayload=\"true\" "
178 : "IsDeltaPayload=\"false\" ") +
179 "MetadataSize=\"33\"/></actions>"
Sen Jiang81259682017-03-30 15:11:30 -0700180 "</manifest></updatecheck></app>"
181 : "") +
182 (multi_app_no_update
183 ? "<app><updatecheck status=\"noupdate\"/></app>"
184 : "") +
185 "</response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700186 }
187
188 // Return the payload URL, which is split in two fields in the XML response.
189 string GetPayloadUrl() {
190 return codebase + filename;
191 }
192
Alex Deymo85616652015-10-15 18:48:31 -0700193 string app_id = kTestAppId;
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700194 string app_id2 = kTestAppId2;
Alex Deymo8e18f932015-03-27 16:16:59 -0700195 string version = "1.2.3.4";
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700196 string version2 = "2.3.4.5";
Alex Deymo8e18f932015-03-27 16:16:59 -0700197 string more_info_url = "http://more/info";
198 string prompt = "true";
199 string codebase = "http://code/base/";
Sen Jiang81259682017-03-30 15:11:30 -0700200 string codebase2 = "http://code/base/2/";
Alex Deymo8e18f932015-03-27 16:16:59 -0700201 string filename = "file.signed";
Sen Jiang2703ef42017-03-16 13:36:21 -0700202 string hash = "4841534831323334";
Alex Deymo8e18f932015-03-27 16:16:59 -0700203 string needsadmin = "false";
Sen Jiang0affc2c2017-02-10 15:55:05 -0800204 uint64_t size = 123;
Alex Deymo8e18f932015-03-27 16:16:59 -0700205 string deadline = "";
206 string max_days_to_scatter = "7";
207 string elapsed_days = "42";
208
209 // P2P setting defaults to allowed.
210 bool disable_p2p_for_downloading = false;
211 bool disable_p2p_for_sharing = false;
212
Sen Jiangfe284402018-03-21 14:03:50 -0700213 bool powerwash = false;
214
Alex Deymo8e18f932015-03-27 16:16:59 -0700215 // Omaha cohorts settings.
216 bool include_cohorts = false;
217 string cohort = "";
218 string cohorthint = "";
219 string cohortname = "";
220
221 // Whether to include the CrOS <!ENTITY> in the XML response.
222 bool include_entity = false;
Sen Jiang0affc2c2017-02-10 15:55:05 -0800223
Sen Jiang81259682017-03-30 15:11:30 -0700224 // Whether to include more than one app.
225 bool multi_app = false;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700226 // Whether to include an app with noupdate="true".
227 bool multi_app_self_update = false;
228 // Whether to include an additional app with status="noupdate".
Sen Jiang81259682017-03-30 15:11:30 -0700229 bool multi_app_no_update = false;
230 // Whether to include more than one package in an app.
Sen Jiang0affc2c2017-02-10 15:55:05 -0800231 bool multi_package = false;
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700232
233 // Whether the payload is a rollback.
234 bool rollback = false;
235 // The verified boot firmware key version for the rollback image.
236 string rollback_firmware_version = "";
237 // The verified boot kernel key version for the rollback image.
238 string rollback_kernel_version = "";
Alex Deymo8e18f932015-03-27 16:16:59 -0700239};
240
241} // namespace
242
Darin Petkov6a5b3222010-07-13 14:55:28 -0700243namespace chromeos_update_engine {
244
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700245class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
246 public:
247 OmahaRequestActionTestProcessorDelegate()
248 : expected_code_(ErrorCode::kSuccess),
249 interactive_(false),
250 test_http_fetcher_headers_(false) {}
251 ~OmahaRequestActionTestProcessorDelegate() override = default;
252
253 void ProcessingDone(const ActionProcessor* processor,
254 ErrorCode code) override {
255 brillo::MessageLoop::current()->BreakLoop();
256 }
257
258 void ActionCompleted(ActionProcessor* processor,
259 AbstractAction* action,
260 ErrorCode code) override {
261 // Make sure actions always succeed.
262 if (action->Type() == OmahaRequestAction::StaticType()) {
263 EXPECT_EQ(expected_code_, code);
264 // Check that the headers were set in the fetcher during the action. Note
265 // that we set this request as "interactive".
266 auto fetcher = static_cast<const MockHttpFetcher*>(
267 static_cast<OmahaRequestAction*>(action)->http_fetcher_.get());
268
269 if (test_http_fetcher_headers_) {
270 EXPECT_EQ(interactive_ ? "fg" : "bg",
271 fetcher->GetHeader("X-Goog-Update-Interactivity"));
272 EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-Goog-Update-AppId"));
273 EXPECT_NE("", fetcher->GetHeader("X-Goog-Update-Updater"));
274 }
275 post_data_ = fetcher->post_data();
276 } else if (action->Type() ==
277 ObjectCollectorAction<OmahaResponse>::StaticType()) {
278 EXPECT_EQ(ErrorCode::kSuccess, code);
279 auto collector_action =
280 static_cast<ObjectCollectorAction<OmahaResponse>*>(action);
281 omaha_response_.reset(new OmahaResponse(collector_action->object()));
282 EXPECT_TRUE(omaha_response_);
283 } else {
284 EXPECT_EQ(ErrorCode::kSuccess, code);
285 }
286 }
287 ErrorCode expected_code_;
288 brillo::Blob post_data_;
289 bool interactive_;
290 bool test_http_fetcher_headers_;
291 std::unique_ptr<OmahaResponse> omaha_response_;
292};
293
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700294class OmahaRequestActionTest : public ::testing::Test {
295 protected:
Alex Deymo610277e2014-11-11 21:18:11 -0800296 void SetUp() override {
Marton Hunyady2abda312018-04-24 18:21:49 +0200297 request_params_.set_os_sp("service_pack");
298 request_params_.set_os_board("x86-generic");
299 request_params_.set_app_id(kTestAppId);
300 request_params_.set_app_version("0.1.0.0");
301 request_params_.set_app_lang("en-US");
302 request_params_.set_current_channel("unittest");
303 request_params_.set_target_channel("unittest");
304 request_params_.set_hwid("OEM MODEL 09235 7471");
305 request_params_.set_fw_version("ChromeOSFirmware.1.0");
306 request_params_.set_ec_version("0X0A1");
307 request_params_.set_delta_okay(true);
308 request_params_.set_interactive(false);
309 request_params_.set_update_url("http://url");
310 request_params_.set_target_version_prefix("");
Marton Hunyadyba51c3f2018-04-25 15:18:10 +0200311 request_params_.set_rollback_allowed(false);
Marton Hunyady2abda312018-04-24 18:21:49 +0200312 request_params_.set_is_powerwash_allowed(false);
313
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700314 fake_system_state_.set_request_params(&request_params_);
315 fake_system_state_.set_prefs(&fake_prefs_);
316 }
317
318 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -0800319 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700320 // is used. |payload_state| may be null, in which case a local mock is used.
321 // |p2p_manager| may be null, in which case a local mock is used.
322 // |connection_manager| may be null, in which case a local mock is used.
323 // out_response may be null. If |fail_http_response_code| is non-negative,
324 // the transfer will fail with that code. |ping_only| is passed through to the
325 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
326 // post-data received by the mock HttpFetcher is returned.
327 //
328 // The |expected_check_result|, |expected_check_reaction| and
329 // |expected_error_code| parameters are for checking expectations
330 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
331 // UMA statistics. Use the appropriate ::kUnset value to specify that
332 // the given metric should not be reported.
Marton Hunyady2abda312018-04-24 18:21:49 +0200333 bool TestUpdateCheck(const string& http_response,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700334 int fail_http_response_code,
335 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800336 bool is_consumer_device,
337 int rollback_allowed_milestones,
338 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700339 ErrorCode expected_code,
340 metrics::CheckResult expected_check_result,
341 metrics::CheckReaction expected_check_reaction,
342 metrics::DownloadErrorCode expected_download_error_code,
343 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700344 brillo::Blob* out_post_data);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700345
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800346 // Overload of TestUpdateCheck that does not supply |is_consumer_device| or
347 // |rollback_allowed_milestones| which are only required for rollback tests.
348 bool TestUpdateCheck(const string& http_response,
349 int fail_http_response_code,
350 bool ping_only,
351 ErrorCode expected_code,
352 metrics::CheckResult expected_check_result,
353 metrics::CheckReaction expected_check_reaction,
354 metrics::DownloadErrorCode expected_download_error_code,
355 OmahaResponse* out_response,
356 brillo::Blob* out_post_data);
357
358 void TestRollbackCheck(bool is_consumer_device,
359 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700360 bool is_policy_loaded,
361 OmahaResponse* out_response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800362
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700363 void TestEvent(OmahaEvent* event,
364 const string& http_response,
365 brillo::Blob* out_post_data);
366
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800367 // Runs and checks a ping test. |ping_only| indicates whether it should send
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700368 // only a ping or also an updatecheck.
369 void PingTest(bool ping_only);
370
371 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -0700372 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700373 OmahaResponse *response);
374
375 // P2P test helper function.
376 void P2PTest(
377 bool initial_allow_p2p_for_downloading,
378 bool initial_allow_p2p_for_sharing,
379 bool omaha_disable_p2p_for_downloading,
380 bool omaha_disable_p2p_for_sharing,
381 bool payload_state_allow_p2p_attempt,
382 bool expect_p2p_client_lookup,
383 const string& p2p_client_result_url,
384 bool expected_allow_p2p_for_downloading,
385 bool expected_allow_p2p_for_sharing,
386 const string& expected_p2p_url);
387
388 FakeSystemState fake_system_state_;
Alex Deymo8e18f932015-03-27 16:16:59 -0700389 FakeUpdateResponse fake_update_response_;
Marton Hunyady2abda312018-04-24 18:21:49 +0200390 // Used by all tests.
391 OmahaRequestParams request_params_{&fake_system_state_};
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700392
393 FakePrefs fake_prefs_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700394
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700395 OmahaRequestActionTestProcessorDelegate delegate_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700396
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700397 bool test_http_fetcher_headers_{false};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700398};
399
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700400bool OmahaRequestActionTest::TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700401 const string& http_response,
402 int fail_http_response_code,
403 bool ping_only,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800404 bool is_consumer_device,
405 int rollback_allowed_milestones,
406 bool is_policy_loaded,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700407 ErrorCode expected_code,
408 metrics::CheckResult expected_check_result,
409 metrics::CheckReaction expected_check_reaction,
410 metrics::DownloadErrorCode expected_download_error_code,
411 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700412 brillo::Blob* out_post_data) {
413 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700414 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700415 auto fetcher = std::make_unique<MockHttpFetcher>(
416 http_response.data(), http_response.size(), nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700417 if (fail_http_response_code >= 0) {
418 fetcher->FailTransfer(fail_http_response_code);
419 }
Marton Hunyady2abda312018-04-24 18:21:49 +0200420 // This ensures the tests didn't forget to update fake_system_state_ if they
421 // are not using the default request_params_.
422 EXPECT_EQ(&request_params_, fake_system_state_.request_params());
423
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700424 auto omaha_request_action = std::make_unique<OmahaRequestAction>(
425 &fake_system_state_, nullptr, std::move(fetcher), ping_only);
426
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800427 auto mock_policy_provider =
428 std::make_unique<NiceMock<policy::MockPolicyProvider>>();
429 EXPECT_CALL(*mock_policy_provider, IsConsumerDevice())
430 .WillRepeatedly(Return(is_consumer_device));
431
432 EXPECT_CALL(*mock_policy_provider, device_policy_is_loaded())
433 .WillRepeatedly(Return(is_policy_loaded));
434
435 const policy::MockDevicePolicy device_policy;
436 const bool get_allowed_milestone_succeeds = rollback_allowed_milestones >= 0;
437 EXPECT_CALL(device_policy, GetRollbackAllowedMilestones(_))
438 .WillRepeatedly(DoAll(SetArgPointee<0>(rollback_allowed_milestones),
439 Return(get_allowed_milestone_succeeds)));
440
441 EXPECT_CALL(*mock_policy_provider, GetDevicePolicy())
442 .WillRepeatedly(ReturnRef(device_policy));
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700443 omaha_request_action->policy_provider_ = std::move(mock_policy_provider);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800444
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700445 delegate_.expected_code_ = expected_code;
446 delegate_.interactive_ = request_params_.interactive();
447 delegate_.test_http_fetcher_headers_ = test_http_fetcher_headers_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700448 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700449 processor.set_delegate(&delegate_);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700450
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700451 auto collector_action =
452 std::make_unique<ObjectCollectorAction<OmahaResponse>>();
453 BondActions(omaha_request_action.get(), collector_action.get());
454 processor.EnqueueAction(std::move(omaha_request_action));
455 processor.EnqueueAction(std::move(collector_action));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700456
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700457 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
458 ReportUpdateCheckMetrics(_, _, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800459 .Times(AnyNumber());
Tianjie Xu282aa1f2017-09-05 13:42:45 -0700460
461 EXPECT_CALL(*fake_system_state_.mock_metrics_reporter(),
462 ReportUpdateCheckMetrics(_,
463 expected_check_result,
464 expected_check_reaction,
465 expected_download_error_code))
466 .Times(ping_only ? 0 : 1);
David Zeuthen33bae492014-02-25 16:16:18 -0800467
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700468 loop.PostTask(base::Bind(
469 [](ActionProcessor* processor) { processor->StartProcessing(); },
470 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700471 loop.Run();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700472 EXPECT_FALSE(loop.PendingTasks());
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700473 if (delegate_.omaha_response_ && out_response)
474 *out_response = *delegate_.omaha_response_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700475 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700476 *out_post_data = delegate_.post_data_;
477 return delegate_.omaha_response_ != nullptr;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700478}
479
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800480bool OmahaRequestActionTest::TestUpdateCheck(
481 const string& http_response,
482 int fail_http_response_code,
483 bool ping_only,
484 ErrorCode expected_code,
485 metrics::CheckResult expected_check_result,
486 metrics::CheckReaction expected_check_reaction,
487 metrics::DownloadErrorCode expected_download_error_code,
488 OmahaResponse* out_response,
489 brillo::Blob* out_post_data) {
490 return TestUpdateCheck(http_response,
491 fail_http_response_code,
492 ping_only,
493 true, // is_consumer_device
494 0, // rollback_allowed_milestones
495 false, // is_policy_loaded
496 expected_code,
497 expected_check_result,
498 expected_check_reaction,
499 expected_download_error_code,
500 out_response,
501 out_post_data);
502}
503
504void OmahaRequestActionTest::TestRollbackCheck(bool is_consumer_device,
505 int rollback_allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700506 bool is_policy_loaded,
507 OmahaResponse* out_response) {
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800508 fake_update_response_.deadline = "20101020";
509 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
510 -1,
511 false, // ping_only
512 is_consumer_device,
513 rollback_allowed_milestones,
514 is_policy_loaded,
515 ErrorCode::kSuccess,
516 metrics::CheckResult::kUpdateAvailable,
517 metrics::CheckReaction::kUpdating,
518 metrics::DownloadErrorCode::kUnset,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700519 out_response,
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800520 nullptr));
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -0700521 ASSERT_TRUE(out_response->update_exists);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -0800522}
523
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700524// Tests Event requests -- they should always succeed. |out_post_data| may be
525// null; if non-null, the post-data received by the mock HttpFetcher is
526// returned.
527void OmahaRequestActionTest::TestEvent(OmahaEvent* event,
528 const string& http_response,
529 brillo::Blob* out_post_data) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700530 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700531 loop.SetAsCurrent();
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700532
533 auto action = std::make_unique<OmahaRequestAction>(
534 &fake_system_state_,
535 event,
536 std::make_unique<MockHttpFetcher>(
537 http_response.data(), http_response.size(), nullptr),
538 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700539 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700540 processor.set_delegate(&delegate_);
541 processor.EnqueueAction(std::move(action));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700542
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700543 loop.PostTask(base::Bind(
544 [](ActionProcessor* processor) { processor->StartProcessing(); },
545 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700546 loop.Run();
Alex Deymo72a25672016-03-23 15:44:39 -0700547 EXPECT_FALSE(loop.PendingTasks());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700548
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700549 if (out_post_data)
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700550 *out_post_data = delegate_.post_data_;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700551}
552
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700553TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400554 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700555 fake_update_response_.include_entity = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200556 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
557 -1,
558 false, // ping_only
559 ErrorCode::kOmahaRequestXMLHasEntityDecl,
560 metrics::CheckResult::kParsingError,
561 metrics::CheckReaction::kUnset,
562 metrics::DownloadErrorCode::kUnset,
563 &response,
564 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400565 EXPECT_FALSE(response.update_exists);
566}
567
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700568TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700569 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +0200570 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
571 -1,
572 false, // ping_only
573 ErrorCode::kSuccess,
574 metrics::CheckResult::kNoUpdateAvailable,
575 metrics::CheckReaction::kUnset,
576 metrics::DownloadErrorCode::kUnset,
577 &response,
578 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700579 EXPECT_FALSE(response.update_exists);
580}
581
Sen Jiang81259682017-03-30 15:11:30 -0700582TEST_F(OmahaRequestActionTest, MultiAppNoUpdateTest) {
583 OmahaResponse response;
584 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200585 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700586 -1,
587 false, // ping_only
588 ErrorCode::kSuccess,
589 metrics::CheckResult::kNoUpdateAvailable,
590 metrics::CheckReaction::kUnset,
591 metrics::DownloadErrorCode::kUnset,
592 &response,
593 nullptr));
594 EXPECT_FALSE(response.update_exists);
595}
596
Sen Jiang00adf7b2017-06-26 15:57:29 -0700597TEST_F(OmahaRequestActionTest, MultiAppNoPartialUpdateTest) {
598 OmahaResponse response;
599 fake_update_response_.multi_app_no_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200600 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang00adf7b2017-06-26 15:57:29 -0700601 -1,
602 false, // ping_only
603 ErrorCode::kSuccess,
604 metrics::CheckResult::kNoUpdateAvailable,
605 metrics::CheckReaction::kUnset,
606 metrics::DownloadErrorCode::kUnset,
607 &response,
608 nullptr));
609 EXPECT_FALSE(response.update_exists);
610}
611
612TEST_F(OmahaRequestActionTest, NoSelfUpdateTest) {
613 OmahaResponse response;
614 ASSERT_TRUE(TestUpdateCheck(
Sen Jiang00adf7b2017-06-26 15:57:29 -0700615 "<response><app><updatecheck status=\"ok\"><manifest><actions><action "
616 "event=\"postinstall\" noupdate=\"true\"/></actions>"
617 "</manifest></updatecheck></app></response>",
618 -1,
619 false, // ping_only
620 ErrorCode::kSuccess,
621 metrics::CheckResult::kNoUpdateAvailable,
622 metrics::CheckReaction::kUnset,
623 metrics::DownloadErrorCode::kUnset,
624 &response,
625 nullptr));
626 EXPECT_FALSE(response.update_exists);
627}
628
Alex Deymo8e18f932015-03-27 16:16:59 -0700629// Test that all the values in the response are parsed in a normal update
630// response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700631TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700632 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700633 fake_update_response_.deadline = "20101020";
Marton Hunyady2abda312018-04-24 18:21:49 +0200634 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
635 -1,
636 false, // ping_only
637 ErrorCode::kSuccess,
638 metrics::CheckResult::kUpdateAvailable,
639 metrics::CheckReaction::kUpdating,
640 metrics::DownloadErrorCode::kUnset,
641 &response,
642 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700643 EXPECT_TRUE(response.update_exists);
Alex Deymo8e18f932015-03-27 16:16:59 -0700644 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700645 EXPECT_EQ("", response.system_version);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800646 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
647 response.packages[0].payload_urls[0]);
Alex Deymo8e18f932015-03-27 16:16:59 -0700648 EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800649 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
650 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700651 EXPECT_EQ(true, response.packages[0].is_delta);
Alex Deymo8e18f932015-03-27 16:16:59 -0700652 EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
653 EXPECT_EQ(fake_update_response_.deadline, response.deadline);
Sen Jiangfe284402018-03-21 14:03:50 -0700654 EXPECT_FALSE(response.powerwash_required);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700655 // Omaha cohort attributes are not set in the response, so they should not be
Alex Deymo8e18f932015-03-27 16:16:59 -0700656 // persisted.
657 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
658 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
659 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700660}
661
Sen Jiang0affc2c2017-02-10 15:55:05 -0800662TEST_F(OmahaRequestActionTest, MultiPackageUpdateTest) {
663 OmahaResponse response;
664 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200665 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang0affc2c2017-02-10 15:55:05 -0800666 -1,
667 false, // ping_only
668 ErrorCode::kSuccess,
669 metrics::CheckResult::kUpdateAvailable,
670 metrics::CheckReaction::kUpdating,
671 metrics::DownloadErrorCode::kUnset,
672 &response,
673 nullptr));
674 EXPECT_TRUE(response.update_exists);
675 EXPECT_EQ(fake_update_response_.version, response.version);
676 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
677 response.packages[0].payload_urls[0]);
678 EXPECT_EQ(fake_update_response_.codebase + "package2",
679 response.packages[1].payload_urls[0]);
680 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
681 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700682 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700683 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800684 ASSERT_EQ(2u, response.packages.size());
Sen Jiang81259682017-03-30 15:11:30 -0700685 EXPECT_EQ(string("hash2"), response.packages[1].hash);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800686 EXPECT_EQ(222u, response.packages[1].size);
Sen Jiang81259682017-03-30 15:11:30 -0700687 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700688 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700689}
690
691TEST_F(OmahaRequestActionTest, MultiAppUpdateTest) {
692 OmahaResponse response;
693 fake_update_response_.multi_app = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200694 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700695 -1,
696 false, // ping_only
697 ErrorCode::kSuccess,
698 metrics::CheckResult::kUpdateAvailable,
699 metrics::CheckReaction::kUpdating,
700 metrics::DownloadErrorCode::kUnset,
701 &response,
702 nullptr));
703 EXPECT_TRUE(response.update_exists);
704 EXPECT_EQ(fake_update_response_.version, response.version);
705 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
706 response.packages[0].payload_urls[0]);
707 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
708 response.packages[1].payload_urls[0]);
709 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
710 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
711 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700712 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700713 ASSERT_EQ(2u, response.packages.size());
714 EXPECT_EQ(string("hash3"), response.packages[1].hash);
715 EXPECT_EQ(333u, response.packages[1].size);
716 EXPECT_EQ(33u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700717 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700718}
719
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700720TEST_F(OmahaRequestActionTest, MultiAppAndSystemUpdateTest) {
721 OmahaResponse response;
722 fake_update_response_.multi_app = true;
723 // trigger the lining up of the app and system versions
724 request_params_.set_system_app_id(fake_update_response_.app_id2);
725
Marton Hunyady2abda312018-04-24 18:21:49 +0200726 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700727 -1,
728 false, // ping_only
729 ErrorCode::kSuccess,
730 metrics::CheckResult::kUpdateAvailable,
731 metrics::CheckReaction::kUpdating,
732 metrics::DownloadErrorCode::kUnset,
733 &response,
734 nullptr));
735 EXPECT_TRUE(response.update_exists);
736 EXPECT_EQ(fake_update_response_.version, response.version);
737 EXPECT_EQ(fake_update_response_.version2, response.system_version);
738 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
739 response.packages[0].payload_urls[0]);
740 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
741 response.packages[1].payload_urls[0]);
742 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
743 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
744 EXPECT_EQ(11u, response.packages[0].metadata_size);
745 EXPECT_EQ(true, response.packages[0].is_delta);
746 ASSERT_EQ(2u, response.packages.size());
747 EXPECT_EQ(string("hash3"), response.packages[1].hash);
748 EXPECT_EQ(333u, response.packages[1].size);
749 EXPECT_EQ(33u, response.packages[1].metadata_size);
750 EXPECT_EQ(false, response.packages[1].is_delta);
751}
752
Sen Jiang81259682017-03-30 15:11:30 -0700753TEST_F(OmahaRequestActionTest, MultiAppPartialUpdateTest) {
754 OmahaResponse response;
Sen Jiang00adf7b2017-06-26 15:57:29 -0700755 fake_update_response_.multi_app = true;
756 fake_update_response_.multi_app_self_update = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200757 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700758 -1,
759 false, // ping_only
760 ErrorCode::kSuccess,
761 metrics::CheckResult::kUpdateAvailable,
762 metrics::CheckReaction::kUpdating,
763 metrics::DownloadErrorCode::kUnset,
764 &response,
765 nullptr));
766 EXPECT_TRUE(response.update_exists);
767 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700768 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700769 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
770 response.packages[0].payload_urls[0]);
771 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
772 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
773 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiang00adf7b2017-06-26 15:57:29 -0700774 ASSERT_EQ(2u, response.packages.size());
775 EXPECT_EQ(string("hash3"), response.packages[1].hash);
776 EXPECT_EQ(333u, response.packages[1].size);
777 EXPECT_EQ(33u, response.packages[1].metadata_size);
778 EXPECT_EQ(true, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700779}
780
781TEST_F(OmahaRequestActionTest, MultiAppMultiPackageUpdateTest) {
782 OmahaResponse response;
783 fake_update_response_.multi_app = true;
784 fake_update_response_.multi_package = true;
Marton Hunyady2abda312018-04-24 18:21:49 +0200785 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang81259682017-03-30 15:11:30 -0700786 -1,
787 false, // ping_only
788 ErrorCode::kSuccess,
789 metrics::CheckResult::kUpdateAvailable,
790 metrics::CheckReaction::kUpdating,
791 metrics::DownloadErrorCode::kUnset,
792 &response,
793 nullptr));
794 EXPECT_TRUE(response.update_exists);
795 EXPECT_EQ(fake_update_response_.version, response.version);
Aaron Wood7dcdedf2017-09-06 17:17:41 -0700796 EXPECT_EQ("", response.system_version);
Sen Jiang81259682017-03-30 15:11:30 -0700797 EXPECT_EQ(fake_update_response_.GetPayloadUrl(),
798 response.packages[0].payload_urls[0]);
799 EXPECT_EQ(fake_update_response_.codebase + "package2",
800 response.packages[1].payload_urls[0]);
801 EXPECT_EQ(fake_update_response_.codebase2 + "package3",
802 response.packages[2].payload_urls[0]);
803 EXPECT_EQ(fake_update_response_.hash, response.packages[0].hash);
804 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
805 EXPECT_EQ(11u, response.packages[0].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700806 EXPECT_EQ(true, response.packages[0].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700807 ASSERT_EQ(3u, response.packages.size());
808 EXPECT_EQ(string("hash2"), response.packages[1].hash);
809 EXPECT_EQ(222u, response.packages[1].size);
810 EXPECT_EQ(22u, response.packages[1].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700811 EXPECT_EQ(false, response.packages[1].is_delta);
Sen Jiang81259682017-03-30 15:11:30 -0700812 EXPECT_EQ(string("hash3"), response.packages[2].hash);
813 EXPECT_EQ(333u, response.packages[2].size);
814 EXPECT_EQ(33u, response.packages[2].metadata_size);
Sen Jiangcdd52062017-05-18 15:33:10 -0700815 EXPECT_EQ(false, response.packages[2].is_delta);
Sen Jiang0affc2c2017-02-10 15:55:05 -0800816}
817
Sen Jiangfe284402018-03-21 14:03:50 -0700818TEST_F(OmahaRequestActionTest, PowerwashTest) {
819 OmahaResponse response;
820 fake_update_response_.powerwash = true;
Amin Hassani3538a882018-05-31 14:11:30 -0700821 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangfe284402018-03-21 14:03:50 -0700822 -1,
823 false, // ping_only
824 ErrorCode::kSuccess,
825 metrics::CheckResult::kUpdateAvailable,
826 metrics::CheckReaction::kUpdating,
827 metrics::DownloadErrorCode::kUnset,
828 &response,
829 nullptr));
830 EXPECT_TRUE(response.update_exists);
831 EXPECT_TRUE(response.powerwash_required);
832}
833
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700834TEST_F(OmahaRequestActionTest, ExtraHeadersSentInteractiveTest) {
835 OmahaResponse response;
Alex Deymo14ad88e2016-06-29 12:30:14 -0700836 request_params_.set_interactive(true);
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700837 test_http_fetcher_headers_ = true;
838 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
839 -1,
840 false, // ping_only
841 ErrorCode::kOmahaRequestXMLParseError,
842 metrics::CheckResult::kParsingError,
843 metrics::CheckReaction::kUnset,
844 metrics::DownloadErrorCode::kUnset,
845 &response,
846 nullptr));
847 EXPECT_FALSE(response.update_exists);
848}
Alex Deymo14ad88e2016-06-29 12:30:14 -0700849
Amin Hassanid3f4bea2018-04-30 14:52:40 -0700850TEST_F(OmahaRequestActionTest, ExtraHeadersSentNoInteractiveTest) {
851 OmahaResponse response;
852 request_params_.set_interactive(false);
853 test_http_fetcher_headers_ = true;
854 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
855 -1,
856 false, // ping_only
857 ErrorCode::kOmahaRequestXMLParseError,
858 metrics::CheckResult::kParsingError,
859 metrics::CheckReaction::kUnset,
860 metrics::DownloadErrorCode::kUnset,
861 &response,
862 nullptr));
863 EXPECT_FALSE(response.update_exists);
Alex Deymo14ad88e2016-06-29 12:30:14 -0700864}
865
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700866TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700867 OmahaResponse response;
868 // Set up a connection manager that doesn't allow a valid update over
869 // the current ethernet connection.
Alex Deymof6ee0162015-07-31 12:35:22 -0700870 MockConnectionManager mock_cm;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700871 fake_system_state_.set_connection_manager(&mock_cm);
872
Alex Deymo30534502015-07-20 15:06:33 -0700873 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
874 .WillRepeatedly(
Ben Chan672c1f52017-10-23 15:41:39 -0700875 DoAll(SetArgPointee<0>(ConnectionType::kEthernet),
876 SetArgPointee<1>(ConnectionTethering::kUnknown),
Alex Deymo30534502015-07-20 15:06:33 -0700877 Return(true)));
Sen Jiang255e22b2016-05-20 16:15:29 -0700878 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
879 .WillRepeatedly(Return(false));
Chris Sosa77f79e82014-06-02 18:16:24 -0700880
Marton Hunyady2abda312018-04-24 18:21:49 +0200881 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
882 -1,
883 false, // ping_only
884 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
885 metrics::CheckResult::kUpdateAvailable,
886 metrics::CheckReaction::kIgnored,
887 metrics::DownloadErrorCode::kUnset,
888 &response,
889 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700890 EXPECT_FALSE(response.update_exists);
891}
892
Weidong Guo421ff332017-04-17 10:08:38 -0700893TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularAllowedByDevicePolicy) {
894 // This test tests that update over cellular is allowed as device policy
895 // says yes.
896 OmahaResponse response;
897 MockConnectionManager mock_cm;
898
899 fake_system_state_.set_connection_manager(&mock_cm);
900
901 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
902 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
903 SetArgPointee<1>(ConnectionTethering::kUnknown),
904 Return(true)));
905 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
906 .WillRepeatedly(Return(true));
907 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
908 .WillRepeatedly(Return(true));
909
Marton Hunyady2abda312018-04-24 18:21:49 +0200910 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700911 -1,
912 false, // ping_only
913 ErrorCode::kSuccess,
914 metrics::CheckResult::kUpdateAvailable,
915 metrics::CheckReaction::kUpdating,
916 metrics::DownloadErrorCode::kUnset,
917 &response,
918 nullptr));
919 EXPECT_TRUE(response.update_exists);
920}
921
922TEST_F(OmahaRequestActionTest, ValidUpdateOverCellularBlockedByDevicePolicy) {
923 // This test tests that update over cellular is blocked as device policy
924 // says no.
925 OmahaResponse response;
926 MockConnectionManager mock_cm;
927
928 fake_system_state_.set_connection_manager(&mock_cm);
929
930 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
931 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
932 SetArgPointee<1>(ConnectionTethering::kUnknown),
933 Return(true)));
934 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
935 .WillRepeatedly(Return(true));
936 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
937 .WillRepeatedly(Return(false));
938
Marton Hunyady2abda312018-04-24 18:21:49 +0200939 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700940 -1,
941 false, // ping_only
942 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
943 metrics::CheckResult::kUpdateAvailable,
944 metrics::CheckReaction::kIgnored,
945 metrics::DownloadErrorCode::kUnset,
946 &response,
947 nullptr));
948 EXPECT_FALSE(response.update_exists);
949}
950
951TEST_F(OmahaRequestActionTest,
952 ValidUpdateOverCellularAllowedByUserPermissionTrue) {
953 // This test tests that, when device policy is not set, update over cellular
954 // is allowed as permission for update over cellular is set to true.
955 OmahaResponse response;
956 MockConnectionManager mock_cm;
957
958 fake_prefs_.SetBoolean(kPrefsUpdateOverCellularPermission, true);
959 fake_system_state_.set_connection_manager(&mock_cm);
960
961 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
962 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
963 SetArgPointee<1>(ConnectionTethering::kUnknown),
964 Return(true)));
965 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
966 .WillRepeatedly(Return(false));
967 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
968 .WillRepeatedly(Return(true));
969
Marton Hunyady2abda312018-04-24 18:21:49 +0200970 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -0700971 -1,
972 false, // ping_only
973 ErrorCode::kSuccess,
974 metrics::CheckResult::kUpdateAvailable,
975 metrics::CheckReaction::kUpdating,
976 metrics::DownloadErrorCode::kUnset,
977 &response,
978 nullptr));
979 EXPECT_TRUE(response.update_exists);
980}
981
982TEST_F(OmahaRequestActionTest,
983 ValidUpdateOverCellularBlockedByUpdateTargetNotMatch) {
984 // This test tests that, when device policy is not set and permission for
985 // update over cellular is set to false or does not exist, update over
986 // cellular is blocked as update target does not match the omaha response.
987 OmahaResponse response;
988 MockConnectionManager mock_cm;
989 // A version different from the version in omaha response.
990 string diff_version = "99.99.99";
991 // A size different from the size in omaha response.
992 int64_t diff_size = 999;
993
994 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, diff_version);
995 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, diff_size);
996 // This test tests cellular (3G) being the only connection type being allowed.
997 fake_system_state_.set_connection_manager(&mock_cm);
998
999 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1000 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1001 SetArgPointee<1>(ConnectionTethering::kUnknown),
1002 Return(true)));
1003 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1004 .WillRepeatedly(Return(false));
1005 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1006 .WillRepeatedly(Return(true));
1007
Marton Hunyady2abda312018-04-24 18:21:49 +02001008 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001009 -1,
1010 false, // ping_only
1011 ErrorCode::kOmahaUpdateIgnoredOverCellular,
1012 metrics::CheckResult::kUpdateAvailable,
1013 metrics::CheckReaction::kIgnored,
1014 metrics::DownloadErrorCode::kUnset,
1015 &response,
1016 nullptr));
1017 EXPECT_FALSE(response.update_exists);
1018}
1019
1020TEST_F(OmahaRequestActionTest,
1021 ValidUpdateOverCellularAllowedByUpdateTargetMatch) {
1022 // This test tests that, when device policy is not set and permission for
1023 // update over cellular is set to false or does not exist, update over
1024 // cellular is allowed as update target matches the omaha response.
1025 OmahaResponse response;
1026 MockConnectionManager mock_cm;
1027 // A version same as the version in omaha response.
1028 string new_version = fake_update_response_.version;
1029 // A size same as the size in omaha response.
1030 int64_t new_size = fake_update_response_.size;
1031
1032 fake_prefs_.SetString(kPrefsUpdateOverCellularTargetVersion, new_version);
1033 fake_prefs_.SetInt64(kPrefsUpdateOverCellularTargetSize, new_size);
1034 fake_system_state_.set_connection_manager(&mock_cm);
1035
1036 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
1037 .WillRepeatedly(DoAll(SetArgPointee<0>(ConnectionType::kCellular),
1038 SetArgPointee<1>(ConnectionTethering::kUnknown),
1039 Return(true)));
1040 EXPECT_CALL(mock_cm, IsAllowedConnectionTypesForUpdateSet())
1041 .WillRepeatedly(Return(false));
1042 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kCellular, _))
1043 .WillRepeatedly(Return(true));
1044
Marton Hunyady2abda312018-04-24 18:21:49 +02001045 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Weidong Guo421ff332017-04-17 10:08:38 -07001046 -1,
1047 false, // ping_only
1048 ErrorCode::kSuccess,
1049 metrics::CheckResult::kUpdateAvailable,
1050 metrics::CheckReaction::kUpdating,
1051 metrics::DownloadErrorCode::kUnset,
1052 &response,
1053 nullptr));
1054 EXPECT_TRUE(response.update_exists);
1055}
1056
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001057TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -07001058 string rollback_version = "1234.0.0";
1059 OmahaResponse response;
1060
1061 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001062 fake_system_state_.set_payload_state(&mock_payload_state);
1063
Chris Sosa77f79e82014-06-02 18:16:24 -07001064 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
1065 .WillRepeatedly(Return(rollback_version));
1066
Alex Deymo8e18f932015-03-27 16:16:59 -07001067 fake_update_response_.version = rollback_version;
Marton Hunyady2abda312018-04-24 18:21:49 +02001068 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1069 -1,
1070 false, // ping_only
1071 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
1072 metrics::CheckResult::kUpdateAvailable,
1073 metrics::CheckReaction::kIgnored,
1074 metrics::DownloadErrorCode::kUnset,
1075 &response,
1076 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -07001077 EXPECT_FALSE(response.update_exists);
1078}
1079
Marton Hunyadyc2882062018-05-14 17:28:25 +02001080// Verify that update checks called during OOBE will not try to download an
1081// update if the response doesn't include the deadline field.
Kevin Cernekee2494e282016-03-29 18:03:53 -07001082TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
1083 OmahaResponse response;
Marton Hunyadyc2882062018-05-14 17:28:25 +02001084 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Kevin Cernekee2494e282016-03-29 18:03:53 -07001085
Sen Jiang8cd42342018-01-31 12:06:59 -08001086 // TODO(senj): set better default value for metrics::checkresult in
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001087 // OmahaRequestAction::ActionCompleted.
Marton Hunyady2abda312018-04-24 18:21:49 +02001088 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07001089 -1,
1090 false, // ping_only
1091 ErrorCode::kNonCriticalUpdateInOOBE,
1092 metrics::CheckResult::kParsingError,
1093 metrics::CheckReaction::kUnset,
1094 metrics::DownloadErrorCode::kUnset,
1095 &response,
1096 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001097 EXPECT_FALSE(response.update_exists);
Marton Hunyadyc2882062018-05-14 17:28:25 +02001098}
Kevin Cernekee2494e282016-03-29 18:03:53 -07001099
Marton Hunyadyc2882062018-05-14 17:28:25 +02001100// Verify that the IsOOBEComplete() value is ignored when the OOBE flow is not
1101// enabled.
1102TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDisabled) {
1103 OmahaResponse response;
1104 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymo46a9aae2016-05-04 20:20:11 -07001105 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
Alex Deymo46a9aae2016-05-04 20:20:11 -07001106
Marton Hunyady2abda312018-04-24 18:21:49 +02001107 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1108 -1,
1109 false, // ping_only
1110 ErrorCode::kSuccess,
1111 metrics::CheckResult::kUpdateAvailable,
1112 metrics::CheckReaction::kUpdating,
1113 metrics::DownloadErrorCode::kUnset,
1114 &response,
1115 nullptr));
Kevin Cernekee2494e282016-03-29 18:03:53 -07001116 EXPECT_TRUE(response.update_exists);
1117}
1118
Marton Hunyadyc2882062018-05-14 17:28:25 +02001119// Verify that update checks called during OOBE will still try to download an
1120// update if the response includes the deadline field.
1121TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBEDeadlineSet) {
1122 OmahaResponse response;
1123 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1124 fake_update_response_.deadline = "20101020";
1125
1126 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1127 -1,
1128 false, // ping_only
1129 ErrorCode::kSuccess,
1130 metrics::CheckResult::kUpdateAvailable,
1131 metrics::CheckReaction::kUpdating,
1132 metrics::DownloadErrorCode::kUnset,
1133 &response,
1134 nullptr));
1135 EXPECT_TRUE(response.update_exists);
1136}
1137
1138// Verify that update checks called during OOBE will not try to download an
1139// update if a rollback happened, even when the response includes the deadline
1140// field.
1141TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBERollback) {
1142 OmahaResponse response;
1143 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
1144 fake_update_response_.deadline = "20101020";
1145 EXPECT_CALL(*(fake_system_state_.mock_payload_state()), GetRollbackHappened())
1146 .WillOnce(Return(true));
1147
1148 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1149 -1,
1150 false, // ping_only
1151 ErrorCode::kNonCriticalUpdateInOOBE,
1152 metrics::CheckResult::kParsingError,
1153 metrics::CheckReaction::kUnset,
1154 metrics::DownloadErrorCode::kUnset,
1155 &response,
1156 nullptr));
1157 EXPECT_FALSE(response.update_exists);
1158}
1159
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001160TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001161 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001162 request_params_.set_wall_clock_based_wait_enabled(true);
1163 request_params_.set_update_check_count_wait_enabled(false);
1164 request_params_.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001165
Marton Hunyady2abda312018-04-24 18:21:49 +02001166 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1167 -1,
1168 false, // ping_only
1169 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1170 metrics::CheckResult::kUpdateAvailable,
1171 metrics::CheckReaction::kDeferring,
1172 metrics::DownloadErrorCode::kUnset,
1173 &response,
1174 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001175 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001176
1177 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001178 request_params_.set_interactive(true);
1179 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1180 -1,
1181 false, // ping_only
1182 ErrorCode::kSuccess,
1183 metrics::CheckResult::kUpdateAvailable,
1184 metrics::CheckReaction::kUpdating,
1185 metrics::DownloadErrorCode::kUnset,
1186 &response,
1187 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001188 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001189}
1190
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001191TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001192 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001193 request_params_.set_wall_clock_based_wait_enabled(false);
1194 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1195 request_params_.set_update_check_count_wait_enabled(true);
1196 request_params_.set_min_update_checks_needed(1);
1197 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001198
Marton Hunyady2abda312018-04-24 18:21:49 +02001199 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1200 -1,
1201 false, // ping_only
1202 ErrorCode::kSuccess,
1203 metrics::CheckResult::kUpdateAvailable,
1204 metrics::CheckReaction::kUpdating,
1205 metrics::DownloadErrorCode::kUnset,
1206 &response,
1207 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001208 EXPECT_TRUE(response.update_exists);
1209}
1210
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001211TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001212 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001213 request_params_.set_wall_clock_based_wait_enabled(true);
1214 request_params_.set_waiting_period(TimeDelta::FromDays(2));
1215 request_params_.set_update_check_count_wait_enabled(true);
1216 request_params_.set_min_update_checks_needed(1);
1217 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001218
Alex Deymo8e18f932015-03-27 16:16:59 -07001219 fake_update_response_.max_days_to_scatter = "0";
Marton Hunyady2abda312018-04-24 18:21:49 +02001220 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1221 -1,
1222 false, // ping_only
1223 ErrorCode::kSuccess,
1224 metrics::CheckResult::kUpdateAvailable,
1225 metrics::CheckReaction::kUpdating,
1226 metrics::DownloadErrorCode::kUnset,
1227 &response,
1228 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001229 EXPECT_TRUE(response.update_exists);
1230}
1231
1232
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001233TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001234 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001235 request_params_.set_wall_clock_based_wait_enabled(true);
1236 request_params_.set_waiting_period(TimeDelta());
1237 request_params_.set_update_check_count_wait_enabled(true);
1238 request_params_.set_min_update_checks_needed(0);
1239 request_params_.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001240
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001241 ASSERT_TRUE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001242 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001243 -1,
1244 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001245 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001246 metrics::CheckResult::kUpdateAvailable,
1247 metrics::CheckReaction::kUpdating,
1248 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001249 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001250 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001251
Ben Chan9abb7632014-08-07 00:10:53 -07001252 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001253 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001254 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001255 EXPECT_TRUE(response.update_exists);
1256}
1257
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001258TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001259 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001260 request_params_.set_wall_clock_based_wait_enabled(true);
1261 request_params_.set_waiting_period(TimeDelta());
1262 request_params_.set_update_check_count_wait_enabled(true);
1263 request_params_.set_min_update_checks_needed(1);
1264 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001265
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001266 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001267 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001268 -1,
1269 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001270 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001271 metrics::CheckResult::kUpdateAvailable,
1272 metrics::CheckReaction::kDeferring,
1273 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001274 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001275 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001276
Ben Chan9abb7632014-08-07 00:10:53 -07001277 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001278 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001279 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001280 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001281
1282 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001283 request_params_.set_interactive(true);
1284 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1285 -1,
1286 false, // ping_only
1287 ErrorCode::kSuccess,
1288 metrics::CheckResult::kUpdateAvailable,
1289 metrics::CheckReaction::kUpdating,
1290 metrics::DownloadErrorCode::kUnset,
1291 &response,
1292 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001293 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001294}
1295
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001296TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001297 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001298 request_params_.set_wall_clock_based_wait_enabled(true);
1299 request_params_.set_waiting_period(TimeDelta());
1300 request_params_.set_update_check_count_wait_enabled(true);
1301 request_params_.set_min_update_checks_needed(1);
1302 request_params_.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001303
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001304 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001305
1306 ASSERT_FALSE(TestUpdateCheck(
Alex Deymo8e18f932015-03-27 16:16:59 -07001307 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001308 -1,
1309 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001310 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001311 metrics::CheckResult::kUpdateAvailable,
1312 metrics::CheckReaction::kDeferring,
1313 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001314 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001315 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001316
Ben Chan9abb7632014-08-07 00:10:53 -07001317 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001318 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001319 // count remains the same, as the decrementing happens in update_attempter
1320 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001321 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001322 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001323
1324 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02001325 request_params_.set_interactive(true);
1326 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1327 -1,
1328 false, // ping_only
1329 ErrorCode::kSuccess,
1330 metrics::CheckResult::kUpdateAvailable,
1331 metrics::CheckReaction::kUpdating,
1332 metrics::DownloadErrorCode::kUnset,
1333 &response,
1334 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001335 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001336}
Jay Srinivasan0a708742012-03-20 11:26:12 -07001337
Adolfo Victoria497044c2018-07-18 07:51:42 -07001338TEST_F(OmahaRequestActionTest, StagingTurnedOnCausesScattering) {
1339 // If staging is on, the value for max days to scatter should be ignored, and
1340 // staging's scatter value should be used.
1341 OmahaResponse response;
1342 request_params_.set_wall_clock_based_wait_enabled(true);
1343 request_params_.set_waiting_period(TimeDelta::FromDays(6));
1344 request_params_.set_update_check_count_wait_enabled(false);
1345
1346 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsWallClockStagingWaitPeriod, 6));
1347 // This should not prevent scattering due to staging.
1348 fake_update_response_.max_days_to_scatter = "0";
1349 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1350 -1,
1351 false, // ping_only
1352 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1353 metrics::CheckResult::kUpdateAvailable,
1354 metrics::CheckReaction::kDeferring,
1355 metrics::DownloadErrorCode::kUnset,
1356 &response,
1357 nullptr));
1358 EXPECT_FALSE(response.update_exists);
1359
1360 // Interactive updates should not be affected.
1361 request_params_.set_interactive(true);
1362 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1363 -1,
1364 false, // ping_only
1365 ErrorCode::kSuccess,
1366 metrics::CheckResult::kUpdateAvailable,
1367 metrics::CheckReaction::kUpdating,
1368 metrics::DownloadErrorCode::kUnset,
1369 &response,
1370 nullptr));
1371 EXPECT_TRUE(response.update_exists);
1372}
1373
Alex Deymo8e18f932015-03-27 16:16:59 -07001374TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
1375 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001376 fake_update_response_.include_cohorts = true;
1377 fake_update_response_.cohort = "s/154454/8479665";
1378 fake_update_response_.cohorthint = "please-put-me-on-beta";
1379 fake_update_response_.cohortname = "stable";
1380
Marton Hunyady2abda312018-04-24 18:21:49 +02001381 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001382 -1,
1383 false, // ping_only
1384 ErrorCode::kSuccess,
1385 metrics::CheckResult::kUpdateAvailable,
1386 metrics::CheckReaction::kUpdating,
1387 metrics::DownloadErrorCode::kUnset,
1388 &response,
1389 nullptr));
1390
1391 string value;
1392 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1393 EXPECT_EQ(fake_update_response_.cohort, value);
1394
1395 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1396 EXPECT_EQ(fake_update_response_.cohorthint, value);
1397
1398 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1399 EXPECT_EQ(fake_update_response_.cohortname, value);
1400}
1401
1402TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
1403 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001404 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1405 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
1406 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
1407 fake_update_response_.include_cohorts = true;
1408 fake_update_response_.cohort = "s/154454/8479665";
1409 fake_update_response_.cohorthint = "please-put-me-on-beta";
1410 fake_update_response_.cohortname = "";
1411
Marton Hunyady2abda312018-04-24 18:21:49 +02001412 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001413 -1,
1414 false, // ping_only
1415 ErrorCode::kSuccess,
1416 metrics::CheckResult::kUpdateAvailable,
1417 metrics::CheckReaction::kUpdating,
1418 metrics::DownloadErrorCode::kUnset,
1419 &response,
1420 nullptr));
1421
1422 string value;
1423 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1424 EXPECT_EQ(fake_update_response_.cohort, value);
1425
1426 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1427 EXPECT_EQ(fake_update_response_.cohorthint, value);
1428
1429 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1430}
1431
1432TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
1433 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001434 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
1435
Marton Hunyady2abda312018-04-24 18:21:49 +02001436 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Alex Deymo8e18f932015-03-27 16:16:59 -07001437 -1,
1438 false, // ping_only
1439 ErrorCode::kSuccess,
1440 metrics::CheckResult::kUpdateAvailable,
1441 metrics::CheckReaction::kUpdating,
1442 metrics::DownloadErrorCode::kUnset,
1443 &response,
1444 nullptr));
1445
1446 string value;
1447 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1448 EXPECT_EQ("old_value", value);
1449
1450 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1451 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1452}
1453
Alex Deymo00d79ac2015-06-29 15:41:49 -07001454TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
1455 OmahaResponse response;
Alex Deymo00d79ac2015-06-29 15:41:49 -07001456 fake_update_response_.include_cohorts = true;
1457 fake_update_response_.cohort = "s/154454/8479665";
1458 fake_update_response_.cohorthint = "please-put-me-on-beta";
1459 fake_update_response_.cohortname = "stable";
1460
Marton Hunyady2abda312018-04-24 18:21:49 +02001461 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Alex Deymo00d79ac2015-06-29 15:41:49 -07001462 -1,
1463 false, // ping_only
1464 ErrorCode::kSuccess,
1465 metrics::CheckResult::kNoUpdateAvailable,
1466 metrics::CheckReaction::kUnset,
1467 metrics::DownloadErrorCode::kUnset,
1468 &response,
1469 nullptr));
1470
1471 string value;
1472 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1473 EXPECT_EQ(fake_update_response_.cohort, value);
1474
1475 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1476 EXPECT_EQ(fake_update_response_.cohorthint, value);
1477
1478 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1479 EXPECT_EQ(fake_update_response_.cohortname, value);
1480}
1481
Sen Jiangb1e063a2017-09-15 17:44:31 -07001482TEST_F(OmahaRequestActionTest, MultiAppCohortTest) {
1483 OmahaResponse response;
Sen Jiangb1e063a2017-09-15 17:44:31 -07001484 fake_update_response_.multi_app = true;
1485 fake_update_response_.include_cohorts = true;
1486 fake_update_response_.cohort = "s/154454/8479665";
1487 fake_update_response_.cohorthint = "please-put-me-on-beta";
1488 fake_update_response_.cohortname = "stable";
1489
Marton Hunyady2abda312018-04-24 18:21:49 +02001490 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiangb1e063a2017-09-15 17:44:31 -07001491 -1,
1492 false, // ping_only
1493 ErrorCode::kSuccess,
1494 metrics::CheckResult::kUpdateAvailable,
1495 metrics::CheckReaction::kUpdating,
1496 metrics::DownloadErrorCode::kUnset,
1497 &response,
1498 nullptr));
1499
1500 string value;
1501 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
1502 EXPECT_EQ(fake_update_response_.cohort, value);
1503
1504 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
1505 EXPECT_EQ(fake_update_response_.cohorthint, value);
1506
1507 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
1508 EXPECT_EQ(fake_update_response_.cohortname, value);
1509}
1510
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001511TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Alex Deymo8e18f932015-03-27 16:16:59 -07001512 const string http_response(fake_update_response_.GetNoUpdateResponse());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001513
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001514 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001515 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001516
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001517 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001518 &fake_system_state_,
1519 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001520 std::make_unique<MockHttpFetcher>(
1521 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001522 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001523 ActionProcessor processor;
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001524 processor.set_delegate(&delegate_);
1525 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001526
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -07001527 loop.PostTask(base::Bind(
1528 [](ActionProcessor* processor) { processor->StartProcessing(); },
1529 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -07001530 loop.Run();
1531 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001532 EXPECT_FALSE(processor.IsRunning());
1533}
1534
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001535TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001536 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001537 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1538 -1,
1539 false, // ping_only
1540 ErrorCode::kOmahaRequestXMLParseError,
1541 metrics::CheckResult::kParsingError,
1542 metrics::CheckReaction::kUnset,
1543 metrics::DownloadErrorCode::kUnset,
1544 &response,
1545 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001546 EXPECT_FALSE(response.update_exists);
1547}
1548
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001549TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001550 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001551 ASSERT_FALSE(TestUpdateCheck("",
1552 -1,
1553 false, // ping_only
1554 ErrorCode::kOmahaRequestEmptyResponseError,
1555 metrics::CheckResult::kParsingError,
1556 metrics::CheckReaction::kUnset,
1557 metrics::DownloadErrorCode::kUnset,
1558 &response,
1559 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001560 EXPECT_FALSE(response.update_exists);
1561}
1562
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001563TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001564 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001565 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001566 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1567 "<daystart elapsed_seconds=\"100\"/>"
1568 "<app appid=\"foo\" status=\"ok\">"
1569 "<ping status=\"ok\"/>"
1570 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001571 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001572 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001573 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001574 metrics::CheckResult::kParsingError,
1575 metrics::CheckReaction::kUnset,
1576 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001577 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001578 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001579 EXPECT_FALSE(response.update_exists);
1580}
1581
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001582TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001583 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001584 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001585 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1586 "<daystart elapsed_seconds=\"100\"/>"
1587 "<app appid=\"foo\" status=\"ok\">"
1588 "<ping status=\"ok\"/>"
1589 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001590 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001591 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001592 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001593 metrics::CheckResult::kParsingError,
1594 metrics::CheckReaction::kUnset,
1595 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001596 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001597 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001598 EXPECT_FALSE(response.update_exists);
1599}
1600
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001601TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001602 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001603 ASSERT_FALSE(TestUpdateCheck(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001604 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1605 "<daystart elapsed_seconds=\"100\"/>"
1606 "<app appid=\"foo\" status=\"ok\">"
1607 "<ping status=\"ok\"/>"
1608 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001609 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001610 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001611 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001612 metrics::CheckResult::kParsingError,
1613 metrics::CheckReaction::kUnset,
1614 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001615 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001616 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001617 EXPECT_FALSE(response.update_exists);
1618}
1619
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001620TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001621 string input_response =
1622 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1623 "<daystart elapsed_seconds=\"100\"/>"
Aaron Wood7dcdedf2017-09-06 17:17:41 -07001624 // the appid needs to match that in the request params
1625 "<app appid=\"" +
1626 fake_update_response_.app_id +
1627 "\" status=\"ok\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001628 "<updatecheck status=\"ok\">"
1629 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001630 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001631 "<packages><package hash=\"not-used\" name=\"f\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001632 "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001633 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001634 "ChromeOSVersion=\"10.2.3.4\" "
1635 "Prompt=\"false\" "
1636 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001637 "IsDeltaPayload=\"false\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001638 "sha256=\"not-used\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001639 "needsadmin=\"true\" "
1640 "/></actions></manifest></updatecheck></app></response>";
1641 LOG(INFO) << "Input Response = " << input_response;
1642
Darin Petkov6a5b3222010-07-13 14:55:28 -07001643 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001644 ASSERT_TRUE(TestUpdateCheck(input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001645 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001646 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001647 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001648 metrics::CheckResult::kUpdateAvailable,
1649 metrics::CheckReaction::kUpdating,
1650 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001651 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001652 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001653 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001654 EXPECT_EQ("10.2.3.4", response.version);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001655 EXPECT_EQ("http://missing/field/test/f",
1656 response.packages[0].payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001657 EXPECT_EQ("", response.more_info_url);
Sen Jiang0affc2c2017-02-10 15:55:05 -08001658 EXPECT_EQ("lkq34j5345", response.packages[0].hash);
1659 EXPECT_EQ(587u, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001660 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001661 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001662}
1663
1664namespace {
1665class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1666 public:
1667 void ProcessingStopped(const ActionProcessor* processor) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001668 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001669 }
Darin Petkov6a5b3222010-07-13 14:55:28 -07001670};
1671
Alex Deymo60ca1a72015-06-18 18:19:15 -07001672void TerminateTransferTestStarter(ActionProcessor* processor) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001673 processor->StartProcessing();
1674 CHECK(processor->IsRunning());
1675 processor->StopProcessing();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001676}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001677} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001678
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001679TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001680 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001681 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001682
Alex Deymo60ca1a72015-06-18 18:19:15 -07001683 string http_response("doesn't matter");
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001684 auto action = std::make_unique<OmahaRequestAction>(
Ben Chan5c02c132017-06-27 07:10:36 -07001685 &fake_system_state_,
1686 nullptr,
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001687 std::make_unique<MockHttpFetcher>(
1688 http_response.data(), http_response.size(), nullptr),
Ben Chan5c02c132017-06-27 07:10:36 -07001689 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001690 TerminateEarlyTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001691 ActionProcessor processor;
1692 processor.set_delegate(&delegate);
Amin Hassanid3f4bea2018-04-30 14:52:40 -07001693 processor.EnqueueAction(std::move(action));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001694
Alex Deymo60ca1a72015-06-18 18:19:15 -07001695 loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
1696 loop.Run();
1697 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001698}
1699
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001700TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Alex Deymob0d74eb2015-03-30 17:59:17 -07001701 string output;
1702 EXPECT_TRUE(XmlEncode("ab", &output));
1703 EXPECT_EQ("ab", output);
1704 EXPECT_TRUE(XmlEncode("a<b", &output));
1705 EXPECT_EQ("a&lt;b", output);
Alex Deymocc457852015-06-18 18:35:50 -07001706 EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1707 EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
Alex Deymob0d74eb2015-03-30 17:59:17 -07001708 EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1709 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
Alex Deymocc457852015-06-18 18:35:50 -07001710 // Check that unterminated UTF-8 strings are handled properly.
Alex Deymob0d74eb2015-03-30 17:59:17 -07001711 EXPECT_FALSE(XmlEncode("\xc2", &output));
1712 // Fail with invalid ASCII-7 chars.
1713 EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1714}
Darin Petkov6a5b3222010-07-13 14:55:28 -07001715
Alex Deymob0d74eb2015-03-30 17:59:17 -07001716TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1717 EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1718 EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1719}
1720
1721TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001722 brillo::Blob post_data;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001723
1724 // Make sure XML Encode is being called on the params
Marton Hunyady2abda312018-04-24 18:21:49 +02001725 request_params_.set_os_sp("testtheservice_pack>");
1726 request_params_.set_os_board("x86 generic<id");
1727 request_params_.set_current_channel("unittest_track&lt;");
1728 request_params_.set_target_channel("unittest_track&lt;");
1729 request_params_.set_hwid("<OEM MODEL>");
Alex Deymo8e18f932015-03-27 16:16:59 -07001730 fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
1731 fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
1732 fake_prefs_.SetString(kPrefsOmahaCohortName,
Alex Vakulenko0103c362016-01-20 07:56:15 -08001733 base::JoinString(
1734 vector<string>(100, "My spoon is too big."), " "));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001735 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02001736 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1737 -1,
1738 false, // ping_only
1739 ErrorCode::kOmahaRequestXMLParseError,
1740 metrics::CheckResult::kParsingError,
1741 metrics::CheckReaction::kUnset,
1742 metrics::DownloadErrorCode::kUnset,
1743 &response,
1744 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001745 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001746 string post_str(post_data.begin(), post_data.end());
Alex Deymo8e18f932015-03-27 16:16:59 -07001747 EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
1748 EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
1749 EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
1750 EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
1751 EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
1752 EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
1753 EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
1754 EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
1755 EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
1756 EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
1757 EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
1758 // Values from Prefs that are too big are removed from the XML instead of
1759 // encoded.
1760 EXPECT_EQ(string::npos, post_str.find("cohortname="));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001761}
1762
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001763TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001764 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001765 fake_update_response_.deadline = "&lt;20110101";
1766 fake_update_response_.more_info_url = "testthe&lt;url";
1767 fake_update_response_.codebase = "testthe&amp;codebase/";
Marton Hunyady2abda312018-04-24 18:21:49 +02001768 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1769 -1,
1770 false, // ping_only
1771 ErrorCode::kSuccess,
1772 metrics::CheckResult::kUpdateAvailable,
1773 metrics::CheckReaction::kUpdating,
1774 metrics::DownloadErrorCode::kUnset,
1775 &response,
1776 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001777
Sen Jiang0affc2c2017-02-10 15:55:05 -08001778 EXPECT_EQ("testthe<url", response.more_info_url);
1779 EXPECT_EQ("testthe&codebase/file.signed",
1780 response.packages[0].payload_urls[0]);
1781 EXPECT_EQ("<20110101", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001782}
1783
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001784TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001785 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001786 // overflows int32_t:
Sen Jiang0affc2c2017-02-10 15:55:05 -08001787 fake_update_response_.size = 123123123123123ull;
Marton Hunyady2abda312018-04-24 18:21:49 +02001788 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
1789 -1,
1790 false, // ping_only
1791 ErrorCode::kSuccess,
1792 metrics::CheckResult::kUpdateAvailable,
1793 metrics::CheckReaction::kUpdating,
1794 metrics::DownloadErrorCode::kUnset,
1795 &response,
1796 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001797
Sen Jiang0affc2c2017-02-10 15:55:05 -08001798 EXPECT_EQ(fake_update_response_.size, response.packages[0].size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001799}
1800
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001801TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001802 brillo::Blob post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001803 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001804 fake_system_state_.set_prefs(&prefs);
1805
Darin Petkov95508da2011-01-05 12:42:29 -08001806 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Ben Chan672c1f52017-10-23 15:41:39 -07001807 .WillOnce(DoAll(SetArgPointee<1>(string("")), Return(true)));
Alex Deymoefb9d832015-11-02 18:39:02 -08001808 // An existing but empty previous version means that we didn't reboot to a new
1809 // update, therefore, no need to update the previous version.
1810 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
Marton Hunyady2abda312018-04-24 18:21:49 +02001811 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001812 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001813 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001814 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001815 metrics::CheckResult::kParsingError,
1816 metrics::CheckReaction::kUnset,
1817 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001818 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001819 &post_data));
1820 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001821 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001822 EXPECT_NE(
1823 post_str.find(" <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
1824 " <updatecheck></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001825 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001826 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1827 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001828 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1829 string::npos);
1830 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1831 string::npos);
Alex Deymoefb9d832015-11-02 18:39:02 -08001832 // No <event> tag should be sent if we didn't reboot to an update.
1833 EXPECT_EQ(post_str.find("<event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001834}
1835
Jay Srinivasan0a708742012-03-20 11:26:12 -07001836
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001837TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001838 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001839 TestEvent(new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
Darin Petkove17f86b2010-07-20 09:12:01 -07001840 "invalid xml>",
1841 &post_data);
1842 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001843 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001844 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001845 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001846 OmahaEvent::kTypeUpdateDownloadStarted,
1847 OmahaEvent::kResultSuccess);
1848 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001849 EXPECT_EQ(post_str.find("ping"), string::npos);
1850 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001851}
1852
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001853TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001854 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001855 TestEvent(new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
Darin Petkove17f86b2010-07-20 09:12:01 -07001856 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001857 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001858 "invalid xml>",
1859 &post_data);
1860 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001861 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001862 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001863 " <event eventtype=\"%d\" eventresult=\"%d\" "
1864 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001865 OmahaEvent::kTypeDownloadComplete,
1866 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001867 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001868 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001869 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001870}
1871
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001872TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001873 string http_response("doesn't matter");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001874 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001875 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001876 nullptr,
Ben Chanab5a0af2017-10-12 14:57:50 -07001877 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001878 http_response.size(),
1879 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001880 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001881 EXPECT_FALSE(update_check_action.IsEvent());
1882
1883 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001884 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001885 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Ben Chanab5a0af2017-10-12 14:57:50 -07001886 std::make_unique<MockHttpFetcher>(http_response.data(),
Ben Chan5c02c132017-06-27 07:10:36 -07001887 http_response.size(),
1888 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001889 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001890 EXPECT_TRUE(event_action.IsEvent());
1891}
1892
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001893TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001894 for (int i = 0; i < 2; i++) {
1895 bool delta_okay = i == 1;
1896 const char* delta_okay_str = delta_okay ? "true" : "false";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001897 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02001898
1899 request_params_.set_delta_okay(delta_okay);
1900
1901 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001902 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001903 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001904 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001905 metrics::CheckResult::kParsingError,
1906 metrics::CheckReaction::kUnset,
1907 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001908 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001909 &post_data));
1910 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001911 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001912 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1913 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001914 string::npos)
1915 << "i = " << i;
1916 }
1917}
1918
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001919TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001920 for (int i = 0; i < 2; i++) {
1921 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001922 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001923 brillo::Blob post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001924 FakeSystemState fake_system_state;
Marton Hunyady2abda312018-04-24 18:21:49 +02001925
1926 request_params_.set_interactive(interactive);
1927
1928 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001929 -1,
1930 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001931 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001932 metrics::CheckResult::kParsingError,
1933 metrics::CheckReaction::kUnset,
1934 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001935 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001936 &post_data));
1937 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001938 string post_str(post_data.begin(), post_data.end());
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001939 EXPECT_NE(post_str.find(
1940 base::StringPrintf("installsource=\"%s\"", interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001941 string::npos)
1942 << "i = " << i;
1943 }
1944}
1945
Marton Hunyadyba51c3f2018-04-25 15:18:10 +02001946TEST_F(OmahaRequestActionTest, FormatTargetVersionPrefixOutputTest) {
1947 for (int i = 0; i < 2; i++) {
1948 bool target_version_set = i == 1;
1949 const char* target_version_prefix = target_version_set ? "10032." : "";
1950 brillo::Blob post_data;
1951 FakeSystemState fake_system_state;
1952
1953 request_params_.set_target_version_prefix(target_version_prefix);
1954
1955 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1956 -1,
1957 false, // ping_only
1958 ErrorCode::kOmahaRequestXMLParseError,
1959 metrics::CheckResult::kParsingError,
1960 metrics::CheckReaction::kUnset,
1961 metrics::DownloadErrorCode::kUnset,
1962 nullptr,
1963 &post_data));
1964 // convert post_data to string
1965 string post_str(post_data.begin(), post_data.end());
1966 if (target_version_set) {
1967 EXPECT_NE(post_str.find("<updatecheck targetversionprefix=\"10032.\">"),
1968 string::npos)
1969 << "i = " << i;
1970 } else {
1971 EXPECT_EQ(post_str.find("targetversionprefix"), string::npos)
1972 << "i = " << i;
1973 }
1974 }
1975}
1976
1977TEST_F(OmahaRequestActionTest, FormatRollbackAllowedOutputTest) {
1978 for (int i = 0; i < 4; i++) {
1979 bool rollback_allowed = i / 2 == 0;
1980 bool target_version_set = i % 2 == 0;
1981 brillo::Blob post_data;
1982 FakeSystemState fake_system_state;
1983
1984 request_params_.set_target_version_prefix(target_version_set ? "10032."
1985 : "");
1986 request_params_.set_rollback_allowed(rollback_allowed);
1987
1988 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
1989 -1,
1990 false, // ping_only
1991 ErrorCode::kOmahaRequestXMLParseError,
1992 metrics::CheckResult::kParsingError,
1993 metrics::CheckReaction::kUnset,
1994 metrics::DownloadErrorCode::kUnset,
1995 nullptr,
1996 &post_data));
1997 // convert post_data to string
1998 string post_str(post_data.begin(), post_data.end());
1999 if (rollback_allowed && target_version_set) {
2000 EXPECT_NE(post_str.find("rollback_allowed=\"true\""), string::npos)
2001 << "i = " << i;
2002 } else {
2003 EXPECT_EQ(post_str.find("rollback_allowed"), string::npos) << "i = " << i;
2004 }
2005 }
2006}
2007
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002008TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07002009 OmahaEvent default_event;
2010 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
2011 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002012 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002013
2014 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
2015 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
2016 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002017 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002018
2019 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
2020 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002021 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07002022 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
2023 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002024 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07002025}
2026
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002027void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002028 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002029 fake_system_state_.set_prefs(&prefs);
2030 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2031 .Times(AnyNumber());
2032 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
2033 // Add a few hours to the day difference to test no rounding, etc.
2034 int64_t five_days_ago =
2035 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
2036 int64_t six_days_ago =
2037 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
2038 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002039 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002040 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002041 .WillOnce(DoAll(SetArgPointee<1>(six_days_ago), Return(true)));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002042 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002043 .WillOnce(DoAll(SetArgPointee<1>(five_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002044 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002045 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
Tianjie Xu282aa1f2017-09-05 13:42:45 -07002046 -1,
2047 ping_only,
2048 ErrorCode::kSuccess,
2049 metrics::CheckResult::kNoUpdateAvailable,
2050 metrics::CheckReaction::kUnset,
2051 metrics::DownloadErrorCode::kUnset,
2052 nullptr,
2053 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002054 string post_str(post_data.begin(), post_data.end());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002055 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
2056 string::npos);
2057 if (ping_only) {
2058 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
2059 EXPECT_EQ(post_str.find("previousversion"), string::npos);
2060 } else {
2061 EXPECT_NE(post_str.find("updatecheck"), string::npos);
2062 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07002063 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002064}
2065
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002066TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
2067 PingTest(true /* ping_only */);
2068}
2069
2070TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
2071 PingTest(false /* ping_only */);
2072}
2073
2074TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002075 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002076 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002077 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2078 .Times(AnyNumber());
2079 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002080 int64_t three_days_ago =
2081 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
2082 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002083 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002084 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002085 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002086 .WillOnce(DoAll(SetArgPointee<1>(three_days_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002087 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002088 .WillOnce(DoAll(SetArgPointee<1>(now), 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(),
2091 -1,
2092 false, // 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());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002100 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07002101 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002102}
2103
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002104TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002105 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002106 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002107 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2108 .Times(AnyNumber());
2109 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002110 int64_t four_days_ago =
2111 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
2112 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002113 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002114 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002115 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002116 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002117 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002118 .WillOnce(DoAll(SetArgPointee<1>(four_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002119 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002120 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2121 -1,
2122 false, // ping_only
2123 ErrorCode::kSuccess,
2124 metrics::CheckResult::kNoUpdateAvailable,
2125 metrics::CheckReaction::kUnset,
2126 metrics::DownloadErrorCode::kUnset,
2127 nullptr,
2128 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002129 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002130 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07002131 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002132}
2133
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002134TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002135 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002136 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002137 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2138 .Times(AnyNumber());
2139 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002140 int64_t one_hour_ago =
2141 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002142 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002143 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002144 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002145 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002146 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002147 .WillOnce(DoAll(SetArgPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002148 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
2149 // send a ping.
2150 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2151 .WillOnce(Return(true));
2152 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2153 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002154 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002155 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2156 -1,
2157 false, // ping_only
2158 ErrorCode::kSuccess,
2159 metrics::CheckResult::kNoUpdateAvailable,
2160 metrics::CheckReaction::kUnset,
2161 metrics::DownloadErrorCode::kUnset,
2162 nullptr,
2163 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002164 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002165 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002166}
2167
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002168TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07002169 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08002170 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002171 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07002172 int64_t now = Time::Now().ToInternalValue();
2173 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002174 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002175 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002176 .WillOnce(DoAll(SetArgPointee<1>(now), Return(true)));
Thieu Leb44e9e82011-06-06 14:34:04 -07002177 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2178 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002179 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002180 EXPECT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2181 -1,
2182 true, // ping_only
2183 ErrorCode::kSuccess,
2184 metrics::CheckResult::kUnset,
2185 metrics::CheckReaction::kUnset,
2186 metrics::DownloadErrorCode::kUnset,
2187 nullptr,
2188 &post_data));
Alex Deymo80f70ff2016-02-10 16:08:11 -08002189 EXPECT_EQ(0U, post_data.size());
Thieu Leb44e9e82011-06-06 14:34:04 -07002190}
2191
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002192TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002193 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002194 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002195 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
2196 .Times(AnyNumber());
2197 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002198 int64_t future =
2199 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08002200 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002201 .WillOnce(DoAll(SetArgPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002202 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002203 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002204 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
Ben Chan672c1f52017-10-23 15:41:39 -07002205 .WillOnce(DoAll(SetArgPointee<1>(future), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002206 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
2207 .WillOnce(Return(true));
2208 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
2209 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002210 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002211 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002212 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002213 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002214 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002215 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002216 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002217 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002218 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002219 metrics::CheckResult::kNoUpdateAvailable,
2220 metrics::CheckReaction::kUnset,
2221 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002222 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002223 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002224 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002225 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002226}
2227
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002228TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002229 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07002230 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002231 // may fail if it runs for longer than 5 seconds. It shouldn't run
2232 // that long though.
2233 int64_t midnight =
2234 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
2235 int64_t midnight_slack =
2236 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08002237 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002238 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002239 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2240 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002241 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
2242 AllOf(Ge(midnight), Le(midnight_slack))))
2243 .WillOnce(Return(true));
2244 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
2245 AllOf(Ge(midnight), Le(midnight_slack))))
2246 .WillOnce(Return(true));
2247 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002248 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002249 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002250 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002251 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002252 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002253 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002254 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002255 metrics::CheckResult::kNoUpdateAvailable,
2256 metrics::CheckReaction::kUnset,
2257 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002258 nullptr,
2259 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002260}
2261
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002262TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002263 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002264 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002265 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2266 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002267 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2268 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2269 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002270 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002271 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002272 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002273 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002274 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002275 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002276 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002277 metrics::CheckResult::kNoUpdateAvailable,
2278 metrics::CheckReaction::kUnset,
2279 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002280 nullptr,
2281 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002282}
2283
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002284TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08002285 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002286 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08002287 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
2288 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002289 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
2290 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
2291 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002292 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002293 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002294 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002295 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002296 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002297 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002298 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002299 metrics::CheckResult::kNoUpdateAvailable,
2300 metrics::CheckReaction::kUnset,
2301 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002302 nullptr,
2303 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07002304}
2305
Alex Deymob3fa53b2016-04-18 19:57:58 -07002306TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
2307 // Test that the "eol" flags is only parsed from the "_eol" attribute and not
2308 // the "eol" attribute.
2309 ASSERT_TRUE(
Marton Hunyady2abda312018-04-24 18:21:49 +02002310 TestUpdateCheck("<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
Alex Deymob3fa53b2016-04-18 19:57:58 -07002311 "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
2312 "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
2313 "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
2314 "</app></response>",
2315 -1,
2316 false, // ping_only
2317 ErrorCode::kSuccess,
2318 metrics::CheckResult::kNoUpdateAvailable,
2319 metrics::CheckReaction::kUnset,
2320 metrics::DownloadErrorCode::kUnset,
2321 nullptr,
2322 nullptr));
2323 string eol_pref;
2324 EXPECT_TRUE(
2325 fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
2326 // Note that the eol="eol" attribute should be ignored and the _eol should be
2327 // used instead.
2328 EXPECT_EQ("security-only", eol_pref);
2329}
2330
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002331TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002332 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002333 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07002334 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07002335 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002336 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002337 metrics::CheckResult::kParsingError,
2338 metrics::CheckReaction::kUnset,
2339 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002340 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07002341 &post_data));
2342 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002343 string post_str(post_data.begin(), post_data.end());
Darin Petkov84c763c2010-07-29 16:27:58 -07002344 EXPECT_EQ(post_str.find("machineid="), string::npos);
2345 EXPECT_EQ(post_str.find("userid="), string::npos);
2346}
2347
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002348TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002349 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002350 const int http_error_code =
2351 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Marton Hunyady2abda312018-04-24 18:21:49 +02002352 ASSERT_FALSE(TestUpdateCheck("",
2353 501,
2354 false, // ping_only
2355 static_cast<ErrorCode>(http_error_code),
2356 metrics::CheckResult::kDownloadError,
2357 metrics::CheckReaction::kUnset,
2358 static_cast<metrics::DownloadErrorCode>(501),
2359 &response,
2360 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002361 EXPECT_FALSE(response.update_exists);
2362}
2363
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002364TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07002365 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002366 const int http_error_code =
2367 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Marton Hunyady2abda312018-04-24 18:21:49 +02002368 ASSERT_FALSE(TestUpdateCheck("",
2369 1500,
2370 false, // ping_only
2371 static_cast<ErrorCode>(http_error_code),
2372 metrics::CheckResult::kDownloadError,
2373 metrics::CheckReaction::kUnset,
2374 metrics::DownloadErrorCode::kHttpStatusOther,
2375 &response,
2376 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07002377 EXPECT_FALSE(response.update_exists);
2378}
2379
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002380TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002381 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002382 request_params_.set_wall_clock_based_wait_enabled(true);
2383 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2384 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002385
Sen Jiang7c1171e2016-06-23 11:35:40 -07002386 Time arbitrary_date;
Eric Caruso761be2c2018-05-22 16:23:33 -07002387 ASSERT_TRUE(Time::FromString("6/4/1989", &arbitrary_date));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002388 fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
Marton Hunyady2abda312018-04-24 18:21:49 +02002389 ASSERT_FALSE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002390 -1,
2391 false, // ping_only
2392 ErrorCode::kOmahaUpdateDeferredPerPolicy,
2393 metrics::CheckResult::kUpdateAvailable,
2394 metrics::CheckReaction::kDeferring,
2395 metrics::DownloadErrorCode::kUnset,
2396 &response,
2397 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002398
Ben Chan9abb7632014-08-07 00:10:53 -07002399 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002400 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002401 EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002402 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07002403
2404 // Verify if we are interactive check we don't defer.
Marton Hunyady2abda312018-04-24 18:21:49 +02002405 request_params_.set_interactive(true);
2406 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002407 -1,
2408 false, // ping_only
2409 ErrorCode::kSuccess,
2410 metrics::CheckResult::kUpdateAvailable,
2411 metrics::CheckReaction::kUpdating,
2412 metrics::DownloadErrorCode::kUnset,
2413 &response,
2414 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07002415 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002416}
2417
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002418TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002419 OmahaResponse response;
Marton Hunyady2abda312018-04-24 18:21:49 +02002420 request_params_.set_wall_clock_based_wait_enabled(true);
2421 request_params_.set_waiting_period(TimeDelta().FromDays(1));
2422 request_params_.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002423
Sen Jiang7c1171e2016-06-23 11:35:40 -07002424 Time t1, t2;
Eric Caruso761be2c2018-05-22 16:23:33 -07002425 ASSERT_TRUE(Time::FromString("1/1/2012", &t1));
2426 ASSERT_TRUE(Time::FromString("1/3/2012", &t2));
Sen Jiang7c1171e2016-06-23 11:35:40 -07002427 ASSERT_TRUE(
2428 fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2429 fake_system_state_.fake_clock()->SetWallclockTime(t2);
Marton Hunyady2abda312018-04-24 18:21:49 +02002430 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
Sen Jiang7c1171e2016-06-23 11:35:40 -07002431 -1,
2432 false, // ping_only
2433 ErrorCode::kSuccess,
2434 metrics::CheckResult::kUpdateAvailable,
2435 metrics::CheckReaction::kUpdating,
2436 metrics::DownloadErrorCode::kUnset,
2437 &response,
2438 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002439
2440 EXPECT_TRUE(response.update_exists);
2441
2442 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002443 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002444 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002445 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2446}
2447
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002448TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002449 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002450 base::ScopedTempDir tempdir;
2451 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002452
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002453 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002454 request_params_.set_root(tempdir.GetPath().value());
2455 request_params_.set_app_id("{22222222-2222-2222-2222-222222222222}");
2456 request_params_.set_app_version("1.2.3.4");
2457 request_params_.set_product_components("o.bundle=1");
2458 request_params_.set_current_channel("canary-channel");
2459 EXPECT_TRUE(
2460 request_params_.SetTargetChannel("stable-channel", true, nullptr));
2461 request_params_.UpdateDownloadChannel();
2462 EXPECT_TRUE(request_params_.ShouldPowerwash());
2463 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002464 -1,
2465 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002466 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002467 metrics::CheckResult::kParsingError,
2468 metrics::CheckReaction::kUnset,
2469 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002470 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002471 &post_data));
2472 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002473 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002474 EXPECT_NE(string::npos, post_str.find(
2475 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2476 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2477 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Sen Jiang8cd42342018-01-31 12:06:59 -08002478 EXPECT_EQ(string::npos, post_str.find("o.bundle"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002479}
2480
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002481TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002482 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07002483 base::ScopedTempDir tempdir;
2484 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002485
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002486 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002487 request_params_.set_root(tempdir.GetPath().value());
2488 request_params_.set_app_id("{11111111-1111-1111-1111-111111111111}");
2489 request_params_.set_app_version("5.6.7.8");
2490 request_params_.set_product_components("o.bundle=1");
2491 request_params_.set_current_channel("stable-channel");
2492 EXPECT_TRUE(
2493 request_params_.SetTargetChannel("canary-channel", false, nullptr));
2494 request_params_.UpdateDownloadChannel();
2495 EXPECT_FALSE(request_params_.ShouldPowerwash());
2496 ASSERT_FALSE(TestUpdateCheck("invalid xml>",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002497 -1,
2498 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002499 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002500 metrics::CheckResult::kParsingError,
2501 metrics::CheckReaction::kUnset,
2502 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002503 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002504 &post_data));
2505 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002506 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002507 EXPECT_NE(string::npos, post_str.find(
2508 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2509 "version=\"5.6.7.8\" "
2510 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002511 EXPECT_EQ(string::npos, post_str.find("from_version"));
Sen Jiang8cd42342018-01-31 12:06:59 -08002512 EXPECT_NE(string::npos, post_str.find("o.bundle.version=\"1\""));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002513}
2514
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002515// Checks that the initial ping with a=-1 r=-1 is not send when the device
2516// was powerwashed.
2517TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
2518 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2519
2520 // Flag that the device was powerwashed in the past.
2521 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
2522
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07002523 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002524 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2525 -1,
2526 false, // ping_only
2527 ErrorCode::kSuccess,
2528 metrics::CheckResult::kNoUpdateAvailable,
2529 metrics::CheckReaction::kUnset,
2530 metrics::DownloadErrorCode::kUnset,
2531 nullptr,
2532 &post_data));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002533 // We shouldn't send a ping in this case since powerwash > 0.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08002534 string post_str(post_data.begin(), post_data.end());
Alex Deymoebbe7ef2014-10-30 13:02:49 -07002535 EXPECT_EQ(string::npos, post_str.find("<ping"));
2536}
2537
Amin Hassani1677e812017-06-21 13:36:36 -07002538// Checks that the initial ping with a=-1 r=-1 is not send when the device
2539// first_active_omaha_ping_sent is set.
2540TEST_F(OmahaRequestActionTest, PingWhenFirstActiveOmahaPingIsSent) {
2541 fake_prefs_.SetString(kPrefsPreviousVersion, "");
2542
2543 // Flag that the device was not powerwashed in the past.
2544 fake_system_state_.fake_hardware()->SetPowerwashCount(0);
2545
2546 // Flag that the device has sent first active ping in the past.
2547 fake_system_state_.fake_hardware()->SetFirstActiveOmahaPingSent();
2548
2549 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002550 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2551 -1,
2552 false, // ping_only
2553 ErrorCode::kSuccess,
2554 metrics::CheckResult::kNoUpdateAvailable,
2555 metrics::CheckReaction::kUnset,
2556 metrics::DownloadErrorCode::kUnset,
2557 nullptr,
2558 &post_data));
Amin Hassani1677e812017-06-21 13:36:36 -07002559 // We shouldn't send a ping in this case since
2560 // first_active_omaha_ping_sent=true
2561 string post_str(post_data.begin(), post_data.end());
2562 EXPECT_EQ(string::npos, post_str.find("<ping"));
2563}
2564
Alex Deymo9fded1e2015-11-05 12:31:19 -08002565// Checks that the event 54 is sent on a reboot to a new update.
2566TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
2567 // Flag that the device was updated in a previous boot.
2568 fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
2569
2570 brillo::Blob post_data;
Marton Hunyady2abda312018-04-24 18:21:49 +02002571 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetNoUpdateResponse(),
2572 -1,
2573 false, // ping_only
2574 ErrorCode::kSuccess,
2575 metrics::CheckResult::kNoUpdateAvailable,
2576 metrics::CheckReaction::kUnset,
2577 metrics::DownloadErrorCode::kUnset,
2578 nullptr,
2579 &post_data));
Alex Deymo9fded1e2015-11-05 12:31:19 -08002580 string post_str(post_data.begin(), post_data.end());
2581
2582 // An event 54 is included and has the right version.
2583 EXPECT_NE(string::npos,
2584 post_str.find(base::StringPrintf(
2585 "<event eventtype=\"%d\"",
2586 OmahaEvent::kTypeRebootedAfterUpdate)));
2587 EXPECT_NE(string::npos,
2588 post_str.find("previousversion=\"1.2.3.4\"></event>"));
2589
2590 // The previous version flag should have been removed.
2591 EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
2592 string prev_version;
2593 EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
2594 EXPECT_TRUE(prev_version.empty());
2595}
2596
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002597void OmahaRequestActionTest::P2PTest(
2598 bool initial_allow_p2p_for_downloading,
2599 bool initial_allow_p2p_for_sharing,
2600 bool omaha_disable_p2p_for_downloading,
2601 bool omaha_disable_p2p_for_sharing,
2602 bool payload_state_allow_p2p_attempt,
2603 bool expect_p2p_client_lookup,
2604 const string& p2p_client_result_url,
2605 bool expected_allow_p2p_for_downloading,
2606 bool expected_allow_p2p_for_sharing,
2607 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07002608 OmahaResponse response;
Gilad Arnold74b5f552014-10-07 08:17:16 -07002609 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
2610 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
2611 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07002612
2613 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002614 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07002615 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2616 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07002617 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
2618 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
2619 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
2620 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
2621 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
2622 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
2623 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
2624 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
2625 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
2626 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
2627
David Zeuthen8f191b22013-08-06 12:27:50 -07002628 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002629 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07002630 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2631
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002632 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2633 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002634 .Times(expect_p2p_client_lookup ? 1 : 0);
2635
Alex Deymo8e18f932015-03-27 16:16:59 -07002636 fake_update_response_.disable_p2p_for_downloading =
2637 omaha_disable_p2p_for_downloading;
2638 fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
Marton Hunyady2abda312018-04-24 18:21:49 +02002639 ASSERT_TRUE(TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2640 -1,
2641 false, // ping_only
2642 ErrorCode::kSuccess,
2643 metrics::CheckResult::kUpdateAvailable,
2644 metrics::CheckReaction::kUpdating,
2645 metrics::DownloadErrorCode::kUnset,
2646 &response,
2647 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002648 EXPECT_TRUE(response.update_exists);
2649
Gilad Arnold74b5f552014-10-07 08:17:16 -07002650 EXPECT_EQ(omaha_disable_p2p_for_downloading,
2651 response.disable_p2p_for_downloading);
2652 EXPECT_EQ(omaha_disable_p2p_for_sharing,
2653 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07002654
Gilad Arnold74b5f552014-10-07 08:17:16 -07002655 EXPECT_EQ(expected_allow_p2p_for_downloading,
2656 actual_allow_p2p_for_downloading);
2657 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
2658 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07002659}
2660
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002661TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002662 P2PTest(true, // initial_allow_p2p_for_downloading
2663 true, // initial_allow_p2p_for_sharing
2664 false, // omaha_disable_p2p_for_downloading
2665 false, // omaha_disable_p2p_for_sharing
2666 true, // payload_state_allow_p2p_attempt
2667 true, // expect_p2p_client_lookup
2668 "http://1.3.5.7/p2p", // p2p_client_result_url
2669 true, // expected_allow_p2p_for_downloading
2670 true, // expected_allow_p2p_for_sharing
2671 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002672}
2673
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002674TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002675 P2PTest(true, // initial_allow_p2p_for_downloading
2676 true, // initial_allow_p2p_for_sharing
2677 false, // omaha_disable_p2p_for_downloading
2678 false, // omaha_disable_p2p_for_sharing
2679 true, // payload_state_allow_p2p_attempt
2680 true, // expect_p2p_client_lookup
2681 "", // p2p_client_result_url
2682 false, // expected_allow_p2p_for_downloading
2683 true, // expected_allow_p2p_for_sharing
2684 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002685}
2686
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002687TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002688 P2PTest(false, // initial_allow_p2p_for_downloading
2689 true, // initial_allow_p2p_for_sharing
2690 false, // omaha_disable_p2p_for_downloading
2691 false, // omaha_disable_p2p_for_sharing
2692 true, // payload_state_allow_p2p_attempt
2693 false, // expect_p2p_client_lookup
2694 "unset", // p2p_client_result_url
2695 false, // expected_allow_p2p_for_downloading
2696 true, // expected_allow_p2p_for_sharing
2697 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002698}
2699
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002700TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002701 P2PTest(true, // initial_allow_p2p_for_downloading
2702 true, // initial_allow_p2p_for_sharing
2703 true, // omaha_disable_p2p_for_downloading
2704 false, // omaha_disable_p2p_for_sharing
2705 true, // payload_state_allow_p2p_attempt
2706 false, // expect_p2p_client_lookup
2707 "unset", // p2p_client_result_url
2708 false, // expected_allow_p2p_for_downloading
2709 true, // expected_allow_p2p_for_sharing
2710 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002711}
2712
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002713TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002714 P2PTest(true, // initial_allow_p2p_for_downloading
2715 true, // initial_allow_p2p_for_sharing
2716 false, // omaha_disable_p2p_for_downloading
2717 true, // omaha_disable_p2p_for_sharing
2718 true, // payload_state_allow_p2p_attempt
2719 true, // expect_p2p_client_lookup
2720 "http://1.3.5.7/p2p", // p2p_client_result_url
2721 true, // expected_allow_p2p_for_downloading
2722 false, // expected_allow_p2p_for_sharing
2723 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002724}
2725
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002726TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002727 P2PTest(true, // initial_allow_p2p_for_downloading
2728 true, // initial_allow_p2p_for_sharing
2729 true, // omaha_disable_p2p_for_downloading
2730 true, // omaha_disable_p2p_for_sharing
2731 true, // payload_state_allow_p2p_attempt
2732 false, // expect_p2p_client_lookup
2733 "unset", // p2p_client_result_url
2734 false, // expected_allow_p2p_for_downloading
2735 false, // expected_allow_p2p_for_sharing
2736 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002737}
2738
Alex Deymof329b932014-10-30 01:37:48 -07002739bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2740 OmahaResponse *response) {
Alex Deymo8e18f932015-03-27 16:16:59 -07002741 fake_update_response_.elapsed_days = elapsed_days;
Marton Hunyady2abda312018-04-24 18:21:49 +02002742 return TestUpdateCheck(fake_update_response_.GetUpdateResponse(),
2743 -1,
2744 false, // ping_only
2745 ErrorCode::kSuccess,
2746 metrics::CheckResult::kUpdateAvailable,
2747 metrics::CheckReaction::kUpdating,
2748 metrics::DownloadErrorCode::kUnset,
2749 response,
2750 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002751}
2752
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002753TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002754 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002755
Kevin Cernekee2494e282016-03-29 18:03:53 -07002756 // Simulate a successful update check that happens during OOBE. The
2757 // deadline in the response is needed to force the update attempt to
2758 // occur; responses without a deadline seen during OOBE will normally
2759 // return ErrorCode::kNonCriticalUpdateInOOBE.
2760 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
2761 fake_update_response_.deadline = "20101020";
2762
David Zeuthen639aa362014-02-03 16:23:44 -08002763 // Check that we parse elapsed_days in the Omaha Response correctly.
2764 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002765 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2766 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002767 EXPECT_TRUE(response.update_exists);
2768 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002769 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002770 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002771 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002772 EXPECT_EQ(prefs_days, 42);
2773
2774 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002775 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002776 EXPECT_TRUE(response.update_exists);
2777 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002778 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002779 EXPECT_EQ(prefs_days, 42);
2780
2781 // Note that elapsed_days is not necessarily divisible by 7 so check
2782 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002783 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2784 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002785 EXPECT_TRUE(response.update_exists);
2786 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002787 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002788 EXPECT_EQ(prefs_days, 21);
2789
2790 // Check that we correctly handle elapsed_days not being included in
2791 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002792 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002793 EXPECT_TRUE(response.update_exists);
2794 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002795}
2796
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002797// If there is no prefs and OOBE is not complete, we should not
2798// report anything to Omaha.
2799TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
Kevin Cernekee2494e282016-03-29 18:03:53 -07002800 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002801 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2802 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2803}
David Zeuthen639aa362014-02-03 16:23:44 -08002804
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002805// If OOBE is complete and happened on a valid date (e.g. after Jan
2806// 1 2007 0:00 PST), that date should be used and written to
2807// prefs. However, first try with an invalid date and check we do
2808// nothing.
2809TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2810 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2811 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2812 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2813 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2814}
David Zeuthen639aa362014-02-03 16:23:44 -08002815
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002816// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2817// should yield an InstallDate of 14.
2818TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2819 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2820 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2821 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2822 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002823
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002824 int64_t prefs_days;
2825 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2826 EXPECT_EQ(prefs_days, 14);
2827}
David Zeuthen639aa362014-02-03 16:23:44 -08002828
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002829// Now that we have a valid date in prefs, check that we keep using
2830// that even if OOBE date reports something else. The date Jan 30,
2831// 2007 0:00 PST should yield an InstallDate of 28... but since
2832// there's a prefs file, we should still get 14.
2833TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2834 // Set a valid date in the prefs first.
2835 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002836
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002837 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2838 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2839 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002840
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002841 int64_t prefs_days;
2842 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2843 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002844
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002845 // If we delete the prefs file, we should get 28 days.
2846 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2847 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2848 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2849 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002850}
2851
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002852// Verifies that a device with no device policy, and is not a consumer
2853// device sets the max kernel key version to the current version.
2854// ie. the same behavior as if rollback is enabled.
2855TEST_F(OmahaRequestActionTest, NoPolicyEnterpriseDevicesSetMaxRollback) {
2856 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2857
2858 // Setup and verify some initial default values for the kernel TPM
2859 // values that control verified boot and rollback.
2860 const int min_kernel_version = 4;
2861 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2862 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2863 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2864 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2865
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002866 EXPECT_CALL(
2867 *fake_system_state_.mock_metrics_reporter(),
2868 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2869 .Times(1);
2870
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002871 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002872 TestRollbackCheck(false /* is_consumer_device */,
2873 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002874 false /* is_policy_loaded */,
2875 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002876
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002877 // Verify kernel_max_rollforward was set to the current minimum
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002878 // kernel key version. This has the effect of freezing roll
2879 // forwards indefinitely. This will hold the rollback window
2880 // open until a future change will be able to move this forward
2881 // relative the configured window.
2882 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2883 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2884}
2885
2886// Verifies that a conmsumer device with no device policy sets the
2887// max kernel key version to the current version. ie. the same
2888// behavior as if rollback is enabled.
2889TEST_F(OmahaRequestActionTest, NoPolicyConsumerDevicesSetMaxRollback) {
2890 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2891
2892 // Setup and verify some initial default values for the kernel TPM
2893 // values that control verified boot and rollback.
2894 const int min_kernel_version = 3;
2895 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2896 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2897 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2898 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2899
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002900 EXPECT_CALL(
2901 *fake_system_state_.mock_metrics_reporter(),
2902 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2903 .Times(1);
2904
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002905 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002906 TestRollbackCheck(true /* is_consumer_device */,
2907 3 /* rollback_allowed_milestones */,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002908 false /* is_policy_loaded */,
2909 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002910
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002911 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002912 // was set to logical infinity. This is the expected behavior for
2913 // consumer devices and matches the existing behavior prior to the
2914 // rollback features.
2915 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2916 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2917}
2918
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002919// Verifies that a device with rollback enabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002920// in the TPM to prevent roll forward.
2921TEST_F(OmahaRequestActionTest, RollbackEnabledDevicesSetMaxRollback) {
2922 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2923
2924 // Setup and verify some initial default values for the kernel TPM
2925 // values that control verified boot and rollback.
2926 const int allowed_milestones = 4;
2927 const int min_kernel_version = 3;
2928 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2929 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2930 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2931 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2932
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002933 EXPECT_CALL(
2934 *fake_system_state_.mock_metrics_reporter(),
2935 ReportKeyVersionMetrics(min_kernel_version, min_kernel_version, true))
2936 .Times(1);
2937
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002938 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002939 TestRollbackCheck(false /* is_consumer_device */,
2940 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002941 true /* is_policy_loaded */,
2942 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002943
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002944 // Verify that with rollback enabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002945 // was set to the current minimum kernel key version. This has
2946 // the effect of freezing roll forwards indefinitely. This will
2947 // hold the rollback window open until a future change will
2948 // be able to move this forward relative the configured window.
2949 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2950 EXPECT_EQ(min_kernel_version, fake_hw->GetMaxKernelKeyRollforward());
2951}
2952
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002953// Verifies that a device with rollback disabled sets kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002954// in the TPM to logical infinity, to allow roll forward.
2955TEST_F(OmahaRequestActionTest, RollbackDisabledDevicesSetMaxRollback) {
2956 FakeHardware* fake_hw = fake_system_state_.fake_hardware();
2957
2958 // Setup and verify some initial default values for the kernel TPM
2959 // values that control verified boot and rollback.
2960 const int allowed_milestones = 0;
2961 const int min_kernel_version = 3;
2962 fake_hw->SetMinKernelKeyVersion(min_kernel_version);
2963 fake_hw->SetMaxKernelKeyRollforward(kRollforwardInfinity);
2964 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2965 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2966
Marton Hunyadyffbfdfb2018-05-30 13:03:29 +02002967 EXPECT_CALL(
2968 *fake_system_state_.mock_metrics_reporter(),
2969 ReportKeyVersionMetrics(min_kernel_version, kRollforwardInfinity, true))
2970 .Times(1);
2971
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002972 OmahaResponse response;
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002973 TestRollbackCheck(false /* is_consumer_device */,
2974 allowed_milestones,
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002975 true /* is_policy_loaded */,
2976 &response);
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002977
Zentaro Kavanagh5d956152018-05-15 09:40:33 -07002978 // Verify that with rollback disabled that kernel_max_rollforward
Zentaro Kavanagh1f899d52018-02-27 15:02:47 -08002979 // was set to logical infinity.
2980 EXPECT_EQ(min_kernel_version, fake_hw->GetMinKernelKeyVersion());
2981 EXPECT_EQ(kRollforwardInfinity, fake_hw->GetMaxKernelKeyRollforward());
2982}
2983
Zentaro Kavanagh0ff621c2018-07-13 13:06:56 -07002984TEST_F(OmahaRequestActionTest, RollbackResponseParsedNoEntries) {
2985 OmahaResponse response;
2986 fake_update_response_.rollback = true;
2987 TestRollbackCheck(false /* is_consumer_device */,
2988 4 /* rollback_allowed_milestones */,
2989 true /* is_policy_loaded */,
2990 &response);
2991 EXPECT_TRUE(response.is_rollback);
2992}
2993
2994TEST_F(OmahaRequestActionTest, RollbackResponseValidVersionsParsed) {
2995 OmahaResponse response;
2996 fake_update_response_.rollback_firmware_version = "1.2";
2997 fake_update_response_.rollback_kernel_version = "3.4";
2998 fake_update_response_.rollback = true;
2999 TestRollbackCheck(false /* is_consumer_device */,
3000 4 /* rollback_allowed_milestones */,
3001 true /* is_policy_loaded */,
3002 &response);
3003 EXPECT_TRUE(response.is_rollback);
3004 EXPECT_EQ(1, response.rollback_key_version.firmware_key);
3005 EXPECT_EQ(2, response.rollback_key_version.firmware);
3006 EXPECT_EQ(3, response.rollback_key_version.kernel_key);
3007 EXPECT_EQ(4, response.rollback_key_version.kernel);
3008}
3009
Darin Petkov6a5b3222010-07-13 14:55:28 -07003010} // namespace chromeos_update_engine