blob: f358c39c85cc26e41aca2e0879c8e3bdfa6e8835 [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;
Alex Deymo10875d92014-11-10 21:52:57 -080033using chromeos_update_engine::test_utils::System;
34using chromeos_update_engine::test_utils::WriteFileString;
Darin Petkov6a5b3222010-07-13 14:55:28 -070035using std::string;
36using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070037using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070038using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070039using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070040using testing::Ge;
41using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080042using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070043using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070044using testing::ReturnPointee;
45using testing::SaveArg;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070046using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070047using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070048
49namespace chromeos_update_engine {
50
Alex Deymoe1e3afe2014-10-30 13:02:49 -070051class OmahaRequestActionTest : public ::testing::Test {
52 protected:
Alex Deymo610277e2014-11-11 21:18:11 -080053 void SetUp() override {
Alex Deymoe1e3afe2014-10-30 13:02:49 -070054 fake_system_state_.set_request_params(&request_params_);
55 fake_system_state_.set_prefs(&fake_prefs_);
56 }
57
58 // Returns true iff an output response was obtained from the
Alex Deymo8427b4a2014-11-05 14:00:32 -080059 // OmahaRequestAction. |prefs| may be null, in which case a local MockPrefs
Alex Deymoe1e3afe2014-10-30 13:02:49 -070060 // is used. |payload_state| may be null, in which case a local mock is used.
61 // |p2p_manager| may be null, in which case a local mock is used.
62 // |connection_manager| may be null, in which case a local mock is used.
63 // out_response may be null. If |fail_http_response_code| is non-negative,
64 // the transfer will fail with that code. |ping_only| is passed through to the
65 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
66 // post-data received by the mock HttpFetcher is returned.
67 //
68 // The |expected_check_result|, |expected_check_reaction| and
69 // |expected_error_code| parameters are for checking expectations
70 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
71 // UMA statistics. Use the appropriate ::kUnset value to specify that
72 // the given metric should not be reported.
73 bool TestUpdateCheck(OmahaRequestParams* request_params,
74 const string& http_response,
75 int fail_http_response_code,
76 bool ping_only,
77 ErrorCode expected_code,
78 metrics::CheckResult expected_check_result,
79 metrics::CheckReaction expected_check_reaction,
80 metrics::DownloadErrorCode expected_download_error_code,
81 OmahaResponse* out_response,
82 vector<char>* out_post_data);
83
84 // Runs and checks a ping test. |ping_only| indicates wheter it should send
85 // only a ping or also an updatecheck.
86 void PingTest(bool ping_only);
87
88 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -070089 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -070090 OmahaResponse *response);
91
92 // P2P test helper function.
93 void P2PTest(
94 bool initial_allow_p2p_for_downloading,
95 bool initial_allow_p2p_for_sharing,
96 bool omaha_disable_p2p_for_downloading,
97 bool omaha_disable_p2p_for_sharing,
98 bool payload_state_allow_p2p_attempt,
99 bool expect_p2p_client_lookup,
100 const string& p2p_client_result_url,
101 bool expected_allow_p2p_for_downloading,
102 bool expected_allow_p2p_for_sharing,
103 const string& expected_p2p_url);
104
105 FakeSystemState fake_system_state_;
106
107 // By default, all tests use these objects unless they replace them in the
108 // fake_system_state_.
109 OmahaRequestParams request_params_ = OmahaRequestParams{
110 &fake_system_state_,
111 OmahaRequestParams::kOsPlatform,
112 OmahaRequestParams::kOsVersion,
113 "service_pack",
114 "x86-generic",
115 OmahaRequestParams::kAppId,
116 "0.1.0.0",
117 "en-US",
118 "unittest",
119 "OEM MODEL 09235 7471",
120 "ChromeOSFirmware.1.0",
121 "0X0A1",
122 false, // delta okay
123 false, // interactive
124 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -0700125 ""}; // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700126
127 FakePrefs fake_prefs_;
128};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700129
130namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700131
Darin Petkov6a5b3222010-07-13 14:55:28 -0700132string GetNoUpdateResponse(const string& app_id) {
133 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700134 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
135 "<daystart elapsed_seconds=\"100\"/>"
136 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
137 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -0700138}
139
David Zeuthenf3e28012014-08-26 18:23:52 -0400140string GetNoUpdateResponseWithEntity(const string& app_id) {
141 return string(
142 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
143 "<!DOCTYPE response ["
144 "<!ENTITY CrOS \"ChromeOS\">"
145 "]>"
146 "<response protocol=\"3.0\">"
147 "<daystart elapsed_seconds=\"100\"/>"
148 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
149 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
150}
151
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700152string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700153 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700154 const string& more_info_url,
155 const string& prompt,
156 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700157 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700158 const string& hash,
159 const string& needsadmin,
160 const string& size,
161 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700162 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800163 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700164 bool disable_p2p_for_downloading,
165 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700166 string response =
167 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
168 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800169 "<daystart elapsed_seconds=\"100\"" +
170 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
171 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700172 "<app appid=\"" + app_id + "\" status=\"ok\">"
173 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
174 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700175 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700176 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
177 "size=\"" + size + "\"/></packages>"
178 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700179 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700180 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
181 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800182 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700183 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700184 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700185 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700186 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700187 (disable_p2p_for_downloading ?
188 "DisableP2PForDownloading=\"true\" " : "") +
189 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700190 "/></actions></manifest></updatecheck></app></response>";
191 LOG(INFO) << "Response = " << response;
192 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700193}
194
Darin Petkov6a5b3222010-07-13 14:55:28 -0700195string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700196 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700197 const string& more_info_url,
198 const string& prompt,
199 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700200 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700201 const string& hash,
202 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700203 const string& size,
204 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700205 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700206 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700207 more_info_url,
208 prompt,
209 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700210 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700211 hash,
212 needsadmin,
213 size,
214 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700215 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700216 "42", // elapsed_days
217 false, // disable_p2p_for_downloading
218 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700219}
220
221class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
222 public:
223 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700224 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700225 expected_code_(ErrorCode::kSuccess) {}
Alex Deymo610277e2014-11-11 21:18:11 -0800226 ~OmahaRequestActionTestProcessorDelegate() override {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700228 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700229 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700230 ASSERT_TRUE(loop_);
231 g_main_loop_quit(loop_);
232 }
233
234 virtual void ActionCompleted(ActionProcessor* processor,
235 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700236 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700237 // make sure actions always succeed
238 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700239 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700240 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700241 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700242 }
243 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700244 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700245};
246
247gboolean StartProcessorInRunLoop(gpointer data) {
248 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
249 processor->StartProcessing();
250 return FALSE;
251}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700252} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700253
254class OutputObjectCollectorAction;
255
256template<>
257class ActionTraits<OutputObjectCollectorAction> {
258 public:
259 // Does not take an object for input
260 typedef OmahaResponse InputObjectType;
261 // On success, puts the output path on output
262 typedef NoneType OutputObjectType;
263};
264
265class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
266 public:
267 OutputObjectCollectorAction() : has_input_object_(false) {}
268 void PerformAction() {
269 // copy input object
270 has_input_object_ = HasInputObject();
271 if (has_input_object_)
272 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700273 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700274 }
275 // Should never be called
276 void TerminateProcessing() {
277 CHECK(false);
278 }
279 // Debugging/logging
Alex Deymof329b932014-10-30 01:37:48 -0700280 static string StaticType() {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700281 return "OutputObjectCollectorAction";
282 }
Alex Deymof329b932014-10-30 01:37:48 -0700283 string Type() const { return StaticType(); }
Darin Petkov6a5b3222010-07-13 14:55:28 -0700284 bool has_input_object_;
285 OmahaResponse omaha_response_;
286};
287
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700288bool OmahaRequestActionTest::TestUpdateCheck(
289 OmahaRequestParams* request_params,
290 const string& http_response,
291 int fail_http_response_code,
292 bool ping_only,
293 ErrorCode expected_code,
294 metrics::CheckResult expected_check_result,
295 metrics::CheckReaction expected_check_reaction,
296 metrics::DownloadErrorCode expected_download_error_code,
297 OmahaResponse* out_response,
298 vector<char>* out_post_data) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700299 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
300 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800301 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700302 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700303 if (fail_http_response_code >= 0) {
304 fetcher->FailTransfer(fail_http_response_code);
305 }
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700306 if (request_params)
307 fake_system_state_.set_request_params(request_params);
308 OmahaRequestAction action(&fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700309 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700310 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700311 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312 OmahaRequestActionTestProcessorDelegate delegate;
313 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700314 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700315
Darin Petkov6a5b3222010-07-13 14:55:28 -0700316 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700317 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700318 processor.EnqueueAction(&action);
319
320 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700321 BondActions(&action, &collector_action);
322 processor.EnqueueAction(&collector_action);
323
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700324 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800325 .Times(AnyNumber());
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700326 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800327 SendEnumToUMA(metrics::kMetricCheckResult,
328 static_cast<int>(expected_check_result),
329 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
330 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700331 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800332 SendEnumToUMA(metrics::kMetricCheckReaction,
333 static_cast<int>(expected_check_reaction),
334 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
335 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700336 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700337 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
338 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800339 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
340 ? 0 : 1);
341
Darin Petkov6a5b3222010-07-13 14:55:28 -0700342 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
343 g_main_loop_run(loop);
344 g_main_loop_unref(loop);
345 if (collector_action.has_input_object_ && out_response)
346 *out_response = collector_action.omaha_response_;
347 if (out_post_data)
348 *out_post_data = fetcher->post_data();
349 return collector_action.has_input_object_;
350}
351
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700352// Tests Event requests -- they should always succeed. |out_post_data|
353// may be null; if non-null, the post-data received by the mock
354// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700355void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700356 OmahaEvent* event,
357 const string& http_response,
358 vector<char>* out_post_data) {
359 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
360 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800361 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700362 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700363 FakeSystemState fake_system_state;
364 fake_system_state.set_request_params(&params);
365 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700366 OmahaRequestActionTestProcessorDelegate delegate;
367 delegate.loop_ = loop;
368 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700369 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700370 processor.EnqueueAction(&action);
371
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700372 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
373 g_main_loop_run(loop);
374 g_main_loop_unref(loop);
375 if (out_post_data)
376 *out_post_data = fetcher->post_data();
377}
378
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700379TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400380 OmahaResponse response;
381 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700382 TestUpdateCheck(nullptr, // request_params
David Zeuthenf3e28012014-08-26 18:23:52 -0400383 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
384 -1,
385 false, // ping_only
386 ErrorCode::kOmahaRequestXMLHasEntityDecl,
387 metrics::CheckResult::kParsingError,
388 metrics::CheckReaction::kUnset,
389 metrics::DownloadErrorCode::kUnset,
390 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700391 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400392 EXPECT_FALSE(response.update_exists);
393}
394
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700395TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700396 OmahaResponse response;
397 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700398 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700399 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700400 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700401 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700402 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800403 metrics::CheckResult::kNoUpdateAvailable,
404 metrics::CheckReaction::kUnset,
405 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700406 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700407 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700408 EXPECT_FALSE(response.update_exists);
409}
410
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700411TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700412 OmahaResponse response;
413 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700414 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700415 GetUpdateResponse(OmahaRequestParams::kAppId,
416 "1.2.3.4", // version
417 "http://more/info",
418 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700419 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700420 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700421 "HASH1234=", // checksum
422 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700423 "123", // size
424 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700425 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700426 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700427 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800428 metrics::CheckResult::kUpdateAvailable,
429 metrics::CheckReaction::kUpdating,
430 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700431 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700432 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700433 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700434 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700435 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800436 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700437 EXPECT_EQ("http://more/info", response.more_info_url);
438 EXPECT_EQ("HASH1234=", response.hash);
439 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700440 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700441 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700442}
443
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700444TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700445 OmahaResponse response;
446 // Set up a connection manager that doesn't allow a valid update over
447 // the current ethernet connection.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700448 MockConnectionManager mock_cm(nullptr);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700449 fake_system_state_.set_connection_manager(&mock_cm);
450
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700451 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700452 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
453 SetArgumentPointee<2>(NetworkTethering::kUnknown),
454 Return(true)));
455 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
456 .WillRepeatedly(Return(false));
457 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
458 .WillRepeatedly(Return(shill::kTypeEthernet));
459
460 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700461 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700462 GetUpdateResponse(OmahaRequestParams::kAppId,
463 "1.2.3.4", // version
464 "http://more/info",
465 "true", // prompt
466 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700467 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700468 "HASH1234=", // checksum
469 "false", // needs admin
470 "123", // size
471 ""), // deadline
472 -1,
473 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700474 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700475 metrics::CheckResult::kUpdateAvailable,
476 metrics::CheckReaction::kIgnored,
477 metrics::DownloadErrorCode::kUnset,
478 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700479 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700480 EXPECT_FALSE(response.update_exists);
481}
482
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700483TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700484 string rollback_version = "1234.0.0";
485 OmahaResponse response;
486
487 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700488 fake_system_state_.set_payload_state(&mock_payload_state);
489
Chris Sosa77f79e82014-06-02 18:16:24 -0700490 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
491 .WillRepeatedly(Return(rollback_version));
492
493 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700494 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700495 GetUpdateResponse(OmahaRequestParams::kAppId,
496 rollback_version, // version
497 "http://more/info",
498 "true", // prompt
499 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700500 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700501 "HASH1234=", // checksum
502 "false", // needs admin
503 "123", // size
504 ""), // deadline
505 -1,
506 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700507 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700508 metrics::CheckResult::kUpdateAvailable,
509 metrics::CheckReaction::kIgnored,
510 metrics::DownloadErrorCode::kUnset,
511 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700512 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700513 EXPECT_FALSE(response.update_exists);
514}
515
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700516TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700517 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700518 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700519 params.set_wall_clock_based_wait_enabled(true);
520 params.set_update_check_count_wait_enabled(false);
521 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700522
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700523 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700524 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700525 GetUpdateResponse2(OmahaRequestParams::kAppId,
526 "1.2.3.4", // version
527 "http://more/info",
528 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700529 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700530 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700531 "HASH1234=", // checksum
532 "false", // needs admin
533 "123", // size
534 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700535 "7", // max days to scatter
536 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700537 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700538 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700539 -1,
540 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700541 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800542 metrics::CheckResult::kUpdateAvailable,
543 metrics::CheckReaction::kDeferring,
544 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700545 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700546 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700547 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700548
549 // Verify if we are interactive check we don't defer.
550 params.set_interactive(true);
551 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700552 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700553 GetUpdateResponse2(OmahaRequestParams::kAppId,
554 "1.2.3.4", // version
555 "http://more/info",
556 "true", // prompt
557 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700558 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700559 "HASH1234=", // checksum
560 "false", // needs admin
561 "123", // size
562 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700563 "7", // max days to scatter
564 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700565 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700566 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700567 -1,
568 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700569 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800570 metrics::CheckResult::kUpdateAvailable,
571 metrics::CheckReaction::kUpdating,
572 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700573 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700574 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700575 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700576}
577
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700578TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700579 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700580 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700581 params.set_wall_clock_based_wait_enabled(false);
582 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700583
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700584 params.set_update_check_count_wait_enabled(true);
585 params.set_min_update_checks_needed(1);
586 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700587
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700588 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700589 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700590 GetUpdateResponse2(OmahaRequestParams::kAppId,
591 "1.2.3.4", // version
592 "http://more/info",
593 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700594 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700595 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700596 "HASH1234=", // checksum
597 "false", // needs admin
598 "123", // size
599 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700600 "7", // max days to scatter
601 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700602 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700603 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700604 -1,
605 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700606 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800607 metrics::CheckResult::kUpdateAvailable,
608 metrics::CheckReaction::kUpdating,
609 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700610 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700611 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700612 EXPECT_TRUE(response.update_exists);
613}
614
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700615TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700616 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700617 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700618 params.set_wall_clock_based_wait_enabled(true);
619 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700620
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700621 params.set_update_check_count_wait_enabled(true);
622 params.set_min_update_checks_needed(1);
623 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700624
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700625 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700626 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700627 GetUpdateResponse2(OmahaRequestParams::kAppId,
628 "1.2.3.4", // version
629 "http://more/info",
630 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700631 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700632 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700633 "HASH1234=", // checksum
634 "false", // needs admin
635 "123", // size
636 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700637 "0", // max days to scatter
638 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700639 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700640 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700641 -1,
642 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700643 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800644 metrics::CheckResult::kUpdateAvailable,
645 metrics::CheckReaction::kUpdating,
646 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700647 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700648 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700649 EXPECT_TRUE(response.update_exists);
650}
651
652
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700653TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700654 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700655 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700656 params.set_wall_clock_based_wait_enabled(true);
657 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700658
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700659 params.set_update_check_count_wait_enabled(true);
660 params.set_min_update_checks_needed(0);
661 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700662
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700663 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700664 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700665 GetUpdateResponse2(OmahaRequestParams::kAppId,
666 "1.2.3.4", // version
667 "http://more/info",
668 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700669 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700670 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700671 "HASH1234=", // checksum
672 "false", // needs admin
673 "123", // size
674 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700675 "7", // max days to scatter
676 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700677 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700678 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700679 -1,
680 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700681 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800682 metrics::CheckResult::kUpdateAvailable,
683 metrics::CheckReaction::kUpdating,
684 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700685 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700686 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700687
Ben Chan9abb7632014-08-07 00:10:53 -0700688 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700689 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700690 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700691 EXPECT_TRUE(response.update_exists);
692}
693
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700694TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700695 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700696 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700697 params.set_wall_clock_based_wait_enabled(true);
698 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700699
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700700 params.set_update_check_count_wait_enabled(true);
701 params.set_min_update_checks_needed(1);
702 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700703
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700704 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700705 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700706 GetUpdateResponse2(OmahaRequestParams::kAppId,
707 "1.2.3.4", // version
708 "http://more/info",
709 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700710 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700711 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700712 "HASH1234=", // checksum
713 "false", // needs admin
714 "123", // size
715 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700716 "7", // max days to scatter
717 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700718 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700719 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700720 -1,
721 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700722 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800723 metrics::CheckResult::kUpdateAvailable,
724 metrics::CheckReaction::kDeferring,
725 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700726 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700727 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700728
Ben Chan9abb7632014-08-07 00:10:53 -0700729 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700730 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700731 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700732 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700733
734 // Verify if we are interactive check we don't defer.
735 params.set_interactive(true);
736 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700737 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700738 GetUpdateResponse2(OmahaRequestParams::kAppId,
739 "1.2.3.4", // version
740 "http://more/info",
741 "true", // prompt
742 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700743 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700744 "HASH1234=", // checksum
745 "false", // needs admin
746 "123", // size
747 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700748 "7", // max days to scatter
749 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700750 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700751 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700752 -1,
753 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700754 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800755 metrics::CheckResult::kUpdateAvailable,
756 metrics::CheckReaction::kUpdating,
757 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700758 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700759 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700760 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700761}
762
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700763TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700764 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700765 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700766 params.set_wall_clock_based_wait_enabled(true);
767 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700769 params.set_update_check_count_wait_enabled(true);
770 params.set_min_update_checks_needed(1);
771 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700772
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700773 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700774
775 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700776 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700777 GetUpdateResponse2(OmahaRequestParams::kAppId,
778 "1.2.3.4", // version
779 "http://more/info",
780 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700781 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700782 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700783 "HASH1234=", // checksum
784 "false", // needs admin
785 "123", // size
786 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700787 "7", // max days to scatter
788 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700789 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700790 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700791 -1,
792 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700793 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800794 metrics::CheckResult::kUpdateAvailable,
795 metrics::CheckReaction::kDeferring,
796 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700797 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700798 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700799
Ben Chan9abb7632014-08-07 00:10:53 -0700800 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700801 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700802 // count remains the same, as the decrementing happens in update_attempter
803 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700804 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700805 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700806
807 // Verify if we are interactive check we don't defer.
808 params.set_interactive(true);
809 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700810 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700811 GetUpdateResponse2(OmahaRequestParams::kAppId,
812 "1.2.3.4", // version
813 "http://more/info",
814 "true", // prompt
815 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700816 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700817 "HASH1234=", // checksum
818 "false", // needs admin
819 "123", // size
820 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700821 "7", // max days to scatter
822 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700823 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700824 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700825 -1,
826 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700827 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800828 metrics::CheckResult::kUpdateAvailable,
829 metrics::CheckReaction::kUpdating,
830 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700831 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700832 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700833 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700835
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700836TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700837 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
838
839 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
840
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700841 OmahaRequestParams params = request_params_;
842 fake_system_state_.set_request_params(&params);
843 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700844 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800845 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700846 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700847 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700848 OmahaRequestActionTestProcessorDelegate delegate;
849 delegate.loop_ = loop;
850 ActionProcessor processor;
851 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700852 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700853
854 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
855 g_main_loop_run(loop);
856 g_main_loop_unref(loop);
857 EXPECT_FALSE(processor.IsRunning());
858}
859
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700860TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700861 OmahaResponse response;
862 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700863 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700864 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700865 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700866 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700867 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800868 metrics::CheckResult::kParsingError,
869 metrics::CheckReaction::kUnset,
870 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700871 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700872 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700873 EXPECT_FALSE(response.update_exists);
874}
875
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700876TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -0700877 OmahaResponse response;
878 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700879 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -0700880 "",
881 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700882 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700883 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800884 metrics::CheckResult::kParsingError,
885 metrics::CheckReaction::kUnset,
886 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700887 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700888 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700889 EXPECT_FALSE(response.update_exists);
890}
891
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700892TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700893 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700894 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700895 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700896 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
897 "<daystart elapsed_seconds=\"100\"/>"
898 "<app appid=\"foo\" status=\"ok\">"
899 "<ping status=\"ok\"/>"
900 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700901 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700902 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700903 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800904 metrics::CheckResult::kParsingError,
905 metrics::CheckReaction::kUnset,
906 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700907 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700908 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700909 EXPECT_FALSE(response.update_exists);
910}
911
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700912TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700913 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700914 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700915 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700916 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
917 "<daystart elapsed_seconds=\"100\"/>"
918 "<app appid=\"foo\" status=\"ok\">"
919 "<ping status=\"ok\"/>"
920 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700921 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700922 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700923 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800924 metrics::CheckResult::kParsingError,
925 metrics::CheckReaction::kUnset,
926 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700927 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700928 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700929 EXPECT_FALSE(response.update_exists);
930}
931
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700932TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700933 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700934 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700935 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700936 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
937 "<daystart elapsed_seconds=\"100\"/>"
938 "<app appid=\"foo\" status=\"ok\">"
939 "<ping status=\"ok\"/>"
940 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700941 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700942 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700943 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800944 metrics::CheckResult::kParsingError,
945 metrics::CheckReaction::kUnset,
946 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700947 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700948 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700949 EXPECT_FALSE(response.update_exists);
950}
951
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700952TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700953 string input_response =
954 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
955 "<daystart elapsed_seconds=\"100\"/>"
956 "<app appid=\"xyz\" status=\"ok\">"
957 "<updatecheck status=\"ok\">"
958 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700959 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700960 "<packages><package hash=\"not-used\" name=\"f\" "
961 "size=\"587\"/></packages>"
962 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700963 "ChromeOSVersion=\"10.2.3.4\" "
964 "Prompt=\"false\" "
965 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800966 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700967 "sha256=\"lkq34j5345\" "
968 "needsadmin=\"true\" "
969 "/></actions></manifest></updatecheck></app></response>";
970 LOG(INFO) << "Input Response = " << input_response;
971
Darin Petkov6a5b3222010-07-13 14:55:28 -0700972 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700973 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700974 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700975 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700976 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700977 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800978 metrics::CheckResult::kUpdateAvailable,
979 metrics::CheckReaction::kUpdating,
980 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700981 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700982 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700983 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700984 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800985 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700986 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700987 EXPECT_EQ("lkq34j5345", response.hash);
988 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700989 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700990 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700991}
992
993namespace {
994class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
995 public:
996 void ProcessingStopped(const ActionProcessor* processor) {
997 ASSERT_TRUE(loop_);
998 g_main_loop_quit(loop_);
999 }
1000 GMainLoop *loop_;
1001};
1002
1003gboolean TerminateTransferTestStarter(gpointer data) {
1004 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1005 processor->StartProcessing();
1006 CHECK(processor->IsRunning());
1007 processor->StopProcessing();
1008 return FALSE;
1009}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001010} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001011
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001012TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001013 string http_response("doesn't matter");
1014 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1015
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001016 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001017 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001018 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001019 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001020 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001021 TerminateEarlyTestProcessorDelegate delegate;
1022 delegate.loop_ = loop;
1023 ActionProcessor processor;
1024 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001025 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001026
1027 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1028 g_main_loop_run(loop);
1029 g_main_loop_unref(loop);
1030}
1031
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001032TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001033 EXPECT_EQ("ab", XmlEncode("ab"));
1034 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001035 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1036 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1037
1038 vector<char> post_data;
1039
1040 // Make sure XML Encode is being called on the params
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001041 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001042 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001043 OmahaRequestParams::kOsVersion,
1044 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001045 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001046 OmahaRequestParams::kAppId,
1047 "0.1.0.0",
1048 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001049 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001050 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001051 "ChromeOSFirmware.1.0",
1052 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001053 false, // delta okay
1054 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001055 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001056 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -07001057 OmahaResponse response;
1058 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001059 TestUpdateCheck(&params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001060 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001061 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001062 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001063 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001064 metrics::CheckResult::kParsingError,
1065 metrics::CheckReaction::kUnset,
1066 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001067 &response,
1068 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001069 // convert post_data to string
1070 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001071 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1072 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001073 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1074 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1075 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1076 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001077 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1078 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001079}
1080
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001081TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001082 OmahaResponse response;
1083 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001084 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001085 GetUpdateResponse(OmahaRequestParams::kAppId,
1086 "1.2.3.4", // version
1087 "testthe&lt;url", // more info
1088 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001089 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001090 "file.signed", // file name
1091 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001092 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001093 "123", // size
1094 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001095 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001096 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001097 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001098 metrics::CheckResult::kUpdateAvailable,
1099 metrics::CheckReaction::kUpdating,
1100 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001101 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001102 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001103
1104 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001105 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001106 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001107}
1108
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001109TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001110 OmahaResponse response;
1111 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001112 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001113 GetUpdateResponse(OmahaRequestParams::kAppId,
1114 "1.2.3.4", // version
1115 "theurl", // more info
1116 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001117 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001118 "file.signed", // file name
1119 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001120 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001121 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001122 "123123123123123", // size
1123 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001124 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001125 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001126 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001127 metrics::CheckResult::kUpdateAvailable,
1128 metrics::CheckReaction::kUpdating,
1129 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001130 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001131 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001132
1133 EXPECT_EQ(response.size, 123123123123123ll);
1134}
1135
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001136TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001137 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001138 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001139 fake_system_state_.set_prefs(&prefs);
1140
Darin Petkov95508da2011-01-05 12:42:29 -08001141 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1142 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001143 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001144 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001145 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001146 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001147 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001148 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001149 metrics::CheckResult::kParsingError,
1150 metrics::CheckReaction::kUnset,
1151 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001152 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001153 &post_data));
1154 // convert post_data to string
1155 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001156 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001157 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001158 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001159 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001160 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1161 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001162 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1163 string::npos);
1164 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1165 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001166}
1167
Jay Srinivasan0a708742012-03-20 11:26:12 -07001168
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001169TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001170 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001171 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001172 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1173 "invalid xml>",
1174 &post_data);
1175 // convert post_data to string
1176 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001177 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001178 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001179 OmahaEvent::kTypeUpdateDownloadStarted,
1180 OmahaEvent::kResultSuccess);
1181 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001182 EXPECT_EQ(post_str.find("ping"), string::npos);
1183 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001184}
1185
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001186TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001187 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001188 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001189 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1190 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001191 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001192 "invalid xml>",
1193 &post_data);
1194 // convert post_data to string
1195 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001196 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001197 " <event eventtype=\"%d\" eventresult=\"%d\" "
1198 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001199 OmahaEvent::kTypeDownloadComplete,
1200 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001201 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001202 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001203 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001204}
1205
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001206TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001207 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001208 // Create a copy of the OmahaRequestParams to reuse it later.
1209 OmahaRequestParams params = request_params_;
1210 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001211 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001212 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001213 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001214 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001215 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001216 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001217 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001218 EXPECT_FALSE(update_check_action.IsEvent());
1219
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001220 params = request_params_;
1221 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001222 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001223 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001224 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001225 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001226 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001227 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001228 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001229 EXPECT_TRUE(event_action.IsEvent());
1230}
1231
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001232TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001233 for (int i = 0; i < 2; i++) {
1234 bool delta_okay = i == 1;
1235 const char* delta_okay_str = delta_okay ? "true" : "false";
1236 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001237 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001238 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001239 OmahaRequestParams::kOsVersion,
1240 "service_pack",
1241 "x86-generic",
1242 OmahaRequestParams::kAppId,
1243 "0.1.0.0",
1244 "en-US",
1245 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001246 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001247 "ChromeOSFirmware.1.0",
1248 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001249 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001250 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001251 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001252 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001253 ASSERT_FALSE(TestUpdateCheck(&params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001254 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001255 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001256 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001257 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001258 metrics::CheckResult::kParsingError,
1259 metrics::CheckReaction::kUnset,
1260 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001261 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001262 &post_data));
1263 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001264 string post_str(post_data.data(), post_data.size());
1265 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1266 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001267 string::npos)
1268 << "i = " << i;
1269 }
1270}
1271
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001272TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001273 for (int i = 0; i < 2; i++) {
1274 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001275 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001276 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001277 FakeSystemState fake_system_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001278 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001279 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001280 OmahaRequestParams::kOsVersion,
1281 "service_pack",
1282 "x86-generic",
1283 OmahaRequestParams::kAppId,
1284 "0.1.0.0",
1285 "en-US",
1286 "unittest_track",
1287 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001288 "ChromeOSFirmware.1.0",
1289 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001290 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001291 interactive,
1292 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001293 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001294 ASSERT_FALSE(TestUpdateCheck(&params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001295 "invalid xml>",
1296 -1,
1297 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001298 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001299 metrics::CheckResult::kParsingError,
1300 metrics::CheckReaction::kUnset,
1301 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001302 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001303 &post_data));
1304 // convert post_data to string
1305 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001306 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1307 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001308 string::npos)
1309 << "i = " << i;
1310 }
1311}
1312
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001313TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001314 OmahaEvent default_event;
1315 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1316 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001317 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001318
1319 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1320 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1321 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001322 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001323
1324 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1325 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001326 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001327 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1328 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001329 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001330}
1331
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001332void OmahaRequestActionTest::PingTest(bool ping_only) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001333 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001334 fake_system_state_.set_prefs(&prefs);
1335 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1336 .Times(AnyNumber());
1337 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1338 // Add a few hours to the day difference to test no rounding, etc.
1339 int64_t five_days_ago =
1340 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1341 int64_t six_days_ago =
1342 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1343 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1344 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1345 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1346 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1347 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1348 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1349 vector<char> post_data;
1350 ASSERT_TRUE(
1351 TestUpdateCheck(nullptr, // request_params
1352 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1353 -1,
1354 ping_only,
1355 ErrorCode::kSuccess,
1356 metrics::CheckResult::kUnset,
1357 metrics::CheckReaction::kUnset,
1358 metrics::DownloadErrorCode::kUnset,
1359 nullptr,
1360 &post_data));
1361 string post_str(&post_data[0], post_data.size());
1362 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1363 string::npos);
1364 if (ping_only) {
1365 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1366 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1367 } else {
1368 EXPECT_NE(post_str.find("updatecheck"), string::npos);
1369 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001370 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001371}
1372
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001373TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1374 PingTest(true /* ping_only */);
1375}
1376
1377TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1378 PingTest(false /* ping_only */);
1379}
1380
1381TEST_F(OmahaRequestActionTest, ActivePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001382 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001383 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001384 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1385 .Times(AnyNumber());
1386 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001387 int64_t three_days_ago =
1388 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1389 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001390 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1391 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001392 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1393 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1394 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1395 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1396 vector<char> post_data;
1397 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001398 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001399 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001400 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001401 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001402 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001403 metrics::CheckResult::kNoUpdateAvailable,
1404 metrics::CheckReaction::kUnset,
1405 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001406 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001407 &post_data));
1408 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001409 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001410 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001411}
1412
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001413TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001414 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001415 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001416 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1417 .Times(AnyNumber());
1418 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001419 int64_t four_days_ago =
1420 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1421 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001422 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1423 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001424 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1425 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1426 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1427 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1428 vector<char> post_data;
1429 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001430 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001431 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001432 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001433 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001434 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001435 metrics::CheckResult::kNoUpdateAvailable,
1436 metrics::CheckReaction::kUnset,
1437 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001438 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001439 &post_data));
1440 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001441 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001442 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001443}
1444
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001445TEST_F(OmahaRequestActionTest, NoPingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001446 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001447 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001448 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1449 .Times(AnyNumber());
1450 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001451 int64_t one_hour_ago =
1452 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001453 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1454 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001455 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1456 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1457 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1458 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001459 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1460 // send a ping.
1461 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1462 .WillOnce(Return(true));
1463 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1464 .WillOnce(Return(true));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001465 vector<char> post_data;
1466 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001467 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001468 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001469 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001470 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001471 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001472 metrics::CheckResult::kNoUpdateAvailable,
1473 metrics::CheckReaction::kUnset,
1474 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001475 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001476 &post_data));
1477 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001478 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001479}
1480
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001481TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07001482 // This test ensures that we ignore empty ping only requests.
Alex Deymo8427b4a2014-11-05 14:00:32 -08001483 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001484 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07001485 int64_t now = Time::Now().ToInternalValue();
1486 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1487 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1488 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1489 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1490 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1491 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1492 vector<char> post_data;
1493 EXPECT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001494 TestUpdateCheck(nullptr, // request_params
Thieu Leb44e9e82011-06-06 14:34:04 -07001495 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1496 -1,
1497 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001498 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001499 metrics::CheckResult::kUnset,
1500 metrics::CheckReaction::kUnset,
1501 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001502 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001503 &post_data));
1504 EXPECT_EQ(post_data.size(), 0);
1505}
1506
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001507TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001508 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001509 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001510 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1511 .Times(AnyNumber());
1512 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001513 int64_t future =
1514 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001515 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1516 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001517 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1518 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1519 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1520 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1521 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1522 .WillOnce(Return(true));
1523 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1524 .WillOnce(Return(true));
1525 vector<char> post_data;
1526 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001527 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001528 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1529 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001530 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001531 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001532 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001533 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001534 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001535 metrics::CheckResult::kNoUpdateAvailable,
1536 metrics::CheckReaction::kUnset,
1537 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001538 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001539 &post_data));
1540 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001541 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001542}
1543
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001544TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001545 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001546 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001547 // may fail if it runs for longer than 5 seconds. It shouldn't run
1548 // that long though.
1549 int64_t midnight =
1550 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1551 int64_t midnight_slack =
1552 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Alex Deymo8427b4a2014-11-05 14:00:32 -08001553 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001554 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001555 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1556 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001557 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1558 AllOf(Ge(midnight), Le(midnight_slack))))
1559 .WillOnce(Return(true));
1560 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1561 AllOf(Ge(midnight), Le(midnight_slack))))
1562 .WillOnce(Return(true));
1563 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001564 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001565 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1566 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001567 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001568 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001569 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001570 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001571 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001572 metrics::CheckResult::kNoUpdateAvailable,
1573 metrics::CheckReaction::kUnset,
1574 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001575 nullptr,
1576 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001577}
1578
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001579TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001580 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001581 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001582 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1583 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001584 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1585 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1586 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001587 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001588 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1589 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001590 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001591 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001592 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001593 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001594 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001595 metrics::CheckResult::kNoUpdateAvailable,
1596 metrics::CheckReaction::kUnset,
1597 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001598 nullptr,
1599 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001600}
1601
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001602TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Alex Deymo8427b4a2014-11-05 14:00:32 -08001603 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001604 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001605 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1606 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001607 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1608 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1609 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001610 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001611 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1612 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001613 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001614 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001615 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001616 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001617 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001618 metrics::CheckResult::kNoUpdateAvailable,
1619 metrics::CheckReaction::kUnset,
1620 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001621 nullptr,
1622 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001623}
1624
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001625TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Darin Petkov84c763c2010-07-29 16:27:58 -07001626 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001627 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov84c763c2010-07-29 16:27:58 -07001628 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001629 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001630 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001631 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001632 metrics::CheckResult::kParsingError,
1633 metrics::CheckReaction::kUnset,
1634 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001635 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001636 &post_data));
1637 // convert post_data to string
1638 string post_str(&post_data[0], post_data.size());
1639 EXPECT_EQ(post_str.find("machineid="), string::npos);
1640 EXPECT_EQ(post_str.find("userid="), string::npos);
1641}
1642
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001643TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001644 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001645 const int http_error_code =
1646 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001647 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001648 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001649 "",
1650 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001651 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001652 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001653 metrics::CheckResult::kDownloadError,
1654 metrics::CheckReaction::kUnset,
1655 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001656 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001657 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001658 EXPECT_FALSE(response.update_exists);
1659}
1660
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001661TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001662 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001663 const int http_error_code =
1664 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001665 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001666 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001667 "",
1668 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001669 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001670 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001671 metrics::CheckResult::kDownloadError,
1672 metrics::CheckReaction::kUnset,
1673 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001674 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001675 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001676 EXPECT_FALSE(response.update_exists);
1677}
1678
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001679TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001680 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001681 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001682 params.set_wall_clock_based_wait_enabled(true);
1683 params.set_waiting_period(TimeDelta().FromDays(1));
1684 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001685
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001686 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001687 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001688 GetUpdateResponse2(OmahaRequestParams::kAppId,
1689 "1.2.3.4", // version
1690 "http://more/info",
1691 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001692 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001693 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001694 "HASH1234=", // checksum
1695 "false", // needs admin
1696 "123", // size
1697 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001698 "7", // max days to scatter
1699 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001700 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001701 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001702 -1,
1703 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001704 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001705 metrics::CheckResult::kUpdateAvailable,
1706 metrics::CheckReaction::kDeferring,
1707 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001708 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001709 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001710
Ben Chan9abb7632014-08-07 00:10:53 -07001711 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001712 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001713 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001714 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001715
1716 // Verify if we are interactive check we don't defer.
1717 params.set_interactive(true);
1718 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001719 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -07001720 GetUpdateResponse2(OmahaRequestParams::kAppId,
1721 "1.2.3.4", // version
1722 "http://more/info",
1723 "true", // prompt
1724 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001725 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001726 "HASH1234=", // checksum
1727 "false", // needs admin
1728 "123", // size
1729 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001730 "7", // max days to scatter
1731 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001732 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001733 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001734 -1,
1735 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001736 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001737 metrics::CheckResult::kUpdateAvailable,
1738 metrics::CheckReaction::kUpdating,
1739 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001740 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001741 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001742 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001743}
1744
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001745TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001746 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001747 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001748 params.set_wall_clock_based_wait_enabled(true);
1749 params.set_waiting_period(TimeDelta().FromDays(1));
1750 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001751
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001752 // Set the timestamp to a very old value such that it exceeds the
1753 // waiting period set above.
1754 Time t1;
1755 Time::FromString("1/1/2012", &t1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001756 ASSERT_TRUE(fake_prefs_.SetInt64(
1757 kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001758 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001759 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001760 GetUpdateResponse2(OmahaRequestParams::kAppId,
1761 "1.2.3.4", // version
1762 "http://more/info",
1763 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001764 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001765 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001766 "HASH1234=", // checksum
1767 "false", // needs admin
1768 "123", // size
1769 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001770 "7", // max days to scatter
1771 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001772 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001773 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001774 -1,
1775 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001776 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001777 metrics::CheckResult::kUpdateAvailable,
1778 metrics::CheckReaction::kUpdating,
1779 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001780 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001781 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001782
1783 EXPECT_TRUE(response.update_exists);
1784
1785 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001786 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001787 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001788 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1789}
1790
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001791TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001792 // Create a uniquely named test directory.
1793 string test_dir;
1794 ASSERT_TRUE(utils::MakeTempDirectory(
1795 "omaha_request_action-test-XXXXXX", &test_dir));
1796
1797 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1798 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001799 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001800 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001801 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001802 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001803 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001804 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001805 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1806 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1807 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1808 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001809 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001810 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1811 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001812 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001813 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001814 params.SetLockDown(false);
1815 params.Init("1.2.3.4", "", 0);
1816 EXPECT_EQ("canary-channel", params.current_channel());
1817 EXPECT_EQ("stable-channel", params.target_channel());
1818 EXPECT_TRUE(params.to_more_stable_channel());
1819 EXPECT_TRUE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001820 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001821 "invalid xml>",
1822 -1,
1823 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001824 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001825 metrics::CheckResult::kParsingError,
1826 metrics::CheckReaction::kUnset,
1827 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001828 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001829 &post_data));
1830 // convert post_data to string
1831 string post_str(&post_data[0], post_data.size());
1832 EXPECT_NE(string::npos, post_str.find(
1833 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1834 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1835 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001836
Alex Deymo10875d92014-11-10 21:52:57 -08001837 ASSERT_TRUE(test_utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001838}
1839
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001840TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001841 // Create a uniquely named test directory.
1842 string test_dir;
1843 ASSERT_TRUE(utils::MakeTempDirectory(
1844 "omaha_request_action-test-XXXXXX", &test_dir));
1845
1846 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1847 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001848 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001849 vector<char> post_data;
Alex Deymo8427b4a2014-11-05 14:00:32 -08001850 NiceMock<MockPrefs> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001851 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001852 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001853 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001854 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1855 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1856 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1857 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001858 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001859 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001860 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001861 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001862 params.SetLockDown(false);
1863 params.Init("5.6.7.8", "", 0);
1864 EXPECT_EQ("stable-channel", params.current_channel());
1865 EXPECT_EQ("canary-channel", params.target_channel());
1866 EXPECT_FALSE(params.to_more_stable_channel());
1867 EXPECT_FALSE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001868 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001869 "invalid xml>",
1870 -1,
1871 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001872 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001873 metrics::CheckResult::kParsingError,
1874 metrics::CheckReaction::kUnset,
1875 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001876 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001877 &post_data));
1878 // convert post_data to string
1879 string post_str(&post_data[0], post_data.size());
1880 EXPECT_NE(string::npos, post_str.find(
1881 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1882 "version=\"5.6.7.8\" "
1883 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001884 EXPECT_EQ(string::npos, post_str.find("from_version"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001885}
1886
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001887// Checks that the initial ping with a=-1 r=-1 is not send when the device
1888// was powerwashed.
1889TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1890 fake_prefs_.SetString(kPrefsPreviousVersion, "");
1891
1892 // Flag that the device was powerwashed in the past.
1893 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1894
1895 vector<char> post_data;
1896 ASSERT_TRUE(
1897 TestUpdateCheck(nullptr, // request_params
1898 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1899 -1,
1900 false, // ping_only
1901 ErrorCode::kSuccess,
1902 metrics::CheckResult::kNoUpdateAvailable,
1903 metrics::CheckReaction::kUnset,
1904 metrics::DownloadErrorCode::kUnset,
1905 nullptr,
1906 &post_data));
1907 // We shouldn't send a ping in this case since powerwash > 0.
1908 string post_str(&post_data[0], post_data.size());
1909 EXPECT_EQ(string::npos, post_str.find("<ping"));
1910}
1911
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001912void OmahaRequestActionTest::P2PTest(
1913 bool initial_allow_p2p_for_downloading,
1914 bool initial_allow_p2p_for_sharing,
1915 bool omaha_disable_p2p_for_downloading,
1916 bool omaha_disable_p2p_for_sharing,
1917 bool payload_state_allow_p2p_attempt,
1918 bool expect_p2p_client_lookup,
1919 const string& p2p_client_result_url,
1920 bool expected_allow_p2p_for_downloading,
1921 bool expected_allow_p2p_for_sharing,
1922 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07001923 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001924 OmahaRequestParams request_params = request_params_;
Gilad Arnold74b5f552014-10-07 08:17:16 -07001925 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
1926 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
1927 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07001928
1929 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001930 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07001931 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
1932 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07001933 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
1934 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
1935 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
1936 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
1937 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
1938 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
1939 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
1940 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
1941 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
1942 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
1943
David Zeuthen8f191b22013-08-06 12:27:50 -07001944 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001945 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07001946 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
1947
David Zeuthen4cc5ed22014-01-15 12:35:03 -08001948 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
1949 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07001950 .Times(expect_p2p_client_lookup ? 1 : 0);
1951
1952 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001953 TestUpdateCheck(&request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07001954 GetUpdateResponse2(OmahaRequestParams::kAppId,
1955 "1.2.3.4", // version
1956 "http://more/info",
1957 "true", // prompt
1958 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001959 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07001960 "HASH1234=", // checksum
1961 "false", // needs admin
1962 "123", // size
1963 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001964 "7", // max days to scatter
1965 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001966 omaha_disable_p2p_for_downloading,
1967 omaha_disable_p2p_for_sharing),
1968 -1,
1969 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001970 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001971 metrics::CheckResult::kUpdateAvailable,
1972 metrics::CheckReaction::kUpdating,
1973 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07001974 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001975 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07001976 EXPECT_TRUE(response.update_exists);
1977
Gilad Arnold74b5f552014-10-07 08:17:16 -07001978 EXPECT_EQ(omaha_disable_p2p_for_downloading,
1979 response.disable_p2p_for_downloading);
1980 EXPECT_EQ(omaha_disable_p2p_for_sharing,
1981 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07001982
Gilad Arnold74b5f552014-10-07 08:17:16 -07001983 EXPECT_EQ(expected_allow_p2p_for_downloading,
1984 actual_allow_p2p_for_downloading);
1985 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
1986 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07001987}
1988
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001989TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001990 P2PTest(true, // initial_allow_p2p_for_downloading
1991 true, // initial_allow_p2p_for_sharing
1992 false, // omaha_disable_p2p_for_downloading
1993 false, // omaha_disable_p2p_for_sharing
1994 true, // payload_state_allow_p2p_attempt
1995 true, // expect_p2p_client_lookup
1996 "http://1.3.5.7/p2p", // p2p_client_result_url
1997 true, // expected_allow_p2p_for_downloading
1998 true, // expected_allow_p2p_for_sharing
1999 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002000}
2001
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002002TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002003 P2PTest(true, // initial_allow_p2p_for_downloading
2004 true, // initial_allow_p2p_for_sharing
2005 false, // omaha_disable_p2p_for_downloading
2006 false, // omaha_disable_p2p_for_sharing
2007 true, // payload_state_allow_p2p_attempt
2008 true, // expect_p2p_client_lookup
2009 "", // p2p_client_result_url
2010 false, // expected_allow_p2p_for_downloading
2011 true, // expected_allow_p2p_for_sharing
2012 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002013}
2014
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002015TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002016 P2PTest(false, // initial_allow_p2p_for_downloading
2017 true, // initial_allow_p2p_for_sharing
2018 false, // omaha_disable_p2p_for_downloading
2019 false, // omaha_disable_p2p_for_sharing
2020 true, // payload_state_allow_p2p_attempt
2021 false, // expect_p2p_client_lookup
2022 "unset", // p2p_client_result_url
2023 false, // expected_allow_p2p_for_downloading
2024 true, // expected_allow_p2p_for_sharing
2025 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002026}
2027
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002028TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002029 P2PTest(true, // initial_allow_p2p_for_downloading
2030 true, // initial_allow_p2p_for_sharing
2031 true, // omaha_disable_p2p_for_downloading
2032 false, // omaha_disable_p2p_for_sharing
2033 true, // payload_state_allow_p2p_attempt
2034 false, // expect_p2p_client_lookup
2035 "unset", // p2p_client_result_url
2036 false, // expected_allow_p2p_for_downloading
2037 true, // expected_allow_p2p_for_sharing
2038 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002039}
2040
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002041TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002042 P2PTest(true, // initial_allow_p2p_for_downloading
2043 true, // initial_allow_p2p_for_sharing
2044 false, // omaha_disable_p2p_for_downloading
2045 true, // omaha_disable_p2p_for_sharing
2046 true, // payload_state_allow_p2p_attempt
2047 true, // expect_p2p_client_lookup
2048 "http://1.3.5.7/p2p", // p2p_client_result_url
2049 true, // expected_allow_p2p_for_downloading
2050 false, // expected_allow_p2p_for_sharing
2051 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002052}
2053
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002054TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002055 P2PTest(true, // initial_allow_p2p_for_downloading
2056 true, // initial_allow_p2p_for_sharing
2057 true, // omaha_disable_p2p_for_downloading
2058 true, // omaha_disable_p2p_for_sharing
2059 true, // payload_state_allow_p2p_attempt
2060 false, // expect_p2p_client_lookup
2061 "unset", // p2p_client_result_url
2062 false, // expected_allow_p2p_for_downloading
2063 false, // expected_allow_p2p_for_sharing
2064 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002065}
2066
Alex Deymof329b932014-10-30 01:37:48 -07002067bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2068 OmahaResponse *response) {
David Zeuthen639aa362014-02-03 16:23:44 -08002069 return
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002070 TestUpdateCheck(nullptr, // request_params
David Zeuthen639aa362014-02-03 16:23:44 -08002071 GetUpdateResponse2(OmahaRequestParams::kAppId,
2072 "1.2.3.4", // version
2073 "http://more/info",
2074 "true", // prompt
2075 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002076 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002077 "HASH1234=", // checksum
2078 "false", // needs admin
2079 "123", // size
2080 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002081 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002082 elapsed_days,
2083 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002084 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002085 -1,
2086 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002087 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002088 metrics::CheckResult::kUpdateAvailable,
2089 metrics::CheckReaction::kUpdating,
2090 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002091 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002092 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002093}
2094
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002095TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002096 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002097
2098 // Check that we parse elapsed_days in the Omaha Response correctly.
2099 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002100 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2101 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002102 EXPECT_TRUE(response.update_exists);
2103 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002104 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002105 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002106 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002107 EXPECT_EQ(prefs_days, 42);
2108
2109 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002110 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002111 EXPECT_TRUE(response.update_exists);
2112 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002113 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002114 EXPECT_EQ(prefs_days, 42);
2115
2116 // Note that elapsed_days is not necessarily divisible by 7 so check
2117 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002118 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2119 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002120 EXPECT_TRUE(response.update_exists);
2121 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002122 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002123 EXPECT_EQ(prefs_days, 21);
2124
2125 // Check that we correctly handle elapsed_days not being included in
2126 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002127 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002128 EXPECT_TRUE(response.update_exists);
2129 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002130}
2131
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002132// If there is no prefs and OOBE is not complete, we should not
2133// report anything to Omaha.
2134TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
2135 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2136 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2137}
David Zeuthen639aa362014-02-03 16:23:44 -08002138
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002139// If OOBE is complete and happened on a valid date (e.g. after Jan
2140// 1 2007 0:00 PST), that date should be used and written to
2141// prefs. However, first try with an invalid date and check we do
2142// nothing.
2143TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2144 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2145 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2146 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2147 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2148}
David Zeuthen639aa362014-02-03 16:23:44 -08002149
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002150// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2151// should yield an InstallDate of 14.
2152TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2153 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2154 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2155 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2156 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002157
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002158 int64_t prefs_days;
2159 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2160 EXPECT_EQ(prefs_days, 14);
2161}
David Zeuthen639aa362014-02-03 16:23:44 -08002162
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002163// Now that we have a valid date in prefs, check that we keep using
2164// that even if OOBE date reports something else. The date Jan 30,
2165// 2007 0:00 PST should yield an InstallDate of 28... but since
2166// there's a prefs file, we should still get 14.
2167TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2168 // Set a valid date in the prefs first.
2169 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002170
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002171 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2172 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2173 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002174
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002175 int64_t prefs_days;
2176 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2177 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002178
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002179 // If we delete the prefs file, we should get 28 days.
2180 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2181 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2182 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2183 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002184}
2185
Darin Petkov6a5b3222010-07-13 14:55:28 -07002186} // namespace chromeos_update_engine