blob: 775f074b02b8b210ce38df0679561363ce66fda7 [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"
22#include "update_engine/omaha_hash_calculator.h"
23#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070024#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070025#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070026#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070027#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070028
Darin Petkov1cbd78f2010-07-29 12:38:34 -070029using base::Time;
30using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070031using std::string;
32using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070033using testing::AllOf;
Alex Deymof329b932014-10-30 01:37:48 -070034using testing::AnyNumber;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070035using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070036using testing::Ge;
37using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080038using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070039using testing::Return;
40using testing::SetArgumentPointee;
Alex Deymof329b932014-10-30 01:37:48 -070041using testing::_;
Darin Petkov6a5b3222010-07-13 14:55:28 -070042
43namespace chromeos_update_engine {
44
Alex Deymoe1e3afe2014-10-30 13:02:49 -070045class OmahaRequestActionTest : public ::testing::Test {
46 protected:
47 void SetUp() {
48 fake_system_state_.set_request_params(&request_params_);
49 fake_system_state_.set_prefs(&fake_prefs_);
50 }
51
52 // Returns true iff an output response was obtained from the
53 // OmahaRequestAction. |prefs| may be null, in which case a local PrefsMock
54 // is used. |payload_state| may be null, in which case a local mock is used.
55 // |p2p_manager| may be null, in which case a local mock is used.
56 // |connection_manager| may be null, in which case a local mock is used.
57 // out_response may be null. If |fail_http_response_code| is non-negative,
58 // the transfer will fail with that code. |ping_only| is passed through to the
59 // OmahaRequestAction constructor. out_post_data may be null; if non-null, the
60 // post-data received by the mock HttpFetcher is returned.
61 //
62 // The |expected_check_result|, |expected_check_reaction| and
63 // |expected_error_code| parameters are for checking expectations
64 // about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
65 // UMA statistics. Use the appropriate ::kUnset value to specify that
66 // the given metric should not be reported.
67 bool TestUpdateCheck(OmahaRequestParams* request_params,
68 const string& http_response,
69 int fail_http_response_code,
70 bool ping_only,
71 ErrorCode expected_code,
72 metrics::CheckResult expected_check_result,
73 metrics::CheckReaction expected_check_reaction,
74 metrics::DownloadErrorCode expected_download_error_code,
75 OmahaResponse* out_response,
76 vector<char>* out_post_data);
77
78 // Runs and checks a ping test. |ping_only| indicates wheter it should send
79 // only a ping or also an updatecheck.
80 void PingTest(bool ping_only);
81
82 // InstallDate test helper function.
Alex Deymof329b932014-10-30 01:37:48 -070083 bool InstallDateParseHelper(const string &elapsed_days,
Alex Deymoe1e3afe2014-10-30 13:02:49 -070084 OmahaResponse *response);
85
86 // P2P test helper function.
87 void P2PTest(
88 bool initial_allow_p2p_for_downloading,
89 bool initial_allow_p2p_for_sharing,
90 bool omaha_disable_p2p_for_downloading,
91 bool omaha_disable_p2p_for_sharing,
92 bool payload_state_allow_p2p_attempt,
93 bool expect_p2p_client_lookup,
94 const string& p2p_client_result_url,
95 bool expected_allow_p2p_for_downloading,
96 bool expected_allow_p2p_for_sharing,
97 const string& expected_p2p_url);
98
99 FakeSystemState fake_system_state_;
100
101 // By default, all tests use these objects unless they replace them in the
102 // fake_system_state_.
103 OmahaRequestParams request_params_ = OmahaRequestParams{
104 &fake_system_state_,
105 OmahaRequestParams::kOsPlatform,
106 OmahaRequestParams::kOsVersion,
107 "service_pack",
108 "x86-generic",
109 OmahaRequestParams::kAppId,
110 "0.1.0.0",
111 "en-US",
112 "unittest",
113 "OEM MODEL 09235 7471",
114 "ChromeOSFirmware.1.0",
115 "0X0A1",
116 false, // delta okay
117 false, // interactive
118 "http://url",
119 "", // target_version_prefix
120 false, // use_p2p_for_downloading
121 false}; // use_p2p_for_sharing
122
123 FakePrefs fake_prefs_;
124};
Darin Petkov6a5b3222010-07-13 14:55:28 -0700125
126namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700127
Darin Petkov6a5b3222010-07-13 14:55:28 -0700128string GetNoUpdateResponse(const string& app_id) {
129 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700130 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
131 "<daystart elapsed_seconds=\"100\"/>"
132 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
133 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134}
135
David Zeuthenf3e28012014-08-26 18:23:52 -0400136string GetNoUpdateResponseWithEntity(const string& app_id) {
137 return string(
138 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
139 "<!DOCTYPE response ["
140 "<!ENTITY CrOS \"ChromeOS\">"
141 "]>"
142 "<response protocol=\"3.0\">"
143 "<daystart elapsed_seconds=\"100\"/>"
144 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
145 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
146}
147
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700148string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700149 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700150 const string& more_info_url,
151 const string& prompt,
152 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700153 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700154 const string& hash,
155 const string& needsadmin,
156 const string& size,
157 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700158 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800159 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700160 bool disable_p2p_for_downloading,
161 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700162 string response =
163 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
164 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800165 "<daystart elapsed_seconds=\"100\"" +
166 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
167 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700168 "<app appid=\"" + app_id + "\" status=\"ok\">"
169 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
170 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700171 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700172 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
173 "size=\"" + size + "\"/></packages>"
174 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700175 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700176 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
177 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800178 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700179 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700180 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700181 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700182 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700183 (disable_p2p_for_downloading ?
184 "DisableP2PForDownloading=\"true\" " : "") +
185 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700186 "/></actions></manifest></updatecheck></app></response>";
187 LOG(INFO) << "Response = " << response;
188 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700189}
190
Darin Petkov6a5b3222010-07-13 14:55:28 -0700191string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700192 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700193 const string& more_info_url,
194 const string& prompt,
195 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700196 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700197 const string& hash,
198 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700199 const string& size,
200 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700201 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700202 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700203 more_info_url,
204 prompt,
205 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700206 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700207 hash,
208 needsadmin,
209 size,
210 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700211 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700212 "42", // elapsed_days
213 false, // disable_p2p_for_downloading
214 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700215}
216
217class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
218 public:
219 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700220 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700221 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700222 virtual ~OmahaRequestActionTestProcessorDelegate() {
223 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700224 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700225 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700226 ASSERT_TRUE(loop_);
227 g_main_loop_quit(loop_);
228 }
229
230 virtual void ActionCompleted(ActionProcessor* processor,
231 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700232 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700233 // make sure actions always succeed
234 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700235 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700236 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700237 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700238 }
239 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700240 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700241};
242
243gboolean StartProcessorInRunLoop(gpointer data) {
244 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
245 processor->StartProcessing();
246 return FALSE;
247}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700248} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700249
250class OutputObjectCollectorAction;
251
252template<>
253class ActionTraits<OutputObjectCollectorAction> {
254 public:
255 // Does not take an object for input
256 typedef OmahaResponse InputObjectType;
257 // On success, puts the output path on output
258 typedef NoneType OutputObjectType;
259};
260
261class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
262 public:
263 OutputObjectCollectorAction() : has_input_object_(false) {}
264 void PerformAction() {
265 // copy input object
266 has_input_object_ = HasInputObject();
267 if (has_input_object_)
268 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700269 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700270 }
271 // Should never be called
272 void TerminateProcessing() {
273 CHECK(false);
274 }
275 // Debugging/logging
Alex Deymof329b932014-10-30 01:37:48 -0700276 static string StaticType() {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700277 return "OutputObjectCollectorAction";
278 }
Alex Deymof329b932014-10-30 01:37:48 -0700279 string Type() const { return StaticType(); }
Darin Petkov6a5b3222010-07-13 14:55:28 -0700280 bool has_input_object_;
281 OmahaResponse omaha_response_;
282};
283
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700284bool OmahaRequestActionTest::TestUpdateCheck(
285 OmahaRequestParams* request_params,
286 const string& http_response,
287 int fail_http_response_code,
288 bool ping_only,
289 ErrorCode expected_code,
290 metrics::CheckResult expected_check_result,
291 metrics::CheckReaction expected_check_reaction,
292 metrics::DownloadErrorCode expected_download_error_code,
293 OmahaResponse* out_response,
294 vector<char>* out_post_data) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700295 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
296 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800297 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700298 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700299 if (fail_http_response_code >= 0) {
300 fetcher->FailTransfer(fail_http_response_code);
301 }
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700302 if (request_params)
303 fake_system_state_.set_request_params(request_params);
304 OmahaRequestAction action(&fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700305 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700306 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700307 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700308 OmahaRequestActionTestProcessorDelegate delegate;
309 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700310 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700311
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700313 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700314 processor.EnqueueAction(&action);
315
316 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700317 BondActions(&action, &collector_action);
318 processor.EnqueueAction(&collector_action);
319
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700320 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800321 .Times(AnyNumber());
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700322 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800323 SendEnumToUMA(metrics::kMetricCheckResult,
324 static_cast<int>(expected_check_result),
325 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
326 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700327 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800328 SendEnumToUMA(metrics::kMetricCheckReaction,
329 static_cast<int>(expected_check_reaction),
330 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
331 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700332 EXPECT_CALL(*fake_system_state_.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700333 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
334 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800335 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
336 ? 0 : 1);
337
Darin Petkov6a5b3222010-07-13 14:55:28 -0700338 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
339 g_main_loop_run(loop);
340 g_main_loop_unref(loop);
341 if (collector_action.has_input_object_ && out_response)
342 *out_response = collector_action.omaha_response_;
343 if (out_post_data)
344 *out_post_data = fetcher->post_data();
345 return collector_action.has_input_object_;
346}
347
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700348// Tests Event requests -- they should always succeed. |out_post_data|
349// may be null; if non-null, the post-data received by the mock
350// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700351void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700352 OmahaEvent* event,
353 const string& http_response,
354 vector<char>* out_post_data) {
355 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
356 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800357 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700358 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700359 FakeSystemState fake_system_state;
360 fake_system_state.set_request_params(&params);
361 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700362 OmahaRequestActionTestProcessorDelegate delegate;
363 delegate.loop_ = loop;
364 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700365 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700366 processor.EnqueueAction(&action);
367
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700368 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
369 g_main_loop_run(loop);
370 g_main_loop_unref(loop);
371 if (out_post_data)
372 *out_post_data = fetcher->post_data();
373}
374
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700375TEST_F(OmahaRequestActionTest, RejectEntities) {
David Zeuthenf3e28012014-08-26 18:23:52 -0400376 OmahaResponse response;
377 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700378 TestUpdateCheck(nullptr, // request_params
David Zeuthenf3e28012014-08-26 18:23:52 -0400379 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
380 -1,
381 false, // ping_only
382 ErrorCode::kOmahaRequestXMLHasEntityDecl,
383 metrics::CheckResult::kParsingError,
384 metrics::CheckReaction::kUnset,
385 metrics::DownloadErrorCode::kUnset,
386 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700387 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400388 EXPECT_FALSE(response.update_exists);
389}
390
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700391TEST_F(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700392 OmahaResponse response;
393 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700394 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700395 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700396 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700397 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700398 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800399 metrics::CheckResult::kNoUpdateAvailable,
400 metrics::CheckReaction::kUnset,
401 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700402 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700403 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700404 EXPECT_FALSE(response.update_exists);
405}
406
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700407TEST_F(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700408 OmahaResponse response;
409 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700410 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700411 GetUpdateResponse(OmahaRequestParams::kAppId,
412 "1.2.3.4", // version
413 "http://more/info",
414 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700415 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700416 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700417 "HASH1234=", // checksum
418 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700419 "123", // size
420 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700421 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700422 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700423 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800424 metrics::CheckResult::kUpdateAvailable,
425 metrics::CheckReaction::kUpdating,
426 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700427 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700428 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700429 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700430 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700431 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800432 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700433 EXPECT_EQ("http://more/info", response.more_info_url);
434 EXPECT_EQ("HASH1234=", response.hash);
435 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700436 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700437 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700438}
439
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700440TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700441 OmahaResponse response;
442 // Set up a connection manager that doesn't allow a valid update over
443 // the current ethernet connection.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700444 MockConnectionManager mock_cm(nullptr);
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700445 fake_system_state_.set_connection_manager(&mock_cm);
446
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700447 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700448 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
449 SetArgumentPointee<2>(NetworkTethering::kUnknown),
450 Return(true)));
451 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
452 .WillRepeatedly(Return(false));
453 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
454 .WillRepeatedly(Return(shill::kTypeEthernet));
455
456 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700457 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700458 GetUpdateResponse(OmahaRequestParams::kAppId,
459 "1.2.3.4", // version
460 "http://more/info",
461 "true", // prompt
462 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700463 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700464 "HASH1234=", // checksum
465 "false", // needs admin
466 "123", // size
467 ""), // deadline
468 -1,
469 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700470 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700471 metrics::CheckResult::kUpdateAvailable,
472 metrics::CheckReaction::kIgnored,
473 metrics::DownloadErrorCode::kUnset,
474 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700475 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700476 EXPECT_FALSE(response.update_exists);
477}
478
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700479TEST_F(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
Chris Sosa77f79e82014-06-02 18:16:24 -0700480 string rollback_version = "1234.0.0";
481 OmahaResponse response;
482
483 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700484 fake_system_state_.set_payload_state(&mock_payload_state);
485
Chris Sosa77f79e82014-06-02 18:16:24 -0700486 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
487 .WillRepeatedly(Return(rollback_version));
488
489 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700490 TestUpdateCheck(nullptr, // request_params
Chris Sosa77f79e82014-06-02 18:16:24 -0700491 GetUpdateResponse(OmahaRequestParams::kAppId,
492 rollback_version, // version
493 "http://more/info",
494 "true", // prompt
495 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700496 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700497 "HASH1234=", // checksum
498 "false", // needs admin
499 "123", // size
500 ""), // deadline
501 -1,
502 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700503 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700504 metrics::CheckResult::kUpdateAvailable,
505 metrics::CheckReaction::kIgnored,
506 metrics::DownloadErrorCode::kUnset,
507 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700508 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700509 EXPECT_FALSE(response.update_exists);
510}
511
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700512TEST_F(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700513 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700514 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700515 params.set_wall_clock_based_wait_enabled(true);
516 params.set_update_check_count_wait_enabled(false);
517 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700518
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700519 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700520 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700521 GetUpdateResponse2(OmahaRequestParams::kAppId,
522 "1.2.3.4", // version
523 "http://more/info",
524 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700525 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700526 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700527 "HASH1234=", // checksum
528 "false", // needs admin
529 "123", // size
530 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700531 "7", // max days to scatter
532 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700533 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700534 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700535 -1,
536 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700537 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800538 metrics::CheckResult::kUpdateAvailable,
539 metrics::CheckReaction::kDeferring,
540 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700541 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700542 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700543 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700544
545 // Verify if we are interactive check we don't defer.
546 params.set_interactive(true);
547 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700548 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700549 GetUpdateResponse2(OmahaRequestParams::kAppId,
550 "1.2.3.4", // version
551 "http://more/info",
552 "true", // prompt
553 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700554 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700555 "HASH1234=", // checksum
556 "false", // needs admin
557 "123", // size
558 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700559 "7", // max days to scatter
560 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700561 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700562 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700563 -1,
564 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700565 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800566 metrics::CheckResult::kUpdateAvailable,
567 metrics::CheckReaction::kUpdating,
568 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700569 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700570 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700571 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700572}
573
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700574TEST_F(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700575 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700576 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700577 params.set_wall_clock_based_wait_enabled(false);
578 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700579
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700580 params.set_update_check_count_wait_enabled(true);
581 params.set_min_update_checks_needed(1);
582 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700583
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700584 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700585 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700586 GetUpdateResponse2(OmahaRequestParams::kAppId,
587 "1.2.3.4", // version
588 "http://more/info",
589 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700590 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700591 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700592 "HASH1234=", // checksum
593 "false", // needs admin
594 "123", // size
595 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700596 "7", // max days to scatter
597 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700598 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700599 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700600 -1,
601 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700602 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800603 metrics::CheckResult::kUpdateAvailable,
604 metrics::CheckReaction::kUpdating,
605 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700606 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700607 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700608 EXPECT_TRUE(response.update_exists);
609}
610
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700611TEST_F(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700612 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700613 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700614 params.set_wall_clock_based_wait_enabled(true);
615 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700616
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700617 params.set_update_check_count_wait_enabled(true);
618 params.set_min_update_checks_needed(1);
619 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700620
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700621 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700622 TestUpdateCheck(&params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700623 GetUpdateResponse2(OmahaRequestParams::kAppId,
624 "1.2.3.4", // version
625 "http://more/info",
626 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700627 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700628 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700629 "HASH1234=", // checksum
630 "false", // needs admin
631 "123", // size
632 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700633 "0", // max days to scatter
634 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700635 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700636 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700637 -1,
638 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700639 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800640 metrics::CheckResult::kUpdateAvailable,
641 metrics::CheckReaction::kUpdating,
642 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700643 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700644 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700645 EXPECT_TRUE(response.update_exists);
646}
647
648
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700649TEST_F(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700650 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700651 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700652 params.set_wall_clock_based_wait_enabled(true);
653 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700654
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700655 params.set_update_check_count_wait_enabled(true);
656 params.set_min_update_checks_needed(0);
657 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700658
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700659 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700660 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700661 GetUpdateResponse2(OmahaRequestParams::kAppId,
662 "1.2.3.4", // version
663 "http://more/info",
664 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700665 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700666 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700667 "HASH1234=", // checksum
668 "false", // needs admin
669 "123", // size
670 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700671 "7", // max days to scatter
672 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700673 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700674 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700675 -1,
676 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700677 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800678 metrics::CheckResult::kUpdateAvailable,
679 metrics::CheckReaction::kUpdating,
680 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700681 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700682 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700683
Ben Chan9abb7632014-08-07 00:10:53 -0700684 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700685 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700686 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700687 EXPECT_TRUE(response.update_exists);
688}
689
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700690TEST_F(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700691 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700692 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700693 params.set_wall_clock_based_wait_enabled(true);
694 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700695
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700696 params.set_update_check_count_wait_enabled(true);
697 params.set_min_update_checks_needed(1);
698 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700699
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700700 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700701 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700702 GetUpdateResponse2(OmahaRequestParams::kAppId,
703 "1.2.3.4", // version
704 "http://more/info",
705 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700706 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700707 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700708 "HASH1234=", // checksum
709 "false", // needs admin
710 "123", // size
711 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700712 "7", // max days to scatter
713 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700714 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700715 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700716 -1,
717 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700718 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800719 metrics::CheckResult::kUpdateAvailable,
720 metrics::CheckReaction::kDeferring,
721 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700722 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700723 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700724
Ben Chan9abb7632014-08-07 00:10:53 -0700725 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700726 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700727 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700728 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700729
730 // Verify if we are interactive check we don't defer.
731 params.set_interactive(true);
732 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700733 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700734 GetUpdateResponse2(OmahaRequestParams::kAppId,
735 "1.2.3.4", // version
736 "http://more/info",
737 "true", // prompt
738 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700739 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700740 "HASH1234=", // checksum
741 "false", // needs admin
742 "123", // size
743 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700744 "7", // max days to scatter
745 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700746 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700747 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700748 -1,
749 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700750 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800751 metrics::CheckResult::kUpdateAvailable,
752 metrics::CheckReaction::kUpdating,
753 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700754 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700755 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700756 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700757}
758
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700759TEST_F(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700760 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700761 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700762 params.set_wall_clock_based_wait_enabled(true);
763 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700764
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700765 params.set_update_check_count_wait_enabled(true);
766 params.set_min_update_checks_needed(1);
767 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700769 ASSERT_TRUE(fake_prefs_.SetInt64(kPrefsUpdateCheckCount, 5));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700770
771 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700772 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700773 GetUpdateResponse2(OmahaRequestParams::kAppId,
774 "1.2.3.4", // version
775 "http://more/info",
776 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700777 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700778 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700779 "HASH1234=", // checksum
780 "false", // needs admin
781 "123", // size
782 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700783 "7", // max days to scatter
784 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700785 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700786 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700787 -1,
788 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700789 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800790 metrics::CheckResult::kUpdateAvailable,
791 metrics::CheckReaction::kDeferring,
792 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700793 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700794 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700795
Ben Chan9abb7632014-08-07 00:10:53 -0700796 int64_t count;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700797 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateCheckCount, &count));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700798 // count remains the same, as the decrementing happens in update_attempter
799 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700800 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700801 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700802
803 // Verify if we are interactive check we don't defer.
804 params.set_interactive(true);
805 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700806 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -0700807 GetUpdateResponse2(OmahaRequestParams::kAppId,
808 "1.2.3.4", // version
809 "http://more/info",
810 "true", // prompt
811 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700812 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700813 "HASH1234=", // checksum
814 "false", // needs admin
815 "123", // size
816 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700817 "7", // max days to scatter
818 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700819 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700820 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700821 -1,
822 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700823 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800824 metrics::CheckResult::kUpdateAvailable,
825 metrics::CheckReaction::kUpdating,
826 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700827 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700828 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700829 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700830}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700831
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700832TEST_F(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700833 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
834
835 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
836
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700837 OmahaRequestParams params = request_params_;
838 fake_system_state_.set_request_params(&params);
839 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700840 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800841 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700842 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700843 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700844 OmahaRequestActionTestProcessorDelegate delegate;
845 delegate.loop_ = loop;
846 ActionProcessor processor;
847 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700848 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849
850 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
851 g_main_loop_run(loop);
852 g_main_loop_unref(loop);
853 EXPECT_FALSE(processor.IsRunning());
854}
855
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700856TEST_F(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700857 OmahaResponse response;
858 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700859 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700860 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700861 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700862 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700863 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800864 metrics::CheckResult::kParsingError,
865 metrics::CheckReaction::kUnset,
866 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700867 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700868 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700869 EXPECT_FALSE(response.update_exists);
870}
871
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700872TEST_F(OmahaRequestActionTest, EmptyResponseTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -0700873 OmahaResponse response;
874 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700875 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -0700876 "",
877 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700878 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700879 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800880 metrics::CheckResult::kParsingError,
881 metrics::CheckReaction::kUnset,
882 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700883 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700884 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700885 EXPECT_FALSE(response.update_exists);
886}
887
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700888TEST_F(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700889 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700890 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700891 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700892 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
893 "<daystart elapsed_seconds=\"100\"/>"
894 "<app appid=\"foo\" status=\"ok\">"
895 "<ping status=\"ok\"/>"
896 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700897 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700898 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700899 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800900 metrics::CheckResult::kParsingError,
901 metrics::CheckReaction::kUnset,
902 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700903 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700904 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700905 EXPECT_FALSE(response.update_exists);
906}
907
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700908TEST_F(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700909 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700910 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700911 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700912 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
913 "<daystart elapsed_seconds=\"100\"/>"
914 "<app appid=\"foo\" status=\"ok\">"
915 "<ping status=\"ok\"/>"
916 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700917 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700918 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700919 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800920 metrics::CheckResult::kParsingError,
921 metrics::CheckReaction::kUnset,
922 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700923 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700924 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700925 EXPECT_FALSE(response.update_exists);
926}
927
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700928TEST_F(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700929 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700930 ASSERT_FALSE(TestUpdateCheck(
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700931 nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700932 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
933 "<daystart elapsed_seconds=\"100\"/>"
934 "<app appid=\"foo\" status=\"ok\">"
935 "<ping status=\"ok\"/>"
936 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700937 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700938 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700939 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800940 metrics::CheckResult::kParsingError,
941 metrics::CheckReaction::kUnset,
942 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700943 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700944 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700945 EXPECT_FALSE(response.update_exists);
946}
947
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700948TEST_F(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700949 string input_response =
950 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
951 "<daystart elapsed_seconds=\"100\"/>"
952 "<app appid=\"xyz\" status=\"ok\">"
953 "<updatecheck status=\"ok\">"
954 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700955 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700956 "<packages><package hash=\"not-used\" name=\"f\" "
957 "size=\"587\"/></packages>"
958 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700959 "ChromeOSVersion=\"10.2.3.4\" "
960 "Prompt=\"false\" "
961 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800962 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700963 "sha256=\"lkq34j5345\" "
964 "needsadmin=\"true\" "
965 "/></actions></manifest></updatecheck></app></response>";
966 LOG(INFO) << "Input Response = " << input_response;
967
Darin Petkov6a5b3222010-07-13 14:55:28 -0700968 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -0700969 ASSERT_TRUE(TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700970 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700971 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700972 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700973 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800974 metrics::CheckResult::kUpdateAvailable,
975 metrics::CheckReaction::kUpdating,
976 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700977 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700978 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700979 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700980 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800981 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700982 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700983 EXPECT_EQ("lkq34j5345", response.hash);
984 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700985 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700986 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700987}
988
989namespace {
990class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
991 public:
992 void ProcessingStopped(const ActionProcessor* processor) {
993 ASSERT_TRUE(loop_);
994 g_main_loop_quit(loop_);
995 }
996 GMainLoop *loop_;
997};
998
999gboolean TerminateTransferTestStarter(gpointer data) {
1000 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1001 processor->StartProcessing();
1002 CHECK(processor->IsRunning());
1003 processor->StopProcessing();
1004 return FALSE;
1005}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001006} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001007
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001008TEST_F(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001009 string http_response("doesn't matter");
1010 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1011
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001012 OmahaRequestAction action(&fake_system_state_, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001013 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001014 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001015 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001016 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001017 TerminateEarlyTestProcessorDelegate delegate;
1018 delegate.loop_ = loop;
1019 ActionProcessor processor;
1020 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001021 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001022
1023 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1024 g_main_loop_run(loop);
1025 g_main_loop_unref(loop);
1026}
1027
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001028TEST_F(OmahaRequestActionTest, XmlEncodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001029 EXPECT_EQ("ab", XmlEncode("ab"));
1030 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001031 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1032 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1033
1034 vector<char> post_data;
1035
1036 // Make sure XML Encode is being called on the params
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001037 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001038 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001039 OmahaRequestParams::kOsVersion,
1040 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001041 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001042 OmahaRequestParams::kAppId,
1043 "0.1.0.0",
1044 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001045 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001046 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001047 "ChromeOSFirmware.1.0",
1048 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001049 false, // delta okay
1050 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001051 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001052 "", // target_version_prefix
1053 false, // use_p2p_for_downloading
1054 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001055 OmahaResponse response;
1056 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001057 TestUpdateCheck(&params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001058 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001059 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001060 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001061 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001062 metrics::CheckResult::kParsingError,
1063 metrics::CheckReaction::kUnset,
1064 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001065 &response,
1066 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001067 // convert post_data to string
1068 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001069 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1070 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001071 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1072 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1073 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1074 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001075 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1076 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001077}
1078
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001079TEST_F(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001080 OmahaResponse response;
1081 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001082 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001083 GetUpdateResponse(OmahaRequestParams::kAppId,
1084 "1.2.3.4", // version
1085 "testthe&lt;url", // more info
1086 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001087 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001088 "file.signed", // file name
1089 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001090 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001091 "123", // size
1092 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001093 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001094 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001095 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001096 metrics::CheckResult::kUpdateAvailable,
1097 metrics::CheckReaction::kUpdating,
1098 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001099 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001100 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001101
1102 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001103 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001104 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001105}
1106
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001107TEST_F(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001108 OmahaResponse response;
1109 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001110 TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001111 GetUpdateResponse(OmahaRequestParams::kAppId,
1112 "1.2.3.4", // version
1113 "theurl", // more info
1114 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001115 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001116 "file.signed", // file name
1117 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001118 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001119 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001120 "123123123123123", // size
1121 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001122 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001123 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001124 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001125 metrics::CheckResult::kUpdateAvailable,
1126 metrics::CheckReaction::kUpdating,
1127 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001128 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001129 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001130
1131 EXPECT_EQ(response.size, 123123123123123ll);
1132}
1133
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001134TEST_F(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001135 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001136 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001137 fake_system_state_.set_prefs(&prefs);
1138
Darin Petkov95508da2011-01-05 12:42:29 -08001139 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1140 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001141 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001142 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001143 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001144 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001145 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001146 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001147 metrics::CheckResult::kParsingError,
1148 metrics::CheckReaction::kUnset,
1149 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001150 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001151 &post_data));
1152 // convert post_data to string
1153 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001154 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001155 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001156 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001157 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001158 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1159 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001160 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1161 string::npos);
1162 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1163 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001164}
1165
Jay Srinivasan0a708742012-03-20 11:26:12 -07001166
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001167TEST_F(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001168 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001169 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001170 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1171 "invalid xml>",
1172 &post_data);
1173 // convert post_data to string
1174 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001175 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001176 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001177 OmahaEvent::kTypeUpdateDownloadStarted,
1178 OmahaEvent::kResultSuccess);
1179 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001180 EXPECT_EQ(post_str.find("ping"), string::npos);
1181 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001182}
1183
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001184TEST_F(OmahaRequestActionTest, FormatErrorEventOutputTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001185 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001186 TestEvent(request_params_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001187 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1188 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001189 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001190 "invalid xml>",
1191 &post_data);
1192 // convert post_data to string
1193 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001194 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001195 " <event eventtype=\"%d\" eventresult=\"%d\" "
1196 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001197 OmahaEvent::kTypeDownloadComplete,
1198 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001199 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001200 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001201 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001202}
1203
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001204TEST_F(OmahaRequestActionTest, IsEventTest) {
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001205 string http_response("doesn't matter");
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001206 // Create a copy of the OmahaRequestParams to reuse it later.
1207 OmahaRequestParams params = request_params_;
1208 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001209 OmahaRequestAction update_check_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001210 &fake_system_state_,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001211 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001212 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001213 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001214 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001215 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001216 EXPECT_FALSE(update_check_action.IsEvent());
1217
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001218 params = request_params_;
1219 fake_system_state_.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001220 OmahaRequestAction event_action(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001221 &fake_system_state_,
Darin Petkove17f86b2010-07-20 09:12:01 -07001222 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001223 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001224 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001225 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001226 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001227 EXPECT_TRUE(event_action.IsEvent());
1228}
1229
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001230TEST_F(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001231 for (int i = 0; i < 2; i++) {
1232 bool delta_okay = i == 1;
1233 const char* delta_okay_str = delta_okay ? "true" : "false";
1234 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001235 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001236 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001237 OmahaRequestParams::kOsVersion,
1238 "service_pack",
1239 "x86-generic",
1240 OmahaRequestParams::kAppId,
1241 "0.1.0.0",
1242 "en-US",
1243 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001244 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001245 "ChromeOSFirmware.1.0",
1246 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001247 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001248 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001249 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001250 "", // target_version_prefix
1251 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001252 false); // use_p2p_for_sharing
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001253 ASSERT_FALSE(TestUpdateCheck(&params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001254 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001255 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001256 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001257 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001258 metrics::CheckResult::kParsingError,
1259 metrics::CheckReaction::kUnset,
1260 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001261 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001262 &post_data));
1263 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001264 string post_str(post_data.data(), post_data.size());
1265 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1266 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001267 string::npos)
1268 << "i = " << i;
1269 }
1270}
1271
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001272TEST_F(OmahaRequestActionTest, FormatInteractiveOutputTest) {
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001273 for (int i = 0; i < 2; i++) {
1274 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001275 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001276 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001277 FakeSystemState fake_system_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001278 OmahaRequestParams params(&fake_system_state_,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001279 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001280 OmahaRequestParams::kOsVersion,
1281 "service_pack",
1282 "x86-generic",
1283 OmahaRequestParams::kAppId,
1284 "0.1.0.0",
1285 "en-US",
1286 "unittest_track",
1287 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001288 "ChromeOSFirmware.1.0",
1289 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001290 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001291 interactive,
1292 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001293 "", // target_version_prefix
1294 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001295 false); // use_p2p_for_sharing
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001296 ASSERT_FALSE(TestUpdateCheck(&params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001297 "invalid xml>",
1298 -1,
1299 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001300 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001301 metrics::CheckResult::kParsingError,
1302 metrics::CheckReaction::kUnset,
1303 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001304 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001305 &post_data));
1306 // convert post_data to string
1307 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001308 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1309 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001310 string::npos)
1311 << "i = " << i;
1312 }
1313}
1314
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001315TEST_F(OmahaRequestActionTest, OmahaEventTest) {
Darin Petkove17f86b2010-07-20 09:12:01 -07001316 OmahaEvent default_event;
1317 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1318 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001319 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001320
1321 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1322 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1323 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001324 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001325
1326 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1327 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001328 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001329 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1330 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001331 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001332}
1333
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001334void OmahaRequestActionTest::PingTest(bool ping_only) {
1335 NiceMock<PrefsMock> prefs;
1336 fake_system_state_.set_prefs(&prefs);
1337 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1338 .Times(AnyNumber());
1339 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
1340 // Add a few hours to the day difference to test no rounding, etc.
1341 int64_t five_days_ago =
1342 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1343 int64_t six_days_ago =
1344 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1345 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1346 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
1347 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1348 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1349 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1350 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1351 vector<char> post_data;
1352 ASSERT_TRUE(
1353 TestUpdateCheck(nullptr, // request_params
1354 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1355 -1,
1356 ping_only,
1357 ErrorCode::kSuccess,
1358 metrics::CheckResult::kUnset,
1359 metrics::CheckReaction::kUnset,
1360 metrics::DownloadErrorCode::kUnset,
1361 nullptr,
1362 &post_data));
1363 string post_str(&post_data[0], post_data.size());
1364 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
1365 string::npos);
1366 if (ping_only) {
1367 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
1368 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1369 } else {
1370 EXPECT_NE(post_str.find("updatecheck"), string::npos);
1371 EXPECT_NE(post_str.find("previousversion"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001372 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001373}
1374
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001375TEST_F(OmahaRequestActionTest, PingTestSendOnlyAPing) {
1376 PingTest(true /* ping_only */);
1377}
1378
1379TEST_F(OmahaRequestActionTest, PingTestSendAlsoAnUpdateCheck) {
1380 PingTest(false /* ping_only */);
1381}
1382
1383TEST_F(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001384 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001385 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001386 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1387 .Times(AnyNumber());
1388 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001389 int64_t three_days_ago =
1390 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1391 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001392 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1393 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001394 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1395 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1396 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1397 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1398 vector<char> post_data;
1399 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001400 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001401 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001402 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001403 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001404 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001405 metrics::CheckResult::kNoUpdateAvailable,
1406 metrics::CheckReaction::kUnset,
1407 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001408 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001409 &post_data));
1410 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001411 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001412 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001413}
1414
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001415TEST_F(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001416 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001417 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001418 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1419 .Times(AnyNumber());
1420 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001421 int64_t four_days_ago =
1422 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1423 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001424 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1425 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001426 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1427 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1428 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1429 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1430 vector<char> post_data;
1431 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001432 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001433 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001434 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001435 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001436 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001437 metrics::CheckResult::kNoUpdateAvailable,
1438 metrics::CheckReaction::kUnset,
1439 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001440 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001441 &post_data));
1442 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001443 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001444 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001445}
1446
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001447TEST_F(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001448 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001449 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001450 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1451 .Times(AnyNumber());
1452 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001453 int64_t one_hour_ago =
1454 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001455 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1456 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001457 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1458 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1459 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1460 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001461 // LastActivePingDay and PrefsLastRollCallPingDay are set even if we didn't
1462 // send a ping.
1463 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1464 .WillOnce(Return(true));
1465 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1466 .WillOnce(Return(true));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001467 vector<char> post_data;
1468 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001469 TestUpdateCheck(nullptr, // request_params
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001470 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001471 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001472 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001473 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001474 metrics::CheckResult::kNoUpdateAvailable,
1475 metrics::CheckReaction::kUnset,
1476 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001477 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001478 &post_data));
1479 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001480 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001481}
1482
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001483TEST_F(OmahaRequestActionTest, IgnoreEmptyPingTest) {
Thieu Leb44e9e82011-06-06 14:34:04 -07001484 // This test ensures that we ignore empty ping only requests.
1485 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001486 fake_system_state_.set_prefs(&prefs);
Thieu Leb44e9e82011-06-06 14:34:04 -07001487 int64_t now = Time::Now().ToInternalValue();
1488 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1489 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1490 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1491 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1492 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1493 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1494 vector<char> post_data;
1495 EXPECT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001496 TestUpdateCheck(nullptr, // request_params
Thieu Leb44e9e82011-06-06 14:34:04 -07001497 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1498 -1,
1499 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001500 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001501 metrics::CheckResult::kUnset,
1502 metrics::CheckReaction::kUnset,
1503 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001504 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001505 &post_data));
1506 EXPECT_EQ(post_data.size(), 0);
1507}
1508
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001509TEST_F(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001510 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001511 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001512 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1513 .Times(AnyNumber());
1514 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001515 int64_t future =
1516 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001517 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1518 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001519 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1520 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1521 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1522 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1523 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1524 .WillOnce(Return(true));
1525 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1526 .WillOnce(Return(true));
1527 vector<char> post_data;
1528 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001529 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001530 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1531 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001532 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001533 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001534 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001535 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001536 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001537 metrics::CheckResult::kNoUpdateAvailable,
1538 metrics::CheckReaction::kUnset,
1539 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001540 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001541 &post_data));
1542 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001543 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001544}
1545
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001546TEST_F(OmahaRequestActionTest, LastPingDayUpdateTest) {
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001547 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001548 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001549 // may fail if it runs for longer than 5 seconds. It shouldn't run
1550 // that long though.
1551 int64_t midnight =
1552 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1553 int64_t midnight_slack =
1554 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001555 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001556 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001557 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1558 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001559 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1560 AllOf(Ge(midnight), Le(midnight_slack))))
1561 .WillOnce(Return(true));
1562 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1563 AllOf(Ge(midnight), Le(midnight_slack))))
1564 .WillOnce(Return(true));
1565 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001566 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001567 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1568 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001569 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001570 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001571 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001572 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001573 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001574 metrics::CheckResult::kNoUpdateAvailable,
1575 metrics::CheckReaction::kUnset,
1576 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001577 nullptr,
1578 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001579}
1580
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001581TEST_F(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001582 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001583 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001584 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1585 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001586 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1587 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1588 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001589 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001590 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1591 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001592 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001593 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001594 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001595 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001596 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001597 metrics::CheckResult::kNoUpdateAvailable,
1598 metrics::CheckReaction::kUnset,
1599 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001600 nullptr,
1601 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001602}
1603
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001604TEST_F(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001605 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001606 fake_system_state_.set_prefs(&prefs);
David Zeuthen33bae492014-02-25 16:16:18 -08001607 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1608 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001609 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1610 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1611 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001612 TestUpdateCheck(nullptr, // request_params
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001613 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1614 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001615 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001616 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001617 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001618 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001619 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001620 metrics::CheckResult::kNoUpdateAvailable,
1621 metrics::CheckReaction::kUnset,
1622 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001623 nullptr,
1624 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001625}
1626
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001627TEST_F(OmahaRequestActionTest, NoUniqueIDTest) {
Darin Petkov84c763c2010-07-29 16:27:58 -07001628 vector<char> post_data;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001629 ASSERT_FALSE(TestUpdateCheck(nullptr, // request_params
Darin Petkov84c763c2010-07-29 16:27:58 -07001630 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001631 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001632 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001633 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001634 metrics::CheckResult::kParsingError,
1635 metrics::CheckReaction::kUnset,
1636 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001637 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001638 &post_data));
1639 // convert post_data to string
1640 string post_str(&post_data[0], post_data.size());
1641 EXPECT_EQ(post_str.find("machineid="), string::npos);
1642 EXPECT_EQ(post_str.find("userid="), string::npos);
1643}
1644
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001645TEST_F(OmahaRequestActionTest, NetworkFailureTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001646 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001647 const int http_error_code =
1648 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001649 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001650 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001651 "",
1652 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001653 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001654 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001655 metrics::CheckResult::kDownloadError,
1656 metrics::CheckReaction::kUnset,
1657 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001658 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001659 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001660 EXPECT_FALSE(response.update_exists);
1661}
1662
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001663TEST_F(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
Darin Petkovedc522e2010-11-05 09:35:17 -07001664 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001665 const int http_error_code =
1666 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001667 ASSERT_FALSE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001668 TestUpdateCheck(nullptr, // request_params
Darin Petkovedc522e2010-11-05 09:35:17 -07001669 "",
1670 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001671 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001672 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001673 metrics::CheckResult::kDownloadError,
1674 metrics::CheckReaction::kUnset,
1675 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001676 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001677 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001678 EXPECT_FALSE(response.update_exists);
1679}
1680
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001681TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001682 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001683 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001684 params.set_wall_clock_based_wait_enabled(true);
1685 params.set_waiting_period(TimeDelta().FromDays(1));
1686 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001687
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001688 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001689 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001690 GetUpdateResponse2(OmahaRequestParams::kAppId,
1691 "1.2.3.4", // version
1692 "http://more/info",
1693 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001694 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001695 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001696 "HASH1234=", // checksum
1697 "false", // needs admin
1698 "123", // size
1699 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001700 "7", // max days to scatter
1701 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001702 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001703 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001704 -1,
1705 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001706 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001707 metrics::CheckResult::kUpdateAvailable,
1708 metrics::CheckReaction::kDeferring,
1709 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001710 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001711 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001712
Ben Chan9abb7632014-08-07 00:10:53 -07001713 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001714 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001715 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001716 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001717
1718 // Verify if we are interactive check we don't defer.
1719 params.set_interactive(true);
1720 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001721 TestUpdateCheck(&params,
Chris Sosa968d0572013-08-23 14:46:02 -07001722 GetUpdateResponse2(OmahaRequestParams::kAppId,
1723 "1.2.3.4", // version
1724 "http://more/info",
1725 "true", // prompt
1726 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001727 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001728 "HASH1234=", // checksum
1729 "false", // needs admin
1730 "123", // size
1731 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001732 "7", // max days to scatter
1733 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001734 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001735 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001736 -1,
1737 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001738 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001739 metrics::CheckResult::kUpdateAvailable,
1740 metrics::CheckReaction::kUpdating,
1741 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001742 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001743 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001744 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001745}
1746
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001747TEST_F(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001748 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001749 OmahaRequestParams params = request_params_;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001750 params.set_wall_clock_based_wait_enabled(true);
1751 params.set_waiting_period(TimeDelta().FromDays(1));
1752 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001753
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001754 // Set the timestamp to a very old value such that it exceeds the
1755 // waiting period set above.
1756 Time t1;
1757 Time::FromString("1/1/2012", &t1);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001758 ASSERT_TRUE(fake_prefs_.SetInt64(
1759 kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001760 ASSERT_TRUE(TestUpdateCheck(
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001761 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001762 GetUpdateResponse2(OmahaRequestParams::kAppId,
1763 "1.2.3.4", // version
1764 "http://more/info",
1765 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001766 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001767 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001768 "HASH1234=", // checksum
1769 "false", // needs admin
1770 "123", // size
1771 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001772 "7", // max days to scatter
1773 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001774 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001775 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001776 -1,
1777 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001778 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001779 metrics::CheckResult::kUpdateAvailable,
1780 metrics::CheckReaction::kUpdating,
1781 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001782 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001783 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001784
1785 EXPECT_TRUE(response.update_exists);
1786
1787 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001788 int64_t timestamp = 0;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001789 ASSERT_TRUE(fake_prefs_.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001790 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1791}
1792
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001793TEST_F(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001794 // Create a uniquely named test directory.
1795 string test_dir;
1796 ASSERT_TRUE(utils::MakeTempDirectory(
1797 "omaha_request_action-test-XXXXXX", &test_dir));
1798
1799 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1800 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001801 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001802 vector<char> post_data;
1803 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001804 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001805 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001806 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001807 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1808 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1809 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1810 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001811 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001812 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1813 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001814 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001815 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001816 params.SetLockDown(false);
1817 params.Init("1.2.3.4", "", 0);
1818 EXPECT_EQ("canary-channel", params.current_channel());
1819 EXPECT_EQ("stable-channel", params.target_channel());
1820 EXPECT_TRUE(params.to_more_stable_channel());
1821 EXPECT_TRUE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001822 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001823 "invalid xml>",
1824 -1,
1825 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001826 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001827 metrics::CheckResult::kParsingError,
1828 metrics::CheckReaction::kUnset,
1829 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001830 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001831 &post_data));
1832 // convert post_data to string
1833 string post_str(&post_data[0], post_data.size());
1834 EXPECT_NE(string::npos, post_str.find(
1835 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1836 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1837 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001838
1839 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001840}
1841
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001842TEST_F(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001843 // Create a uniquely named test directory.
1844 string test_dir;
1845 ASSERT_TRUE(utils::MakeTempDirectory(
1846 "omaha_request_action-test-XXXXXX", &test_dir));
1847
1848 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1849 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001850 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001851 vector<char> post_data;
1852 NiceMock<PrefsMock> prefs;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001853 fake_system_state_.set_prefs(&prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001854 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001855 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001856 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1857 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1858 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1859 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001860 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001861 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001862 OmahaRequestParams params = request_params_;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001863 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001864 params.SetLockDown(false);
1865 params.Init("5.6.7.8", "", 0);
1866 EXPECT_EQ("stable-channel", params.current_channel());
1867 EXPECT_EQ("canary-channel", params.target_channel());
1868 EXPECT_FALSE(params.to_more_stable_channel());
1869 EXPECT_FALSE(params.is_powerwash_allowed());
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001870 ASSERT_FALSE(TestUpdateCheck(&params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001871 "invalid xml>",
1872 -1,
1873 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001874 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001875 metrics::CheckResult::kParsingError,
1876 metrics::CheckReaction::kUnset,
1877 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001878 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001879 &post_data));
1880 // convert post_data to string
1881 string post_str(&post_data[0], post_data.size());
1882 EXPECT_NE(string::npos, post_str.find(
1883 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1884 "version=\"5.6.7.8\" "
1885 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001886 EXPECT_EQ(string::npos, post_str.find("from_version"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001887}
1888
Alex Deymoebbe7ef2014-10-30 13:02:49 -07001889// Checks that the initial ping with a=-1 r=-1 is not send when the device
1890// was powerwashed.
1891TEST_F(OmahaRequestActionTest, PingWhenPowerwashed) {
1892 fake_prefs_.SetString(kPrefsPreviousVersion, "");
1893
1894 // Flag that the device was powerwashed in the past.
1895 fake_system_state_.fake_hardware()->SetPowerwashCount(1);
1896
1897 vector<char> post_data;
1898 ASSERT_TRUE(
1899 TestUpdateCheck(nullptr, // request_params
1900 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1901 -1,
1902 false, // ping_only
1903 ErrorCode::kSuccess,
1904 metrics::CheckResult::kNoUpdateAvailable,
1905 metrics::CheckReaction::kUnset,
1906 metrics::DownloadErrorCode::kUnset,
1907 nullptr,
1908 &post_data));
1909 // We shouldn't send a ping in this case since powerwash > 0.
1910 string post_str(&post_data[0], post_data.size());
1911 EXPECT_EQ(string::npos, post_str.find("<ping"));
1912}
1913
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001914void OmahaRequestActionTest::P2PTest(
1915 bool initial_allow_p2p_for_downloading,
1916 bool initial_allow_p2p_for_sharing,
1917 bool omaha_disable_p2p_for_downloading,
1918 bool omaha_disable_p2p_for_sharing,
1919 bool payload_state_allow_p2p_attempt,
1920 bool expect_p2p_client_lookup,
1921 const string& p2p_client_result_url,
1922 bool expected_allow_p2p_for_downloading,
1923 bool expected_allow_p2p_for_sharing,
1924 const string& expected_p2p_url) {
David Zeuthen8f191b22013-08-06 12:27:50 -07001925 OmahaResponse response;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001926 OmahaRequestParams request_params = request_params_;
David Zeuthen8f191b22013-08-06 12:27:50 -07001927 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
1928 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
1929
1930 MockPayloadState mock_payload_state;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001931 fake_system_state_.set_payload_state(&mock_payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -07001932 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
1933 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
1934 MockP2PManager mock_p2p_manager;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001935 fake_system_state_.set_p2p_manager(&mock_p2p_manager);
David Zeuthen8f191b22013-08-06 12:27:50 -07001936 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
1937
David Zeuthen4cc5ed22014-01-15 12:35:03 -08001938 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
1939 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07001940 .Times(expect_p2p_client_lookup ? 1 : 0);
1941
1942 ASSERT_TRUE(
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001943 TestUpdateCheck(&request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07001944 GetUpdateResponse2(OmahaRequestParams::kAppId,
1945 "1.2.3.4", // version
1946 "http://more/info",
1947 "true", // prompt
1948 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001949 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07001950 "HASH1234=", // checksum
1951 "false", // needs admin
1952 "123", // size
1953 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001954 "7", // max days to scatter
1955 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001956 omaha_disable_p2p_for_downloading,
1957 omaha_disable_p2p_for_sharing),
1958 -1,
1959 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001960 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001961 metrics::CheckResult::kUpdateAvailable,
1962 metrics::CheckReaction::kUpdating,
1963 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07001964 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001965 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07001966 EXPECT_TRUE(response.update_exists);
1967
1968 EXPECT_EQ(response.disable_p2p_for_downloading,
1969 omaha_disable_p2p_for_downloading);
1970 EXPECT_EQ(response.disable_p2p_for_sharing,
1971 omaha_disable_p2p_for_sharing);
1972
1973 EXPECT_EQ(request_params.use_p2p_for_downloading(),
1974 expected_allow_p2p_for_downloading);
1975
1976 EXPECT_EQ(request_params.use_p2p_for_sharing(),
1977 expected_allow_p2p_for_sharing);
1978
1979 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
1980}
1981
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001982TEST_F(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001983 P2PTest(true, // initial_allow_p2p_for_downloading
1984 true, // initial_allow_p2p_for_sharing
1985 false, // omaha_disable_p2p_for_downloading
1986 false, // omaha_disable_p2p_for_sharing
1987 true, // payload_state_allow_p2p_attempt
1988 true, // expect_p2p_client_lookup
1989 "http://1.3.5.7/p2p", // p2p_client_result_url
1990 true, // expected_allow_p2p_for_downloading
1991 true, // expected_allow_p2p_for_sharing
1992 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07001993}
1994
Alex Deymoe1e3afe2014-10-30 13:02:49 -07001995TEST_F(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001996 P2PTest(true, // initial_allow_p2p_for_downloading
1997 true, // initial_allow_p2p_for_sharing
1998 false, // omaha_disable_p2p_for_downloading
1999 false, // omaha_disable_p2p_for_sharing
2000 true, // payload_state_allow_p2p_attempt
2001 true, // expect_p2p_client_lookup
2002 "", // p2p_client_result_url
2003 false, // expected_allow_p2p_for_downloading
2004 true, // expected_allow_p2p_for_sharing
2005 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002006}
2007
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002008TEST_F(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002009 P2PTest(false, // initial_allow_p2p_for_downloading
2010 true, // initial_allow_p2p_for_sharing
2011 false, // omaha_disable_p2p_for_downloading
2012 false, // omaha_disable_p2p_for_sharing
2013 true, // payload_state_allow_p2p_attempt
2014 false, // expect_p2p_client_lookup
2015 "unset", // p2p_client_result_url
2016 false, // expected_allow_p2p_for_downloading
2017 true, // expected_allow_p2p_for_sharing
2018 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002019}
2020
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002021TEST_F(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002022 P2PTest(true, // initial_allow_p2p_for_downloading
2023 true, // initial_allow_p2p_for_sharing
2024 true, // omaha_disable_p2p_for_downloading
2025 false, // omaha_disable_p2p_for_sharing
2026 true, // payload_state_allow_p2p_attempt
2027 false, // expect_p2p_client_lookup
2028 "unset", // p2p_client_result_url
2029 false, // expected_allow_p2p_for_downloading
2030 true, // expected_allow_p2p_for_sharing
2031 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002032}
2033
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002034TEST_F(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002035 P2PTest(true, // initial_allow_p2p_for_downloading
2036 true, // initial_allow_p2p_for_sharing
2037 false, // omaha_disable_p2p_for_downloading
2038 true, // omaha_disable_p2p_for_sharing
2039 true, // payload_state_allow_p2p_attempt
2040 true, // expect_p2p_client_lookup
2041 "http://1.3.5.7/p2p", // p2p_client_result_url
2042 true, // expected_allow_p2p_for_downloading
2043 false, // expected_allow_p2p_for_sharing
2044 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002045}
2046
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002047TEST_F(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002048 P2PTest(true, // initial_allow_p2p_for_downloading
2049 true, // initial_allow_p2p_for_sharing
2050 true, // omaha_disable_p2p_for_downloading
2051 true, // omaha_disable_p2p_for_sharing
2052 true, // payload_state_allow_p2p_attempt
2053 false, // expect_p2p_client_lookup
2054 "unset", // p2p_client_result_url
2055 false, // expected_allow_p2p_for_downloading
2056 false, // expected_allow_p2p_for_sharing
2057 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002058}
2059
Alex Deymof329b932014-10-30 01:37:48 -07002060bool OmahaRequestActionTest::InstallDateParseHelper(const string &elapsed_days,
2061 OmahaResponse *response) {
David Zeuthen639aa362014-02-03 16:23:44 -08002062 return
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002063 TestUpdateCheck(nullptr, // request_params
David Zeuthen639aa362014-02-03 16:23:44 -08002064 GetUpdateResponse2(OmahaRequestParams::kAppId,
2065 "1.2.3.4", // version
2066 "http://more/info",
2067 "true", // prompt
2068 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002069 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002070 "HASH1234=", // checksum
2071 "false", // needs admin
2072 "123", // size
2073 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002074 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002075 elapsed_days,
2076 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002077 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002078 -1,
2079 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002080 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002081 metrics::CheckResult::kUpdateAvailable,
2082 metrics::CheckReaction::kUpdating,
2083 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002084 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002085 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002086}
2087
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002088TEST_F(OmahaRequestActionTest, ParseInstallDateFromResponse) {
David Zeuthen639aa362014-02-03 16:23:44 -08002089 OmahaResponse response;
David Zeuthen639aa362014-02-03 16:23:44 -08002090
2091 // Check that we parse elapsed_days in the Omaha Response correctly.
2092 // and that the kPrefsInstallDateDays value is written to.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002093 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2094 EXPECT_TRUE(InstallDateParseHelper("42", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002095 EXPECT_TRUE(response.update_exists);
2096 EXPECT_EQ(42, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002097 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002098 int64_t prefs_days;
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002099 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002100 EXPECT_EQ(prefs_days, 42);
2101
2102 // If there already is a value set, we shouldn't do anything.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002103 EXPECT_TRUE(InstallDateParseHelper("7", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002104 EXPECT_TRUE(response.update_exists);
2105 EXPECT_EQ(7, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002106 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002107 EXPECT_EQ(prefs_days, 42);
2108
2109 // Note that elapsed_days is not necessarily divisible by 7 so check
2110 // that we round down correctly when populating kPrefsInstallDateDays.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002111 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2112 EXPECT_TRUE(InstallDateParseHelper("23", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002113 EXPECT_TRUE(response.update_exists);
2114 EXPECT_EQ(23, response.install_date_days);
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002115 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
David Zeuthen639aa362014-02-03 16:23:44 -08002116 EXPECT_EQ(prefs_days, 21);
2117
2118 // Check that we correctly handle elapsed_days not being included in
2119 // the Omaha Response.
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002120 EXPECT_TRUE(InstallDateParseHelper("", &response));
David Zeuthen639aa362014-02-03 16:23:44 -08002121 EXPECT_TRUE(response.update_exists);
2122 EXPECT_EQ(-1, response.install_date_days);
David Zeuthen639aa362014-02-03 16:23:44 -08002123}
2124
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002125// If there is no prefs and OOBE is not complete, we should not
2126// report anything to Omaha.
2127TEST_F(OmahaRequestActionTest, GetInstallDateWhenNoPrefsNorOOBE) {
2128 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2129 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2130}
David Zeuthen639aa362014-02-03 16:23:44 -08002131
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002132// If OOBE is complete and happened on a valid date (e.g. after Jan
2133// 1 2007 0:00 PST), that date should be used and written to
2134// prefs. However, first try with an invalid date and check we do
2135// nothing.
2136TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithInvalidDate) {
2137 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
2138 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2139 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), -1);
2140 EXPECT_FALSE(fake_prefs_.Exists(kPrefsInstallDateDays));
2141}
David Zeuthen639aa362014-02-03 16:23:44 -08002142
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002143// Then check with a valid date. The date Jan 20, 2007 0:00 PST
2144// should yield an InstallDate of 14.
2145TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedWithValidDate) {
2146 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
2147 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2148 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
2149 EXPECT_TRUE(fake_prefs_.Exists(kPrefsInstallDateDays));
David Zeuthen639aa362014-02-03 16:23:44 -08002150
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002151 int64_t prefs_days;
2152 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2153 EXPECT_EQ(prefs_days, 14);
2154}
David Zeuthen639aa362014-02-03 16:23:44 -08002155
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002156// Now that we have a valid date in prefs, check that we keep using
2157// that even if OOBE date reports something else. The date Jan 30,
2158// 2007 0:00 PST should yield an InstallDate of 28... but since
2159// there's a prefs file, we should still get 14.
2160TEST_F(OmahaRequestActionTest, GetInstallDateWhenOOBECompletedDateChanges) {
2161 // Set a valid date in the prefs first.
2162 EXPECT_TRUE(fake_prefs_.SetInt64(kPrefsInstallDateDays, 14));
David Zeuthen639aa362014-02-03 16:23:44 -08002163
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002164 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
2165 fake_system_state_.fake_hardware()->SetIsOOBEComplete(oobe_date);
2166 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002167
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002168 int64_t prefs_days;
2169 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2170 EXPECT_EQ(prefs_days, 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002171
Alex Deymoe1e3afe2014-10-30 13:02:49 -07002172 // If we delete the prefs file, we should get 28 days.
2173 EXPECT_TRUE(fake_prefs_.Delete(kPrefsInstallDateDays));
2174 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state_), 28);
2175 EXPECT_TRUE(fake_prefs_.GetInt64(kPrefsInstallDateDays, &prefs_days));
2176 EXPECT_EQ(prefs_days, 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002177}
2178
Darin Petkov6a5b3222010-07-13 14:55:28 -07002179} // namespace chromeos_update_engine