blob: 74e536144a7aa3e15e902cc4bc841c8b6b0cc87f [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
Darin Petkov6a5b3222010-07-13 14:55:28 -070021#include <string>
22#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070023
Alex Deymo60ca1a72015-06-18 18:19:15 -070024#include <base/bind.h>
Alex Deymo110e0302015-10-19 20:35:21 -070025#include <base/files/file_util.h>
Sen Jiang297e5832016-03-17 14:45:51 -070026#include <base/files/scoped_temp_dir.h>
Alex Deymo8e18f932015-03-27 16:16:59 -070027#include <base/strings/string_number_conversions.h>
Alex Vakulenko75039d72014-03-25 12:36:28 -070028#include <base/strings/string_util.h>
29#include <base/strings/stringprintf.h>
30#include <base/time/time.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070031#include <brillo/bind_lambda.h>
Alex Deymoc1c17b42015-11-23 03:53:15 -030032#include <brillo/make_unique_ptr.h>
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -070033#include <brillo/message_loops/fake_message_loop.h>
34#include <brillo/message_loops/message_loop.h>
35#include <brillo/message_loops/message_loop_utils.h>
Alex Deymoe1e3afe2014-10-30 13:02:49 -070036#include <gtest/gtest.h>
Jay Srinivasand29695d2013-04-08 15:08:05 -070037
Alex Deymo39910dc2015-11-09 17:04:30 -080038#include "update_engine/common/action_pipe.h"
39#include "update_engine/common/constants.h"
40#include "update_engine/common/fake_prefs.h"
41#include "update_engine/common/hash_calculator.h"
42#include "update_engine/common/mock_http_fetcher.h"
43#include "update_engine/common/platform_constants.h"
44#include "update_engine/common/prefs.h"
45#include "update_engine/common/test_utils.h"
Alex Deymoc1c17b42015-11-23 03:53:15 -030046#include "update_engine/fake_system_state.h"
Alex Deymo38429cf2015-11-11 18:27:22 -080047#include "update_engine/metrics.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070048#include "update_engine/mock_connection_manager.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070049#include "update_engine/mock_payload_state.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070050#include "update_engine/omaha_request_params.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070051
Darin Petkov1cbd78f2010-07-29 12:38:34 -070052using base::Time;
53using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070054using std::string;
55using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070057using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070058using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070059using testing::Ge;
60using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080061using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070062using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070063using testing::ReturnPointee;
64using testing::SaveArg;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070065using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070066using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070067
Alex Deymo8e18f932015-03-27 16:16:59 -070068namespace {
69
Alex Deymo85616652015-10-15 18:48:31 -070070const char kTestAppId[] = "test-app-id";
71
Alex Deymo8e18f932015-03-27 16:16:59 -070072// This is a helper struct to allow unit tests build an update response with the
73// values they care about.
74struct FakeUpdateResponse {
75 string GetNoUpdateResponse() const {
76 string entity_str;
77 if (include_entity)
78 entity_str = "<!DOCTYPE response [<!ENTITY CrOS \"ChromeOS\">]>";
Alex Deymo00d79ac2015-06-29 15:41:49 -070079 return
80 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" +
81 entity_str + "<response protocol=\"3.0\">"
Alex Deymo8e18f932015-03-27 16:16:59 -070082 "<daystart elapsed_seconds=\"100\"/>"
Alex Deymo00d79ac2015-06-29 15:41:49 -070083 "<app appid=\"" + app_id + "\" " +
84 (include_cohorts ? "cohort=\"" + cohort + "\" cohorthint=\"" +
85 cohorthint + "\" cohortname=\"" + cohortname + "\" " : "") +
86 " status=\"ok\">"
87 "<ping status=\"ok\"/>"
88 "<updatecheck status=\"noupdate\"/></app></response>";
Alex Deymo8e18f932015-03-27 16:16:59 -070089 }
90
91 string GetUpdateResponse() const {
Sen Jiang2703ef42017-03-16 13:36:21 -070092 return "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
93 "protocol=\"3.0\">"
94 "<daystart elapsed_seconds=\"100\"" +
95 (elapsed_days.empty() ? ""
96 : (" elapsed_days=\"" + elapsed_days + "\"")) +
97 "/>"
98 "<app appid=\"" +
99 app_id + "\" " +
100 (include_cohorts
101 ? "cohort=\"" + cohort + "\" cohorthint=\"" + cohorthint +
102 "\" cohortname=\"" + cohortname + "\" "
103 : "") +
104 " status=\"ok\">"
105 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
106 "<urls><url codebase=\"" +
107 codebase +
108 "\"/></urls>"
109 "<manifest version=\"" +
110 version +
111 "\">"
112 "<packages><package hash=\"not-used\" name=\"" +
113 filename + "\" size=\"" + base::Int64ToString(size) +
114 "\" hash_sha256=\"" + hash +
115 "\"/></packages>"
116 "<actions><action event=\"postinstall\" "
117 "ChromeOSVersion=\"" +
118 version + "\" MoreInfo=\"" + more_info_url + "\" Prompt=\"" +
119 prompt +
120 "\" "
121 "IsDelta=\"true\" "
122 "IsDeltaPayload=\"true\" "
123 "MaxDaysToScatter=\"" +
124 max_days_to_scatter +
125 "\" "
126 "sha256=\"not-used\" "
127 "needsadmin=\"" +
128 needsadmin + "\" " +
129 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
130 (disable_p2p_for_downloading ? "DisableP2PForDownloading=\"true\" "
131 : "") +
132 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
133 "/></actions></manifest></updatecheck></app></response>";
Alex Deymo8e18f932015-03-27 16:16:59 -0700134 }
135
136 // Return the payload URL, which is split in two fields in the XML response.
137 string GetPayloadUrl() {
138 return codebase + filename;
139 }
140
Alex Deymo85616652015-10-15 18:48:31 -0700141 string app_id = kTestAppId;
Alex Deymo8e18f932015-03-27 16:16:59 -0700142 string version = "1.2.3.4";
143 string more_info_url = "http://more/info";
144 string prompt = "true";
145 string codebase = "http://code/base/";
146 string filename = "file.signed";
Sen Jiang2703ef42017-03-16 13:36:21 -0700147 string hash = "4841534831323334";
Alex Deymo8e18f932015-03-27 16:16:59 -0700148 string needsadmin = "false";
149 int64_t size = 123;
150 string deadline = "";
151 string max_days_to_scatter = "7";
152 string elapsed_days = "42";
153
154 // P2P setting defaults to allowed.
155 bool disable_p2p_for_downloading = false;
156 bool disable_p2p_for_sharing = false;
157
158 // Omaha cohorts settings.
159 bool include_cohorts = false;
160 string cohort = "";
161 string cohorthint = "";
162 string cohortname = "";
163
164 // Whether to include the CrOS <!ENTITY> in the XML response.
165 bool include_entity = false;
166};
167
168} // namespace
169
Darin Petkov6a5b3222010-07-13 14:55:28 -0700170namespace chromeos_update_engine {
171
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700172class OmahaRequestActionTest : public ::testing::Test {
173 protected:
Alex Deymo610277e2014-11-11 21:18:11 -0800174 void SetUp() override {
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700175 fake_system_state_.set_request_params(&request_params_);
176 fake_system_state_.set_prefs(&fake_prefs_);
177 }
178
179 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -0800180 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700181 // is used. |payload_state| may be null, in which case a local mock is used.
182 // |p2p_manager| may be null, in which case a local mock is used.
183 // |connection_manager| may be null, in which case a local mock is used.
184 // out_response may be null. If |fail_http_response_code| is non-negative,
185 // the transfer will fail with that code. |ping_only| is passed through to the
186 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
187 // post-data received by the mock HttpFetcher is returned.
188 //
189 // The |expected_check_result|, |expected_check_reaction| and
190 // |expected_error_code| parameters are for checking expectations
191 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
192 // UMA statistics. Use the appropriate ::kUnset value to specify that
193 // the given metric should not be reported.
194 bool TestUpdateCheck(OmahaRequestParams* request_params,
195 const string& http_response,
196 int fail_http_response_code,
197 bool ping_only,
198 ErrorCode expected_code,
199 metrics::CheckResult expected_check_result,
200 metrics::CheckReaction expected_check_reaction,
201 metrics::DownloadErrorCode expected_download_error_code,
202 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700203 brillo::Blob* out_post_data);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700204
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -0800205 // Runs and checks a ping test. |ping_only| indicates whether it should send
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700206 // only a ping or also an updatecheck.
207 void PingTest(bool ping_only);
208
209 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -0700210 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700211 OmahaResponse *response);
212
213 // P2P test helper function.
214 void P2PTest(
215 bool initial_allow_p2p_for_downloading,
216 bool initial_allow_p2p_for_sharing,
217 bool omaha_disable_p2p_for_downloading,
218 bool omaha_disable_p2p_for_sharing,
219 bool payload_state_allow_p2p_attempt,
220 bool expect_p2p_client_lookup,
221 const string& p2p_client_result_url,
222 bool expected_allow_p2p_for_downloading,
223 bool expected_allow_p2p_for_sharing,
224 const string& expected_p2p_url);
225
226 FakeSystemState fake_system_state_;
Alex Deymo8e18f932015-03-27 16:16:59 -0700227 FakeUpdateResponse fake_update_response_;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700228
229 // By default, all tests use these objects unless they replace them in the
230 // fake_system_state_.
231 OmahaRequestParams request_params_ = OmahaRequestParams{
232 &fake_system_state_,
Alex Deymoac41a822015-09-15 20:52:53 -0700233 constants::kOmahaPlatformName,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700234 OmahaRequestParams::kOsVersion,
235 "service_pack",
236 "x86-generic",
Alex Deymo85616652015-10-15 18:48:31 -0700237 kTestAppId,
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700238 "0.1.0.0",
239 "en-US",
240 "unittest",
241 "OEM MODEL 09235 7471",
242 "ChromeOSFirmware.1.0",
243 "0X0A1",
244 false, // delta okay
245 false, // interactive
246 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -0700247 ""}; // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700248
249 FakePrefs fake_prefs_;
250};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700251
252namespace {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700253class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
254 public:
255 OmahaRequestActionTestProcessorDelegate()
Alex Deymo60ca1a72015-06-18 18:19:15 -0700256 : expected_code_(ErrorCode::kSuccess) {}
Alex Deymo610277e2014-11-11 21:18:11 -0800257 ~OmahaRequestActionTestProcessorDelegate() override {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700258 }
Yunlian Jiang35866ed2015-01-29 13:09:20 -0800259 void ProcessingDone(const ActionProcessor* processor,
260 ErrorCode code) override {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700261 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -0700262 }
263
Yunlian Jiang35866ed2015-01-29 13:09:20 -0800264 void ActionCompleted(ActionProcessor* processor,
265 AbstractAction* action,
266 ErrorCode code) override {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700267 // make sure actions always succeed
268 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700269 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700270 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700271 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700272 }
David Zeuthena99981f2013-04-29 13:42:47 -0700273 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700274};
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700275} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700276
277class OutputObjectCollectorAction;
278
279template<>
280class ActionTraits<OutputObjectCollectorAction> {
281 public:
282 // Does not take an object for input
283 typedef OmahaResponse InputObjectType;
284 // On success, puts the output path on output
285 typedef NoneType OutputObjectType;
286};
287
288class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
289 public:
290 OutputObjectCollectorAction() : has_input_object_(false) {}
291 void PerformAction() {
292 // copy input object
293 has_input_object_ = HasInputObject();
294 if (has_input_object_)
295 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700296 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700297 }
298 // Should never be called
299 void TerminateProcessing() {
300 CHECK(false);
301 }
302 // Debugging/logging
Alex Deymof329b932014-10-30 01:37:48 -0700303 static string StaticType() {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700304 return "OutputObjectCollectorAction";
305 }
Alex Deymof329b932014-10-30 01:37:48 -0700306 string Type() const { return StaticType(); }
Alex Vakulenko0057daa2016-01-23 16:22:50 -0800307 using InputObjectType =
308 ActionTraits<OutputObjectCollectorAction>::InputObjectType;
309 using OutputObjectType =
310 ActionTraits<OutputObjectCollectorAction>::OutputObjectType;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700311 bool has_input_object_;
312 OmahaResponse omaha_response_;
313};
314
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700315bool OmahaRequestActionTest::TestUpdateCheck(
316 OmahaRequestParams* request_params,
317 const string& http_response,
318 int fail_http_response_code,
319 bool ping_only,
320 ErrorCode expected_code,
321 metrics::CheckResult expected_check_result,
322 metrics::CheckReaction expected_check_reaction,
323 metrics::DownloadErrorCode expected_download_error_code,
324 OmahaResponse* out_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700325 brillo::Blob* out_post_data) {
326 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700327 loop.SetAsCurrent();
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700328 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800329 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700330 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700331 if (fail_http_response_code >= 0) {
332 fetcher->FailTransfer(fail_http_response_code);
333 }
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700334 if (request_params)
335 fake_system_state_.set_request_params(request_params);
336 OmahaRequestAction action(&fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700337 nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -0300338 brillo::make_unique_ptr(fetcher),
Darin Petkov265f2902011-05-09 15:17:40 -0700339 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700340 OmahaRequestActionTestProcessorDelegate delegate;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700341 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700342
Darin Petkov6a5b3222010-07-13 14:55:28 -0700343 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700344 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700345 processor.EnqueueAction(&action);
346
347 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700348 BondActions(&action, &collector_action);
349 processor.EnqueueAction(&collector_action);
350
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700351 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800352 .Times(AnyNumber());
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700353 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800354 SendEnumToUMA(metrics::kMetricCheckResult,
355 static_cast<int>(expected_check_result),
356 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
357 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700358 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800359 SendEnumToUMA(metrics::kMetricCheckReaction,
360 static_cast<int>(expected_check_reaction),
361 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
362 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700363 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700364 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
365 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800366 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
367 ? 0 : 1);
368
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700369 loop.PostTask(base::Bind(
370 [](ActionProcessor* processor) { processor->StartProcessing(); },
371 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700372 loop.Run();
Alex Deymo60ca1a72015-06-18 18:19:15 -0700373 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700374 if (collector_action.has_input_object_ && out_response)
375 *out_response = collector_action.omaha_response_;
376 if (out_post_data)
377 *out_post_data = fetcher->post_data();
378 return collector_action.has_input_object_;
379}
380
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700381// Tests Event requests -- they should always succeed. |out_post_data|
382// may be null; if non-null, the post-data received by the mock
383// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700384void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700385 OmahaEvent* event,
386 const string& http_response,
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700387 brillo::Blob* out_post_data) {
388 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700389 loop.SetAsCurrent();
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700390 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800391 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700392 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700393 FakeSystemState fake_system_state;
394 fake_system_state.set_request_params(&params);
Alex Deymoc1c17b42015-11-23 03:53:15 -0300395 OmahaRequestAction action(&fake_system_state,
396 event,
397 brillo::make_unique_ptr(fetcher),
398 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700399 OmahaRequestActionTestProcessorDelegate delegate;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700400 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700401 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700402 processor.EnqueueAction(&action);
403
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700404 loop.PostTask(base::Bind(
405 [](ActionProcessor* processor) { processor->StartProcessing(); },
406 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700407 loop.Run();
Alex Deymo72a25672016-03-23 15:44:39 -0700408 EXPECT_FALSE(loop.PendingTasks());
Alex Deymo60ca1a72015-06-18 18:19:15 -0700409
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700410 if (out_post_data)
411 *out_post_data = fetcher->post_data();
412}
413
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700414TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400415 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700416 fake_update_response_.include_entity = true;
David Zeuthenf3e28012014-08-26 18:23:52 -0400417 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700418 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -0700419 fake_update_response_.GetNoUpdateResponse(),
David Zeuthenf3e28012014-08-26 18:23:52 -0400420 -1,
421 false, // ping_only
422 ErrorCode::kOmahaRequestXMLHasEntityDecl,
423 metrics::CheckResult::kParsingError,
424 metrics::CheckReaction::kUnset,
425 metrics::DownloadErrorCode::kUnset,
426 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700427 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400428 EXPECT_FALSE(response.update_exists);
429}
430
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700431TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700432 OmahaResponse response;
433 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700434 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -0700435 fake_update_response_.GetNoUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -0700436 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700437 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700438 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800439 metrics::CheckResult::kNoUpdateAvailable,
440 metrics::CheckReaction::kUnset,
441 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700442 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700443 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700444 EXPECT_FALSE(response.update_exists);
445}
446
Alex Deymo8e18f932015-03-27 16:16:59 -0700447// Test that all the values in the response are parsed in a normal update
448// response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700449TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700450 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -0700451 fake_update_response_.deadline = "20101020";
Darin Petkov6a5b3222010-07-13 14:55:28 -0700452 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700453 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -0700454 fake_update_response_.GetUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -0700455 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700456 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700457 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800458 metrics::CheckResult::kUpdateAvailable,
459 metrics::CheckReaction::kUpdating,
460 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700461 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700462 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700463 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700464 EXPECT_TRUE(response.update_exists);
Alex Deymo8e18f932015-03-27 16:16:59 -0700465 EXPECT_EQ(fake_update_response_.version, response.version);
466 EXPECT_EQ(fake_update_response_.GetPayloadUrl(), response.payload_urls[0]);
467 EXPECT_EQ(fake_update_response_.more_info_url, response.more_info_url);
468 EXPECT_EQ(fake_update_response_.hash, response.hash);
469 EXPECT_EQ(fake_update_response_.size, response.size);
470 EXPECT_EQ(fake_update_response_.prompt == "true", response.prompt);
471 EXPECT_EQ(fake_update_response_.deadline, response.deadline);
472 // Omaha cohort attribets are not set in the response, so they should not be
473 // persisted.
474 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohort));
475 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortHint));
476 EXPECT_FALSE(fake_prefs_.Exists(kPrefsOmahaCohortName));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700477}
478
Alex Deymo14ad88e2016-06-29 12:30:14 -0700479TEST_F(OmahaRequestActionTest, ExtraHeadersSentTest) {
480 const string http_response = "<?xml invalid response";
481 request_params_.set_interactive(true);
482
483 brillo::FakeMessageLoop loop(nullptr);
484 loop.SetAsCurrent();
485
486 MockHttpFetcher* fetcher =
487 new MockHttpFetcher(http_response.data(), http_response.size(), nullptr);
488 OmahaRequestAction action(
489 &fake_system_state_, nullptr, brillo::make_unique_ptr(fetcher), false);
490 ActionProcessor processor;
491 processor.EnqueueAction(&action);
492
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700493 loop.PostTask(base::Bind(
494 [](ActionProcessor* processor) { processor->StartProcessing(); },
495 base::Unretained(&processor)));
Alex Deymo14ad88e2016-06-29 12:30:14 -0700496 loop.Run();
497 EXPECT_FALSE(loop.PendingTasks());
498
499 // Check that the headers were set in the fetcher during the action. Note that
500 // we set this request as "interactive".
501 EXPECT_EQ("fg", fetcher->GetHeader("X-GoogleUpdate-Interactivity"));
502 EXPECT_EQ(kTestAppId, fetcher->GetHeader("X-GoogleUpdate-AppId"));
503 EXPECT_NE("", fetcher->GetHeader("X-GoogleUpdate-Updater"));
504}
505
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700506TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700507 OmahaResponse response;
508 // Set up a connection manager that doesn't allow a valid update over
509 // the current ethernet connection.
Alex Deymof6ee0162015-07-31 12:35:22 -0700510 MockConnectionManager mock_cm;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700511 fake_system_state_.set_connection_manager(&mock_cm);
512
Alex Deymo30534502015-07-20 15:06:33 -0700513 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _))
514 .WillRepeatedly(
Sen Jiang255e22b2016-05-20 16:15:29 -0700515 DoAll(SetArgumentPointee<0>(ConnectionType::kEthernet),
516 SetArgumentPointee<1>(ConnectionTethering::kUnknown),
Alex Deymo30534502015-07-20 15:06:33 -0700517 Return(true)));
Sen Jiang255e22b2016-05-20 16:15:29 -0700518 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(ConnectionType::kEthernet, _))
519 .WillRepeatedly(Return(false));
Chris Sosa77f79e82014-06-02 18:16:24 -0700520
521 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700522 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -0700523 fake_update_response_.GetUpdateResponse(),
Chris Sosa77f79e82014-06-02 18:16:24 -0700524 -1,
525 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700526 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700527 metrics::CheckResult::kUpdateAvailable,
528 metrics::CheckReaction::kIgnored,
529 metrics::DownloadErrorCode::kUnset,
530 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700531 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700532 EXPECT_FALSE(response.update_exists);
533}
534
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700535TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700536 string rollback_version = "1234.0.0";
537 OmahaResponse response;
538
539 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700540 fake_system_state_.set_payload_state(&mock_payload_state);
541
Chris Sosa77f79e82014-06-02 18:16:24 -0700542 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
543 .WillRepeatedly(Return(rollback_version));
544
Alex Deymo8e18f932015-03-27 16:16:59 -0700545 fake_update_response_.version = rollback_version;
Chris Sosa77f79e82014-06-02 18:16:24 -0700546 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700547 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -0700548 fake_update_response_.GetUpdateResponse(),
Chris Sosa77f79e82014-06-02 18:16:24 -0700549 -1,
550 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700551 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700552 metrics::CheckResult::kUpdateAvailable,
553 metrics::CheckReaction::kIgnored,
554 metrics::DownloadErrorCode::kUnset,
555 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700556 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700557 EXPECT_FALSE(response.update_exists);
558}
559
Kevin Cernekee2494e282016-03-29 18:03:53 -0700560// Verify that update checks called during OOBE will only try to download
561// an update if the response includes a non-empty deadline field.
562TEST_F(OmahaRequestActionTest, SkipNonCriticalUpdatesBeforeOOBE) {
563 OmahaResponse response;
564
565 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
566 ASSERT_FALSE(
567 TestUpdateCheck(nullptr, // request_params
568 fake_update_response_.GetUpdateResponse(),
569 -1,
570 false, // ping_only
571 ErrorCode::kNonCriticalUpdateInOOBE,
572 metrics::CheckResult::kUnset,
573 metrics::CheckReaction::kUnset,
574 metrics::DownloadErrorCode::kUnset,
575 &response,
576 nullptr));
577 EXPECT_FALSE(response.update_exists);
578
Alex Deymo46a9aae2016-05-04 20:20:11 -0700579 // The IsOOBEComplete() value is ignored when the OOBE flow is not enabled.
580 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(false);
581 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
582 fake_update_response_.GetUpdateResponse(),
583 -1,
584 false, // ping_only
585 ErrorCode::kSuccess,
586 metrics::CheckResult::kUpdateAvailable,
587 metrics::CheckReaction::kUpdating,
588 metrics::DownloadErrorCode::kUnset,
589 &response,
590 nullptr));
591 EXPECT_TRUE(response.update_exists);
592 fake_system_state_.fake_hardware()->SetIsOOBEEnabled(true);
593
594 // The payload is applied when a deadline was set in the response.
Kevin Cernekee2494e282016-03-29 18:03:53 -0700595 fake_update_response_.deadline = "20101020";
596 ASSERT_TRUE(
597 TestUpdateCheck(nullptr, // request_params
598 fake_update_response_.GetUpdateResponse(),
599 -1,
600 false, // ping_only
601 ErrorCode::kSuccess,
602 metrics::CheckResult::kUpdateAvailable,
603 metrics::CheckReaction::kUpdating,
604 metrics::DownloadErrorCode::kUnset,
605 &response,
606 nullptr));
607 EXPECT_TRUE(response.update_exists);
608}
609
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700610TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700611 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700612 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700613 params.set_wall_clock_based_wait_enabled(true);
614 params.set_update_check_count_wait_enabled(false);
615 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700616
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700617 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700618 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700619 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700620 -1,
621 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700622 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800623 metrics::CheckResult::kUpdateAvailable,
624 metrics::CheckReaction::kDeferring,
625 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700626 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700627 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700628 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700629
630 // Verify if we are interactive check we don't defer.
631 params.set_interactive(true);
632 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700633 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700634 fake_update_response_.GetUpdateResponse(),
Chris Sosa968d0572013-08-23 14:46:02 -0700635 -1,
636 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700637 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800638 metrics::CheckResult::kUpdateAvailable,
639 metrics::CheckReaction::kUpdating,
640 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700641 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700642 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700643 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700644}
645
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700646TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700647 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700648 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700649 params.set_wall_clock_based_wait_enabled(false);
650 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700651
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700652 params.set_update_check_count_wait_enabled(true);
653 params.set_min_update_checks_needed(1);
654 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700655
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700656 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700657 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700658 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700659 -1,
660 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700661 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800662 metrics::CheckResult::kUpdateAvailable,
663 metrics::CheckReaction::kUpdating,
664 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700665 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700666 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700667 EXPECT_TRUE(response.update_exists);
668}
669
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700670TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700671 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700672 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700673 params.set_wall_clock_based_wait_enabled(true);
674 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700675
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700676 params.set_update_check_count_wait_enabled(true);
677 params.set_min_update_checks_needed(1);
678 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700679
Alex Deymo8e18f932015-03-27 16:16:59 -0700680 fake_update_response_.max_days_to_scatter = "0";
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700681 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700682 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700683 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700684 -1,
685 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700686 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800687 metrics::CheckResult::kUpdateAvailable,
688 metrics::CheckReaction::kUpdating,
689 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700690 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700691 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700692 EXPECT_TRUE(response.update_exists);
693}
694
695
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700696TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700697 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700698 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700699 params.set_wall_clock_based_wait_enabled(true);
700 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700701
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700702 params.set_update_check_count_wait_enabled(true);
703 params.set_min_update_checks_needed(0);
704 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700705
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700706 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700707 &params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700708 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700709 -1,
710 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700711 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800712 metrics::CheckResult::kUpdateAvailable,
713 metrics::CheckReaction::kUpdating,
714 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700715 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700716 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700717
Ben Chan9abb7632014-08-07 00:10:53 -0700718 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700719 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700720 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700721 EXPECT_TRUE(response.update_exists);
722}
723
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700724TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700725 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700726 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700727 params.set_wall_clock_based_wait_enabled(true);
728 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700729
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700730 params.set_update_check_count_wait_enabled(true);
731 params.set_min_update_checks_needed(1);
732 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700733
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700734 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700735 &params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700736 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700737 -1,
738 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700739 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800740 metrics::CheckResult::kUpdateAvailable,
741 metrics::CheckReaction::kDeferring,
742 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700743 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700744 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700745
Ben Chan9abb7632014-08-07 00:10:53 -0700746 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700747 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700748 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700749 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700750
751 // Verify if we are interactive check we don't defer.
752 params.set_interactive(true);
753 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700754 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700755 fake_update_response_.GetUpdateResponse(),
Chris Sosa968d0572013-08-23 14:46:02 -0700756 -1,
757 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700758 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800759 metrics::CheckResult::kUpdateAvailable,
760 metrics::CheckReaction::kUpdating,
761 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700762 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700763 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700764 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700765}
766
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700767TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700769 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700770 params.set_wall_clock_based_wait_enabled(true);
771 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700772
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700773 params.set_update_check_count_wait_enabled(true);
774 params.set_min_update_checks_needed(1);
775 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700776
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700777 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700778
779 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700780 &params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700781 fake_update_response_.GetUpdateResponse(),
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700782 -1,
783 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700784 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800785 metrics::CheckResult::kUpdateAvailable,
786 metrics::CheckReaction::kDeferring,
787 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700788 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700789 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700790
Ben Chan9abb7632014-08-07 00:10:53 -0700791 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700792 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700793 // count remains the same, as the decrementing happens in update_attempter
794 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700795 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700796 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700797
798 // Verify if we are interactive check we don't defer.
799 params.set_interactive(true);
800 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700801 TestUpdateCheck(&params,
Alex Deymo8e18f932015-03-27 16:16:59 -0700802 fake_update_response_.GetUpdateResponse(),
Chris Sosa968d0572013-08-23 14:46:02 -0700803 -1,
804 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700805 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800806 metrics::CheckResult::kUpdateAvailable,
807 metrics::CheckReaction::kUpdating,
808 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700809 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700810 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700811 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700812}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700813
Alex Deymo8e18f932015-03-27 16:16:59 -0700814TEST_F(OmahaRequestActionTest, CohortsArePersisted) {
815 OmahaResponse response;
816 OmahaRequestParams params = request_params_;
817 fake_update_response_.include_cohorts = true;
818 fake_update_response_.cohort = "s/154454/8479665";
819 fake_update_response_.cohorthint = "please-put-me-on-beta";
820 fake_update_response_.cohortname = "stable";
821
822 ASSERT_TRUE(TestUpdateCheck(&params,
823 fake_update_response_.GetUpdateResponse(),
824 -1,
825 false, // ping_only
826 ErrorCode::kSuccess,
827 metrics::CheckResult::kUpdateAvailable,
828 metrics::CheckReaction::kUpdating,
829 metrics::DownloadErrorCode::kUnset,
830 &response,
831 nullptr));
832
833 string value;
834 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
835 EXPECT_EQ(fake_update_response_.cohort, value);
836
837 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
838 EXPECT_EQ(fake_update_response_.cohorthint, value);
839
840 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
841 EXPECT_EQ(fake_update_response_.cohortname, value);
842}
843
844TEST_F(OmahaRequestActionTest, CohortsAreUpdated) {
845 OmahaResponse response;
846 OmahaRequestParams params = request_params_;
847 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
848 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortHint, "old_hint"));
849 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohortName, "old_name"));
850 fake_update_response_.include_cohorts = true;
851 fake_update_response_.cohort = "s/154454/8479665";
852 fake_update_response_.cohorthint = "please-put-me-on-beta";
853 fake_update_response_.cohortname = "";
854
855 ASSERT_TRUE(TestUpdateCheck(&params,
856 fake_update_response_.GetUpdateResponse(),
857 -1,
858 false, // ping_only
859 ErrorCode::kSuccess,
860 metrics::CheckResult::kUpdateAvailable,
861 metrics::CheckReaction::kUpdating,
862 metrics::DownloadErrorCode::kUnset,
863 &response,
864 nullptr));
865
866 string value;
867 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
868 EXPECT_EQ(fake_update_response_.cohort, value);
869
870 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
871 EXPECT_EQ(fake_update_response_.cohorthint, value);
872
873 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
874}
875
876TEST_F(OmahaRequestActionTest, CohortsAreNotModifiedWhenMissing) {
877 OmahaResponse response;
878 OmahaRequestParams params = request_params_;
879 EXPECT_TRUE(fake_prefs_.SetString(kPrefsOmahaCohort, "old_value"));
880
881 ASSERT_TRUE(TestUpdateCheck(&params,
882 fake_update_response_.GetUpdateResponse(),
883 -1,
884 false, // ping_only
885 ErrorCode::kSuccess,
886 metrics::CheckResult::kUpdateAvailable,
887 metrics::CheckReaction::kUpdating,
888 metrics::DownloadErrorCode::kUnset,
889 &response,
890 nullptr));
891
892 string value;
893 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
894 EXPECT_EQ("old_value", value);
895
896 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
897 EXPECT_FALSE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
898}
899
Alex Deymo00d79ac2015-06-29 15:41:49 -0700900TEST_F(OmahaRequestActionTest, CohortsArePersistedWhenNoUpdate) {
901 OmahaResponse response;
902 OmahaRequestParams params = request_params_;
903 fake_update_response_.include_cohorts = true;
904 fake_update_response_.cohort = "s/154454/8479665";
905 fake_update_response_.cohorthint = "please-put-me-on-beta";
906 fake_update_response_.cohortname = "stable";
907
908 ASSERT_TRUE(TestUpdateCheck(&params,
909 fake_update_response_.GetNoUpdateResponse(),
910 -1,
911 false, // ping_only
912 ErrorCode::kSuccess,
913 metrics::CheckResult::kNoUpdateAvailable,
914 metrics::CheckReaction::kUnset,
915 metrics::DownloadErrorCode::kUnset,
916 &response,
917 nullptr));
918
919 string value;
920 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohort, &value));
921 EXPECT_EQ(fake_update_response_.cohort, value);
922
923 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortHint, &value));
924 EXPECT_EQ(fake_update_response_.cohorthint, value);
925
926 EXPECT_TRUE(fake_prefs_.GetString(kPrefsOmahaCohortName, &value));
927 EXPECT_EQ(fake_update_response_.cohortname, value);
928}
929
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700930TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Alex Deymo8e18f932015-03-27 16:16:59 -0700931 const string http_response(fake_update_response_.GetNoUpdateResponse());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700932
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -0700933 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -0700934 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -0700935
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700936 OmahaRequestParams params = request_params_;
937 fake_system_state_.set_request_params(&params);
938 OmahaRequestAction action(&fake_system_state_, nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -0300939 brillo::make_unique_ptr(
940 new MockHttpFetcher(http_response.data(),
941 http_response.size(),
942 nullptr)),
Thieu Le116fda32011-04-19 11:01:54 -0700943 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700944 OmahaRequestActionTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700945 ActionProcessor processor;
946 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700947 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700948
Luis Hector Chavezf1cf3482016-07-19 14:29:19 -0700949 loop.PostTask(base::Bind(
950 [](ActionProcessor* processor) { processor->StartProcessing(); },
951 base::Unretained(&processor)));
Alex Deymo60ca1a72015-06-18 18:19:15 -0700952 loop.Run();
953 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700954 EXPECT_FALSE(processor.IsRunning());
955}
956
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700957TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700958 OmahaResponse response;
959 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700960 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700961 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700962 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700963 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700964 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800965 metrics::CheckResult::kParsingError,
966 metrics::CheckReaction::kUnset,
967 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700968 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700969 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700970 EXPECT_FALSE(response.update_exists);
971}
972
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700973TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -0700974 OmahaResponse response;
975 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700976 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -0700977 "",
978 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700979 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700980 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800981 metrics::CheckResult::kParsingError,
982 metrics::CheckReaction::kUnset,
983 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700984 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700985 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700986 EXPECT_FALSE(response.update_exists);
987}
988
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700989TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700990 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700991 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700992 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700993 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
994 "<daystart elapsed_seconds=\"100\"/>"
995 "<app appid=\"foo\" status=\"ok\">"
996 "<ping status=\"ok\"/>"
997 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700998 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700999 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001000 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001001 metrics::CheckResult::kParsingError,
1002 metrics::CheckReaction::kUnset,
1003 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001004 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001005 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001006 EXPECT_FALSE(response.update_exists);
1007}
1008
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001009TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001010 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001011 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001012 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001013 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1014 "<daystart elapsed_seconds=\"100\"/>"
1015 "<app appid=\"foo\" status=\"ok\">"
1016 "<ping status=\"ok\"/>"
1017 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001018 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001019 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001020 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001021 metrics::CheckResult::kParsingError,
1022 metrics::CheckReaction::kUnset,
1023 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001024 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001025 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001026 EXPECT_FALSE(response.update_exists);
1027}
1028
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001029TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001030 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001031 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001032 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001033 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1034 "<daystart elapsed_seconds=\"100\"/>"
1035 "<app appid=\"foo\" status=\"ok\">"
1036 "<ping status=\"ok\"/>"
1037 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001038 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001039 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001040 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001041 metrics::CheckResult::kParsingError,
1042 metrics::CheckReaction::kUnset,
1043 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001044 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001045 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001046 EXPECT_FALSE(response.update_exists);
1047}
1048
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001049TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001050 string input_response =
1051 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1052 "<daystart elapsed_seconds=\"100\"/>"
1053 "<app appid=\"xyz\" status=\"ok\">"
1054 "<updatecheck status=\"ok\">"
1055 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001056 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001057 "<packages><package hash=\"not-used\" name=\"f\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001058 "size=\"587\" hash_sha256=\"lkq34j5345\"/></packages>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001059 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001060 "ChromeOSVersion=\"10.2.3.4\" "
1061 "Prompt=\"false\" "
1062 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001063 "IsDeltaPayload=\"false\" "
Sen Jiang2703ef42017-03-16 13:36:21 -07001064 "sha256=\"not-used\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001065 "needsadmin=\"true\" "
1066 "/></actions></manifest></updatecheck></app></response>";
1067 LOG(INFO) << "Input Response = " << input_response;
1068
Darin Petkov6a5b3222010-07-13 14:55:28 -07001069 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001070 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001071 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001072 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001073 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001074 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001075 metrics::CheckResult::kUpdateAvailable,
1076 metrics::CheckReaction::kUpdating,
1077 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001078 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001079 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001080 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001081 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001082 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001083 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001084 EXPECT_EQ("lkq34j5345", response.hash);
1085 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001086 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001087 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001088}
1089
1090namespace {
1091class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1092 public:
1093 void ProcessingStopped(const ActionProcessor* processor) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001094 brillo::MessageLoop::current()->BreakLoop();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001095 }
Darin Petkov6a5b3222010-07-13 14:55:28 -07001096};
1097
Alex Deymo60ca1a72015-06-18 18:19:15 -07001098void TerminateTransferTestStarter(ActionProcessor* processor) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001099 processor->StartProcessing();
1100 CHECK(processor->IsRunning());
1101 processor->StopProcessing();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001102}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001103} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001104
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001105TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001106 brillo::FakeMessageLoop loop(nullptr);
Alex Deymo60ca1a72015-06-18 18:19:15 -07001107 loop.SetAsCurrent();
Darin Petkov6a5b3222010-07-13 14:55:28 -07001108
Alex Deymo60ca1a72015-06-18 18:19:15 -07001109 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001110 OmahaRequestAction action(&fake_system_state_, nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -03001111 brillo::make_unique_ptr(
1112 new MockHttpFetcher(http_response.data(),
1113 http_response.size(),
1114 nullptr)),
Thieu Le116fda32011-04-19 11:01:54 -07001115 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001116 TerminateEarlyTestProcessorDelegate delegate;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001117 ActionProcessor processor;
1118 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001119 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001120
Alex Deymo60ca1a72015-06-18 18:19:15 -07001121 loop.PostTask(base::Bind(&TerminateTransferTestStarter, &processor));
1122 loop.Run();
1123 EXPECT_FALSE(loop.PendingTasks());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001124}
1125
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001126TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Alex Deymob0d74eb2015-03-30 17:59:17 -07001127 string output;
1128 EXPECT_TRUE(XmlEncode("ab", &output));
1129 EXPECT_EQ("ab", output);
1130 EXPECT_TRUE(XmlEncode("a<b", &output));
1131 EXPECT_EQ("a&lt;b", output);
Alex Deymocc457852015-06-18 18:35:50 -07001132 EXPECT_TRUE(XmlEncode("<&>\"\'\\", &output));
1133 EXPECT_EQ("&lt;&amp;&gt;&quot;&apos;\\", output);
Alex Deymob0d74eb2015-03-30 17:59:17 -07001134 EXPECT_TRUE(XmlEncode("&lt;&amp;&gt;", &output));
1135 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", output);
Alex Deymocc457852015-06-18 18:35:50 -07001136 // Check that unterminated UTF-8 strings are handled properly.
Alex Deymob0d74eb2015-03-30 17:59:17 -07001137 EXPECT_FALSE(XmlEncode("\xc2", &output));
1138 // Fail with invalid ASCII-7 chars.
1139 EXPECT_FALSE(XmlEncode("This is an 'n' with a tilde: \xc3\xb1", &output));
1140}
Darin Petkov6a5b3222010-07-13 14:55:28 -07001141
Alex Deymob0d74eb2015-03-30 17:59:17 -07001142TEST_F(OmahaRequestActionTest, XmlEncodeWithDefaultTest) {
1143 EXPECT_EQ("&lt;&amp;&gt;", XmlEncodeWithDefault("<&>", "something else"));
1144 EXPECT_EQ("<not escaped>", XmlEncodeWithDefault("\xc2", "<not escaped>"));
1145}
1146
1147TEST_F(OmahaRequestActionTest, XmlEncodeIsUsedForParams) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001148 brillo::Blob post_data;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001149
1150 // Make sure XML Encode is being called on the params
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001151 OmahaRequestParams params(&fake_system_state_,
Alex Deymoac41a822015-09-15 20:52:53 -07001152 constants::kOmahaPlatformName,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001153 OmahaRequestParams::kOsVersion,
1154 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001155 "x86 generic<id",
Alex Deymo85616652015-10-15 18:48:31 -07001156 kTestAppId,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001157 "0.1.0.0",
1158 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001159 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001160 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001161 "ChromeOSFirmware.1.0",
1162 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001163 false, // delta okay
1164 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001165 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001166 ""); // target_version_prefix
Alex Deymo8e18f932015-03-27 16:16:59 -07001167 fake_prefs_.SetString(kPrefsOmahaCohort, "evil\nstring");
1168 fake_prefs_.SetString(kPrefsOmahaCohortHint, "evil&string\\");
1169 fake_prefs_.SetString(kPrefsOmahaCohortName,
Alex Vakulenko0103c362016-01-20 07:56:15 -08001170 base::JoinString(
1171 vector<string>(100, "My spoon is too big."), " "));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001172 OmahaResponse response;
1173 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001174 TestUpdateCheck(&params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001175 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001176 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001177 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001178 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001179 metrics::CheckResult::kParsingError,
1180 metrics::CheckReaction::kUnset,
1181 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001182 &response,
1183 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001184 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001185 string post_str(post_data.begin(), post_data.end());
Alex Deymo8e18f932015-03-27 16:16:59 -07001186 EXPECT_NE(string::npos, post_str.find("testtheservice_pack&gt;"));
1187 EXPECT_EQ(string::npos, post_str.find("testtheservice_pack>"));
1188 EXPECT_NE(string::npos, post_str.find("x86 generic&lt;id"));
1189 EXPECT_EQ(string::npos, post_str.find("x86 generic<id"));
1190 EXPECT_NE(string::npos, post_str.find("unittest_track&amp;lt;"));
1191 EXPECT_EQ(string::npos, post_str.find("unittest_track&lt;"));
1192 EXPECT_NE(string::npos, post_str.find("&lt;OEM MODEL&gt;"));
1193 EXPECT_EQ(string::npos, post_str.find("<OEM MODEL>"));
1194 EXPECT_NE(string::npos, post_str.find("cohort=\"evil\nstring\""));
1195 EXPECT_EQ(string::npos, post_str.find("cohorthint=\"evil&string\\\""));
1196 EXPECT_NE(string::npos, post_str.find("cohorthint=\"evil&amp;string\\\""));
1197 // Values from Prefs that are too big are removed from the XML instead of
1198 // encoded.
1199 EXPECT_EQ(string::npos, post_str.find("cohortname="));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001200}
1201
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001202TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001203 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001204 fake_update_response_.deadline = "&lt;20110101";
1205 fake_update_response_.more_info_url = "testthe&lt;url";
1206 fake_update_response_.codebase = "testthe&amp;codebase/";
Darin Petkov6a5b3222010-07-13 14:55:28 -07001207 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001208 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001209 fake_update_response_.GetUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -07001210 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001211 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001212 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001213 metrics::CheckResult::kUpdateAvailable,
1214 metrics::CheckReaction::kUpdating,
1215 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001216 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001217 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001218
1219 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001220 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001221 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001222}
1223
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001224TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001225 OmahaResponse response;
Alex Deymo8e18f932015-03-27 16:16:59 -07001226 // overflows int32_t:
1227 fake_update_response_.size = 123123123123123ll;
Darin Petkov6a5b3222010-07-13 14:55:28 -07001228 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001229 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001230 fake_update_response_.GetUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -07001231 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001232 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001233 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001234 metrics::CheckResult::kUpdateAvailable,
1235 metrics::CheckReaction::kUpdating,
1236 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001237 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001238 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001239
1240 EXPECT_EQ(response.size, 123123123123123ll);
1241}
1242
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001243TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001244 brillo::Blob post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001245 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001246 fake_system_state_.set_prefs(&prefs);
1247
Darin Petkov95508da2011-01-05 12:42:29 -08001248 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1249 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Alex Deymoefb9d832015-11-02 18:39:02 -08001250 // An existing but empty previous version means that we didn't reboot to a new
1251 // update, therefore, no need to update the previous version.
1252 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001253 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001254 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001255 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001256 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001257 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001258 metrics::CheckResult::kParsingError,
1259 metrics::CheckReaction::kUnset,
1260 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001261 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001262 &post_data));
1263 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001264 string post_str(post_data.begin(), post_data.end());
Thieu Le116fda32011-04-19 11:01:54 -07001265 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001266 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001267 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001268 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001269 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1270 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001271 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1272 string::npos);
1273 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1274 string::npos);
Alex Deymoefb9d832015-11-02 18:39:02 -08001275 // No <event> tag should be sent if we didn't reboot to an update.
1276 EXPECT_EQ(post_str.find("<event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001277}
1278
Jay Srinivasan0a708742012-03-20 11:26:12 -07001279
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001280TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001281 brillo::Blob post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001282 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001283 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1284 "invalid xml>",
1285 &post_data);
1286 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001287 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001288 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001289 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001290 OmahaEvent::kTypeUpdateDownloadStarted,
1291 OmahaEvent::kResultSuccess);
1292 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001293 EXPECT_EQ(post_str.find("ping"), string::npos);
1294 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001295}
1296
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001297TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001298 brillo::Blob post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001299 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001300 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1301 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001302 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001303 "invalid xml>",
1304 &post_data);
1305 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001306 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001307 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001308 " <event eventtype=\"%d\" eventresult=\"%d\" "
1309 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001310 OmahaEvent::kTypeDownloadComplete,
1311 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001312 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001313 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001314 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001315}
1316
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001317TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001318 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001319 // Create a copy of the OmahaRequestParams to reuse it later.
1320 OmahaRequestParams params = request_params_;
1321 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001322 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001323 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001324 nullptr,
Alex Deymoc1c17b42015-11-23 03:53:15 -03001325 brillo::make_unique_ptr(
1326 new MockHttpFetcher(http_response.data(),
1327 http_response.size(),
1328 nullptr)),
Thieu Le116fda32011-04-19 11:01:54 -07001329 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001330 EXPECT_FALSE(update_check_action.IsEvent());
1331
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001332 params = request_params_;
1333 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001334 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001335 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001336 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Alex Deymoc1c17b42015-11-23 03:53:15 -03001337 brillo::make_unique_ptr(
1338 new MockHttpFetcher(http_response.data(),
1339 http_response.size(),
1340 nullptr)),
Thieu Le116fda32011-04-19 11:01:54 -07001341 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001342 EXPECT_TRUE(event_action.IsEvent());
1343}
1344
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001345TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001346 for (int i = 0; i < 2; i++) {
1347 bool delta_okay = i == 1;
1348 const char* delta_okay_str = delta_okay ? "true" : "false";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001349 brillo::Blob post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001350 OmahaRequestParams params(&fake_system_state_,
Alex Deymoac41a822015-09-15 20:52:53 -07001351 constants::kOmahaPlatformName,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001352 OmahaRequestParams::kOsVersion,
1353 "service_pack",
1354 "x86-generic",
Alex Deymo85616652015-10-15 18:48:31 -07001355 kTestAppId,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001356 "0.1.0.0",
1357 "en-US",
1358 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001359 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001360 "ChromeOSFirmware.1.0",
1361 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001362 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001363 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001364 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001365 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001366 ASSERT_FALSE(TestUpdateCheck(&params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001367 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001368 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001369 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001370 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001371 metrics::CheckResult::kParsingError,
1372 metrics::CheckReaction::kUnset,
1373 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001374 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001375 &post_data));
1376 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001377 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001378 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1379 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001380 string::npos)
1381 << "i = " << i;
1382 }
1383}
1384
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001385TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001386 for (int i = 0; i < 2; i++) {
1387 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001388 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001389 brillo::Blob post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001390 FakeSystemState fake_system_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001391 OmahaRequestParams params(&fake_system_state_,
Alex Deymoac41a822015-09-15 20:52:53 -07001392 constants::kOmahaPlatformName,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001393 OmahaRequestParams::kOsVersion,
1394 "service_pack",
1395 "x86-generic",
Alex Deymo85616652015-10-15 18:48:31 -07001396 kTestAppId,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001397 "0.1.0.0",
1398 "en-US",
1399 "unittest_track",
1400 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001401 "ChromeOSFirmware.1.0",
1402 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001403 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001404 interactive,
1405 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001406 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001407 ASSERT_FALSE(TestUpdateCheck(&params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001408 "invalid xml>",
1409 -1,
1410 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001411 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001412 metrics::CheckResult::kParsingError,
1413 metrics::CheckReaction::kUnset,
1414 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001415 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001416 &post_data));
1417 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001418 string post_str(post_data.begin(), post_data.end());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001419 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1420 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001421 string::npos)
1422 << "i = " << i;
1423 }
1424}
1425
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001426TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001427 OmahaEvent default_event;
1428 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1429 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001430 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001431
1432 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1433 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1434 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001435 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001436
1437 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1438 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001439 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001440 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1441 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001442 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001443}
1444
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001445void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001446 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001447 fake_system_state_.set_prefs(&prefs);
1448 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1449 .Times(AnyNumber());
1450 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1451 // Add a few hours to the day difference to test no rounding, etc.
1452 int64_t five_days_ago =
1453 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1454 int64_t six_days_ago =
1455 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1456 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1457 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1458 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1459 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1460 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1461 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001462 brillo::Blob post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001463 ASSERT_TRUE(
1464 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001465 fake_update_response_.GetNoUpdateResponse(),
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001466 -1,
1467 ping_only,
1468 ErrorCode::kSuccess,
1469 metrics::CheckResult::kUnset,
1470 metrics::CheckReaction::kUnset,
1471 metrics::DownloadErrorCode::kUnset,
1472 nullptr,
1473 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001474 string post_str(post_data.begin(), post_data.end());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001475 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1476 string::npos);
1477 if (ping_only) {
1478 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1479 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1480 } else {
1481 EXPECT_NE(post_str.find("updatecheck"), string::npos);
1482 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001483 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001484}
1485
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001486TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1487 PingTest(true /* ping_only */);
1488}
1489
1490TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1491 PingTest(false /* ping_only */);
1492}
1493
1494TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001495 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001496 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001497 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1498 .Times(AnyNumber());
1499 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001500 int64_t three_days_ago =
1501 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1502 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001503 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1504 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001505 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1506 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1507 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1508 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001509 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001510 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001511 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001512 fake_update_response_.GetNoUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -07001513 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001514 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001515 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001516 metrics::CheckResult::kNoUpdateAvailable,
1517 metrics::CheckReaction::kUnset,
1518 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001519 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001520 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001521 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001522 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001523 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001524}
1525
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001526TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001527 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001528 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001529 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1530 .Times(AnyNumber());
1531 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001532 int64_t four_days_ago =
1533 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1534 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001535 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1536 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001537 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1538 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1539 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1540 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001541 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001542 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001543 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001544 fake_update_response_.GetNoUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -07001545 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001546 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001547 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001548 metrics::CheckResult::kNoUpdateAvailable,
1549 metrics::CheckReaction::kUnset,
1550 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001551 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001552 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001553 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001554 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001555 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001556}
1557
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001558TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001559 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001560 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001561 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1562 .Times(AnyNumber());
1563 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001564 int64_t one_hour_ago =
1565 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001566 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1567 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001568 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1569 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1570 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1571 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001572 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1573 // send a ping.
1574 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1575 .WillOnce(Return(true));
1576 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1577 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001578 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001579 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001580 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001581 fake_update_response_.GetNoUpdateResponse(),
Darin Petkovedc522e2010-11-05 09:35:17 -07001582 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001583 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001584 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001585 metrics::CheckResult::kNoUpdateAvailable,
1586 metrics::CheckReaction::kUnset,
1587 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001588 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001589 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001590 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001591 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001592}
1593
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001594TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07001595 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08001596 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001597 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07001598 int64_t now = Time::Now().ToInternalValue();
1599 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1600 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1601 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1602 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1603 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1604 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001605 brillo::Blob post_data;
Thieu Leb44e9e82011-06-06 14:34:04 -07001606 EXPECT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001607 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001608 fake_update_response_.GetNoUpdateResponse(),
Thieu Leb44e9e82011-06-06 14:34:04 -07001609 -1,
1610 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001611 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001612 metrics::CheckResult::kUnset,
1613 metrics::CheckReaction::kUnset,
1614 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001615 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001616 &post_data));
Alex Deymo80f70ff2016-02-10 16:08:11 -08001617 EXPECT_EQ(0U, post_data.size());
Thieu Leb44e9e82011-06-06 14:34:04 -07001618}
1619
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001620TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001621 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001622 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001623 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1624 .Times(AnyNumber());
1625 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001626 int64_t future =
1627 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001628 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1629 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001630 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1631 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1632 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1633 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1634 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1635 .WillOnce(Return(true));
1636 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1637 .WillOnce(Return(true));
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001638 brillo::Blob post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001639 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001640 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001641 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1642 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001643 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001644 "<updatecheck status=\"noupdate\"/></app></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::kNoUpdateAvailable,
1649 metrics::CheckReaction::kUnset,
1650 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001651 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001652 &post_data));
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001653 string post_str(post_data.begin(), post_data.end());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001654 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001655}
1656
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001657TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001658 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001659 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001660 // may fail if it runs for longer than 5 seconds. It shouldn't run
1661 // that long though.
1662 int64_t midnight =
1663 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1664 int64_t midnight_slack =
1665 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08001666 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001667 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001668 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1669 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001670 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1671 AllOf(Ge(midnight), Le(midnight_slack))))
1672 .WillOnce(Return(true));
1673 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1674 AllOf(Ge(midnight), Le(midnight_slack))))
1675 .WillOnce(Return(true));
1676 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001677 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001678 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1679 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001680 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001681 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001682 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001683 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001684 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001685 metrics::CheckResult::kNoUpdateAvailable,
1686 metrics::CheckReaction::kUnset,
1687 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001688 nullptr,
1689 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001690}
1691
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001692TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001693 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001694 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001695 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1696 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001697 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1698 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1699 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001700 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001701 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1702 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001703 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001704 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001705 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001706 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001707 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001708 metrics::CheckResult::kNoUpdateAvailable,
1709 metrics::CheckReaction::kUnset,
1710 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001711 nullptr,
1712 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001713}
1714
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001715TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001716 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001717 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001718 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1719 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001720 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1721 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1722 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001723 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001724 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1725 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001726 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001727 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001728 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001729 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001730 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001731 metrics::CheckResult::kNoUpdateAvailable,
1732 metrics::CheckReaction::kUnset,
1733 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001734 nullptr,
1735 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001736}
1737
Alex Deymob3fa53b2016-04-18 19:57:58 -07001738TEST_F(OmahaRequestActionTest, ParseUpdateCheckAttributesTest) {
1739 // Test that the "eol" flags is only parsed from the "_eol" attribute and not
1740 // the "eol" attribute.
1741 ASSERT_TRUE(
1742 TestUpdateCheck(nullptr, // request_params
1743 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1744 "protocol=\"3.0\"><app appid=\"foo\" status=\"ok\">"
1745 "<ping status=\"ok\"/><updatecheck status=\"noupdate\" "
1746 "_eol=\"security-only\" eol=\"eol\" _foo=\"bar\"/>"
1747 "</app></response>",
1748 -1,
1749 false, // ping_only
1750 ErrorCode::kSuccess,
1751 metrics::CheckResult::kNoUpdateAvailable,
1752 metrics::CheckReaction::kUnset,
1753 metrics::DownloadErrorCode::kUnset,
1754 nullptr,
1755 nullptr));
1756 string eol_pref;
1757 EXPECT_TRUE(
1758 fake_system_state_.prefs()->GetString(kPrefsOmahaEolStatus, &eol_pref));
1759 // Note that the eol="eol" attribute should be ignored and the _eol should be
1760 // used instead.
1761 EXPECT_EQ("security-only", eol_pref);
1762}
1763
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001764TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001765 brillo::Blob post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001766 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov84c763c2010-07-29 16:27:58 -07001767 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001768 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001769 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001770 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001771 metrics::CheckResult::kParsingError,
1772 metrics::CheckReaction::kUnset,
1773 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001774 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001775 &post_data));
1776 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001777 string post_str(post_data.begin(), post_data.end());
Darin Petkov84c763c2010-07-29 16:27:58 -07001778 EXPECT_EQ(post_str.find("machineid="), string::npos);
1779 EXPECT_EQ(post_str.find("userid="), string::npos);
1780}
1781
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001782TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001783 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001784 const int http_error_code =
1785 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001786 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001787 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001788 "",
1789 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001790 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001791 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001792 metrics::CheckResult::kDownloadError,
1793 metrics::CheckReaction::kUnset,
1794 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001795 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001796 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001797 EXPECT_FALSE(response.update_exists);
1798}
1799
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001800TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001801 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001802 const int http_error_code =
1803 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001804 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001805 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001806 "",
1807 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001808 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001809 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001810 metrics::CheckResult::kDownloadError,
1811 metrics::CheckReaction::kUnset,
1812 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001813 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001814 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001815 EXPECT_FALSE(response.update_exists);
1816}
1817
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001818TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001819 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001820 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001821 params.set_wall_clock_based_wait_enabled(true);
1822 params.set_waiting_period(TimeDelta().FromDays(1));
1823 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001824
Sen Jiang7c1171e2016-06-23 11:35:40 -07001825 Time arbitrary_date;
1826 Time::FromString("6/4/1989", &arbitrary_date);
1827 fake_system_state_.fake_clock()->SetWallclockTime(arbitrary_date);
1828 ASSERT_FALSE(TestUpdateCheck(&params,
1829 fake_update_response_.GetUpdateResponse(),
1830 -1,
1831 false, // ping_only
1832 ErrorCode::kOmahaUpdateDeferredPerPolicy,
1833 metrics::CheckResult::kUpdateAvailable,
1834 metrics::CheckReaction::kDeferring,
1835 metrics::DownloadErrorCode::kUnset,
1836 &response,
1837 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001838
Ben Chan9abb7632014-08-07 00:10:53 -07001839 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001840 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Sen Jiang7c1171e2016-06-23 11:35:40 -07001841 EXPECT_EQ(arbitrary_date.ToInternalValue(), timestamp);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001842 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001843
1844 // Verify if we are interactive check we don't defer.
1845 params.set_interactive(true);
Sen Jiang7c1171e2016-06-23 11:35:40 -07001846 ASSERT_TRUE(TestUpdateCheck(&params,
1847 fake_update_response_.GetUpdateResponse(),
1848 -1,
1849 false, // ping_only
1850 ErrorCode::kSuccess,
1851 metrics::CheckResult::kUpdateAvailable,
1852 metrics::CheckReaction::kUpdating,
1853 metrics::DownloadErrorCode::kUnset,
1854 &response,
1855 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001856 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001857}
1858
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001859TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001860 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001861 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001862 params.set_wall_clock_based_wait_enabled(true);
1863 params.set_waiting_period(TimeDelta().FromDays(1));
1864 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001865
Sen Jiang7c1171e2016-06-23 11:35:40 -07001866 Time t1, t2;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001867 Time::FromString("1/1/2012", &t1);
Sen Jiang7c1171e2016-06-23 11:35:40 -07001868 Time::FromString("1/3/2012", &t2);
1869 ASSERT_TRUE(
1870 fake_prefs_.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1871 fake_system_state_.fake_clock()->SetWallclockTime(t2);
1872 ASSERT_TRUE(TestUpdateCheck(&params,
1873 fake_update_response_.GetUpdateResponse(),
1874 -1,
1875 false, // ping_only
1876 ErrorCode::kSuccess,
1877 metrics::CheckResult::kUpdateAvailable,
1878 metrics::CheckReaction::kUpdating,
1879 metrics::DownloadErrorCode::kUnset,
1880 &response,
1881 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001882
1883 EXPECT_TRUE(response.update_exists);
1884
1885 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001886 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001887 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001888 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1889}
1890
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001891TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001892 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07001893 base::ScopedTempDir tempdir;
1894 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001895
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001896 brillo::Blob post_data;
Sen Jiang297e5832016-03-17 14:45:51 -07001897 OmahaRequestParams params(&fake_system_state_);
1898 params.set_root(tempdir.path().value());
1899 params.set_app_id("{22222222-2222-2222-2222-222222222222}");
1900 params.set_app_version("1.2.3.4");
1901 params.set_current_channel("canary-channel");
1902 EXPECT_TRUE(params.SetTargetChannel("stable-channel", true, nullptr));
1903 params.UpdateDownloadChannel();
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001904 EXPECT_TRUE(params.to_more_stable_channel());
1905 EXPECT_TRUE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001906 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001907 "invalid xml>",
1908 -1,
1909 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001910 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001911 metrics::CheckResult::kParsingError,
1912 metrics::CheckReaction::kUnset,
1913 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001914 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001915 &post_data));
1916 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001917 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001918 EXPECT_NE(string::npos, post_str.find(
1919 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1920 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1921 "track=\"stable-channel\" from_track=\"canary-channel\" "));
1922}
1923
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001924TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001925 // Create a uniquely named test directory.
Sen Jiang297e5832016-03-17 14:45:51 -07001926 base::ScopedTempDir tempdir;
1927 ASSERT_TRUE(tempdir.CreateUniqueTempDir());
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001928
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001929 brillo::Blob post_data;
Sen Jiang297e5832016-03-17 14:45:51 -07001930 OmahaRequestParams params(&fake_system_state_);
1931 params.set_root(tempdir.path().value());
1932 params.set_app_id("{11111111-1111-1111-1111-111111111111}");
1933 params.set_app_version("5.6.7.8");
1934 params.set_current_channel("stable-channel");
1935 EXPECT_TRUE(params.SetTargetChannel("canary-channel", false, nullptr));
1936 params.UpdateDownloadChannel();
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001937 EXPECT_FALSE(params.to_more_stable_channel());
1938 EXPECT_FALSE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001939 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001940 "invalid xml>",
1941 -1,
1942 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001943 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001944 metrics::CheckResult::kParsingError,
1945 metrics::CheckReaction::kUnset,
1946 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001947 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001948 &post_data));
1949 // convert post_data to string
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001950 string post_str(post_data.begin(), post_data.end());
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001951 EXPECT_NE(string::npos, post_str.find(
1952 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1953 "version=\"5.6.7.8\" "
1954 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001955 EXPECT_EQ(string::npos, post_str.find("from_version"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001956}
1957
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001958// Checks that the initial ping with a=-1 r=-1 is not send when the device
1959// was powerwashed.
1960TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1961 fake_prefs_.SetString(kPrefsPreviousVersion, "");
1962
1963 // Flag that the device was powerwashed in the past.
1964 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1965
Alex Vakulenko3f39d5c2015-10-13 09:27:13 -07001966 brillo::Blob post_data;
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001967 ASSERT_TRUE(
1968 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07001969 fake_update_response_.GetNoUpdateResponse(),
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001970 -1,
1971 false, // ping_only
1972 ErrorCode::kSuccess,
1973 metrics::CheckResult::kNoUpdateAvailable,
1974 metrics::CheckReaction::kUnset,
1975 metrics::DownloadErrorCode::kUnset,
1976 nullptr,
1977 &post_data));
1978 // We shouldn't send a ping in this case since powerwash > 0.
Alex Vakulenkof68bbbc2015-02-09 12:53:18 -08001979 string post_str(post_data.begin(), post_data.end());
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001980 EXPECT_EQ(string::npos, post_str.find("<ping"));
1981}
1982
Alex Deymo9fded1e2015-11-05 12:31:19 -08001983// Checks that the event 54 is sent on a reboot to a new update.
1984TEST_F(OmahaRequestActionTest, RebootAfterUpdateEvent) {
1985 // Flag that the device was updated in a previous boot.
1986 fake_prefs_.SetString(kPrefsPreviousVersion, "1.2.3.4");
1987
1988 brillo::Blob post_data;
1989 ASSERT_TRUE(
1990 TestUpdateCheck(nullptr, // request_params
1991 fake_update_response_.GetNoUpdateResponse(),
1992 -1,
1993 false, // ping_only
1994 ErrorCode::kSuccess,
1995 metrics::CheckResult::kNoUpdateAvailable,
1996 metrics::CheckReaction::kUnset,
1997 metrics::DownloadErrorCode::kUnset,
1998 nullptr,
1999 &post_data));
2000 string post_str(post_data.begin(), post_data.end());
2001
2002 // An event 54 is included and has the right version.
2003 EXPECT_NE(string::npos,
2004 post_str.find(base::StringPrintf(
2005 "<event eventtype=\"%d\"",
2006 OmahaEvent::kTypeRebootedAfterUpdate)));
2007 EXPECT_NE(string::npos,
2008 post_str.find("previousversion=\"1.2.3.4\"></event>"));
2009
2010 // The previous version flag should have been removed.
2011 EXPECT_TRUE(fake_prefs_.Exists(kPrefsPreviousVersion));
2012 string prev_version;
2013 EXPECT_TRUE(fake_prefs_.GetString(kPrefsPreviousVersion, &prev_version));
2014 EXPECT_TRUE(prev_version.empty());
2015}
2016
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002017void OmahaRequestActionTest::P2PTest(
2018 bool initial_allow_p2p_for_downloading,
2019 bool initial_allow_p2p_for_sharing,
2020 bool omaha_disable_p2p_for_downloading,
2021 bool omaha_disable_p2p_for_sharing,
2022 bool payload_state_allow_p2p_attempt,
2023 bool expect_p2p_client_lookup,
2024 const string& p2p_client_result_url,
2025 bool expected_allow_p2p_for_downloading,
2026 bool expected_allow_p2p_for_sharing,
2027 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07002028 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002029 OmahaRequestParams request_params = request_params_;
Gilad Arnold74b5f552014-10-07 08:17:16 -07002030 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
2031 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
2032 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07002033
2034 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002035 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07002036 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2037 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07002038 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
2039 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
2040 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
2041 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
2042 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
2043 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
2044 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
2045 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
2046 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
2047 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
2048
David Zeuthen8f191b22013-08-06 12:27:50 -07002049 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002050 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07002051 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2052
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002053 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2054 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002055 .Times(expect_p2p_client_lookup ? 1 : 0);
2056
Alex Deymo8e18f932015-03-27 16:16:59 -07002057 fake_update_response_.disable_p2p_for_downloading =
2058 omaha_disable_p2p_for_downloading;
2059 fake_update_response_.disable_p2p_for_sharing = omaha_disable_p2p_for_sharing;
David Zeuthen8f191b22013-08-06 12:27:50 -07002060 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002061 TestUpdateCheck(&request_params,
Alex Deymo8e18f932015-03-27 16:16:59 -07002062 fake_update_response_.GetUpdateResponse(),
David Zeuthen8f191b22013-08-06 12:27:50 -07002063 -1,
2064 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002065 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002066 metrics::CheckResult::kUpdateAvailable,
2067 metrics::CheckReaction::kUpdating,
2068 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002069 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002070 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002071 EXPECT_TRUE(response.update_exists);
2072
Gilad Arnold74b5f552014-10-07 08:17:16 -07002073 EXPECT_EQ(omaha_disable_p2p_for_downloading,
2074 response.disable_p2p_for_downloading);
2075 EXPECT_EQ(omaha_disable_p2p_for_sharing,
2076 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07002077
Gilad Arnold74b5f552014-10-07 08:17:16 -07002078 EXPECT_EQ(expected_allow_p2p_for_downloading,
2079 actual_allow_p2p_for_downloading);
2080 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
2081 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07002082}
2083
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002084TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002085 P2PTest(true, // initial_allow_p2p_for_downloading
2086 true, // initial_allow_p2p_for_sharing
2087 false, // omaha_disable_p2p_for_downloading
2088 false, // omaha_disable_p2p_for_sharing
2089 true, // payload_state_allow_p2p_attempt
2090 true, // expect_p2p_client_lookup
2091 "http://1.3.5.7/p2p", // p2p_client_result_url
2092 true, // expected_allow_p2p_for_downloading
2093 true, // expected_allow_p2p_for_sharing
2094 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002095}
2096
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002097TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002098 P2PTest(true, // initial_allow_p2p_for_downloading
2099 true, // initial_allow_p2p_for_sharing
2100 false, // omaha_disable_p2p_for_downloading
2101 false, // omaha_disable_p2p_for_sharing
2102 true, // payload_state_allow_p2p_attempt
2103 true, // expect_p2p_client_lookup
2104 "", // p2p_client_result_url
2105 false, // expected_allow_p2p_for_downloading
2106 true, // expected_allow_p2p_for_sharing
2107 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002108}
2109
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002110TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002111 P2PTest(false, // initial_allow_p2p_for_downloading
2112 true, // initial_allow_p2p_for_sharing
2113 false, // omaha_disable_p2p_for_downloading
2114 false, // omaha_disable_p2p_for_sharing
2115 true, // payload_state_allow_p2p_attempt
2116 false, // expect_p2p_client_lookup
2117 "unset", // p2p_client_result_url
2118 false, // expected_allow_p2p_for_downloading
2119 true, // expected_allow_p2p_for_sharing
2120 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002121}
2122
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002123TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002124 P2PTest(true, // initial_allow_p2p_for_downloading
2125 true, // initial_allow_p2p_for_sharing
2126 true, // omaha_disable_p2p_for_downloading
2127 false, // omaha_disable_p2p_for_sharing
2128 true, // payload_state_allow_p2p_attempt
2129 false, // expect_p2p_client_lookup
2130 "unset", // p2p_client_result_url
2131 false, // expected_allow_p2p_for_downloading
2132 true, // expected_allow_p2p_for_sharing
2133 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002134}
2135
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002136TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002137 P2PTest(true, // initial_allow_p2p_for_downloading
2138 true, // initial_allow_p2p_for_sharing
2139 false, // omaha_disable_p2p_for_downloading
2140 true, // omaha_disable_p2p_for_sharing
2141 true, // payload_state_allow_p2p_attempt
2142 true, // expect_p2p_client_lookup
2143 "http://1.3.5.7/p2p", // p2p_client_result_url
2144 true, // expected_allow_p2p_for_downloading
2145 false, // expected_allow_p2p_for_sharing
2146 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002147}
2148
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002149TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002150 P2PTest(true, // initial_allow_p2p_for_downloading
2151 true, // initial_allow_p2p_for_sharing
2152 true, // omaha_disable_p2p_for_downloading
2153 true, // omaha_disable_p2p_for_sharing
2154 true, // payload_state_allow_p2p_attempt
2155 false, // expect_p2p_client_lookup
2156 "unset", // p2p_client_result_url
2157 false, // expected_allow_p2p_for_downloading
2158 false, // expected_allow_p2p_for_sharing
2159 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002160}
2161
Alex Deymof329b932014-10-30 01:37:48 -07002162bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2163 OmahaResponse *response) {
Alex Deymo8e18f932015-03-27 16:16:59 -07002164 fake_update_response_.elapsed_days = elapsed_days;
David Zeuthen639aa362014-02-03 16:23:44 -08002165 return
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002166 TestUpdateCheck(nullptr, // request_params
Alex Deymo8e18f932015-03-27 16:16:59 -07002167 fake_update_response_.GetUpdateResponse(),
David Zeuthen639aa362014-02-03 16:23:44 -08002168 -1,
2169 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002170 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002171 metrics::CheckResult::kUpdateAvailable,
2172 metrics::CheckReaction::kUpdating,
2173 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002174 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002175 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002176}
2177
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002178TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002179 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002180
Kevin Cernekee2494e282016-03-29 18:03:53 -07002181 // Simulate a successful update check that happens during OOBE. The
2182 // deadline in the response is needed to force the update attempt to
2183 // occur; responses without a deadline seen during OOBE will normally
2184 // return ErrorCode::kNonCriticalUpdateInOOBE.
2185 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
2186 fake_update_response_.deadline = "20101020";
2187
David Zeuthen639aa362014-02-03 16:23:44 -08002188 // Check that we parse elapsed_days in the Omaha Response correctly.
2189 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002190 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2191 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002192 EXPECT_TRUE(response.update_exists);
2193 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002194 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002195 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002196 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002197 EXPECT_EQ(prefs_days, 42);
2198
2199 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002200 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002201 EXPECT_TRUE(response.update_exists);
2202 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002203 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002204 EXPECT_EQ(prefs_days, 42);
2205
2206 // Note that elapsed_days is not necessarily divisible by 7 so check
2207 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002208 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2209 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002210 EXPECT_TRUE(response.update_exists);
2211 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002212 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002213 EXPECT_EQ(prefs_days, 21);
2214
2215 // Check that we correctly handle elapsed_days not being included in
2216 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002217 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002218 EXPECT_TRUE(response.update_exists);
2219 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002220}
2221
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002222// If there is no prefs and OOBE is not complete, we should not
2223// report anything to Omaha.
2224TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
Kevin Cernekee2494e282016-03-29 18:03:53 -07002225 fake_system_state_.fake_hardware()->UnsetIsOOBEComplete();
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002226 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2227 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2228}
David Zeuthen639aa362014-02-03 16:23:44 -08002229
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002230// If OOBE is complete and happened on a valid date (e.g. after Jan
2231// 1 2007 0:00 PST), that date should be used and written to
2232// prefs. However, first try with an invalid date and check we do
2233// nothing.
2234TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2235 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2236 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2237 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2238 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2239}
David Zeuthen639aa362014-02-03 16:23:44 -08002240
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002241// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2242// should yield an InstallDate of 14.
2243TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2244 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2245 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2246 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2247 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002248
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002249 int64_t prefs_days;
2250 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2251 EXPECT_EQ(prefs_days, 14);
2252}
David Zeuthen639aa362014-02-03 16:23:44 -08002253
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002254// Now that we have a valid date in prefs, check that we keep using
2255// that even if OOBE date reports something else. The date Jan 30,
2256// 2007 0:00 PST should yield an InstallDate of 28... but since
2257// there's a prefs file, we should still get 14.
2258TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2259 // Set a valid date in the prefs first.
2260 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002261
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002262 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2263 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2264 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002265
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002266 int64_t prefs_days;
2267 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2268 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002269
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002270 // If we delete the prefs file, we should get 28 days.
2271 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2272 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2273 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2274 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002275}
2276
Darin Petkov6a5b3222010-07-13 14:55:28 -07002277} // namespace chromeos_update_engine