blob: 4897b7a7487f9fccdac43c18578b22932973aee9 [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
10#include "base/string_util.h"
Mike Frysinger8155d082012-04-06 15:23:18 -040011#include <base/stringprintf.h>
Darin Petkov1cbd78f2010-07-29 12:38:34 -070012#include "base/time.h"
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070013#include "gtest/gtest.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070014
Darin Petkov6a5b3222010-07-13 14:55:28 -070015#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070016#include "update_engine/constants.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070017#include "update_engine/mock_http_fetcher.h"
18#include "update_engine/omaha_hash_calculator.h"
19#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070020#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070021#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070022#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070023#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070024
Darin Petkov1cbd78f2010-07-29 12:38:34 -070025using base::Time;
26using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070027using std::string;
28using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070029using testing::_;
30using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070031using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070032using testing::Ge;
33using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080034using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070035using testing::Return;
36using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070037
38namespace chromeos_update_engine {
39
Jay Srinivasanae4697c2013-03-18 17:08:08 -070040class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070041
42namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070043
Jay Srinivasanae4697c2013-03-18 17:08:08 -070044MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070045OmahaRequestParams kDefaultTestParams(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070046 &mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070047 OmahaRequestParams::kOsPlatform,
48 OmahaRequestParams::kOsVersion,
49 "service_pack",
50 "x86-generic",
51 OmahaRequestParams::kAppId,
52 "0.1.0.0",
53 "en-US",
54 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070055 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080057 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070058 "http://url",
59 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070060 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070061
Darin Petkov6a5b3222010-07-13 14:55:28 -070062string GetNoUpdateResponse(const string& app_id) {
63 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070064 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
65 "<daystart elapsed_seconds=\"100\"/>"
66 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
67 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070068}
69
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070070string GetUpdateResponse2(const string& app_id,
71 const string& display_version,
72 const string& more_info_url,
73 const string& prompt,
74 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070075 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070076 const string& hash,
77 const string& needsadmin,
78 const string& size,
79 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070080 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070081 string response =
82 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
83 "protocol=\"3.0\">"
84 "<daystart elapsed_seconds=\"100\"/>"
85 "<app appid=\"" + app_id + "\" status=\"ok\">"
86 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
87 "<urls><url codebase=\"" + codebase + "\"/></urls>"
88 "<manifest version=\"" + display_version + "\">"
89 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
90 "size=\"" + size + "\"/></packages>"
91 "<actions><action event=\"postinstall\" "
92 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070093 "ChromeOSVersion=\"" + display_version + "\" "
94 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
95 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080096 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070097 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070098 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -070099 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700100 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700101 "/></actions></manifest></updatecheck></app></response>";
102 LOG(INFO) << "Response = " << response;
103 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700104}
105
Darin Petkov6a5b3222010-07-13 14:55:28 -0700106string GetUpdateResponse(const string& app_id,
107 const string& display_version,
108 const string& more_info_url,
109 const string& prompt,
110 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700111 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700112 const string& hash,
113 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700114 const string& size,
115 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700116 return GetUpdateResponse2(app_id,
117 display_version,
118 more_info_url,
119 prompt,
120 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700121 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700122 hash,
123 needsadmin,
124 size,
125 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700126 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127}
128
129class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
130 public:
131 OmahaRequestActionTestProcessorDelegate()
132 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700133 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 virtual ~OmahaRequestActionTestProcessorDelegate() {
135 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700136 virtual void ProcessingDone(const ActionProcessor* processor,
137 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700138 ASSERT_TRUE(loop_);
139 g_main_loop_quit(loop_);
140 }
141
142 virtual void ActionCompleted(ActionProcessor* processor,
143 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700144 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700145 // make sure actions always succeed
146 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700147 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700148 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700149 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700150 }
151 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700152 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700153};
154
155gboolean StartProcessorInRunLoop(gpointer data) {
156 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
157 processor->StartProcessing();
158 return FALSE;
159}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700160} // namespace {}
161
162class OutputObjectCollectorAction;
163
164template<>
165class ActionTraits<OutputObjectCollectorAction> {
166 public:
167 // Does not take an object for input
168 typedef OmahaResponse InputObjectType;
169 // On success, puts the output path on output
170 typedef NoneType OutputObjectType;
171};
172
173class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
174 public:
175 OutputObjectCollectorAction() : has_input_object_(false) {}
176 void PerformAction() {
177 // copy input object
178 has_input_object_ = HasInputObject();
179 if (has_input_object_)
180 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700181 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700182 }
183 // Should never be called
184 void TerminateProcessing() {
185 CHECK(false);
186 }
187 // Debugging/logging
188 static std::string StaticType() {
189 return "OutputObjectCollectorAction";
190 }
191 std::string Type() const { return StaticType(); }
192 bool has_input_object_;
193 OmahaResponse omaha_response_;
194};
195
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700196// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700197// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700198// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
199// the transfer will fail with that code. |ping_only| is passed through to the
200// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
201// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700202bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700203 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700204 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700205 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700206 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700207 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700208 OmahaResponse* out_response,
209 vector<char>* out_post_data) {
210 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
211 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800212 http_response.size(),
213 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700214 if (fail_http_response_code >= 0) {
215 fetcher->FailTransfer(fail_http_response_code);
216 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800217 MockSystemState mock_system_state;
218 if (prefs)
219 mock_system_state.set_prefs(prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700220 mock_system_state.set_request_params(&params);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800221 OmahaRequestAction action(&mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700222 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700223 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700224 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700225 OmahaRequestActionTestProcessorDelegate delegate;
226 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700227 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700228
Darin Petkov6a5b3222010-07-13 14:55:28 -0700229 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700230 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700231 processor.EnqueueAction(&action);
232
233 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700234 BondActions(&action, &collector_action);
235 processor.EnqueueAction(&collector_action);
236
237 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
238 g_main_loop_run(loop);
239 g_main_loop_unref(loop);
240 if (collector_action.has_input_object_ && out_response)
241 *out_response = collector_action.omaha_response_;
242 if (out_post_data)
243 *out_post_data = fetcher->post_data();
244 return collector_action.has_input_object_;
245}
246
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700247// Tests Event requests -- they should always succeed. |out_post_data|
248// may be null; if non-null, the post-data received by the mock
249// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700250void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700251 OmahaEvent* event,
252 const string& http_response,
253 vector<char>* out_post_data) {
254 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
255 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800256 http_response.size(),
257 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800258 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700259 mock_system_state.set_request_params(&params);
260 OmahaRequestAction action(&mock_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700261 OmahaRequestActionTestProcessorDelegate delegate;
262 delegate.loop_ = loop;
263 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700264 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700265 processor.EnqueueAction(&action);
266
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700267 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
268 g_main_loop_run(loop);
269 g_main_loop_unref(loop);
270 if (out_post_data)
271 *out_post_data = fetcher->post_data();
272}
273
Darin Petkov6a5b3222010-07-13 14:55:28 -0700274TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275 OmahaResponse response;
276 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700277 TestUpdateCheck(NULL, // prefs
278 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700279 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700280 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700281 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700282 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700283 &response,
284 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700285 EXPECT_FALSE(response.update_exists);
286}
287
288TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700289 OmahaResponse response;
290 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700291 TestUpdateCheck(NULL, // prefs
292 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700293 GetUpdateResponse(OmahaRequestParams::kAppId,
294 "1.2.3.4", // version
295 "http://more/info",
296 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700297 "http://code/base/", // dl url
298 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700299 "HASH1234=", // checksum
300 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700301 "123", // size
302 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700303 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700304 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700305 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700306 &response,
307 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700308 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700309 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800311 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312 EXPECT_EQ("http://more/info", response.more_info_url);
313 EXPECT_EQ("HASH1234=", response.hash);
314 EXPECT_EQ(123, response.size);
315 EXPECT_FALSE(response.needs_admin);
316 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700317 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700318}
319
Jay Srinivasan0a708742012-03-20 11:26:12 -0700320TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
321 OmahaResponse response;
322 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700323 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700324 ASSERT_FALSE(
325 TestUpdateCheck(NULL, // prefs
326 params,
327 GetUpdateResponse(OmahaRequestParams::kAppId,
328 "1.2.3.4", // version
329 "http://more/info",
330 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700331 "http://code/base/", // dl url
332 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700333 "HASH1234=", // checksum
334 "false", // needs admin
335 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700336 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700337 -1,
338 false, // ping_only
339 kActionCodeOmahaUpdateIgnoredPerPolicy,
340 &response,
341 NULL));
342 EXPECT_FALSE(response.update_exists);
343}
344
Jay Srinivasan0a708742012-03-20 11:26:12 -0700345TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
346 OmahaResponse response;
347 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700348 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700349 ASSERT_TRUE(
350 TestUpdateCheck(NULL, // prefs
351 params,
352 GetNoUpdateResponse(OmahaRequestParams::kAppId),
353 -1,
354 false, // ping_only
355 kActionCodeSuccess,
356 &response,
357 NULL));
358 EXPECT_FALSE(response.update_exists);
359}
360
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700361TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
362 OmahaResponse response;
363 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700364 params.set_wall_clock_based_wait_enabled(true);
365 params.set_update_check_count_wait_enabled(false);
366 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700367
368 string prefs_dir;
369 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
370 &prefs_dir));
371 ScopedDirRemover temp_dir_remover(prefs_dir);
372
373 Prefs prefs;
374 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
375 << "Failed to initialize preferences.";
376
377 ASSERT_FALSE(
378 TestUpdateCheck(&prefs, // prefs
379 params,
380 GetUpdateResponse2(OmahaRequestParams::kAppId,
381 "1.2.3.4", // version
382 "http://more/info",
383 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700384 "http://code/base/", // dl url
385 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700386 "HASH1234=", // checksum
387 "false", // needs admin
388 "123", // size
389 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700390 "7"), // max days to scatter
391 -1,
392 false, // ping_only
393 kActionCodeOmahaUpdateDeferredPerPolicy,
394 &response,
395 NULL));
396 EXPECT_FALSE(response.update_exists);
397}
398
399TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
400 OmahaResponse response;
401 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700402 params.set_wall_clock_based_wait_enabled(false);
403 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700404
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700405 params.set_update_check_count_wait_enabled(true);
406 params.set_min_update_checks_needed(1);
407 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700408
409 string prefs_dir;
410 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
411 &prefs_dir));
412 ScopedDirRemover temp_dir_remover(prefs_dir);
413
414 Prefs prefs;
415 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
416 << "Failed to initialize preferences.";
417
418 ASSERT_TRUE(
419 TestUpdateCheck(&prefs, // prefs
420 params,
421 GetUpdateResponse2(OmahaRequestParams::kAppId,
422 "1.2.3.4", // version
423 "http://more/info",
424 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700425 "http://code/base/", // dl url
426 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700427 "HASH1234=", // checksum
428 "false", // needs admin
429 "123", // size
430 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700431 "7"), // max days to scatter
432 -1,
433 false, // ping_only
434 kActionCodeSuccess,
435 &response,
436 NULL));
437 EXPECT_TRUE(response.update_exists);
438}
439
440TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
441 OmahaResponse response;
442 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700443 params.set_wall_clock_based_wait_enabled(true);
444 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700445
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700446 params.set_update_check_count_wait_enabled(true);
447 params.set_min_update_checks_needed(1);
448 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700449
450 string prefs_dir;
451 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
452 &prefs_dir));
453 ScopedDirRemover temp_dir_remover(prefs_dir);
454
455 Prefs prefs;
456 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
457 << "Failed to initialize preferences.";
458
459 ASSERT_TRUE(
460 TestUpdateCheck(&prefs, // prefs
461 params,
462 GetUpdateResponse2(OmahaRequestParams::kAppId,
463 "1.2.3.4", // version
464 "http://more/info",
465 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700466 "http://code/base/", // dl url
467 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700468 "HASH1234=", // checksum
469 "false", // needs admin
470 "123", // size
471 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700472 "0"), // max days to scatter
473 -1,
474 false, // ping_only
475 kActionCodeSuccess,
476 &response,
477 NULL));
478 EXPECT_TRUE(response.update_exists);
479}
480
481
482TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
483 OmahaResponse response;
484 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700485 params.set_wall_clock_based_wait_enabled(true);
486 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700487
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700488 params.set_update_check_count_wait_enabled(true);
489 params.set_min_update_checks_needed(0);
490 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700491
492 string prefs_dir;
493 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
494 &prefs_dir));
495 ScopedDirRemover temp_dir_remover(prefs_dir);
496
497 Prefs prefs;
498 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
499 << "Failed to initialize preferences.";
500
501 ASSERT_TRUE(TestUpdateCheck(
502 &prefs, // prefs
503 params,
504 GetUpdateResponse2(OmahaRequestParams::kAppId,
505 "1.2.3.4", // version
506 "http://more/info",
507 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700508 "http://code/base/", // dl url
509 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700510 "HASH1234=", // checksum
511 "false", // needs admin
512 "123", // size
513 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700514 "7"), // max days to scatter
515 -1,
516 false, // ping_only
517 kActionCodeSuccess,
518 &response,
519 NULL));
520
521 int64 count;
522 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
523 ASSERT_TRUE(count == 0);
524 EXPECT_TRUE(response.update_exists);
525}
526
527TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
528 OmahaResponse response;
529 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700530 params.set_wall_clock_based_wait_enabled(true);
531 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700532
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700533 params.set_update_check_count_wait_enabled(true);
534 params.set_min_update_checks_needed(1);
535 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700536
537 string prefs_dir;
538 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
539 &prefs_dir));
540 ScopedDirRemover temp_dir_remover(prefs_dir);
541
542 Prefs prefs;
543 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
544 << "Failed to initialize preferences.";
545
546 ASSERT_FALSE(TestUpdateCheck(
547 &prefs, // prefs
548 params,
549 GetUpdateResponse2(OmahaRequestParams::kAppId,
550 "1.2.3.4", // version
551 "http://more/info",
552 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700553 "http://code/base/", // dl url
554 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700555 "HASH1234=", // checksum
556 "false", // needs admin
557 "123", // size
558 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700559 "7"), // max days to scatter
560 -1,
561 false, // ping_only
562 kActionCodeOmahaUpdateDeferredPerPolicy,
563 &response,
564 NULL));
565
566 int64 count;
567 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
568 ASSERT_TRUE(count > 0);
569 EXPECT_FALSE(response.update_exists);
570}
571
572TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
573 OmahaResponse response;
574 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700575 params.set_wall_clock_based_wait_enabled(true);
576 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700577
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700578 params.set_update_check_count_wait_enabled(true);
579 params.set_min_update_checks_needed(1);
580 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700581
582 string prefs_dir;
583 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
584 &prefs_dir));
585 ScopedDirRemover temp_dir_remover(prefs_dir);
586
587 Prefs prefs;
588 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
589 << "Failed to initialize preferences.";
590
591 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
592
593 ASSERT_FALSE(TestUpdateCheck(
594 &prefs, // prefs
595 params,
596 GetUpdateResponse2(OmahaRequestParams::kAppId,
597 "1.2.3.4", // version
598 "http://more/info",
599 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700600 "http://code/base/", // dl url
601 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700602 "HASH1234=", // checksum
603 "false", // needs admin
604 "123", // size
605 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700606 "7"), // max days to scatter
607 -1,
608 false, // ping_only
609 kActionCodeOmahaUpdateDeferredPerPolicy,
610 &response,
611 NULL));
612
613 int64 count;
614 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
615 // count remains the same, as the decrementing happens in update_attempter
616 // which this test doesn't exercise.
617 ASSERT_TRUE(count == 5);
618 EXPECT_FALSE(response.update_exists);
619}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700620
Darin Petkov6a5b3222010-07-13 14:55:28 -0700621TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700622 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
623
624 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
625
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800626 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700627 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700628 mock_system_state.set_request_params(&params);
629 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700630 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800631 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700632 NULL),
633 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700634 OmahaRequestActionTestProcessorDelegate delegate;
635 delegate.loop_ = loop;
636 ActionProcessor processor;
637 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700638 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700639
640 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
641 g_main_loop_run(loop);
642 g_main_loop_unref(loop);
643 EXPECT_FALSE(processor.IsRunning());
644}
645
646TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700647 OmahaResponse response;
648 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700649 TestUpdateCheck(NULL, // prefs
650 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700651 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700652 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700653 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700654 kActionCodeOmahaRequestXMLParseError,
655 &response,
656 NULL));
657 EXPECT_FALSE(response.update_exists);
658}
659
660TEST(OmahaRequestActionTest, EmptyResponseTest) {
661 OmahaResponse response;
662 ASSERT_FALSE(
663 TestUpdateCheck(NULL, // prefs
664 kDefaultTestParams,
665 "",
666 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700667 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700668 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700669 &response,
670 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700671 EXPECT_FALSE(response.update_exists);
672}
673
674TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700675 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700676 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700677 NULL, // prefs
678 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700679 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
680 "<daystart elapsed_seconds=\"100\"/>"
681 "<app appid=\"foo\" status=\"ok\">"
682 "<ping status=\"ok\"/>"
683 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700684 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700685 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700686 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700687 &response,
688 NULL));
689 EXPECT_FALSE(response.update_exists);
690}
691
692TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700693 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700694 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700695 NULL, // prefs
696 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700697 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
698 "<daystart elapsed_seconds=\"100\"/>"
699 "<app appid=\"foo\" status=\"ok\">"
700 "<ping status=\"ok\"/>"
701 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700702 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700703 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700704 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700705 &response,
706 NULL));
707 EXPECT_FALSE(response.update_exists);
708}
709
710TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700711 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700712 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700713 NULL, // prefs
714 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700715 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
716 "<daystart elapsed_seconds=\"100\"/>"
717 "<app appid=\"foo\" status=\"ok\">"
718 "<ping status=\"ok\"/>"
719 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700720 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700721 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700722 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700723 &response,
724 NULL));
725 EXPECT_FALSE(response.update_exists);
726}
727
728TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700729 string input_response =
730 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
731 "<daystart elapsed_seconds=\"100\"/>"
732 "<app appid=\"xyz\" status=\"ok\">"
733 "<updatecheck status=\"ok\">"
734 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
735 "<manifest version=\"1.0.0.0\">"
736 "<packages><package hash=\"not-used\" name=\"f\" "
737 "size=\"587\"/></packages>"
738 "<actions><action event=\"postinstall\" "
739 "DisplayVersion=\"10.2.3.4\" "
740 "ChromeOSVersion=\"10.2.3.4\" "
741 "Prompt=\"false\" "
742 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800743 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700744 "sha256=\"lkq34j5345\" "
745 "needsadmin=\"true\" "
746 "/></actions></manifest></updatecheck></app></response>";
747 LOG(INFO) << "Input Response = " << input_response;
748
Darin Petkov6a5b3222010-07-13 14:55:28 -0700749 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700750 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
751 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700752 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700753 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700754 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700755 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700756 &response,
757 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700758 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700759 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800760 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700761 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700762 EXPECT_EQ("lkq34j5345", response.hash);
763 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700764 EXPECT_TRUE(response.needs_admin);
765 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700766 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700767}
768
769namespace {
770class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
771 public:
772 void ProcessingStopped(const ActionProcessor* processor) {
773 ASSERT_TRUE(loop_);
774 g_main_loop_quit(loop_);
775 }
776 GMainLoop *loop_;
777};
778
779gboolean TerminateTransferTestStarter(gpointer data) {
780 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
781 processor->StartProcessing();
782 CHECK(processor->IsRunning());
783 processor->StopProcessing();
784 return FALSE;
785}
786} // namespace {}
787
788TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700789 string http_response("doesn't matter");
790 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
791
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800792 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700793 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700794 mock_system_state.set_request_params(&params);
795 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700796 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800797 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700798 NULL),
799 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700800 TerminateEarlyTestProcessorDelegate delegate;
801 delegate.loop_ = loop;
802 ActionProcessor processor;
803 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700804 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700805
806 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
807 g_main_loop_run(loop);
808 g_main_loop_unref(loop);
809}
810
811TEST(OmahaRequestActionTest, XmlEncodeTest) {
812 EXPECT_EQ("ab", XmlEncode("ab"));
813 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
814 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
815 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
816 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
817
818 vector<char> post_data;
819
820 // Make sure XML Encode is being called on the params
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700821 MockSystemState mock_system_state;
822 OmahaRequestParams params(&mock_system_state,
823 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700824 OmahaRequestParams::kOsVersion,
825 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700826 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700827 OmahaRequestParams::kAppId,
828 "0.1.0.0",
829 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700830 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700831 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700832 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800833 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700834 "http://url",
835 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700836 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700837 OmahaResponse response;
838 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700839 TestUpdateCheck(NULL, // prefs
840 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700841 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700842 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700843 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700844 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700845 &response,
846 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700847 // convert post_data to string
848 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
850 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700851 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
852 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
853 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
854 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700855 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
856 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700857}
858
859TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700860 OmahaResponse response;
861 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700862 TestUpdateCheck(NULL, // prefs
863 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700864 GetUpdateResponse(OmahaRequestParams::kAppId,
865 "1.2.3.4", // version
866 "testthe&lt;url", // more info
867 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700868 "testthe&amp;codebase/", // dl url
869 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700870 "HASH1234=", // checksum
871 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700872 "123", // size
873 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700874 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700875 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700876 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700877 &response,
878 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700879
880 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800881 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700882 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700883}
884
885TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700886 OmahaResponse response;
887 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700888 TestUpdateCheck(NULL, // prefs
889 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700890 GetUpdateResponse(OmahaRequestParams::kAppId,
891 "1.2.3.4", // version
892 "theurl", // more info
893 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700894 "thecodebase/", // dl url
895 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700896 "HASH1234=", // checksum
897 "false", // needs admin
898 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700899 "123123123123123", // size
900 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700901 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700902 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700903 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700904 &response,
905 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700906
907 EXPECT_EQ(response.size, 123123123123123ll);
908}
909
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700910TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
911 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800912 NiceMock<PrefsMock> prefs;
913 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
914 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700915 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -0800916 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700917 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700918 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700919 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700920 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700921 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700922 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700923 &post_data));
924 // convert post_data to string
925 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700926 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700927 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700928 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700929 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700930 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
931 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700932}
933
Jay Srinivasan0a708742012-03-20 11:26:12 -0700934
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700935TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800936 vector<char> post_data;
937 NiceMock<PrefsMock> prefs;
938 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700939 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700940 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700941 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700942 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -0800943 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700944 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800945 "invalid xml>",
946 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700947 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800948 kActionCodeOmahaRequestXMLParseError,
949 NULL, // response
950 &post_data));
951 // convert post_data to string
952 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700953 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700954 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700955 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700956 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800957 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
958 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800959}
960
Darin Petkove17f86b2010-07-20 09:12:01 -0700961TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
962 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700963 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700964 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
965 "invalid xml>",
966 &post_data);
967 // convert post_data to string
968 string post_str(&post_data[0], post_data.size());
969 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700970 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700971 OmahaEvent::kTypeUpdateDownloadStarted,
972 OmahaEvent::kResultSuccess);
973 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700974 EXPECT_EQ(post_str.find("ping"), string::npos);
975 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700976}
977
978TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
979 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700980 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700981 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
982 OmahaEvent::kResultError,
983 kActionCodeError),
984 "invalid xml>",
985 &post_data);
986 // convert post_data to string
987 string post_str(&post_data[0], post_data.size());
988 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700989 " <event eventtype=\"%d\" eventresult=\"%d\" "
990 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700991 OmahaEvent::kTypeDownloadComplete,
992 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700993 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700994 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700995 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700996}
997
998TEST(OmahaRequestActionTest, IsEventTest) {
999 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001000 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001001 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001002 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001003 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001004 &mock_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001005 NULL,
1006 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001007 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001008 NULL),
1009 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001010 EXPECT_FALSE(update_check_action.IsEvent());
1011
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001012 params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001013 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001014 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001015 &mock_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001016 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001017 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001018 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001019 NULL),
1020 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001021 EXPECT_TRUE(event_action.IsEvent());
1022}
1023
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001024TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1025 for (int i = 0; i < 2; i++) {
1026 bool delta_okay = i == 1;
1027 const char* delta_okay_str = delta_okay ? "true" : "false";
1028 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001029 MockSystemState mock_system_state;
1030 OmahaRequestParams params(&mock_system_state,
1031 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001032 OmahaRequestParams::kOsVersion,
1033 "service_pack",
1034 "x86-generic",
1035 OmahaRequestParams::kAppId,
1036 "0.1.0.0",
1037 "en-US",
1038 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001039 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001040 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001041 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001042 "http://url",
1043 false, // update_disabled
1044 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001045 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1046 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001047 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001048 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001049 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001050 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001051 NULL,
1052 &post_data));
1053 // convert post_data to string
1054 string post_str(&post_data[0], post_data.size());
1055 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1056 string::npos)
1057 << "i = " << i;
1058 }
1059}
1060
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001061TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1062 for (int i = 0; i < 2; i++) {
1063 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001064 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001065 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001066 MockSystemState mock_system_state;
1067 OmahaRequestParams params(&mock_system_state,
1068 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001069 OmahaRequestParams::kOsVersion,
1070 "service_pack",
1071 "x86-generic",
1072 OmahaRequestParams::kAppId,
1073 "0.1.0.0",
1074 "en-US",
1075 "unittest_track",
1076 "OEM MODEL REV 1234",
1077 true, // delta_okay
1078 interactive,
1079 "http://url",
1080 false, // update_disabled
1081 ""); // target_version_prefix
1082 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1083 params,
1084 "invalid xml>",
1085 -1,
1086 false, // ping_only
1087 kActionCodeOmahaRequestXMLParseError,
1088 NULL,
1089 &post_data));
1090 // convert post_data to string
1091 string post_str(&post_data[0], post_data.size());
Gilad Arnold8a659d82013-01-24 11:26:00 -08001092 EXPECT_NE(post_str.find(StringPrintf("installsource=\"%s\"",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001093 interactive_str)),
1094 string::npos)
1095 << "i = " << i;
1096 }
1097}
1098
Darin Petkove17f86b2010-07-20 09:12:01 -07001099TEST(OmahaRequestActionTest, OmahaEventTest) {
1100 OmahaEvent default_event;
1101 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1102 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1103 EXPECT_EQ(kActionCodeError, default_event.error_code);
1104
1105 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1106 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1107 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1108 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1109
1110 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1111 OmahaEvent::kResultError,
1112 kActionCodeError);
1113 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1114 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1115 EXPECT_EQ(kActionCodeError, error_event.error_code);
1116}
1117
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001118TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001119 for (int ping_only = 0; ping_only < 2; ping_only++) {
1120 NiceMock<PrefsMock> prefs;
1121 // Add a few hours to the day difference to test no rounding, etc.
1122 int64_t five_days_ago =
1123 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1124 int64_t six_days_ago =
1125 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1126 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1127 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1128 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1129 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1130 vector<char> post_data;
1131 ASSERT_TRUE(
1132 TestUpdateCheck(&prefs,
1133 kDefaultTestParams,
1134 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1135 -1,
1136 ping_only,
1137 kActionCodeSuccess,
1138 NULL,
1139 &post_data));
1140 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001141 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001142 string::npos);
1143 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001144 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001145 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1146 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001147 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001148 EXPECT_NE(post_str.find("previousversion"), string::npos);
1149 }
1150 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001151}
1152
1153TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001154 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001155 int64_t three_days_ago =
1156 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1157 int64_t now = Time::Now().ToInternalValue();
1158 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1159 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1160 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1161 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1162 vector<char> post_data;
1163 ASSERT_TRUE(
1164 TestUpdateCheck(&prefs,
1165 kDefaultTestParams,
1166 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001167 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001168 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001169 kActionCodeSuccess,
1170 NULL,
1171 &post_data));
1172 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001173 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001174 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001175}
1176
1177TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001178 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001179 int64_t four_days_ago =
1180 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1181 int64_t now = Time::Now().ToInternalValue();
1182 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1183 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1184 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1185 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1186 vector<char> post_data;
1187 ASSERT_TRUE(
1188 TestUpdateCheck(&prefs,
1189 kDefaultTestParams,
1190 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001191 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001192 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001193 kActionCodeSuccess,
1194 NULL,
1195 &post_data));
1196 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001197 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001198 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001199}
1200
1201TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001202 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001203 int64_t one_hour_ago =
1204 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1205 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1206 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1207 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1208 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1209 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1210 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1211 vector<char> post_data;
1212 ASSERT_TRUE(
1213 TestUpdateCheck(&prefs,
1214 kDefaultTestParams,
1215 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001216 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001217 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001218 kActionCodeSuccess,
1219 NULL,
1220 &post_data));
1221 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001222 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001223}
1224
Thieu Leb44e9e82011-06-06 14:34:04 -07001225TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1226 // This test ensures that we ignore empty ping only requests.
1227 NiceMock<PrefsMock> prefs;
1228 int64_t now = Time::Now().ToInternalValue();
1229 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1230 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1231 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1232 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1233 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1234 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1235 vector<char> post_data;
1236 EXPECT_TRUE(
1237 TestUpdateCheck(&prefs,
1238 kDefaultTestParams,
1239 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1240 -1,
1241 true, // ping_only
1242 kActionCodeSuccess,
1243 NULL,
1244 &post_data));
1245 EXPECT_EQ(post_data.size(), 0);
1246}
1247
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001248TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001249 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001250 int64_t future =
1251 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1252 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1253 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1254 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1255 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1256 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1257 .WillOnce(Return(true));
1258 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1259 .WillOnce(Return(true));
1260 vector<char> post_data;
1261 ASSERT_TRUE(
1262 TestUpdateCheck(&prefs,
1263 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001264 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1265 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001266 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001267 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001268 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001269 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001270 kActionCodeSuccess,
1271 NULL,
1272 &post_data));
1273 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001274 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001275}
1276
1277TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1278 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001279 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001280 // may fail if it runs for longer than 5 seconds. It shouldn't run
1281 // that long though.
1282 int64_t midnight =
1283 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1284 int64_t midnight_slack =
1285 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001286 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001287 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1288 AllOf(Ge(midnight), Le(midnight_slack))))
1289 .WillOnce(Return(true));
1290 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1291 AllOf(Ge(midnight), Le(midnight_slack))))
1292 .WillOnce(Return(true));
1293 ASSERT_TRUE(
1294 TestUpdateCheck(&prefs,
1295 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001296 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1297 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001298 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001299 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001300 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001301 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001302 kActionCodeSuccess,
1303 NULL,
1304 NULL));
1305}
1306
1307TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001308 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001309 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1310 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1311 ASSERT_TRUE(
1312 TestUpdateCheck(&prefs,
1313 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001314 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1315 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001316 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001317 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001318 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001319 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001320 kActionCodeSuccess,
1321 NULL,
1322 NULL));
1323}
1324
1325TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001326 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001327 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1328 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1329 ASSERT_TRUE(
1330 TestUpdateCheck(&prefs,
1331 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001332 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1333 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001334 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001335 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001336 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001337 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001338 kActionCodeSuccess,
1339 NULL,
1340 NULL));
1341}
1342
Darin Petkov84c763c2010-07-29 16:27:58 -07001343TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1344 vector<char> post_data;
1345 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1346 kDefaultTestParams,
1347 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001348 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001349 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001350 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001351 NULL, // response
1352 &post_data));
1353 // convert post_data to string
1354 string post_str(&post_data[0], post_data.size());
1355 EXPECT_EQ(post_str.find("machineid="), string::npos);
1356 EXPECT_EQ(post_str.find("userid="), string::npos);
1357}
1358
Darin Petkovedc522e2010-11-05 09:35:17 -07001359TEST(OmahaRequestActionTest, NetworkFailureTest) {
1360 OmahaResponse response;
1361 ASSERT_FALSE(
1362 TestUpdateCheck(NULL, // prefs
1363 kDefaultTestParams,
1364 "",
1365 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001366 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001367 static_cast<ActionExitCode>(
1368 kActionCodeOmahaRequestHTTPResponseBase + 501),
1369 &response,
1370 NULL));
1371 EXPECT_FALSE(response.update_exists);
1372}
1373
1374TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1375 OmahaResponse response;
1376 ASSERT_FALSE(
1377 TestUpdateCheck(NULL, // prefs
1378 kDefaultTestParams,
1379 "",
1380 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001381 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001382 static_cast<ActionExitCode>(
1383 kActionCodeOmahaRequestHTTPResponseBase + 999),
1384 &response,
1385 NULL));
1386 EXPECT_FALSE(response.update_exists);
1387}
1388
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001389TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1390 OmahaResponse response;
1391 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001392 params.set_wall_clock_based_wait_enabled(true);
1393 params.set_waiting_period(TimeDelta().FromDays(1));
1394 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001395
1396 string prefs_dir;
1397 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1398 &prefs_dir));
1399 ScopedDirRemover temp_dir_remover(prefs_dir);
1400
1401 Prefs prefs;
1402 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1403 << "Failed to initialize preferences.";
1404
1405 ASSERT_FALSE(TestUpdateCheck(
1406 &prefs, // prefs
1407 params,
1408 GetUpdateResponse2(OmahaRequestParams::kAppId,
1409 "1.2.3.4", // version
1410 "http://more/info",
1411 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001412 "http://code/base/", // dl url
1413 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001414 "HASH1234=", // checksum
1415 "false", // needs admin
1416 "123", // size
1417 "", // deadline
1418 "7"), // max days to scatter
1419 -1,
1420 false, // ping_only
1421 kActionCodeOmahaUpdateDeferredPerPolicy,
1422 &response,
1423 NULL));
1424
1425 int64 timestamp = 0;
1426 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1427 ASSERT_TRUE(timestamp > 0);
1428 EXPECT_FALSE(response.update_exists);
1429}
1430
1431TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1432 OmahaResponse response;
1433 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001434 params.set_wall_clock_based_wait_enabled(true);
1435 params.set_waiting_period(TimeDelta().FromDays(1));
1436 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001437
1438 string prefs_dir;
1439 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1440 &prefs_dir));
1441 ScopedDirRemover temp_dir_remover(prefs_dir);
1442
1443 Prefs prefs;
1444 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1445 << "Failed to initialize preferences.";
1446
1447 // Set the timestamp to a very old value such that it exceeds the
1448 // waiting period set above.
1449 Time t1;
1450 Time::FromString("1/1/2012", &t1);
1451 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1452 ASSERT_TRUE(TestUpdateCheck(
1453 &prefs, // prefs
1454 params,
1455 GetUpdateResponse2(OmahaRequestParams::kAppId,
1456 "1.2.3.4", // version
1457 "http://more/info",
1458 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001459 "http://code/base/", // dl url
1460 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001461 "HASH1234=", // checksum
1462 "false", // needs admin
1463 "123", // size
1464 "", // deadline
1465 "7"), // max days to scatter
1466 -1,
1467 false, // ping_only
1468 kActionCodeSuccess,
1469 &response,
1470 NULL));
1471
1472 EXPECT_TRUE(response.update_exists);
1473
1474 // Make sure the timestamp t1 is unchanged showing that it was reused.
1475 int64 timestamp = 0;
1476 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1477 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1478}
1479
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001480TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
1481 const string kTestDir = "omaha_request_action-test";
1482 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1483 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
1484 utils::kStatefulPartition + "/etc"));
1485 vector<char> post_data;
1486 NiceMock<PrefsMock> prefs;
1487 ASSERT_TRUE(WriteFileString(
1488 kTestDir + "/etc/lsb-release",
1489 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1490 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1491 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1492 ASSERT_TRUE(WriteFileString(
1493 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
1494 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1495 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1496 OmahaRequestParams params = kDefaultTestParams;
1497 params.set_root(string("./") + kTestDir);
1498 params.SetLockDown(false);
1499 params.Init("1.2.3.4", "", 0);
1500 EXPECT_EQ("canary-channel", params.current_channel());
1501 EXPECT_EQ("stable-channel", params.target_channel());
1502 EXPECT_TRUE(params.to_more_stable_channel());
1503 EXPECT_TRUE(params.is_powerwash_allowed());
1504 ASSERT_FALSE(TestUpdateCheck(&prefs,
1505 params,
1506 "invalid xml>",
1507 -1,
1508 false, // ping_only
1509 kActionCodeOmahaRequestXMLParseError,
1510 NULL, // response
1511 &post_data));
1512 // convert post_data to string
1513 string post_str(&post_data[0], post_data.size());
1514 EXPECT_NE(string::npos, post_str.find(
1515 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1516 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1517 "track=\"stable-channel\" from_track=\"canary-channel\" "));
1518}
1519
1520TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
1521 const string kTestDir = "omaha_request_action-test";
1522 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1523 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
1524 utils::kStatefulPartition + "/etc"));
1525 vector<char> post_data;
1526 NiceMock<PrefsMock> prefs;
1527 ASSERT_TRUE(WriteFileString(
1528 kTestDir + "/etc/lsb-release",
1529 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1530 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1531 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1532 ASSERT_TRUE(WriteFileString(
1533 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
1534 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1535 OmahaRequestParams params = kDefaultTestParams;
1536 params.set_root(string("./") + kTestDir);
1537 params.SetLockDown(false);
1538 params.Init("5.6.7.8", "", 0);
1539 EXPECT_EQ("stable-channel", params.current_channel());
1540 EXPECT_EQ("canary-channel", params.target_channel());
1541 EXPECT_FALSE(params.to_more_stable_channel());
1542 EXPECT_FALSE(params.is_powerwash_allowed());
1543 ASSERT_FALSE(TestUpdateCheck(&prefs,
1544 params,
1545 "invalid xml>",
1546 -1,
1547 false, // ping_only
1548 kActionCodeOmahaRequestXMLParseError,
1549 NULL, // response
1550 &post_data));
1551 // convert post_data to string
1552 string post_str(&post_data[0], post_data.size());
1553 EXPECT_NE(string::npos, post_str.find(
1554 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1555 "version=\"5.6.7.8\" "
1556 "track=\"canary-channel\" from_track=\"stable-channel\""));
1557 EXPECT_EQ(string::npos, post_str.find( "from_version"));
1558}
1559
Darin Petkov6a5b3222010-07-13 14:55:28 -07001560} // namespace chromeos_update_engine