blob: 0248c22a9d33d700cbe0d98299cd8d8fda8ffa9e [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 "", // target_version_prefix
66 false, // use_p2p_for_downloading
67 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -070068
Darin Petkov6a5b3222010-07-13 14:55:28 -070069string GetNoUpdateResponse(const string& app_id) {
70 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070071 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
72 "<daystart elapsed_seconds=\"100\"/>"
73 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
74 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070075}
76
David Zeuthenf3e28012014-08-26 18:23:52 -040077string GetNoUpdateResponseWithEntity(const string& app_id) {
78 return string(
79 "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
80 "<!DOCTYPE response ["
81 "<!ENTITY CrOS \"ChromeOS\">"
82 "]>"
83 "<response protocol=\"3.0\">"
84 "<daystart elapsed_seconds=\"100\"/>"
85 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
86 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
87}
88
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070089string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -070090 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070091 const string& more_info_url,
92 const string& prompt,
93 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070094 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070095 const string& hash,
96 const string& needsadmin,
97 const string& size,
98 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -070099 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -0800100 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -0700101 bool disable_p2p_for_downloading,
102 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700103 string response =
104 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
105 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -0800106 "<daystart elapsed_seconds=\"100\"" +
107 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
108 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700109 "<app appid=\"" + app_id + "\" status=\"ok\">"
110 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
111 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700112 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700113 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
114 "size=\"" + size + "\"/></packages>"
115 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700116 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700117 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
118 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800119 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700120 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700121 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700122 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700123 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700124 (disable_p2p_for_downloading ?
125 "DisableP2PForDownloading=\"true\" " : "") +
126 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700127 "/></actions></manifest></updatecheck></app></response>";
128 LOG(INFO) << "Response = " << response;
129 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700130}
131
Darin Petkov6a5b3222010-07-13 14:55:28 -0700132string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700133 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 const string& more_info_url,
135 const string& prompt,
136 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700137 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700138 const string& hash,
139 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700140 const string& size,
141 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700142 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700143 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700144 more_info_url,
145 prompt,
146 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700147 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700148 hash,
149 needsadmin,
150 size,
151 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700152 "7",
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700153 "42", // elapsed_days
154 false, // disable_p2p_for_downloading
155 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700156}
157
158class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
159 public:
160 OmahaRequestActionTestProcessorDelegate()
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700161 : loop_(nullptr),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700162 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700163 virtual ~OmahaRequestActionTestProcessorDelegate() {
164 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700165 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700166 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700167 ASSERT_TRUE(loop_);
168 g_main_loop_quit(loop_);
169 }
170
171 virtual void ActionCompleted(ActionProcessor* processor,
172 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700173 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700174 // make sure actions always succeed
175 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700176 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700177 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700178 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700179 }
180 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700181 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700182};
183
184gboolean StartProcessorInRunLoop(gpointer data) {
185 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
186 processor->StartProcessing();
187 return FALSE;
188}
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700189} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -0700190
191class OutputObjectCollectorAction;
192
193template<>
194class ActionTraits<OutputObjectCollectorAction> {
195 public:
196 // Does not take an object for input
197 typedef OmahaResponse InputObjectType;
198 // On success, puts the output path on output
199 typedef NoneType OutputObjectType;
200};
201
202class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
203 public:
204 OutputObjectCollectorAction() : has_input_object_(false) {}
205 void PerformAction() {
206 // copy input object
207 has_input_object_ = HasInputObject();
208 if (has_input_object_)
209 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700210 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700211 }
212 // Should never be called
213 void TerminateProcessing() {
214 CHECK(false);
215 }
216 // Debugging/logging
217 static std::string StaticType() {
218 return "OutputObjectCollectorAction";
219 }
220 std::string Type() const { return StaticType(); }
221 bool has_input_object_;
222 OmahaResponse omaha_response_;
223};
224
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700225// Returns true iff an output response was obtained from the
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700226// OmahaRequestAction. |prefs| may be null, in which case a local PrefsMock
227// is used. |payload_state| may be null, in which case a local mock is used.
228// |p2p_manager| may be null, in which case a local mock is used.
229// |connection_manager| may be null, in which case a local mock is used.
230// out_response may be null. If |fail_http_response_code| is non-negative,
Darin Petkov265f2902011-05-09 15:17:40 -0700231// the transfer will fail with that code. |ping_only| is passed through to the
232// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
233// post-data received by the mock HttpFetcher is returned.
David Zeuthen33bae492014-02-25 16:16:18 -0800234//
235// The |expected_check_result|, |expected_check_reaction| and
236// |expected_error_code| parameters are for checking expectations
237// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
238// UMA statistics. Use the appropriate ::kUnset value to specify that
239// the given metric should not be reported.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700240bool TestUpdateCheck(PrefsInterface* prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -0700241 PayloadStateInterface *payload_state,
242 P2PManager *p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -0700243 ConnectionManager *connection_manager,
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700244 OmahaRequestParams* params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700245 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700246 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700247 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700248 ErrorCode expected_code,
David Zeuthen33bae492014-02-25 16:16:18 -0800249 metrics::CheckResult expected_check_result,
250 metrics::CheckReaction expected_check_reaction,
251 metrics::DownloadErrorCode expected_download_error_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700252 OmahaResponse* out_response,
253 vector<char>* out_post_data) {
254 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
255 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800256 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700257 nullptr);
Darin Petkovedc522e2010-11-05 09:35:17 -0700258 if (fail_http_response_code >= 0) {
259 fetcher->FailTransfer(fail_http_response_code);
260 }
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700261 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800262 if (prefs)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700263 fake_system_state.set_prefs(prefs);
David Zeuthen8f191b22013-08-06 12:27:50 -0700264 if (payload_state)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700265 fake_system_state.set_payload_state(payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -0700266 if (p2p_manager)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700267 fake_system_state.set_p2p_manager(p2p_manager);
Chris Sosa77f79e82014-06-02 18:16:24 -0700268 if (connection_manager)
269 fake_system_state.set_connection_manager(connection_manager);
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700270 fake_system_state.set_request_params(params);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700271 OmahaRequestAction action(&fake_system_state,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700272 nullptr,
Thieu Le116fda32011-04-19 11:01:54 -0700273 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700274 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275 OmahaRequestActionTestProcessorDelegate delegate;
276 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700277 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700278
Darin Petkov6a5b3222010-07-13 14:55:28 -0700279 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700280 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700281 processor.EnqueueAction(&action);
282
283 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700284 BondActions(&action, &collector_action);
285 processor.EnqueueAction(&collector_action);
286
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700287 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800288 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700289 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800290 SendEnumToUMA(metrics::kMetricCheckResult,
291 static_cast<int>(expected_check_result),
292 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
293 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700294 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800295 SendEnumToUMA(metrics::kMetricCheckReaction,
296 static_cast<int>(expected_check_reaction),
297 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
298 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700299 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700300 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
301 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800302 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
303 ? 0 : 1);
304
Darin Petkov6a5b3222010-07-13 14:55:28 -0700305 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
306 g_main_loop_run(loop);
307 g_main_loop_unref(loop);
308 if (collector_action.has_input_object_ && out_response)
309 *out_response = collector_action.omaha_response_;
310 if (out_post_data)
311 *out_post_data = fetcher->post_data();
312 return collector_action.has_input_object_;
313}
314
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700315// Tests Event requests -- they should always succeed. |out_post_data|
316// may be null; if non-null, the post-data received by the mock
317// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700318void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700319 OmahaEvent* event,
320 const string& http_response,
321 vector<char>* out_post_data) {
322 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
323 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800324 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700325 nullptr);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700326 FakeSystemState fake_system_state;
327 fake_system_state.set_request_params(&params);
328 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700329 OmahaRequestActionTestProcessorDelegate delegate;
330 delegate.loop_ = loop;
331 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700332 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700333 processor.EnqueueAction(&action);
334
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700335 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
336 g_main_loop_run(loop);
337 g_main_loop_unref(loop);
338 if (out_post_data)
339 *out_post_data = fetcher->post_data();
340}
341
David Zeuthenf3e28012014-08-26 18:23:52 -0400342TEST(OmahaRequestActionTest, RejectEntities) {
343 OmahaResponse response;
344 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700345 TestUpdateCheck(nullptr, // prefs
346 nullptr, // payload_state
347 nullptr, // p2p_manager
348 nullptr, // connection_manager
David Zeuthenf3e28012014-08-26 18:23:52 -0400349 &kDefaultTestParams,
350 GetNoUpdateResponseWithEntity(OmahaRequestParams::kAppId),
351 -1,
352 false, // ping_only
353 ErrorCode::kOmahaRequestXMLHasEntityDecl,
354 metrics::CheckResult::kParsingError,
355 metrics::CheckReaction::kUnset,
356 metrics::DownloadErrorCode::kUnset,
357 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700358 nullptr));
David Zeuthenf3e28012014-08-26 18:23:52 -0400359 EXPECT_FALSE(response.update_exists);
360}
361
Darin Petkov6a5b3222010-07-13 14:55:28 -0700362TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700363 OmahaResponse response;
364 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700365 TestUpdateCheck(nullptr, // prefs
366 nullptr, // payload_state
367 nullptr, // p2p_manager
368 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700369 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700370 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700371 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700372 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700373 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800374 metrics::CheckResult::kNoUpdateAvailable,
375 metrics::CheckReaction::kUnset,
376 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700377 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700378 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700379 EXPECT_FALSE(response.update_exists);
380}
381
382TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700383 OmahaResponse response;
384 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700385 TestUpdateCheck(nullptr, // prefs
386 nullptr, // payload_state
387 nullptr, // p2p_manager
388 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700389 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700390 GetUpdateResponse(OmahaRequestParams::kAppId,
391 "1.2.3.4", // version
392 "http://more/info",
393 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700394 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700395 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700396 "HASH1234=", // checksum
397 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700398 "123", // size
399 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700400 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700401 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700402 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800403 metrics::CheckResult::kUpdateAvailable,
404 metrics::CheckReaction::kUpdating,
405 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700406 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700407 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700408 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700409 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700410 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800411 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700412 EXPECT_EQ("http://more/info", response.more_info_url);
413 EXPECT_EQ("HASH1234=", response.hash);
414 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700415 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700416 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700417}
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.
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700423 MockConnectionManager mock_cm(nullptr);
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(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700434 TestUpdateCheck(nullptr, // prefs
435 nullptr, // payload_state
436 nullptr, // 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,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700456 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700457 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(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700469 TestUpdateCheck(nullptr, // prefs
Chris Sosa77f79e82014-06-02 18:16:24 -0700470 &mock_payload_state, // payload_state
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700471 nullptr, // p2p_manager
472 nullptr, // 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,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700491 nullptr));
Chris Sosa77f79e82014-06-02 18:16:24 -0700492 EXPECT_FALSE(response.update_exists);
493}
494
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700495TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
496 OmahaResponse response;
497 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700498 params.set_wall_clock_based_wait_enabled(true);
499 params.set_update_check_count_wait_enabled(false);
500 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700501
502 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800503 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700504 &prefs_dir));
505 ScopedDirRemover temp_dir_remover(prefs_dir);
506
507 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700508 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700509 << "Failed to initialize preferences.";
510
511 ASSERT_FALSE(
512 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700513 nullptr, // payload_state
514 nullptr, // p2p_manager
515 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700516 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700517 GetUpdateResponse2(OmahaRequestParams::kAppId,
518 "1.2.3.4", // version
519 "http://more/info",
520 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700521 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700522 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700523 "HASH1234=", // checksum
524 "false", // needs admin
525 "123", // size
526 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700527 "7", // max days to scatter
528 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700529 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700530 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700531 -1,
532 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700533 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800534 metrics::CheckResult::kUpdateAvailable,
535 metrics::CheckReaction::kDeferring,
536 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700537 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700538 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700539 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700540
541 // Verify if we are interactive check we don't defer.
542 params.set_interactive(true);
543 ASSERT_TRUE(
544 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700545 nullptr, // payload_state
546 nullptr, // p2p_manager
547 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700548 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700549 GetUpdateResponse2(OmahaRequestParams::kAppId,
550 "1.2.3.4", // version
551 "http://more/info",
552 "true", // prompt
553 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700554 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700555 "HASH1234=", // checksum
556 "false", // needs admin
557 "123", // size
558 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700559 "7", // max days to scatter
560 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700561 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700562 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700563 -1,
564 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700565 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800566 metrics::CheckResult::kUpdateAvailable,
567 metrics::CheckReaction::kUpdating,
568 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700569 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700570 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700571 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700572}
573
574TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
575 OmahaResponse response;
576 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700577 params.set_wall_clock_based_wait_enabled(false);
578 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700579
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700580 params.set_update_check_count_wait_enabled(true);
581 params.set_min_update_checks_needed(1);
582 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700583
584 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800585 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700586 &prefs_dir));
587 ScopedDirRemover temp_dir_remover(prefs_dir);
588
589 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700590 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700591 << "Failed to initialize preferences.";
592
593 ASSERT_TRUE(
594 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700595 nullptr, // payload_state
596 nullptr, // p2p_manager
597 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700598 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700599 GetUpdateResponse2(OmahaRequestParams::kAppId,
600 "1.2.3.4", // version
601 "http://more/info",
602 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700603 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700604 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700605 "HASH1234=", // checksum
606 "false", // needs admin
607 "123", // size
608 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700609 "7", // max days to scatter
610 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700611 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700612 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700613 -1,
614 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700615 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800616 metrics::CheckResult::kUpdateAvailable,
617 metrics::CheckReaction::kUpdating,
618 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700619 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700620 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700621 EXPECT_TRUE(response.update_exists);
622}
623
624TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
625 OmahaResponse response;
626 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700627 params.set_wall_clock_based_wait_enabled(true);
628 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700629
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700630 params.set_update_check_count_wait_enabled(true);
631 params.set_min_update_checks_needed(1);
632 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700633
634 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800635 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700636 &prefs_dir));
637 ScopedDirRemover temp_dir_remover(prefs_dir);
638
639 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700640 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700641 << "Failed to initialize preferences.";
642
643 ASSERT_TRUE(
644 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700645 nullptr, // payload_state
646 nullptr, // p2p_manager
647 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700648 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700649 GetUpdateResponse2(OmahaRequestParams::kAppId,
650 "1.2.3.4", // version
651 "http://more/info",
652 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700653 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700654 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700655 "HASH1234=", // checksum
656 "false", // needs admin
657 "123", // size
658 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700659 "0", // max days to scatter
660 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700661 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700662 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700663 -1,
664 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700665 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800666 metrics::CheckResult::kUpdateAvailable,
667 metrics::CheckReaction::kUpdating,
668 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700669 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700670 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700671 EXPECT_TRUE(response.update_exists);
672}
673
674
675TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
676 OmahaResponse response;
677 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700678 params.set_wall_clock_based_wait_enabled(true);
679 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700680
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700681 params.set_update_check_count_wait_enabled(true);
682 params.set_min_update_checks_needed(0);
683 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700684
685 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800686 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700687 &prefs_dir));
688 ScopedDirRemover temp_dir_remover(prefs_dir);
689
690 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700691 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700692 << "Failed to initialize preferences.";
693
694 ASSERT_TRUE(TestUpdateCheck(
695 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700696 nullptr, // payload_state
697 nullptr, // p2p_manager
698 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700699 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700700 GetUpdateResponse2(OmahaRequestParams::kAppId,
701 "1.2.3.4", // version
702 "http://more/info",
703 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700704 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700705 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700706 "HASH1234=", // checksum
707 "false", // needs admin
708 "123", // size
709 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700710 "7", // max days to scatter
711 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700712 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700713 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700714 -1,
715 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700716 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800717 metrics::CheckResult::kUpdateAvailable,
718 metrics::CheckReaction::kUpdating,
719 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700720 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700721 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700722
Ben Chan9abb7632014-08-07 00:10:53 -0700723 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700724 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700725 ASSERT_EQ(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700726 EXPECT_TRUE(response.update_exists);
727}
728
729TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
730 OmahaResponse response;
731 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700732 params.set_wall_clock_based_wait_enabled(true);
733 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700734
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700735 params.set_update_check_count_wait_enabled(true);
736 params.set_min_update_checks_needed(1);
737 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700738
739 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800740 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700741 &prefs_dir));
742 ScopedDirRemover temp_dir_remover(prefs_dir);
743
744 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700745 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700746 << "Failed to initialize preferences.";
747
748 ASSERT_FALSE(TestUpdateCheck(
749 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700750 nullptr, // payload_state
751 nullptr, // p2p_manager
752 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700753 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700754 GetUpdateResponse2(OmahaRequestParams::kAppId,
755 "1.2.3.4", // version
756 "http://more/info",
757 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700758 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700759 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700760 "HASH1234=", // checksum
761 "false", // needs admin
762 "123", // size
763 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700764 "7", // max days to scatter
765 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700766 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700767 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700768 -1,
769 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700770 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800771 metrics::CheckResult::kUpdateAvailable,
772 metrics::CheckReaction::kDeferring,
773 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700774 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700775 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700776
Ben Chan9abb7632014-08-07 00:10:53 -0700777 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700778 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700779 ASSERT_GT(count, 0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700780 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700781
782 // Verify if we are interactive check we don't defer.
783 params.set_interactive(true);
784 ASSERT_TRUE(
785 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700786 nullptr, // payload_state
787 nullptr, // p2p_manager
788 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700789 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700790 GetUpdateResponse2(OmahaRequestParams::kAppId,
791 "1.2.3.4", // version
792 "http://more/info",
793 "true", // prompt
794 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700795 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700796 "HASH1234=", // checksum
797 "false", // needs admin
798 "123", // size
799 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700800 "7", // max days to scatter
801 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700802 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700803 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700804 -1,
805 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700806 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800807 metrics::CheckResult::kUpdateAvailable,
808 metrics::CheckReaction::kUpdating,
809 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700810 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700811 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700812 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700813}
814
815TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
816 OmahaResponse response;
817 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700818 params.set_wall_clock_based_wait_enabled(true);
819 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700820
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700821 params.set_update_check_count_wait_enabled(true);
822 params.set_min_update_checks_needed(1);
823 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700824
825 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800826 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700827 &prefs_dir));
828 ScopedDirRemover temp_dir_remover(prefs_dir);
829
830 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700831 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700832 << "Failed to initialize preferences.";
833
834 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
835
836 ASSERT_FALSE(TestUpdateCheck(
837 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700838 nullptr, // payload_state
839 nullptr, // p2p_manager
840 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700841 &params,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700842 GetUpdateResponse2(OmahaRequestParams::kAppId,
843 "1.2.3.4", // version
844 "http://more/info",
845 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700846 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700847 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700848 "HASH1234=", // checksum
849 "false", // needs admin
850 "123", // size
851 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700852 "7", // max days to scatter
853 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700854 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700855 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700856 -1,
857 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700858 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800859 metrics::CheckResult::kUpdateAvailable,
860 metrics::CheckReaction::kDeferring,
861 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700862 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700863 nullptr));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700864
Ben Chan9abb7632014-08-07 00:10:53 -0700865 int64_t count;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700866 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
867 // count remains the same, as the decrementing happens in update_attempter
868 // which this test doesn't exercise.
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700869 ASSERT_EQ(count, 5);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700870 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700871
872 // Verify if we are interactive check we don't defer.
873 params.set_interactive(true);
874 ASSERT_TRUE(
875 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700876 nullptr, // payload_state
877 nullptr, // p2p_manager
878 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700879 &params,
Chris Sosa968d0572013-08-23 14:46:02 -0700880 GetUpdateResponse2(OmahaRequestParams::kAppId,
881 "1.2.3.4", // version
882 "http://more/info",
883 "true", // prompt
884 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700885 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -0700886 "HASH1234=", // checksum
887 "false", // needs admin
888 "123", // size
889 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700890 "7", // max days to scatter
891 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700892 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700893 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700894 -1,
895 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700896 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800897 metrics::CheckResult::kUpdateAvailable,
898 metrics::CheckReaction::kUpdating,
899 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700900 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700901 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -0700902 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700903}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700904
Darin Petkov6a5b3222010-07-13 14:55:28 -0700905TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700906 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
907
908 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
909
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700910 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700911 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700912 fake_system_state.set_request_params(&params);
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700913 OmahaRequestAction action(&fake_system_state, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700914 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800915 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700916 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -0700917 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700918 OmahaRequestActionTestProcessorDelegate delegate;
919 delegate.loop_ = loop;
920 ActionProcessor processor;
921 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700922 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700923
924 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
925 g_main_loop_run(loop);
926 g_main_loop_unref(loop);
927 EXPECT_FALSE(processor.IsRunning());
928}
929
930TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700931 OmahaResponse response;
932 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700933 TestUpdateCheck(nullptr, // prefs
934 nullptr, // payload_state
935 nullptr, // p2p_manager
936 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700937 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700938 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700939 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700940 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700941 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800942 metrics::CheckResult::kParsingError,
943 metrics::CheckReaction::kUnset,
944 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700945 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700946 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -0700947 EXPECT_FALSE(response.update_exists);
948}
949
950TEST(OmahaRequestActionTest, EmptyResponseTest) {
951 OmahaResponse response;
952 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700953 TestUpdateCheck(nullptr, // prefs
954 nullptr, // payload_state
955 nullptr, // p2p_manager
956 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700957 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -0700958 "",
959 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700960 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700961 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800962 metrics::CheckResult::kParsingError,
963 metrics::CheckReaction::kUnset,
964 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700965 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700966 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700967 EXPECT_FALSE(response.update_exists);
968}
969
970TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700971 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700972 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700973 nullptr, // prefs
974 nullptr, // payload_state
975 nullptr, // p2p_manager
976 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -0700977 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700978 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
979 "<daystart elapsed_seconds=\"100\"/>"
980 "<app appid=\"foo\" status=\"ok\">"
981 "<ping status=\"ok\"/>"
982 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700983 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700984 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700985 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -0800986 metrics::CheckResult::kParsingError,
987 metrics::CheckReaction::kUnset,
988 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700989 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700990 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700991 EXPECT_FALSE(response.update_exists);
992}
993
994TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700995 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700996 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -0700997 nullptr, // prefs
998 nullptr, // payload_state
999 nullptr, // p2p_manager
1000 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001001 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001002 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1003 "<daystart elapsed_seconds=\"100\"/>"
1004 "<app appid=\"foo\" status=\"ok\">"
1005 "<ping status=\"ok\"/>"
1006 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001007 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001008 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001009 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001010 metrics::CheckResult::kParsingError,
1011 metrics::CheckReaction::kUnset,
1012 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001013 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001014 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001015 EXPECT_FALSE(response.update_exists);
1016}
1017
1018TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001019 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001020 ASSERT_FALSE(TestUpdateCheck(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001021 nullptr, // prefs
1022 nullptr, // payload_state
1023 nullptr, // p2p_manager
1024 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001025 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001026 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1027 "<daystart elapsed_seconds=\"100\"/>"
1028 "<app appid=\"foo\" status=\"ok\">"
1029 "<ping status=\"ok\"/>"
1030 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001031 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001032 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001033 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001034 metrics::CheckResult::kParsingError,
1035 metrics::CheckReaction::kUnset,
1036 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001037 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001038 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001039 EXPECT_FALSE(response.update_exists);
1040}
1041
1042TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001043 string input_response =
1044 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1045 "<daystart elapsed_seconds=\"100\"/>"
1046 "<app appid=\"xyz\" status=\"ok\">"
1047 "<updatecheck status=\"ok\">"
1048 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001049 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001050 "<packages><package hash=\"not-used\" name=\"f\" "
1051 "size=\"587\"/></packages>"
1052 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001053 "ChromeOSVersion=\"10.2.3.4\" "
1054 "Prompt=\"false\" "
1055 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001056 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001057 "sha256=\"lkq34j5345\" "
1058 "needsadmin=\"true\" "
1059 "/></actions></manifest></updatecheck></app></response>";
1060 LOG(INFO) << "Input Response = " << input_response;
1061
Darin Petkov6a5b3222010-07-13 14:55:28 -07001062 OmahaResponse response;
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001063 ASSERT_TRUE(TestUpdateCheck(nullptr, // prefs
1064 nullptr, // payload_state
1065 nullptr, // p2p_manager
1066 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001067 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001068 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001069 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001070 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001071 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001072 metrics::CheckResult::kUpdateAvailable,
1073 metrics::CheckReaction::kUpdating,
1074 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001075 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001076 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001077 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001078 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001079 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001080 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001081 EXPECT_EQ("lkq34j5345", response.hash);
1082 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001083 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001084 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001085}
1086
1087namespace {
1088class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1089 public:
1090 void ProcessingStopped(const ActionProcessor* processor) {
1091 ASSERT_TRUE(loop_);
1092 g_main_loop_quit(loop_);
1093 }
1094 GMainLoop *loop_;
1095};
1096
1097gboolean TerminateTransferTestStarter(gpointer data) {
1098 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1099 processor->StartProcessing();
1100 CHECK(processor->IsRunning());
1101 processor->StopProcessing();
1102 return FALSE;
1103}
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001104} // namespace
Darin Petkov6a5b3222010-07-13 14:55:28 -07001105
1106TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001107 string http_response("doesn't matter");
1108 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1109
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001110 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001111 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001112 fake_system_state.set_request_params(&params);
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001113 OmahaRequestAction action(&fake_system_state, nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001114 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001115 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001116 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001117 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001118 TerminateEarlyTestProcessorDelegate delegate;
1119 delegate.loop_ = loop;
1120 ActionProcessor processor;
1121 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001122 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001123
1124 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1125 g_main_loop_run(loop);
1126 g_main_loop_unref(loop);
1127}
1128
1129TEST(OmahaRequestActionTest, XmlEncodeTest) {
1130 EXPECT_EQ("ab", XmlEncode("ab"));
1131 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001132 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1133 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1134
1135 vector<char> post_data;
1136
1137 // Make sure XML Encode is being called on the params
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001138 FakeSystemState fake_system_state;
1139 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001140 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001141 OmahaRequestParams::kOsVersion,
1142 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001143 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001144 OmahaRequestParams::kAppId,
1145 "0.1.0.0",
1146 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001147 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001148 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001149 "ChromeOSFirmware.1.0",
1150 "EC100",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001151 false, // delta okay
1152 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001153 "http://url",
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001154 "", // target_version_prefix
1155 false, // use_p2p_for_downloading
1156 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001157 OmahaResponse response;
1158 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001159 TestUpdateCheck(nullptr, // prefs
1160 nullptr, // payload_state
1161 nullptr, // p2p_manager
1162 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001163 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001164 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001165 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001166 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001167 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001168 metrics::CheckResult::kParsingError,
1169 metrics::CheckReaction::kUnset,
1170 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001171 &response,
1172 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001173 // convert post_data to string
1174 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001175 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1176 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001177 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1178 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1179 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1180 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001181 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1182 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001183}
1184
1185TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001186 OmahaResponse response;
1187 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001188 TestUpdateCheck(nullptr, // prefs
1189 nullptr, // payload_state
1190 nullptr, // p2p_manager
1191 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001192 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001193 GetUpdateResponse(OmahaRequestParams::kAppId,
1194 "1.2.3.4", // version
1195 "testthe&lt;url", // more info
1196 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001197 "testthe&amp;codebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001198 "file.signed", // file name
1199 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001200 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001201 "123", // size
1202 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001203 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001204 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001205 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001206 metrics::CheckResult::kUpdateAvailable,
1207 metrics::CheckReaction::kUpdating,
1208 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001209 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001210 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001211
1212 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001213 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001214 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001215}
1216
1217TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001218 OmahaResponse response;
1219 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001220 TestUpdateCheck(nullptr, // prefs
1221 nullptr, // payload_state
1222 nullptr, // p2p_manager
1223 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001224 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001225 GetUpdateResponse(OmahaRequestParams::kAppId,
1226 "1.2.3.4", // version
1227 "theurl", // more info
1228 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001229 "thecodebase/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001230 "file.signed", // file name
1231 "HASH1234=", // checksum
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001232 "false", // needs admin
Ben Chan9abb7632014-08-07 00:10:53 -07001233 // overflows int32_t:
Darin Petkov6c118642010-10-21 12:06:30 -07001234 "123123123123123", // size
1235 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001236 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001237 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001238 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001239 metrics::CheckResult::kUpdateAvailable,
1240 metrics::CheckReaction::kUpdating,
1241 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001242 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001243 nullptr));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001244
1245 EXPECT_EQ(response.size, 123123123123123ll);
1246}
1247
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001248TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
1249 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001250 NiceMock<PrefsMock> prefs;
1251 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1252 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001253 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -08001254 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001255 nullptr, // payload_state
1256 nullptr, // p2p_manager
1257 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001258 &kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001259 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001260 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001261 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001262 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001263 metrics::CheckResult::kParsingError,
1264 metrics::CheckReaction::kUnset,
1265 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001266 nullptr, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001267 &post_data));
1268 // convert post_data to string
1269 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001270 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001271 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001272 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001273 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001274 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1275 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001276 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1277 string::npos);
1278 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1279 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001280}
1281
Jay Srinivasan0a708742012-03-20 11:26:12 -07001282
Darin Petkove17f86b2010-07-20 09:12:01 -07001283TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1284 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001285 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001286 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1287 "invalid xml>",
1288 &post_data);
1289 // convert post_data to string
1290 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001291 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001292 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001293 OmahaEvent::kTypeUpdateDownloadStarted,
1294 OmahaEvent::kResultSuccess);
1295 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001296 EXPECT_EQ(post_str.find("ping"), string::npos);
1297 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001298}
1299
1300TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1301 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001302 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001303 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1304 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001305 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001306 "invalid xml>",
1307 &post_data);
1308 // convert post_data to string
1309 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001310 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001311 " <event eventtype=\"%d\" eventresult=\"%d\" "
1312 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001313 OmahaEvent::kTypeDownloadComplete,
1314 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001315 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001316 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001317 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001318}
1319
1320TEST(OmahaRequestActionTest, IsEventTest) {
1321 string http_response("doesn't matter");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001322 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001323 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001324 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001325 OmahaRequestAction update_check_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001326 &fake_system_state,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001327 nullptr,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001328 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001329 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001330 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001331 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001332 EXPECT_FALSE(update_check_action.IsEvent());
1333
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001334 params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001335 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001336 OmahaRequestAction event_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001337 &fake_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001338 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001339 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001340 http_response.size(),
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001341 nullptr),
Thieu Le116fda32011-04-19 11:01:54 -07001342 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001343 EXPECT_TRUE(event_action.IsEvent());
1344}
1345
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001346TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1347 for (int i = 0; i < 2; i++) {
1348 bool delta_okay = i == 1;
1349 const char* delta_okay_str = delta_okay ? "true" : "false";
1350 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001351 FakeSystemState fake_system_state;
1352 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001353 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001354 OmahaRequestParams::kOsVersion,
1355 "service_pack",
1356 "x86-generic",
1357 OmahaRequestParams::kAppId,
1358 "0.1.0.0",
1359 "en-US",
1360 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001361 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001362 "ChromeOSFirmware.1.0",
1363 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001364 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001365 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001366 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001367 "", // target_version_prefix
1368 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001369 false); // use_p2p_for_sharing
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001370 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1371 nullptr, // payload_state
1372 nullptr, // p2p_manager
1373 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001374 &params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001375 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001376 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001377 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001378 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001379 metrics::CheckResult::kParsingError,
1380 metrics::CheckReaction::kUnset,
1381 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001382 nullptr,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001383 &post_data));
1384 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001385 string post_str(post_data.data(), post_data.size());
1386 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1387 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001388 string::npos)
1389 << "i = " << i;
1390 }
1391}
1392
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001393TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1394 for (int i = 0; i < 2; i++) {
1395 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001396 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001397 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001398 FakeSystemState fake_system_state;
1399 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001400 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001401 OmahaRequestParams::kOsVersion,
1402 "service_pack",
1403 "x86-generic",
1404 OmahaRequestParams::kAppId,
1405 "0.1.0.0",
1406 "en-US",
1407 "unittest_track",
1408 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001409 "ChromeOSFirmware.1.0",
1410 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001411 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001412 interactive,
1413 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001414 "", // target_version_prefix
1415 false, // use_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001416 false); // use_p2p_for_sharing
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001417 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1418 nullptr, // payload_state
1419 nullptr, // p2p_manager
1420 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001421 &params,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001422 "invalid xml>",
1423 -1,
1424 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001425 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001426 metrics::CheckResult::kParsingError,
1427 metrics::CheckReaction::kUnset,
1428 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001429 nullptr,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001430 &post_data));
1431 // convert post_data to string
1432 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001433 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1434 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001435 string::npos)
1436 << "i = " << i;
1437 }
1438}
1439
Darin Petkove17f86b2010-07-20 09:12:01 -07001440TEST(OmahaRequestActionTest, OmahaEventTest) {
1441 OmahaEvent default_event;
1442 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1443 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001444 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001445
1446 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1447 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1448 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001449 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001450
1451 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1452 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001453 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001454 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1455 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001456 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001457}
1458
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001459TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001460 for (int ping_only = 0; ping_only < 2; ping_only++) {
1461 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001462 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1463 .Times(AnyNumber());
1464 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov265f2902011-05-09 15:17:40 -07001465 // Add a few hours to the day difference to test no rounding, etc.
1466 int64_t five_days_ago =
1467 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1468 int64_t six_days_ago =
1469 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001470 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1471 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov265f2902011-05-09 15:17:40 -07001472 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1473 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1474 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1475 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1476 vector<char> post_data;
1477 ASSERT_TRUE(
1478 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001479 nullptr, // payload_state
1480 nullptr, // p2p_manager
1481 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001482 &kDefaultTestParams,
Darin Petkov265f2902011-05-09 15:17:40 -07001483 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1484 -1,
1485 ping_only,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001486 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001487 metrics::CheckResult::kUnset,
1488 metrics::CheckReaction::kUnset,
1489 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001490 nullptr,
Darin Petkov265f2902011-05-09 15:17:40 -07001491 &post_data));
1492 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001493 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001494 string::npos);
1495 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001496 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001497 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1498 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001499 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001500 EXPECT_NE(post_str.find("previousversion"), string::npos);
1501 }
1502 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001503}
1504
1505TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001506 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001507 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1508 .Times(AnyNumber());
1509 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001510 int64_t three_days_ago =
1511 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1512 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001513 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1514 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001515 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1516 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1517 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1518 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1519 vector<char> post_data;
1520 ASSERT_TRUE(
1521 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001522 nullptr, // payload_state
1523 nullptr, // p2p_manager
1524 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001525 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001526 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001527 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001528 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001529 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001530 metrics::CheckResult::kNoUpdateAvailable,
1531 metrics::CheckReaction::kUnset,
1532 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001533 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001534 &post_data));
1535 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001536 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001537 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001538}
1539
1540TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001541 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001542 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1543 .Times(AnyNumber());
1544 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001545 int64_t four_days_ago =
1546 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1547 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001548 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1549 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001550 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1551 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1552 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1553 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1554 vector<char> post_data;
1555 ASSERT_TRUE(
1556 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001557 nullptr, // payload_state
1558 nullptr, // p2p_manager
1559 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001560 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001561 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001562 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001563 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001564 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001565 metrics::CheckResult::kNoUpdateAvailable,
1566 metrics::CheckReaction::kUnset,
1567 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001568 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001569 &post_data));
1570 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001571 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001572 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001573}
1574
1575TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001576 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001577 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1578 .Times(AnyNumber());
1579 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001580 int64_t one_hour_ago =
1581 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001582 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1583 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001584 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1585 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1586 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1587 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1588 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1589 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1590 vector<char> post_data;
1591 ASSERT_TRUE(
1592 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001593 nullptr, // payload_state
1594 nullptr, // p2p_manager
1595 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001596 &kDefaultTestParams,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001597 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001598 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001599 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001600 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001601 metrics::CheckResult::kNoUpdateAvailable,
1602 metrics::CheckReaction::kUnset,
1603 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001604 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001605 &post_data));
1606 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001607 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001608}
1609
Thieu Leb44e9e82011-06-06 14:34:04 -07001610TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1611 // This test ensures that we ignore empty ping only requests.
1612 NiceMock<PrefsMock> prefs;
1613 int64_t now = Time::Now().ToInternalValue();
1614 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1615 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1616 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1617 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1618 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1619 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1620 vector<char> post_data;
1621 EXPECT_TRUE(
1622 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001623 nullptr, // payload_state
1624 nullptr, // p2p_manager
1625 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001626 &kDefaultTestParams,
Thieu Leb44e9e82011-06-06 14:34:04 -07001627 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1628 -1,
1629 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001630 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001631 metrics::CheckResult::kUnset,
1632 metrics::CheckReaction::kUnset,
1633 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001634 nullptr,
Thieu Leb44e9e82011-06-06 14:34:04 -07001635 &post_data));
1636 EXPECT_EQ(post_data.size(), 0);
1637}
1638
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001639TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001640 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001641 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1642 .Times(AnyNumber());
1643 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001644 int64_t future =
1645 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001646 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1647 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001648 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1649 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1650 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1651 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1652 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1653 .WillOnce(Return(true));
1654 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1655 .WillOnce(Return(true));
1656 vector<char> post_data;
1657 ASSERT_TRUE(
1658 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001659 nullptr, // payload_state
1660 nullptr, // p2p_manager
1661 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001662 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001663 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1664 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001665 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001666 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001667 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001668 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001669 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001670 metrics::CheckResult::kNoUpdateAvailable,
1671 metrics::CheckReaction::kUnset,
1672 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001673 nullptr,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001674 &post_data));
1675 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001676 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001677}
1678
1679TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1680 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001681 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001682 // may fail if it runs for longer than 5 seconds. It shouldn't run
1683 // that long though.
1684 int64_t midnight =
1685 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1686 int64_t midnight_slack =
1687 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001688 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001689 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1690 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001691 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1692 AllOf(Ge(midnight), Le(midnight_slack))))
1693 .WillOnce(Return(true));
1694 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1695 AllOf(Ge(midnight), Le(midnight_slack))))
1696 .WillOnce(Return(true));
1697 ASSERT_TRUE(
1698 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001699 nullptr, // payload_state
1700 nullptr, // p2p_manager
1701 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001702 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001703 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1704 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001705 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001706 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001707 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001708 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001709 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001710 metrics::CheckResult::kNoUpdateAvailable,
1711 metrics::CheckReaction::kUnset,
1712 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001713 nullptr,
1714 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001715}
1716
1717TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001718 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001719 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1720 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001721 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1722 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1723 ASSERT_TRUE(
1724 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001725 nullptr, // payload_state
1726 nullptr, // p2p_manager
1727 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001728 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001729 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1730 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001731 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001732 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001733 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001734 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001735 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001736 metrics::CheckResult::kNoUpdateAvailable,
1737 metrics::CheckReaction::kUnset,
1738 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001739 nullptr,
1740 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001741}
1742
1743TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001744 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001745 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1746 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001747 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1748 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1749 ASSERT_TRUE(
1750 TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001751 nullptr, // payload_state
1752 nullptr, // p2p_manager
1753 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001754 &kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001755 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1756 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001757 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001758 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001759 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001760 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001761 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001762 metrics::CheckResult::kNoUpdateAvailable,
1763 metrics::CheckReaction::kUnset,
1764 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001765 nullptr,
1766 nullptr));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001767}
1768
Darin Petkov84c763c2010-07-29 16:27:58 -07001769TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1770 vector<char> post_data;
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001771 ASSERT_FALSE(TestUpdateCheck(nullptr, // prefs
1772 nullptr, // payload_state
1773 nullptr, // p2p_manager
1774 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001775 &kDefaultTestParams,
Darin Petkov84c763c2010-07-29 16:27:58 -07001776 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001777 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001778 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001779 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001780 metrics::CheckResult::kParsingError,
1781 metrics::CheckReaction::kUnset,
1782 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001783 nullptr, // response
Darin Petkov84c763c2010-07-29 16:27:58 -07001784 &post_data));
1785 // convert post_data to string
1786 string post_str(&post_data[0], post_data.size());
1787 EXPECT_EQ(post_str.find("machineid="), string::npos);
1788 EXPECT_EQ(post_str.find("userid="), string::npos);
1789}
1790
Darin Petkovedc522e2010-11-05 09:35:17 -07001791TEST(OmahaRequestActionTest, NetworkFailureTest) {
1792 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001793 const int http_error_code =
1794 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001795 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001796 TestUpdateCheck(nullptr, // prefs
1797 nullptr, // payload_state
1798 nullptr, // p2p_manager
1799 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001800 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001801 "",
1802 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001803 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001804 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001805 metrics::CheckResult::kDownloadError,
1806 metrics::CheckReaction::kUnset,
1807 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001808 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001809 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001810 EXPECT_FALSE(response.update_exists);
1811}
1812
1813TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1814 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001815 const int http_error_code =
1816 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001817 ASSERT_FALSE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001818 TestUpdateCheck(nullptr, // prefs
1819 nullptr, // payload_state
1820 nullptr, // p2p_manager
1821 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001822 &kDefaultTestParams,
Darin Petkovedc522e2010-11-05 09:35:17 -07001823 "",
1824 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001825 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001826 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001827 metrics::CheckResult::kDownloadError,
1828 metrics::CheckReaction::kUnset,
1829 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001830 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001831 nullptr));
Darin Petkovedc522e2010-11-05 09:35:17 -07001832 EXPECT_FALSE(response.update_exists);
1833}
1834
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001835TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1836 OmahaResponse response;
1837 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001838 params.set_wall_clock_based_wait_enabled(true);
1839 params.set_waiting_period(TimeDelta().FromDays(1));
1840 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001841
1842 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001843 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001844 &prefs_dir));
1845 ScopedDirRemover temp_dir_remover(prefs_dir);
1846
1847 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001848 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001849 << "Failed to initialize preferences.";
1850
1851 ASSERT_FALSE(TestUpdateCheck(
1852 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001853 nullptr, // payload_state
1854 nullptr, // p2p_manager
1855 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001856 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001857 GetUpdateResponse2(OmahaRequestParams::kAppId,
1858 "1.2.3.4", // version
1859 "http://more/info",
1860 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001861 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001862 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001863 "HASH1234=", // checksum
1864 "false", // needs admin
1865 "123", // size
1866 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001867 "7", // max days to scatter
1868 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001869 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001870 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001871 -1,
1872 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001873 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001874 metrics::CheckResult::kUpdateAvailable,
1875 metrics::CheckReaction::kDeferring,
1876 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001877 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001878 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001879
Ben Chan9abb7632014-08-07 00:10:53 -07001880 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001881 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001882 ASSERT_GT(timestamp, 0);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001883 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001884
1885 // Verify if we are interactive check we don't defer.
1886 params.set_interactive(true);
1887 ASSERT_TRUE(
1888 TestUpdateCheck(&prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001889 nullptr, // payload_state
1890 nullptr, // p2p_manager
1891 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001892 &params,
Chris Sosa968d0572013-08-23 14:46:02 -07001893 GetUpdateResponse2(OmahaRequestParams::kAppId,
1894 "1.2.3.4", // version
1895 "http://more/info",
1896 "true", // prompt
1897 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001898 "file.signed", // file name
Chris Sosa968d0572013-08-23 14:46:02 -07001899 "HASH1234=", // checksum
1900 "false", // needs admin
1901 "123", // size
1902 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001903 "7", // max days to scatter
1904 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001905 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001906 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001907 -1,
1908 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001909 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001910 metrics::CheckResult::kUpdateAvailable,
1911 metrics::CheckReaction::kUpdating,
1912 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001913 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001914 nullptr));
Chris Sosa968d0572013-08-23 14:46:02 -07001915 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001916}
1917
1918TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1919 OmahaResponse response;
1920 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001921 params.set_wall_clock_based_wait_enabled(true);
1922 params.set_waiting_period(TimeDelta().FromDays(1));
1923 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001924
1925 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001926 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001927 &prefs_dir));
1928 ScopedDirRemover temp_dir_remover(prefs_dir);
1929
1930 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001931 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001932 << "Failed to initialize preferences.";
1933
1934 // Set the timestamp to a very old value such that it exceeds the
1935 // waiting period set above.
1936 Time t1;
1937 Time::FromString("1/1/2012", &t1);
1938 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1939 ASSERT_TRUE(TestUpdateCheck(
1940 &prefs, // prefs
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001941 nullptr, // payload_state
1942 nullptr, // p2p_manager
1943 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001944 &params,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001945 GetUpdateResponse2(OmahaRequestParams::kAppId,
1946 "1.2.3.4", // version
1947 "http://more/info",
1948 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001949 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001950 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001951 "HASH1234=", // checksum
1952 "false", // needs admin
1953 "123", // size
1954 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001955 "7", // max days to scatter
1956 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001957 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07001958 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001959 -1,
1960 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001961 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001962 metrics::CheckResult::kUpdateAvailable,
1963 metrics::CheckReaction::kUpdating,
1964 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001965 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07001966 nullptr));
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001967
1968 EXPECT_TRUE(response.update_exists);
1969
1970 // Make sure the timestamp t1 is unchanged showing that it was reused.
Ben Chan9abb7632014-08-07 00:10:53 -07001971 int64_t timestamp = 0;
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001972 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1973 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1974}
1975
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001976TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001977 // Create a uniquely named test directory.
1978 string test_dir;
1979 ASSERT_TRUE(utils::MakeTempDirectory(
1980 "omaha_request_action-test-XXXXXX", &test_dir));
1981
1982 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1983 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001984 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001985 vector<char> post_data;
1986 NiceMock<PrefsMock> prefs;
1987 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001988 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001989 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1990 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1991 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1992 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001993 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001994 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1995 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1996 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08001997 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001998 params.SetLockDown(false);
1999 params.Init("1.2.3.4", "", 0);
2000 EXPECT_EQ("canary-channel", params.current_channel());
2001 EXPECT_EQ("stable-channel", params.target_channel());
2002 EXPECT_TRUE(params.to_more_stable_channel());
2003 EXPECT_TRUE(params.is_powerwash_allowed());
2004 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002005 nullptr, // payload_state
2006 nullptr, // p2p_manager
2007 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002008 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002009 "invalid xml>",
2010 -1,
2011 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002012 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002013 metrics::CheckResult::kParsingError,
2014 metrics::CheckReaction::kUnset,
2015 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002016 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002017 &post_data));
2018 // convert post_data to string
2019 string post_str(&post_data[0], post_data.size());
2020 EXPECT_NE(string::npos, post_str.find(
2021 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2022 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2023 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002024
2025 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002026}
2027
2028TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002029 // Create a uniquely named test directory.
2030 string test_dir;
2031 ASSERT_TRUE(utils::MakeTempDirectory(
2032 "omaha_request_action-test-XXXXXX", &test_dir));
2033
2034 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2035 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002036 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002037 vector<char> post_data;
2038 NiceMock<PrefsMock> prefs;
2039 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002040 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002041 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2042 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2043 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2044 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002045 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002046 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2047 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002048 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002049 params.SetLockDown(false);
2050 params.Init("5.6.7.8", "", 0);
2051 EXPECT_EQ("stable-channel", params.current_channel());
2052 EXPECT_EQ("canary-channel", params.target_channel());
2053 EXPECT_FALSE(params.to_more_stable_channel());
2054 EXPECT_FALSE(params.is_powerwash_allowed());
2055 ASSERT_FALSE(TestUpdateCheck(&prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002056 nullptr, // payload_state
2057 nullptr, // p2p_manager
2058 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002059 &params,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002060 "invalid xml>",
2061 -1,
2062 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002063 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002064 metrics::CheckResult::kParsingError,
2065 metrics::CheckReaction::kUnset,
2066 metrics::DownloadErrorCode::kUnset,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002067 nullptr, // response
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002068 &post_data));
2069 // convert post_data to string
2070 string post_str(&post_data[0], post_data.size());
2071 EXPECT_NE(string::npos, post_str.find(
2072 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2073 "version=\"5.6.7.8\" "
2074 "track=\"canary-channel\" from_track=\"stable-channel\""));
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002075 EXPECT_EQ(string::npos, post_str.find("from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002076
2077 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002078}
2079
David Zeuthen8f191b22013-08-06 12:27:50 -07002080void P2PTest(bool initial_allow_p2p_for_downloading,
2081 bool initial_allow_p2p_for_sharing,
2082 bool omaha_disable_p2p_for_downloading,
2083 bool omaha_disable_p2p_for_sharing,
2084 bool payload_state_allow_p2p_attempt,
2085 bool expect_p2p_client_lookup,
2086 const string& p2p_client_result_url,
2087 bool expected_allow_p2p_for_downloading,
2088 bool expected_allow_p2p_for_sharing,
2089 const string& expected_p2p_url) {
2090 OmahaResponse response;
2091 OmahaRequestParams request_params = kDefaultTestParams;
2092 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
2093 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
2094
2095 MockPayloadState mock_payload_state;
2096 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2097 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
2098 MockP2PManager mock_p2p_manager;
2099 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2100
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002101 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2102 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002103 .Times(expect_p2p_client_lookup ? 1 : 0);
2104
2105 ASSERT_TRUE(
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002106 TestUpdateCheck(nullptr, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07002107 &mock_payload_state,
2108 &mock_p2p_manager,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002109 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002110 &request_params,
David Zeuthen8f191b22013-08-06 12:27:50 -07002111 GetUpdateResponse2(OmahaRequestParams::kAppId,
2112 "1.2.3.4", // version
2113 "http://more/info",
2114 "true", // prompt
2115 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002116 "file.signed", // file name
David Zeuthen8f191b22013-08-06 12:27:50 -07002117 "HASH1234=", // checksum
2118 "false", // needs admin
2119 "123", // size
2120 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002121 "7", // max days to scatter
2122 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002123 omaha_disable_p2p_for_downloading,
2124 omaha_disable_p2p_for_sharing),
2125 -1,
2126 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002127 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002128 metrics::CheckResult::kUpdateAvailable,
2129 metrics::CheckReaction::kUpdating,
2130 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002131 &response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002132 nullptr));
David Zeuthen8f191b22013-08-06 12:27:50 -07002133 EXPECT_TRUE(response.update_exists);
2134
2135 EXPECT_EQ(response.disable_p2p_for_downloading,
2136 omaha_disable_p2p_for_downloading);
2137 EXPECT_EQ(response.disable_p2p_for_sharing,
2138 omaha_disable_p2p_for_sharing);
2139
2140 EXPECT_EQ(request_params.use_p2p_for_downloading(),
2141 expected_allow_p2p_for_downloading);
2142
2143 EXPECT_EQ(request_params.use_p2p_for_sharing(),
2144 expected_allow_p2p_for_sharing);
2145
2146 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
2147}
2148
2149TEST(OmahaRequestActionTest, P2PWithPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002150 P2PTest(true, // initial_allow_p2p_for_downloading
2151 true, // initial_allow_p2p_for_sharing
2152 false, // omaha_disable_p2p_for_downloading
2153 false, // omaha_disable_p2p_for_sharing
2154 true, // payload_state_allow_p2p_attempt
2155 true, // expect_p2p_client_lookup
2156 "http://1.3.5.7/p2p", // p2p_client_result_url
2157 true, // expected_allow_p2p_for_downloading
2158 true, // expected_allow_p2p_for_sharing
2159 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002160}
2161
2162TEST(OmahaRequestActionTest, P2PWithoutPeer) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002163 P2PTest(true, // initial_allow_p2p_for_downloading
2164 true, // initial_allow_p2p_for_sharing
2165 false, // omaha_disable_p2p_for_downloading
2166 false, // omaha_disable_p2p_for_sharing
2167 true, // payload_state_allow_p2p_attempt
2168 true, // expect_p2p_client_lookup
2169 "", // p2p_client_result_url
2170 false, // expected_allow_p2p_for_downloading
2171 true, // expected_allow_p2p_for_sharing
2172 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002173}
2174
2175TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002176 P2PTest(false, // initial_allow_p2p_for_downloading
2177 true, // initial_allow_p2p_for_sharing
2178 false, // omaha_disable_p2p_for_downloading
2179 false, // omaha_disable_p2p_for_sharing
2180 true, // payload_state_allow_p2p_attempt
2181 false, // expect_p2p_client_lookup
2182 "unset", // p2p_client_result_url
2183 false, // expected_allow_p2p_for_downloading
2184 true, // expected_allow_p2p_for_sharing
2185 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002186}
2187
2188TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002189 P2PTest(true, // initial_allow_p2p_for_downloading
2190 true, // initial_allow_p2p_for_sharing
2191 true, // omaha_disable_p2p_for_downloading
2192 false, // omaha_disable_p2p_for_sharing
2193 true, // payload_state_allow_p2p_attempt
2194 false, // expect_p2p_client_lookup
2195 "unset", // p2p_client_result_url
2196 false, // expected_allow_p2p_for_downloading
2197 true, // expected_allow_p2p_for_sharing
2198 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002199}
2200
2201TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002202 P2PTest(true, // initial_allow_p2p_for_downloading
2203 true, // initial_allow_p2p_for_sharing
2204 false, // omaha_disable_p2p_for_downloading
2205 true, // omaha_disable_p2p_for_sharing
2206 true, // payload_state_allow_p2p_attempt
2207 true, // expect_p2p_client_lookup
2208 "http://1.3.5.7/p2p", // p2p_client_result_url
2209 true, // expected_allow_p2p_for_downloading
2210 false, // expected_allow_p2p_for_sharing
2211 "http://1.3.5.7/p2p"); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002212}
2213
2214TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002215 P2PTest(true, // initial_allow_p2p_for_downloading
2216 true, // initial_allow_p2p_for_sharing
2217 true, // omaha_disable_p2p_for_downloading
2218 true, // omaha_disable_p2p_for_sharing
2219 true, // payload_state_allow_p2p_attempt
2220 false, // expect_p2p_client_lookup
2221 "unset", // p2p_client_result_url
2222 false, // expected_allow_p2p_for_downloading
2223 false, // expected_allow_p2p_for_sharing
2224 ""); // expected_p2p_url
David Zeuthen8f191b22013-08-06 12:27:50 -07002225}
2226
David Zeuthen639aa362014-02-03 16:23:44 -08002227bool InstallDateParseHelper(const std::string &elapsed_days,
2228 PrefsInterface* prefs,
2229 OmahaResponse *response) {
2230 return
2231 TestUpdateCheck(prefs,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002232 nullptr, // payload_state
2233 nullptr, // p2p_manager
2234 nullptr, // connection_manager
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002235 &kDefaultTestParams,
David Zeuthen639aa362014-02-03 16:23:44 -08002236 GetUpdateResponse2(OmahaRequestParams::kAppId,
2237 "1.2.3.4", // version
2238 "http://more/info",
2239 "true", // prompt
2240 "http://code/base/", // dl url
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002241 "file.signed", // file name
David Zeuthen639aa362014-02-03 16:23:44 -08002242 "HASH1234=", // checksum
2243 "false", // needs admin
2244 "123", // size
2245 "", // deadline
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002246 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002247 elapsed_days,
2248 false, // disable_p2p_for_downloading
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002249 false), // disable_p2p_for sharing
David Zeuthen639aa362014-02-03 16:23:44 -08002250 -1,
2251 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002252 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002253 metrics::CheckResult::kUpdateAvailable,
2254 metrics::CheckReaction::kUpdating,
2255 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002256 response,
Alex Vakulenko88b591f2014-08-28 16:48:57 -07002257 nullptr);
David Zeuthen639aa362014-02-03 16:23:44 -08002258}
2259
2260TEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2261 OmahaResponse response;
2262 string temp_dir;
2263 Prefs prefs;
2264 EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2265 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002266 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002267
2268 // Check that we parse elapsed_days in the Omaha Response correctly.
2269 // and that the kPrefsInstallDateDays value is written to.
2270 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2271 EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2272 EXPECT_TRUE(response.update_exists);
2273 EXPECT_EQ(42, response.install_date_days);
2274 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2275 int64_t prefs_days;
2276 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2277 EXPECT_EQ(prefs_days, 42);
2278
2279 // If there already is a value set, we shouldn't do anything.
2280 EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2281 EXPECT_TRUE(response.update_exists);
2282 EXPECT_EQ(7, response.install_date_days);
2283 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2284 EXPECT_EQ(prefs_days, 42);
2285
2286 // Note that elapsed_days is not necessarily divisible by 7 so check
2287 // that we round down correctly when populating kPrefsInstallDateDays.
2288 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2289 EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2290 EXPECT_TRUE(response.update_exists);
2291 EXPECT_EQ(23, response.install_date_days);
2292 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2293 EXPECT_EQ(prefs_days, 21);
2294
2295 // Check that we correctly handle elapsed_days not being included in
2296 // the Omaha Response.
2297 EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2298 EXPECT_TRUE(response.update_exists);
2299 EXPECT_EQ(-1, response.install_date_days);
2300
2301 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2302}
2303
2304TEST(OmahaRequestActionTest, GetInstallDate) {
2305 string temp_dir;
2306 Prefs prefs;
2307 EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2308 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002309 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002310
2311 // If there is no prefs and OOBE is not complete, we should not
2312 // report anything to Omaha.
2313 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002314 FakeSystemState system_state;
David Zeuthen639aa362014-02-03 16:23:44 -08002315 system_state.set_prefs(&prefs);
2316 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2317 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2318 }
2319
2320 // If OOBE is complete and happened on a valid date (e.g. after Jan
2321 // 1 2007 0:00 PST), that date should be used and written to
2322 // prefs. However, first try with an invalid date and check we do
2323 // nothing.
2324 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002325 FakeSystemState fake_system_state;
2326 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002327
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002328 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002329 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2330 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
David Zeuthen639aa362014-02-03 16:23:44 -08002331 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2332 }
2333
2334 // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2335 // should yield an InstallDate of 14.
2336 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002337 FakeSystemState fake_system_state;
2338 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002339
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002340 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002341 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2342 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002343 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2344
2345 int64_t prefs_days;
2346 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2347 EXPECT_EQ(prefs_days, 14);
2348 }
2349
2350 // Now that we have a valid date in prefs, check that we keep using
2351 // that even if OOBE date reports something else. The date Jan 30,
2352 // 2007 0:00 PST should yield an InstallDate of 28... but since
2353 // there's a prefs file, we should still get 14.
2354 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002355 FakeSystemState fake_system_state;
2356 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002357
Alex Vakulenkod2779df2014-06-16 13:19:00 -07002358 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002359 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2360 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002361
2362 int64_t prefs_days;
2363 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2364 EXPECT_EQ(prefs_days, 14);
2365
2366 // If we delete the prefs file, we should get 28 days.
2367 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002368 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002369 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2370 EXPECT_EQ(prefs_days, 28);
2371 }
2372
2373 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2374}
2375
Darin Petkov6a5b3222010-07-13 14:55:28 -07002376} // namespace chromeos_update_engine