blob: 572721d93e8242ff75688a09abf9fd1c610852b5 [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>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -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"
Chris Sosa77f79e82014-06-02 18:16:24 -070019#include "update_engine/mock_connection_manager.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070020#include "update_engine/mock_http_fetcher.h"
21#include "update_engine/omaha_hash_calculator.h"
22#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070023#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070024#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070025#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070026#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070027
Darin Petkov1cbd78f2010-07-29 12:38:34 -070028using base::Time;
29using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070030using std::string;
31using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070032using testing::_;
33using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070034using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070035using testing::Ge;
36using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080037using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070038using testing::Return;
39using testing::SetArgumentPointee;
David Zeuthen33bae492014-02-25 16:16:18 -080040using testing::AnyNumber;
Darin Petkov6a5b3222010-07-13 14:55:28 -070041
42namespace chromeos_update_engine {
43
Jay Srinivasanae4697c2013-03-18 17:08:08 -070044class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070045
46namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070047
Gilad Arnold5bb4c902014-04-10 12:32:13 -070048FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070049OmahaRequestParams kDefaultTestParams(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070050 &fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070051 OmahaRequestParams::kOsPlatform,
52 OmahaRequestParams::kOsVersion,
53 "service_pack",
54 "x86-generic",
55 OmahaRequestParams::kAppId,
56 "0.1.0.0",
57 "en-US",
58 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070059 "OEM MODEL 09235 7471",
Chris Sosac1972482013-04-30 22:31:10 -070060 "ChromeOSFirmware.1.0",
61 "0X0A1",
Alex Vakulenkod2779df2014-06-16 13:19:00 -070062 false, // delta okay
63 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070064 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -070065 false, // update_disabled
66 "", // target_version_prefix
67 false, // use_p2p_for_downloading
68 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -070069
Darin Petkov6a5b3222010-07-13 14:55:28 -070070string GetNoUpdateResponse(const string& app_id) {
71 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070072 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
73 "<daystart elapsed_seconds=\"100\"/>"
74 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
75 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070076}
77
David Zeuthenf3e28012014-08-26 18:23:52 -040078string GetNoUpdateResponseWithEntity(const string& app_id) {
79 return string(
80 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
81 "<!DOCTYPE response ["
82 "<!ENTITY CrOS \"ChromeOS\">"
83 "]>"
84 "<response protocol=\"3.0\">"
85 "<daystart elapsed_seconds=\"100\"/>"
86 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
87 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
88}
89
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070090string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -070091 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070092 const string& more_info_url,
93 const string& prompt,
94 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070095 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070096 const string& hash,
97 const string& needsadmin,
98 const string& size,
99 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700100 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800101 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700102 bool disable_p2p_for_downloading,
103 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700104 string response =
105 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
106 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800107 "<daystart elapsed_seconds=\"100\"" +
108 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
109 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700110 "<app appid=\"" + app_id + "\" status=\"ok\">"
111 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
112 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700113 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700114 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
115 "size=\"" + size + "\"/></packages>"
116 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700117 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700118 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
119 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800120 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700121 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700122 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700123 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700124 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700125 (disable_p2p_for_downloading ?
126 "DisableP2PForDownloading=\"true\" " : "") +
127 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700128 "/></actions></manifest></updatecheck></app></response>";
129 LOG(INFO) << "Response = " << response;
130 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700131}
132
Darin Petkov6a5b3222010-07-13 14:55:28 -0700133string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700134 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700135 const string& more_info_url,
136 const string& prompt,
137 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700138 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700139 const string& hash,
140 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700141 const string& size,
142 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700143 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700144 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700145 more_info_url,
146 prompt,
147 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700148 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700149 hash,
150 needsadmin,
151 size,
152 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700153 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700154 "42", // elapsed_days
155 false, // disable_p2p_for_downloading
156 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700157}
158
159class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
160 public:
161 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700162 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700163 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700164 virtual ~OmahaRequestActionTestProcessorDelegate() {
165 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700166 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700167 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700168 ASSERT_TRUE(loop_);
169 g_main_loop_quit(loop_);
170 }
171
172 virtual void ActionCompleted(ActionProcessor* processor,
173 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700174 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700175 // make sure actions always succeed
176 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700177 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700178 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700179 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700180 }
181 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700182 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700183};
184
185gboolean StartProcessorInRunLoop(gpointer data) {
186 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
187 processor->StartProcessing();
188 return FALSE;
189}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700190} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700191
192class OutputObjectCollectorAction;
193
194template<>
195class ActionTraits<OutputObjectCollectorAction> {
196 public:
197 // Does not take an object for input
198 typedef OmahaResponse InputObjectType;
199 // On success, puts the output path on output
200 typedef NoneType OutputObjectType;
201};
202
203class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
204 public:
205 OutputObjectCollectorAction() : has_input_object_(false) {}
206 void PerformAction() {
207 // copy input object
208 has_input_object_ = HasInputObject();
209 if (has_input_object_)
210 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700211 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700212 }
213 // Should never be called
214 void TerminateProcessing() {
215 CHECK(false);
216 }
217 // Debugging/logging
218 static std::string StaticType() {
219 return "OutputObjectCollectorAction";
220 }
221 std::string Type() const { return StaticType(); }
222 bool has_input_object_;
223 OmahaResponse omaha_response_;
224};
225
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700226// Returns true iff an output response was obtained from the
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700227// OmahaRequestAction. |prefs| may be null, in which case a local PrefsMock
228// is used. |payload_state| may be null, in which case a local mock is used.
229// |p2p_manager| may be null, in which case a local mock is used.
230// |connection_manager| may be null, in which case a local mock is used.
231// out_response may be null. If |fail_http_response_code| is non-negative,
Darin Petkov265f2902011-05-09 15:17:40 -0700232// the transfer will fail with that code. |ping_only| is passed through to the
233// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
234// post-data received by the mock HttpFetcher is returned.
David Zeuthen33bae492014-02-25 16:16:18 -0800235//
236// The |expected_check_result|, |expected_check_reaction| and
237// |expected_error_code| parameters are for checking expectations
238// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
239// UMA statistics. Use the appropriate ::kUnset value to specify that
240// the given metric should not be reported.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700241bool TestUpdateCheck(PrefsInterface* prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -0700242 PayloadStateInterface *payload_state,
243 P2PManager *p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -0700244 ConnectionManager *connection_manager,
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700245 OmahaRequestParams* params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700246 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700247 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700248 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700249 ErrorCode expected_code,
David Zeuthen33bae492014-02-25 16:16:18 -0800250 metrics::CheckResult expected_check_result,
251 metrics::CheckReaction expected_check_reaction,
252 metrics::DownloadErrorCode expected_download_error_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700253 OmahaResponse* out_response,
254 vector<char>* out_post_data) {
255 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
256 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800257 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700258 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700259 if (fail_http_response_code >= 0) {
260 fetcher->FailTransfer(fail_http_response_code);
261 }
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700262 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800263 if (prefs)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700264 fake_system_state.set_prefs(prefs);
David Zeuthen8f191b22013-08-06 12:27:50 -0700265 if (payload_state)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700266 fake_system_state.set_payload_state(payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -0700267 if (p2p_manager)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700268 fake_system_state.set_p2p_manager(p2p_manager);
Chris Sosa77f79e82014-06-02 18:16:24 -0700269 if (connection_manager)
270 fake_system_state.set_connection_manager(connection_manager);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700271 fake_system_state.set_request_params(params);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700272 OmahaRequestAction action(&fake_system_state,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700273 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700274 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700275 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700276 OmahaRequestActionTestProcessorDelegate delegate;
277 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700278 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700279
Darin Petkov6a5b3222010-07-13 14:55:28 -0700280 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700281 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700282 processor.EnqueueAction(&action);
283
284 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700285 BondActions(&action, &collector_action);
286 processor.EnqueueAction(&collector_action);
287
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700288 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800289 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700290 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800291 SendEnumToUMA(metrics::kMetricCheckResult,
292 static_cast<int>(expected_check_result),
293 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
294 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700295 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800296 SendEnumToUMA(metrics::kMetricCheckReaction,
297 static_cast<int>(expected_check_reaction),
298 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
299 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700300 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700301 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
302 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800303 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
304 ? 0 : 1);
305
Darin Petkov6a5b3222010-07-13 14:55:28 -0700306 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
307 g_main_loop_run(loop);
308 g_main_loop_unref(loop);
309 if (collector_action.has_input_object_ && out_response)
310 *out_response = collector_action.omaha_response_;
311 if (out_post_data)
312 *out_post_data = fetcher->post_data();
313 return collector_action.has_input_object_;
314}
315
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700316// Tests Event requests -- they should always succeed. |out_post_data|
317// may be null; if non-null, the post-data received by the mock
318// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700319void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700320 OmahaEvent* event,
321 const string& http_response,
322 vector<char>* out_post_data) {
323 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
324 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800325 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700326 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700327 FakeSystemState fake_system_state;
328 fake_system_state.set_request_params(&params);
329 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700330 OmahaRequestActionTestProcessorDelegate delegate;
331 delegate.loop_ = loop;
332 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700333 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700334 processor.EnqueueAction(&action);
335
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700336 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
337 g_main_loop_run(loop);
338 g_main_loop_unref(loop);
339 if (out_post_data)
340 *out_post_data = fetcher->post_data();
341}
342
David Zeuthenf3e28012014-08-26 18:23:52 -0400343TEST(OmahaRequestActionTest, RejectEntities) {
344 OmahaResponse response;
345 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700346 TestUpdateCheck(nullptr, // prefs
347 nullptr, // payload_state
348 nullptr, // p2p_manager
349 nullptr, // connection_manager
David Zeuthenf3e28012014-08-26 18:23:52 -0400350 &kDefaultTestParams,
351 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
352 -1,
353 false, // ping_only
354 ErrorCode::kOmahaRequestXMLHasEntityDecl,
355 metrics::CheckResult::kParsingError,
356 metrics::CheckReaction::kUnset,
357 metrics::DownloadErrorCode::kUnset,
358 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700359 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400360 EXPECT_FALSE(response.update_exists);
361}
362
Darin Petkov6a5b3222010-07-13 14:55:28 -0700363TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700364 OmahaResponse response;
365 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700366 TestUpdateCheck(nullptr, // prefs
367 nullptr, // payload_state
368 nullptr, // p2p_manager
369 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700370 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700371 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700372 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700373 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700374 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800375 metrics::CheckResult::kNoUpdateAvailable,
376 metrics::CheckReaction::kUnset,
377 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700378 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700379 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700380 EXPECT_FALSE(response.update_exists);
381}
382
383TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700384 OmahaResponse response;
385 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700386 TestUpdateCheck(nullptr, // prefs
387 nullptr, // payload_state
388 nullptr, // p2p_manager
389 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700390 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700391 GetUpdateResponse(OmahaRequestParams::kAppId,
392 "1.2.3.4", // version
393 "http://more/info",
394 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700395 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700396 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700397 "HASH1234=", // checksum
398 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700399 "123", // size
400 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700401 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700402 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700403 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800404 metrics::CheckResult::kUpdateAvailable,
405 metrics::CheckReaction::kUpdating,
406 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700407 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700408 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700409 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700410 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700411 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800412 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700413 EXPECT_EQ("http://more/info", response.more_info_url);
414 EXPECT_EQ("HASH1234=", response.hash);
415 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700416 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700417 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700418}
419
Jay Srinivasan0a708742012-03-20 11:26:12 -0700420TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
421 OmahaResponse response;
422 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700423 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700424 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700425 TestUpdateCheck(nullptr, // prefs
426 nullptr, // payload_state
427 nullptr, // p2p_manager
428 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700429 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700430 GetUpdateResponse(OmahaRequestParams::kAppId,
431 "1.2.3.4", // version
432 "http://more/info",
433 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700434 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700435 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700436 "HASH1234=", // checksum
437 "false", // needs admin
438 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700439 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700440 -1,
441 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700442 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800443 metrics::CheckResult::kUpdateAvailable,
444 metrics::CheckReaction::kIgnored,
445 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700446 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700447 nullptr));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700448 EXPECT_FALSE(response.update_exists);
449}
450
Chris Sosa77f79e82014-06-02 18:16:24 -0700451TEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
452 OmahaResponse response;
453 // Set up a connection manager that doesn't allow a valid update over
454 // the current ethernet connection.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700455 MockConnectionManager mock_cm(nullptr);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700456 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700457 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
458 SetArgumentPointee<2>(NetworkTethering::kUnknown),
459 Return(true)));
460 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
461 .WillRepeatedly(Return(false));
462 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
463 .WillRepeatedly(Return(shill::kTypeEthernet));
464
465 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700466 TestUpdateCheck(nullptr, // prefs
467 nullptr, // payload_state
468 nullptr, // p2p_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700469 &mock_cm, // connection_manager
470 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700471 GetUpdateResponse(OmahaRequestParams::kAppId,
472 "1.2.3.4", // version
473 "http://more/info",
474 "true", // prompt
475 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700476 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700477 "HASH1234=", // checksum
478 "false", // needs admin
479 "123", // size
480 ""), // deadline
481 -1,
482 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700483 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700484 metrics::CheckResult::kUpdateAvailable,
485 metrics::CheckReaction::kIgnored,
486 metrics::DownloadErrorCode::kUnset,
487 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700488 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700489 EXPECT_FALSE(response.update_exists);
490}
491
492TEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
493 string rollback_version = "1234.0.0";
494 OmahaResponse response;
495
496 MockPayloadState mock_payload_state;
497 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
498 .WillRepeatedly(Return(rollback_version));
499
500 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700501 TestUpdateCheck(nullptr, // prefs
Chris Sosa77f79e82014-06-02 18:16:24 -0700502 &mock_payload_state, // payload_state
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700503 nullptr, // p2p_manager
504 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700505 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700506 GetUpdateResponse(OmahaRequestParams::kAppId,
507 rollback_version, // version
508 "http://more/info",
509 "true", // prompt
510 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700511 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700512 "HASH1234=", // checksum
513 "false", // needs admin
514 "123", // size
515 ""), // deadline
516 -1,
517 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700518 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700519 metrics::CheckResult::kUpdateAvailable,
520 metrics::CheckReaction::kIgnored,
521 metrics::DownloadErrorCode::kUnset,
522 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700523 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700524 EXPECT_FALSE(response.update_exists);
525}
526
Jay Srinivasan0a708742012-03-20 11:26:12 -0700527TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
528 OmahaResponse response;
529 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700530 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700531 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700532 TestUpdateCheck(nullptr, // prefs
533 nullptr, // payload_state
534 nullptr, // p2p_manager
535 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700536 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700537 GetNoUpdateResponse(OmahaRequestParams::kAppId),
538 -1,
539 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700540 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800541 metrics::CheckResult::kNoUpdateAvailable,
542 metrics::CheckReaction::kUnset,
543 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700544 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700545 nullptr));
Jay Srinivasan0a708742012-03-20 11:26:12 -0700546 EXPECT_FALSE(response.update_exists);
547}
548
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700549TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
550 OmahaResponse response;
551 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700552 params.set_wall_clock_based_wait_enabled(true);
553 params.set_update_check_count_wait_enabled(false);
554 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700555
556 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800557 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700558 &prefs_dir));
559 ScopedDirRemover temp_dir_remover(prefs_dir);
560
561 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700562 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700563 << "Failed to initialize preferences.";
564
565 ASSERT_FALSE(
566 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700567 nullptr, // payload_state
568 nullptr, // p2p_manager
569 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700570 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700571 GetUpdateResponse2(OmahaRequestParams::kAppId,
572 "1.2.3.4", // version
573 "http://more/info",
574 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700575 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700576 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700577 "HASH1234=", // checksum
578 "false", // needs admin
579 "123", // size
580 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700581 "7", // max days to scatter
582 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700583 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700584 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700585 -1,
586 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700587 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800588 metrics::CheckResult::kUpdateAvailable,
589 metrics::CheckReaction::kDeferring,
590 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700591 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700592 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700593 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700594
595 // Verify if we are interactive check we don't defer.
596 params.set_interactive(true);
597 ASSERT_TRUE(
598 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700599 nullptr, // payload_state
600 nullptr, // p2p_manager
601 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700602 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700603 GetUpdateResponse2(OmahaRequestParams::kAppId,
604 "1.2.3.4", // version
605 "http://more/info",
606 "true", // prompt
607 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700608 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700609 "HASH1234=", // checksum
610 "false", // needs admin
611 "123", // size
612 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700613 "7", // max days to scatter
614 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700615 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700616 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700617 -1,
618 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700619 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800620 metrics::CheckResult::kUpdateAvailable,
621 metrics::CheckReaction::kUpdating,
622 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700623 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700624 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700625 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700626}
627
628TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
629 OmahaResponse response;
630 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700631 params.set_wall_clock_based_wait_enabled(false);
632 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700633
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700634 params.set_update_check_count_wait_enabled(true);
635 params.set_min_update_checks_needed(1);
636 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700637
638 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800639 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700640 &prefs_dir));
641 ScopedDirRemover temp_dir_remover(prefs_dir);
642
643 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700644 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700645 << "Failed to initialize preferences.";
646
647 ASSERT_TRUE(
648 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700649 nullptr, // payload_state
650 nullptr, // p2p_manager
651 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700652 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700653 GetUpdateResponse2(OmahaRequestParams::kAppId,
654 "1.2.3.4", // version
655 "http://more/info",
656 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700657 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700658 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700659 "HASH1234=", // checksum
660 "false", // needs admin
661 "123", // size
662 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700663 "7", // max days to scatter
664 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700665 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700666 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700667 -1,
668 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700669 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800670 metrics::CheckResult::kUpdateAvailable,
671 metrics::CheckReaction::kUpdating,
672 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700673 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700674 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700675 EXPECT_TRUE(response.update_exists);
676}
677
678TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
679 OmahaResponse response;
680 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700681 params.set_wall_clock_based_wait_enabled(true);
682 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700683
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700684 params.set_update_check_count_wait_enabled(true);
685 params.set_min_update_checks_needed(1);
686 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700687
688 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800689 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700690 &prefs_dir));
691 ScopedDirRemover temp_dir_remover(prefs_dir);
692
693 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700694 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700695 << "Failed to initialize preferences.";
696
697 ASSERT_TRUE(
698 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700699 nullptr, // payload_state
700 nullptr, // p2p_manager
701 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700702 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700703 GetUpdateResponse2(OmahaRequestParams::kAppId,
704 "1.2.3.4", // version
705 "http://more/info",
706 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700707 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700708 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700709 "HASH1234=", // checksum
710 "false", // needs admin
711 "123", // size
712 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700713 "0", // max days to scatter
714 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700715 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700716 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700717 -1,
718 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700719 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800720 metrics::CheckResult::kUpdateAvailable,
721 metrics::CheckReaction::kUpdating,
722 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700723 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700724 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700725 EXPECT_TRUE(response.update_exists);
726}
727
728
729TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
730 OmahaResponse response;
731 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700732 params.set_wall_clock_based_wait_enabled(true);
733 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700734
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700735 params.set_update_check_count_wait_enabled(true);
736 params.set_min_update_checks_needed(0);
737 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700738
739 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800740 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700741 &prefs_dir));
742 ScopedDirRemover temp_dir_remover(prefs_dir);
743
744 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700745 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700746 << "Failed to initialize preferences.";
747
748 ASSERT_TRUE(TestUpdateCheck(
749 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700750 nullptr, // payload_state
751 nullptr, // p2p_manager
752 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700753 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700754 GetUpdateResponse2(OmahaRequestParams::kAppId,
755 "1.2.3.4", // version
756 "http://more/info",
757 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700758 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700759 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700760 "HASH1234=", // checksum
761 "false", // needs admin
762 "123", // size
763 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700764 "7", // max days to scatter
765 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700766 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700767 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768 -1,
769 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700770 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800771 metrics::CheckResult::kUpdateAvailable,
772 metrics::CheckReaction::kUpdating,
773 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700774 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700775 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700776
Ben Chan9abb7632014-08-07 00:10:53 -0700777 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700778 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700779 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700780 EXPECT_TRUE(response.update_exists);
781}
782
783TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
784 OmahaResponse response;
785 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700786 params.set_wall_clock_based_wait_enabled(true);
787 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700788
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700789 params.set_update_check_count_wait_enabled(true);
790 params.set_min_update_checks_needed(1);
791 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700792
793 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800794 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700795 &prefs_dir));
796 ScopedDirRemover temp_dir_remover(prefs_dir);
797
798 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700799 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700800 << "Failed to initialize preferences.";
801
802 ASSERT_FALSE(TestUpdateCheck(
803 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700804 nullptr, // payload_state
805 nullptr, // p2p_manager
806 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700807 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700808 GetUpdateResponse2(OmahaRequestParams::kAppId,
809 "1.2.3.4", // version
810 "http://more/info",
811 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700812 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700813 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700814 "HASH1234=", // checksum
815 "false", // needs admin
816 "123", // size
817 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700818 "7", // max days to scatter
819 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700820 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700821 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700822 -1,
823 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700824 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800825 metrics::CheckResult::kUpdateAvailable,
826 metrics::CheckReaction::kDeferring,
827 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700828 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700829 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700830
Ben Chan9abb7632014-08-07 00:10:53 -0700831 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700832 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700833 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700835
836 // Verify if we are interactive check we don't defer.
837 params.set_interactive(true);
838 ASSERT_TRUE(
839 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700840 nullptr, // payload_state
841 nullptr, // p2p_manager
842 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700843 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700844 GetUpdateResponse2(OmahaRequestParams::kAppId,
845 "1.2.3.4", // version
846 "http://more/info",
847 "true", // prompt
848 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700849 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700850 "HASH1234=", // checksum
851 "false", // needs admin
852 "123", // size
853 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700854 "7", // max days to scatter
855 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700856 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700857 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700858 -1,
859 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700860 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800861 metrics::CheckResult::kUpdateAvailable,
862 metrics::CheckReaction::kUpdating,
863 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700864 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700865 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700866 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700867}
868
869TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
870 OmahaResponse response;
871 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700872 params.set_wall_clock_based_wait_enabled(true);
873 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700874
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700875 params.set_update_check_count_wait_enabled(true);
876 params.set_min_update_checks_needed(1);
877 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700878
879 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800880 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700881 &prefs_dir));
882 ScopedDirRemover temp_dir_remover(prefs_dir);
883
884 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700885 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700886 << "Failed to initialize preferences.";
887
888 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
889
890 ASSERT_FALSE(TestUpdateCheck(
891 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700892 nullptr, // payload_state
893 nullptr, // p2p_manager
894 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700895 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700896 GetUpdateResponse2(OmahaRequestParams::kAppId,
897 "1.2.3.4", // version
898 "http://more/info",
899 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700900 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700901 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700902 "HASH1234=", // checksum
903 "false", // needs admin
904 "123", // size
905 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700906 "7", // max days to scatter
907 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700908 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700909 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700910 -1,
911 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700912 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800913 metrics::CheckResult::kUpdateAvailable,
914 metrics::CheckReaction::kDeferring,
915 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700916 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700917 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700918
Ben Chan9abb7632014-08-07 00:10:53 -0700919 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700920 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
921 // count remains the same, as the decrementing happens in update_attempter
922 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700923 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700924 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700925
926 // Verify if we are interactive check we don't defer.
927 params.set_interactive(true);
928 ASSERT_TRUE(
929 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700930 nullptr, // payload_state
931 nullptr, // p2p_manager
932 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700933 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700934 GetUpdateResponse2(OmahaRequestParams::kAppId,
935 "1.2.3.4", // version
936 "http://more/info",
937 "true", // prompt
938 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700939 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700940 "HASH1234=", // checksum
941 "false", // needs admin
942 "123", // size
943 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700944 "7", // max days to scatter
945 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700946 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700947 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700948 -1,
949 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700950 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800951 metrics::CheckResult::kUpdateAvailable,
952 metrics::CheckReaction::kUpdating,
953 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700954 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700955 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700956 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700957}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700958
Darin Petkov6a5b3222010-07-13 14:55:28 -0700959TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700960 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
961
962 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
963
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700964 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700965 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700966 fake_system_state.set_request_params(&params);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700967 OmahaRequestAction action(&fake_system_state, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700968 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800969 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700970 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700971 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700972 OmahaRequestActionTestProcessorDelegate delegate;
973 delegate.loop_ = loop;
974 ActionProcessor processor;
975 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700976 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700977
978 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
979 g_main_loop_run(loop);
980 g_main_loop_unref(loop);
981 EXPECT_FALSE(processor.IsRunning());
982}
983
984TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700985 OmahaResponse response;
986 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700987 TestUpdateCheck(nullptr, // prefs
988 nullptr, // payload_state
989 nullptr, // p2p_manager
990 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700991 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700992 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700993 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700994 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700995 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800996 metrics::CheckResult::kParsingError,
997 metrics::CheckReaction::kUnset,
998 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700999 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001000 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001001 EXPECT_FALSE(response.update_exists);
1002}
1003
1004TEST(OmahaRequestActionTest, EmptyResponseTest) {
1005 OmahaResponse response;
1006 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001007 TestUpdateCheck(nullptr, // prefs
1008 nullptr, // payload_state
1009 nullptr, // p2p_manager
1010 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001011 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001012 "",
1013 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001014 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001015 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001016 metrics::CheckResult::kParsingError,
1017 metrics::CheckReaction::kUnset,
1018 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001019 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001020 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001021 EXPECT_FALSE(response.update_exists);
1022}
1023
1024TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001025 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001026 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001027 nullptr, // prefs
1028 nullptr, // payload_state
1029 nullptr, // p2p_manager
1030 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001031 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001032 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1033 "<daystart elapsed_seconds=\"100\"/>"
1034 "<app appid=\"foo\" status=\"ok\">"
1035 "<ping status=\"ok\"/>"
1036 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001037 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001038 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001039 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001040 metrics::CheckResult::kParsingError,
1041 metrics::CheckReaction::kUnset,
1042 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001043 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001044 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001045 EXPECT_FALSE(response.update_exists);
1046}
1047
1048TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001049 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001050 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001051 nullptr, // prefs
1052 nullptr, // payload_state
1053 nullptr, // p2p_manager
1054 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001055 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001056 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1057 "<daystart elapsed_seconds=\"100\"/>"
1058 "<app appid=\"foo\" status=\"ok\">"
1059 "<ping status=\"ok\"/>"
1060 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001061 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001062 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001063 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001064 metrics::CheckResult::kParsingError,
1065 metrics::CheckReaction::kUnset,
1066 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001067 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001068 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001069 EXPECT_FALSE(response.update_exists);
1070}
1071
1072TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001073 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001074 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001075 nullptr, // prefs
1076 nullptr, // payload_state
1077 nullptr, // p2p_manager
1078 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001079 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001080 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1081 "<daystart elapsed_seconds=\"100\"/>"
1082 "<app appid=\"foo\" status=\"ok\">"
1083 "<ping status=\"ok\"/>"
1084 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001085 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001086 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001087 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001088 metrics::CheckResult::kParsingError,
1089 metrics::CheckReaction::kUnset,
1090 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001091 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001092 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001093 EXPECT_FALSE(response.update_exists);
1094}
1095
1096TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001097 string input_response =
1098 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1099 "<daystart elapsed_seconds=\"100\"/>"
1100 "<app appid=\"xyz\" status=\"ok\">"
1101 "<updatecheck status=\"ok\">"
1102 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001103 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001104 "<packages><package hash=\"not-used\" name=\"f\" "
1105 "size=\"587\"/></packages>"
1106 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001107 "ChromeOSVersion=\"10.2.3.4\" "
1108 "Prompt=\"false\" "
1109 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001110 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001111 "sha256=\"lkq34j5345\" "
1112 "needsadmin=\"true\" "
1113 "/></actions></manifest></updatecheck></app></response>";
1114 LOG(INFO) << "Input Response = " << input_response;
1115
Darin Petkov6a5b3222010-07-13 14:55:28 -07001116 OmahaResponse response;
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001117 ASSERT_TRUE(TestUpdateCheck(nullptr, // prefs
1118 nullptr, // payload_state
1119 nullptr, // p2p_manager
1120 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001121 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001122 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001123 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001124 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001125 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001126 metrics::CheckResult::kUpdateAvailable,
1127 metrics::CheckReaction::kUpdating,
1128 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001129 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001130 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001131 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001132 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001133 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001134 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001135 EXPECT_EQ("lkq34j5345", response.hash);
1136 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001137 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001138 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001139}
1140
1141namespace {
1142class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1143 public:
1144 void ProcessingStopped(const ActionProcessor* processor) {
1145 ASSERT_TRUE(loop_);
1146 g_main_loop_quit(loop_);
1147 }
1148 GMainLoop *loop_;
1149};
1150
1151gboolean TerminateTransferTestStarter(gpointer data) {
1152 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1153 processor->StartProcessing();
1154 CHECK(processor->IsRunning());
1155 processor->StopProcessing();
1156 return FALSE;
1157}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001158} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001159
1160TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001161 string http_response("doesn't matter");
1162 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1163
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001164 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001165 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001166 fake_system_state.set_request_params(&params);
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001167 OmahaRequestAction action(&fake_system_state, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001168 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001169 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001170 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001171 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001172 TerminateEarlyTestProcessorDelegate delegate;
1173 delegate.loop_ = loop;
1174 ActionProcessor processor;
1175 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001176 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001177
1178 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1179 g_main_loop_run(loop);
1180 g_main_loop_unref(loop);
1181}
1182
1183TEST(OmahaRequestActionTest, XmlEncodeTest) {
1184 EXPECT_EQ("ab", XmlEncode("ab"));
1185 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001186 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1187 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1188
1189 vector<char> post_data;
1190
1191 // Make sure XML Encode is being called on the params
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001192 FakeSystemState fake_system_state;
1193 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001194 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001195 OmahaRequestParams::kOsVersion,
1196 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001197 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001198 OmahaRequestParams::kAppId,
1199 "0.1.0.0",
1200 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001201 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001202 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001203 "ChromeOSFirmware.1.0",
1204 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001205 false, // delta okay
1206 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001207 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001208 false, // update_disabled
1209 "", // target_version_prefix
1210 false, // use_p2p_for_downloading
1211 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001212 OmahaResponse response;
1213 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001214 TestUpdateCheck(nullptr, // prefs
1215 nullptr, // payload_state
1216 nullptr, // p2p_manager
1217 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001218 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001219 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001220 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001221 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001222 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001223 metrics::CheckResult::kParsingError,
1224 metrics::CheckReaction::kUnset,
1225 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001226 &response,
1227 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001228 // convert post_data to string
1229 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001230 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1231 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001232 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1233 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1234 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1235 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001236 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1237 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001238}
1239
1240TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001241 OmahaResponse response;
1242 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001243 TestUpdateCheck(nullptr, // prefs
1244 nullptr, // payload_state
1245 nullptr, // p2p_manager
1246 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001247 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001248 GetUpdateResponse(OmahaRequestParams::kAppId,
1249 "1.2.3.4", // version
1250 "testthe&lt;url", // more info
1251 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001252 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001253 "file.signed", // file name
1254 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001255 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001256 "123", // size
1257 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001258 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001259 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001260 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001261 metrics::CheckResult::kUpdateAvailable,
1262 metrics::CheckReaction::kUpdating,
1263 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001264 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001265 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001266
1267 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001268 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001269 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001270}
1271
1272TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001273 OmahaResponse response;
1274 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001275 TestUpdateCheck(nullptr, // prefs
1276 nullptr, // payload_state
1277 nullptr, // p2p_manager
1278 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001279 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001280 GetUpdateResponse(OmahaRequestParams::kAppId,
1281 "1.2.3.4", // version
1282 "theurl", // more info
1283 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001284 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001285 "file.signed", // file name
1286 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001287 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001288 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001289 "123123123123123", // size
1290 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001291 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001292 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001293 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001294 metrics::CheckResult::kUpdateAvailable,
1295 metrics::CheckReaction::kUpdating,
1296 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001297 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001298 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001299
1300 EXPECT_EQ(response.size, 123123123123123ll);
1301}
1302
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001303TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
1304 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001305 NiceMock<PrefsMock> prefs;
1306 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1307 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001308 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -08001309 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001310 nullptr, // payload_state
1311 nullptr, // p2p_manager
1312 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001313 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001314 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001315 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001316 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001317 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001318 metrics::CheckResult::kParsingError,
1319 metrics::CheckReaction::kUnset,
1320 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001321 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001322 &post_data));
1323 // convert post_data to string
1324 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001325 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001326 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001327 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001328 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001329 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1330 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001331 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1332 string::npos);
1333 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1334 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001335}
1336
Jay Srinivasan0a708742012-03-20 11:26:12 -07001337
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001338TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -08001339 vector<char> post_data;
1340 NiceMock<PrefsMock> prefs;
1341 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -07001342 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001343 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -07001344 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001345 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -08001346 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001347 nullptr, // payload_state
1348 nullptr, // p2p_manager
1349 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001350 &params,
Darin Petkov95508da2011-01-05 12:42:29 -08001351 "invalid xml>",
1352 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001353 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001354 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001355 metrics::CheckResult::kParsingError,
1356 metrics::CheckReaction::kUnset,
1357 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001358 nullptr, // response
Darin Petkov95508da2011-01-05 12:42:29 -08001359 &post_data));
1360 // convert post_data to string
1361 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001362 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001363 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001364 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001365 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001366 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1367 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001368 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1369 string::npos);
1370 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1371 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001372}
1373
Darin Petkove17f86b2010-07-20 09:12:01 -07001374TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1375 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001376 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001377 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1378 "invalid xml>",
1379 &post_data);
1380 // convert post_data to string
1381 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001382 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001383 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001384 OmahaEvent::kTypeUpdateDownloadStarted,
1385 OmahaEvent::kResultSuccess);
1386 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001387 EXPECT_EQ(post_str.find("ping"), string::npos);
1388 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001389}
1390
1391TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1392 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001393 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001394 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1395 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001396 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001397 "invalid xml>",
1398 &post_data);
1399 // convert post_data to string
1400 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001401 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001402 " <event eventtype=\"%d\" eventresult=\"%d\" "
1403 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001404 OmahaEvent::kTypeDownloadComplete,
1405 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001406 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001407 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001408 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001409}
1410
1411TEST(OmahaRequestActionTest, IsEventTest) {
1412 string http_response("doesn't matter");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001413 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001414 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001415 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001416 OmahaRequestAction update_check_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001417 &fake_system_state,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001418 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001419 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001420 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001421 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001422 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001423 EXPECT_FALSE(update_check_action.IsEvent());
1424
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001425 params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001426 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001427 OmahaRequestAction event_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001428 &fake_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001429 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001430 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001431 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001432 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001433 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001434 EXPECT_TRUE(event_action.IsEvent());
1435}
1436
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001437TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1438 for (int i = 0; i < 2; i++) {
1439 bool delta_okay = i == 1;
1440 const char* delta_okay_str = delta_okay ? "true" : "false";
1441 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001442 FakeSystemState fake_system_state;
1443 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001444 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001445 OmahaRequestParams::kOsVersion,
1446 "service_pack",
1447 "x86-generic",
1448 OmahaRequestParams::kAppId,
1449 "0.1.0.0",
1450 "en-US",
1451 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001452 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001453 "ChromeOSFirmware.1.0",
1454 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001455 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001456 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001457 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001458 false, // update_disabled
1459 "", // target_version_prefix
1460 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001461 false); // use_p2p_for_sharing
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001462 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1463 nullptr, // payload_state
1464 nullptr, // p2p_manager
1465 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001466 &params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001467 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001468 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001469 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001470 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001471 metrics::CheckResult::kParsingError,
1472 metrics::CheckReaction::kUnset,
1473 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001474 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001475 &post_data));
1476 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001477 string post_str(post_data.data(), post_data.size());
1478 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1479 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001480 string::npos)
1481 << "i = " << i;
1482 }
1483}
1484
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001485TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1486 for (int i = 0; i < 2; i++) {
1487 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001488 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001489 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001490 FakeSystemState fake_system_state;
1491 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001492 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001493 OmahaRequestParams::kOsVersion,
1494 "service_pack",
1495 "x86-generic",
1496 OmahaRequestParams::kAppId,
1497 "0.1.0.0",
1498 "en-US",
1499 "unittest_track",
1500 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001501 "ChromeOSFirmware.1.0",
1502 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001503 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001504 interactive,
1505 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001506 false, // update_disabled
1507 "", // target_version_prefix
1508 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001509 false); // use_p2p_for_sharing
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001510 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1511 nullptr, // payload_state
1512 nullptr, // p2p_manager
1513 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001514 &params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001515 "invalid xml>",
1516 -1,
1517 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001518 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001519 metrics::CheckResult::kParsingError,
1520 metrics::CheckReaction::kUnset,
1521 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001522 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001523 &post_data));
1524 // convert post_data to string
1525 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001526 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1527 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001528 string::npos)
1529 << "i = " << i;
1530 }
1531}
1532
Darin Petkove17f86b2010-07-20 09:12:01 -07001533TEST(OmahaRequestActionTest, OmahaEventTest) {
1534 OmahaEvent default_event;
1535 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1536 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001537 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001538
1539 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1540 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1541 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001542 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001543
1544 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1545 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001546 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001547 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1548 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001549 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001550}
1551
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001552TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001553 for (int ping_only = 0; ping_only < 2; ping_only++) {
1554 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001555 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1556 .Times(AnyNumber());
1557 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov265f2902011-05-09 15:17:40 -07001558 // Add a few hours to the day difference to test no rounding, etc.
1559 int64_t five_days_ago =
1560 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1561 int64_t six_days_ago =
1562 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001563 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1564 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov265f2902011-05-09 15:17:40 -07001565 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1566 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1567 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1568 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1569 vector<char> post_data;
1570 ASSERT_TRUE(
1571 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001572 nullptr, // payload_state
1573 nullptr, // p2p_manager
1574 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001575 &kDefaultTestParams,
Darin Petkov265f2902011-05-09 15:17:40 -07001576 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1577 -1,
1578 ping_only,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001579 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001580 metrics::CheckResult::kUnset,
1581 metrics::CheckReaction::kUnset,
1582 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001583 nullptr,
Darin Petkov265f2902011-05-09 15:17:40 -07001584 &post_data));
1585 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001586 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001587 string::npos);
1588 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001589 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001590 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1591 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001592 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001593 EXPECT_NE(post_str.find("previousversion"), string::npos);
1594 }
1595 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001596}
1597
1598TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001599 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001600 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1601 .Times(AnyNumber());
1602 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001603 int64_t three_days_ago =
1604 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1605 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001606 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1607 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001608 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1609 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1610 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1611 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1612 vector<char> post_data;
1613 ASSERT_TRUE(
1614 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001615 nullptr, // payload_state
1616 nullptr, // p2p_manager
1617 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001618 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001619 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001620 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001621 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001622 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001623 metrics::CheckResult::kNoUpdateAvailable,
1624 metrics::CheckReaction::kUnset,
1625 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001626 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001627 &post_data));
1628 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001629 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001630 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001631}
1632
1633TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001634 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001635 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1636 .Times(AnyNumber());
1637 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001638 int64_t four_days_ago =
1639 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1640 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001641 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1642 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001643 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1644 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1645 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1646 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1647 vector<char> post_data;
1648 ASSERT_TRUE(
1649 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001650 nullptr, // payload_state
1651 nullptr, // p2p_manager
1652 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001653 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001654 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001655 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001656 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001657 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001658 metrics::CheckResult::kNoUpdateAvailable,
1659 metrics::CheckReaction::kUnset,
1660 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001661 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001662 &post_data));
1663 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001664 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001665 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001666}
1667
1668TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001669 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001670 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1671 .Times(AnyNumber());
1672 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001673 int64_t one_hour_ago =
1674 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001675 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1676 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001677 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1678 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1679 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1680 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1681 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1682 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1683 vector<char> post_data;
1684 ASSERT_TRUE(
1685 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001686 nullptr, // payload_state
1687 nullptr, // p2p_manager
1688 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001689 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001690 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001691 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001692 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001693 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001694 metrics::CheckResult::kNoUpdateAvailable,
1695 metrics::CheckReaction::kUnset,
1696 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001697 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001698 &post_data));
1699 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001700 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001701}
1702
Thieu Leb44e9e82011-06-06 14:34:04 -07001703TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1704 // This test ensures that we ignore empty ping only requests.
1705 NiceMock<PrefsMock> prefs;
1706 int64_t now = Time::Now().ToInternalValue();
1707 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1708 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1709 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1710 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1711 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1712 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1713 vector<char> post_data;
1714 EXPECT_TRUE(
1715 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001716 nullptr, // payload_state
1717 nullptr, // p2p_manager
1718 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001719 &kDefaultTestParams,
Thieu Leb44e9e82011-06-06 14:34:04 -07001720 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1721 -1,
1722 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001723 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001724 metrics::CheckResult::kUnset,
1725 metrics::CheckReaction::kUnset,
1726 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001727 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001728 &post_data));
1729 EXPECT_EQ(post_data.size(), 0);
1730}
1731
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001732TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001733 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001734 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1735 .Times(AnyNumber());
1736 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001737 int64_t future =
1738 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001739 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1740 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001741 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1742 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1743 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1744 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1745 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1746 .WillOnce(Return(true));
1747 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1748 .WillOnce(Return(true));
1749 vector<char> post_data;
1750 ASSERT_TRUE(
1751 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001752 nullptr, // payload_state
1753 nullptr, // p2p_manager
1754 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001755 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001756 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1757 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001758 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001759 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001760 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001761 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001762 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001763 metrics::CheckResult::kNoUpdateAvailable,
1764 metrics::CheckReaction::kUnset,
1765 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001766 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001767 &post_data));
1768 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001769 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001770}
1771
1772TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1773 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001774 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001775 // may fail if it runs for longer than 5 seconds. It shouldn't run
1776 // that long though.
1777 int64_t midnight =
1778 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1779 int64_t midnight_slack =
1780 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001781 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001782 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1783 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001784 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1785 AllOf(Ge(midnight), Le(midnight_slack))))
1786 .WillOnce(Return(true));
1787 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1788 AllOf(Ge(midnight), Le(midnight_slack))))
1789 .WillOnce(Return(true));
1790 ASSERT_TRUE(
1791 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001792 nullptr, // payload_state
1793 nullptr, // p2p_manager
1794 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001795 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001796 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1797 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001798 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001799 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001800 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001801 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001802 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001803 metrics::CheckResult::kNoUpdateAvailable,
1804 metrics::CheckReaction::kUnset,
1805 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001806 nullptr,
1807 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001808}
1809
1810TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001811 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001812 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1813 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001814 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1815 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1816 ASSERT_TRUE(
1817 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001818 nullptr, // payload_state
1819 nullptr, // p2p_manager
1820 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001821 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001822 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1823 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001824 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001825 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001826 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001827 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001828 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001829 metrics::CheckResult::kNoUpdateAvailable,
1830 metrics::CheckReaction::kUnset,
1831 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001832 nullptr,
1833 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001834}
1835
1836TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001837 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001838 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1839 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001840 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1841 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1842 ASSERT_TRUE(
1843 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001844 nullptr, // payload_state
1845 nullptr, // p2p_manager
1846 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001847 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001848 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1849 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001850 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001851 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001852 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001853 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001854 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001855 metrics::CheckResult::kNoUpdateAvailable,
1856 metrics::CheckReaction::kUnset,
1857 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001858 nullptr,
1859 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001860}
1861
Darin Petkov84c763c2010-07-29 16:27:58 -07001862TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1863 vector<char> post_data;
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001864 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1865 nullptr, // payload_state
1866 nullptr, // p2p_manager
1867 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001868 &kDefaultTestParams,
Darin Petkov84c763c2010-07-29 16:27:58 -07001869 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001870 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001871 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001872 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001873 metrics::CheckResult::kParsingError,
1874 metrics::CheckReaction::kUnset,
1875 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001876 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001877 &post_data));
1878 // convert post_data to string
1879 string post_str(&post_data[0], post_data.size());
1880 EXPECT_EQ(post_str.find("machineid="), string::npos);
1881 EXPECT_EQ(post_str.find("userid="), string::npos);
1882}
1883
Darin Petkovedc522e2010-11-05 09:35:17 -07001884TEST(OmahaRequestActionTest, NetworkFailureTest) {
1885 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001886 const int http_error_code =
1887 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001888 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001889 TestUpdateCheck(nullptr, // prefs
1890 nullptr, // payload_state
1891 nullptr, // p2p_manager
1892 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001893 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001894 "",
1895 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001896 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001897 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001898 metrics::CheckResult::kDownloadError,
1899 metrics::CheckReaction::kUnset,
1900 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001901 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001902 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001903 EXPECT_FALSE(response.update_exists);
1904}
1905
1906TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1907 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001908 const int http_error_code =
1909 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001910 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001911 TestUpdateCheck(nullptr, // prefs
1912 nullptr, // payload_state
1913 nullptr, // p2p_manager
1914 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001915 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001916 "",
1917 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001918 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001919 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001920 metrics::CheckResult::kDownloadError,
1921 metrics::CheckReaction::kUnset,
1922 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001923 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001924 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001925 EXPECT_FALSE(response.update_exists);
1926}
1927
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001928TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1929 OmahaResponse response;
1930 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001931 params.set_wall_clock_based_wait_enabled(true);
1932 params.set_waiting_period(TimeDelta().FromDays(1));
1933 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001934
1935 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001936 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001937 &prefs_dir));
1938 ScopedDirRemover temp_dir_remover(prefs_dir);
1939
1940 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001941 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001942 << "Failed to initialize preferences.";
1943
1944 ASSERT_FALSE(TestUpdateCheck(
1945 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001946 nullptr, // payload_state
1947 nullptr, // p2p_manager
1948 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001949 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001950 GetUpdateResponse2(OmahaRequestParams::kAppId,
1951 "1.2.3.4", // version
1952 "http://more/info",
1953 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001954 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001955 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001956 "HASH1234=", // checksum
1957 "false", // needs admin
1958 "123", // size
1959 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001960 "7", // max days to scatter
1961 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001962 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001963 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001964 -1,
1965 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001966 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001967 metrics::CheckResult::kUpdateAvailable,
1968 metrics::CheckReaction::kDeferring,
1969 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001970 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001971 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001972
Ben Chan9abb7632014-08-07 00:10:53 -07001973 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001974 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001975 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001976 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001977
1978 // Verify if we are interactive check we don't defer.
1979 params.set_interactive(true);
1980 ASSERT_TRUE(
1981 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001982 nullptr, // payload_state
1983 nullptr, // p2p_manager
1984 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001985 &params,
Chris Sosa968d0572013-08-23 14:46:02 -07001986 GetUpdateResponse2(OmahaRequestParams::kAppId,
1987 "1.2.3.4", // version
1988 "http://more/info",
1989 "true", // prompt
1990 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001991 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001992 "HASH1234=", // checksum
1993 "false", // needs admin
1994 "123", // size
1995 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001996 "7", // max days to scatter
1997 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001998 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001999 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07002000 -1,
2001 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002002 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002003 metrics::CheckResult::kUpdateAvailable,
2004 metrics::CheckReaction::kUpdating,
2005 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07002006 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002007 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07002008 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002009}
2010
2011TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
2012 OmahaResponse response;
2013 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002014 params.set_wall_clock_based_wait_enabled(true);
2015 params.set_waiting_period(TimeDelta().FromDays(1));
2016 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002017
2018 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08002019 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002020 &prefs_dir));
2021 ScopedDirRemover temp_dir_remover(prefs_dir);
2022
2023 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07002024 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002025 << "Failed to initialize preferences.";
2026
2027 // Set the timestamp to a very old value such that it exceeds the
2028 // waiting period set above.
2029 Time t1;
2030 Time::FromString("1/1/2012", &t1);
2031 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2032 ASSERT_TRUE(TestUpdateCheck(
2033 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002034 nullptr, // payload_state
2035 nullptr, // p2p_manager
2036 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002037 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002038 GetUpdateResponse2(OmahaRequestParams::kAppId,
2039 "1.2.3.4", // version
2040 "http://more/info",
2041 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002042 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002043 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002044 "HASH1234=", // checksum
2045 "false", // needs admin
2046 "123", // size
2047 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002048 "7", // max days to scatter
2049 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002050 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002051 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002052 -1,
2053 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002054 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002055 metrics::CheckResult::kUpdateAvailable,
2056 metrics::CheckReaction::kUpdating,
2057 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002058 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002059 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002060
2061 EXPECT_TRUE(response.update_exists);
2062
2063 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002064 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002065 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
2066 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2067}
2068
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002069TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002070 // Create a uniquely named test directory.
2071 string test_dir;
2072 ASSERT_TRUE(utils::MakeTempDirectory(
2073 "omaha_request_action-test-XXXXXX", &test_dir));
2074
2075 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2076 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002077 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002078 vector<char> post_data;
2079 NiceMock<PrefsMock> prefs;
2080 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002081 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002082 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2083 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2084 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2085 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002086 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002087 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
2088 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2089 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002090 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002091 params.SetLockDown(false);
2092 params.Init("1.2.3.4", "", 0);
2093 EXPECT_EQ("canary-channel", params.current_channel());
2094 EXPECT_EQ("stable-channel", params.target_channel());
2095 EXPECT_TRUE(params.to_more_stable_channel());
2096 EXPECT_TRUE(params.is_powerwash_allowed());
2097 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002098 nullptr, // payload_state
2099 nullptr, // p2p_manager
2100 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002101 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002102 "invalid xml>",
2103 -1,
2104 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002105 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002106 metrics::CheckResult::kParsingError,
2107 metrics::CheckReaction::kUnset,
2108 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002109 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002110 &post_data));
2111 // convert post_data to string
2112 string post_str(&post_data[0], post_data.size());
2113 EXPECT_NE(string::npos, post_str.find(
2114 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2115 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2116 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002117
2118 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002119}
2120
2121TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002122 // Create a uniquely named test directory.
2123 string test_dir;
2124 ASSERT_TRUE(utils::MakeTempDirectory(
2125 "omaha_request_action-test-XXXXXX", &test_dir));
2126
2127 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2128 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002129 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002130 vector<char> post_data;
2131 NiceMock<PrefsMock> prefs;
2132 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002133 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002134 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2135 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2136 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2137 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002138 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002139 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2140 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002141 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002142 params.SetLockDown(false);
2143 params.Init("5.6.7.8", "", 0);
2144 EXPECT_EQ("stable-channel", params.current_channel());
2145 EXPECT_EQ("canary-channel", params.target_channel());
2146 EXPECT_FALSE(params.to_more_stable_channel());
2147 EXPECT_FALSE(params.is_powerwash_allowed());
2148 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002149 nullptr, // payload_state
2150 nullptr, // p2p_manager
2151 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002152 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002153 "invalid xml>",
2154 -1,
2155 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002156 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002157 metrics::CheckResult::kParsingError,
2158 metrics::CheckReaction::kUnset,
2159 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002160 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002161 &post_data));
2162 // convert post_data to string
2163 string post_str(&post_data[0], post_data.size());
2164 EXPECT_NE(string::npos, post_str.find(
2165 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2166 "version=\"5.6.7.8\" "
2167 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002168 EXPECT_EQ(string::npos, post_str.find("from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002169
2170 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002171}
2172
David Zeuthen8f191b22013-08-06 12:27:50 -07002173void P2PTest(bool initial_allow_p2p_for_downloading,
2174 bool initial_allow_p2p_for_sharing,
2175 bool omaha_disable_p2p_for_downloading,
2176 bool omaha_disable_p2p_for_sharing,
2177 bool payload_state_allow_p2p_attempt,
2178 bool expect_p2p_client_lookup,
2179 const string& p2p_client_result_url,
2180 bool expected_allow_p2p_for_downloading,
2181 bool expected_allow_p2p_for_sharing,
2182 const string& expected_p2p_url) {
2183 OmahaResponse response;
2184 OmahaRequestParams request_params = kDefaultTestParams;
2185 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
2186 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
2187
2188 MockPayloadState mock_payload_state;
2189 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2190 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
2191 MockP2PManager mock_p2p_manager;
2192 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2193
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002194 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2195 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002196 .Times(expect_p2p_client_lookup ? 1 : 0);
2197
2198 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002199 TestUpdateCheck(nullptr, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07002200 &mock_payload_state,
2201 &mock_p2p_manager,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002202 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002203 &request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07002204 GetUpdateResponse2(OmahaRequestParams::kAppId,
2205 "1.2.3.4", // version
2206 "http://more/info",
2207 "true", // prompt
2208 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002209 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07002210 "HASH1234=", // checksum
2211 "false", // needs admin
2212 "123", // size
2213 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002214 "7", // max days to scatter
2215 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002216 omaha_disable_p2p_for_downloading,
2217 omaha_disable_p2p_for_sharing),
2218 -1,
2219 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002220 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002221 metrics::CheckResult::kUpdateAvailable,
2222 metrics::CheckReaction::kUpdating,
2223 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002224 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002225 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002226 EXPECT_TRUE(response.update_exists);
2227
2228 EXPECT_EQ(response.disable_p2p_for_downloading,
2229 omaha_disable_p2p_for_downloading);
2230 EXPECT_EQ(response.disable_p2p_for_sharing,
2231 omaha_disable_p2p_for_sharing);
2232
2233 EXPECT_EQ(request_params.use_p2p_for_downloading(),
2234 expected_allow_p2p_for_downloading);
2235
2236 EXPECT_EQ(request_params.use_p2p_for_sharing(),
2237 expected_allow_p2p_for_sharing);
2238
2239 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
2240}
2241
2242TEST(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002243 P2PTest(true, // initial_allow_p2p_for_downloading
2244 true, // initial_allow_p2p_for_sharing
2245 false, // omaha_disable_p2p_for_downloading
2246 false, // omaha_disable_p2p_for_sharing
2247 true, // payload_state_allow_p2p_attempt
2248 true, // expect_p2p_client_lookup
2249 "http://1.3.5.7/p2p", // p2p_client_result_url
2250 true, // expected_allow_p2p_for_downloading
2251 true, // expected_allow_p2p_for_sharing
2252 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002253}
2254
2255TEST(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002256 P2PTest(true, // initial_allow_p2p_for_downloading
2257 true, // initial_allow_p2p_for_sharing
2258 false, // omaha_disable_p2p_for_downloading
2259 false, // omaha_disable_p2p_for_sharing
2260 true, // payload_state_allow_p2p_attempt
2261 true, // expect_p2p_client_lookup
2262 "", // p2p_client_result_url
2263 false, // expected_allow_p2p_for_downloading
2264 true, // expected_allow_p2p_for_sharing
2265 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002266}
2267
2268TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002269 P2PTest(false, // initial_allow_p2p_for_downloading
2270 true, // initial_allow_p2p_for_sharing
2271 false, // omaha_disable_p2p_for_downloading
2272 false, // omaha_disable_p2p_for_sharing
2273 true, // payload_state_allow_p2p_attempt
2274 false, // expect_p2p_client_lookup
2275 "unset", // p2p_client_result_url
2276 false, // expected_allow_p2p_for_downloading
2277 true, // expected_allow_p2p_for_sharing
2278 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002279}
2280
2281TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002282 P2PTest(true, // initial_allow_p2p_for_downloading
2283 true, // initial_allow_p2p_for_sharing
2284 true, // omaha_disable_p2p_for_downloading
2285 false, // omaha_disable_p2p_for_sharing
2286 true, // payload_state_allow_p2p_attempt
2287 false, // expect_p2p_client_lookup
2288 "unset", // p2p_client_result_url
2289 false, // expected_allow_p2p_for_downloading
2290 true, // expected_allow_p2p_for_sharing
2291 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002292}
2293
2294TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002295 P2PTest(true, // initial_allow_p2p_for_downloading
2296 true, // initial_allow_p2p_for_sharing
2297 false, // omaha_disable_p2p_for_downloading
2298 true, // omaha_disable_p2p_for_sharing
2299 true, // payload_state_allow_p2p_attempt
2300 true, // expect_p2p_client_lookup
2301 "http://1.3.5.7/p2p", // p2p_client_result_url
2302 true, // expected_allow_p2p_for_downloading
2303 false, // expected_allow_p2p_for_sharing
2304 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002305}
2306
2307TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002308 P2PTest(true, // initial_allow_p2p_for_downloading
2309 true, // initial_allow_p2p_for_sharing
2310 true, // omaha_disable_p2p_for_downloading
2311 true, // omaha_disable_p2p_for_sharing
2312 true, // payload_state_allow_p2p_attempt
2313 false, // expect_p2p_client_lookup
2314 "unset", // p2p_client_result_url
2315 false, // expected_allow_p2p_for_downloading
2316 false, // expected_allow_p2p_for_sharing
2317 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002318}
2319
David Zeuthen639aa362014-02-03 16:23:44 -08002320bool InstallDateParseHelper(const std::string &elapsed_days,
2321 PrefsInterface* prefs,
2322 OmahaResponse *response) {
2323 return
2324 TestUpdateCheck(prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002325 nullptr, // payload_state
2326 nullptr, // p2p_manager
2327 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002328 &kDefaultTestParams,
David Zeuthen639aa362014-02-03 16:23:44 -08002329 GetUpdateResponse2(OmahaRequestParams::kAppId,
2330 "1.2.3.4", // version
2331 "http://more/info",
2332 "true", // prompt
2333 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002334 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002335 "HASH1234=", // checksum
2336 "false", // needs admin
2337 "123", // size
2338 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002339 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002340 elapsed_days,
2341 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002342 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002343 -1,
2344 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002345 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002346 metrics::CheckResult::kUpdateAvailable,
2347 metrics::CheckReaction::kUpdating,
2348 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002349 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002350 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002351}
2352
2353TEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2354 OmahaResponse response;
2355 string temp_dir;
2356 Prefs prefs;
2357 EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2358 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002359 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002360
2361 // Check that we parse elapsed_days in the Omaha Response correctly.
2362 // and that the kPrefsInstallDateDays value is written to.
2363 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2364 EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2365 EXPECT_TRUE(response.update_exists);
2366 EXPECT_EQ(42, response.install_date_days);
2367 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2368 int64_t prefs_days;
2369 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2370 EXPECT_EQ(prefs_days, 42);
2371
2372 // If there already is a value set, we shouldn't do anything.
2373 EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2374 EXPECT_TRUE(response.update_exists);
2375 EXPECT_EQ(7, response.install_date_days);
2376 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2377 EXPECT_EQ(prefs_days, 42);
2378
2379 // Note that elapsed_days is not necessarily divisible by 7 so check
2380 // that we round down correctly when populating kPrefsInstallDateDays.
2381 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2382 EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2383 EXPECT_TRUE(response.update_exists);
2384 EXPECT_EQ(23, response.install_date_days);
2385 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2386 EXPECT_EQ(prefs_days, 21);
2387
2388 // Check that we correctly handle elapsed_days not being included in
2389 // the Omaha Response.
2390 EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2391 EXPECT_TRUE(response.update_exists);
2392 EXPECT_EQ(-1, response.install_date_days);
2393
2394 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2395}
2396
2397TEST(OmahaRequestActionTest, GetInstallDate) {
2398 string temp_dir;
2399 Prefs prefs;
2400 EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2401 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002402 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002403
2404 // If there is no prefs and OOBE is not complete, we should not
2405 // report anything to Omaha.
2406 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002407 FakeSystemState system_state;
David Zeuthen639aa362014-02-03 16:23:44 -08002408 system_state.set_prefs(&prefs);
2409 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2410 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2411 }
2412
2413 // If OOBE is complete and happened on a valid date (e.g. after Jan
2414 // 1 2007 0:00 PST), that date should be used and written to
2415 // prefs. However, first try with an invalid date and check we do
2416 // nothing.
2417 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002418 FakeSystemState fake_system_state;
2419 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002420
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002421 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002422 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2423 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
David Zeuthen639aa362014-02-03 16:23:44 -08002424 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2425 }
2426
2427 // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2428 // should yield an InstallDate of 14.
2429 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002430 FakeSystemState fake_system_state;
2431 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002432
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002433 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002434 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2435 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002436 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2437
2438 int64_t prefs_days;
2439 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2440 EXPECT_EQ(prefs_days, 14);
2441 }
2442
2443 // Now that we have a valid date in prefs, check that we keep using
2444 // that even if OOBE date reports something else. The date Jan 30,
2445 // 2007 0:00 PST should yield an InstallDate of 28... but since
2446 // there's a prefs file, we should still get 14.
2447 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002448 FakeSystemState fake_system_state;
2449 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002450
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002451 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002452 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2453 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002454
2455 int64_t prefs_days;
2456 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2457 EXPECT_EQ(prefs_days, 14);
2458
2459 // If we delete the prefs file, we should get 28 days.
2460 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002461 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002462 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2463 EXPECT_EQ(prefs_days, 28);
2464 }
2465
2466 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2467}
2468
Darin Petkov6a5b3222010-07-13 14:55:28 -07002469} // namespace chromeos_update_engine