blob: 4adf9987818596cac4e5ee10012db5e12a982035 [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
Ben Chan9abb7632014-08-07 00:10:53 -07005#include <glib.h>
6#include <stdint.h>
7
Darin Petkov6a5b3222010-07-13 14:55:28 -07008#include <string>
9#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070010
Alex Vakulenko75039d72014-03-25 12:36:28 -070011#include <base/strings/string_util.h>
12#include <base/strings/stringprintf.h>
13#include <base/time/time.h>
Chris Sosa77f79e82014-06-02 18:16:24 -070014#include <chromeos/dbus/service_constants.h>
Alex Deymoe1e3afe2014-10-30 13:02:49 -070015#include <gtest/gtest.h>
Jay Srinivasand29695d2013-04-08 15:08:05 -070016
Darin Petkov6a5b3222010-07-13 14:55:28 -070017#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070018#include "update_engine/constants.h"
Alex Deymoe1e3afe2014-10-30 13:02:49 -070019#include "update_engine/fake_prefs.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070020#include "update_engine/mock_connection_manager.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070021#include "update_engine/mock_http_fetcher.h"
Gilad Arnold74b5f552014-10-07 08:17:16 -070022#include "update_engine/mock_payload_state.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070023#include "update_engine/omaha_hash_calculator.h"
24#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070025#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070026#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070027#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070028#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070029
Darin Petkov1cbd78f2010-07-29 12:38:34 -070030using base::Time;
31using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070032using std::string;
33using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070034using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070035using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070036using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070037using testing::Ge;
38using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080039using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070040using testing::Return;
Gilad Arnold74b5f552014-10-07 08:17:16 -070041using testing::ReturnPointee;
42using testing::SaveArg;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070043using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070044using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070045
46namespace chromeos_update_engine {
47
Alex Deymoe1e3afe2014-10-30 13:02:49 -070048class OmahaRequestActionTest : public ::testing::Test {
49 protected:
50 void SetUp() {
51 fake_system_state_.set_request_params(&request_params_);
52 fake_system_state_.set_prefs(&fake_prefs_);
53 }
54
55 // Returns true iff an output response was obtained from the
56 // OmahaRequestAction. |prefs| may be null, in which case a local PrefsMock
57 // is used. |payload_state| may be null, in which case a local mock is used.
58 // |p2p_manager| may be null, in which case a local mock is used.
59 // |connection_manager| may be null, in which case a local mock is used.
60 // out_response may be null. If |fail_http_response_code| is non-negative,
61 // the transfer will fail with that code. |ping_only| is passed through to the
62 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
63 // post-data received by the mock HttpFetcher is returned.
64 //
65 // The |expected_check_result|, |expected_check_reaction| and
66 // |expected_error_code| parameters are for checking expectations
67 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
68 // UMA statistics. Use the appropriate ::kUnset value to specify that
69 // the given metric should not be reported.
70 bool TestUpdateCheck(OmahaRequestParams* request_params,
71 const string& http_response,
72 int fail_http_response_code,
73 bool ping_only,
74 ErrorCode expected_code,
75 metrics::CheckResult expected_check_result,
76 metrics::CheckReaction expected_check_reaction,
77 metrics::DownloadErrorCode expected_download_error_code,
78 OmahaResponse* out_response,
79 vector<char>* out_post_data);
80
81 // Runs and checks a ping test. |ping_only| indicates wheter it should send
82 // only a ping or also an updatecheck.
83 void PingTest(bool ping_only);
84
85 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -070086 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -070087 OmahaResponse *response);
88
89 // P2P test helper function.
90 void P2PTest(
91 bool initial_allow_p2p_for_downloading,
92 bool initial_allow_p2p_for_sharing,
93 bool omaha_disable_p2p_for_downloading,
94 bool omaha_disable_p2p_for_sharing,
95 bool payload_state_allow_p2p_attempt,
96 bool expect_p2p_client_lookup,
97 const string& p2p_client_result_url,
98 bool expected_allow_p2p_for_downloading,
99 bool expected_allow_p2p_for_sharing,
100 const string& expected_p2p_url);
101
102 FakeSystemState fake_system_state_;
103
104 // By default, all tests use these objects unless they replace them in the
105 // fake_system_state_.
106 OmahaRequestParams request_params_ = OmahaRequestParams{
107 &fake_system_state_,
108 OmahaRequestParams::kOsPlatform,
109 OmahaRequestParams::kOsVersion,
110 "service_pack",
111 "x86-generic",
112 OmahaRequestParams::kAppId,
113 "0.1.0.0",
114 "en-US",
115 "unittest",
116 "OEM MODEL 09235 7471",
117 "ChromeOSFirmware.1.0",
118 "0X0A1",
119 false, // delta okay
120 false, // interactive
121 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -0700122 ""}; // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700123
124 FakePrefs fake_prefs_;
125};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700126
127namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700128
Darin Petkov6a5b3222010-07-13 14:55:28 -0700129string GetNoUpdateResponse(const string& app_id) {
130 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700131 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
132 "<daystart elapsed_seconds=\"100\"/>"
133 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
134 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -0700135}
136
David Zeuthenf3e28012014-08-26 18:23:52 -0400137string GetNoUpdateResponseWithEntity(const string& app_id) {
138 return string(
139 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
140 "<!DOCTYPE response ["
141 "<!ENTITY CrOS \"ChromeOS\">"
142 "]>"
143 "<response protocol=\"3.0\">"
144 "<daystart elapsed_seconds=\"100\"/>"
145 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
146 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
147}
148
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700149string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700150 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700151 const string& more_info_url,
152 const string& prompt,
153 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700154 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700155 const string& hash,
156 const string& needsadmin,
157 const string& size,
158 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700159 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800160 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700161 bool disable_p2p_for_downloading,
162 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700163 string response =
164 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
165 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800166 "<daystart elapsed_seconds=\"100\"" +
167 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
168 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700169 "<app appid=\"" + app_id + "\" status=\"ok\">"
170 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
171 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700172 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700173 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
174 "size=\"" + size + "\"/></packages>"
175 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700176 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700177 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
178 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800179 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700180 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700181 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700182 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700183 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700184 (disable_p2p_for_downloading ?
185 "DisableP2PForDownloading=\"true\" " : "") +
186 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700187 "/></actions></manifest></updatecheck></app></response>";
188 LOG(INFO) << "Response = " << response;
189 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700190}
191
Darin Petkov6a5b3222010-07-13 14:55:28 -0700192string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700193 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700194 const string& more_info_url,
195 const string& prompt,
196 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700197 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700198 const string& hash,
199 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700200 const string& size,
201 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700202 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700203 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700204 more_info_url,
205 prompt,
206 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700207 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700208 hash,
209 needsadmin,
210 size,
211 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700212 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700213 "42", // elapsed_days
214 false, // disable_p2p_for_downloading
215 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700216}
217
218class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
219 public:
220 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700221 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700222 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700223 virtual ~OmahaRequestActionTestProcessorDelegate() {
224 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700225 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700226 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 ASSERT_TRUE(loop_);
228 g_main_loop_quit(loop_);
229 }
230
231 virtual void ActionCompleted(ActionProcessor* processor,
232 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700233 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700234 // make sure actions always succeed
235 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700236 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700237 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700238 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700239 }
240 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700241 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700242};
243
244gboolean StartProcessorInRunLoop(gpointer data) {
245 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
246 processor->StartProcessing();
247 return FALSE;
248}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700249} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700250
251class OutputObjectCollectorAction;
252
253template<>
254class ActionTraits<OutputObjectCollectorAction> {
255 public:
256 // Does not take an object for input
257 typedef OmahaResponse InputObjectType;
258 // On success, puts the output path on output
259 typedef NoneType OutputObjectType;
260};
261
262class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
263 public:
264 OutputObjectCollectorAction() : has_input_object_(false) {}
265 void PerformAction() {
266 // copy input object
267 has_input_object_ = HasInputObject();
268 if (has_input_object_)
269 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700270 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700271 }
272 // Should never be called
273 void TerminateProcessing() {
274 CHECK(false);
275 }
276 // Debugging/logging
Alex Deymof329b932014-10-30 01:37:48 -0700277 static string StaticType() {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700278 return "OutputObjectCollectorAction";
279 }
Alex Deymof329b932014-10-30 01:37:48 -0700280 string Type() const { return StaticType(); }
Darin Petkov6a5b3222010-07-13 14:55:28 -0700281 bool has_input_object_;
282 OmahaResponse omaha_response_;
283};
284
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700285bool OmahaRequestActionTest::TestUpdateCheck(
286 OmahaRequestParams* request_params,
287 const string& http_response,
288 int fail_http_response_code,
289 bool ping_only,
290 ErrorCode expected_code,
291 metrics::CheckResult expected_check_result,
292 metrics::CheckReaction expected_check_reaction,
293 metrics::DownloadErrorCode expected_download_error_code,
294 OmahaResponse* out_response,
295 vector<char>* out_post_data) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700296 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
297 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800298 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700299 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700300 if (fail_http_response_code >= 0) {
301 fetcher->FailTransfer(fail_http_response_code);
302 }
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700303 if (request_params)
304 fake_system_state_.set_request_params(request_params);
305 OmahaRequestAction action(&fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700306 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700307 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700308 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700309 OmahaRequestActionTestProcessorDelegate delegate;
310 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700311 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700312
Darin Petkov6a5b3222010-07-13 14:55:28 -0700313 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700314 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700315 processor.EnqueueAction(&action);
316
317 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700318 BondActions(&action, &collector_action);
319 processor.EnqueueAction(&collector_action);
320
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700321 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800322 .Times(AnyNumber());
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700323 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800324 SendEnumToUMA(metrics::kMetricCheckResult,
325 static_cast<int>(expected_check_result),
326 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
327 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700328 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800329 SendEnumToUMA(metrics::kMetricCheckReaction,
330 static_cast<int>(expected_check_reaction),
331 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
332 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700333 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700334 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
335 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800336 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
337 ? 0 : 1);
338
Darin Petkov6a5b3222010-07-13 14:55:28 -0700339 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
340 g_main_loop_run(loop);
341 g_main_loop_unref(loop);
342 if (collector_action.has_input_object_ && out_response)
343 *out_response = collector_action.omaha_response_;
344 if (out_post_data)
345 *out_post_data = fetcher->post_data();
346 return collector_action.has_input_object_;
347}
348
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700349// Tests Event requests -- they should always succeed. |out_post_data|
350// may be null; if non-null, the post-data received by the mock
351// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700352void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700353 OmahaEvent* event,
354 const string& http_response,
355 vector<char>* out_post_data) {
356 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
357 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800358 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700359 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700360 FakeSystemState fake_system_state;
361 fake_system_state.set_request_params(&params);
362 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700363 OmahaRequestActionTestProcessorDelegate delegate;
364 delegate.loop_ = loop;
365 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700366 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700367 processor.EnqueueAction(&action);
368
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700369 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
370 g_main_loop_run(loop);
371 g_main_loop_unref(loop);
372 if (out_post_data)
373 *out_post_data = fetcher->post_data();
374}
375
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700376TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400377 OmahaResponse response;
378 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700379 TestUpdateCheck(nullptr, // request_params
David Zeuthenf3e28012014-08-26 18:23:52 -0400380 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
381 -1,
382 false, // ping_only
383 ErrorCode::kOmahaRequestXMLHasEntityDecl,
384 metrics::CheckResult::kParsingError,
385 metrics::CheckReaction::kUnset,
386 metrics::DownloadErrorCode::kUnset,
387 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700388 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400389 EXPECT_FALSE(response.update_exists);
390}
391
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700392TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700393 OmahaResponse response;
394 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700395 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700396 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700397 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700398 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700399 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800400 metrics::CheckResult::kNoUpdateAvailable,
401 metrics::CheckReaction::kUnset,
402 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700403 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700404 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700405 EXPECT_FALSE(response.update_exists);
406}
407
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700408TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700409 OmahaResponse response;
410 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700411 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700412 GetUpdateResponse(OmahaRequestParams::kAppId,
413 "1.2.3.4", // version
414 "http://more/info",
415 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700416 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700417 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700418 "HASH1234=", // checksum
419 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700420 "123", // size
421 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700422 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700423 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700424 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800425 metrics::CheckResult::kUpdateAvailable,
426 metrics::CheckReaction::kUpdating,
427 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700428 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700429 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700430 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700431 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700432 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800433 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700434 EXPECT_EQ("http://more/info", response.more_info_url);
435 EXPECT_EQ("HASH1234=", response.hash);
436 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700437 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700438 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700439}
440
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700441TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700442 OmahaResponse response;
443 // Set up a connection manager that doesn't allow a valid update over
444 // the current ethernet connection.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700445 MockConnectionManager mock_cm(nullptr);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700446 fake_system_state_.set_connection_manager(&mock_cm);
447
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700448 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700449 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
450 SetArgumentPointee<2>(NetworkTethering::kUnknown),
451 Return(true)));
452 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
453 .WillRepeatedly(Return(false));
454 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
455 .WillRepeatedly(Return(shill::kTypeEthernet));
456
457 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700458 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700459 GetUpdateResponse(OmahaRequestParams::kAppId,
460 "1.2.3.4", // version
461 "http://more/info",
462 "true", // prompt
463 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700464 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700465 "HASH1234=", // checksum
466 "false", // needs admin
467 "123", // size
468 ""), // deadline
469 -1,
470 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700471 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700472 metrics::CheckResult::kUpdateAvailable,
473 metrics::CheckReaction::kIgnored,
474 metrics::DownloadErrorCode::kUnset,
475 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700476 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700477 EXPECT_FALSE(response.update_exists);
478}
479
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700480TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700481 string rollback_version = "1234.0.0";
482 OmahaResponse response;
483
484 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700485 fake_system_state_.set_payload_state(&mock_payload_state);
486
Chris Sosa77f79e82014-06-02 18:16:24 -0700487 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
488 .WillRepeatedly(Return(rollback_version));
489
490 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700491 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700492 GetUpdateResponse(OmahaRequestParams::kAppId,
493 rollback_version, // version
494 "http://more/info",
495 "true", // prompt
496 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700497 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700498 "HASH1234=", // checksum
499 "false", // needs admin
500 "123", // size
501 ""), // deadline
502 -1,
503 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700504 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700505 metrics::CheckResult::kUpdateAvailable,
506 metrics::CheckReaction::kIgnored,
507 metrics::DownloadErrorCode::kUnset,
508 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700509 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700510 EXPECT_FALSE(response.update_exists);
511}
512
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700513TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700514 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700515 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700516 params.set_wall_clock_based_wait_enabled(true);
517 params.set_update_check_count_wait_enabled(false);
518 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700519
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700520 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700521 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700522 GetUpdateResponse2(OmahaRequestParams::kAppId,
523 "1.2.3.4", // version
524 "http://more/info",
525 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700526 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700527 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700528 "HASH1234=", // checksum
529 "false", // needs admin
530 "123", // size
531 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700532 "7", // max days to scatter
533 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700534 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700535 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700536 -1,
537 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700538 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800539 metrics::CheckResult::kUpdateAvailable,
540 metrics::CheckReaction::kDeferring,
541 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700542 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700543 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700544 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700545
546 // Verify if we are interactive check we don't defer.
547 params.set_interactive(true);
548 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700549 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700550 GetUpdateResponse2(OmahaRequestParams::kAppId,
551 "1.2.3.4", // version
552 "http://more/info",
553 "true", // prompt
554 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700555 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700556 "HASH1234=", // checksum
557 "false", // needs admin
558 "123", // size
559 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700560 "7", // max days to scatter
561 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700562 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700563 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700564 -1,
565 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700566 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800567 metrics::CheckResult::kUpdateAvailable,
568 metrics::CheckReaction::kUpdating,
569 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700570 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700571 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700572 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700573}
574
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700575TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700576 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700577 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700578 params.set_wall_clock_based_wait_enabled(false);
579 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700580
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700581 params.set_update_check_count_wait_enabled(true);
582 params.set_min_update_checks_needed(1);
583 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700584
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700585 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700586 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700587 GetUpdateResponse2(OmahaRequestParams::kAppId,
588 "1.2.3.4", // version
589 "http://more/info",
590 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700591 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700592 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700593 "HASH1234=", // checksum
594 "false", // needs admin
595 "123", // size
596 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700597 "7", // max days to scatter
598 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700599 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700600 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700601 -1,
602 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700603 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800604 metrics::CheckResult::kUpdateAvailable,
605 metrics::CheckReaction::kUpdating,
606 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700607 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700608 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700609 EXPECT_TRUE(response.update_exists);
610}
611
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700612TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700613 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700614 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700615 params.set_wall_clock_based_wait_enabled(true);
616 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700617
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700618 params.set_update_check_count_wait_enabled(true);
619 params.set_min_update_checks_needed(1);
620 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700621
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700622 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700623 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700624 GetUpdateResponse2(OmahaRequestParams::kAppId,
625 "1.2.3.4", // version
626 "http://more/info",
627 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700628 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700629 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700630 "HASH1234=", // checksum
631 "false", // needs admin
632 "123", // size
633 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700634 "0", // max days to scatter
635 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700636 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700637 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700638 -1,
639 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700640 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800641 metrics::CheckResult::kUpdateAvailable,
642 metrics::CheckReaction::kUpdating,
643 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700644 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700645 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700646 EXPECT_TRUE(response.update_exists);
647}
648
649
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700650TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700651 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700652 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700653 params.set_wall_clock_based_wait_enabled(true);
654 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700655
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700656 params.set_update_check_count_wait_enabled(true);
657 params.set_min_update_checks_needed(0);
658 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700659
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700660 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700661 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700662 GetUpdateResponse2(OmahaRequestParams::kAppId,
663 "1.2.3.4", // version
664 "http://more/info",
665 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700666 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700667 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700668 "HASH1234=", // checksum
669 "false", // needs admin
670 "123", // size
671 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700672 "7", // max days to scatter
673 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700674 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700675 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700676 -1,
677 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700678 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800679 metrics::CheckResult::kUpdateAvailable,
680 metrics::CheckReaction::kUpdating,
681 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700682 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700683 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700684
Ben Chan9abb7632014-08-07 00:10:53 -0700685 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700686 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700687 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700688 EXPECT_TRUE(response.update_exists);
689}
690
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700691TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700692 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700693 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700694 params.set_wall_clock_based_wait_enabled(true);
695 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700696
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700697 params.set_update_check_count_wait_enabled(true);
698 params.set_min_update_checks_needed(1);
699 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700700
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700701 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700702 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700703 GetUpdateResponse2(OmahaRequestParams::kAppId,
704 "1.2.3.4", // version
705 "http://more/info",
706 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700707 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700708 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700709 "HASH1234=", // checksum
710 "false", // needs admin
711 "123", // size
712 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700713 "7", // max days to scatter
714 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700715 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700716 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700717 -1,
718 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700719 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800720 metrics::CheckResult::kUpdateAvailable,
721 metrics::CheckReaction::kDeferring,
722 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700723 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700724 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700725
Ben Chan9abb7632014-08-07 00:10:53 -0700726 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700727 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700728 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700729 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700730
731 // Verify if we are interactive check we don't defer.
732 params.set_interactive(true);
733 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700734 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700735 GetUpdateResponse2(OmahaRequestParams::kAppId,
736 "1.2.3.4", // version
737 "http://more/info",
738 "true", // prompt
739 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700740 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700741 "HASH1234=", // checksum
742 "false", // needs admin
743 "123", // size
744 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700745 "7", // max days to scatter
746 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700747 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700748 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700749 -1,
750 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700751 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800752 metrics::CheckResult::kUpdateAvailable,
753 metrics::CheckReaction::kUpdating,
754 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700755 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700756 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700757 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700758}
759
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700760TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700761 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700762 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700763 params.set_wall_clock_based_wait_enabled(true);
764 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700765
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700766 params.set_update_check_count_wait_enabled(true);
767 params.set_min_update_checks_needed(1);
768 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700769
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700770 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700771
772 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700773 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700774 GetUpdateResponse2(OmahaRequestParams::kAppId,
775 "1.2.3.4", // version
776 "http://more/info",
777 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700778 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700779 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700780 "HASH1234=", // checksum
781 "false", // needs admin
782 "123", // size
783 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700784 "7", // max days to scatter
785 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700786 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700787 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700788 -1,
789 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700790 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800791 metrics::CheckResult::kUpdateAvailable,
792 metrics::CheckReaction::kDeferring,
793 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700794 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700795 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700796
Ben Chan9abb7632014-08-07 00:10:53 -0700797 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700798 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700799 // count remains the same, as the decrementing happens in update_attempter
800 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700801 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700802 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700803
804 // Verify if we are interactive check we don't defer.
805 params.set_interactive(true);
806 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700807 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700808 GetUpdateResponse2(OmahaRequestParams::kAppId,
809 "1.2.3.4", // version
810 "http://more/info",
811 "true", // prompt
812 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700813 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700814 "HASH1234=", // checksum
815 "false", // needs admin
816 "123", // size
817 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700818 "7", // max days to scatter
819 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700820 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700821 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700822 -1,
823 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700824 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800825 metrics::CheckResult::kUpdateAvailable,
826 metrics::CheckReaction::kUpdating,
827 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700828 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700829 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700830 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700831}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700832
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700833TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700834 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
835
836 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
837
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700838 OmahaRequestParams params = request_params_;
839 fake_system_state_.set_request_params(&params);
840 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700841 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800842 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700843 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700844 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700845 OmahaRequestActionTestProcessorDelegate delegate;
846 delegate.loop_ = loop;
847 ActionProcessor processor;
848 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700850
851 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
852 g_main_loop_run(loop);
853 g_main_loop_unref(loop);
854 EXPECT_FALSE(processor.IsRunning());
855}
856
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700857TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700858 OmahaResponse response;
859 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700860 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700861 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700862 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700863 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700864 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800865 metrics::CheckResult::kParsingError,
866 metrics::CheckReaction::kUnset,
867 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700868 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700869 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700870 EXPECT_FALSE(response.update_exists);
871}
872
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700873TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -0700874 OmahaResponse response;
875 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700876 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -0700877 "",
878 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700879 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700880 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800881 metrics::CheckResult::kParsingError,
882 metrics::CheckReaction::kUnset,
883 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700884 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700885 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700886 EXPECT_FALSE(response.update_exists);
887}
888
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700889TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700890 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700891 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700892 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700893 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
894 "<daystart elapsed_seconds=\"100\"/>"
895 "<app appid=\"foo\" status=\"ok\">"
896 "<ping status=\"ok\"/>"
897 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700898 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700899 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700900 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800901 metrics::CheckResult::kParsingError,
902 metrics::CheckReaction::kUnset,
903 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700904 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700905 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700906 EXPECT_FALSE(response.update_exists);
907}
908
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700909TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700910 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700911 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700912 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700913 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
914 "<daystart elapsed_seconds=\"100\"/>"
915 "<app appid=\"foo\" status=\"ok\">"
916 "<ping status=\"ok\"/>"
917 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700918 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700919 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700920 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800921 metrics::CheckResult::kParsingError,
922 metrics::CheckReaction::kUnset,
923 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700924 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700925 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700926 EXPECT_FALSE(response.update_exists);
927}
928
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700929TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700930 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700931 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700932 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700933 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
934 "<daystart elapsed_seconds=\"100\"/>"
935 "<app appid=\"foo\" status=\"ok\">"
936 "<ping status=\"ok\"/>"
937 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700938 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700939 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700940 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800941 metrics::CheckResult::kParsingError,
942 metrics::CheckReaction::kUnset,
943 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700944 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700945 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700946 EXPECT_FALSE(response.update_exists);
947}
948
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700949TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700950 string input_response =
951 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
952 "<daystart elapsed_seconds=\"100\"/>"
953 "<app appid=\"xyz\" status=\"ok\">"
954 "<updatecheck status=\"ok\">"
955 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700956 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700957 "<packages><package hash=\"not-used\" name=\"f\" "
958 "size=\"587\"/></packages>"
959 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700960 "ChromeOSVersion=\"10.2.3.4\" "
961 "Prompt=\"false\" "
962 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800963 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700964 "sha256=\"lkq34j5345\" "
965 "needsadmin=\"true\" "
966 "/></actions></manifest></updatecheck></app></response>";
967 LOG(INFO) << "Input Response = " << input_response;
968
Darin Petkov6a5b3222010-07-13 14:55:28 -0700969 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700970 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700971 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700972 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700973 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700974 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800975 metrics::CheckResult::kUpdateAvailable,
976 metrics::CheckReaction::kUpdating,
977 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700978 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700979 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700980 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700981 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800982 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700983 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700984 EXPECT_EQ("lkq34j5345", response.hash);
985 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700986 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700987 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700988}
989
990namespace {
991class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
992 public:
993 void ProcessingStopped(const ActionProcessor* processor) {
994 ASSERT_TRUE(loop_);
995 g_main_loop_quit(loop_);
996 }
997 GMainLoop *loop_;
998};
999
1000gboolean TerminateTransferTestStarter(gpointer data) {
1001 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1002 processor->StartProcessing();
1003 CHECK(processor->IsRunning());
1004 processor->StopProcessing();
1005 return FALSE;
1006}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001007} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001008
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001009TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001010 string http_response("doesn't matter");
1011 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1012
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001013 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001014 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001015 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001016 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001017 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001018 TerminateEarlyTestProcessorDelegate delegate;
1019 delegate.loop_ = loop;
1020 ActionProcessor processor;
1021 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001022 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001023
1024 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1025 g_main_loop_run(loop);
1026 g_main_loop_unref(loop);
1027}
1028
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001029TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001030 EXPECT_EQ("ab", XmlEncode("ab"));
1031 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001032 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1033 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1034
1035 vector<char> post_data;
1036
1037 // Make sure XML Encode is being called on the params
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001038 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001039 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001040 OmahaRequestParams::kOsVersion,
1041 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001042 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001043 OmahaRequestParams::kAppId,
1044 "0.1.0.0",
1045 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001046 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001047 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001048 "ChromeOSFirmware.1.0",
1049 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001050 false, // delta okay
1051 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001052 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001053 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -07001054 OmahaResponse response;
1055 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001056 TestUpdateCheck(&params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001057 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001058 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001059 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001060 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001061 metrics::CheckResult::kParsingError,
1062 metrics::CheckReaction::kUnset,
1063 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001064 &response,
1065 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001066 // convert post_data to string
1067 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001068 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1069 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001070 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1071 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1072 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1073 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001074 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1075 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001076}
1077
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001078TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001079 OmahaResponse response;
1080 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001081 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001082 GetUpdateResponse(OmahaRequestParams::kAppId,
1083 "1.2.3.4", // version
1084 "testthe&lt;url", // more info
1085 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001086 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001087 "file.signed", // file name
1088 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001089 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001090 "123", // size
1091 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001092 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001093 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001094 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001095 metrics::CheckResult::kUpdateAvailable,
1096 metrics::CheckReaction::kUpdating,
1097 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001098 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001099 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001100
1101 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001102 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001103 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001104}
1105
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001106TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001107 OmahaResponse response;
1108 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001109 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001110 GetUpdateResponse(OmahaRequestParams::kAppId,
1111 "1.2.3.4", // version
1112 "theurl", // more info
1113 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001114 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001115 "file.signed", // file name
1116 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001117 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001118 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001119 "123123123123123", // size
1120 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001121 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001122 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001123 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001124 metrics::CheckResult::kUpdateAvailable,
1125 metrics::CheckReaction::kUpdating,
1126 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001127 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001128 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001129
1130 EXPECT_EQ(response.size, 123123123123123ll);
1131}
1132
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001133TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001134 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001135 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001136 fake_system_state_.set_prefs(&prefs);
1137
Darin Petkov95508da2011-01-05 12:42:29 -08001138 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1139 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001140 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001141 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001142 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001143 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001144 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001145 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001146 metrics::CheckResult::kParsingError,
1147 metrics::CheckReaction::kUnset,
1148 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001149 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001150 &post_data));
1151 // convert post_data to string
1152 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001153 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001154 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001155 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001156 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001157 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1158 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001159 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1160 string::npos);
1161 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1162 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001163}
1164
Jay Srinivasan0a708742012-03-20 11:26:12 -07001165
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001166TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001167 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001168 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001169 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1170 "invalid xml>",
1171 &post_data);
1172 // convert post_data to string
1173 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001174 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001175 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001176 OmahaEvent::kTypeUpdateDownloadStarted,
1177 OmahaEvent::kResultSuccess);
1178 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001179 EXPECT_EQ(post_str.find("ping"), string::npos);
1180 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001181}
1182
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001183TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001184 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001185 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001186 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1187 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001188 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001189 "invalid xml>",
1190 &post_data);
1191 // convert post_data to string
1192 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001193 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001194 " <event eventtype=\"%d\" eventresult=\"%d\" "
1195 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001196 OmahaEvent::kTypeDownloadComplete,
1197 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001198 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001199 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001200 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001201}
1202
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001203TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001204 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001205 // Create a copy of the OmahaRequestParams to reuse it later.
1206 OmahaRequestParams params = request_params_;
1207 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001208 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001209 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001210 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001211 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001212 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001213 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001214 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001215 EXPECT_FALSE(update_check_action.IsEvent());
1216
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001217 params = request_params_;
1218 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001219 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001220 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001221 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001222 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001223 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001224 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001225 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001226 EXPECT_TRUE(event_action.IsEvent());
1227}
1228
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001229TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001230 for (int i = 0; i < 2; i++) {
1231 bool delta_okay = i == 1;
1232 const char* delta_okay_str = delta_okay ? "true" : "false";
1233 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001234 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001235 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001236 OmahaRequestParams::kOsVersion,
1237 "service_pack",
1238 "x86-generic",
1239 OmahaRequestParams::kAppId,
1240 "0.1.0.0",
1241 "en-US",
1242 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001243 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001244 "ChromeOSFirmware.1.0",
1245 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001246 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001247 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001248 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001249 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001250 ASSERT_FALSE(TestUpdateCheck(&params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001251 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001252 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001253 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001254 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001255 metrics::CheckResult::kParsingError,
1256 metrics::CheckReaction::kUnset,
1257 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001258 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001259 &post_data));
1260 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001261 string post_str(post_data.data(), post_data.size());
1262 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1263 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001264 string::npos)
1265 << "i = " << i;
1266 }
1267}
1268
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001269TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001270 for (int i = 0; i < 2; i++) {
1271 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001272 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001273 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001274 FakeSystemState fake_system_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001275 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001276 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001277 OmahaRequestParams::kOsVersion,
1278 "service_pack",
1279 "x86-generic",
1280 OmahaRequestParams::kAppId,
1281 "0.1.0.0",
1282 "en-US",
1283 "unittest_track",
1284 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001285 "ChromeOSFirmware.1.0",
1286 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001287 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001288 interactive,
1289 "http://url",
Gilad Arnold74b5f552014-10-07 08:17:16 -07001290 ""); // target_version_prefix
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001291 ASSERT_FALSE(TestUpdateCheck(&params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001292 "invalid xml>",
1293 -1,
1294 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001295 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001296 metrics::CheckResult::kParsingError,
1297 metrics::CheckReaction::kUnset,
1298 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001299 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001300 &post_data));
1301 // convert post_data to string
1302 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001303 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1304 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001305 string::npos)
1306 << "i = " << i;
1307 }
1308}
1309
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001310TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001311 OmahaEvent default_event;
1312 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1313 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001314 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001315
1316 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1317 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1318 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001319 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001320
1321 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1322 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001323 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001324 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1325 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001326 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001327}
1328
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001329void OmahaRequestActionTest::PingTest(bool ping_only) {
1330 NiceMock<PrefsMock> prefs;
1331 fake_system_state_.set_prefs(&prefs);
1332 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1333 .Times(AnyNumber());
1334 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1335 // Add a few hours to the day difference to test no rounding, etc.
1336 int64_t five_days_ago =
1337 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1338 int64_t six_days_ago =
1339 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1340 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1341 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1342 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1343 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1344 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1345 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1346 vector<char> post_data;
1347 ASSERT_TRUE(
1348 TestUpdateCheck(nullptr, // request_params
1349 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1350 -1,
1351 ping_only,
1352 ErrorCode::kSuccess,
1353 metrics::CheckResult::kUnset,
1354 metrics::CheckReaction::kUnset,
1355 metrics::DownloadErrorCode::kUnset,
1356 nullptr,
1357 &post_data));
1358 string post_str(&post_data[0], post_data.size());
1359 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1360 string::npos);
1361 if (ping_only) {
1362 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1363 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1364 } else {
1365 EXPECT_NE(post_str.find("updatecheck"), string::npos);
1366 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001367 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001368}
1369
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001370TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1371 PingTest(true /* ping_only */);
1372}
1373
1374TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1375 PingTest(false /* ping_only */);
1376}
1377
1378TEST_F(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001379 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001380 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001381 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1382 .Times(AnyNumber());
1383 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001384 int64_t three_days_ago =
1385 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1386 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001387 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1388 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001389 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1390 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1391 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1392 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1393 vector<char> post_data;
1394 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001395 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001396 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001397 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001398 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001399 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001400 metrics::CheckResult::kNoUpdateAvailable,
1401 metrics::CheckReaction::kUnset,
1402 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001403 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001404 &post_data));
1405 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001406 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001407 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001408}
1409
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001410TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001411 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001412 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001413 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1414 .Times(AnyNumber());
1415 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001416 int64_t four_days_ago =
1417 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1418 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001419 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1420 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001421 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1422 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1423 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1424 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1425 vector<char> post_data;
1426 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001427 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001428 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001429 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001430 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001431 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001432 metrics::CheckResult::kNoUpdateAvailable,
1433 metrics::CheckReaction::kUnset,
1434 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001435 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001436 &post_data));
1437 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001438 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001439 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001440}
1441
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001442TEST_F(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001443 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001444 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001445 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1446 .Times(AnyNumber());
1447 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001448 int64_t one_hour_ago =
1449 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001450 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1451 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001452 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1453 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1454 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1455 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001456 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1457 // send a ping.
1458 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1459 .WillOnce(Return(true));
1460 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1461 .WillOnce(Return(true));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001462 vector<char> post_data;
1463 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001464 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001465 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001466 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001467 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001468 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001469 metrics::CheckResult::kNoUpdateAvailable,
1470 metrics::CheckReaction::kUnset,
1471 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001472 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001473 &post_data));
1474 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001475 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001476}
1477
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001478TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07001479 // This test ensures that we ignore empty ping only requests.
1480 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001481 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07001482 int64_t now = Time::Now().ToInternalValue();
1483 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1484 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1485 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1486 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1487 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1488 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1489 vector<char> post_data;
1490 EXPECT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001491 TestUpdateCheck(nullptr, // request_params
Thieu Leb44e9e82011-06-06 14:34:04 -07001492 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1493 -1,
1494 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001495 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001496 metrics::CheckResult::kUnset,
1497 metrics::CheckReaction::kUnset,
1498 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001499 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001500 &post_data));
1501 EXPECT_EQ(post_data.size(), 0);
1502}
1503
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001504TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001505 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001506 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001507 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1508 .Times(AnyNumber());
1509 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001510 int64_t future =
1511 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001512 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1513 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001514 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1515 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1516 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1517 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1518 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1519 .WillOnce(Return(true));
1520 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1521 .WillOnce(Return(true));
1522 vector<char> post_data;
1523 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001524 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001525 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1526 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001527 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001528 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001529 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001530 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001531 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001532 metrics::CheckResult::kNoUpdateAvailable,
1533 metrics::CheckReaction::kUnset,
1534 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001535 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001536 &post_data));
1537 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001538 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001539}
1540
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001541TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001542 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001543 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001544 // may fail if it runs for longer than 5 seconds. It shouldn't run
1545 // that long though.
1546 int64_t midnight =
1547 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1548 int64_t midnight_slack =
1549 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001550 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001551 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001552 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1553 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001554 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1555 AllOf(Ge(midnight), Le(midnight_slack))))
1556 .WillOnce(Return(true));
1557 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1558 AllOf(Ge(midnight), Le(midnight_slack))))
1559 .WillOnce(Return(true));
1560 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001561 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001562 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1563 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001564 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001565 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001566 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001567 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001568 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001569 metrics::CheckResult::kNoUpdateAvailable,
1570 metrics::CheckReaction::kUnset,
1571 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001572 nullptr,
1573 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001574}
1575
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001576TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001577 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001578 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001579 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1580 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001581 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1582 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1583 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001584 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001585 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1586 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001587 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001588 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001589 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001590 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001591 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001592 metrics::CheckResult::kNoUpdateAvailable,
1593 metrics::CheckReaction::kUnset,
1594 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001595 nullptr,
1596 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001597}
1598
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001599TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001600 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001601 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001602 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1603 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001604 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1605 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1606 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001607 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001608 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1609 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001610 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001611 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001612 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001613 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001614 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001615 metrics::CheckResult::kNoUpdateAvailable,
1616 metrics::CheckReaction::kUnset,
1617 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001618 nullptr,
1619 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001620}
1621
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001622TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Darin Petkov84c763c2010-07-29 16:27:58 -07001623 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001624 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov84c763c2010-07-29 16:27:58 -07001625 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001626 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001627 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001628 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001629 metrics::CheckResult::kParsingError,
1630 metrics::CheckReaction::kUnset,
1631 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001632 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001633 &post_data));
1634 // convert post_data to string
1635 string post_str(&post_data[0], post_data.size());
1636 EXPECT_EQ(post_str.find("machineid="), string::npos);
1637 EXPECT_EQ(post_str.find("userid="), string::npos);
1638}
1639
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001640TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001641 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001642 const int http_error_code =
1643 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001644 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001645 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001646 "",
1647 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001648 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001649 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001650 metrics::CheckResult::kDownloadError,
1651 metrics::CheckReaction::kUnset,
1652 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001653 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001654 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001655 EXPECT_FALSE(response.update_exists);
1656}
1657
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001658TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001659 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001660 const int http_error_code =
1661 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001662 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001663 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001664 "",
1665 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001666 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001667 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001668 metrics::CheckResult::kDownloadError,
1669 metrics::CheckReaction::kUnset,
1670 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001671 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001672 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001673 EXPECT_FALSE(response.update_exists);
1674}
1675
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001676TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001677 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001678 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001679 params.set_wall_clock_based_wait_enabled(true);
1680 params.set_waiting_period(TimeDelta().FromDays(1));
1681 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001682
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001683 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001684 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001685 GetUpdateResponse2(OmahaRequestParams::kAppId,
1686 "1.2.3.4", // version
1687 "http://more/info",
1688 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001689 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001690 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001691 "HASH1234=", // checksum
1692 "false", // needs admin
1693 "123", // size
1694 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001695 "7", // max days to scatter
1696 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001697 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001698 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001699 -1,
1700 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001701 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001702 metrics::CheckResult::kUpdateAvailable,
1703 metrics::CheckReaction::kDeferring,
1704 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001705 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001706 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001707
Ben Chan9abb7632014-08-07 00:10:53 -07001708 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001709 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001710 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001711 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001712
1713 // Verify if we are interactive check we don't defer.
1714 params.set_interactive(true);
1715 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001716 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -07001717 GetUpdateResponse2(OmahaRequestParams::kAppId,
1718 "1.2.3.4", // version
1719 "http://more/info",
1720 "true", // prompt
1721 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001722 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001723 "HASH1234=", // checksum
1724 "false", // needs admin
1725 "123", // size
1726 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001727 "7", // max days to scatter
1728 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001729 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001730 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001731 -1,
1732 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001733 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001734 metrics::CheckResult::kUpdateAvailable,
1735 metrics::CheckReaction::kUpdating,
1736 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001737 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001738 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001739 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001740}
1741
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001742TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001743 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001744 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001745 params.set_wall_clock_based_wait_enabled(true);
1746 params.set_waiting_period(TimeDelta().FromDays(1));
1747 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001748
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001749 // Set the timestamp to a very old value such that it exceeds the
1750 // waiting period set above.
1751 Time t1;
1752 Time::FromString("1/1/2012", &t1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001753 ASSERT_TRUE(fake_prefs_.SetInt64(
1754 kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001755 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001756 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001757 GetUpdateResponse2(OmahaRequestParams::kAppId,
1758 "1.2.3.4", // version
1759 "http://more/info",
1760 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001761 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001762 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001763 "HASH1234=", // checksum
1764 "false", // needs admin
1765 "123", // size
1766 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001767 "7", // max days to scatter
1768 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001769 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001770 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001771 -1,
1772 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001773 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001774 metrics::CheckResult::kUpdateAvailable,
1775 metrics::CheckReaction::kUpdating,
1776 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001777 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001778 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001779
1780 EXPECT_TRUE(response.update_exists);
1781
1782 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001783 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001784 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001785 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1786}
1787
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001788TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001789 // Create a uniquely named test directory.
1790 string test_dir;
1791 ASSERT_TRUE(utils::MakeTempDirectory(
1792 "omaha_request_action-test-XXXXXX", &test_dir));
1793
1794 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1795 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001796 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001797 vector<char> post_data;
1798 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001799 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001800 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001801 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001802 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1803 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1804 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1805 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001806 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001807 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1808 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001809 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001810 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001811 params.SetLockDown(false);
1812 params.Init("1.2.3.4", "", 0);
1813 EXPECT_EQ("canary-channel", params.current_channel());
1814 EXPECT_EQ("stable-channel", params.target_channel());
1815 EXPECT_TRUE(params.to_more_stable_channel());
1816 EXPECT_TRUE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001817 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001818 "invalid xml>",
1819 -1,
1820 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001821 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001822 metrics::CheckResult::kParsingError,
1823 metrics::CheckReaction::kUnset,
1824 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001825 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001826 &post_data));
1827 // convert post_data to string
1828 string post_str(&post_data[0], post_data.size());
1829 EXPECT_NE(string::npos, post_str.find(
1830 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1831 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1832 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001833
1834 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001835}
1836
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001837TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001838 // Create a uniquely named test directory.
1839 string test_dir;
1840 ASSERT_TRUE(utils::MakeTempDirectory(
1841 "omaha_request_action-test-XXXXXX", &test_dir));
1842
1843 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1844 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001845 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001846 vector<char> post_data;
1847 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001848 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001849 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001850 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001851 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1852 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1853 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1854 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001855 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001856 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001857 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001858 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001859 params.SetLockDown(false);
1860 params.Init("5.6.7.8", "", 0);
1861 EXPECT_EQ("stable-channel", params.current_channel());
1862 EXPECT_EQ("canary-channel", params.target_channel());
1863 EXPECT_FALSE(params.to_more_stable_channel());
1864 EXPECT_FALSE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001865 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001866 "invalid xml>",
1867 -1,
1868 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001869 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001870 metrics::CheckResult::kParsingError,
1871 metrics::CheckReaction::kUnset,
1872 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001873 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001874 &post_data));
1875 // convert post_data to string
1876 string post_str(&post_data[0], post_data.size());
1877 EXPECT_NE(string::npos, post_str.find(
1878 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1879 "version=\"5.6.7.8\" "
1880 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001881 EXPECT_EQ(string::npos, post_str.find("from_version"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001882}
1883
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001884// Checks that the initial ping with a=-1 r=-1 is not send when the device
1885// was powerwashed.
1886TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1887 fake_prefs_.SetString(kPrefsPreviousVersion, "");
1888
1889 // Flag that the device was powerwashed in the past.
1890 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1891
1892 vector<char> post_data;
1893 ASSERT_TRUE(
1894 TestUpdateCheck(nullptr, // request_params
1895 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1896 -1,
1897 false, // ping_only
1898 ErrorCode::kSuccess,
1899 metrics::CheckResult::kNoUpdateAvailable,
1900 metrics::CheckReaction::kUnset,
1901 metrics::DownloadErrorCode::kUnset,
1902 nullptr,
1903 &post_data));
1904 // We shouldn't send a ping in this case since powerwash > 0.
1905 string post_str(&post_data[0], post_data.size());
1906 EXPECT_EQ(string::npos, post_str.find("<ping"));
1907}
1908
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001909void OmahaRequestActionTest::P2PTest(
1910 bool initial_allow_p2p_for_downloading,
1911 bool initial_allow_p2p_for_sharing,
1912 bool omaha_disable_p2p_for_downloading,
1913 bool omaha_disable_p2p_for_sharing,
1914 bool payload_state_allow_p2p_attempt,
1915 bool expect_p2p_client_lookup,
1916 const string& p2p_client_result_url,
1917 bool expected_allow_p2p_for_downloading,
1918 bool expected_allow_p2p_for_sharing,
1919 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07001920 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001921 OmahaRequestParams request_params = request_params_;
Gilad Arnold74b5f552014-10-07 08:17:16 -07001922 bool actual_allow_p2p_for_downloading = initial_allow_p2p_for_downloading;
1923 bool actual_allow_p2p_for_sharing = initial_allow_p2p_for_sharing;
1924 string actual_p2p_url;
David Zeuthen8f191b22013-08-06 12:27:50 -07001925
1926 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001927 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07001928 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
1929 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
Gilad Arnold74b5f552014-10-07 08:17:16 -07001930 EXPECT_CALL(mock_payload_state, GetUsingP2PForDownloading())
1931 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_downloading));
1932 EXPECT_CALL(mock_payload_state, GetUsingP2PForSharing())
1933 .WillRepeatedly(ReturnPointee(&actual_allow_p2p_for_sharing));
1934 EXPECT_CALL(mock_payload_state, SetUsingP2PForDownloading(_))
1935 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_downloading));
1936 EXPECT_CALL(mock_payload_state, SetUsingP2PForSharing(_))
1937 .WillRepeatedly(SaveArg<0>(&actual_allow_p2p_for_sharing));
1938 EXPECT_CALL(mock_payload_state, SetP2PUrl(_))
1939 .WillRepeatedly(SaveArg<0>(&actual_p2p_url));
1940
David Zeuthen8f191b22013-08-06 12:27:50 -07001941 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001942 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07001943 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
1944
David Zeuthen4cc5ed22014-01-15 12:35:03 -08001945 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
1946 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07001947 .Times(expect_p2p_client_lookup ? 1 : 0);
1948
1949 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001950 TestUpdateCheck(&request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07001951 GetUpdateResponse2(OmahaRequestParams::kAppId,
1952 "1.2.3.4", // version
1953 "http://more/info",
1954 "true", // prompt
1955 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001956 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07001957 "HASH1234=", // checksum
1958 "false", // needs admin
1959 "123", // size
1960 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001961 "7", // max days to scatter
1962 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001963 omaha_disable_p2p_for_downloading,
1964 omaha_disable_p2p_for_sharing),
1965 -1,
1966 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001967 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001968 metrics::CheckResult::kUpdateAvailable,
1969 metrics::CheckReaction::kUpdating,
1970 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07001971 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001972 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07001973 EXPECT_TRUE(response.update_exists);
1974
Gilad Arnold74b5f552014-10-07 08:17:16 -07001975 EXPECT_EQ(omaha_disable_p2p_for_downloading,
1976 response.disable_p2p_for_downloading);
1977 EXPECT_EQ(omaha_disable_p2p_for_sharing,
1978 response.disable_p2p_for_sharing);
David Zeuthen8f191b22013-08-06 12:27:50 -07001979
Gilad Arnold74b5f552014-10-07 08:17:16 -07001980 EXPECT_EQ(expected_allow_p2p_for_downloading,
1981 actual_allow_p2p_for_downloading);
1982 EXPECT_EQ(expected_allow_p2p_for_sharing, actual_allow_p2p_for_sharing);
1983 EXPECT_EQ(expected_p2p_url, actual_p2p_url);
David Zeuthen8f191b22013-08-06 12:27:50 -07001984}
1985
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001986TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001987 P2PTest(true, // initial_allow_p2p_for_downloading
1988 true, // initial_allow_p2p_for_sharing
1989 false, // omaha_disable_p2p_for_downloading
1990 false, // omaha_disable_p2p_for_sharing
1991 true, // payload_state_allow_p2p_attempt
1992 true, // expect_p2p_client_lookup
1993 "http://1.3.5.7/p2p", // p2p_client_result_url
1994 true, // expected_allow_p2p_for_downloading
1995 true, // expected_allow_p2p_for_sharing
1996 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07001997}
1998
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001999TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002000 P2PTest(true, // initial_allow_p2p_for_downloading
2001 true, // initial_allow_p2p_for_sharing
2002 false, // omaha_disable_p2p_for_downloading
2003 false, // omaha_disable_p2p_for_sharing
2004 true, // payload_state_allow_p2p_attempt
2005 true, // expect_p2p_client_lookup
2006 "", // p2p_client_result_url
2007 false, // expected_allow_p2p_for_downloading
2008 true, // expected_allow_p2p_for_sharing
2009 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002010}
2011
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002012TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002013 P2PTest(false, // initial_allow_p2p_for_downloading
2014 true, // initial_allow_p2p_for_sharing
2015 false, // omaha_disable_p2p_for_downloading
2016 false, // omaha_disable_p2p_for_sharing
2017 true, // payload_state_allow_p2p_attempt
2018 false, // expect_p2p_client_lookup
2019 "unset", // p2p_client_result_url
2020 false, // expected_allow_p2p_for_downloading
2021 true, // expected_allow_p2p_for_sharing
2022 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002023}
2024
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002025TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002026 P2PTest(true, // initial_allow_p2p_for_downloading
2027 true, // initial_allow_p2p_for_sharing
2028 true, // omaha_disable_p2p_for_downloading
2029 false, // omaha_disable_p2p_for_sharing
2030 true, // payload_state_allow_p2p_attempt
2031 false, // expect_p2p_client_lookup
2032 "unset", // p2p_client_result_url
2033 false, // expected_allow_p2p_for_downloading
2034 true, // expected_allow_p2p_for_sharing
2035 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002036}
2037
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002038TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002039 P2PTest(true, // initial_allow_p2p_for_downloading
2040 true, // initial_allow_p2p_for_sharing
2041 false, // omaha_disable_p2p_for_downloading
2042 true, // omaha_disable_p2p_for_sharing
2043 true, // payload_state_allow_p2p_attempt
2044 true, // expect_p2p_client_lookup
2045 "http://1.3.5.7/p2p", // p2p_client_result_url
2046 true, // expected_allow_p2p_for_downloading
2047 false, // expected_allow_p2p_for_sharing
2048 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002049}
2050
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002051TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002052 P2PTest(true, // initial_allow_p2p_for_downloading
2053 true, // initial_allow_p2p_for_sharing
2054 true, // omaha_disable_p2p_for_downloading
2055 true, // omaha_disable_p2p_for_sharing
2056 true, // payload_state_allow_p2p_attempt
2057 false, // expect_p2p_client_lookup
2058 "unset", // p2p_client_result_url
2059 false, // expected_allow_p2p_for_downloading
2060 false, // expected_allow_p2p_for_sharing
2061 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002062}
2063
Alex Deymof329b932014-10-30 01:37:48 -07002064bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2065 OmahaResponse *response) {
David Zeuthen639aa362014-02-03 16:23:44 -08002066 return
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002067 TestUpdateCheck(nullptr, // request_params
David Zeuthen639aa362014-02-03 16:23:44 -08002068 GetUpdateResponse2(OmahaRequestParams::kAppId,
2069 "1.2.3.4", // version
2070 "http://more/info",
2071 "true", // prompt
2072 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002073 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002074 "HASH1234=", // checksum
2075 "false", // needs admin
2076 "123", // size
2077 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002078 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002079 elapsed_days,
2080 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002081 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002082 -1,
2083 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002084 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002085 metrics::CheckResult::kUpdateAvailable,
2086 metrics::CheckReaction::kUpdating,
2087 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002088 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002089 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002090}
2091
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002092TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002093 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002094
2095 // Check that we parse elapsed_days in the Omaha Response correctly.
2096 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002097 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2098 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002099 EXPECT_TRUE(response.update_exists);
2100 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002101 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002102 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002103 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002104 EXPECT_EQ(prefs_days, 42);
2105
2106 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002107 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002108 EXPECT_TRUE(response.update_exists);
2109 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002110 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002111 EXPECT_EQ(prefs_days, 42);
2112
2113 // Note that elapsed_days is not necessarily divisible by 7 so check
2114 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002115 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2116 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002117 EXPECT_TRUE(response.update_exists);
2118 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002119 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002120 EXPECT_EQ(prefs_days, 21);
2121
2122 // Check that we correctly handle elapsed_days not being included in
2123 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002124 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002125 EXPECT_TRUE(response.update_exists);
2126 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002127}
2128
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002129// If there is no prefs and OOBE is not complete, we should not
2130// report anything to Omaha.
2131TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
2132 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2133 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2134}
David Zeuthen639aa362014-02-03 16:23:44 -08002135
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002136// If OOBE is complete and happened on a valid date (e.g. after Jan
2137// 1 2007 0:00 PST), that date should be used and written to
2138// prefs. However, first try with an invalid date and check we do
2139// nothing.
2140TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2141 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2142 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2143 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2144 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2145}
David Zeuthen639aa362014-02-03 16:23:44 -08002146
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002147// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2148// should yield an InstallDate of 14.
2149TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2150 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2151 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2152 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2153 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002154
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002155 int64_t prefs_days;
2156 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2157 EXPECT_EQ(prefs_days, 14);
2158}
David Zeuthen639aa362014-02-03 16:23:44 -08002159
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002160// Now that we have a valid date in prefs, check that we keep using
2161// that even if OOBE date reports something else. The date Jan 30,
2162// 2007 0:00 PST should yield an InstallDate of 28... but since
2163// there's a prefs file, we should still get 14.
2164TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2165 // Set a valid date in the prefs first.
2166 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002167
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002168 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2169 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2170 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002171
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002172 int64_t prefs_days;
2173 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2174 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002175
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002176 // If we delete the prefs file, we should get 28 days.
2177 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2178 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2179 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2180 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002181}
2182
Darin Petkov6a5b3222010-07-13 14:55:28 -07002183} // namespace chromeos_update_engine