blob: a336bdd6ae4b063066183edfdd73b4feabe8d068 [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 Petkov1cbd78f2010-07-29 12:38:34 -070020#include "update_engine/prefs_mock.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070021#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070022#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070023
Darin Petkov1cbd78f2010-07-29 12:38:34 -070024using base::Time;
25using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070026using std::string;
27using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070028using testing::_;
29using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070030using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070031using testing::Ge;
32using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080033using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070034using testing::Return;
35using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070036
37namespace chromeos_update_engine {
38
39class OmahaRequestActionTest : public ::testing::Test { };
40
41namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070042
43OmahaRequestParams kDefaultTestParams(
Darin Petkov1cbd78f2010-07-29 12:38:34 -070044 OmahaRequestParams::kOsPlatform,
45 OmahaRequestParams::kOsVersion,
46 "service_pack",
47 "x86-generic",
48 OmahaRequestParams::kAppId,
49 "0.1.0.0",
50 "en-US",
51 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070052 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070053 false, // delta okay
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(
60 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
61 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
62 "appid=\"") + app_id + "\" status=\"ok\"><ping "
63 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
64}
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,
71 const string& hash,
72 const string& needsadmin,
73 const string& size,
74 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070075 const string& max_days_to_scatter) {
76 return string(
77 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
78 "xmlns=\"http://www.google.com/update2/response\" "
79 "protocol=\"2.0\"><app "
80 "appid=\"") + app_id + "\" status=\"ok\"><ping "
81 "status=\"ok\"/><updatecheck DisplayVersion=\"" + display_version + "\" "
82 "ChromeOSVersion=\"" + display_version + "\" "
83 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
84 "IsDelta=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070085 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
86 "codebase=\"" + codebase + "\" "
87 "hash=\"not-applicable\" "
88 "sha256=\"" + hash + "\" "
89 "needsadmin=\"" + needsadmin + "\" "
90 "size=\"" + size + "\" " +
91 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
92 "status=\"ok\"/></app></gupdate>";
93}
94
Darin Petkov6a5b3222010-07-13 14:55:28 -070095string GetUpdateResponse(const string& app_id,
96 const string& display_version,
97 const string& more_info_url,
98 const string& prompt,
99 const string& codebase,
100 const string& hash,
101 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700102 const string& size,
103 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700104 return GetUpdateResponse2(app_id,
105 display_version,
106 more_info_url,
107 prompt,
108 codebase,
109 hash,
110 needsadmin,
111 size,
112 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700113 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700114}
115
116class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
117 public:
118 OmahaRequestActionTestProcessorDelegate()
119 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700120 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700121 virtual ~OmahaRequestActionTestProcessorDelegate() {
122 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700123 virtual void ProcessingDone(const ActionProcessor* processor,
124 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700125 ASSERT_TRUE(loop_);
126 g_main_loop_quit(loop_);
127 }
128
129 virtual void ActionCompleted(ActionProcessor* processor,
130 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700131 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700132 // make sure actions always succeed
133 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700134 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700135 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700136 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700137 }
138 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700139 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700140};
141
142gboolean StartProcessorInRunLoop(gpointer data) {
143 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
144 processor->StartProcessing();
145 return FALSE;
146}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700147} // namespace {}
148
149class OutputObjectCollectorAction;
150
151template<>
152class ActionTraits<OutputObjectCollectorAction> {
153 public:
154 // Does not take an object for input
155 typedef OmahaResponse InputObjectType;
156 // On success, puts the output path on output
157 typedef NoneType OutputObjectType;
158};
159
160class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
161 public:
162 OutputObjectCollectorAction() : has_input_object_(false) {}
163 void PerformAction() {
164 // copy input object
165 has_input_object_ = HasInputObject();
166 if (has_input_object_)
167 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700168 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700169 }
170 // Should never be called
171 void TerminateProcessing() {
172 CHECK(false);
173 }
174 // Debugging/logging
175 static std::string StaticType() {
176 return "OutputObjectCollectorAction";
177 }
178 std::string Type() const { return StaticType(); }
179 bool has_input_object_;
180 OmahaResponse omaha_response_;
181};
182
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700183// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700184// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700185// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
186// the transfer will fail with that code. |ping_only| is passed through to the
187// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
188// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700189bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700190 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700191 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700192 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700193 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700194 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700195 OmahaResponse* out_response,
196 vector<char>* out_post_data) {
197 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
198 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800199 http_response.size(),
200 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700201 if (fail_http_response_code >= 0) {
202 fetcher->FailTransfer(fail_http_response_code);
203 }
Darin Petkov9c096d62010-11-17 14:49:04 -0800204 NiceMock<PrefsMock> local_prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700205 OmahaRequestAction action(prefs ? prefs : &local_prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700206 &params,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700207 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700208 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700209 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700210 OmahaRequestActionTestProcessorDelegate delegate;
211 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700212 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700213
Darin Petkov6a5b3222010-07-13 14:55:28 -0700214 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700215 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700216 processor.EnqueueAction(&action);
217
218 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700219 BondActions(&action, &collector_action);
220 processor.EnqueueAction(&collector_action);
221
222 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
223 g_main_loop_run(loop);
224 g_main_loop_unref(loop);
225 if (collector_action.has_input_object_ && out_response)
226 *out_response = collector_action.omaha_response_;
227 if (out_post_data)
228 *out_post_data = fetcher->post_data();
229 return collector_action.has_input_object_;
230}
231
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700232// Tests Event requests -- they should always succeed. |out_post_data|
233// may be null; if non-null, the post-data received by the mock
234// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700235void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700236 OmahaEvent* event,
237 const string& http_response,
238 vector<char>* out_post_data) {
239 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
240 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800241 http_response.size(),
242 NULL);
Darin Petkov9c096d62010-11-17 14:49:04 -0800243 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700244 OmahaRequestAction action(&prefs, &params, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700245 OmahaRequestActionTestProcessorDelegate delegate;
246 delegate.loop_ = loop;
247 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700248 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700249 processor.EnqueueAction(&action);
250
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700251 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
252 g_main_loop_run(loop);
253 g_main_loop_unref(loop);
254 if (out_post_data)
255 *out_post_data = fetcher->post_data();
256}
257
Darin Petkov6a5b3222010-07-13 14:55:28 -0700258TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700259 OmahaResponse response;
260 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700261 TestUpdateCheck(NULL, // prefs
262 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700263 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700264 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700265 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700266 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700267 &response,
268 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 EXPECT_FALSE(response.update_exists);
270}
271
272TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700273 OmahaResponse response;
274 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700275 TestUpdateCheck(NULL, // prefs
276 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700277 GetUpdateResponse(OmahaRequestParams::kAppId,
278 "1.2.3.4", // version
279 "http://more/info",
280 "true", // prompt
281 "http://code/base", // dl url
282 "HASH1234=", // checksum
283 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700284 "123", // size
285 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700286 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700287 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700288 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700289 &response,
290 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700291 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700292 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700293 EXPECT_EQ("1.2.3.4", response.display_version);
294 EXPECT_EQ("http://code/base", response.codebase);
295 EXPECT_EQ("http://more/info", response.more_info_url);
296 EXPECT_EQ("HASH1234=", response.hash);
297 EXPECT_EQ(123, response.size);
298 EXPECT_FALSE(response.needs_admin);
299 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700300 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700301}
302
Jay Srinivasan0a708742012-03-20 11:26:12 -0700303TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
304 OmahaResponse response;
305 OmahaRequestParams params = kDefaultTestParams;
306 params.update_disabled = true;
307 ASSERT_FALSE(
308 TestUpdateCheck(NULL, // prefs
309 params,
310 GetUpdateResponse(OmahaRequestParams::kAppId,
311 "1.2.3.4", // version
312 "http://more/info",
313 "true", // prompt
314 "http://code/base", // dl url
315 "HASH1234=", // checksum
316 "false", // needs admin
317 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700318 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700319 -1,
320 false, // ping_only
321 kActionCodeOmahaUpdateIgnoredPerPolicy,
322 &response,
323 NULL));
324 EXPECT_FALSE(response.update_exists);
325}
326
Jay Srinivasan0a708742012-03-20 11:26:12 -0700327TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
328 OmahaResponse response;
329 OmahaRequestParams params = kDefaultTestParams;
330 params.update_disabled = true;
331 ASSERT_TRUE(
332 TestUpdateCheck(NULL, // prefs
333 params,
334 GetNoUpdateResponse(OmahaRequestParams::kAppId),
335 -1,
336 false, // ping_only
337 kActionCodeSuccess,
338 &response,
339 NULL));
340 EXPECT_FALSE(response.update_exists);
341}
342
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700343TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
344 OmahaResponse response;
345 OmahaRequestParams params = kDefaultTestParams;
346 params.wall_clock_based_wait_enabled = true;
347 params.update_check_count_wait_enabled = false;
348 params.waiting_period = TimeDelta::FromDays(2);
349
350 string prefs_dir;
351 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
352 &prefs_dir));
353 ScopedDirRemover temp_dir_remover(prefs_dir);
354
355 Prefs prefs;
356 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
357 << "Failed to initialize preferences.";
358
359 ASSERT_FALSE(
360 TestUpdateCheck(&prefs, // prefs
361 params,
362 GetUpdateResponse2(OmahaRequestParams::kAppId,
363 "1.2.3.4", // version
364 "http://more/info",
365 "true", // prompt
366 "http://code/base", // dl url
367 "HASH1234=", // checksum
368 "false", // needs admin
369 "123", // size
370 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700371 "7"), // max days to scatter
372 -1,
373 false, // ping_only
374 kActionCodeOmahaUpdateDeferredPerPolicy,
375 &response,
376 NULL));
377 EXPECT_FALSE(response.update_exists);
378}
379
380TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
381 OmahaResponse response;
382 OmahaRequestParams params = kDefaultTestParams;
383 params.wall_clock_based_wait_enabled = false;
384 params.waiting_period = TimeDelta::FromDays(2);
385
386 params.update_check_count_wait_enabled = true;
387 params.min_update_checks_needed = 1;
388 params.max_update_checks_allowed = 8;
389
390 string prefs_dir;
391 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
392 &prefs_dir));
393 ScopedDirRemover temp_dir_remover(prefs_dir);
394
395 Prefs prefs;
396 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
397 << "Failed to initialize preferences.";
398
399 ASSERT_TRUE(
400 TestUpdateCheck(&prefs, // prefs
401 params,
402 GetUpdateResponse2(OmahaRequestParams::kAppId,
403 "1.2.3.4", // version
404 "http://more/info",
405 "true", // prompt
406 "http://code/base", // dl url
407 "HASH1234=", // checksum
408 "false", // needs admin
409 "123", // size
410 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700411 "7"), // max days to scatter
412 -1,
413 false, // ping_only
414 kActionCodeSuccess,
415 &response,
416 NULL));
417 EXPECT_TRUE(response.update_exists);
418}
419
420TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
421 OmahaResponse response;
422 OmahaRequestParams params = kDefaultTestParams;
423 params.wall_clock_based_wait_enabled = true;
424 params.waiting_period = TimeDelta::FromDays(2);
425
426 params.update_check_count_wait_enabled = true;
427 params.min_update_checks_needed = 1;
428 params.max_update_checks_allowed = 8;
429
430 string prefs_dir;
431 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
432 &prefs_dir));
433 ScopedDirRemover temp_dir_remover(prefs_dir);
434
435 Prefs prefs;
436 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
437 << "Failed to initialize preferences.";
438
439 ASSERT_TRUE(
440 TestUpdateCheck(&prefs, // prefs
441 params,
442 GetUpdateResponse2(OmahaRequestParams::kAppId,
443 "1.2.3.4", // version
444 "http://more/info",
445 "true", // prompt
446 "http://code/base", // dl url
447 "HASH1234=", // checksum
448 "false", // needs admin
449 "123", // size
450 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700451 "0"), // max days to scatter
452 -1,
453 false, // ping_only
454 kActionCodeSuccess,
455 &response,
456 NULL));
457 EXPECT_TRUE(response.update_exists);
458}
459
460
461TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
462 OmahaResponse response;
463 OmahaRequestParams params = kDefaultTestParams;
464 params.wall_clock_based_wait_enabled = true;
465 params.waiting_period = TimeDelta();
466
467 params.update_check_count_wait_enabled = true;
468 params.min_update_checks_needed = 0;
469 params.max_update_checks_allowed = 0;
470
471 string prefs_dir;
472 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
473 &prefs_dir));
474 ScopedDirRemover temp_dir_remover(prefs_dir);
475
476 Prefs prefs;
477 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
478 << "Failed to initialize preferences.";
479
480 ASSERT_TRUE(TestUpdateCheck(
481 &prefs, // prefs
482 params,
483 GetUpdateResponse2(OmahaRequestParams::kAppId,
484 "1.2.3.4", // version
485 "http://more/info",
486 "true", // prompt
487 "http://code/base", // dl url
488 "HASH1234=", // checksum
489 "false", // needs admin
490 "123", // size
491 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700492 "7"), // max days to scatter
493 -1,
494 false, // ping_only
495 kActionCodeSuccess,
496 &response,
497 NULL));
498
499 int64 count;
500 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
501 ASSERT_TRUE(count == 0);
502 EXPECT_TRUE(response.update_exists);
503}
504
505TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
506 OmahaResponse response;
507 OmahaRequestParams params = kDefaultTestParams;
508 params.wall_clock_based_wait_enabled = true;
509 params.waiting_period = TimeDelta();
510
511 params.update_check_count_wait_enabled = true;
512 params.min_update_checks_needed = 1;
513 params.max_update_checks_allowed = 8;
514
515 string prefs_dir;
516 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
517 &prefs_dir));
518 ScopedDirRemover temp_dir_remover(prefs_dir);
519
520 Prefs prefs;
521 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
522 << "Failed to initialize preferences.";
523
524 ASSERT_FALSE(TestUpdateCheck(
525 &prefs, // prefs
526 params,
527 GetUpdateResponse2(OmahaRequestParams::kAppId,
528 "1.2.3.4", // version
529 "http://more/info",
530 "true", // prompt
531 "http://code/base", // dl url
532 "HASH1234=", // checksum
533 "false", // needs admin
534 "123", // size
535 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700536 "7"), // max days to scatter
537 -1,
538 false, // ping_only
539 kActionCodeOmahaUpdateDeferredPerPolicy,
540 &response,
541 NULL));
542
543 int64 count;
544 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
545 ASSERT_TRUE(count > 0);
546 EXPECT_FALSE(response.update_exists);
547}
548
549TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
550 OmahaResponse response;
551 OmahaRequestParams params = kDefaultTestParams;
552 params.wall_clock_based_wait_enabled = true;
553 params.waiting_period = TimeDelta();
554
555 params.update_check_count_wait_enabled = true;
556 params.min_update_checks_needed = 1;
557 params.max_update_checks_allowed = 8;
558
559 string prefs_dir;
560 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
561 &prefs_dir));
562 ScopedDirRemover temp_dir_remover(prefs_dir);
563
564 Prefs prefs;
565 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
566 << "Failed to initialize preferences.";
567
568 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
569
570 ASSERT_FALSE(TestUpdateCheck(
571 &prefs, // prefs
572 params,
573 GetUpdateResponse2(OmahaRequestParams::kAppId,
574 "1.2.3.4", // version
575 "http://more/info",
576 "true", // prompt
577 "http://code/base", // dl url
578 "HASH1234=", // checksum
579 "false", // needs admin
580 "123", // size
581 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700582 "7"), // max days to scatter
583 -1,
584 false, // ping_only
585 kActionCodeOmahaUpdateDeferredPerPolicy,
586 &response,
587 NULL));
588
589 int64 count;
590 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
591 // count remains the same, as the decrementing happens in update_attempter
592 // which this test doesn't exercise.
593 ASSERT_TRUE(count == 5);
594 EXPECT_FALSE(response.update_exists);
595}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700596
Darin Petkov6a5b3222010-07-13 14:55:28 -0700597TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700598 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
599
600 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
601
Darin Petkov9c096d62010-11-17 14:49:04 -0800602 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700603 OmahaRequestParams params = kDefaultTestParams;
604 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700605 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800606 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700607 NULL),
608 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700609 OmahaRequestActionTestProcessorDelegate delegate;
610 delegate.loop_ = loop;
611 ActionProcessor processor;
612 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700613 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700614
615 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
616 g_main_loop_run(loop);
617 g_main_loop_unref(loop);
618 EXPECT_FALSE(processor.IsRunning());
619}
620
621TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700622 OmahaResponse response;
623 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700624 TestUpdateCheck(NULL, // prefs
625 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700626 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700627 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700628 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700629 kActionCodeOmahaRequestXMLParseError,
630 &response,
631 NULL));
632 EXPECT_FALSE(response.update_exists);
633}
634
635TEST(OmahaRequestActionTest, EmptyResponseTest) {
636 OmahaResponse response;
637 ASSERT_FALSE(
638 TestUpdateCheck(NULL, // prefs
639 kDefaultTestParams,
640 "",
641 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700642 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700643 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700644 &response,
645 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700646 EXPECT_FALSE(response.update_exists);
647}
648
649TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700650 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700651 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700652 NULL, // prefs
653 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700654 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
655 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
656 "appid=\"foo\" status=\"ok\"><ping "
657 "status=\"ok\"/><updatecheck/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700658 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700659 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700660 kActionCodeOmahaRequestNoUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700661 &response,
662 NULL));
663 EXPECT_FALSE(response.update_exists);
664}
665
666TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700667 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700668 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700669 NULL, // prefs
670 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700671 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
672 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
673 "appid=\"foo\" status=\"ok\"><ping "
674 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700675 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700676 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700677 kActionCodeOmahaRequestBadUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700678 &response,
679 NULL));
680 EXPECT_FALSE(response.update_exists);
681}
682
683TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700684 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700685 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700686 NULL, // prefs
687 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700688 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
689 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
690 "appid=\"foo\" status=\"ok\"><ping "
691 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700692 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700693 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700694 kActionCodeOmahaRequestNoUpdateCheckNode,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700695 &response,
696 NULL));
697 EXPECT_FALSE(response.update_exists);
698}
699
700TEST(OmahaRequestActionTest, MissingFieldTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700701 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700702 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
703 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700704 string("<?xml version=\"1.0\" "
705 "encoding=\"UTF-8\"?><gupdate "
706 "xmlns=\"http://www.google.com/"
707 "update2/response\" "
708 "protocol=\"2.0\"><app appid=\"") +
709 OmahaRequestParams::kAppId
710 + "\" status=\"ok\"><ping "
711 "status=\"ok\"/><updatecheck "
712 "DisplayVersion=\"1.2.3.4\" "
Jay Srinivasan0a708742012-03-20 11:26:12 -0700713 "ChromeOSVersion=\"1.2.3.4\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700714 "Prompt=\"false\" "
Darin Petkov7ed561b2011-10-04 02:59:03 -0700715 "IsDelta=\"true\" "
Darin Petkovd22cb292010-09-29 10:02:29 -0700716 "codebase=\"http://code/base\" hash=\"foo\" "
717 "sha256=\"HASH1234=\" needsadmin=\"true\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700718 "size=\"123\" "
719 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700720 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700721 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700722 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700723 &response,
724 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700725 EXPECT_TRUE(response.update_exists);
726 EXPECT_EQ("1.2.3.4", response.display_version);
727 EXPECT_EQ("http://code/base", response.codebase);
728 EXPECT_EQ("", response.more_info_url);
729 EXPECT_EQ("HASH1234=", response.hash);
730 EXPECT_EQ(123, response.size);
731 EXPECT_TRUE(response.needs_admin);
732 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700733 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700734}
735
736namespace {
737class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
738 public:
739 void ProcessingStopped(const ActionProcessor* processor) {
740 ASSERT_TRUE(loop_);
741 g_main_loop_quit(loop_);
742 }
743 GMainLoop *loop_;
744};
745
746gboolean TerminateTransferTestStarter(gpointer data) {
747 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
748 processor->StartProcessing();
749 CHECK(processor->IsRunning());
750 processor->StopProcessing();
751 return FALSE;
752}
753} // namespace {}
754
755TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700756 string http_response("doesn't matter");
757 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
758
Darin Petkov9c096d62010-11-17 14:49:04 -0800759 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700760 OmahaRequestParams params = kDefaultTestParams;
761 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700762 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800763 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700764 NULL),
765 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700766 TerminateEarlyTestProcessorDelegate delegate;
767 delegate.loop_ = loop;
768 ActionProcessor processor;
769 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700770 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700771
772 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
773 g_main_loop_run(loop);
774 g_main_loop_unref(loop);
775}
776
777TEST(OmahaRequestActionTest, XmlEncodeTest) {
778 EXPECT_EQ("ab", XmlEncode("ab"));
779 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
780 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
781 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
782 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
783
784 vector<char> post_data;
785
786 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700787 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700788 OmahaRequestParams::kOsVersion,
789 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700790 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700791 OmahaRequestParams::kAppId,
792 "0.1.0.0",
793 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700794 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700795 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700796 false, // delta okay
Jay Srinivasan0a708742012-03-20 11:26:12 -0700797 "http://url",
798 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700799 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700800 OmahaResponse response;
801 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700802 TestUpdateCheck(NULL, // prefs
803 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700804 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700805 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700806 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700807 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700808 &response,
809 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700810 // convert post_data to string
811 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700812 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
813 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700814 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
815 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
816 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
817 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700818 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
819 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700820}
821
822TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700823 OmahaResponse response;
824 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700825 TestUpdateCheck(NULL, // prefs
826 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700827 GetUpdateResponse(OmahaRequestParams::kAppId,
828 "1.2.3.4", // version
829 "testthe&lt;url", // more info
830 "true", // prompt
831 "testthe&amp;codebase", // dl url
832 "HASH1234=", // checksum
833 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700834 "123", // size
835 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700836 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700837 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700838 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700839 &response,
840 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700841
842 EXPECT_EQ(response.more_info_url, "testthe<url");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700843 EXPECT_EQ(response.codebase, "testthe&codebase");
Darin Petkov6c118642010-10-21 12:06:30 -0700844 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700845}
846
847TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700848 OmahaResponse response;
849 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700850 TestUpdateCheck(NULL, // prefs
851 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700852 GetUpdateResponse(OmahaRequestParams::kAppId,
853 "1.2.3.4", // version
854 "theurl", // more info
855 "true", // prompt
856 "thecodebase", // dl url
857 "HASH1234=", // checksum
858 "false", // needs admin
859 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700860 "123123123123123", // size
861 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700862 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700863 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700864 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700865 &response,
866 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700867
868 EXPECT_EQ(response.size, 123123123123123ll);
869}
870
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700871TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
872 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800873 NiceMock<PrefsMock> prefs;
874 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
875 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
876 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
877 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700878 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700879 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700880 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700881 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700882 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700883 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700884 &post_data));
885 // convert post_data to string
886 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700887 EXPECT_NE(post_str.find(
Jay Srinivasan0a708742012-03-20 11:26:12 -0700888 " <o:ping active=\"1\" a=\"-1\" r=\"-1\"></o:ping>\n"
889 " <o:updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700890 " targetversionprefix=\"\""
891 "></o:updatecheck>\n"),
892 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700893 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
894 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700895 EXPECT_EQ(post_str.find("o:event"), string::npos);
896}
897
Jay Srinivasan0a708742012-03-20 11:26:12 -0700898
Jay Srinivasan56d5aa42012-03-26 14:27:59 -0700899TEST(OmahaRequestActionTest, FormatTargetVersionPrefixTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800900 vector<char> post_data;
901 NiceMock<PrefsMock> prefs;
902 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700903 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
904 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
905 OmahaRequestParams params = kDefaultTestParams;
906 params.update_disabled = true;
Darin Petkov95508da2011-01-05 12:42:29 -0800907 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700908 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800909 "invalid xml>",
910 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700911 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800912 kActionCodeOmahaRequestXMLParseError,
913 NULL, // response
914 &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 Srinivasan0a708742012-03-20 11:26:12 -0700918 " <o:ping active=\"1\" a=\"-1\" r=\"-1\"></o:ping>\n"
919 " <o:updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700920 " targetversionprefix=\"\""
921 "></o:updatecheck>\n"),
922 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800923 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
924 string::npos);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700925 EXPECT_EQ(post_str.find("o:event"), string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800926}
927
Darin Petkove17f86b2010-07-20 09:12:01 -0700928TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
929 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700930 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700931 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
932 "invalid xml>",
933 &post_data);
934 // convert post_data to string
935 string post_str(&post_data[0], post_data.size());
936 string expected_event = StringPrintf(
937 " <o:event eventtype=\"%d\" eventresult=\"%d\"></o:event>\n",
938 OmahaEvent::kTypeUpdateDownloadStarted,
939 OmahaEvent::kResultSuccess);
940 EXPECT_NE(post_str.find(expected_event), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700941 EXPECT_EQ(post_str.find("o:ping"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700942 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
943}
944
945TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
946 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700947 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700948 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
949 OmahaEvent::kResultError,
950 kActionCodeError),
951 "invalid xml>",
952 &post_data);
953 // convert post_data to string
954 string post_str(&post_data[0], post_data.size());
955 string expected_event = StringPrintf(
956 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
957 "errorcode=\"%d\"></o:event>\n",
958 OmahaEvent::kTypeDownloadComplete,
959 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700960 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700961 EXPECT_NE(post_str.find(expected_event), string::npos);
962 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
963}
964
965TEST(OmahaRequestActionTest, IsEventTest) {
966 string http_response("doesn't matter");
Darin Petkov9c096d62010-11-17 14:49:04 -0800967 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700968 OmahaRequestParams params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700969 OmahaRequestAction update_check_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700970 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700971 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700972 NULL,
973 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800974 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700975 NULL),
976 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700977 EXPECT_FALSE(update_check_action.IsEvent());
978
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700979 params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700980 OmahaRequestAction event_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700981 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700982 &params,
Darin Petkove17f86b2010-07-20 09:12:01 -0700983 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700984 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800985 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700986 NULL),
987 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700988 EXPECT_TRUE(event_action.IsEvent());
989}
990
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700991TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
992 for (int i = 0; i < 2; i++) {
993 bool delta_okay = i == 1;
994 const char* delta_okay_str = delta_okay ? "true" : "false";
995 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -0700996 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700997 OmahaRequestParams::kOsVersion,
998 "service_pack",
999 "x86-generic",
1000 OmahaRequestParams::kAppId,
1001 "0.1.0.0",
1002 "en-US",
1003 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001004 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001005 delta_okay,
Jay Srinivasan0a708742012-03-20 11:26:12 -07001006 "http://url",
1007 false, // update_disabled
1008 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001009 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1010 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001011 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001012 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001013 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001014 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001015 NULL,
1016 &post_data));
1017 // convert post_data to string
1018 string post_str(&post_data[0], post_data.size());
1019 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1020 string::npos)
1021 << "i = " << i;
1022 }
1023}
1024
Darin Petkove17f86b2010-07-20 09:12:01 -07001025TEST(OmahaRequestActionTest, OmahaEventTest) {
1026 OmahaEvent default_event;
1027 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1028 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1029 EXPECT_EQ(kActionCodeError, default_event.error_code);
1030
1031 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1032 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1033 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1034 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1035
1036 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1037 OmahaEvent::kResultError,
1038 kActionCodeError);
1039 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1040 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1041 EXPECT_EQ(kActionCodeError, error_event.error_code);
1042}
1043
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001044TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001045 for (int ping_only = 0; ping_only < 2; ping_only++) {
1046 NiceMock<PrefsMock> prefs;
1047 // Add a few hours to the day difference to test no rounding, etc.
1048 int64_t five_days_ago =
1049 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1050 int64_t six_days_ago =
1051 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1052 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1053 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1054 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1055 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1056 vector<char> post_data;
1057 ASSERT_TRUE(
1058 TestUpdateCheck(&prefs,
1059 kDefaultTestParams,
1060 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1061 -1,
1062 ping_only,
1063 kActionCodeSuccess,
1064 NULL,
1065 &post_data));
1066 string post_str(&post_data[0], post_data.size());
1067 EXPECT_NE(post_str.find("<o:ping active=\"1\" a=\"6\" r=\"5\"></o:ping>"),
1068 string::npos);
1069 if (ping_only) {
1070 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
1071 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1072 } else {
1073 EXPECT_NE(post_str.find("o:updatecheck"), string::npos);
1074 EXPECT_NE(post_str.find("previousversion"), string::npos);
1075 }
1076 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001077}
1078
1079TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001080 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001081 int64_t three_days_ago =
1082 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1083 int64_t now = Time::Now().ToInternalValue();
1084 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1085 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1086 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1087 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1088 vector<char> post_data;
1089 ASSERT_TRUE(
1090 TestUpdateCheck(&prefs,
1091 kDefaultTestParams,
1092 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001093 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001094 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001095 kActionCodeSuccess,
1096 NULL,
1097 &post_data));
1098 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001099 EXPECT_NE(post_str.find("<o:ping active=\"1\" a=\"3\"></o:ping>"),
1100 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001101}
1102
1103TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001104 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001105 int64_t four_days_ago =
1106 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1107 int64_t now = Time::Now().ToInternalValue();
1108 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1109 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1110 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1111 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1112 vector<char> post_data;
1113 ASSERT_TRUE(
1114 TestUpdateCheck(&prefs,
1115 kDefaultTestParams,
1116 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001117 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001118 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001119 kActionCodeSuccess,
1120 NULL,
1121 &post_data));
1122 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001123 EXPECT_NE(post_str.find("<o:ping active=\"1\" r=\"4\"></o:ping>\n"),
1124 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001125}
1126
1127TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001128 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001129 int64_t one_hour_ago =
1130 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1131 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1132 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1133 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1134 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1135 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1136 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1137 vector<char> post_data;
1138 ASSERT_TRUE(
1139 TestUpdateCheck(&prefs,
1140 kDefaultTestParams,
1141 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001142 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001143 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001144 kActionCodeSuccess,
1145 NULL,
1146 &post_data));
1147 string post_str(&post_data[0], post_data.size());
1148 EXPECT_EQ(post_str.find("o:ping"), string::npos);
1149}
1150
Thieu Leb44e9e82011-06-06 14:34:04 -07001151TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1152 // This test ensures that we ignore empty ping only requests.
1153 NiceMock<PrefsMock> prefs;
1154 int64_t now = Time::Now().ToInternalValue();
1155 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1156 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1157 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1158 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1159 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1160 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1161 vector<char> post_data;
1162 EXPECT_TRUE(
1163 TestUpdateCheck(&prefs,
1164 kDefaultTestParams,
1165 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1166 -1,
1167 true, // ping_only
1168 kActionCodeSuccess,
1169 NULL,
1170 &post_data));
1171 EXPECT_EQ(post_data.size(), 0);
1172}
1173
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001174TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001175 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001176 int64_t future =
1177 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1178 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1179 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1180 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1181 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1182 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1183 .WillOnce(Return(true));
1184 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1185 .WillOnce(Return(true));
1186 vector<char> post_data;
1187 ASSERT_TRUE(
1188 TestUpdateCheck(&prefs,
1189 kDefaultTestParams,
1190 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1191 "xmlns=\"http://www.google.com/update2/response\" "
1192 "protocol=\"2.0\"><daystart elapsed_seconds=\"100\"/>"
1193 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1194 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001195 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001196 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001197 kActionCodeSuccess,
1198 NULL,
1199 &post_data));
1200 string post_str(&post_data[0], post_data.size());
1201 EXPECT_EQ(post_str.find("o:ping"), string::npos);
1202}
1203
1204TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1205 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001206 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001207 // may fail if it runs for longer than 5 seconds. It shouldn't run
1208 // that long though.
1209 int64_t midnight =
1210 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1211 int64_t midnight_slack =
1212 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001213 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001214 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1215 AllOf(Ge(midnight), Le(midnight_slack))))
1216 .WillOnce(Return(true));
1217 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1218 AllOf(Ge(midnight), Le(midnight_slack))))
1219 .WillOnce(Return(true));
1220 ASSERT_TRUE(
1221 TestUpdateCheck(&prefs,
1222 kDefaultTestParams,
1223 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1224 "xmlns=\"http://www.google.com/update2/response\" "
1225 "protocol=\"2.0\"><daystart elapsed_seconds=\"200\"/>"
1226 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1227 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001228 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001229 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001230 kActionCodeSuccess,
1231 NULL,
1232 NULL));
1233}
1234
1235TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001236 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001237 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1238 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1239 ASSERT_TRUE(
1240 TestUpdateCheck(&prefs,
1241 kDefaultTestParams,
1242 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1243 "xmlns=\"http://www.google.com/update2/response\" "
1244 "protocol=\"2.0\"><daystart blah=\"200\"/>"
1245 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1246 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001247 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001248 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001249 kActionCodeSuccess,
1250 NULL,
1251 NULL));
1252}
1253
1254TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001255 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001256 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1257 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1258 ASSERT_TRUE(
1259 TestUpdateCheck(&prefs,
1260 kDefaultTestParams,
1261 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1262 "xmlns=\"http://www.google.com/update2/response\" "
1263 "protocol=\"2.0\"><daystart elapsed_seconds=\"x\"/>"
1264 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1265 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001266 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001267 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001268 kActionCodeSuccess,
1269 NULL,
1270 NULL));
1271}
1272
Darin Petkov84c763c2010-07-29 16:27:58 -07001273TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1274 vector<char> post_data;
1275 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1276 kDefaultTestParams,
1277 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001278 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001279 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001280 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001281 NULL, // response
1282 &post_data));
1283 // convert post_data to string
1284 string post_str(&post_data[0], post_data.size());
1285 EXPECT_EQ(post_str.find("machineid="), string::npos);
1286 EXPECT_EQ(post_str.find("userid="), string::npos);
1287}
1288
Darin Petkovedc522e2010-11-05 09:35:17 -07001289TEST(OmahaRequestActionTest, NetworkFailureTest) {
1290 OmahaResponse response;
1291 ASSERT_FALSE(
1292 TestUpdateCheck(NULL, // prefs
1293 kDefaultTestParams,
1294 "",
1295 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001296 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001297 static_cast<ActionExitCode>(
1298 kActionCodeOmahaRequestHTTPResponseBase + 501),
1299 &response,
1300 NULL));
1301 EXPECT_FALSE(response.update_exists);
1302}
1303
1304TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1305 OmahaResponse response;
1306 ASSERT_FALSE(
1307 TestUpdateCheck(NULL, // prefs
1308 kDefaultTestParams,
1309 "",
1310 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001311 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001312 static_cast<ActionExitCode>(
1313 kActionCodeOmahaRequestHTTPResponseBase + 999),
1314 &response,
1315 NULL));
1316 EXPECT_FALSE(response.update_exists);
1317}
1318
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001319TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1320 OmahaResponse response;
1321 OmahaRequestParams params = kDefaultTestParams;
1322 params.wall_clock_based_wait_enabled = true;
1323 params.waiting_period = TimeDelta().FromDays(1);
1324 params.update_check_count_wait_enabled = false;
1325
1326 string prefs_dir;
1327 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1328 &prefs_dir));
1329 ScopedDirRemover temp_dir_remover(prefs_dir);
1330
1331 Prefs prefs;
1332 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1333 << "Failed to initialize preferences.";
1334
1335 ASSERT_FALSE(TestUpdateCheck(
1336 &prefs, // prefs
1337 params,
1338 GetUpdateResponse2(OmahaRequestParams::kAppId,
1339 "1.2.3.4", // version
1340 "http://more/info",
1341 "true", // prompt
1342 "http://code/base", // dl url
1343 "HASH1234=", // checksum
1344 "false", // needs admin
1345 "123", // size
1346 "", // deadline
1347 "7"), // max days to scatter
1348 -1,
1349 false, // ping_only
1350 kActionCodeOmahaUpdateDeferredPerPolicy,
1351 &response,
1352 NULL));
1353
1354 int64 timestamp = 0;
1355 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1356 ASSERT_TRUE(timestamp > 0);
1357 EXPECT_FALSE(response.update_exists);
1358}
1359
1360TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1361 OmahaResponse response;
1362 OmahaRequestParams params = kDefaultTestParams;
1363 params.wall_clock_based_wait_enabled = true;
1364 params.waiting_period = TimeDelta().FromDays(1);
1365 params.update_check_count_wait_enabled = false;
1366
1367 string prefs_dir;
1368 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1369 &prefs_dir));
1370 ScopedDirRemover temp_dir_remover(prefs_dir);
1371
1372 Prefs prefs;
1373 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1374 << "Failed to initialize preferences.";
1375
1376 // Set the timestamp to a very old value such that it exceeds the
1377 // waiting period set above.
1378 Time t1;
1379 Time::FromString("1/1/2012", &t1);
1380 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1381 ASSERT_TRUE(TestUpdateCheck(
1382 &prefs, // prefs
1383 params,
1384 GetUpdateResponse2(OmahaRequestParams::kAppId,
1385 "1.2.3.4", // version
1386 "http://more/info",
1387 "true", // prompt
1388 "http://code/base", // dl url
1389 "HASH1234=", // checksum
1390 "false", // needs admin
1391 "123", // size
1392 "", // deadline
1393 "7"), // max days to scatter
1394 -1,
1395 false, // ping_only
1396 kActionCodeSuccess,
1397 &response,
1398 NULL));
1399
1400 EXPECT_TRUE(response.update_exists);
1401
1402 // Make sure the timestamp t1 is unchanged showing that it was reused.
1403 int64 timestamp = 0;
1404 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1405 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1406}
1407
Darin Petkov6a5b3222010-07-13 14:55:28 -07001408} // namespace chromeos_update_engine