blob: bcdee84ba3634974c4c12aa3c2d8644dafd4bfc1 [file] [log] [blame]
Mike Frysinger8155d082012-04-06 15:23:18 -04001// Copyright (c) 2012 The Chromium OS Authors. All rights reserved.
Darin Petkov6a5b3222010-07-13 14:55:28 -07002// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
Alex Deymo8427b4a2014-11-05 14:00:32 -08005#include "update_engine/omaha_request_action.h"
6
Ben Chan9abb7632014-08-07 00:10:53 -07007#include <glib.h>
8#include <stdint.h>
9
Darin Petkov6a5b3222010-07-13 14:55:28 -070010#include <string>
11#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070012
Alex Vakulenko75039d72014-03-25 12:36:28 -070013#include <base/strings/string_util.h>
14#include <base/strings/stringprintf.h>
15#include <base/time/time.h>
Chris Sosa77f79e82014-06-02 18:16:24 -070016#include <chromeos/dbus/service_constants.h>
Alex Deymoe1e3afe2014-10-30 13:02:49 -070017#include <gtest/gtest.h>
Jay Srinivasand29695d2013-04-08 15:08:05 -070018
Darin Petkov6a5b3222010-07-13 14:55:28 -070019#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070020#include "update_engine/constants.h"
Alex Deymoe1e3afe2014-10-30 13:02:49 -070021#include "update_engine/fake_prefs.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070022#include "update_engine/mock_connection_manager.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070023#include "update_engine/mock_http_fetcher.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070024#include "update_engine/mock_payload_state.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070025#include "update_engine/omaha_hash_calculator.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070026#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070027#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070028#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070029#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070030
Darin Petkov1cbd78f2010-07-29 12:38:34 -070031using base::Time;
32using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070033using std::string;
34using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070035using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070036using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070037using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070038using testing::Ge;
39using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080040using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070041using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070042using testing::ReturnPointee;
43using testing::SaveArg;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070044using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070045using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070046
47namespace chromeos_update_engine {
48
Alex Deymoe1e3afe2014-10-30 13:02:49 -070049class OmahaRequestActionTest : public ::testing::Test {
50 protected:
51 void SetUp() {
52 fake_system_state_.set_request_params(&request_params_);
53 fake_system_state_.set_prefs(&fake_prefs_);
54 }
55
56 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -080057 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -070058 // is used. |payload_state| may be null, in which case a local mock is used.
59 // |p2p_manager| may be null, in which case a local mock is used.
60 // |connection_manager| may be null, in which case a local mock is used.
61 // out_response may be null. If |fail_http_response_code| is non-negative,
62 // the transfer will fail with that code. |ping_only| is passed through to the
63 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
64 // post-data received by the mock HttpFetcher is returned.
65 //
66 // The |expected_check_result|, |expected_check_reaction| and
67 // |expected_error_code| parameters are for checking expectations
68 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
69 // UMA statistics. Use the appropriate ::kUnset value to specify that
70 // the given metric should not be reported.
71 bool TestUpdateCheck(OmahaRequestParams* request_params,
72 const string& http_response,
73 int fail_http_response_code,
74 bool ping_only,
75 ErrorCode expected_code,
76 metrics::CheckResult expected_check_result,
77 metrics::CheckReaction expected_check_reaction,
78 metrics::DownloadErrorCode expected_download_error_code,
79 OmahaResponse* out_response,
80 vector<char>* out_post_data);
81
82 // Runs and checks a ping test. |ping_only| indicates wheter it should send
83 // only a ping or also an updatecheck.
84 void PingTest(bool ping_only);
85
86 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -070087 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -070088 OmahaResponse *response);
89
90 // P2P test helper function.
91 void P2PTest(
92 bool initial_allow_p2p_for_downloading,
93 bool initial_allow_p2p_for_sharing,
94 bool omaha_disable_p2p_for_downloading,
95 bool omaha_disable_p2p_for_sharing,
96 bool payload_state_allow_p2p_attempt,
97 bool expect_p2p_client_lookup,
98 const string& p2p_client_result_url,
99 bool expected_allow_p2p_for_downloading,
100 bool expected_allow_p2p_for_sharing,
101 const string& expected_p2p_url);
102
103 FakeSystemState fake_system_state_;
104
105 // By default, all tests use these objects unless they replace them in the
106 // fake_system_state_.
107 OmahaRequestParams request_params_ = OmahaRequestParams{
108 &fake_system_state_,
109 OmahaRequestParams::kOsPlatform,
110 OmahaRequestParams::kOsVersion,
111 "service_pack",
112 "x86-generic",
113 OmahaRequestParams::kAppId,
114 "0.1.0.0",
115 "en-US",
116 "unittest",
117 "OEM MODEL 09235 7471",
118 "ChromeOSFirmware.1.0",
119 "0X0A1",
120 false, // delta okay
121 false, // interactive
122 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -0700123 ""}; // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700124
125 FakePrefs fake_prefs_;
126};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127
128namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700129
Darin Petkov6a5b3222010-07-13 14:55:28 -0700130string GetNoUpdateResponse(const string& app_id) {
131 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700132 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
133 "<daystart elapsed_seconds=\"100\"/>"
134 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
135 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -0700136}
137
David Zeuthenf3e28012014-08-26 18:23:52 -0400138string GetNoUpdateResponseWithEntity(const string& app_id) {
139 return string(
140 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
141 "<!DOCTYPE response ["
142 "<!ENTITY CrOS \"ChromeOS\">"
143 "]>"
144 "<response protocol=\"3.0\">"
145 "<daystart elapsed_seconds=\"100\"/>"
146 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
147 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
148}
149
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700150string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700151 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700152 const string& more_info_url,
153 const string& prompt,
154 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700155 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700156 const string& hash,
157 const string& needsadmin,
158 const string& size,
159 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700160 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800161 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700162 bool disable_p2p_for_downloading,
163 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700164 string response =
165 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
166 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800167 "<daystart elapsed_seconds=\"100\"" +
168 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
169 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700170 "<app appid=\"" + app_id + "\" status=\"ok\">"
171 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
172 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700173 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700174 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
175 "size=\"" + size + "\"/></packages>"
176 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700177 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700178 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
179 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800180 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700181 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700182 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700183 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700184 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700185 (disable_p2p_for_downloading ?
186 "DisableP2PForDownloading=\"true\" " : "") +
187 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700188 "/></actions></manifest></updatecheck></app></response>";
189 LOG(INFO) << "Response = " << response;
190 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700191}
192
Darin Petkov6a5b3222010-07-13 14:55:28 -0700193string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700194 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700195 const string& more_info_url,
196 const string& prompt,
197 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700198 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700199 const string& hash,
200 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700201 const string& size,
202 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700203 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700204 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700205 more_info_url,
206 prompt,
207 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700208 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700209 hash,
210 needsadmin,
211 size,
212 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700213 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700214 "42", // elapsed_days
215 false, // disable_p2p_for_downloading
216 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700217}
218
219class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
220 public:
221 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700222 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700223 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700224 virtual ~OmahaRequestActionTestProcessorDelegate() {
225 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700226 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700227 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700228 ASSERT_TRUE(loop_);
229 g_main_loop_quit(loop_);
230 }
231
232 virtual void ActionCompleted(ActionProcessor* processor,
233 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700234 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700235 // make sure actions always succeed
236 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700237 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700238 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700239 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700240 }
241 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700242 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700243};
244
245gboolean StartProcessorInRunLoop(gpointer data) {
246 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
247 processor->StartProcessing();
248 return FALSE;
249}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700250} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700251
252class OutputObjectCollectorAction;
253
254template<>
255class ActionTraits<OutputObjectCollectorAction> {
256 public:
257 // Does not take an object for input
258 typedef OmahaResponse InputObjectType;
259 // On success, puts the output path on output
260 typedef NoneType OutputObjectType;
261};
262
263class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
264 public:
265 OutputObjectCollectorAction() : has_input_object_(false) {}
266 void PerformAction() {
267 // copy input object
268 has_input_object_ = HasInputObject();
269 if (has_input_object_)
270 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700271 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700272 }
273 // Should never be called
274 void TerminateProcessing() {
275 CHECK(false);
276 }
277 // Debugging/logging
Alex Deymof329b932014-10-30 01:37:48 -0700278 static string StaticType() {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700279 return "OutputObjectCollectorAction";
280 }
Alex Deymof329b932014-10-30 01:37:48 -0700281 string Type() const { return StaticType(); }
Darin Petkov6a5b3222010-07-13 14:55:28 -0700282 bool has_input_object_;
283 OmahaResponse omaha_response_;
284};
285
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700286bool OmahaRequestActionTest::TestUpdateCheck(
287 OmahaRequestParams* request_params,
288 const string& http_response,
289 int fail_http_response_code,
290 bool ping_only,
291 ErrorCode expected_code,
292 metrics::CheckResult expected_check_result,
293 metrics::CheckReaction expected_check_reaction,
294 metrics::DownloadErrorCode expected_download_error_code,
295 OmahaResponse* out_response,
296 vector<char>* out_post_data) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700297 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
298 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800299 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700300 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700301 if (fail_http_response_code >= 0) {
302 fetcher->FailTransfer(fail_http_response_code);
303 }
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700304 if (request_params)
305 fake_system_state_.set_request_params(request_params);
306 OmahaRequestAction action(&fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700307 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700308 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700309 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 OmahaRequestActionTestProcessorDelegate delegate;
311 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700312 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700313
Darin Petkov6a5b3222010-07-13 14:55:28 -0700314 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700315 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700316 processor.EnqueueAction(&action);
317
318 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700319 BondActions(&action, &collector_action);
320 processor.EnqueueAction(&collector_action);
321
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700322 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800323 .Times(AnyNumber());
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700324 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800325 SendEnumToUMA(metrics::kMetricCheckResult,
326 static_cast<int>(expected_check_result),
327 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
328 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700329 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800330 SendEnumToUMA(metrics::kMetricCheckReaction,
331 static_cast<int>(expected_check_reaction),
332 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
333 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700334 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700335 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
336 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800337 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
338 ? 0 : 1);
339
Darin Petkov6a5b3222010-07-13 14:55:28 -0700340 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
341 g_main_loop_run(loop);
342 g_main_loop_unref(loop);
343 if (collector_action.has_input_object_ && out_response)
344 *out_response = collector_action.omaha_response_;
345 if (out_post_data)
346 *out_post_data = fetcher->post_data();
347 return collector_action.has_input_object_;
348}
349
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700350// Tests Event requests -- they should always succeed. |out_post_data|
351// may be null; if non-null, the post-data received by the mock
352// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700353void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700354 OmahaEvent* event,
355 const string& http_response,
356 vector<char>* out_post_data) {
357 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
358 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800359 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700360 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700361 FakeSystemState fake_system_state;
362 fake_system_state.set_request_params(&params);
363 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700364 OmahaRequestActionTestProcessorDelegate delegate;
365 delegate.loop_ = loop;
366 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700367 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700368 processor.EnqueueAction(&action);
369
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700370 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
371 g_main_loop_run(loop);
372 g_main_loop_unref(loop);
373 if (out_post_data)
374 *out_post_data = fetcher->post_data();
375}
376
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700377TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400378 OmahaResponse response;
379 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700380 TestUpdateCheck(nullptr, // request_params
David Zeuthenf3e28012014-08-26 18:23:52 -0400381 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
382 -1,
383 false, // ping_only
384 ErrorCode::kOmahaRequestXMLHasEntityDecl,
385 metrics::CheckResult::kParsingError,
386 metrics::CheckReaction::kUnset,
387 metrics::DownloadErrorCode::kUnset,
388 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700389 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400390 EXPECT_FALSE(response.update_exists);
391}
392
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700393TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700394 OmahaResponse response;
395 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700396 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700397 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700398 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700399 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700400 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800401 metrics::CheckResult::kNoUpdateAvailable,
402 metrics::CheckReaction::kUnset,
403 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700404 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700405 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700406 EXPECT_FALSE(response.update_exists);
407}
408
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700409TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700410 OmahaResponse response;
411 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700412 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700413 GetUpdateResponse(OmahaRequestParams::kAppId,
414 "1.2.3.4", // version
415 "http://more/info",
416 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700417 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700418 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700419 "HASH1234=", // checksum
420 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700421 "123", // size
422 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700423 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700424 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700425 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800426 metrics::CheckResult::kUpdateAvailable,
427 metrics::CheckReaction::kUpdating,
428 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700429 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700430 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700431 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700432 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700433 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800434 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700435 EXPECT_EQ("http://more/info", response.more_info_url);
436 EXPECT_EQ("HASH1234=", response.hash);
437 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700438 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700439 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700440}
441
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700442TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700443 OmahaResponse response;
444 // Set up a connection manager that doesn't allow a valid update over
445 // the current ethernet connection.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700446 MockConnectionManager mock_cm(nullptr);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700447 fake_system_state_.set_connection_manager(&mock_cm);
448
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700449 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700450 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
451 SetArgumentPointee<2>(NetworkTethering::kUnknown),
452 Return(true)));
453 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
454 .WillRepeatedly(Return(false));
455 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
456 .WillRepeatedly(Return(shill::kTypeEthernet));
457
458 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700459 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700460 GetUpdateResponse(OmahaRequestParams::kAppId,
461 "1.2.3.4", // version
462 "http://more/info",
463 "true", // prompt
464 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700465 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700466 "HASH1234=", // checksum
467 "false", // needs admin
468 "123", // size
469 ""), // deadline
470 -1,
471 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700472 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700473 metrics::CheckResult::kUpdateAvailable,
474 metrics::CheckReaction::kIgnored,
475 metrics::DownloadErrorCode::kUnset,
476 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700477 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700478 EXPECT_FALSE(response.update_exists);
479}
480
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700481TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700482 string rollback_version = "1234.0.0";
483 OmahaResponse response;
484
485 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700486 fake_system_state_.set_payload_state(&mock_payload_state);
487
Chris Sosa77f79e82014-06-02 18:16:24 -0700488 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
489 .WillRepeatedly(Return(rollback_version));
490
491 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700492 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700493 GetUpdateResponse(OmahaRequestParams::kAppId,
494 rollback_version, // version
495 "http://more/info",
496 "true", // prompt
497 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700498 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700499 "HASH1234=", // checksum
500 "false", // needs admin
501 "123", // size
502 ""), // deadline
503 -1,
504 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700505 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700506 metrics::CheckResult::kUpdateAvailable,
507 metrics::CheckReaction::kIgnored,
508 metrics::DownloadErrorCode::kUnset,
509 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700510 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700511 EXPECT_FALSE(response.update_exists);
512}
513
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700514TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700515 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700516 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700517 params.set_wall_clock_based_wait_enabled(true);
518 params.set_update_check_count_wait_enabled(false);
519 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700520
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700521 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700522 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700523 GetUpdateResponse2(OmahaRequestParams::kAppId,
524 "1.2.3.4", // version
525 "http://more/info",
526 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700527 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700528 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700529 "HASH1234=", // checksum
530 "false", // needs admin
531 "123", // size
532 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700533 "7", // max days to scatter
534 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700535 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700536 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700537 -1,
538 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700539 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800540 metrics::CheckResult::kUpdateAvailable,
541 metrics::CheckReaction::kDeferring,
542 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700543 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700544 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700545 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700546
547 // Verify if we are interactive check we don't defer.
548 params.set_interactive(true);
549 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700550 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700551 GetUpdateResponse2(OmahaRequestParams::kAppId,
552 "1.2.3.4", // version
553 "http://more/info",
554 "true", // prompt
555 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700556 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700557 "HASH1234=", // checksum
558 "false", // needs admin
559 "123", // size
560 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700561 "7", // max days to scatter
562 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700563 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700564 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700565 -1,
566 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700567 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800568 metrics::CheckResult::kUpdateAvailable,
569 metrics::CheckReaction::kUpdating,
570 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700571 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700572 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700573 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700574}
575
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700576TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700577 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700578 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700579 params.set_wall_clock_based_wait_enabled(false);
580 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700581
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700582 params.set_update_check_count_wait_enabled(true);
583 params.set_min_update_checks_needed(1);
584 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700585
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700586 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700587 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700588 GetUpdateResponse2(OmahaRequestParams::kAppId,
589 "1.2.3.4", // version
590 "http://more/info",
591 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700592 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700593 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700594 "HASH1234=", // checksum
595 "false", // needs admin
596 "123", // size
597 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700598 "7", // max days to scatter
599 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700600 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700601 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700602 -1,
603 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700604 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800605 metrics::CheckResult::kUpdateAvailable,
606 metrics::CheckReaction::kUpdating,
607 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700608 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700609 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700610 EXPECT_TRUE(response.update_exists);
611}
612
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700613TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700614 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700615 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700616 params.set_wall_clock_based_wait_enabled(true);
617 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700618
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700619 params.set_update_check_count_wait_enabled(true);
620 params.set_min_update_checks_needed(1);
621 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700622
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700623 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700624 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700625 GetUpdateResponse2(OmahaRequestParams::kAppId,
626 "1.2.3.4", // version
627 "http://more/info",
628 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700629 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700630 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700631 "HASH1234=", // checksum
632 "false", // needs admin
633 "123", // size
634 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700635 "0", // max days to scatter
636 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700637 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700638 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700639 -1,
640 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700641 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800642 metrics::CheckResult::kUpdateAvailable,
643 metrics::CheckReaction::kUpdating,
644 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700645 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700646 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700647 EXPECT_TRUE(response.update_exists);
648}
649
650
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700651TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700652 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700653 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700654 params.set_wall_clock_based_wait_enabled(true);
655 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700656
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700657 params.set_update_check_count_wait_enabled(true);
658 params.set_min_update_checks_needed(0);
659 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700660
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700661 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700662 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700663 GetUpdateResponse2(OmahaRequestParams::kAppId,
664 "1.2.3.4", // version
665 "http://more/info",
666 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700667 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700668 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700669 "HASH1234=", // checksum
670 "false", // needs admin
671 "123", // size
672 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700673 "7", // max days to scatter
674 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700675 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700676 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700677 -1,
678 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700679 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800680 metrics::CheckResult::kUpdateAvailable,
681 metrics::CheckReaction::kUpdating,
682 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700683 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700684 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700685
Ben Chan9abb7632014-08-07 00:10:53 -0700686 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700687 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700688 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700689 EXPECT_TRUE(response.update_exists);
690}
691
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700692TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700693 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700694 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700695 params.set_wall_clock_based_wait_enabled(true);
696 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700697
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700698 params.set_update_check_count_wait_enabled(true);
699 params.set_min_update_checks_needed(1);
700 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700701
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700702 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700703 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700704 GetUpdateResponse2(OmahaRequestParams::kAppId,
705 "1.2.3.4", // version
706 "http://more/info",
707 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700708 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700709 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700710 "HASH1234=", // checksum
711 "false", // needs admin
712 "123", // size
713 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700714 "7", // max days to scatter
715 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700716 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700717 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700718 -1,
719 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700720 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800721 metrics::CheckResult::kUpdateAvailable,
722 metrics::CheckReaction::kDeferring,
723 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700724 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700725 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700726
Ben Chan9abb7632014-08-07 00:10:53 -0700727 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700728 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700729 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700730 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700731
732 // Verify if we are interactive check we don't defer.
733 params.set_interactive(true);
734 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700735 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700736 GetUpdateResponse2(OmahaRequestParams::kAppId,
737 "1.2.3.4", // version
738 "http://more/info",
739 "true", // prompt
740 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700741 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700742 "HASH1234=", // checksum
743 "false", // needs admin
744 "123", // size
745 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700746 "7", // max days to scatter
747 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700748 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700749 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700750 -1,
751 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700752 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800753 metrics::CheckResult::kUpdateAvailable,
754 metrics::CheckReaction::kUpdating,
755 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700756 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700757 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700758 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700759}
760
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700761TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700762 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700763 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700764 params.set_wall_clock_based_wait_enabled(true);
765 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700766
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700767 params.set_update_check_count_wait_enabled(true);
768 params.set_min_update_checks_needed(1);
769 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700770
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700771 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700772
773 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700774 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700775 GetUpdateResponse2(OmahaRequestParams::kAppId,
776 "1.2.3.4", // version
777 "http://more/info",
778 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700779 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700780 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700781 "HASH1234=", // checksum
782 "false", // needs admin
783 "123", // size
784 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700785 "7", // max days to scatter
786 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700787 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700788 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700789 -1,
790 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700791 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800792 metrics::CheckResult::kUpdateAvailable,
793 metrics::CheckReaction::kDeferring,
794 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700795 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700796 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700797
Ben Chan9abb7632014-08-07 00:10:53 -0700798 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700799 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700800 // count remains the same, as the decrementing happens in update_attempter
801 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700802 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700803 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700804
805 // Verify if we are interactive check we don't defer.
806 params.set_interactive(true);
807 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700808 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700809 GetUpdateResponse2(OmahaRequestParams::kAppId,
810 "1.2.3.4", // version
811 "http://more/info",
812 "true", // prompt
813 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700814 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700815 "HASH1234=", // checksum
816 "false", // needs admin
817 "123", // size
818 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700819 "7", // max days to scatter
820 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700821 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700822 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700823 -1,
824 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700825 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800826 metrics::CheckResult::kUpdateAvailable,
827 metrics::CheckReaction::kUpdating,
828 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700829 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700830 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700831 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700832}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700833
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700834TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700835 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
836
837 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
838
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700839 OmahaRequestParams params = request_params_;
840 fake_system_state_.set_request_params(&params);
841 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700842 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800843 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700844 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700845 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700846 OmahaRequestActionTestProcessorDelegate delegate;
847 delegate.loop_ = loop;
848 ActionProcessor processor;
849 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700850 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700851
852 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
853 g_main_loop_run(loop);
854 g_main_loop_unref(loop);
855 EXPECT_FALSE(processor.IsRunning());
856}
857
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700858TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700859 OmahaResponse response;
860 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700861 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700862 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700863 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700864 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700865 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800866 metrics::CheckResult::kParsingError,
867 metrics::CheckReaction::kUnset,
868 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700869 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700870 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700871 EXPECT_FALSE(response.update_exists);
872}
873
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700874TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -0700875 OmahaResponse response;
876 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700877 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -0700878 "",
879 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700880 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700881 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800882 metrics::CheckResult::kParsingError,
883 metrics::CheckReaction::kUnset,
884 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700885 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700886 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700887 EXPECT_FALSE(response.update_exists);
888}
889
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700890TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700891 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700892 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700893 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700894 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
895 "<daystart elapsed_seconds=\"100\"/>"
896 "<app appid=\"foo\" status=\"ok\">"
897 "<ping status=\"ok\"/>"
898 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700899 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700900 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700901 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800902 metrics::CheckResult::kParsingError,
903 metrics::CheckReaction::kUnset,
904 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700905 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700906 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700907 EXPECT_FALSE(response.update_exists);
908}
909
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700910TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700911 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700912 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700913 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700914 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
915 "<daystart elapsed_seconds=\"100\"/>"
916 "<app appid=\"foo\" status=\"ok\">"
917 "<ping status=\"ok\"/>"
918 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700919 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700920 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700921 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800922 metrics::CheckResult::kParsingError,
923 metrics::CheckReaction::kUnset,
924 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700925 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700926 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700927 EXPECT_FALSE(response.update_exists);
928}
929
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700930TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700931 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700932 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700933 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700934 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
935 "<daystart elapsed_seconds=\"100\"/>"
936 "<app appid=\"foo\" status=\"ok\">"
937 "<ping status=\"ok\"/>"
938 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700939 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700940 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700941 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800942 metrics::CheckResult::kParsingError,
943 metrics::CheckReaction::kUnset,
944 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700945 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700946 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700947 EXPECT_FALSE(response.update_exists);
948}
949
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700950TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700951 string input_response =
952 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
953 "<daystart elapsed_seconds=\"100\"/>"
954 "<app appid=\"xyz\" status=\"ok\">"
955 "<updatecheck status=\"ok\">"
956 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700957 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700958 "<packages><package hash=\"not-used\" name=\"f\" "
959 "size=\"587\"/></packages>"
960 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700961 "ChromeOSVersion=\"10.2.3.4\" "
962 "Prompt=\"false\" "
963 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800964 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700965 "sha256=\"lkq34j5345\" "
966 "needsadmin=\"true\" "
967 "/></actions></manifest></updatecheck></app></response>";
968 LOG(INFO) << "Input Response = " << input_response;
969
Darin Petkov6a5b3222010-07-13 14:55:28 -0700970 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700971 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700972 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700973 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700974 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700975 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800976 metrics::CheckResult::kUpdateAvailable,
977 metrics::CheckReaction::kUpdating,
978 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700979 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700980 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700981 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700982 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800983 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700984 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700985 EXPECT_EQ("lkq34j5345", response.hash);
986 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700987 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700988 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700989}
990
991namespace {
992class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
993 public:
994 void ProcessingStopped(const ActionProcessor* processor) {
995 ASSERT_TRUE(loop_);
996 g_main_loop_quit(loop_);
997 }
998 GMainLoop *loop_;
999};
1000
1001gboolean TerminateTransferTestStarter(gpointer data) {
1002 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1003 processor->StartProcessing();
1004 CHECK(processor->IsRunning());
1005 processor->StopProcessing();
1006 return FALSE;
1007}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001008} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001009
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001010TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001011 string http_response("doesn't matter");
1012 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1013
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001014 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001015 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001016 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001017 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001018 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001019 TerminateEarlyTestProcessorDelegate delegate;
1020 delegate.loop_ = loop;
1021 ActionProcessor processor;
1022 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001023 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001024
1025 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1026 g_main_loop_run(loop);
1027 g_main_loop_unref(loop);
1028}
1029
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001030TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001031 EXPECT_EQ("ab", XmlEncode("ab"));
1032 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001033 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1034 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1035
1036 vector<char> post_data;
1037
1038 // Make sure XML Encode is being called on the params
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001039 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001040 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001041 OmahaRequestParams::kOsVersion,
1042 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001043 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001044 OmahaRequestParams::kAppId,
1045 "0.1.0.0",
1046 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001047 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001048 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001049 "ChromeOSFirmware.1.0",
1050 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001051 false, // delta okay
1052 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001053 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001054 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -07001055 OmahaResponse response;
1056 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001057 TestUpdateCheck(&params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001058 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001059 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001060 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001061 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001062 metrics::CheckResult::kParsingError,
1063 metrics::CheckReaction::kUnset,
1064 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001065 &response,
1066 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001067 // convert post_data to string
1068 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001069 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1070 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001071 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1072 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1073 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1074 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001075 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1076 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001077}
1078
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001079TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001080 OmahaResponse response;
1081 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001082 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001083 GetUpdateResponse(OmahaRequestParams::kAppId,
1084 "1.2.3.4", // version
1085 "testthe&lt;url", // more info
1086 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001087 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001088 "file.signed", // file name
1089 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001090 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001091 "123", // size
1092 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001093 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001094 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001095 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001096 metrics::CheckResult::kUpdateAvailable,
1097 metrics::CheckReaction::kUpdating,
1098 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001099 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001100 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001101
1102 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001103 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001104 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001105}
1106
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001107TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001108 OmahaResponse response;
1109 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001110 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001111 GetUpdateResponse(OmahaRequestParams::kAppId,
1112 "1.2.3.4", // version
1113 "theurl", // more info
1114 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001115 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001116 "file.signed", // file name
1117 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001118 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001119 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001120 "123123123123123", // size
1121 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001122 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001123 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001124 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001125 metrics::CheckResult::kUpdateAvailable,
1126 metrics::CheckReaction::kUpdating,
1127 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001128 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001129 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001130
1131 EXPECT_EQ(response.size, 123123123123123ll);
1132}
1133
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001134TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001135 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001136 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001137 fake_system_state_.set_prefs(&prefs);
1138
Darin Petkov95508da2011-01-05 12:42:29 -08001139 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1140 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001141 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001142 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001143 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001144 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001145 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001146 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001147 metrics::CheckResult::kParsingError,
1148 metrics::CheckReaction::kUnset,
1149 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001150 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001151 &post_data));
1152 // convert post_data to string
1153 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001154 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001155 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001156 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001157 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001158 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1159 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001160 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1161 string::npos);
1162 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1163 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001164}
1165
Jay Srinivasan0a708742012-03-20 11:26:12 -07001166
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001167TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001168 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001169 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001170 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1171 "invalid xml>",
1172 &post_data);
1173 // convert post_data to string
1174 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001175 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001176 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001177 OmahaEvent::kTypeUpdateDownloadStarted,
1178 OmahaEvent::kResultSuccess);
1179 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001180 EXPECT_EQ(post_str.find("ping"), string::npos);
1181 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001182}
1183
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001184TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001185 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001186 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001187 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1188 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001189 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001190 "invalid xml>",
1191 &post_data);
1192 // convert post_data to string
1193 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001194 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001195 " <event eventtype=\"%d\" eventresult=\"%d\" "
1196 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001197 OmahaEvent::kTypeDownloadComplete,
1198 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001199 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001200 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001201 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001202}
1203
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001204TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001205 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001206 // Create a copy of the OmahaRequestParams to reuse it later.
1207 OmahaRequestParams params = request_params_;
1208 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001209 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001210 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001211 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001212 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001213 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001214 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001215 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001216 EXPECT_FALSE(update_check_action.IsEvent());
1217
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001218 params = request_params_;
1219 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001220 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001221 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001222 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001223 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001224 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001225 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001226 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001227 EXPECT_TRUE(event_action.IsEvent());
1228}
1229
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001230TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001231 for (int i = 0; i < 2; i++) {
1232 bool delta_okay = i == 1;
1233 const char* delta_okay_str = delta_okay ? "true" : "false";
1234 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001235 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001236 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001237 OmahaRequestParams::kOsVersion,
1238 "service_pack",
1239 "x86-generic",
1240 OmahaRequestParams::kAppId,
1241 "0.1.0.0",
1242 "en-US",
1243 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001244 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001245 "ChromeOSFirmware.1.0",
1246 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001247 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001248 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001249 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001250 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001251 ASSERT_FALSE(TestUpdateCheck(&params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001252 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001253 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001254 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001255 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001256 metrics::CheckResult::kParsingError,
1257 metrics::CheckReaction::kUnset,
1258 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001259 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001260 &post_data));
1261 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001262 string post_str(post_data.data(), post_data.size());
1263 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1264 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001265 string::npos)
1266 << "i = " << i;
1267 }
1268}
1269
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001270TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001271 for (int i = 0; i < 2; i++) {
1272 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001273 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001274 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001275 FakeSystemState fake_system_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001276 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001277 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001278 OmahaRequestParams::kOsVersion,
1279 "service_pack",
1280 "x86-generic",
1281 OmahaRequestParams::kAppId,
1282 "0.1.0.0",
1283 "en-US",
1284 "unittest_track",
1285 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001286 "ChromeOSFirmware.1.0",
1287 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001288 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001289 interactive,
1290 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001291 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001292 ASSERT_FALSE(TestUpdateCheck(&params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001293 "invalid xml>",
1294 -1,
1295 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001296 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001297 metrics::CheckResult::kParsingError,
1298 metrics::CheckReaction::kUnset,
1299 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001300 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001301 &post_data));
1302 // convert post_data to string
1303 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001304 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1305 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001306 string::npos)
1307 << "i = " << i;
1308 }
1309}
1310
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001311TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001312 OmahaEvent default_event;
1313 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1314 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001315 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001316
1317 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1318 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1319 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001320 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001321
1322 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1323 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001324 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001325 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1326 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001327 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001328}
1329
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001330void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001331 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001332 fake_system_state_.set_prefs(&prefs);
1333 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1334 .Times(AnyNumber());
1335 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1336 // Add a few hours to the day difference to test no rounding, etc.
1337 int64_t five_days_ago =
1338 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1339 int64_t six_days_ago =
1340 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1341 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1342 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1343 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1344 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1345 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1346 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1347 vector<char> post_data;
1348 ASSERT_TRUE(
1349 TestUpdateCheck(nullptr, // request_params
1350 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1351 -1,
1352 ping_only,
1353 ErrorCode::kSuccess,
1354 metrics::CheckResult::kUnset,
1355 metrics::CheckReaction::kUnset,
1356 metrics::DownloadErrorCode::kUnset,
1357 nullptr,
1358 &post_data));
1359 string post_str(&post_data[0], post_data.size());
1360 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1361 string::npos);
1362 if (ping_only) {
1363 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1364 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1365 } else {
1366 EXPECT_NE(post_str.find("updatecheck"), string::npos);
1367 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001368 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001369}
1370
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001371TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1372 PingTest(true /* ping_only */);
1373}
1374
1375TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1376 PingTest(false /* ping_only */);
1377}
1378
1379TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001380 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001381 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001382 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1383 .Times(AnyNumber());
1384 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001385 int64_t three_days_ago =
1386 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1387 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001388 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1389 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001390 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1391 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1392 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1393 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1394 vector<char> post_data;
1395 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001396 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001397 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001398 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001399 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001400 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001401 metrics::CheckResult::kNoUpdateAvailable,
1402 metrics::CheckReaction::kUnset,
1403 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001404 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001405 &post_data));
1406 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001407 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001408 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001409}
1410
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001411TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001412 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001413 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001414 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1415 .Times(AnyNumber());
1416 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001417 int64_t four_days_ago =
1418 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1419 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001420 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1421 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001422 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1423 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1424 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1425 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1426 vector<char> post_data;
1427 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001428 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001429 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001430 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001431 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001432 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001433 metrics::CheckResult::kNoUpdateAvailable,
1434 metrics::CheckReaction::kUnset,
1435 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001436 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001437 &post_data));
1438 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001439 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001440 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001441}
1442
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001443TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001444 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001445 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001446 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1447 .Times(AnyNumber());
1448 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001449 int64_t one_hour_ago =
1450 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001451 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1452 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001453 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1454 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1455 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1456 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001457 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1458 // send a ping.
1459 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1460 .WillOnce(Return(true));
1461 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1462 .WillOnce(Return(true));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001463 vector<char> post_data;
1464 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001465 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001466 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001467 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001468 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001469 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001470 metrics::CheckResult::kNoUpdateAvailable,
1471 metrics::CheckReaction::kUnset,
1472 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001473 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001474 &post_data));
1475 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001476 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001477}
1478
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001479TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07001480 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08001481 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001482 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07001483 int64_t now = Time::Now().ToInternalValue();
1484 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1485 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1486 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1487 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1488 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1489 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1490 vector<char> post_data;
1491 EXPECT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001492 TestUpdateCheck(nullptr, // request_params
Thieu Leb44e9e82011-06-06 14:34:04 -07001493 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1494 -1,
1495 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001496 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001497 metrics::CheckResult::kUnset,
1498 metrics::CheckReaction::kUnset,
1499 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001500 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001501 &post_data));
1502 EXPECT_EQ(post_data.size(), 0);
1503}
1504
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001505TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001506 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001507 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001508 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1509 .Times(AnyNumber());
1510 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001511 int64_t future =
1512 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001513 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1514 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001515 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1516 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1517 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1518 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1519 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1520 .WillOnce(Return(true));
1521 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1522 .WillOnce(Return(true));
1523 vector<char> post_data;
1524 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001525 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001526 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1527 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001528 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001529 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001530 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001531 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001532 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001533 metrics::CheckResult::kNoUpdateAvailable,
1534 metrics::CheckReaction::kUnset,
1535 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001536 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001537 &post_data));
1538 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001539 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001540}
1541
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001542TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001543 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001544 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001545 // may fail if it runs for longer than 5 seconds. It shouldn't run
1546 // that long though.
1547 int64_t midnight =
1548 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1549 int64_t midnight_slack =
1550 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08001551 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001552 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001553 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1554 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001555 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1556 AllOf(Ge(midnight), Le(midnight_slack))))
1557 .WillOnce(Return(true));
1558 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1559 AllOf(Ge(midnight), Le(midnight_slack))))
1560 .WillOnce(Return(true));
1561 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001562 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001563 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1564 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001565 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001566 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001567 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001568 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001569 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001570 metrics::CheckResult::kNoUpdateAvailable,
1571 metrics::CheckReaction::kUnset,
1572 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001573 nullptr,
1574 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001575}
1576
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001577TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001578 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001579 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001580 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1581 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001582 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1583 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1584 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001585 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001586 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1587 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001588 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001589 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001590 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001591 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001592 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001593 metrics::CheckResult::kNoUpdateAvailable,
1594 metrics::CheckReaction::kUnset,
1595 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001596 nullptr,
1597 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001598}
1599
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001600TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001601 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001602 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001603 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1604 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001605 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1606 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1607 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001608 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001609 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1610 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001611 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001612 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001613 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001614 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001615 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001616 metrics::CheckResult::kNoUpdateAvailable,
1617 metrics::CheckReaction::kUnset,
1618 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001619 nullptr,
1620 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001621}
1622
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001623TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Darin Petkov84c763c2010-07-29 16:27:58 -07001624 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001625 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov84c763c2010-07-29 16:27:58 -07001626 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001627 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001628 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001629 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001630 metrics::CheckResult::kParsingError,
1631 metrics::CheckReaction::kUnset,
1632 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001633 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001634 &post_data));
1635 // convert post_data to string
1636 string post_str(&post_data[0], post_data.size());
1637 EXPECT_EQ(post_str.find("machineid="), string::npos);
1638 EXPECT_EQ(post_str.find("userid="), string::npos);
1639}
1640
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001641TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001642 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001643 const int http_error_code =
1644 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001645 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001646 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001647 "",
1648 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001649 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001650 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001651 metrics::CheckResult::kDownloadError,
1652 metrics::CheckReaction::kUnset,
1653 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001654 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001655 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001656 EXPECT_FALSE(response.update_exists);
1657}
1658
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001659TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001660 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001661 const int http_error_code =
1662 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001663 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001664 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001665 "",
1666 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001667 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001668 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001669 metrics::CheckResult::kDownloadError,
1670 metrics::CheckReaction::kUnset,
1671 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001672 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001673 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001674 EXPECT_FALSE(response.update_exists);
1675}
1676
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001677TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001678 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001679 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001680 params.set_wall_clock_based_wait_enabled(true);
1681 params.set_waiting_period(TimeDelta().FromDays(1));
1682 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001683
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001684 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001685 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001686 GetUpdateResponse2(OmahaRequestParams::kAppId,
1687 "1.2.3.4", // version
1688 "http://more/info",
1689 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001690 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001691 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001692 "HASH1234=", // checksum
1693 "false", // needs admin
1694 "123", // size
1695 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001696 "7", // max days to scatter
1697 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001698 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001699 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001700 -1,
1701 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001702 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001703 metrics::CheckResult::kUpdateAvailable,
1704 metrics::CheckReaction::kDeferring,
1705 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001706 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001707 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001708
Ben Chan9abb7632014-08-07 00:10:53 -07001709 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001710 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001711 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001712 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001713
1714 // Verify if we are interactive check we don't defer.
1715 params.set_interactive(true);
1716 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001717 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -07001718 GetUpdateResponse2(OmahaRequestParams::kAppId,
1719 "1.2.3.4", // version
1720 "http://more/info",
1721 "true", // prompt
1722 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001723 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001724 "HASH1234=", // checksum
1725 "false", // needs admin
1726 "123", // size
1727 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001728 "7", // max days to scatter
1729 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001730 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001731 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001732 -1,
1733 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001734 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001735 metrics::CheckResult::kUpdateAvailable,
1736 metrics::CheckReaction::kUpdating,
1737 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001738 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001739 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001740 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001741}
1742
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001743TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001744 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001745 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001746 params.set_wall_clock_based_wait_enabled(true);
1747 params.set_waiting_period(TimeDelta().FromDays(1));
1748 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001749
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001750 // Set the timestamp to a very old value such that it exceeds the
1751 // waiting period set above.
1752 Time t1;
1753 Time::FromString("1/1/2012", &t1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001754 ASSERT_TRUE(fake_prefs_.SetInt64(
1755 kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001756 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001757 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001758 GetUpdateResponse2(OmahaRequestParams::kAppId,
1759 "1.2.3.4", // version
1760 "http://more/info",
1761 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001762 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001763 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001764 "HASH1234=", // checksum
1765 "false", // needs admin
1766 "123", // size
1767 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001768 "7", // max days to scatter
1769 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001770 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001771 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001772 -1,
1773 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001774 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001775 metrics::CheckResult::kUpdateAvailable,
1776 metrics::CheckReaction::kUpdating,
1777 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001778 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001779 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001780
1781 EXPECT_TRUE(response.update_exists);
1782
1783 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001784 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001785 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001786 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1787}
1788
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001789TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001790 // Create a uniquely named test directory.
1791 string test_dir;
1792 ASSERT_TRUE(utils::MakeTempDirectory(
1793 "omaha_request_action-test-XXXXXX", &test_dir));
1794
1795 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1796 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001797 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001798 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001799 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001800 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001801 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001802 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001803 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1804 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1805 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1806 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001807 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001808 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1809 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001810 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001811 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001812 params.SetLockDown(false);
1813 params.Init("1.2.3.4", "", 0);
1814 EXPECT_EQ("canary-channel", params.current_channel());
1815 EXPECT_EQ("stable-channel", params.target_channel());
1816 EXPECT_TRUE(params.to_more_stable_channel());
1817 EXPECT_TRUE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001818 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001819 "invalid xml>",
1820 -1,
1821 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001822 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001823 metrics::CheckResult::kParsingError,
1824 metrics::CheckReaction::kUnset,
1825 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001826 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001827 &post_data));
1828 // convert post_data to string
1829 string post_str(&post_data[0], post_data.size());
1830 EXPECT_NE(string::npos, post_str.find(
1831 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1832 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1833 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001834
1835 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001836}
1837
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001838TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001839 // Create a uniquely named test directory.
1840 string test_dir;
1841 ASSERT_TRUE(utils::MakeTempDirectory(
1842 "omaha_request_action-test-XXXXXX", &test_dir));
1843
1844 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1845 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001846 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001847 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001848 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001849 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001850 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001851 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001852 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1853 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1854 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1855 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001856 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001857 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001858 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001859 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001860 params.SetLockDown(false);
1861 params.Init("5.6.7.8", "", 0);
1862 EXPECT_EQ("stable-channel", params.current_channel());
1863 EXPECT_EQ("canary-channel", params.target_channel());
1864 EXPECT_FALSE(params.to_more_stable_channel());
1865 EXPECT_FALSE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001866 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001867 "invalid xml>",
1868 -1,
1869 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001870 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001871 metrics::CheckResult::kParsingError,
1872 metrics::CheckReaction::kUnset,
1873 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001874 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001875 &post_data));
1876 // convert post_data to string
1877 string post_str(&post_data[0], post_data.size());
1878 EXPECT_NE(string::npos, post_str.find(
1879 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1880 "version=\"5.6.7.8\" "
1881 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001882 EXPECT_EQ(string::npos, post_str.find("from_version"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001883}
1884
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001885// Checks that the initial ping with a=-1 r=-1 is not send when the device
1886// was powerwashed.
1887TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1888 fake_prefs_.SetString(kPrefsPreviousVersion, "");
1889
1890 // Flag that the device was powerwashed in the past.
1891 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1892
1893 vector<char> post_data;
1894 ASSERT_TRUE(
1895 TestUpdateCheck(nullptr, // request_params
1896 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1897 -1,
1898 false, // ping_only
1899 ErrorCode::kSuccess,
1900 metrics::CheckResult::kNoUpdateAvailable,
1901 metrics::CheckReaction::kUnset,
1902 metrics::DownloadErrorCode::kUnset,
1903 nullptr,
1904 &post_data));
1905 // We shouldn't send a ping in this case since powerwash > 0.
1906 string post_str(&post_data[0], post_data.size());
1907 EXPECT_EQ(string::npos, post_str.find("<ping"));
1908}
1909
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001910void OmahaRequestActionTest::P2PTest(
1911 bool initial_allow_p2p_for_downloading,
1912 bool initial_allow_p2p_for_sharing,
1913 bool omaha_disable_p2p_for_downloading,
1914 bool omaha_disable_p2p_for_sharing,
1915 bool payload_state_allow_p2p_attempt,
1916 bool expect_p2p_client_lookup,
1917 const string& p2p_client_result_url,
1918 bool expected_allow_p2p_for_downloading,
1919 bool expected_allow_p2p_for_sharing,
1920 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07001921 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001922 OmahaRequestParams request_params = request_params_;
Gilad Arnold74b5f552014-10-07 08:17:16 -07001923 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
1924 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
1925 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07001926
1927 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001928 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07001929 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
1930 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07001931 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
1932 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
1933 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
1934 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
1935 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
1936 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
1937 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
1938 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
1939 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
1940 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
1941
David Zeuthen8f191b22013-08-06 12:27:50 -07001942 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001943 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07001944 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
1945
David Zeuthen4cc5ed22014-01-15 12:35:03 -08001946 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
1947 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07001948 .Times(expect_p2p_client_lookup ? 1 : 0);
1949
1950 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001951 TestUpdateCheck(&request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07001952 GetUpdateResponse2(OmahaRequestParams::kAppId,
1953 "1.2.3.4", // version
1954 "http://more/info",
1955 "true", // prompt
1956 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001957 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07001958 "HASH1234=", // checksum
1959 "false", // needs admin
1960 "123", // size
1961 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001962 "7", // max days to scatter
1963 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001964 omaha_disable_p2p_for_downloading,
1965 omaha_disable_p2p_for_sharing),
1966 -1,
1967 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001968 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001969 metrics::CheckResult::kUpdateAvailable,
1970 metrics::CheckReaction::kUpdating,
1971 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07001972 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001973 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07001974 EXPECT_TRUE(response.update_exists);
1975
Gilad Arnold74b5f552014-10-07 08:17:16 -07001976 EXPECT_EQ(omaha_disable_p2p_for_downloading,
1977 response.disable_p2p_for_downloading);
1978 EXPECT_EQ(omaha_disable_p2p_for_sharing,
1979 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07001980
Gilad Arnold74b5f552014-10-07 08:17:16 -07001981 EXPECT_EQ(expected_allow_p2p_for_downloading,
1982 actual_allow_p2p_for_downloading);
1983 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
1984 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07001985}
1986
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001987TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001988 P2PTest(true, // initial_allow_p2p_for_downloading
1989 true, // initial_allow_p2p_for_sharing
1990 false, // omaha_disable_p2p_for_downloading
1991 false, // omaha_disable_p2p_for_sharing
1992 true, // payload_state_allow_p2p_attempt
1993 true, // expect_p2p_client_lookup
1994 "http://1.3.5.7/p2p", // p2p_client_result_url
1995 true, // expected_allow_p2p_for_downloading
1996 true, // expected_allow_p2p_for_sharing
1997 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07001998}
1999
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002000TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002001 P2PTest(true, // initial_allow_p2p_for_downloading
2002 true, // initial_allow_p2p_for_sharing
2003 false, // omaha_disable_p2p_for_downloading
2004 false, // omaha_disable_p2p_for_sharing
2005 true, // payload_state_allow_p2p_attempt
2006 true, // expect_p2p_client_lookup
2007 "", // p2p_client_result_url
2008 false, // expected_allow_p2p_for_downloading
2009 true, // expected_allow_p2p_for_sharing
2010 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002011}
2012
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002013TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002014 P2PTest(false, // initial_allow_p2p_for_downloading
2015 true, // initial_allow_p2p_for_sharing
2016 false, // omaha_disable_p2p_for_downloading
2017 false, // omaha_disable_p2p_for_sharing
2018 true, // payload_state_allow_p2p_attempt
2019 false, // expect_p2p_client_lookup
2020 "unset", // p2p_client_result_url
2021 false, // expected_allow_p2p_for_downloading
2022 true, // expected_allow_p2p_for_sharing
2023 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002024}
2025
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002026TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002027 P2PTest(true, // initial_allow_p2p_for_downloading
2028 true, // initial_allow_p2p_for_sharing
2029 true, // omaha_disable_p2p_for_downloading
2030 false, // omaha_disable_p2p_for_sharing
2031 true, // payload_state_allow_p2p_attempt
2032 false, // expect_p2p_client_lookup
2033 "unset", // p2p_client_result_url
2034 false, // expected_allow_p2p_for_downloading
2035 true, // expected_allow_p2p_for_sharing
2036 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002037}
2038
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002039TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002040 P2PTest(true, // initial_allow_p2p_for_downloading
2041 true, // initial_allow_p2p_for_sharing
2042 false, // omaha_disable_p2p_for_downloading
2043 true, // omaha_disable_p2p_for_sharing
2044 true, // payload_state_allow_p2p_attempt
2045 true, // expect_p2p_client_lookup
2046 "http://1.3.5.7/p2p", // p2p_client_result_url
2047 true, // expected_allow_p2p_for_downloading
2048 false, // expected_allow_p2p_for_sharing
2049 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002050}
2051
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002052TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002053 P2PTest(true, // initial_allow_p2p_for_downloading
2054 true, // initial_allow_p2p_for_sharing
2055 true, // omaha_disable_p2p_for_downloading
2056 true, // omaha_disable_p2p_for_sharing
2057 true, // payload_state_allow_p2p_attempt
2058 false, // expect_p2p_client_lookup
2059 "unset", // p2p_client_result_url
2060 false, // expected_allow_p2p_for_downloading
2061 false, // expected_allow_p2p_for_sharing
2062 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002063}
2064
Alex Deymof329b932014-10-30 01:37:48 -07002065bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2066 OmahaResponse *response) {
David Zeuthen639aa362014-02-03 16:23:44 -08002067 return
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002068 TestUpdateCheck(nullptr, // request_params
David Zeuthen639aa362014-02-03 16:23:44 -08002069 GetUpdateResponse2(OmahaRequestParams::kAppId,
2070 "1.2.3.4", // version
2071 "http://more/info",
2072 "true", // prompt
2073 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002074 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002075 "HASH1234=", // checksum
2076 "false", // needs admin
2077 "123", // size
2078 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002079 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002080 elapsed_days,
2081 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002082 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002083 -1,
2084 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002085 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002086 metrics::CheckResult::kUpdateAvailable,
2087 metrics::CheckReaction::kUpdating,
2088 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002089 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002090 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002091}
2092
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002093TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002094 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002095
2096 // Check that we parse elapsed_days in the Omaha Response correctly.
2097 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002098 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2099 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002100 EXPECT_TRUE(response.update_exists);
2101 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002102 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002103 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002104 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002105 EXPECT_EQ(prefs_days, 42);
2106
2107 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002108 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002109 EXPECT_TRUE(response.update_exists);
2110 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002111 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002112 EXPECT_EQ(prefs_days, 42);
2113
2114 // Note that elapsed_days is not necessarily divisible by 7 so check
2115 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002116 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2117 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002118 EXPECT_TRUE(response.update_exists);
2119 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002120 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002121 EXPECT_EQ(prefs_days, 21);
2122
2123 // Check that we correctly handle elapsed_days not being included in
2124 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002125 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002126 EXPECT_TRUE(response.update_exists);
2127 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002128}
2129
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002130// If there is no prefs and OOBE is not complete, we should not
2131// report anything to Omaha.
2132TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
2133 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2134 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2135}
David Zeuthen639aa362014-02-03 16:23:44 -08002136
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002137// If OOBE is complete and happened on a valid date (e.g. after Jan
2138// 1 2007 0:00 PST), that date should be used and written to
2139// prefs. However, first try with an invalid date and check we do
2140// nothing.
2141TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2142 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2143 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2144 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2145 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2146}
David Zeuthen639aa362014-02-03 16:23:44 -08002147
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002148// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2149// should yield an InstallDate of 14.
2150TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2151 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2152 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2153 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2154 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002155
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002156 int64_t prefs_days;
2157 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2158 EXPECT_EQ(prefs_days, 14);
2159}
David Zeuthen639aa362014-02-03 16:23:44 -08002160
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002161// Now that we have a valid date in prefs, check that we keep using
2162// that even if OOBE date reports something else. The date Jan 30,
2163// 2007 0:00 PST should yield an InstallDate of 28... but since
2164// there's a prefs file, we should still get 14.
2165TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2166 // Set a valid date in the prefs first.
2167 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002168
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002169 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2170 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2171 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002172
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002173 int64_t prefs_days;
2174 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2175 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002176
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002177 // If we delete the prefs file, we should get 28 days.
2178 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2179 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2180 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2181 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002182}
2183
Darin Petkov6a5b3222010-07-13 14:55:28 -07002184} // namespace chromeos_update_engine