blob: 8036f4611bcf179b2bd0e5aeb08b251804127188 [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
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070078string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -070079 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070080 const string& more_info_url,
81 const string& prompt,
82 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070083 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070084 const string& hash,
85 const string& needsadmin,
86 const string& size,
87 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -070088 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -080089 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -070090 bool disable_p2p_for_downloading,
91 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070092 string response =
93 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
94 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -080095 "<daystart elapsed_seconds=\"100\"" +
96 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
97 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -070098 "<app appid=\"" + app_id + "\" status=\"ok\">"
99 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
100 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700101 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700102 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
103 "size=\"" + size + "\"/></packages>"
104 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700105 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700106 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
107 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800108 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700109 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700110 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700111 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700112 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700113 (disable_p2p_for_downloading ?
114 "DisableP2PForDownloading=\"true\" " : "") +
115 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700116 "/></actions></manifest></updatecheck></app></response>";
117 LOG(INFO) << "Response = " << response;
118 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700119}
120
Darin Petkov6a5b3222010-07-13 14:55:28 -0700121string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700122 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700123 const string& more_info_url,
124 const string& prompt,
125 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700126 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127 const string& hash,
128 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700129 const string& size,
130 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700131 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700132 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700133 more_info_url,
134 prompt,
135 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700136 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700137 hash,
138 needsadmin,
139 size,
140 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700141 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700142 "42", // elapsed_days
143 false, // disable_p2p_for_downloading
144 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700145}
146
147class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
148 public:
149 OmahaRequestActionTestProcessorDelegate()
150 : loop_(NULL),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700151 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700152 virtual ~OmahaRequestActionTestProcessorDelegate() {
153 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700154 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700155 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700156 ASSERT_TRUE(loop_);
157 g_main_loop_quit(loop_);
158 }
159
160 virtual void ActionCompleted(ActionProcessor* processor,
161 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700162 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700163 // make sure actions always succeed
164 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700165 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700166 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700167 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700168 }
169 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700170 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700171};
172
173gboolean StartProcessorInRunLoop(gpointer data) {
174 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
175 processor->StartProcessing();
176 return FALSE;
177}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700178} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700179
180class OutputObjectCollectorAction;
181
182template<>
183class ActionTraits<OutputObjectCollectorAction> {
184 public:
185 // Does not take an object for input
186 typedef OmahaResponse InputObjectType;
187 // On success, puts the output path on output
188 typedef NoneType OutputObjectType;
189};
190
191class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
192 public:
193 OutputObjectCollectorAction() : has_input_object_(false) {}
194 void PerformAction() {
195 // copy input object
196 has_input_object_ = HasInputObject();
197 if (has_input_object_)
198 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700199 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700200 }
201 // Should never be called
202 void TerminateProcessing() {
203 CHECK(false);
204 }
205 // Debugging/logging
206 static std::string StaticType() {
207 return "OutputObjectCollectorAction";
208 }
209 std::string Type() const { return StaticType(); }
210 bool has_input_object_;
211 OmahaResponse omaha_response_;
212};
213
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700214// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700215// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
David Zeuthen8f191b22013-08-06 12:27:50 -0700216// used. |payload_state| may be NULL, in which case a local mock is used.
217// |p2p_manager| may be NULL, in which case a local mock is used.
Chris Sosa77f79e82014-06-02 18:16:24 -0700218// |connection_manager| may be NULL, in which case a local mock is used.
David Zeuthen8f191b22013-08-06 12:27:50 -0700219// out_response may be NULL. If |fail_http_response_code| is non-negative,
Darin Petkov265f2902011-05-09 15:17:40 -0700220// the transfer will fail with that code. |ping_only| is passed through to the
221// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
222// post-data received by the mock HttpFetcher is returned.
David Zeuthen33bae492014-02-25 16:16:18 -0800223//
224// The |expected_check_result|, |expected_check_reaction| and
225// |expected_error_code| parameters are for checking expectations
226// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
227// UMA statistics. Use the appropriate ::kUnset value to specify that
228// the given metric should not be reported.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700229bool TestUpdateCheck(PrefsInterface* prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -0700230 PayloadStateInterface *payload_state,
231 P2PManager *p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -0700232 ConnectionManager *connection_manager,
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700233 OmahaRequestParams* params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700234 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700235 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700236 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700237 ErrorCode expected_code,
David Zeuthen33bae492014-02-25 16:16:18 -0800238 metrics::CheckResult expected_check_result,
239 metrics::CheckReaction expected_check_reaction,
240 metrics::DownloadErrorCode expected_download_error_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700241 OmahaResponse* out_response,
242 vector<char>* out_post_data) {
243 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
244 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800245 http_response.size(),
246 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700247 if (fail_http_response_code >= 0) {
248 fetcher->FailTransfer(fail_http_response_code);
249 }
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700250 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800251 if (prefs)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700252 fake_system_state.set_prefs(prefs);
David Zeuthen8f191b22013-08-06 12:27:50 -0700253 if (payload_state)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700254 fake_system_state.set_payload_state(payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -0700255 if (p2p_manager)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700256 fake_system_state.set_p2p_manager(p2p_manager);
Chris Sosa77f79e82014-06-02 18:16:24 -0700257 if (connection_manager)
258 fake_system_state.set_connection_manager(connection_manager);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700259 fake_system_state.set_request_params(params);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700260 OmahaRequestAction action(&fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700261 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700262 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700263 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700264 OmahaRequestActionTestProcessorDelegate delegate;
265 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700266 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700267
Darin Petkov6a5b3222010-07-13 14:55:28 -0700268 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700270 processor.EnqueueAction(&action);
271
272 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700273 BondActions(&action, &collector_action);
274 processor.EnqueueAction(&collector_action);
275
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700276 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800277 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700278 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800279 SendEnumToUMA(metrics::kMetricCheckResult,
280 static_cast<int>(expected_check_result),
281 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
282 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700283 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800284 SendEnumToUMA(metrics::kMetricCheckReaction,
285 static_cast<int>(expected_check_reaction),
286 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
287 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700288 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700289 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
290 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800291 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
292 ? 0 : 1);
293
Darin Petkov6a5b3222010-07-13 14:55:28 -0700294 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
295 g_main_loop_run(loop);
296 g_main_loop_unref(loop);
297 if (collector_action.has_input_object_ && out_response)
298 *out_response = collector_action.omaha_response_;
299 if (out_post_data)
300 *out_post_data = fetcher->post_data();
301 return collector_action.has_input_object_;
302}
303
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700304// Tests Event requests -- they should always succeed. |out_post_data|
305// may be null; if non-null, the post-data received by the mock
306// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700307void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700308 OmahaEvent* event,
309 const string& http_response,
310 vector<char>* out_post_data) {
311 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
312 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800313 http_response.size(),
314 NULL);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700315 FakeSystemState fake_system_state;
316 fake_system_state.set_request_params(&params);
317 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700318 OmahaRequestActionTestProcessorDelegate delegate;
319 delegate.loop_ = loop;
320 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700321 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700322 processor.EnqueueAction(&action);
323
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700324 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
325 g_main_loop_run(loop);
326 g_main_loop_unref(loop);
327 if (out_post_data)
328 *out_post_data = fetcher->post_data();
329}
330
Darin Petkov6a5b3222010-07-13 14:55:28 -0700331TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700332 OmahaResponse response;
333 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700334 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700335 NULL, // payload_state
336 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700337 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700338 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700339 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700340 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700341 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700342 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800343 metrics::CheckResult::kNoUpdateAvailable,
344 metrics::CheckReaction::kUnset,
345 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700346 &response,
347 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700348 EXPECT_FALSE(response.update_exists);
349}
350
351TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700352 OmahaResponse response;
353 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700354 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700355 NULL, // payload_state
356 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700357 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700358 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700359 GetUpdateResponse(OmahaRequestParams::kAppId,
360 "1.2.3.4", // version
361 "http://more/info",
362 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700363 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700364 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700365 "HASH1234=", // checksum
366 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700367 "123", // size
368 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700369 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700370 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700371 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800372 metrics::CheckResult::kUpdateAvailable,
373 metrics::CheckReaction::kUpdating,
374 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700375 &response,
376 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700377 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700378 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700379 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800380 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700381 EXPECT_EQ("http://more/info", response.more_info_url);
382 EXPECT_EQ("HASH1234=", response.hash);
383 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700384 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700385 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700386}
387
Jay Srinivasan0a708742012-03-20 11:26:12 -0700388TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
389 OmahaResponse response;
390 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700391 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700392 ASSERT_FALSE(
393 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700394 NULL, // payload_state
395 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700396 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700397 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700398 GetUpdateResponse(OmahaRequestParams::kAppId,
399 "1.2.3.4", // version
400 "http://more/info",
401 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700402 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700403 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700404 "HASH1234=", // checksum
405 "false", // needs admin
406 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700407 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700408 -1,
409 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700410 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800411 metrics::CheckResult::kUpdateAvailable,
412 metrics::CheckReaction::kIgnored,
413 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700414 &response,
415 NULL));
416 EXPECT_FALSE(response.update_exists);
417}
418
Chris Sosa77f79e82014-06-02 18:16:24 -0700419TEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
420 OmahaResponse response;
421 // Set up a connection manager that doesn't allow a valid update over
422 // the current ethernet connection.
423 MockConnectionManager mock_cm(NULL);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700424 EXPECT_CALL(mock_cm, GetConnectionProperties(_, _, _))
Chris Sosa77f79e82014-06-02 18:16:24 -0700425 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
426 SetArgumentPointee<2>(NetworkTethering::kUnknown),
427 Return(true)));
428 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
429 .WillRepeatedly(Return(false));
430 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
431 .WillRepeatedly(Return(shill::kTypeEthernet));
432
433 ASSERT_FALSE(
434 TestUpdateCheck(NULL, // prefs
435 NULL, // payload_state
436 NULL, // p2p_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700437 &mock_cm, // connection_manager
438 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700439 GetUpdateResponse(OmahaRequestParams::kAppId,
440 "1.2.3.4", // version
441 "http://more/info",
442 "true", // prompt
443 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700444 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700445 "HASH1234=", // checksum
446 "false", // needs admin
447 "123", // size
448 ""), // deadline
449 -1,
450 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700451 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700452 metrics::CheckResult::kUpdateAvailable,
453 metrics::CheckReaction::kIgnored,
454 metrics::DownloadErrorCode::kUnset,
455 &response,
456 NULL));
457 EXPECT_FALSE(response.update_exists);
458}
459
460TEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
461 string rollback_version = "1234.0.0";
462 OmahaResponse response;
463
464 MockPayloadState mock_payload_state;
465 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
466 .WillRepeatedly(Return(rollback_version));
467
468 ASSERT_FALSE(
469 TestUpdateCheck(NULL, // prefs
470 &mock_payload_state, // payload_state
471 NULL, // p2p_manager
472 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700473 &kDefaultTestParams,
Chris Sosa77f79e82014-06-02 18:16:24 -0700474 GetUpdateResponse(OmahaRequestParams::kAppId,
475 rollback_version, // version
476 "http://more/info",
477 "true", // prompt
478 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700479 "file.signed", // file name
Chris Sosa77f79e82014-06-02 18:16:24 -0700480 "HASH1234=", // checksum
481 "false", // needs admin
482 "123", // size
483 ""), // deadline
484 -1,
485 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700486 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700487 metrics::CheckResult::kUpdateAvailable,
488 metrics::CheckReaction::kIgnored,
489 metrics::DownloadErrorCode::kUnset,
490 &response,
491 NULL));
492 EXPECT_FALSE(response.update_exists);
493}
494
Jay Srinivasan0a708742012-03-20 11:26:12 -0700495TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
496 OmahaResponse response;
497 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700498 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700499 ASSERT_TRUE(
500 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700501 NULL, // payload_state
502 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700503 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700504 &params,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700505 GetNoUpdateResponse(OmahaRequestParams::kAppId),
506 -1,
507 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700508 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800509 metrics::CheckResult::kNoUpdateAvailable,
510 metrics::CheckReaction::kUnset,
511 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700512 &response,
513 NULL));
514 EXPECT_FALSE(response.update_exists);
515}
516
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700517TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
518 OmahaResponse response;
519 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700520 params.set_wall_clock_based_wait_enabled(true);
521 params.set_update_check_count_wait_enabled(false);
522 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700523
524 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800525 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700526 &prefs_dir));
527 ScopedDirRemover temp_dir_remover(prefs_dir);
528
529 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700530 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700531 << "Failed to initialize preferences.";
532
533 ASSERT_FALSE(
534 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700535 NULL, // payload_state
536 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700537 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700538 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700539 GetUpdateResponse2(OmahaRequestParams::kAppId,
540 "1.2.3.4", // version
541 "http://more/info",
542 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700543 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700544 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700545 "HASH1234=", // checksum
546 "false", // needs admin
547 "123", // size
548 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700549 "7", // max days to scatter
550 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700551 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700552 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700553 -1,
554 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700555 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800556 metrics::CheckResult::kUpdateAvailable,
557 metrics::CheckReaction::kDeferring,
558 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700559 &response,
560 NULL));
561 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700562
563 // Verify if we are interactive check we don't defer.
564 params.set_interactive(true);
565 ASSERT_TRUE(
566 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700567 NULL, // payload_state
568 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700569 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700570 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700571 GetUpdateResponse2(OmahaRequestParams::kAppId,
572 "1.2.3.4", // version
573 "http://more/info",
574 "true", // prompt
575 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700576 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -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
Chris Sosa968d0572013-08-23 14:46:02 -0700585 -1,
586 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700587 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800588 metrics::CheckResult::kUpdateAvailable,
589 metrics::CheckReaction::kUpdating,
590 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700591 &response,
592 NULL));
593 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700594}
595
596TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
597 OmahaResponse response;
598 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700599 params.set_wall_clock_based_wait_enabled(false);
600 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700601
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700602 params.set_update_check_count_wait_enabled(true);
603 params.set_min_update_checks_needed(1);
604 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700605
606 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800607 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700608 &prefs_dir));
609 ScopedDirRemover temp_dir_remover(prefs_dir);
610
611 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700612 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700613 << "Failed to initialize preferences.";
614
615 ASSERT_TRUE(
616 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700617 NULL, // payload_state
618 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700619 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700620 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700621 GetUpdateResponse2(OmahaRequestParams::kAppId,
622 "1.2.3.4", // version
623 "http://more/info",
624 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700625 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700626 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700627 "HASH1234=", // checksum
628 "false", // needs admin
629 "123", // size
630 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700631 "7", // max days to scatter
632 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700633 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700634 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700635 -1,
636 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700637 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800638 metrics::CheckResult::kUpdateAvailable,
639 metrics::CheckReaction::kUpdating,
640 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700641 &response,
642 NULL));
643 EXPECT_TRUE(response.update_exists);
644}
645
646TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
647 OmahaResponse response;
648 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700649 params.set_wall_clock_based_wait_enabled(true);
650 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700651
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700652 params.set_update_check_count_wait_enabled(true);
653 params.set_min_update_checks_needed(1);
654 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700655
656 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800657 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700658 &prefs_dir));
659 ScopedDirRemover temp_dir_remover(prefs_dir);
660
661 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700662 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700663 << "Failed to initialize preferences.";
664
665 ASSERT_TRUE(
666 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700667 NULL, // payload_state
668 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700669 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700670 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700671 GetUpdateResponse2(OmahaRequestParams::kAppId,
672 "1.2.3.4", // version
673 "http://more/info",
674 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700675 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700676 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700677 "HASH1234=", // checksum
678 "false", // needs admin
679 "123", // size
680 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700681 "0", // max days to scatter
682 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700683 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700684 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700685 -1,
686 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700687 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800688 metrics::CheckResult::kUpdateAvailable,
689 metrics::CheckReaction::kUpdating,
690 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700691 &response,
692 NULL));
693 EXPECT_TRUE(response.update_exists);
694}
695
696
697TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
698 OmahaResponse response;
699 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700700 params.set_wall_clock_based_wait_enabled(true);
701 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700702
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700703 params.set_update_check_count_wait_enabled(true);
704 params.set_min_update_checks_needed(0);
705 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700706
707 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800708 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700709 &prefs_dir));
710 ScopedDirRemover temp_dir_remover(prefs_dir);
711
712 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700713 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700714 << "Failed to initialize preferences.";
715
716 ASSERT_TRUE(TestUpdateCheck(
717 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700718 NULL, // payload_state
719 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700720 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700721 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700722 GetUpdateResponse2(OmahaRequestParams::kAppId,
723 "1.2.3.4", // version
724 "http://more/info",
725 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700726 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700727 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700728 "HASH1234=", // checksum
729 "false", // needs admin
730 "123", // size
731 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700732 "7", // max days to scatter
733 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700734 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700735 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700736 -1,
737 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700738 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800739 metrics::CheckResult::kUpdateAvailable,
740 metrics::CheckReaction::kUpdating,
741 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700742 &response,
743 NULL));
744
Ben Chan9abb7632014-08-07 00:10:53 -0700745 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700746 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700747 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700748 EXPECT_TRUE(response.update_exists);
749}
750
751TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
752 OmahaResponse response;
753 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700754 params.set_wall_clock_based_wait_enabled(true);
755 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700756
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700757 params.set_update_check_count_wait_enabled(true);
758 params.set_min_update_checks_needed(1);
759 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700760
761 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800762 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700763 &prefs_dir));
764 ScopedDirRemover temp_dir_remover(prefs_dir);
765
766 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700767 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768 << "Failed to initialize preferences.";
769
770 ASSERT_FALSE(TestUpdateCheck(
771 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700772 NULL, // payload_state
773 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700774 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700775 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700776 GetUpdateResponse2(OmahaRequestParams::kAppId,
777 "1.2.3.4", // version
778 "http://more/info",
779 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700780 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700781 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700782 "HASH1234=", // checksum
783 "false", // needs admin
784 "123", // size
785 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700786 "7", // max days to scatter
787 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700788 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700789 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700790 -1,
791 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700792 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800793 metrics::CheckResult::kUpdateAvailable,
794 metrics::CheckReaction::kDeferring,
795 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700796 &response,
797 NULL));
798
Ben Chan9abb7632014-08-07 00:10:53 -0700799 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700800 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700801 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700802 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700803
804 // Verify if we are interactive check we don't defer.
805 params.set_interactive(true);
806 ASSERT_TRUE(
807 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700808 NULL, // payload_state
809 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700810 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700811 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700812 GetUpdateResponse2(OmahaRequestParams::kAppId,
813 "1.2.3.4", // version
814 "http://more/info",
815 "true", // prompt
816 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700817 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700818 "HASH1234=", // checksum
819 "false", // needs admin
820 "123", // size
821 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700822 "7", // max days to scatter
823 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700824 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700825 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700826 -1,
827 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700828 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800829 metrics::CheckResult::kUpdateAvailable,
830 metrics::CheckReaction::kUpdating,
831 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700832 &response,
833 NULL));
834 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700835}
836
837TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
838 OmahaResponse response;
839 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700840 params.set_wall_clock_based_wait_enabled(true);
841 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700842
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700843 params.set_update_check_count_wait_enabled(true);
844 params.set_min_update_checks_needed(1);
845 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700846
847 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800848 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700849 &prefs_dir));
850 ScopedDirRemover temp_dir_remover(prefs_dir);
851
852 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700853 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700854 << "Failed to initialize preferences.";
855
856 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
857
858 ASSERT_FALSE(TestUpdateCheck(
859 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700860 NULL, // payload_state
861 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700862 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700863 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700864 GetUpdateResponse2(OmahaRequestParams::kAppId,
865 "1.2.3.4", // version
866 "http://more/info",
867 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700868 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700869 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700870 "HASH1234=", // checksum
871 "false", // needs admin
872 "123", // size
873 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700874 "7", // max days to scatter
875 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700876 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700877 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700878 -1,
879 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700880 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800881 metrics::CheckResult::kUpdateAvailable,
882 metrics::CheckReaction::kDeferring,
883 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700884 &response,
885 NULL));
886
Ben Chan9abb7632014-08-07 00:10:53 -0700887 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700888 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
889 // count remains the same, as the decrementing happens in update_attempter
890 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700891 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700892 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700893
894 // Verify if we are interactive check we don't defer.
895 params.set_interactive(true);
896 ASSERT_TRUE(
897 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700898 NULL, // payload_state
899 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700900 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700901 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700902 GetUpdateResponse2(OmahaRequestParams::kAppId,
903 "1.2.3.4", // version
904 "http://more/info",
905 "true", // prompt
906 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700907 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700908 "HASH1234=", // checksum
909 "false", // needs admin
910 "123", // size
911 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700912 "7", // max days to scatter
913 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700914 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700915 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700916 -1,
917 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700918 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800919 metrics::CheckResult::kUpdateAvailable,
920 metrics::CheckReaction::kUpdating,
921 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700922 &response,
923 NULL));
924 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700925}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700926
Darin Petkov6a5b3222010-07-13 14:55:28 -0700927TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700928 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
929
930 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
931
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700932 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700933 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700934 fake_system_state.set_request_params(&params);
935 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700936 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800937 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700938 NULL),
939 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700940 OmahaRequestActionTestProcessorDelegate delegate;
941 delegate.loop_ = loop;
942 ActionProcessor processor;
943 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700944 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700945
946 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
947 g_main_loop_run(loop);
948 g_main_loop_unref(loop);
949 EXPECT_FALSE(processor.IsRunning());
950}
951
952TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700953 OmahaResponse response;
954 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700955 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700956 NULL, // payload_state
957 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700958 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700959 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700960 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700961 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700962 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700963 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800964 metrics::CheckResult::kParsingError,
965 metrics::CheckReaction::kUnset,
966 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700967 &response,
968 NULL));
969 EXPECT_FALSE(response.update_exists);
970}
971
972TEST(OmahaRequestActionTest, EmptyResponseTest) {
973 OmahaResponse response;
974 ASSERT_FALSE(
975 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700976 NULL, // payload_state
977 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700978 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700979 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -0700980 "",
981 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700982 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700983 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800984 metrics::CheckResult::kParsingError,
985 metrics::CheckReaction::kUnset,
986 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700987 &response,
988 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700989 EXPECT_FALSE(response.update_exists);
990}
991
992TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700993 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700994 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700995 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700996 NULL, // payload_state
997 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700998 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700999 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001000 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1001 "<daystart elapsed_seconds=\"100\"/>"
1002 "<app appid=\"foo\" status=\"ok\">"
1003 "<ping status=\"ok\"/>"
1004 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001005 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001006 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001007 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001008 metrics::CheckResult::kParsingError,
1009 metrics::CheckReaction::kUnset,
1010 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001011 &response,
1012 NULL));
1013 EXPECT_FALSE(response.update_exists);
1014}
1015
1016TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001017 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001018 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001019 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001020 NULL, // payload_state
1021 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001022 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001023 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001024 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1025 "<daystart elapsed_seconds=\"100\"/>"
1026 "<app appid=\"foo\" status=\"ok\">"
1027 "<ping status=\"ok\"/>"
1028 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001029 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001030 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001031 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001032 metrics::CheckResult::kParsingError,
1033 metrics::CheckReaction::kUnset,
1034 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001035 &response,
1036 NULL));
1037 EXPECT_FALSE(response.update_exists);
1038}
1039
1040TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001041 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001042 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001043 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001044 NULL, // payload_state
1045 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001046 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001047 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001048 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1049 "<daystart elapsed_seconds=\"100\"/>"
1050 "<app appid=\"foo\" status=\"ok\">"
1051 "<ping status=\"ok\"/>"
1052 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001053 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001054 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001055 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001056 metrics::CheckResult::kParsingError,
1057 metrics::CheckReaction::kUnset,
1058 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001059 &response,
1060 NULL));
1061 EXPECT_FALSE(response.update_exists);
1062}
1063
1064TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001065 string input_response =
1066 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1067 "<daystart elapsed_seconds=\"100\"/>"
1068 "<app appid=\"xyz\" status=\"ok\">"
1069 "<updatecheck status=\"ok\">"
1070 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001071 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001072 "<packages><package hash=\"not-used\" name=\"f\" "
1073 "size=\"587\"/></packages>"
1074 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001075 "ChromeOSVersion=\"10.2.3.4\" "
1076 "Prompt=\"false\" "
1077 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001078 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001079 "sha256=\"lkq34j5345\" "
1080 "needsadmin=\"true\" "
1081 "/></actions></manifest></updatecheck></app></response>";
1082 LOG(INFO) << "Input Response = " << input_response;
1083
Darin Petkov6a5b3222010-07-13 14:55:28 -07001084 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001085 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001086 NULL, // payload_state
1087 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001088 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001089 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001090 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001091 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001092 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001093 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001094 metrics::CheckResult::kUpdateAvailable,
1095 metrics::CheckReaction::kUpdating,
1096 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001097 &response,
1098 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001099 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001100 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001101 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001102 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001103 EXPECT_EQ("lkq34j5345", response.hash);
1104 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001105 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001106 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001107}
1108
1109namespace {
1110class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1111 public:
1112 void ProcessingStopped(const ActionProcessor* processor) {
1113 ASSERT_TRUE(loop_);
1114 g_main_loop_quit(loop_);
1115 }
1116 GMainLoop *loop_;
1117};
1118
1119gboolean TerminateTransferTestStarter(gpointer data) {
1120 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1121 processor->StartProcessing();
1122 CHECK(processor->IsRunning());
1123 processor->StopProcessing();
1124 return FALSE;
1125}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001126} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001127
1128TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001129 string http_response("doesn't matter");
1130 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1131
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001132 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001133 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001134 fake_system_state.set_request_params(&params);
1135 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001136 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001137 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001138 NULL),
1139 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001140 TerminateEarlyTestProcessorDelegate delegate;
1141 delegate.loop_ = loop;
1142 ActionProcessor processor;
1143 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001144 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001145
1146 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1147 g_main_loop_run(loop);
1148 g_main_loop_unref(loop);
1149}
1150
1151TEST(OmahaRequestActionTest, XmlEncodeTest) {
1152 EXPECT_EQ("ab", XmlEncode("ab"));
1153 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001154 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1155 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1156
1157 vector<char> post_data;
1158
1159 // Make sure XML Encode is being called on the params
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001160 FakeSystemState fake_system_state;
1161 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001162 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001163 OmahaRequestParams::kOsVersion,
1164 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001165 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001166 OmahaRequestParams::kAppId,
1167 "0.1.0.0",
1168 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001169 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001170 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001171 "ChromeOSFirmware.1.0",
1172 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001173 false, // delta okay
1174 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001175 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001176 false, // update_disabled
1177 "", // target_version_prefix
1178 false, // use_p2p_for_downloading
1179 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001180 OmahaResponse response;
1181 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001182 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001183 NULL, // payload_state
1184 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001185 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001186 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001187 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001188 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001189 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001190 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001191 metrics::CheckResult::kParsingError,
1192 metrics::CheckReaction::kUnset,
1193 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001194 &response,
1195 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001196 // convert post_data to string
1197 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001198 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1199 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001200 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1201 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1202 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1203 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001204 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1205 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001206}
1207
1208TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001209 OmahaResponse response;
1210 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001211 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001212 NULL, // payload_state
1213 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001214 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001215 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001216 GetUpdateResponse(OmahaRequestParams::kAppId,
1217 "1.2.3.4", // version
1218 "testthe&lt;url", // more info
1219 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001220 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001221 "file.signed", // file name
1222 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001223 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001224 "123", // size
1225 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001226 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001227 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001228 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001229 metrics::CheckResult::kUpdateAvailable,
1230 metrics::CheckReaction::kUpdating,
1231 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001232 &response,
1233 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001234
1235 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001236 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001237 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001238}
1239
1240TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001241 OmahaResponse response;
1242 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001243 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001244 NULL, // payload_state
1245 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001246 NULL, // 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 "theurl", // more info
1251 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001252 "thecodebase/", // 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
Ben Chan9abb7632014-08-07 00:10:53 -07001256 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001257 "123123123123123", // size
1258 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001259 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001260 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001261 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001262 metrics::CheckResult::kUpdateAvailable,
1263 metrics::CheckReaction::kUpdating,
1264 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001265 &response,
1266 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001267
1268 EXPECT_EQ(response.size, 123123123123123ll);
1269}
1270
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001271TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
1272 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001273 NiceMock<PrefsMock> prefs;
1274 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1275 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001276 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -08001277 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001278 NULL, // payload_state
1279 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001280 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001281 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001282 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001283 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001284 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001285 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001286 metrics::CheckResult::kParsingError,
1287 metrics::CheckReaction::kUnset,
1288 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001289 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001290 &post_data));
1291 // convert post_data to string
1292 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001293 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001294 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001295 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001296 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001297 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1298 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001299 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1300 string::npos);
1301 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1302 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001303}
1304
Jay Srinivasan0a708742012-03-20 11:26:12 -07001305
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001306TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -08001307 vector<char> post_data;
1308 NiceMock<PrefsMock> prefs;
1309 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -07001310 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001311 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -07001312 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001313 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -08001314 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001315 NULL, // payload_state
1316 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001317 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001318 &params,
Darin Petkov95508da2011-01-05 12:42:29 -08001319 "invalid xml>",
1320 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001321 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001322 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001323 metrics::CheckResult::kParsingError,
1324 metrics::CheckReaction::kUnset,
1325 metrics::DownloadErrorCode::kUnset,
Darin Petkov95508da2011-01-05 12:42:29 -08001326 NULL, // response
1327 &post_data));
1328 // convert post_data to string
1329 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001330 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001331 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001332 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001333 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001334 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1335 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001336 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1337 string::npos);
1338 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1339 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001340}
1341
Darin Petkove17f86b2010-07-20 09:12:01 -07001342TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1343 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001344 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001345 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1346 "invalid xml>",
1347 &post_data);
1348 // convert post_data to string
1349 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001350 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001351 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001352 OmahaEvent::kTypeUpdateDownloadStarted,
1353 OmahaEvent::kResultSuccess);
1354 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001355 EXPECT_EQ(post_str.find("ping"), string::npos);
1356 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001357}
1358
1359TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1360 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001361 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001362 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1363 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001364 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001365 "invalid xml>",
1366 &post_data);
1367 // convert post_data to string
1368 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001369 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001370 " <event eventtype=\"%d\" eventresult=\"%d\" "
1371 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001372 OmahaEvent::kTypeDownloadComplete,
1373 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001374 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001375 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001376 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001377}
1378
1379TEST(OmahaRequestActionTest, IsEventTest) {
1380 string http_response("doesn't matter");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001381 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001382 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001383 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001384 OmahaRequestAction update_check_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001385 &fake_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001386 NULL,
1387 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001388 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001389 NULL),
1390 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001391 EXPECT_FALSE(update_check_action.IsEvent());
1392
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001393 params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001394 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001395 OmahaRequestAction event_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001396 &fake_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001397 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001398 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001399 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001400 NULL),
1401 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001402 EXPECT_TRUE(event_action.IsEvent());
1403}
1404
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001405TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1406 for (int i = 0; i < 2; i++) {
1407 bool delta_okay = i == 1;
1408 const char* delta_okay_str = delta_okay ? "true" : "false";
1409 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001410 FakeSystemState fake_system_state;
1411 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001412 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001413 OmahaRequestParams::kOsVersion,
1414 "service_pack",
1415 "x86-generic",
1416 OmahaRequestParams::kAppId,
1417 "0.1.0.0",
1418 "en-US",
1419 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001420 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001421 "ChromeOSFirmware.1.0",
1422 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001423 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001424 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001425 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001426 false, // update_disabled
1427 "", // target_version_prefix
1428 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001429 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001430 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001431 NULL, // payload_state
1432 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001433 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001434 &params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001435 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001436 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001437 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001438 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001439 metrics::CheckResult::kParsingError,
1440 metrics::CheckReaction::kUnset,
1441 metrics::DownloadErrorCode::kUnset,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001442 NULL,
1443 &post_data));
1444 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001445 string post_str(post_data.data(), post_data.size());
1446 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1447 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001448 string::npos)
1449 << "i = " << i;
1450 }
1451}
1452
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001453TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1454 for (int i = 0; i < 2; i++) {
1455 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001456 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001457 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001458 FakeSystemState fake_system_state;
1459 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001460 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001461 OmahaRequestParams::kOsVersion,
1462 "service_pack",
1463 "x86-generic",
1464 OmahaRequestParams::kAppId,
1465 "0.1.0.0",
1466 "en-US",
1467 "unittest_track",
1468 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001469 "ChromeOSFirmware.1.0",
1470 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001471 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001472 interactive,
1473 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001474 false, // update_disabled
1475 "", // target_version_prefix
1476 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001477 false); // use_p2p_for_sharing
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001478 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001479 NULL, // payload_state
1480 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001481 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001482 &params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001483 "invalid xml>",
1484 -1,
1485 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001486 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001487 metrics::CheckResult::kParsingError,
1488 metrics::CheckReaction::kUnset,
1489 metrics::DownloadErrorCode::kUnset,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001490 NULL,
1491 &post_data));
1492 // convert post_data to string
1493 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001494 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1495 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001496 string::npos)
1497 << "i = " << i;
1498 }
1499}
1500
Darin Petkove17f86b2010-07-20 09:12:01 -07001501TEST(OmahaRequestActionTest, OmahaEventTest) {
1502 OmahaEvent default_event;
1503 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1504 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001505 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001506
1507 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1508 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1509 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001510 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001511
1512 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1513 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001514 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001515 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1516 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001517 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001518}
1519
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001520TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001521 for (int ping_only = 0; ping_only < 2; ping_only++) {
1522 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001523 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1524 .Times(AnyNumber());
1525 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov265f2902011-05-09 15:17:40 -07001526 // Add a few hours to the day difference to test no rounding, etc.
1527 int64_t five_days_ago =
1528 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1529 int64_t six_days_ago =
1530 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001531 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1532 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov265f2902011-05-09 15:17:40 -07001533 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1534 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1535 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1536 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1537 vector<char> post_data;
1538 ASSERT_TRUE(
1539 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001540 NULL, // payload_state
1541 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001542 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001543 &kDefaultTestParams,
Darin Petkov265f2902011-05-09 15:17:40 -07001544 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1545 -1,
1546 ping_only,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001547 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001548 metrics::CheckResult::kUnset,
1549 metrics::CheckReaction::kUnset,
1550 metrics::DownloadErrorCode::kUnset,
Darin Petkov265f2902011-05-09 15:17:40 -07001551 NULL,
1552 &post_data));
1553 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001554 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001555 string::npos);
1556 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001557 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001558 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1559 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001560 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001561 EXPECT_NE(post_str.find("previousversion"), string::npos);
1562 }
1563 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001564}
1565
1566TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001567 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001568 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1569 .Times(AnyNumber());
1570 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001571 int64_t three_days_ago =
1572 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1573 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001574 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1575 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001576 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1577 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1578 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1579 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1580 vector<char> post_data;
1581 ASSERT_TRUE(
1582 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001583 NULL, // payload_state
1584 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001585 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001586 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001587 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001588 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001589 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001590 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001591 metrics::CheckResult::kNoUpdateAvailable,
1592 metrics::CheckReaction::kUnset,
1593 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001594 NULL,
1595 &post_data));
1596 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001597 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001598 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001599}
1600
1601TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001602 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001603 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1604 .Times(AnyNumber());
1605 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001606 int64_t four_days_ago =
1607 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1608 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001609 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1610 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001611 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1612 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1613 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1614 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1615 vector<char> post_data;
1616 ASSERT_TRUE(
1617 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001618 NULL, // payload_state
1619 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001620 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001621 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001622 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001623 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001624 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001625 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001626 metrics::CheckResult::kNoUpdateAvailable,
1627 metrics::CheckReaction::kUnset,
1628 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001629 NULL,
1630 &post_data));
1631 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001632 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001633 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001634}
1635
1636TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001637 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001638 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1639 .Times(AnyNumber());
1640 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001641 int64_t one_hour_ago =
1642 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001643 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1644 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001645 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1646 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1647 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1648 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1649 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1650 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1651 vector<char> post_data;
1652 ASSERT_TRUE(
1653 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001654 NULL, // payload_state
1655 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001656 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001657 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001658 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001659 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001660 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001661 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001662 metrics::CheckResult::kNoUpdateAvailable,
1663 metrics::CheckReaction::kUnset,
1664 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001665 NULL,
1666 &post_data));
1667 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001668 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001669}
1670
Thieu Leb44e9e82011-06-06 14:34:04 -07001671TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1672 // This test ensures that we ignore empty ping only requests.
1673 NiceMock<PrefsMock> prefs;
1674 int64_t now = Time::Now().ToInternalValue();
1675 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1676 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1677 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1678 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1679 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1680 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1681 vector<char> post_data;
1682 EXPECT_TRUE(
1683 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001684 NULL, // payload_state
1685 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001686 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001687 &kDefaultTestParams,
Thieu Leb44e9e82011-06-06 14:34:04 -07001688 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1689 -1,
1690 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001691 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001692 metrics::CheckResult::kUnset,
1693 metrics::CheckReaction::kUnset,
1694 metrics::DownloadErrorCode::kUnset,
Thieu Leb44e9e82011-06-06 14:34:04 -07001695 NULL,
1696 &post_data));
1697 EXPECT_EQ(post_data.size(), 0);
1698}
1699
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001700TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001701 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001702 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1703 .Times(AnyNumber());
1704 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001705 int64_t future =
1706 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001707 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1708 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001709 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1710 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1711 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1712 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1713 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1714 .WillOnce(Return(true));
1715 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1716 .WillOnce(Return(true));
1717 vector<char> post_data;
1718 ASSERT_TRUE(
1719 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001720 NULL, // payload_state
1721 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001722 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001723 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001724 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1725 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001726 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001727 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001728 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001729 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001730 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001731 metrics::CheckResult::kNoUpdateAvailable,
1732 metrics::CheckReaction::kUnset,
1733 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001734 NULL,
1735 &post_data));
1736 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001737 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001738}
1739
1740TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1741 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001742 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001743 // may fail if it runs for longer than 5 seconds. It shouldn't run
1744 // that long though.
1745 int64_t midnight =
1746 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1747 int64_t midnight_slack =
1748 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001749 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001750 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1751 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001752 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1753 AllOf(Ge(midnight), Le(midnight_slack))))
1754 .WillOnce(Return(true));
1755 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1756 AllOf(Ge(midnight), Le(midnight_slack))))
1757 .WillOnce(Return(true));
1758 ASSERT_TRUE(
1759 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001760 NULL, // payload_state
1761 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001762 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001763 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001764 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1765 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001766 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001767 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001768 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001769 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001770 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001771 metrics::CheckResult::kNoUpdateAvailable,
1772 metrics::CheckReaction::kUnset,
1773 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001774 NULL,
1775 NULL));
1776}
1777
1778TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001779 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001780 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1781 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001782 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1783 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1784 ASSERT_TRUE(
1785 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001786 NULL, // payload_state
1787 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001788 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001789 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001790 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1791 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001792 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001793 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001794 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001795 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001796 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001797 metrics::CheckResult::kNoUpdateAvailable,
1798 metrics::CheckReaction::kUnset,
1799 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001800 NULL,
1801 NULL));
1802}
1803
1804TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001805 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001806 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1807 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001808 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1809 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1810 ASSERT_TRUE(
1811 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001812 NULL, // payload_state
1813 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001814 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001815 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001816 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1817 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001818 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001819 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001820 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001821 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001822 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001823 metrics::CheckResult::kNoUpdateAvailable,
1824 metrics::CheckReaction::kUnset,
1825 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001826 NULL,
1827 NULL));
1828}
1829
Darin Petkov84c763c2010-07-29 16:27:58 -07001830TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1831 vector<char> post_data;
1832 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001833 NULL, // payload_state
1834 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001835 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001836 &kDefaultTestParams,
Darin Petkov84c763c2010-07-29 16:27:58 -07001837 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001838 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001839 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001840 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001841 metrics::CheckResult::kParsingError,
1842 metrics::CheckReaction::kUnset,
1843 metrics::DownloadErrorCode::kUnset,
Darin Petkov84c763c2010-07-29 16:27:58 -07001844 NULL, // response
1845 &post_data));
1846 // convert post_data to string
1847 string post_str(&post_data[0], post_data.size());
1848 EXPECT_EQ(post_str.find("machineid="), string::npos);
1849 EXPECT_EQ(post_str.find("userid="), string::npos);
1850}
1851
Darin Petkovedc522e2010-11-05 09:35:17 -07001852TEST(OmahaRequestActionTest, NetworkFailureTest) {
1853 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001854 const int http_error_code =
1855 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001856 ASSERT_FALSE(
1857 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001858 NULL, // payload_state
1859 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001860 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001861 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001862 "",
1863 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001864 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001865 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001866 metrics::CheckResult::kDownloadError,
1867 metrics::CheckReaction::kUnset,
1868 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001869 &response,
1870 NULL));
1871 EXPECT_FALSE(response.update_exists);
1872}
1873
1874TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1875 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001876 const int http_error_code =
1877 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001878 ASSERT_FALSE(
1879 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001880 NULL, // payload_state
1881 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001882 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001883 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001884 "",
1885 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001886 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001887 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001888 metrics::CheckResult::kDownloadError,
1889 metrics::CheckReaction::kUnset,
1890 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001891 &response,
1892 NULL));
1893 EXPECT_FALSE(response.update_exists);
1894}
1895
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001896TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1897 OmahaResponse response;
1898 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001899 params.set_wall_clock_based_wait_enabled(true);
1900 params.set_waiting_period(TimeDelta().FromDays(1));
1901 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001902
1903 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001904 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001905 &prefs_dir));
1906 ScopedDirRemover temp_dir_remover(prefs_dir);
1907
1908 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001909 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001910 << "Failed to initialize preferences.";
1911
1912 ASSERT_FALSE(TestUpdateCheck(
1913 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001914 NULL, // payload_state
1915 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001916 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001917 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001918 GetUpdateResponse2(OmahaRequestParams::kAppId,
1919 "1.2.3.4", // version
1920 "http://more/info",
1921 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001922 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001923 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001924 "HASH1234=", // checksum
1925 "false", // needs admin
1926 "123", // size
1927 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001928 "7", // max days to scatter
1929 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001930 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001931 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001932 -1,
1933 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001934 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001935 metrics::CheckResult::kUpdateAvailable,
1936 metrics::CheckReaction::kDeferring,
1937 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001938 &response,
1939 NULL));
1940
Ben Chan9abb7632014-08-07 00:10:53 -07001941 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001942 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001943 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001944 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001945
1946 // Verify if we are interactive check we don't defer.
1947 params.set_interactive(true);
1948 ASSERT_TRUE(
1949 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001950 NULL, // payload_state
1951 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001952 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001953 &params,
Chris Sosa968d0572013-08-23 14:46:02 -07001954 GetUpdateResponse2(OmahaRequestParams::kAppId,
1955 "1.2.3.4", // version
1956 "http://more/info",
1957 "true", // prompt
1958 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001959 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001960 "HASH1234=", // checksum
1961 "false", // needs admin
1962 "123", // size
1963 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001964 "7", // max days to scatter
1965 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001966 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001967 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001968 -1,
1969 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001970 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001971 metrics::CheckResult::kUpdateAvailable,
1972 metrics::CheckReaction::kUpdating,
1973 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001974 &response,
1975 NULL));
1976 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001977}
1978
1979TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1980 OmahaResponse response;
1981 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001982 params.set_wall_clock_based_wait_enabled(true);
1983 params.set_waiting_period(TimeDelta().FromDays(1));
1984 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001985
1986 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001987 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001988 &prefs_dir));
1989 ScopedDirRemover temp_dir_remover(prefs_dir);
1990
1991 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001992 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001993 << "Failed to initialize preferences.";
1994
1995 // Set the timestamp to a very old value such that it exceeds the
1996 // waiting period set above.
1997 Time t1;
1998 Time::FromString("1/1/2012", &t1);
1999 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2000 ASSERT_TRUE(TestUpdateCheck(
2001 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07002002 NULL, // payload_state
2003 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002004 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002005 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002006 GetUpdateResponse2(OmahaRequestParams::kAppId,
2007 "1.2.3.4", // version
2008 "http://more/info",
2009 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002010 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002011 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002012 "HASH1234=", // checksum
2013 "false", // needs admin
2014 "123", // size
2015 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002016 "7", // max days to scatter
2017 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002018 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002019 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002020 -1,
2021 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002022 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002023 metrics::CheckResult::kUpdateAvailable,
2024 metrics::CheckReaction::kUpdating,
2025 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002026 &response,
2027 NULL));
2028
2029 EXPECT_TRUE(response.update_exists);
2030
2031 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07002032 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002033 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
2034 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2035}
2036
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002037TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002038 // Create a uniquely named test directory.
2039 string test_dir;
2040 ASSERT_TRUE(utils::MakeTempDirectory(
2041 "omaha_request_action-test-XXXXXX", &test_dir));
2042
2043 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2044 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002045 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002046 vector<char> post_data;
2047 NiceMock<PrefsMock> prefs;
2048 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002049 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002050 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2051 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2052 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2053 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002054 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002055 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
2056 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2057 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002058 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002059 params.SetLockDown(false);
2060 params.Init("1.2.3.4", "", 0);
2061 EXPECT_EQ("canary-channel", params.current_channel());
2062 EXPECT_EQ("stable-channel", params.target_channel());
2063 EXPECT_TRUE(params.to_more_stable_channel());
2064 EXPECT_TRUE(params.is_powerwash_allowed());
2065 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002066 NULL, // payload_state
2067 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002068 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002069 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002070 "invalid xml>",
2071 -1,
2072 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002073 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002074 metrics::CheckResult::kParsingError,
2075 metrics::CheckReaction::kUnset,
2076 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002077 NULL, // response
2078 &post_data));
2079 // convert post_data to string
2080 string post_str(&post_data[0], post_data.size());
2081 EXPECT_NE(string::npos, post_str.find(
2082 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2083 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2084 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002085
2086 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002087}
2088
2089TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002090 // Create a uniquely named test directory.
2091 string test_dir;
2092 ASSERT_TRUE(utils::MakeTempDirectory(
2093 "omaha_request_action-test-XXXXXX", &test_dir));
2094
2095 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2096 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002097 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002098 vector<char> post_data;
2099 NiceMock<PrefsMock> prefs;
2100 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002101 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002102 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2103 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2104 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2105 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002106 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002107 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2108 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002109 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002110 params.SetLockDown(false);
2111 params.Init("5.6.7.8", "", 0);
2112 EXPECT_EQ("stable-channel", params.current_channel());
2113 EXPECT_EQ("canary-channel", params.target_channel());
2114 EXPECT_FALSE(params.to_more_stable_channel());
2115 EXPECT_FALSE(params.is_powerwash_allowed());
2116 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002117 NULL, // payload_state
2118 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002119 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002120 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002121 "invalid xml>",
2122 -1,
2123 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002124 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002125 metrics::CheckResult::kParsingError,
2126 metrics::CheckReaction::kUnset,
2127 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002128 NULL, // response
2129 &post_data));
2130 // convert post_data to string
2131 string post_str(&post_data[0], post_data.size());
2132 EXPECT_NE(string::npos, post_str.find(
2133 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2134 "version=\"5.6.7.8\" "
2135 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002136 EXPECT_EQ(string::npos, post_str.find("from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002137
2138 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002139}
2140
David Zeuthen8f191b22013-08-06 12:27:50 -07002141void P2PTest(bool initial_allow_p2p_for_downloading,
2142 bool initial_allow_p2p_for_sharing,
2143 bool omaha_disable_p2p_for_downloading,
2144 bool omaha_disable_p2p_for_sharing,
2145 bool payload_state_allow_p2p_attempt,
2146 bool expect_p2p_client_lookup,
2147 const string& p2p_client_result_url,
2148 bool expected_allow_p2p_for_downloading,
2149 bool expected_allow_p2p_for_sharing,
2150 const string& expected_p2p_url) {
2151 OmahaResponse response;
2152 OmahaRequestParams request_params = kDefaultTestParams;
2153 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
2154 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
2155
2156 MockPayloadState mock_payload_state;
2157 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2158 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
2159 MockP2PManager mock_p2p_manager;
2160 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2161
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002162 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2163 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002164 .Times(expect_p2p_client_lookup ? 1 : 0);
2165
2166 ASSERT_TRUE(
2167 TestUpdateCheck(NULL, // prefs
2168 &mock_payload_state,
2169 &mock_p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -07002170 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002171 &request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07002172 GetUpdateResponse2(OmahaRequestParams::kAppId,
2173 "1.2.3.4", // version
2174 "http://more/info",
2175 "true", // prompt
2176 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002177 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07002178 "HASH1234=", // checksum
2179 "false", // needs admin
2180 "123", // size
2181 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002182 "7", // max days to scatter
2183 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002184 omaha_disable_p2p_for_downloading,
2185 omaha_disable_p2p_for_sharing),
2186 -1,
2187 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002188 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002189 metrics::CheckResult::kUpdateAvailable,
2190 metrics::CheckReaction::kUpdating,
2191 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002192 &response,
2193 NULL));
2194 EXPECT_TRUE(response.update_exists);
2195
2196 EXPECT_EQ(response.disable_p2p_for_downloading,
2197 omaha_disable_p2p_for_downloading);
2198 EXPECT_EQ(response.disable_p2p_for_sharing,
2199 omaha_disable_p2p_for_sharing);
2200
2201 EXPECT_EQ(request_params.use_p2p_for_downloading(),
2202 expected_allow_p2p_for_downloading);
2203
2204 EXPECT_EQ(request_params.use_p2p_for_sharing(),
2205 expected_allow_p2p_for_sharing);
2206
2207 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
2208}
2209
2210TEST(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002211 P2PTest(true, // initial_allow_p2p_for_downloading
2212 true, // initial_allow_p2p_for_sharing
2213 false, // omaha_disable_p2p_for_downloading
2214 false, // omaha_disable_p2p_for_sharing
2215 true, // payload_state_allow_p2p_attempt
2216 true, // expect_p2p_client_lookup
2217 "http://1.3.5.7/p2p", // p2p_client_result_url
2218 true, // expected_allow_p2p_for_downloading
2219 true, // expected_allow_p2p_for_sharing
2220 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002221}
2222
2223TEST(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002224 P2PTest(true, // initial_allow_p2p_for_downloading
2225 true, // initial_allow_p2p_for_sharing
2226 false, // omaha_disable_p2p_for_downloading
2227 false, // omaha_disable_p2p_for_sharing
2228 true, // payload_state_allow_p2p_attempt
2229 true, // expect_p2p_client_lookup
2230 "", // p2p_client_result_url
2231 false, // expected_allow_p2p_for_downloading
2232 true, // expected_allow_p2p_for_sharing
2233 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002234}
2235
2236TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002237 P2PTest(false, // initial_allow_p2p_for_downloading
2238 true, // initial_allow_p2p_for_sharing
2239 false, // omaha_disable_p2p_for_downloading
2240 false, // omaha_disable_p2p_for_sharing
2241 true, // payload_state_allow_p2p_attempt
2242 false, // expect_p2p_client_lookup
2243 "unset", // p2p_client_result_url
2244 false, // expected_allow_p2p_for_downloading
2245 true, // expected_allow_p2p_for_sharing
2246 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002247}
2248
2249TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002250 P2PTest(true, // initial_allow_p2p_for_downloading
2251 true, // initial_allow_p2p_for_sharing
2252 true, // omaha_disable_p2p_for_downloading
2253 false, // omaha_disable_p2p_for_sharing
2254 true, // payload_state_allow_p2p_attempt
2255 false, // expect_p2p_client_lookup
2256 "unset", // p2p_client_result_url
2257 false, // expected_allow_p2p_for_downloading
2258 true, // expected_allow_p2p_for_sharing
2259 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002260}
2261
2262TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002263 P2PTest(true, // initial_allow_p2p_for_downloading
2264 true, // initial_allow_p2p_for_sharing
2265 false, // omaha_disable_p2p_for_downloading
2266 true, // omaha_disable_p2p_for_sharing
2267 true, // payload_state_allow_p2p_attempt
2268 true, // expect_p2p_client_lookup
2269 "http://1.3.5.7/p2p", // p2p_client_result_url
2270 true, // expected_allow_p2p_for_downloading
2271 false, // expected_allow_p2p_for_sharing
2272 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002273}
2274
2275TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002276 P2PTest(true, // initial_allow_p2p_for_downloading
2277 true, // initial_allow_p2p_for_sharing
2278 true, // omaha_disable_p2p_for_downloading
2279 true, // omaha_disable_p2p_for_sharing
2280 true, // payload_state_allow_p2p_attempt
2281 false, // expect_p2p_client_lookup
2282 "unset", // p2p_client_result_url
2283 false, // expected_allow_p2p_for_downloading
2284 false, // expected_allow_p2p_for_sharing
2285 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002286}
2287
David Zeuthen639aa362014-02-03 16:23:44 -08002288bool InstallDateParseHelper(const std::string &elapsed_days,
2289 PrefsInterface* prefs,
2290 OmahaResponse *response) {
2291 return
2292 TestUpdateCheck(prefs,
2293 NULL, // payload_state
2294 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002295 NULL, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002296 &kDefaultTestParams,
David Zeuthen639aa362014-02-03 16:23:44 -08002297 GetUpdateResponse2(OmahaRequestParams::kAppId,
2298 "1.2.3.4", // version
2299 "http://more/info",
2300 "true", // prompt
2301 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002302 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002303 "HASH1234=", // checksum
2304 "false", // needs admin
2305 "123", // size
2306 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002307 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002308 elapsed_days,
2309 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002310 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002311 -1,
2312 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002313 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002314 metrics::CheckResult::kUpdateAvailable,
2315 metrics::CheckReaction::kUpdating,
2316 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002317 response,
2318 NULL);
2319}
2320
2321TEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2322 OmahaResponse response;
2323 string temp_dir;
2324 Prefs prefs;
2325 EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2326 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002327 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002328
2329 // Check that we parse elapsed_days in the Omaha Response correctly.
2330 // and that the kPrefsInstallDateDays value is written to.
2331 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2332 EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2333 EXPECT_TRUE(response.update_exists);
2334 EXPECT_EQ(42, response.install_date_days);
2335 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2336 int64_t prefs_days;
2337 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2338 EXPECT_EQ(prefs_days, 42);
2339
2340 // If there already is a value set, we shouldn't do anything.
2341 EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2342 EXPECT_TRUE(response.update_exists);
2343 EXPECT_EQ(7, response.install_date_days);
2344 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2345 EXPECT_EQ(prefs_days, 42);
2346
2347 // Note that elapsed_days is not necessarily divisible by 7 so check
2348 // that we round down correctly when populating kPrefsInstallDateDays.
2349 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2350 EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2351 EXPECT_TRUE(response.update_exists);
2352 EXPECT_EQ(23, response.install_date_days);
2353 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2354 EXPECT_EQ(prefs_days, 21);
2355
2356 // Check that we correctly handle elapsed_days not being included in
2357 // the Omaha Response.
2358 EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2359 EXPECT_TRUE(response.update_exists);
2360 EXPECT_EQ(-1, response.install_date_days);
2361
2362 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2363}
2364
2365TEST(OmahaRequestActionTest, GetInstallDate) {
2366 string temp_dir;
2367 Prefs prefs;
2368 EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2369 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002370 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002371
2372 // If there is no prefs and OOBE is not complete, we should not
2373 // report anything to Omaha.
2374 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002375 FakeSystemState system_state;
David Zeuthen639aa362014-02-03 16:23:44 -08002376 system_state.set_prefs(&prefs);
2377 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2378 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2379 }
2380
2381 // If OOBE is complete and happened on a valid date (e.g. after Jan
2382 // 1 2007 0:00 PST), that date should be used and written to
2383 // prefs. However, first try with an invalid date and check we do
2384 // nothing.
2385 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002386 FakeSystemState fake_system_state;
2387 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002388
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002389 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002390 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2391 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
David Zeuthen639aa362014-02-03 16:23:44 -08002392 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2393 }
2394
2395 // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2396 // should yield an InstallDate of 14.
2397 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002398 FakeSystemState fake_system_state;
2399 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002400
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002401 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002402 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2403 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002404 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2405
2406 int64_t prefs_days;
2407 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2408 EXPECT_EQ(prefs_days, 14);
2409 }
2410
2411 // Now that we have a valid date in prefs, check that we keep using
2412 // that even if OOBE date reports something else. The date Jan 30,
2413 // 2007 0:00 PST should yield an InstallDate of 28... but since
2414 // there's a prefs file, we should still get 14.
2415 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002416 FakeSystemState fake_system_state;
2417 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002418
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002419 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002420 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2421 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002422
2423 int64_t prefs_days;
2424 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2425 EXPECT_EQ(prefs_days, 14);
2426
2427 // If we delete the prefs file, we should get 28 days.
2428 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002429 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002430 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2431 EXPECT_EQ(prefs_days, 28);
2432 }
2433
2434 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2435}
2436
Darin Petkov6a5b3222010-07-13 14:55:28 -07002437} // namespace chromeos_update_engine