blob: 42b213439bc165df2e625912693941371b81c70b [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"
Darin Petkov6a5b3222010-07-13 14:55:28 -070014#include "update_engine/action_pipe.h"
15#include "update_engine/mock_http_fetcher.h"
16#include "update_engine/omaha_hash_calculator.h"
17#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070018#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070019#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070020#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070021#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070022
Darin Petkov1cbd78f2010-07-29 12:38:34 -070023using base::Time;
24using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070025using std::string;
26using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070027using testing::_;
28using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070029using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070030using testing::Ge;
31using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080032using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070033using testing::Return;
34using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070035
36namespace chromeos_update_engine {
37
38class OmahaRequestActionTest : public ::testing::Test { };
39
40namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070041
42OmahaRequestParams kDefaultTestParams(
Darin Petkov1cbd78f2010-07-29 12:38:34 -070043 OmahaRequestParams::kOsPlatform,
44 OmahaRequestParams::kOsVersion,
45 "service_pack",
46 "x86-generic",
47 OmahaRequestParams::kAppId,
48 "0.1.0.0",
49 "en-US",
50 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070051 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070052 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080053 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070054 "http://url",
55 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070056 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070057
Darin Petkov6a5b3222010-07-13 14:55:28 -070058string GetNoUpdateResponse(const string& app_id) {
59 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070060 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
61 "<daystart elapsed_seconds=\"100\"/>"
62 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
63 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070064}
65
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070066string GetUpdateResponse2(const string& app_id,
67 const string& display_version,
68 const string& more_info_url,
69 const string& prompt,
70 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070071 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070072 const string& hash,
73 const string& needsadmin,
74 const string& size,
75 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070076 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070077 string response =
78 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
79 "protocol=\"3.0\">"
80 "<daystart elapsed_seconds=\"100\"/>"
81 "<app appid=\"" + app_id + "\" status=\"ok\">"
82 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
83 "<urls><url codebase=\"" + codebase + "\"/></urls>"
84 "<manifest version=\"" + display_version + "\">"
85 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
86 "size=\"" + size + "\"/></packages>"
87 "<actions><action event=\"postinstall\" "
88 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070089 "ChromeOSVersion=\"" + display_version + "\" "
90 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
91 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080092 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070093 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070094 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -070095 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070096 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -070097 "/></actions></manifest></updatecheck></app></response>";
98 LOG(INFO) << "Response = " << response;
99 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700100}
101
Darin Petkov6a5b3222010-07-13 14:55:28 -0700102string GetUpdateResponse(const string& app_id,
103 const string& display_version,
104 const string& more_info_url,
105 const string& prompt,
106 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700107 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700108 const string& hash,
109 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700110 const string& size,
111 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700112 return GetUpdateResponse2(app_id,
113 display_version,
114 more_info_url,
115 prompt,
116 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700117 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700118 hash,
119 needsadmin,
120 size,
121 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700122 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700123}
124
125class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
126 public:
127 OmahaRequestActionTestProcessorDelegate()
128 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700129 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700130 virtual ~OmahaRequestActionTestProcessorDelegate() {
131 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700132 virtual void ProcessingDone(const ActionProcessor* processor,
133 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 ASSERT_TRUE(loop_);
135 g_main_loop_quit(loop_);
136 }
137
138 virtual void ActionCompleted(ActionProcessor* processor,
139 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700140 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700141 // make sure actions always succeed
142 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700143 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700144 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700145 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700146 }
147 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700148 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700149};
150
151gboolean StartProcessorInRunLoop(gpointer data) {
152 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
153 processor->StartProcessing();
154 return FALSE;
155}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700156} // namespace {}
157
158class OutputObjectCollectorAction;
159
160template<>
161class ActionTraits<OutputObjectCollectorAction> {
162 public:
163 // Does not take an object for input
164 typedef OmahaResponse InputObjectType;
165 // On success, puts the output path on output
166 typedef NoneType OutputObjectType;
167};
168
169class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
170 public:
171 OutputObjectCollectorAction() : has_input_object_(false) {}
172 void PerformAction() {
173 // copy input object
174 has_input_object_ = HasInputObject();
175 if (has_input_object_)
176 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700177 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700178 }
179 // Should never be called
180 void TerminateProcessing() {
181 CHECK(false);
182 }
183 // Debugging/logging
184 static std::string StaticType() {
185 return "OutputObjectCollectorAction";
186 }
187 std::string Type() const { return StaticType(); }
188 bool has_input_object_;
189 OmahaResponse omaha_response_;
190};
191
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700192// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700193// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700194// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
195// the transfer will fail with that code. |ping_only| is passed through to the
196// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
197// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700198bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700199 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700200 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700201 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700202 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700203 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700204 OmahaResponse* out_response,
205 vector<char>* out_post_data) {
206 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
207 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800208 http_response.size(),
209 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700210 if (fail_http_response_code >= 0) {
211 fetcher->FailTransfer(fail_http_response_code);
212 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800213 MockSystemState mock_system_state;
214 if (prefs)
215 mock_system_state.set_prefs(prefs);
216 OmahaRequestAction action(&mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700217 &params,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700218 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700219 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700220 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700221 OmahaRequestActionTestProcessorDelegate delegate;
222 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700223 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700224
Darin Petkov6a5b3222010-07-13 14:55:28 -0700225 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700226 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 processor.EnqueueAction(&action);
228
229 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700230 BondActions(&action, &collector_action);
231 processor.EnqueueAction(&collector_action);
232
233 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
234 g_main_loop_run(loop);
235 g_main_loop_unref(loop);
236 if (collector_action.has_input_object_ && out_response)
237 *out_response = collector_action.omaha_response_;
238 if (out_post_data)
239 *out_post_data = fetcher->post_data();
240 return collector_action.has_input_object_;
241}
242
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700243// Tests Event requests -- they should always succeed. |out_post_data|
244// may be null; if non-null, the post-data received by the mock
245// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700246void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700247 OmahaEvent* event,
248 const string& http_response,
249 vector<char>* out_post_data) {
250 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
251 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800252 http_response.size(),
253 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800254 MockSystemState mock_system_state;
255 OmahaRequestAction action(&mock_system_state, &params, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700256 OmahaRequestActionTestProcessorDelegate delegate;
257 delegate.loop_ = loop;
258 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700259 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700260 processor.EnqueueAction(&action);
261
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700262 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
263 g_main_loop_run(loop);
264 g_main_loop_unref(loop);
265 if (out_post_data)
266 *out_post_data = fetcher->post_data();
267}
268
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700270 OmahaResponse response;
271 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700272 TestUpdateCheck(NULL, // prefs
273 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700274 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700275 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700276 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700277 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700278 &response,
279 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700280 EXPECT_FALSE(response.update_exists);
281}
282
283TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700284 OmahaResponse response;
285 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700286 TestUpdateCheck(NULL, // prefs
287 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700288 GetUpdateResponse(OmahaRequestParams::kAppId,
289 "1.2.3.4", // version
290 "http://more/info",
291 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700292 "http://code/base/", // dl url
293 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700294 "HASH1234=", // checksum
295 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700296 "123", // size
297 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700298 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700299 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700300 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700301 &response,
302 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700303 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700304 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700305 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800306 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700307 EXPECT_EQ("http://more/info", response.more_info_url);
308 EXPECT_EQ("HASH1234=", response.hash);
309 EXPECT_EQ(123, response.size);
310 EXPECT_FALSE(response.needs_admin);
311 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700312 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700313}
314
Jay Srinivasan0a708742012-03-20 11:26:12 -0700315TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
316 OmahaResponse response;
317 OmahaRequestParams params = kDefaultTestParams;
318 params.update_disabled = true;
319 ASSERT_FALSE(
320 TestUpdateCheck(NULL, // prefs
321 params,
322 GetUpdateResponse(OmahaRequestParams::kAppId,
323 "1.2.3.4", // version
324 "http://more/info",
325 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700326 "http://code/base/", // dl url
327 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700328 "HASH1234=", // checksum
329 "false", // needs admin
330 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700331 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700332 -1,
333 false, // ping_only
334 kActionCodeOmahaUpdateIgnoredPerPolicy,
335 &response,
336 NULL));
337 EXPECT_FALSE(response.update_exists);
338}
339
Jay Srinivasan0a708742012-03-20 11:26:12 -0700340TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
341 OmahaResponse response;
342 OmahaRequestParams params = kDefaultTestParams;
343 params.update_disabled = true;
344 ASSERT_TRUE(
345 TestUpdateCheck(NULL, // prefs
346 params,
347 GetNoUpdateResponse(OmahaRequestParams::kAppId),
348 -1,
349 false, // ping_only
350 kActionCodeSuccess,
351 &response,
352 NULL));
353 EXPECT_FALSE(response.update_exists);
354}
355
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700356TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
357 OmahaResponse response;
358 OmahaRequestParams params = kDefaultTestParams;
359 params.wall_clock_based_wait_enabled = true;
360 params.update_check_count_wait_enabled = false;
361 params.waiting_period = TimeDelta::FromDays(2);
362
363 string prefs_dir;
364 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
365 &prefs_dir));
366 ScopedDirRemover temp_dir_remover(prefs_dir);
367
368 Prefs prefs;
369 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
370 << "Failed to initialize preferences.";
371
372 ASSERT_FALSE(
373 TestUpdateCheck(&prefs, // prefs
374 params,
375 GetUpdateResponse2(OmahaRequestParams::kAppId,
376 "1.2.3.4", // version
377 "http://more/info",
378 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700379 "http://code/base/", // dl url
380 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700381 "HASH1234=", // checksum
382 "false", // needs admin
383 "123", // size
384 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700385 "7"), // max days to scatter
386 -1,
387 false, // ping_only
388 kActionCodeOmahaUpdateDeferredPerPolicy,
389 &response,
390 NULL));
391 EXPECT_FALSE(response.update_exists);
392}
393
394TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
395 OmahaResponse response;
396 OmahaRequestParams params = kDefaultTestParams;
397 params.wall_clock_based_wait_enabled = false;
398 params.waiting_period = TimeDelta::FromDays(2);
399
400 params.update_check_count_wait_enabled = true;
401 params.min_update_checks_needed = 1;
402 params.max_update_checks_allowed = 8;
403
404 string prefs_dir;
405 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
406 &prefs_dir));
407 ScopedDirRemover temp_dir_remover(prefs_dir);
408
409 Prefs prefs;
410 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
411 << "Failed to initialize preferences.";
412
413 ASSERT_TRUE(
414 TestUpdateCheck(&prefs, // prefs
415 params,
416 GetUpdateResponse2(OmahaRequestParams::kAppId,
417 "1.2.3.4", // version
418 "http://more/info",
419 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700420 "http://code/base/", // dl url
421 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700422 "HASH1234=", // checksum
423 "false", // needs admin
424 "123", // size
425 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700426 "7"), // max days to scatter
427 -1,
428 false, // ping_only
429 kActionCodeSuccess,
430 &response,
431 NULL));
432 EXPECT_TRUE(response.update_exists);
433}
434
435TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
436 OmahaResponse response;
437 OmahaRequestParams params = kDefaultTestParams;
438 params.wall_clock_based_wait_enabled = true;
439 params.waiting_period = TimeDelta::FromDays(2);
440
441 params.update_check_count_wait_enabled = true;
442 params.min_update_checks_needed = 1;
443 params.max_update_checks_allowed = 8;
444
445 string prefs_dir;
446 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
447 &prefs_dir));
448 ScopedDirRemover temp_dir_remover(prefs_dir);
449
450 Prefs prefs;
451 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
452 << "Failed to initialize preferences.";
453
454 ASSERT_TRUE(
455 TestUpdateCheck(&prefs, // prefs
456 params,
457 GetUpdateResponse2(OmahaRequestParams::kAppId,
458 "1.2.3.4", // version
459 "http://more/info",
460 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700461 "http://code/base/", // dl url
462 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700463 "HASH1234=", // checksum
464 "false", // needs admin
465 "123", // size
466 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700467 "0"), // max days to scatter
468 -1,
469 false, // ping_only
470 kActionCodeSuccess,
471 &response,
472 NULL));
473 EXPECT_TRUE(response.update_exists);
474}
475
476
477TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
478 OmahaResponse response;
479 OmahaRequestParams params = kDefaultTestParams;
480 params.wall_clock_based_wait_enabled = true;
481 params.waiting_period = TimeDelta();
482
483 params.update_check_count_wait_enabled = true;
484 params.min_update_checks_needed = 0;
485 params.max_update_checks_allowed = 0;
486
487 string prefs_dir;
488 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
489 &prefs_dir));
490 ScopedDirRemover temp_dir_remover(prefs_dir);
491
492 Prefs prefs;
493 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
494 << "Failed to initialize preferences.";
495
496 ASSERT_TRUE(TestUpdateCheck(
497 &prefs, // prefs
498 params,
499 GetUpdateResponse2(OmahaRequestParams::kAppId,
500 "1.2.3.4", // version
501 "http://more/info",
502 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700503 "http://code/base/", // dl url
504 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700505 "HASH1234=", // checksum
506 "false", // needs admin
507 "123", // size
508 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700509 "7"), // max days to scatter
510 -1,
511 false, // ping_only
512 kActionCodeSuccess,
513 &response,
514 NULL));
515
516 int64 count;
517 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
518 ASSERT_TRUE(count == 0);
519 EXPECT_TRUE(response.update_exists);
520}
521
522TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
523 OmahaResponse response;
524 OmahaRequestParams params = kDefaultTestParams;
525 params.wall_clock_based_wait_enabled = true;
526 params.waiting_period = TimeDelta();
527
528 params.update_check_count_wait_enabled = true;
529 params.min_update_checks_needed = 1;
530 params.max_update_checks_allowed = 8;
531
532 string prefs_dir;
533 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
534 &prefs_dir));
535 ScopedDirRemover temp_dir_remover(prefs_dir);
536
537 Prefs prefs;
538 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
539 << "Failed to initialize preferences.";
540
541 ASSERT_FALSE(TestUpdateCheck(
542 &prefs, // prefs
543 params,
544 GetUpdateResponse2(OmahaRequestParams::kAppId,
545 "1.2.3.4", // version
546 "http://more/info",
547 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700548 "http://code/base/", // dl url
549 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700550 "HASH1234=", // checksum
551 "false", // needs admin
552 "123", // size
553 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700554 "7"), // max days to scatter
555 -1,
556 false, // ping_only
557 kActionCodeOmahaUpdateDeferredPerPolicy,
558 &response,
559 NULL));
560
561 int64 count;
562 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
563 ASSERT_TRUE(count > 0);
564 EXPECT_FALSE(response.update_exists);
565}
566
567TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
568 OmahaResponse response;
569 OmahaRequestParams params = kDefaultTestParams;
570 params.wall_clock_based_wait_enabled = true;
571 params.waiting_period = TimeDelta();
572
573 params.update_check_count_wait_enabled = true;
574 params.min_update_checks_needed = 1;
575 params.max_update_checks_allowed = 8;
576
577 string prefs_dir;
578 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
579 &prefs_dir));
580 ScopedDirRemover temp_dir_remover(prefs_dir);
581
582 Prefs prefs;
583 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
584 << "Failed to initialize preferences.";
585
586 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
587
588 ASSERT_FALSE(TestUpdateCheck(
589 &prefs, // prefs
590 params,
591 GetUpdateResponse2(OmahaRequestParams::kAppId,
592 "1.2.3.4", // version
593 "http://more/info",
594 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700595 "http://code/base/", // dl url
596 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700597 "HASH1234=", // checksum
598 "false", // needs admin
599 "123", // size
600 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700601 "7"), // max days to scatter
602 -1,
603 false, // ping_only
604 kActionCodeOmahaUpdateDeferredPerPolicy,
605 &response,
606 NULL));
607
608 int64 count;
609 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
610 // count remains the same, as the decrementing happens in update_attempter
611 // which this test doesn't exercise.
612 ASSERT_TRUE(count == 5);
613 EXPECT_FALSE(response.update_exists);
614}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700615
Darin Petkov6a5b3222010-07-13 14:55:28 -0700616TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700617 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
618
619 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
620
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800621 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700622 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800623 OmahaRequestAction action(&mock_system_state, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700624 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800625 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700626 NULL),
627 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700628 OmahaRequestActionTestProcessorDelegate delegate;
629 delegate.loop_ = loop;
630 ActionProcessor processor;
631 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700632 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700633
634 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
635 g_main_loop_run(loop);
636 g_main_loop_unref(loop);
637 EXPECT_FALSE(processor.IsRunning());
638}
639
640TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700641 OmahaResponse response;
642 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700643 TestUpdateCheck(NULL, // prefs
644 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700645 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700646 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700647 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700648 kActionCodeOmahaRequestXMLParseError,
649 &response,
650 NULL));
651 EXPECT_FALSE(response.update_exists);
652}
653
654TEST(OmahaRequestActionTest, EmptyResponseTest) {
655 OmahaResponse response;
656 ASSERT_FALSE(
657 TestUpdateCheck(NULL, // prefs
658 kDefaultTestParams,
659 "",
660 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700661 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700662 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700663 &response,
664 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700665 EXPECT_FALSE(response.update_exists);
666}
667
668TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700669 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700670 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700671 NULL, // prefs
672 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700673 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
674 "<daystart elapsed_seconds=\"100\"/>"
675 "<app appid=\"foo\" status=\"ok\">"
676 "<ping status=\"ok\"/>"
677 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700678 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700679 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700680 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700681 &response,
682 NULL));
683 EXPECT_FALSE(response.update_exists);
684}
685
686TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700687 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700688 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700689 NULL, // prefs
690 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700691 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
692 "<daystart elapsed_seconds=\"100\"/>"
693 "<app appid=\"foo\" status=\"ok\">"
694 "<ping status=\"ok\"/>"
695 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700696 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700697 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700698 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700699 &response,
700 NULL));
701 EXPECT_FALSE(response.update_exists);
702}
703
704TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700705 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700706 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700707 NULL, // prefs
708 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700709 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
710 "<daystart elapsed_seconds=\"100\"/>"
711 "<app appid=\"foo\" status=\"ok\">"
712 "<ping status=\"ok\"/>"
713 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700714 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700715 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700716 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700717 &response,
718 NULL));
719 EXPECT_FALSE(response.update_exists);
720}
721
722TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700723 string input_response =
724 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
725 "<daystart elapsed_seconds=\"100\"/>"
726 "<app appid=\"xyz\" status=\"ok\">"
727 "<updatecheck status=\"ok\">"
728 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
729 "<manifest version=\"1.0.0.0\">"
730 "<packages><package hash=\"not-used\" name=\"f\" "
731 "size=\"587\"/></packages>"
732 "<actions><action event=\"postinstall\" "
733 "DisplayVersion=\"10.2.3.4\" "
734 "ChromeOSVersion=\"10.2.3.4\" "
735 "Prompt=\"false\" "
736 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800737 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700738 "sha256=\"lkq34j5345\" "
739 "needsadmin=\"true\" "
740 "/></actions></manifest></updatecheck></app></response>";
741 LOG(INFO) << "Input Response = " << input_response;
742
Darin Petkov6a5b3222010-07-13 14:55:28 -0700743 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700744 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
745 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700746 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700747 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700748 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700749 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700750 &response,
751 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700752 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700753 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800754 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700755 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700756 EXPECT_EQ("lkq34j5345", response.hash);
757 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700758 EXPECT_TRUE(response.needs_admin);
759 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700760 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700761}
762
763namespace {
764class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
765 public:
766 void ProcessingStopped(const ActionProcessor* processor) {
767 ASSERT_TRUE(loop_);
768 g_main_loop_quit(loop_);
769 }
770 GMainLoop *loop_;
771};
772
773gboolean TerminateTransferTestStarter(gpointer data) {
774 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
775 processor->StartProcessing();
776 CHECK(processor->IsRunning());
777 processor->StopProcessing();
778 return FALSE;
779}
780} // namespace {}
781
782TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700783 string http_response("doesn't matter");
784 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
785
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800786 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700787 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800788 OmahaRequestAction action(&mock_system_state, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700789 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800790 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700791 NULL),
792 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700793 TerminateEarlyTestProcessorDelegate delegate;
794 delegate.loop_ = loop;
795 ActionProcessor processor;
796 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700797 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700798
799 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
800 g_main_loop_run(loop);
801 g_main_loop_unref(loop);
802}
803
804TEST(OmahaRequestActionTest, XmlEncodeTest) {
805 EXPECT_EQ("ab", XmlEncode("ab"));
806 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
807 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
808 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
809 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
810
811 vector<char> post_data;
812
813 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700814 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700815 OmahaRequestParams::kOsVersion,
816 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700817 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700818 OmahaRequestParams::kAppId,
819 "0.1.0.0",
820 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700821 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700822 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700823 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800824 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700825 "http://url",
826 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700827 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700828 OmahaResponse response;
829 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700830 TestUpdateCheck(NULL, // prefs
831 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700832 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700833 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700834 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700835 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700836 &response,
837 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700838 // convert post_data to string
839 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700840 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
841 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700842 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
843 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
844 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
845 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700846 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
847 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700848}
849
850TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700851 OmahaResponse response;
852 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700853 TestUpdateCheck(NULL, // prefs
854 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700855 GetUpdateResponse(OmahaRequestParams::kAppId,
856 "1.2.3.4", // version
857 "testthe&lt;url", // more info
858 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700859 "testthe&amp;codebase/", // dl url
860 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700861 "HASH1234=", // checksum
862 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700863 "123", // size
864 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700865 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700866 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700867 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700868 &response,
869 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700870
871 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800872 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700873 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700874}
875
876TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700877 OmahaResponse response;
878 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700879 TestUpdateCheck(NULL, // prefs
880 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700881 GetUpdateResponse(OmahaRequestParams::kAppId,
882 "1.2.3.4", // version
883 "theurl", // more info
884 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700885 "thecodebase/", // dl url
886 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700887 "HASH1234=", // checksum
888 "false", // needs admin
889 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700890 "123123123123123", // size
891 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700892 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700893 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700894 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700895 &response,
896 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700897
898 EXPECT_EQ(response.size, 123123123123123ll);
899}
900
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700901TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
902 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800903 NiceMock<PrefsMock> prefs;
904 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
905 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
906 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
907 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700908 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700909 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700910 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700911 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700912 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700913 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700914 &post_data));
915 // convert post_data to string
916 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700917 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700918 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
919 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700920 " targetversionprefix=\"\""
Gilad Arnold5e73ad72013-01-18 00:39:49 -0800921 " userinitiated=\"false\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700922 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700923 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700924 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
925 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700926 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700927}
928
Jay Srinivasan0a708742012-03-20 11:26:12 -0700929
Jay Srinivasan56d5aa42012-03-26 14:27:59 -0700930TEST(OmahaRequestActionTest, FormatTargetVersionPrefixTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800931 vector<char> post_data;
932 NiceMock<PrefsMock> prefs;
933 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700934 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
935 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
936 OmahaRequestParams params = kDefaultTestParams;
937 params.update_disabled = true;
Darin Petkov95508da2011-01-05 12:42:29 -0800938 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700939 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800940 "invalid xml>",
941 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700942 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800943 kActionCodeOmahaRequestXMLParseError,
944 NULL, // response
945 &post_data));
946 // convert post_data to string
947 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700948 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700949 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
950 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700951 " targetversionprefix=\"\""
Gilad Arnold5e73ad72013-01-18 00:39:49 -0800952 " userinitiated=\"false\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700953 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700954 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800955 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
956 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700957 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800958}
959
Darin Petkove17f86b2010-07-20 09:12:01 -0700960TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
961 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700962 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700963 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
964 "invalid xml>",
965 &post_data);
966 // convert post_data to string
967 string post_str(&post_data[0], post_data.size());
968 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700969 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700970 OmahaEvent::kTypeUpdateDownloadStarted,
971 OmahaEvent::kResultSuccess);
972 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700973 EXPECT_EQ(post_str.find("ping"), string::npos);
974 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700975}
976
977TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
978 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700979 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700980 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
981 OmahaEvent::kResultError,
982 kActionCodeError),
983 "invalid xml>",
984 &post_data);
985 // convert post_data to string
986 string post_str(&post_data[0], post_data.size());
987 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700988 " <event eventtype=\"%d\" eventresult=\"%d\" "
989 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700990 OmahaEvent::kTypeDownloadComplete,
991 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700992 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700993 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700994 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700995}
996
997TEST(OmahaRequestActionTest, IsEventTest) {
998 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800999 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001000 OmahaRequestParams params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001001 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001002 &mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001003 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001004 NULL,
1005 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001006 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001007 NULL),
1008 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001009 EXPECT_FALSE(update_check_action.IsEvent());
1010
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001011 params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001012 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001013 &mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001014 &params,
Darin Petkove17f86b2010-07-20 09:12:01 -07001015 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001016 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001017 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001018 NULL),
1019 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001020 EXPECT_TRUE(event_action.IsEvent());
1021}
1022
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001023TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1024 for (int i = 0; i < 2; i++) {
1025 bool delta_okay = i == 1;
1026 const char* delta_okay_str = delta_okay ? "true" : "false";
1027 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -07001028 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001029 OmahaRequestParams::kOsVersion,
1030 "service_pack",
1031 "x86-generic",
1032 OmahaRequestParams::kAppId,
1033 "0.1.0.0",
1034 "en-US",
1035 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001036 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001037 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001038 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001039 "http://url",
1040 false, // update_disabled
1041 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001042 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1043 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001044 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001045 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001046 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001047 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001048 NULL,
1049 &post_data));
1050 // convert post_data to string
1051 string post_str(&post_data[0], post_data.size());
1052 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1053 string::npos)
1054 << "i = " << i;
1055 }
1056}
1057
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001058TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1059 for (int i = 0; i < 2; i++) {
1060 bool interactive = i == 1;
1061 const char* interactive_str = interactive ? "true" : "false";
1062 vector<char> post_data;
1063 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
1064 OmahaRequestParams::kOsVersion,
1065 "service_pack",
1066 "x86-generic",
1067 OmahaRequestParams::kAppId,
1068 "0.1.0.0",
1069 "en-US",
1070 "unittest_track",
1071 "OEM MODEL REV 1234",
1072 true, // delta_okay
1073 interactive,
1074 "http://url",
1075 false, // update_disabled
1076 ""); // target_version_prefix
1077 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1078 params,
1079 "invalid xml>",
1080 -1,
1081 false, // ping_only
1082 kActionCodeOmahaRequestXMLParseError,
1083 NULL,
1084 &post_data));
1085 // convert post_data to string
1086 string post_str(&post_data[0], post_data.size());
1087 EXPECT_NE(post_str.find(StringPrintf(" userinitiated=\"%s\"",
1088 interactive_str)),
1089 string::npos)
1090 << "i = " << i;
1091 }
1092}
1093
Darin Petkove17f86b2010-07-20 09:12:01 -07001094TEST(OmahaRequestActionTest, OmahaEventTest) {
1095 OmahaEvent default_event;
1096 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1097 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1098 EXPECT_EQ(kActionCodeError, default_event.error_code);
1099
1100 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1101 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1102 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1103 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1104
1105 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1106 OmahaEvent::kResultError,
1107 kActionCodeError);
1108 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1109 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1110 EXPECT_EQ(kActionCodeError, error_event.error_code);
1111}
1112
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001113TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001114 for (int ping_only = 0; ping_only < 2; ping_only++) {
1115 NiceMock<PrefsMock> prefs;
1116 // Add a few hours to the day difference to test no rounding, etc.
1117 int64_t five_days_ago =
1118 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1119 int64_t six_days_ago =
1120 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1121 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1122 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1123 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1124 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1125 vector<char> post_data;
1126 ASSERT_TRUE(
1127 TestUpdateCheck(&prefs,
1128 kDefaultTestParams,
1129 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1130 -1,
1131 ping_only,
1132 kActionCodeSuccess,
1133 NULL,
1134 &post_data));
1135 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001136 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001137 string::npos);
1138 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001139 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001140 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1141 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001142 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001143 EXPECT_NE(post_str.find("previousversion"), string::npos);
1144 }
1145 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001146}
1147
1148TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001149 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001150 int64_t three_days_ago =
1151 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1152 int64_t now = Time::Now().ToInternalValue();
1153 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1154 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1155 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1156 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1157 vector<char> post_data;
1158 ASSERT_TRUE(
1159 TestUpdateCheck(&prefs,
1160 kDefaultTestParams,
1161 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001162 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001163 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001164 kActionCodeSuccess,
1165 NULL,
1166 &post_data));
1167 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001168 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001169 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001170}
1171
1172TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001173 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001174 int64_t four_days_ago =
1175 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1176 int64_t now = Time::Now().ToInternalValue();
1177 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1178 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1179 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1180 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1181 vector<char> post_data;
1182 ASSERT_TRUE(
1183 TestUpdateCheck(&prefs,
1184 kDefaultTestParams,
1185 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001186 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001187 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001188 kActionCodeSuccess,
1189 NULL,
1190 &post_data));
1191 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001192 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001193 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001194}
1195
1196TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001197 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001198 int64_t one_hour_ago =
1199 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1200 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1201 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1202 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1203 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1204 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1205 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1206 vector<char> post_data;
1207 ASSERT_TRUE(
1208 TestUpdateCheck(&prefs,
1209 kDefaultTestParams,
1210 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001211 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001212 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001213 kActionCodeSuccess,
1214 NULL,
1215 &post_data));
1216 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001217 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001218}
1219
Thieu Leb44e9e82011-06-06 14:34:04 -07001220TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1221 // This test ensures that we ignore empty ping only requests.
1222 NiceMock<PrefsMock> prefs;
1223 int64_t now = Time::Now().ToInternalValue();
1224 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1225 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1226 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1227 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1228 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1229 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1230 vector<char> post_data;
1231 EXPECT_TRUE(
1232 TestUpdateCheck(&prefs,
1233 kDefaultTestParams,
1234 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1235 -1,
1236 true, // ping_only
1237 kActionCodeSuccess,
1238 NULL,
1239 &post_data));
1240 EXPECT_EQ(post_data.size(), 0);
1241}
1242
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001243TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001244 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001245 int64_t future =
1246 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1247 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1248 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1249 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1250 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1251 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1252 .WillOnce(Return(true));
1253 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1254 .WillOnce(Return(true));
1255 vector<char> post_data;
1256 ASSERT_TRUE(
1257 TestUpdateCheck(&prefs,
1258 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001259 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1260 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001261 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001262 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001263 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001264 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001265 kActionCodeSuccess,
1266 NULL,
1267 &post_data));
1268 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001269 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001270}
1271
1272TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1273 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001274 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001275 // may fail if it runs for longer than 5 seconds. It shouldn't run
1276 // that long though.
1277 int64_t midnight =
1278 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1279 int64_t midnight_slack =
1280 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001281 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001282 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1283 AllOf(Ge(midnight), Le(midnight_slack))))
1284 .WillOnce(Return(true));
1285 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1286 AllOf(Ge(midnight), Le(midnight_slack))))
1287 .WillOnce(Return(true));
1288 ASSERT_TRUE(
1289 TestUpdateCheck(&prefs,
1290 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001291 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1292 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001293 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001294 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001295 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001296 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001297 kActionCodeSuccess,
1298 NULL,
1299 NULL));
1300}
1301
1302TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001303 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001304 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1305 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1306 ASSERT_TRUE(
1307 TestUpdateCheck(&prefs,
1308 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001309 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1310 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001311 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001312 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001313 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001314 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001315 kActionCodeSuccess,
1316 NULL,
1317 NULL));
1318}
1319
1320TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001321 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001322 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1323 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1324 ASSERT_TRUE(
1325 TestUpdateCheck(&prefs,
1326 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001327 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1328 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001329 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001330 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001331 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001332 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001333 kActionCodeSuccess,
1334 NULL,
1335 NULL));
1336}
1337
Darin Petkov84c763c2010-07-29 16:27:58 -07001338TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1339 vector<char> post_data;
1340 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1341 kDefaultTestParams,
1342 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001343 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001344 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001345 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001346 NULL, // response
1347 &post_data));
1348 // convert post_data to string
1349 string post_str(&post_data[0], post_data.size());
1350 EXPECT_EQ(post_str.find("machineid="), string::npos);
1351 EXPECT_EQ(post_str.find("userid="), string::npos);
1352}
1353
Darin Petkovedc522e2010-11-05 09:35:17 -07001354TEST(OmahaRequestActionTest, NetworkFailureTest) {
1355 OmahaResponse response;
1356 ASSERT_FALSE(
1357 TestUpdateCheck(NULL, // prefs
1358 kDefaultTestParams,
1359 "",
1360 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001361 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001362 static_cast<ActionExitCode>(
1363 kActionCodeOmahaRequestHTTPResponseBase + 501),
1364 &response,
1365 NULL));
1366 EXPECT_FALSE(response.update_exists);
1367}
1368
1369TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1370 OmahaResponse response;
1371 ASSERT_FALSE(
1372 TestUpdateCheck(NULL, // prefs
1373 kDefaultTestParams,
1374 "",
1375 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001376 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001377 static_cast<ActionExitCode>(
1378 kActionCodeOmahaRequestHTTPResponseBase + 999),
1379 &response,
1380 NULL));
1381 EXPECT_FALSE(response.update_exists);
1382}
1383
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001384TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1385 OmahaResponse response;
1386 OmahaRequestParams params = kDefaultTestParams;
1387 params.wall_clock_based_wait_enabled = true;
1388 params.waiting_period = TimeDelta().FromDays(1);
1389 params.update_check_count_wait_enabled = false;
1390
1391 string prefs_dir;
1392 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1393 &prefs_dir));
1394 ScopedDirRemover temp_dir_remover(prefs_dir);
1395
1396 Prefs prefs;
1397 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1398 << "Failed to initialize preferences.";
1399
1400 ASSERT_FALSE(TestUpdateCheck(
1401 &prefs, // prefs
1402 params,
1403 GetUpdateResponse2(OmahaRequestParams::kAppId,
1404 "1.2.3.4", // version
1405 "http://more/info",
1406 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001407 "http://code/base/", // dl url
1408 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001409 "HASH1234=", // checksum
1410 "false", // needs admin
1411 "123", // size
1412 "", // deadline
1413 "7"), // max days to scatter
1414 -1,
1415 false, // ping_only
1416 kActionCodeOmahaUpdateDeferredPerPolicy,
1417 &response,
1418 NULL));
1419
1420 int64 timestamp = 0;
1421 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1422 ASSERT_TRUE(timestamp > 0);
1423 EXPECT_FALSE(response.update_exists);
1424}
1425
1426TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1427 OmahaResponse response;
1428 OmahaRequestParams params = kDefaultTestParams;
1429 params.wall_clock_based_wait_enabled = true;
1430 params.waiting_period = TimeDelta().FromDays(1);
1431 params.update_check_count_wait_enabled = false;
1432
1433 string prefs_dir;
1434 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1435 &prefs_dir));
1436 ScopedDirRemover temp_dir_remover(prefs_dir);
1437
1438 Prefs prefs;
1439 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1440 << "Failed to initialize preferences.";
1441
1442 // Set the timestamp to a very old value such that it exceeds the
1443 // waiting period set above.
1444 Time t1;
1445 Time::FromString("1/1/2012", &t1);
1446 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1447 ASSERT_TRUE(TestUpdateCheck(
1448 &prefs, // prefs
1449 params,
1450 GetUpdateResponse2(OmahaRequestParams::kAppId,
1451 "1.2.3.4", // version
1452 "http://more/info",
1453 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001454 "http://code/base/", // dl url
1455 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001456 "HASH1234=", // checksum
1457 "false", // needs admin
1458 "123", // size
1459 "", // deadline
1460 "7"), // max days to scatter
1461 -1,
1462 false, // ping_only
1463 kActionCodeSuccess,
1464 &response,
1465 NULL));
1466
1467 EXPECT_TRUE(response.update_exists);
1468
1469 // Make sure the timestamp t1 is unchanged showing that it was reused.
1470 int64 timestamp = 0;
1471 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1472 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1473}
1474
Darin Petkov6a5b3222010-07-13 14:55:28 -07001475} // namespace chromeos_update_engine