blob: 9cd32941fd9f010ae61886f1a0e2bde25c8bc90f [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
5#include <string>
6#include <vector>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07007
Darin Petkov6a5b3222010-07-13 14:55:28 -07008#include <glib.h>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07009
Alex Vakulenko75039d72014-03-25 12:36:28 -070010#include <base/strings/string_util.h>
11#include <base/strings/stringprintf.h>
12#include <base/time/time.h>
Chris Sosa77f79e82014-06-02 18:16:24 -070013#include <chromeos/dbus/service_constants.h>
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070014#include "gtest/gtest.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070015
Darin Petkov6a5b3222010-07-13 14:55:28 -070016#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070017#include "update_engine/constants.h"
Chris Sosa77f79e82014-06-02 18:16:24 -070018#include "update_engine/mock_connection_manager.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070019#include "update_engine/mock_http_fetcher.h"
20#include "update_engine/omaha_hash_calculator.h"
21#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070022#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070023#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070024#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070025#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070026
Darin Petkov1cbd78f2010-07-29 12:38:34 -070027using base::Time;
28using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070029using std::string;
30using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070031using testing::_;
32using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070033using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070034using testing::Ge;
35using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080036using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070037using testing::Return;
38using testing::SetArgumentPointee;
David Zeuthen33bae492014-02-25 16:16:18 -080039using testing::AnyNumber;
Darin Petkov6a5b3222010-07-13 14:55:28 -070040
41namespace chromeos_update_engine {
42
Jay Srinivasanae4697c2013-03-18 17:08:08 -070043class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070044
45namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070046
Gilad Arnold5bb4c902014-04-10 12:32:13 -070047FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070048OmahaRequestParams kDefaultTestParams(
Gilad Arnold5bb4c902014-04-10 12:32:13 -070049 &fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070050 OmahaRequestParams::kOsPlatform,
51 OmahaRequestParams::kOsVersion,
52 "service_pack",
53 "x86-generic",
54 OmahaRequestParams::kAppId,
55 "0.1.0.0",
56 "en-US",
57 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070058 "OEM MODEL 09235 7471",
Chris Sosac1972482013-04-30 22:31:10 -070059 "ChromeOSFirmware.1.0",
60 "0X0A1",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070061 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080062 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070063 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -070064 false, // update_disabled
65 "", // 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
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070077string GetUpdateResponse2(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -070078 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070079 const string& more_info_url,
80 const string& prompt,
81 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070082 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070083 const string& hash,
84 const string& needsadmin,
85 const string& size,
86 const string& deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -070087 const string& max_days_to_scatter,
David Zeuthen639aa362014-02-03 16:23:44 -080088 const string& elapsed_days,
David Zeuthen8f191b22013-08-06 12:27:50 -070089 bool disable_p2p_for_downloading,
90 bool disable_p2p_for_sharing) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070091 string response =
92 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
93 "protocol=\"3.0\">"
David Zeuthen639aa362014-02-03 16:23:44 -080094 "<daystart elapsed_seconds=\"100\"" +
95 (elapsed_days.empty() ? "" : (" elapsed_days=\"" + elapsed_days + "\"")) +
96 "/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -070097 "<app appid=\"" + app_id + "\" status=\"ok\">"
98 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
99 "<urls><url codebase=\"" + codebase + "\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700100 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700101 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
102 "size=\"" + size + "\"/></packages>"
103 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -0700104 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700105 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
106 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800107 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700108 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700109 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700110 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700111 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
David Zeuthen8f191b22013-08-06 12:27:50 -0700112 (disable_p2p_for_downloading ?
113 "DisableP2PForDownloading=\"true\" " : "") +
114 (disable_p2p_for_sharing ? "DisableP2PForSharing=\"true\" " : "") +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700115 "/></actions></manifest></updatecheck></app></response>";
116 LOG(INFO) << "Response = " << response;
117 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700118}
119
Darin Petkov6a5b3222010-07-13 14:55:28 -0700120string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700121 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700122 const string& more_info_url,
123 const string& prompt,
124 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700125 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700126 const string& hash,
127 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700128 const string& size,
129 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700130 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700131 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700132 more_info_url,
133 prompt,
134 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700135 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700136 hash,
137 needsadmin,
138 size,
139 deadline,
David Zeuthen8f191b22013-08-06 12:27:50 -0700140 "7",
David Zeuthen639aa362014-02-03 16:23:44 -0800141 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700142 false, // disable_p2p_for_downloading
143 false); // disable_p2p_for sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -0700144}
145
146class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
147 public:
148 OmahaRequestActionTestProcessorDelegate()
149 : loop_(NULL),
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700150 expected_code_(ErrorCode::kSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700151 virtual ~OmahaRequestActionTestProcessorDelegate() {
152 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700153 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700154 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700155 ASSERT_TRUE(loop_);
156 g_main_loop_quit(loop_);
157 }
158
159 virtual void ActionCompleted(ActionProcessor* processor,
160 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700161 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700162 // make sure actions always succeed
163 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700164 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700165 else
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700166 EXPECT_EQ(ErrorCode::kSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700167 }
168 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700169 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700170};
171
172gboolean StartProcessorInRunLoop(gpointer data) {
173 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
174 processor->StartProcessing();
175 return FALSE;
176}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700177} // namespace {}
178
179class OutputObjectCollectorAction;
180
181template<>
182class ActionTraits<OutputObjectCollectorAction> {
183 public:
184 // Does not take an object for input
185 typedef OmahaResponse InputObjectType;
186 // On success, puts the output path on output
187 typedef NoneType OutputObjectType;
188};
189
190class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
191 public:
192 OutputObjectCollectorAction() : has_input_object_(false) {}
193 void PerformAction() {
194 // copy input object
195 has_input_object_ = HasInputObject();
196 if (has_input_object_)
197 omaha_response_ = GetInputObject();
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700198 processor_->ActionComplete(this, ErrorCode::kSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700199 }
200 // Should never be called
201 void TerminateProcessing() {
202 CHECK(false);
203 }
204 // Debugging/logging
205 static std::string StaticType() {
206 return "OutputObjectCollectorAction";
207 }
208 std::string Type() const { return StaticType(); }
209 bool has_input_object_;
210 OmahaResponse omaha_response_;
211};
212
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700213// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700214// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
David Zeuthen8f191b22013-08-06 12:27:50 -0700215// used. |payload_state| may be NULL, in which case a local mock is used.
216// |p2p_manager| may be NULL, in which case a local mock is used.
Chris Sosa77f79e82014-06-02 18:16:24 -0700217// |connection_manager| may be NULL, in which case a local mock is used.
David Zeuthen8f191b22013-08-06 12:27:50 -0700218// out_response may be NULL. If |fail_http_response_code| is non-negative,
Darin Petkov265f2902011-05-09 15:17:40 -0700219// the transfer will fail with that code. |ping_only| is passed through to the
220// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
221// post-data received by the mock HttpFetcher is returned.
David Zeuthen33bae492014-02-25 16:16:18 -0800222//
223// The |expected_check_result|, |expected_check_reaction| and
224// |expected_error_code| parameters are for checking expectations
225// about reporting UpdateEngine.Check.{Result,Reaction,DownloadError}
226// UMA statistics. Use the appropriate ::kUnset value to specify that
227// the given metric should not be reported.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700228bool TestUpdateCheck(PrefsInterface* prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -0700229 PayloadStateInterface *payload_state,
230 P2PManager *p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -0700231 ConnectionManager *connection_manager,
David Zeuthen8f191b22013-08-06 12:27:50 -0700232 OmahaRequestParams& params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700233 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700234 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700235 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700236 ErrorCode expected_code,
David Zeuthen33bae492014-02-25 16:16:18 -0800237 metrics::CheckResult expected_check_result,
238 metrics::CheckReaction expected_check_reaction,
239 metrics::DownloadErrorCode expected_download_error_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700240 OmahaResponse* out_response,
241 vector<char>* out_post_data) {
242 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
243 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800244 http_response.size(),
245 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700246 if (fail_http_response_code >= 0) {
247 fetcher->FailTransfer(fail_http_response_code);
248 }
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700249 FakeSystemState fake_system_state;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800250 if (prefs)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700251 fake_system_state.set_prefs(prefs);
David Zeuthen8f191b22013-08-06 12:27:50 -0700252 if (payload_state)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700253 fake_system_state.set_payload_state(payload_state);
David Zeuthen8f191b22013-08-06 12:27:50 -0700254 if (p2p_manager)
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700255 fake_system_state.set_p2p_manager(p2p_manager);
Chris Sosa77f79e82014-06-02 18:16:24 -0700256 if (connection_manager)
257 fake_system_state.set_connection_manager(connection_manager);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700258 fake_system_state.set_request_params(&params);
259 OmahaRequestAction action(&fake_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700260 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700261 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700262 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700263 OmahaRequestActionTestProcessorDelegate delegate;
264 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700265 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700266
Darin Petkov6a5b3222010-07-13 14:55:28 -0700267 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700268 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 processor.EnqueueAction(&action);
270
271 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700272 BondActions(&action, &collector_action);
273 processor.EnqueueAction(&collector_action);
274
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700275 EXPECT_CALL(*fake_system_state.mock_metrics_lib(), SendEnumToUMA(_, _, _))
David Zeuthen33bae492014-02-25 16:16:18 -0800276 .Times(AnyNumber());
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700277 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800278 SendEnumToUMA(metrics::kMetricCheckResult,
279 static_cast<int>(expected_check_result),
280 static_cast<int>(metrics::CheckResult::kNumConstants) - 1))
281 .Times(expected_check_result == metrics::CheckResult::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700282 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthen33bae492014-02-25 16:16:18 -0800283 SendEnumToUMA(metrics::kMetricCheckReaction,
284 static_cast<int>(expected_check_reaction),
285 static_cast<int>(metrics::CheckReaction::kNumConstants) - 1))
286 .Times(expected_check_reaction == metrics::CheckReaction::kUnset ? 0 : 1);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700287 EXPECT_CALL(*fake_system_state.mock_metrics_lib(),
David Zeuthenc0dd0212014-04-04 14:49:49 -0700288 SendSparseToUMA(metrics::kMetricCheckDownloadErrorCode,
289 static_cast<int>(expected_download_error_code)))
David Zeuthen33bae492014-02-25 16:16:18 -0800290 .Times(expected_download_error_code == metrics::DownloadErrorCode::kUnset
291 ? 0 : 1);
292
Darin Petkov6a5b3222010-07-13 14:55:28 -0700293 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
294 g_main_loop_run(loop);
295 g_main_loop_unref(loop);
296 if (collector_action.has_input_object_ && out_response)
297 *out_response = collector_action.omaha_response_;
298 if (out_post_data)
299 *out_post_data = fetcher->post_data();
300 return collector_action.has_input_object_;
301}
302
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700303// Tests Event requests -- they should always succeed. |out_post_data|
304// may be null; if non-null, the post-data received by the mock
305// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700306void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700307 OmahaEvent* event,
308 const string& http_response,
309 vector<char>* out_post_data) {
310 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
311 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800312 http_response.size(),
313 NULL);
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700314 FakeSystemState fake_system_state;
315 fake_system_state.set_request_params(&params);
316 OmahaRequestAction action(&fake_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700317 OmahaRequestActionTestProcessorDelegate delegate;
318 delegate.loop_ = loop;
319 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700320 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700321 processor.EnqueueAction(&action);
322
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700323 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
324 g_main_loop_run(loop);
325 g_main_loop_unref(loop);
326 if (out_post_data)
327 *out_post_data = fetcher->post_data();
328}
329
Darin Petkov6a5b3222010-07-13 14:55:28 -0700330TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700331 OmahaResponse response;
332 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700333 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700334 NULL, // payload_state
335 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700336 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700337 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700338 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700339 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700340 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700341 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800342 metrics::CheckResult::kNoUpdateAvailable,
343 metrics::CheckReaction::kUnset,
344 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700345 &response,
346 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700347 EXPECT_FALSE(response.update_exists);
348}
349
350TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700351 OmahaResponse response;
352 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700353 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700354 NULL, // payload_state
355 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700356 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700357 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700358 GetUpdateResponse(OmahaRequestParams::kAppId,
359 "1.2.3.4", // version
360 "http://more/info",
361 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700362 "http://code/base/", // dl url
363 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700364 "HASH1234=", // checksum
365 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700366 "123", // size
367 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700368 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700369 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700370 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800371 metrics::CheckResult::kUpdateAvailable,
372 metrics::CheckReaction::kUpdating,
373 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700374 &response,
375 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700376 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700377 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700378 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800379 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700380 EXPECT_EQ("http://more/info", response.more_info_url);
381 EXPECT_EQ("HASH1234=", response.hash);
382 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700383 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700384 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700385}
386
Jay Srinivasan0a708742012-03-20 11:26:12 -0700387TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
388 OmahaResponse response;
389 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700390 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700391 ASSERT_FALSE(
392 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700393 NULL, // payload_state
394 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700395 NULL, // connection_manager
Jay Srinivasan0a708742012-03-20 11:26:12 -0700396 params,
397 GetUpdateResponse(OmahaRequestParams::kAppId,
398 "1.2.3.4", // version
399 "http://more/info",
400 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700401 "http://code/base/", // dl url
402 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700403 "HASH1234=", // checksum
404 "false", // needs admin
405 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700406 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700407 -1,
408 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700409 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800410 metrics::CheckResult::kUpdateAvailable,
411 metrics::CheckReaction::kIgnored,
412 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700413 &response,
414 NULL));
415 EXPECT_FALSE(response.update_exists);
416}
417
Chris Sosa77f79e82014-06-02 18:16:24 -0700418TEST(OmahaRequestActionTest, ValidUpdateBlockedByConnection) {
419 OmahaResponse response;
420 // Set up a connection manager that doesn't allow a valid update over
421 // the current ethernet connection.
422 MockConnectionManager mock_cm(NULL);
423 EXPECT_CALL(mock_cm, GetConnectionProperties(_,_,_))
424 .WillRepeatedly(DoAll(SetArgumentPointee<1>(kNetEthernet),
425 SetArgumentPointee<2>(NetworkTethering::kUnknown),
426 Return(true)));
427 EXPECT_CALL(mock_cm, IsUpdateAllowedOver(kNetEthernet, _))
428 .WillRepeatedly(Return(false));
429 EXPECT_CALL(mock_cm, StringForConnectionType(kNetEthernet))
430 .WillRepeatedly(Return(shill::kTypeEthernet));
431
432 ASSERT_FALSE(
433 TestUpdateCheck(NULL, // prefs
434 NULL, // payload_state
435 NULL, // p2p_manager
436 &mock_cm, // connection_manager
437 kDefaultTestParams,
438 GetUpdateResponse(OmahaRequestParams::kAppId,
439 "1.2.3.4", // version
440 "http://more/info",
441 "true", // prompt
442 "http://code/base/", // dl url
443 "file.signed", // file name
444 "HASH1234=", // checksum
445 "false", // needs admin
446 "123", // size
447 ""), // deadline
448 -1,
449 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700450 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700451 metrics::CheckResult::kUpdateAvailable,
452 metrics::CheckReaction::kIgnored,
453 metrics::DownloadErrorCode::kUnset,
454 &response,
455 NULL));
456 EXPECT_FALSE(response.update_exists);
457}
458
459TEST(OmahaRequestActionTest, ValidUpdateBlockedByRollback) {
460 string rollback_version = "1234.0.0";
461 OmahaResponse response;
462
463 MockPayloadState mock_payload_state;
464 EXPECT_CALL(mock_payload_state, GetRollbackVersion())
465 .WillRepeatedly(Return(rollback_version));
466
467 ASSERT_FALSE(
468 TestUpdateCheck(NULL, // prefs
469 &mock_payload_state, // payload_state
470 NULL, // p2p_manager
471 NULL, // connection_manager
472 kDefaultTestParams,
473 GetUpdateResponse(OmahaRequestParams::kAppId,
474 rollback_version, // version
475 "http://more/info",
476 "true", // prompt
477 "http://code/base/", // dl url
478 "file.signed", // file name
479 "HASH1234=", // checksum
480 "false", // needs admin
481 "123", // size
482 ""), // deadline
483 -1,
484 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700485 ErrorCode::kOmahaUpdateIgnoredPerPolicy,
Chris Sosa77f79e82014-06-02 18:16:24 -0700486 metrics::CheckResult::kUpdateAvailable,
487 metrics::CheckReaction::kIgnored,
488 metrics::DownloadErrorCode::kUnset,
489 &response,
490 NULL));
491 EXPECT_FALSE(response.update_exists);
492}
493
Jay Srinivasan0a708742012-03-20 11:26:12 -0700494TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
495 OmahaResponse response;
496 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700497 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700498 ASSERT_TRUE(
499 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700500 NULL, // payload_state
501 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700502 NULL, // connection_manager
Jay Srinivasan0a708742012-03-20 11:26:12 -0700503 params,
504 GetNoUpdateResponse(OmahaRequestParams::kAppId),
505 -1,
506 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700507 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800508 metrics::CheckResult::kNoUpdateAvailable,
509 metrics::CheckReaction::kUnset,
510 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700511 &response,
512 NULL));
513 EXPECT_FALSE(response.update_exists);
514}
515
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700516TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
517 OmahaResponse response;
518 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700519 params.set_wall_clock_based_wait_enabled(true);
520 params.set_update_check_count_wait_enabled(false);
521 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700522
523 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800524 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700525 &prefs_dir));
526 ScopedDirRemover temp_dir_remover(prefs_dir);
527
528 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700529 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700530 << "Failed to initialize preferences.";
531
532 ASSERT_FALSE(
533 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700534 NULL, // payload_state
535 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700536 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700537 params,
538 GetUpdateResponse2(OmahaRequestParams::kAppId,
539 "1.2.3.4", // version
540 "http://more/info",
541 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700542 "http://code/base/", // dl url
543 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700544 "HASH1234=", // checksum
545 "false", // needs admin
546 "123", // size
547 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700548 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800549 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700550 false, // disable_p2p_for_downloading
551 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700552 -1,
553 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700554 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800555 metrics::CheckResult::kUpdateAvailable,
556 metrics::CheckReaction::kDeferring,
557 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700558 &response,
559 NULL));
560 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700561
562 // Verify if we are interactive check we don't defer.
563 params.set_interactive(true);
564 ASSERT_TRUE(
565 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700566 NULL, // payload_state
567 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700568 NULL, // connection_manager
Chris Sosa968d0572013-08-23 14:46:02 -0700569 params,
570 GetUpdateResponse2(OmahaRequestParams::kAppId,
571 "1.2.3.4", // version
572 "http://more/info",
573 "true", // prompt
574 "http://code/base/", // dl url
575 "file.signed", // file name
576 "HASH1234=", // checksum
577 "false", // needs admin
578 "123", // size
579 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700580 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800581 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700582 false, // disable_p2p_for_downloading
583 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700584 -1,
585 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700586 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800587 metrics::CheckResult::kUpdateAvailable,
588 metrics::CheckReaction::kUpdating,
589 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700590 &response,
591 NULL));
592 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700593}
594
595TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
596 OmahaResponse response;
597 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700598 params.set_wall_clock_based_wait_enabled(false);
599 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700600
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700601 params.set_update_check_count_wait_enabled(true);
602 params.set_min_update_checks_needed(1);
603 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700604
605 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800606 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700607 &prefs_dir));
608 ScopedDirRemover temp_dir_remover(prefs_dir);
609
610 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700611 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700612 << "Failed to initialize preferences.";
613
614 ASSERT_TRUE(
615 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700616 NULL, // payload_state
617 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700618 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700619 params,
620 GetUpdateResponse2(OmahaRequestParams::kAppId,
621 "1.2.3.4", // version
622 "http://more/info",
623 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700624 "http://code/base/", // dl url
625 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700626 "HASH1234=", // checksum
627 "false", // needs admin
628 "123", // size
629 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700630 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800631 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700632 false, // disable_p2p_for_downloading
633 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700634 -1,
635 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700636 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800637 metrics::CheckResult::kUpdateAvailable,
638 metrics::CheckReaction::kUpdating,
639 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700640 &response,
641 NULL));
642 EXPECT_TRUE(response.update_exists);
643}
644
645TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
646 OmahaResponse response;
647 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700648 params.set_wall_clock_based_wait_enabled(true);
649 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700650
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700651 params.set_update_check_count_wait_enabled(true);
652 params.set_min_update_checks_needed(1);
653 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700654
655 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800656 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700657 &prefs_dir));
658 ScopedDirRemover temp_dir_remover(prefs_dir);
659
660 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700661 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700662 << "Failed to initialize preferences.";
663
664 ASSERT_TRUE(
665 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700666 NULL, // payload_state
667 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700668 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700669 params,
670 GetUpdateResponse2(OmahaRequestParams::kAppId,
671 "1.2.3.4", // version
672 "http://more/info",
673 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700674 "http://code/base/", // dl url
675 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700676 "HASH1234=", // checksum
677 "false", // needs admin
678 "123", // size
679 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700680 "0", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800681 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700682 false, // disable_p2p_for_downloading
683 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700684 -1,
685 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700686 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800687 metrics::CheckResult::kUpdateAvailable,
688 metrics::CheckReaction::kUpdating,
689 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700690 &response,
691 NULL));
692 EXPECT_TRUE(response.update_exists);
693}
694
695
696TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
697 OmahaResponse response;
698 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700699 params.set_wall_clock_based_wait_enabled(true);
700 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700701
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700702 params.set_update_check_count_wait_enabled(true);
703 params.set_min_update_checks_needed(0);
704 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700705
706 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800707 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700708 &prefs_dir));
709 ScopedDirRemover temp_dir_remover(prefs_dir);
710
711 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700712 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700713 << "Failed to initialize preferences.";
714
715 ASSERT_TRUE(TestUpdateCheck(
716 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700717 NULL, // payload_state
718 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700719 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700720 params,
721 GetUpdateResponse2(OmahaRequestParams::kAppId,
722 "1.2.3.4", // version
723 "http://more/info",
724 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700725 "http://code/base/", // dl url
726 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700727 "HASH1234=", // checksum
728 "false", // needs admin
729 "123", // size
730 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700731 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800732 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700733 false, // disable_p2p_for_downloading
734 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700735 -1,
736 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700737 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800738 metrics::CheckResult::kUpdateAvailable,
739 metrics::CheckReaction::kUpdating,
740 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700741 &response,
742 NULL));
743
744 int64 count;
745 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
746 ASSERT_TRUE(count == 0);
747 EXPECT_TRUE(response.update_exists);
748}
749
750TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
751 OmahaResponse response;
752 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700753 params.set_wall_clock_based_wait_enabled(true);
754 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700755
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700756 params.set_update_check_count_wait_enabled(true);
757 params.set_min_update_checks_needed(1);
758 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700759
760 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800761 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700762 &prefs_dir));
763 ScopedDirRemover temp_dir_remover(prefs_dir);
764
765 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700766 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700767 << "Failed to initialize preferences.";
768
769 ASSERT_FALSE(TestUpdateCheck(
770 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700771 NULL, // payload_state
772 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700773 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700774 params,
775 GetUpdateResponse2(OmahaRequestParams::kAppId,
776 "1.2.3.4", // version
777 "http://more/info",
778 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700779 "http://code/base/", // dl url
780 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700781 "HASH1234=", // checksum
782 "false", // needs admin
783 "123", // size
784 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700785 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800786 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700787 false, // disable_p2p_for_downloading
788 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700789 -1,
790 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700791 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800792 metrics::CheckResult::kUpdateAvailable,
793 metrics::CheckReaction::kDeferring,
794 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700795 &response,
796 NULL));
797
798 int64 count;
799 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
800 ASSERT_TRUE(count > 0);
801 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700802
803 // Verify if we are interactive check we don't defer.
804 params.set_interactive(true);
805 ASSERT_TRUE(
806 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700807 NULL, // payload_state
808 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700809 NULL, // connection_manager
Chris Sosa968d0572013-08-23 14:46:02 -0700810 params,
811 GetUpdateResponse2(OmahaRequestParams::kAppId,
812 "1.2.3.4", // version
813 "http://more/info",
814 "true", // prompt
815 "http://code/base/", // dl url
816 "file.signed", // file name
817 "HASH1234=", // checksum
818 "false", // needs admin
819 "123", // size
820 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700821 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800822 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700823 false, // disable_p2p_for_downloading
824 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700825 -1,
826 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700827 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800828 metrics::CheckResult::kUpdateAvailable,
829 metrics::CheckReaction::kUpdating,
830 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700831 &response,
832 NULL));
833 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834}
835
836TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
837 OmahaResponse response;
838 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700839 params.set_wall_clock_based_wait_enabled(true);
840 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700841
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700842 params.set_update_check_count_wait_enabled(true);
843 params.set_min_update_checks_needed(1);
844 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700845
846 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -0800847 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700848 &prefs_dir));
849 ScopedDirRemover temp_dir_remover(prefs_dir);
850
851 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -0700852 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700853 << "Failed to initialize preferences.";
854
855 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
856
857 ASSERT_FALSE(TestUpdateCheck(
858 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700859 NULL, // payload_state
860 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700861 NULL, // connection_manager
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700862 params,
863 GetUpdateResponse2(OmahaRequestParams::kAppId,
864 "1.2.3.4", // version
865 "http://more/info",
866 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700867 "http://code/base/", // dl url
868 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700869 "HASH1234=", // checksum
870 "false", // needs admin
871 "123", // size
872 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700873 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800874 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700875 false, // disable_p2p_for_downloading
876 false), // disable_p2p_for sharing
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700877 -1,
878 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700879 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -0800880 metrics::CheckResult::kUpdateAvailable,
881 metrics::CheckReaction::kDeferring,
882 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700883 &response,
884 NULL));
885
886 int64 count;
887 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
888 // count remains the same, as the decrementing happens in update_attempter
889 // which this test doesn't exercise.
890 ASSERT_TRUE(count == 5);
891 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700892
893 // Verify if we are interactive check we don't defer.
894 params.set_interactive(true);
895 ASSERT_TRUE(
896 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700897 NULL, // payload_state
898 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700899 NULL, // connection_manager
Chris Sosa968d0572013-08-23 14:46:02 -0700900 params,
901 GetUpdateResponse2(OmahaRequestParams::kAppId,
902 "1.2.3.4", // version
903 "http://more/info",
904 "true", // prompt
905 "http://code/base/", // dl url
906 "file.signed", // file name
907 "HASH1234=", // checksum
908 "false", // needs admin
909 "123", // size
910 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -0700911 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -0800912 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -0700913 false, // disable_p2p_for_downloading
914 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -0700915 -1,
916 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700917 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -0800918 metrics::CheckResult::kUpdateAvailable,
919 metrics::CheckReaction::kUpdating,
920 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -0700921 &response,
922 NULL));
923 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700924}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700925
Darin Petkov6a5b3222010-07-13 14:55:28 -0700926TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700927 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
928
929 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
930
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700931 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700932 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -0700933 fake_system_state.set_request_params(&params);
934 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700935 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800936 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700937 NULL),
938 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700939 OmahaRequestActionTestProcessorDelegate delegate;
940 delegate.loop_ = loop;
941 ActionProcessor processor;
942 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700943 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700944
945 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
946 g_main_loop_run(loop);
947 g_main_loop_unref(loop);
948 EXPECT_FALSE(processor.IsRunning());
949}
950
951TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700952 OmahaResponse response;
953 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700954 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700955 NULL, // payload_state
956 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700957 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700958 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700959 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700960 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700961 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700962 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800963 metrics::CheckResult::kParsingError,
964 metrics::CheckReaction::kUnset,
965 metrics::DownloadErrorCode::kUnset,
Darin Petkovedc522e2010-11-05 09:35:17 -0700966 &response,
967 NULL));
968 EXPECT_FALSE(response.update_exists);
969}
970
971TEST(OmahaRequestActionTest, EmptyResponseTest) {
972 OmahaResponse response;
973 ASSERT_FALSE(
974 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700975 NULL, // payload_state
976 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700977 NULL, // connection_manager
Darin Petkovedc522e2010-11-05 09:35:17 -0700978 kDefaultTestParams,
979 "",
980 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700981 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -0700982 ErrorCode::kOmahaRequestEmptyResponseError,
David Zeuthen33bae492014-02-25 16:16:18 -0800983 metrics::CheckResult::kParsingError,
984 metrics::CheckReaction::kUnset,
985 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700986 &response,
987 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700988 EXPECT_FALSE(response.update_exists);
989}
990
991TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700992 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700993 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700994 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -0700995 NULL, // payload_state
996 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -0700997 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700998 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700999 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1000 "<daystart elapsed_seconds=\"100\"/>"
1001 "<app appid=\"foo\" status=\"ok\">"
1002 "<ping status=\"ok\"/>"
1003 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001004 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001005 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001006 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001007 metrics::CheckResult::kParsingError,
1008 metrics::CheckReaction::kUnset,
1009 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001010 &response,
1011 NULL));
1012 EXPECT_FALSE(response.update_exists);
1013}
1014
1015TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001016 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001017 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001018 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001019 NULL, // payload_state
1020 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001021 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001022 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001023 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1024 "<daystart elapsed_seconds=\"100\"/>"
1025 "<app appid=\"foo\" status=\"ok\">"
1026 "<ping status=\"ok\"/>"
1027 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001028 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001029 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001030 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001031 metrics::CheckResult::kParsingError,
1032 metrics::CheckReaction::kUnset,
1033 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001034 &response,
1035 NULL));
1036 EXPECT_FALSE(response.update_exists);
1037}
1038
1039TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001040 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001041 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001042 NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001043 NULL, // payload_state
1044 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001045 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001046 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001047 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1048 "<daystart elapsed_seconds=\"100\"/>"
1049 "<app appid=\"foo\" status=\"ok\">"
1050 "<ping status=\"ok\"/>"
1051 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001052 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001053 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001054 ErrorCode::kOmahaResponseInvalid,
David Zeuthen33bae492014-02-25 16:16:18 -08001055 metrics::CheckResult::kParsingError,
1056 metrics::CheckReaction::kUnset,
1057 metrics::DownloadErrorCode::kUnset,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001058 &response,
1059 NULL));
1060 EXPECT_FALSE(response.update_exists);
1061}
1062
1063TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001064 string input_response =
1065 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
1066 "<daystart elapsed_seconds=\"100\"/>"
1067 "<app appid=\"xyz\" status=\"ok\">"
1068 "<updatecheck status=\"ok\">"
1069 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -07001070 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001071 "<packages><package hash=\"not-used\" name=\"f\" "
1072 "size=\"587\"/></packages>"
1073 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001074 "ChromeOSVersion=\"10.2.3.4\" "
1075 "Prompt=\"false\" "
1076 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -08001077 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001078 "sha256=\"lkq34j5345\" "
1079 "needsadmin=\"true\" "
1080 "/></actions></manifest></updatecheck></app></response>";
1081 LOG(INFO) << "Input Response = " << input_response;
1082
Darin Petkov6a5b3222010-07-13 14:55:28 -07001083 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001084 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001085 NULL, // payload_state
1086 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001087 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001088 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001089 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -07001090 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001091 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001092 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001093 metrics::CheckResult::kUpdateAvailable,
1094 metrics::CheckReaction::kUpdating,
1095 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001096 &response,
1097 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001098 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -07001099 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001100 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001101 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001102 EXPECT_EQ("lkq34j5345", response.hash);
1103 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001104 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -07001105 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001106}
1107
1108namespace {
1109class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
1110 public:
1111 void ProcessingStopped(const ActionProcessor* processor) {
1112 ASSERT_TRUE(loop_);
1113 g_main_loop_quit(loop_);
1114 }
1115 GMainLoop *loop_;
1116};
1117
1118gboolean TerminateTransferTestStarter(gpointer data) {
1119 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
1120 processor->StartProcessing();
1121 CHECK(processor->IsRunning());
1122 processor->StopProcessing();
1123 return FALSE;
1124}
1125} // namespace {}
1126
1127TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001128 string http_response("doesn't matter");
1129 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
1130
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001131 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001132 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001133 fake_system_state.set_request_params(&params);
1134 OmahaRequestAction action(&fake_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001135 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001136 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001137 NULL),
1138 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001139 TerminateEarlyTestProcessorDelegate delegate;
1140 delegate.loop_ = loop;
1141 ActionProcessor processor;
1142 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001143 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001144
1145 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
1146 g_main_loop_run(loop);
1147 g_main_loop_unref(loop);
1148}
1149
1150TEST(OmahaRequestActionTest, XmlEncodeTest) {
1151 EXPECT_EQ("ab", XmlEncode("ab"));
1152 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
1153 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
1154 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
1155 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
1156
1157 vector<char> post_data;
1158
1159 // Make sure XML Encode is being called on the params
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001160 FakeSystemState fake_system_state;
1161 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001162 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -07001163 OmahaRequestParams::kOsVersion,
1164 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001165 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -07001166 OmahaRequestParams::kAppId,
1167 "0.1.0.0",
1168 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001169 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -07001170 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -07001171 "ChromeOSFirmware.1.0",
1172 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001173 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001174 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001175 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001176 false, // update_disabled
1177 "", // target_version_prefix
1178 false, // use_p2p_for_downloading
1179 false); // use_p2p_for_sharing
Darin Petkov6a5b3222010-07-13 14:55:28 -07001180 OmahaResponse response;
1181 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001182 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001183 NULL, // payload_state
1184 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001185 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001186 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001187 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001188 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001189 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001190 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001191 metrics::CheckResult::kParsingError,
1192 metrics::CheckReaction::kUnset,
1193 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001194 &response,
1195 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001196 // convert post_data to string
1197 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -07001198 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
1199 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001200 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
1201 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
1202 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
1203 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001204 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
1205 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -07001206}
1207
1208TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001209 OmahaResponse response;
1210 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001211 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001212 NULL, // payload_state
1213 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001214 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001215 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001216 GetUpdateResponse(OmahaRequestParams::kAppId,
1217 "1.2.3.4", // version
1218 "testthe&lt;url", // more info
1219 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001220 "testthe&amp;codebase/", // dl url
1221 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001222 "HASH1234=", // checksum
1223 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -07001224 "123", // size
1225 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -07001226 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001227 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001228 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001229 metrics::CheckResult::kUpdateAvailable,
1230 metrics::CheckReaction::kUpdating,
1231 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001232 &response,
1233 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001234
1235 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001236 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -07001237 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -07001238}
1239
1240TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -07001241 OmahaResponse response;
1242 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001243 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001244 NULL, // payload_state
1245 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001246 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001247 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001248 GetUpdateResponse(OmahaRequestParams::kAppId,
1249 "1.2.3.4", // version
1250 "theurl", // more info
1251 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001252 "thecodebase/", // dl url
1253 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001254 "HASH1234=", // checksum
1255 "false", // needs admin
1256 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -07001257 "123123123123123", // size
1258 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -07001259 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001260 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001261 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001262 metrics::CheckResult::kUpdateAvailable,
1263 metrics::CheckReaction::kUpdating,
1264 metrics::DownloadErrorCode::kUnset,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001265 &response,
1266 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -07001267
1268 EXPECT_EQ(response.size, 123123123123123ll);
1269}
1270
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001271TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
1272 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -08001273 NiceMock<PrefsMock> prefs;
1274 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
1275 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001276 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -08001277 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001278 NULL, // payload_state
1279 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001280 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001281 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001282 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001283 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001284 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001285 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001286 metrics::CheckResult::kParsingError,
1287 metrics::CheckReaction::kUnset,
1288 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001289 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001290 &post_data));
1291 // convert post_data to string
1292 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001293 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001294 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001295 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001296 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -07001297 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1298 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001299 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1300 string::npos);
1301 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1302 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001303}
1304
Jay Srinivasan0a708742012-03-20 11:26:12 -07001305
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001306TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -08001307 vector<char> post_data;
1308 NiceMock<PrefsMock> prefs;
1309 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -07001310 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001311 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -07001312 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001313 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -08001314 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001315 NULL, // payload_state
1316 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001317 NULL, // connection_manager
Jay Srinivasan0a708742012-03-20 11:26:12 -07001318 params,
Darin Petkov95508da2011-01-05 12:42:29 -08001319 "invalid xml>",
1320 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001321 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001322 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001323 metrics::CheckResult::kParsingError,
1324 metrics::CheckReaction::kUnset,
1325 metrics::DownloadErrorCode::kUnset,
Darin Petkov95508da2011-01-05 12:42:29 -08001326 NULL, // response
1327 &post_data));
1328 // convert post_data to string
1329 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001330 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001331 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001332 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001333 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001334 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1335 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001336 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1337 string::npos);
1338 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1339 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001340}
1341
Darin Petkove17f86b2010-07-20 09:12:01 -07001342TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1343 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001344 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001345 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1346 "invalid xml>",
1347 &post_data);
1348 // convert post_data to string
1349 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001350 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001351 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001352 OmahaEvent::kTypeUpdateDownloadStarted,
1353 OmahaEvent::kResultSuccess);
1354 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001355 EXPECT_EQ(post_str.find("ping"), string::npos);
1356 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001357}
1358
1359TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1360 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001361 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001362 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1363 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001364 ErrorCode::kError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001365 "invalid xml>",
1366 &post_data);
1367 // convert post_data to string
1368 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001369 string expected_event = base::StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001370 " <event eventtype=\"%d\" eventresult=\"%d\" "
1371 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001372 OmahaEvent::kTypeDownloadComplete,
1373 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001374 static_cast<int>(ErrorCode::kError));
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001375 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001376 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001377}
1378
1379TEST(OmahaRequestActionTest, IsEventTest) {
1380 string http_response("doesn't matter");
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001381 FakeSystemState fake_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001382 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001383 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001384 OmahaRequestAction update_check_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001385 &fake_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001386 NULL,
1387 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001388 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001389 NULL),
1390 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001391 EXPECT_FALSE(update_check_action.IsEvent());
1392
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001393 params = kDefaultTestParams;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001394 fake_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001395 OmahaRequestAction event_action(
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001396 &fake_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001397 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001398 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001399 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001400 NULL),
1401 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001402 EXPECT_TRUE(event_action.IsEvent());
1403}
1404
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001405TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1406 for (int i = 0; i < 2; i++) {
1407 bool delta_okay = i == 1;
1408 const char* delta_okay_str = delta_okay ? "true" : "false";
1409 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001410 FakeSystemState fake_system_state;
1411 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001412 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001413 OmahaRequestParams::kOsVersion,
1414 "service_pack",
1415 "x86-generic",
1416 OmahaRequestParams::kAppId,
1417 "0.1.0.0",
1418 "en-US",
1419 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001420 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001421 "ChromeOSFirmware.1.0",
1422 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001423 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001424 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001425 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001426 false, // update_disabled
1427 "", // target_version_prefix
1428 false, // use_p2p_for_downloading
1429 false); // use_p2p_for_sharing
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001430 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001431 NULL, // payload_state
1432 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001433 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001434 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001435 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001436 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001437 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001438 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001439 metrics::CheckResult::kParsingError,
1440 metrics::CheckReaction::kUnset,
1441 metrics::DownloadErrorCode::kUnset,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001442 NULL,
1443 &post_data));
1444 // convert post_data to string
Alex Vakulenko75039d72014-03-25 12:36:28 -07001445 string post_str(post_data.data(), post_data.size());
1446 EXPECT_NE(post_str.find(base::StringPrintf(" delta_okay=\"%s\"",
1447 delta_okay_str)),
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001448 string::npos)
1449 << "i = " << i;
1450 }
1451}
1452
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001453TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1454 for (int i = 0; i < 2; i++) {
1455 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001456 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001457 vector<char> post_data;
Gilad Arnold5bb4c902014-04-10 12:32:13 -07001458 FakeSystemState fake_system_state;
1459 OmahaRequestParams params(&fake_system_state,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001460 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001461 OmahaRequestParams::kOsVersion,
1462 "service_pack",
1463 "x86-generic",
1464 OmahaRequestParams::kAppId,
1465 "0.1.0.0",
1466 "en-US",
1467 "unittest_track",
1468 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001469 "ChromeOSFirmware.1.0",
1470 "EC100",
David Zeuthen8f191b22013-08-06 12:27:50 -07001471 true, // delta_okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001472 interactive,
1473 "http://url",
David Zeuthen8f191b22013-08-06 12:27:50 -07001474 false, // update_disabled
1475 "", // target_version_prefix
1476 false, // use_p2p_for_downloading
1477 false); // use_p2p_for_sharing
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001478 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001479 NULL, // payload_state
1480 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001481 NULL, // connection_manager
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001482 params,
1483 "invalid xml>",
1484 -1,
1485 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001486 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001487 metrics::CheckResult::kParsingError,
1488 metrics::CheckReaction::kUnset,
1489 metrics::DownloadErrorCode::kUnset,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001490 NULL,
1491 &post_data));
1492 // convert post_data to string
1493 string post_str(&post_data[0], post_data.size());
Alex Vakulenko75039d72014-03-25 12:36:28 -07001494 EXPECT_NE(post_str.find(base::StringPrintf("installsource=\"%s\"",
1495 interactive_str)),
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001496 string::npos)
1497 << "i = " << i;
1498 }
1499}
1500
Darin Petkove17f86b2010-07-20 09:12:01 -07001501TEST(OmahaRequestActionTest, OmahaEventTest) {
1502 OmahaEvent default_event;
1503 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1504 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001505 EXPECT_EQ(ErrorCode::kError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001506
1507 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1508 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1509 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001510 EXPECT_EQ(ErrorCode::kSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001511
1512 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1513 OmahaEvent::kResultError,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001514 ErrorCode::kError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001515 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1516 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001517 EXPECT_EQ(ErrorCode::kError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001518}
1519
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001520TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001521 for (int ping_only = 0; ping_only < 2; ping_only++) {
1522 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001523 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1524 .Times(AnyNumber());
1525 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov265f2902011-05-09 15:17:40 -07001526 // Add a few hours to the day difference to test no rounding, etc.
1527 int64_t five_days_ago =
1528 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1529 int64_t six_days_ago =
1530 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001531 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1532 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov265f2902011-05-09 15:17:40 -07001533 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1534 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1535 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1536 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1537 vector<char> post_data;
1538 ASSERT_TRUE(
1539 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001540 NULL, // payload_state
1541 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001542 NULL, // connection_manager
Darin Petkov265f2902011-05-09 15:17:40 -07001543 kDefaultTestParams,
1544 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1545 -1,
1546 ping_only,
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001547 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001548 metrics::CheckResult::kUnset,
1549 metrics::CheckReaction::kUnset,
1550 metrics::DownloadErrorCode::kUnset,
Darin Petkov265f2902011-05-09 15:17:40 -07001551 NULL,
1552 &post_data));
1553 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001554 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001555 string::npos);
1556 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001557 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001558 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1559 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001560 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001561 EXPECT_NE(post_str.find("previousversion"), string::npos);
1562 }
1563 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001564}
1565
1566TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001567 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001568 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1569 .Times(AnyNumber());
1570 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001571 int64_t three_days_ago =
1572 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1573 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001574 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1575 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001576 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1577 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1578 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1579 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1580 vector<char> post_data;
1581 ASSERT_TRUE(
1582 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001583 NULL, // payload_state
1584 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001585 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001586 kDefaultTestParams,
1587 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001588 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001589 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001590 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001591 metrics::CheckResult::kNoUpdateAvailable,
1592 metrics::CheckReaction::kUnset,
1593 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001594 NULL,
1595 &post_data));
1596 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001597 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001598 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001599}
1600
1601TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001602 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001603 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1604 .Times(AnyNumber());
1605 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001606 int64_t four_days_ago =
1607 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1608 int64_t now = Time::Now().ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001609 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1610 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001611 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1612 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1613 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1614 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1615 vector<char> post_data;
1616 ASSERT_TRUE(
1617 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001618 NULL, // payload_state
1619 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001620 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001621 kDefaultTestParams,
1622 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001623 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001624 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001625 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001626 metrics::CheckResult::kNoUpdateAvailable,
1627 metrics::CheckReaction::kUnset,
1628 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001629 NULL,
1630 &post_data));
1631 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001632 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001633 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001634}
1635
1636TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001637 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001638 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1639 .Times(AnyNumber());
1640 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001641 int64_t one_hour_ago =
1642 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001643 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1644 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001645 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1646 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1647 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1648 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1649 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1650 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1651 vector<char> post_data;
1652 ASSERT_TRUE(
1653 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001654 NULL, // payload_state
1655 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001656 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001657 kDefaultTestParams,
1658 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001659 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001660 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001661 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001662 metrics::CheckResult::kNoUpdateAvailable,
1663 metrics::CheckReaction::kUnset,
1664 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001665 NULL,
1666 &post_data));
1667 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001668 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001669}
1670
Thieu Leb44e9e82011-06-06 14:34:04 -07001671TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1672 // This test ensures that we ignore empty ping only requests.
1673 NiceMock<PrefsMock> prefs;
1674 int64_t now = Time::Now().ToInternalValue();
1675 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1676 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1677 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1678 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1679 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1680 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1681 vector<char> post_data;
1682 EXPECT_TRUE(
1683 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001684 NULL, // payload_state
1685 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001686 NULL, // connection_manager
Thieu Leb44e9e82011-06-06 14:34:04 -07001687 kDefaultTestParams,
1688 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1689 -1,
1690 true, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001691 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001692 metrics::CheckResult::kUnset,
1693 metrics::CheckReaction::kUnset,
1694 metrics::DownloadErrorCode::kUnset,
Thieu Leb44e9e82011-06-06 14:34:04 -07001695 NULL,
1696 &post_data));
1697 EXPECT_EQ(post_data.size(), 0);
1698}
1699
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001700TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001701 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001702 EXPECT_CALL(prefs, GetInt64(kPrefsMetricsCheckLastReportingTime, _))
1703 .Times(AnyNumber());
1704 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001705 int64_t future =
1706 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
David Zeuthen639aa362014-02-03 16:23:44 -08001707 EXPECT_CALL(prefs, GetInt64(kPrefsInstallDateDays, _))
1708 .WillOnce(DoAll(SetArgumentPointee<1>(0), Return(true)));
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001709 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1710 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1711 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1712 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1713 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1714 .WillOnce(Return(true));
1715 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1716 .WillOnce(Return(true));
1717 vector<char> post_data;
1718 ASSERT_TRUE(
1719 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001720 NULL, // payload_state
1721 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001722 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001723 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001724 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1725 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001726 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001727 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001728 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001729 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001730 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001731 metrics::CheckResult::kNoUpdateAvailable,
1732 metrics::CheckReaction::kUnset,
1733 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001734 NULL,
1735 &post_data));
1736 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001737 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001738}
1739
1740TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1741 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001742 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001743 // may fail if it runs for longer than 5 seconds. It shouldn't run
1744 // that long though.
1745 int64_t midnight =
1746 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1747 int64_t midnight_slack =
1748 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001749 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001750 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1751 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001752 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1753 AllOf(Ge(midnight), Le(midnight_slack))))
1754 .WillOnce(Return(true));
1755 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1756 AllOf(Ge(midnight), Le(midnight_slack))))
1757 .WillOnce(Return(true));
1758 ASSERT_TRUE(
1759 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001760 NULL, // payload_state
1761 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001762 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001763 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001764 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1765 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001766 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001767 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001768 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001769 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001770 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001771 metrics::CheckResult::kNoUpdateAvailable,
1772 metrics::CheckReaction::kUnset,
1773 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001774 NULL,
1775 NULL));
1776}
1777
1778TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001779 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001780 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1781 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001782 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1783 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1784 ASSERT_TRUE(
1785 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001786 NULL, // payload_state
1787 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001788 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001789 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001790 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1791 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001792 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001793 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001794 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001795 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001796 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001797 metrics::CheckResult::kNoUpdateAvailable,
1798 metrics::CheckReaction::kUnset,
1799 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001800 NULL,
1801 NULL));
1802}
1803
1804TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001805 NiceMock<PrefsMock> prefs;
David Zeuthen33bae492014-02-25 16:16:18 -08001806 EXPECT_CALL(prefs, GetInt64(_, _)).Times(AnyNumber());
1807 EXPECT_CALL(prefs, SetInt64(_, _)).Times(AnyNumber());
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001808 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1809 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1810 ASSERT_TRUE(
1811 TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07001812 NULL, // payload_state
1813 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001814 NULL, // connection_manager
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001815 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001816 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1817 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001818 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001819 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001820 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001821 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001822 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001823 metrics::CheckResult::kNoUpdateAvailable,
1824 metrics::CheckReaction::kUnset,
1825 metrics::DownloadErrorCode::kUnset,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001826 NULL,
1827 NULL));
1828}
1829
Darin Petkov84c763c2010-07-29 16:27:58 -07001830TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1831 vector<char> post_data;
1832 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001833 NULL, // payload_state
1834 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001835 NULL, // connection_manager
Darin Petkov84c763c2010-07-29 16:27:58 -07001836 kDefaultTestParams,
1837 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001838 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001839 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001840 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08001841 metrics::CheckResult::kParsingError,
1842 metrics::CheckReaction::kUnset,
1843 metrics::DownloadErrorCode::kUnset,
Darin Petkov84c763c2010-07-29 16:27:58 -07001844 NULL, // response
1845 &post_data));
1846 // convert post_data to string
1847 string post_str(&post_data[0], post_data.size());
1848 EXPECT_EQ(post_str.find("machineid="), string::npos);
1849 EXPECT_EQ(post_str.find("userid="), string::npos);
1850}
1851
Darin Petkovedc522e2010-11-05 09:35:17 -07001852TEST(OmahaRequestActionTest, NetworkFailureTest) {
1853 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001854 const int http_error_code =
1855 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 501;
Darin Petkovedc522e2010-11-05 09:35:17 -07001856 ASSERT_FALSE(
1857 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001858 NULL, // payload_state
1859 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001860 NULL, // connection_manager
Darin Petkovedc522e2010-11-05 09:35:17 -07001861 kDefaultTestParams,
1862 "",
1863 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001864 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001865 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001866 metrics::CheckResult::kDownloadError,
1867 metrics::CheckReaction::kUnset,
1868 static_cast<metrics::DownloadErrorCode>(501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001869 &response,
1870 NULL));
1871 EXPECT_FALSE(response.update_exists);
1872}
1873
1874TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1875 OmahaResponse response;
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001876 const int http_error_code =
1877 static_cast<int>(ErrorCode::kOmahaRequestHTTPResponseBase) + 999;
Darin Petkovedc522e2010-11-05 09:35:17 -07001878 ASSERT_FALSE(
1879 TestUpdateCheck(NULL, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001880 NULL, // payload_state
1881 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001882 NULL, // connection_manager
Darin Petkovedc522e2010-11-05 09:35:17 -07001883 kDefaultTestParams,
1884 "",
1885 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001886 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001887 static_cast<ErrorCode>(http_error_code),
David Zeuthen33bae492014-02-25 16:16:18 -08001888 metrics::CheckResult::kDownloadError,
1889 metrics::CheckReaction::kUnset,
1890 metrics::DownloadErrorCode::kHttpStatusOther,
Darin Petkovedc522e2010-11-05 09:35:17 -07001891 &response,
1892 NULL));
1893 EXPECT_FALSE(response.update_exists);
1894}
1895
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001896TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1897 OmahaResponse response;
1898 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001899 params.set_wall_clock_based_wait_enabled(true);
1900 params.set_waiting_period(TimeDelta().FromDays(1));
1901 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001902
1903 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001904 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001905 &prefs_dir));
1906 ScopedDirRemover temp_dir_remover(prefs_dir);
1907
1908 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001909 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001910 << "Failed to initialize preferences.";
1911
1912 ASSERT_FALSE(TestUpdateCheck(
1913 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001914 NULL, // payload_state
1915 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001916 NULL, // connection_manager
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001917 params,
1918 GetUpdateResponse2(OmahaRequestParams::kAppId,
1919 "1.2.3.4", // version
1920 "http://more/info",
1921 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001922 "http://code/base/", // dl url
1923 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001924 "HASH1234=", // checksum
1925 "false", // needs admin
1926 "123", // size
1927 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -07001928 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08001929 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001930 false, // disable_p2p_for_downloading
1931 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001932 -1,
1933 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001934 ErrorCode::kOmahaUpdateDeferredPerPolicy,
David Zeuthen33bae492014-02-25 16:16:18 -08001935 metrics::CheckResult::kUpdateAvailable,
1936 metrics::CheckReaction::kDeferring,
1937 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001938 &response,
1939 NULL));
1940
1941 int64 timestamp = 0;
1942 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1943 ASSERT_TRUE(timestamp > 0);
1944 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001945
1946 // Verify if we are interactive check we don't defer.
1947 params.set_interactive(true);
1948 ASSERT_TRUE(
1949 TestUpdateCheck(&prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07001950 NULL, // payload_state
1951 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07001952 NULL, // connection_manager
Chris Sosa968d0572013-08-23 14:46:02 -07001953 params,
1954 GetUpdateResponse2(OmahaRequestParams::kAppId,
1955 "1.2.3.4", // version
1956 "http://more/info",
1957 "true", // prompt
1958 "http://code/base/", // dl url
1959 "file.signed", // file name
1960 "HASH1234=", // checksum
1961 "false", // needs admin
1962 "123", // size
1963 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -07001964 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08001965 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07001966 false, // disable_p2p_for_downloading
1967 false), // disable_p2p_for sharing
Chris Sosa968d0572013-08-23 14:46:02 -07001968 -1,
1969 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07001970 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08001971 metrics::CheckResult::kUpdateAvailable,
1972 metrics::CheckReaction::kUpdating,
1973 metrics::DownloadErrorCode::kUnset,
Chris Sosa968d0572013-08-23 14:46:02 -07001974 &response,
1975 NULL));
1976 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001977}
1978
1979TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1980 OmahaResponse response;
1981 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001982 params.set_wall_clock_based_wait_enabled(true);
1983 params.set_waiting_period(TimeDelta().FromDays(1));
1984 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001985
1986 string prefs_dir;
Gilad Arnolda6742b32014-01-11 00:18:34 -08001987 EXPECT_TRUE(utils::MakeTempDirectory("ue_ut_prefs.XXXXXX",
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001988 &prefs_dir));
1989 ScopedDirRemover temp_dir_remover(prefs_dir);
1990
1991 Prefs prefs;
Alex Vakulenko75039d72014-03-25 12:36:28 -07001992 LOG_IF(ERROR, !prefs.Init(base::FilePath(prefs_dir)))
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001993 << "Failed to initialize preferences.";
1994
1995 // Set the timestamp to a very old value such that it exceeds the
1996 // waiting period set above.
1997 Time t1;
1998 Time::FromString("1/1/2012", &t1);
1999 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
2000 ASSERT_TRUE(TestUpdateCheck(
2001 &prefs, // prefs
David Zeuthen8f191b22013-08-06 12:27:50 -07002002 NULL, // payload_state
2003 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002004 NULL, // connection_manager
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002005 params,
2006 GetUpdateResponse2(OmahaRequestParams::kAppId,
2007 "1.2.3.4", // version
2008 "http://more/info",
2009 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07002010 "http://code/base/", // dl url
2011 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002012 "HASH1234=", // checksum
2013 "false", // needs admin
2014 "123", // size
2015 "", // deadline
David Zeuthen8f191b22013-08-06 12:27:50 -07002016 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002017 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002018 false, // disable_p2p_for_downloading
2019 false), // disable_p2p_for sharing
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002020 -1,
2021 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002022 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002023 metrics::CheckResult::kUpdateAvailable,
2024 metrics::CheckReaction::kUpdating,
2025 metrics::DownloadErrorCode::kUnset,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07002026 &response,
2027 NULL));
2028
2029 EXPECT_TRUE(response.update_exists);
2030
2031 // Make sure the timestamp t1 is unchanged showing that it was reused.
2032 int64 timestamp = 0;
2033 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
2034 ASSERT_TRUE(timestamp == t1.ToInternalValue());
2035}
2036
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002037TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002038 // Create a uniquely named test directory.
2039 string test_dir;
2040 ASSERT_TRUE(utils::MakeTempDirectory(
2041 "omaha_request_action-test-XXXXXX", &test_dir));
2042
2043 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2044 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002045 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002046 vector<char> post_data;
2047 NiceMock<PrefsMock> prefs;
2048 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002049 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002050 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2051 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2052 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2053 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002054 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002055 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
2056 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2057 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002058 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002059 params.SetLockDown(false);
2060 params.Init("1.2.3.4", "", 0);
2061 EXPECT_EQ("canary-channel", params.current_channel());
2062 EXPECT_EQ("stable-channel", params.target_channel());
2063 EXPECT_TRUE(params.to_more_stable_channel());
2064 EXPECT_TRUE(params.is_powerwash_allowed());
2065 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002066 NULL, // payload_state
2067 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002068 NULL, // connection_manager
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002069 params,
2070 "invalid xml>",
2071 -1,
2072 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002073 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002074 metrics::CheckResult::kParsingError,
2075 metrics::CheckReaction::kUnset,
2076 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002077 NULL, // response
2078 &post_data));
2079 // convert post_data to string
2080 string post_str(&post_data[0], post_data.size());
2081 EXPECT_NE(string::npos, post_str.find(
2082 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
2083 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
2084 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002085
2086 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002087}
2088
2089TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002090 // Create a uniquely named test directory.
2091 string test_dir;
2092 ASSERT_TRUE(utils::MakeTempDirectory(
2093 "omaha_request_action-test-XXXXXX", &test_dir));
2094
2095 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
2096 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07002097 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002098 vector<char> post_data;
2099 NiceMock<PrefsMock> prefs;
2100 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002101 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002102 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
2103 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
2104 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
2105 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002106 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002107 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
2108 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldd04f8e22014-01-09 13:13:40 -08002109 params.set_root(test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002110 params.SetLockDown(false);
2111 params.Init("5.6.7.8", "", 0);
2112 EXPECT_EQ("stable-channel", params.current_channel());
2113 EXPECT_EQ("canary-channel", params.target_channel());
2114 EXPECT_FALSE(params.to_more_stable_channel());
2115 EXPECT_FALSE(params.is_powerwash_allowed());
2116 ASSERT_FALSE(TestUpdateCheck(&prefs,
David Zeuthen8f191b22013-08-06 12:27:50 -07002117 NULL, // payload_state
2118 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002119 NULL, // connection_manager
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002120 params,
2121 "invalid xml>",
2122 -1,
2123 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002124 ErrorCode::kOmahaRequestXMLParseError,
David Zeuthen33bae492014-02-25 16:16:18 -08002125 metrics::CheckResult::kParsingError,
2126 metrics::CheckReaction::kUnset,
2127 metrics::DownloadErrorCode::kUnset,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002128 NULL, // response
2129 &post_data));
2130 // convert post_data to string
2131 string post_str(&post_data[0], post_data.size());
2132 EXPECT_NE(string::npos, post_str.find(
2133 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
2134 "version=\"5.6.7.8\" "
2135 "track=\"canary-channel\" from_track=\"stable-channel\""));
2136 EXPECT_EQ(string::npos, post_str.find( "from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07002137
2138 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07002139}
2140
David Zeuthen8f191b22013-08-06 12:27:50 -07002141void P2PTest(bool initial_allow_p2p_for_downloading,
2142 bool initial_allow_p2p_for_sharing,
2143 bool omaha_disable_p2p_for_downloading,
2144 bool omaha_disable_p2p_for_sharing,
2145 bool payload_state_allow_p2p_attempt,
2146 bool expect_p2p_client_lookup,
2147 const string& p2p_client_result_url,
2148 bool expected_allow_p2p_for_downloading,
2149 bool expected_allow_p2p_for_sharing,
2150 const string& expected_p2p_url) {
2151 OmahaResponse response;
2152 OmahaRequestParams request_params = kDefaultTestParams;
2153 request_params.set_use_p2p_for_downloading(initial_allow_p2p_for_downloading);
2154 request_params.set_use_p2p_for_sharing(initial_allow_p2p_for_sharing);
2155
2156 MockPayloadState mock_payload_state;
2157 EXPECT_CALL(mock_payload_state, P2PAttemptAllowed())
2158 .WillRepeatedly(Return(payload_state_allow_p2p_attempt));
2159 MockP2PManager mock_p2p_manager;
2160 mock_p2p_manager.fake().SetLookupUrlForFileResult(p2p_client_result_url);
2161
David Zeuthen4cc5ed22014-01-15 12:35:03 -08002162 TimeDelta timeout = TimeDelta::FromSeconds(kMaxP2PNetworkWaitTimeSeconds);
2163 EXPECT_CALL(mock_p2p_manager, LookupUrlForFile(_, _, timeout, _))
David Zeuthen8f191b22013-08-06 12:27:50 -07002164 .Times(expect_p2p_client_lookup ? 1 : 0);
2165
2166 ASSERT_TRUE(
2167 TestUpdateCheck(NULL, // prefs
2168 &mock_payload_state,
2169 &mock_p2p_manager,
Chris Sosa77f79e82014-06-02 18:16:24 -07002170 NULL, // connection_manager
David Zeuthen8f191b22013-08-06 12:27:50 -07002171 request_params,
2172 GetUpdateResponse2(OmahaRequestParams::kAppId,
2173 "1.2.3.4", // version
2174 "http://more/info",
2175 "true", // prompt
2176 "http://code/base/", // dl url
2177 "file.signed", // file name
2178 "HASH1234=", // checksum
2179 "false", // needs admin
2180 "123", // size
2181 "", // deadline
2182 "7", // max days to scatter
David Zeuthen639aa362014-02-03 16:23:44 -08002183 "42", // elapsed_days
David Zeuthen8f191b22013-08-06 12:27:50 -07002184 omaha_disable_p2p_for_downloading,
2185 omaha_disable_p2p_for_sharing),
2186 -1,
2187 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002188 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002189 metrics::CheckResult::kUpdateAvailable,
2190 metrics::CheckReaction::kUpdating,
2191 metrics::DownloadErrorCode::kUnset,
David Zeuthen8f191b22013-08-06 12:27:50 -07002192 &response,
2193 NULL));
2194 EXPECT_TRUE(response.update_exists);
2195
2196 EXPECT_EQ(response.disable_p2p_for_downloading,
2197 omaha_disable_p2p_for_downloading);
2198 EXPECT_EQ(response.disable_p2p_for_sharing,
2199 omaha_disable_p2p_for_sharing);
2200
2201 EXPECT_EQ(request_params.use_p2p_for_downloading(),
2202 expected_allow_p2p_for_downloading);
2203
2204 EXPECT_EQ(request_params.use_p2p_for_sharing(),
2205 expected_allow_p2p_for_sharing);
2206
2207 EXPECT_EQ(request_params.p2p_url(), expected_p2p_url);
2208}
2209
2210TEST(OmahaRequestActionTest, P2PWithPeer) {
2211 P2PTest(true, // initial_allow_p2p_for_downloading
2212 true, // initial_allow_p2p_for_sharing
2213 false, // omaha_disable_p2p_for_downloading
2214 false, // omaha_disable_p2p_for_sharing
2215 true, // payload_state_allow_p2p_attempt
2216 true, // expect_p2p_client_lookup
2217 "http://1.3.5.7/p2p", // p2p_client_result_url
2218 true, // expected_allow_p2p_for_downloading
2219 true, // expected_allow_p2p_for_sharing
2220 "http://1.3.5.7/p2p"); // expected_p2p_url
2221}
2222
2223TEST(OmahaRequestActionTest, P2PWithoutPeer) {
2224 P2PTest(true, // initial_allow_p2p_for_downloading
2225 true, // initial_allow_p2p_for_sharing
2226 false, // omaha_disable_p2p_for_downloading
2227 false, // omaha_disable_p2p_for_sharing
2228 true, // payload_state_allow_p2p_attempt
2229 true, // expect_p2p_client_lookup
2230 "", // p2p_client_result_url
2231 false, // expected_allow_p2p_for_downloading
2232 true, // expected_allow_p2p_for_sharing
2233 ""); // expected_p2p_url
2234}
2235
2236TEST(OmahaRequestActionTest, P2PDownloadNotAllowed) {
2237 P2PTest(false, // initial_allow_p2p_for_downloading
2238 true, // initial_allow_p2p_for_sharing
2239 false, // omaha_disable_p2p_for_downloading
2240 false, // omaha_disable_p2p_for_sharing
2241 true, // payload_state_allow_p2p_attempt
2242 false, // expect_p2p_client_lookup
2243 "unset", // p2p_client_result_url
2244 false, // expected_allow_p2p_for_downloading
2245 true, // expected_allow_p2p_for_sharing
2246 ""); // expected_p2p_url
2247}
2248
2249TEST(OmahaRequestActionTest, P2PWithPeerDownloadDisabledByOmaha) {
2250 P2PTest(true, // initial_allow_p2p_for_downloading
2251 true, // initial_allow_p2p_for_sharing
2252 true, // omaha_disable_p2p_for_downloading
2253 false, // omaha_disable_p2p_for_sharing
2254 true, // payload_state_allow_p2p_attempt
2255 false, // expect_p2p_client_lookup
2256 "unset", // p2p_client_result_url
2257 false, // expected_allow_p2p_for_downloading
2258 true, // expected_allow_p2p_for_sharing
2259 ""); // expected_p2p_url
2260}
2261
2262TEST(OmahaRequestActionTest, P2PWithPeerSharingDisabledByOmaha) {
2263 P2PTest(true, // initial_allow_p2p_for_downloading
2264 true, // initial_allow_p2p_for_sharing
2265 false, // omaha_disable_p2p_for_downloading
2266 true, // omaha_disable_p2p_for_sharing
2267 true, // payload_state_allow_p2p_attempt
2268 true, // expect_p2p_client_lookup
2269 "http://1.3.5.7/p2p", // p2p_client_result_url
2270 true, // expected_allow_p2p_for_downloading
2271 false, // expected_allow_p2p_for_sharing
2272 "http://1.3.5.7/p2p"); // expected_p2p_url
2273}
2274
2275TEST(OmahaRequestActionTest, P2PWithPeerBothDisabledByOmaha) {
2276 P2PTest(true, // initial_allow_p2p_for_downloading
2277 true, // initial_allow_p2p_for_sharing
2278 true, // omaha_disable_p2p_for_downloading
2279 true, // omaha_disable_p2p_for_sharing
2280 true, // payload_state_allow_p2p_attempt
2281 false, // expect_p2p_client_lookup
2282 "unset", // p2p_client_result_url
2283 false, // expected_allow_p2p_for_downloading
2284 false, // expected_allow_p2p_for_sharing
2285 ""); // expected_p2p_url
2286}
2287
David Zeuthen639aa362014-02-03 16:23:44 -08002288bool InstallDateParseHelper(const std::string &elapsed_days,
2289 PrefsInterface* prefs,
2290 OmahaResponse *response) {
2291 return
2292 TestUpdateCheck(prefs,
2293 NULL, // payload_state
2294 NULL, // p2p_manager
Chris Sosa77f79e82014-06-02 18:16:24 -07002295 NULL, // connection_manager
David Zeuthen639aa362014-02-03 16:23:44 -08002296 kDefaultTestParams,
2297 GetUpdateResponse2(OmahaRequestParams::kAppId,
2298 "1.2.3.4", // version
2299 "http://more/info",
2300 "true", // prompt
2301 "http://code/base/", // dl url
2302 "file.signed", // file name
2303 "HASH1234=", // checksum
2304 "false", // needs admin
2305 "123", // size
2306 "", // deadline
2307 "7", // max days to scatter
2308 elapsed_days,
2309 false, // disable_p2p_for_downloading
2310 false), // disable_p2p_for sharing
2311 -1,
2312 false, // ping_only
Gilad Arnoldd1c4d2d2014-06-05 14:07:53 -07002313 ErrorCode::kSuccess,
David Zeuthen33bae492014-02-25 16:16:18 -08002314 metrics::CheckResult::kUpdateAvailable,
2315 metrics::CheckReaction::kUpdating,
2316 metrics::DownloadErrorCode::kUnset,
David Zeuthen639aa362014-02-03 16:23:44 -08002317 response,
2318 NULL);
2319}
2320
2321TEST(OmahaRequestActionTest, ParseInstallDateFromResponse) {
2322 OmahaResponse response;
2323 string temp_dir;
2324 Prefs prefs;
2325 EXPECT_TRUE(utils::MakeTempDirectory("ParseInstallDateFromResponse.XXXXXX",
2326 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002327 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002328
2329 // Check that we parse elapsed_days in the Omaha Response correctly.
2330 // and that the kPrefsInstallDateDays value is written to.
2331 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2332 EXPECT_TRUE(InstallDateParseHelper("42", &prefs, &response));
2333 EXPECT_TRUE(response.update_exists);
2334 EXPECT_EQ(42, response.install_date_days);
2335 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2336 int64_t prefs_days;
2337 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2338 EXPECT_EQ(prefs_days, 42);
2339
2340 // If there already is a value set, we shouldn't do anything.
2341 EXPECT_TRUE(InstallDateParseHelper("7", &prefs, &response));
2342 EXPECT_TRUE(response.update_exists);
2343 EXPECT_EQ(7, response.install_date_days);
2344 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2345 EXPECT_EQ(prefs_days, 42);
2346
2347 // Note that elapsed_days is not necessarily divisible by 7 so check
2348 // that we round down correctly when populating kPrefsInstallDateDays.
2349 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
2350 EXPECT_TRUE(InstallDateParseHelper("23", &prefs, &response));
2351 EXPECT_TRUE(response.update_exists);
2352 EXPECT_EQ(23, response.install_date_days);
2353 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2354 EXPECT_EQ(prefs_days, 21);
2355
2356 // Check that we correctly handle elapsed_days not being included in
2357 // the Omaha Response.
2358 EXPECT_TRUE(InstallDateParseHelper("", &prefs, &response));
2359 EXPECT_TRUE(response.update_exists);
2360 EXPECT_EQ(-1, response.install_date_days);
2361
2362 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2363}
2364
2365TEST(OmahaRequestActionTest, GetInstallDate) {
2366 string temp_dir;
2367 Prefs prefs;
2368 EXPECT_TRUE(utils::MakeTempDirectory("GetInstallDate.XXXXXX",
2369 &temp_dir));
Alex Vakulenko75039d72014-03-25 12:36:28 -07002370 prefs.Init(base::FilePath(temp_dir));
David Zeuthen639aa362014-02-03 16:23:44 -08002371
2372 // If there is no prefs and OOBE is not complete, we should not
2373 // report anything to Omaha.
2374 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002375 FakeSystemState system_state;
David Zeuthen639aa362014-02-03 16:23:44 -08002376 system_state.set_prefs(&prefs);
2377 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&system_state), -1);
2378 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2379 }
2380
2381 // If OOBE is complete and happened on a valid date (e.g. after Jan
2382 // 1 2007 0:00 PST), that date should be used and written to
2383 // prefs. However, first try with an invalid date and check we do
2384 // nothing.
2385 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002386 FakeSystemState fake_system_state;
2387 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002388
2389 Time oobe_date = Time::FromTimeT(42); // Dec 31, 1969 16:00:42 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002390 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2391 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), -1);
David Zeuthen639aa362014-02-03 16:23:44 -08002392 EXPECT_FALSE(prefs.Exists(kPrefsInstallDateDays));
2393 }
2394
2395 // Then check with a valid date. The date Jan 20, 2007 0:00 PST
2396 // should yield an InstallDate of 14.
2397 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002398 FakeSystemState fake_system_state;
2399 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002400
2401 Time oobe_date = Time::FromTimeT(1169280000); // Jan 20, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002402 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2403 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002404 EXPECT_TRUE(prefs.Exists(kPrefsInstallDateDays));
2405
2406 int64_t prefs_days;
2407 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2408 EXPECT_EQ(prefs_days, 14);
2409 }
2410
2411 // Now that we have a valid date in prefs, check that we keep using
2412 // that even if OOBE date reports something else. The date Jan 30,
2413 // 2007 0:00 PST should yield an InstallDate of 28... but since
2414 // there's a prefs file, we should still get 14.
2415 {
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002416 FakeSystemState fake_system_state;
2417 fake_system_state.set_prefs(&prefs);
David Zeuthen639aa362014-02-03 16:23:44 -08002418
2419 Time oobe_date = Time::FromTimeT(1170144000); // Jan 30, 2007 0:00 PST.
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002420 fake_system_state.fake_hardware()->SetIsOOBEComplete(oobe_date);
2421 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 14);
David Zeuthen639aa362014-02-03 16:23:44 -08002422
2423 int64_t prefs_days;
2424 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2425 EXPECT_EQ(prefs_days, 14);
2426
2427 // If we delete the prefs file, we should get 28 days.
2428 EXPECT_TRUE(prefs.Delete(kPrefsInstallDateDays));
Gilad Arnold5bb4c902014-04-10 12:32:13 -07002429 EXPECT_EQ(OmahaRequestAction::GetInstallDate(&fake_system_state), 28);
David Zeuthen639aa362014-02-03 16:23:44 -08002430 EXPECT_TRUE(prefs.GetInt64(kPrefsInstallDateDays, &prefs_days));
2431 EXPECT_EQ(prefs_days, 28);
2432 }
2433
2434 EXPECT_TRUE(utils::RecursiveUnlinkDir(temp_dir));
2435}
2436
Darin Petkov6a5b3222010-07-13 14:55:28 -07002437} // namespace chromeos_update_engine