blob: d8bef5e25c9c8fcdcbedf2616b71d4fffe908ecf [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;
30using 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
Jay Srinivasan0a708742012-03-20 11:26:12 -070053 "http://url",
54 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070055 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056
Darin Petkov6a5b3222010-07-13 14:55:28 -070057string GetNoUpdateResponse(const string& app_id) {
58 return string(
59 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
60 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
61 "appid=\"") + app_id + "\" status=\"ok\"><ping "
62 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
63}
64
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070065string GetUpdateResponse2(const string& app_id,
66 const string& display_version,
67 const string& more_info_url,
68 const string& prompt,
69 const string& codebase,
70 const string& hash,
71 const string& needsadmin,
72 const string& size,
73 const string& deadline,
74 Time published_on,
75 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\" "
85 "UpdatePublishedOn=\"" + utils::ToString(published_on) + "\" "
86 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
87 "codebase=\"" + codebase + "\" "
88 "hash=\"not-applicable\" "
89 "sha256=\"" + hash + "\" "
90 "needsadmin=\"" + needsadmin + "\" "
91 "size=\"" + size + "\" " +
92 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
93 "status=\"ok\"/></app></gupdate>";
94}
95
Darin Petkov6a5b3222010-07-13 14:55:28 -070096string GetUpdateResponse(const string& app_id,
97 const string& display_version,
98 const string& more_info_url,
99 const string& prompt,
100 const string& codebase,
101 const string& hash,
102 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700103 const string& size,
104 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700105 return GetUpdateResponse2(app_id,
106 display_version,
107 more_info_url,
108 prompt,
109 codebase,
110 hash,
111 needsadmin,
112 size,
113 deadline,
114 Time::Now(),
115 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700116}
117
118class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
119 public:
120 OmahaRequestActionTestProcessorDelegate()
121 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700122 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700123 virtual ~OmahaRequestActionTestProcessorDelegate() {
124 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700125 virtual void ProcessingDone(const ActionProcessor* processor,
126 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127 ASSERT_TRUE(loop_);
128 g_main_loop_quit(loop_);
129 }
130
131 virtual void ActionCompleted(ActionProcessor* processor,
132 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700133 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 // make sure actions always succeed
135 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700136 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700137 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700138 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700139 }
140 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700141 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700142};
143
144gboolean StartProcessorInRunLoop(gpointer data) {
145 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
146 processor->StartProcessing();
147 return FALSE;
148}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700149} // namespace {}
150
151class OutputObjectCollectorAction;
152
153template<>
154class ActionTraits<OutputObjectCollectorAction> {
155 public:
156 // Does not take an object for input
157 typedef OmahaResponse InputObjectType;
158 // On success, puts the output path on output
159 typedef NoneType OutputObjectType;
160};
161
162class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
163 public:
164 OutputObjectCollectorAction() : has_input_object_(false) {}
165 void PerformAction() {
166 // copy input object
167 has_input_object_ = HasInputObject();
168 if (has_input_object_)
169 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700170 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700171 }
172 // Should never be called
173 void TerminateProcessing() {
174 CHECK(false);
175 }
176 // Debugging/logging
177 static std::string StaticType() {
178 return "OutputObjectCollectorAction";
179 }
180 std::string Type() const { return StaticType(); }
181 bool has_input_object_;
182 OmahaResponse omaha_response_;
183};
184
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700185// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700186// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700187// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
188// the transfer will fail with that code. |ping_only| is passed through to the
189// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
190// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700191bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700192 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700193 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700194 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700195 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700196 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700197 OmahaResponse* out_response,
198 vector<char>* out_post_data) {
199 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
200 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800201 http_response.size(),
202 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700203 if (fail_http_response_code >= 0) {
204 fetcher->FailTransfer(fail_http_response_code);
205 }
Darin Petkov9c096d62010-11-17 14:49:04 -0800206 NiceMock<PrefsMock> local_prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700207 OmahaRequestAction action(prefs ? prefs : &local_prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700208 &params,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700209 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700210 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700211 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700212 OmahaRequestActionTestProcessorDelegate delegate;
213 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700214 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700215
Darin Petkov6a5b3222010-07-13 14:55:28 -0700216 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700217 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700218 processor.EnqueueAction(&action);
219
220 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700221 BondActions(&action, &collector_action);
222 processor.EnqueueAction(&collector_action);
223
224 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
225 g_main_loop_run(loop);
226 g_main_loop_unref(loop);
227 if (collector_action.has_input_object_ && out_response)
228 *out_response = collector_action.omaha_response_;
229 if (out_post_data)
230 *out_post_data = fetcher->post_data();
231 return collector_action.has_input_object_;
232}
233
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700234// Tests Event requests -- they should always succeed. |out_post_data|
235// may be null; if non-null, the post-data received by the mock
236// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700237void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700238 OmahaEvent* event,
239 const string& http_response,
240 vector<char>* out_post_data) {
241 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
242 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800243 http_response.size(),
244 NULL);
Darin Petkov9c096d62010-11-17 14:49:04 -0800245 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700246 OmahaRequestAction action(&prefs, &params, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700247 OmahaRequestActionTestProcessorDelegate delegate;
248 delegate.loop_ = loop;
249 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700250 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700251 processor.EnqueueAction(&action);
252
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700253 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
254 g_main_loop_run(loop);
255 g_main_loop_unref(loop);
256 if (out_post_data)
257 *out_post_data = fetcher->post_data();
258}
259
Darin Petkov6a5b3222010-07-13 14:55:28 -0700260TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700261 OmahaResponse response;
262 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700263 TestUpdateCheck(NULL, // prefs
264 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700265 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700266 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700267 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700268 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700269 &response,
270 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700271 EXPECT_FALSE(response.update_exists);
272}
273
274TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275 OmahaResponse response;
276 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700277 TestUpdateCheck(NULL, // prefs
278 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700279 GetUpdateResponse(OmahaRequestParams::kAppId,
280 "1.2.3.4", // version
281 "http://more/info",
282 "true", // prompt
283 "http://code/base", // dl url
284 "HASH1234=", // checksum
285 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700286 "123", // size
287 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700288 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700289 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700290 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700291 &response,
292 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700293 EXPECT_TRUE(response.update_exists);
294 EXPECT_EQ("1.2.3.4", response.display_version);
295 EXPECT_EQ("http://code/base", response.codebase);
296 EXPECT_EQ("http://more/info", response.more_info_url);
297 EXPECT_EQ("HASH1234=", response.hash);
298 EXPECT_EQ(123, response.size);
299 EXPECT_FALSE(response.needs_admin);
300 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700301 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700302}
303
Jay Srinivasan0a708742012-03-20 11:26:12 -0700304TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
305 OmahaResponse response;
306 OmahaRequestParams params = kDefaultTestParams;
307 params.update_disabled = true;
308 ASSERT_FALSE(
309 TestUpdateCheck(NULL, // prefs
310 params,
311 GetUpdateResponse(OmahaRequestParams::kAppId,
312 "1.2.3.4", // version
313 "http://more/info",
314 "true", // prompt
315 "http://code/base", // dl url
316 "HASH1234=", // checksum
317 "false", // needs admin
318 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700319 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700320 -1,
321 false, // ping_only
322 kActionCodeOmahaUpdateIgnoredPerPolicy,
323 &response,
324 NULL));
325 EXPECT_FALSE(response.update_exists);
326}
327
Jay Srinivasan0a708742012-03-20 11:26:12 -0700328TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
329 OmahaResponse response;
330 OmahaRequestParams params = kDefaultTestParams;
331 params.update_disabled = true;
332 ASSERT_TRUE(
333 TestUpdateCheck(NULL, // prefs
334 params,
335 GetNoUpdateResponse(OmahaRequestParams::kAppId),
336 -1,
337 false, // ping_only
338 kActionCodeSuccess,
339 &response,
340 NULL));
341 EXPECT_FALSE(response.update_exists);
342}
343
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700344TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
345 OmahaResponse response;
346 OmahaRequestParams params = kDefaultTestParams;
347 params.wall_clock_based_wait_enabled = true;
348 params.update_check_count_wait_enabled = false;
349 params.waiting_period = TimeDelta::FromDays(2);
350
351 string prefs_dir;
352 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
353 &prefs_dir));
354 ScopedDirRemover temp_dir_remover(prefs_dir);
355
356 Prefs prefs;
357 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
358 << "Failed to initialize preferences.";
359
360 ASSERT_FALSE(
361 TestUpdateCheck(&prefs, // prefs
362 params,
363 GetUpdateResponse2(OmahaRequestParams::kAppId,
364 "1.2.3.4", // version
365 "http://more/info",
366 "true", // prompt
367 "http://code/base", // dl url
368 "HASH1234=", // checksum
369 "false", // needs admin
370 "123", // size
371 "", // deadline
372 Time::Now(), // published on
373 "7"), // max days to scatter
374 -1,
375 false, // ping_only
376 kActionCodeOmahaUpdateDeferredPerPolicy,
377 &response,
378 NULL));
379 EXPECT_FALSE(response.update_exists);
380}
381
382TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
383 OmahaResponse response;
384 OmahaRequestParams params = kDefaultTestParams;
385 params.wall_clock_based_wait_enabled = false;
386 params.waiting_period = TimeDelta::FromDays(2);
387
388 params.update_check_count_wait_enabled = true;
389 params.min_update_checks_needed = 1;
390 params.max_update_checks_allowed = 8;
391
392 string prefs_dir;
393 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
394 &prefs_dir));
395 ScopedDirRemover temp_dir_remover(prefs_dir);
396
397 Prefs prefs;
398 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
399 << "Failed to initialize preferences.";
400
401 ASSERT_TRUE(
402 TestUpdateCheck(&prefs, // prefs
403 params,
404 GetUpdateResponse2(OmahaRequestParams::kAppId,
405 "1.2.3.4", // version
406 "http://more/info",
407 "true", // prompt
408 "http://code/base", // dl url
409 "HASH1234=", // checksum
410 "false", // needs admin
411 "123", // size
412 "", // deadline
413 Time::Now(), // published on
414 "7"), // max days to scatter
415 -1,
416 false, // ping_only
417 kActionCodeSuccess,
418 &response,
419 NULL));
420 EXPECT_TRUE(response.update_exists);
421}
422
423TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
424 OmahaResponse response;
425 OmahaRequestParams params = kDefaultTestParams;
426 params.wall_clock_based_wait_enabled = true;
427 params.waiting_period = TimeDelta::FromDays(2);
428
429 params.update_check_count_wait_enabled = true;
430 params.min_update_checks_needed = 1;
431 params.max_update_checks_allowed = 8;
432
433 string prefs_dir;
434 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
435 &prefs_dir));
436 ScopedDirRemover temp_dir_remover(prefs_dir);
437
438 Prefs prefs;
439 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
440 << "Failed to initialize preferences.";
441
442 ASSERT_TRUE(
443 TestUpdateCheck(&prefs, // prefs
444 params,
445 GetUpdateResponse2(OmahaRequestParams::kAppId,
446 "1.2.3.4", // version
447 "http://more/info",
448 "true", // prompt
449 "http://code/base", // dl url
450 "HASH1234=", // checksum
451 "false", // needs admin
452 "123", // size
453 "", // deadline
454 Time::Now(), // published on
455 "0"), // max days to scatter
456 -1,
457 false, // ping_only
458 kActionCodeSuccess,
459 &response,
460 NULL));
461 EXPECT_TRUE(response.update_exists);
462}
463
464
465TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
466 OmahaResponse response;
467 OmahaRequestParams params = kDefaultTestParams;
468 params.wall_clock_based_wait_enabled = true;
469 params.waiting_period = TimeDelta();
470
471 params.update_check_count_wait_enabled = true;
472 params.min_update_checks_needed = 0;
473 params.max_update_checks_allowed = 0;
474
475 string prefs_dir;
476 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
477 &prefs_dir));
478 ScopedDirRemover temp_dir_remover(prefs_dir);
479
480 Prefs prefs;
481 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
482 << "Failed to initialize preferences.";
483
484 ASSERT_TRUE(TestUpdateCheck(
485 &prefs, // prefs
486 params,
487 GetUpdateResponse2(OmahaRequestParams::kAppId,
488 "1.2.3.4", // version
489 "http://more/info",
490 "true", // prompt
491 "http://code/base", // dl url
492 "HASH1234=", // checksum
493 "false", // needs admin
494 "123", // size
495 "", // deadline
496 Time::Now(), // published on
497 "7"), // max days to scatter
498 -1,
499 false, // ping_only
500 kActionCodeSuccess,
501 &response,
502 NULL));
503
504 int64 count;
505 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
506 ASSERT_TRUE(count == 0);
507 EXPECT_TRUE(response.update_exists);
508}
509
510TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
511 OmahaResponse response;
512 OmahaRequestParams params = kDefaultTestParams;
513 params.wall_clock_based_wait_enabled = true;
514 params.waiting_period = TimeDelta();
515
516 params.update_check_count_wait_enabled = true;
517 params.min_update_checks_needed = 1;
518 params.max_update_checks_allowed = 8;
519
520 string prefs_dir;
521 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
522 &prefs_dir));
523 ScopedDirRemover temp_dir_remover(prefs_dir);
524
525 Prefs prefs;
526 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
527 << "Failed to initialize preferences.";
528
529 ASSERT_FALSE(TestUpdateCheck(
530 &prefs, // prefs
531 params,
532 GetUpdateResponse2(OmahaRequestParams::kAppId,
533 "1.2.3.4", // version
534 "http://more/info",
535 "true", // prompt
536 "http://code/base", // dl url
537 "HASH1234=", // checksum
538 "false", // needs admin
539 "123", // size
540 "", // deadline
541 Time::Now(), // published on
542 "7"), // max days to scatter
543 -1,
544 false, // ping_only
545 kActionCodeOmahaUpdateDeferredPerPolicy,
546 &response,
547 NULL));
548
549 int64 count;
550 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
551 ASSERT_TRUE(count > 0);
552 EXPECT_FALSE(response.update_exists);
553}
554
555TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
556 OmahaResponse response;
557 OmahaRequestParams params = kDefaultTestParams;
558 params.wall_clock_based_wait_enabled = true;
559 params.waiting_period = TimeDelta();
560
561 params.update_check_count_wait_enabled = true;
562 params.min_update_checks_needed = 1;
563 params.max_update_checks_allowed = 8;
564
565 string prefs_dir;
566 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
567 &prefs_dir));
568 ScopedDirRemover temp_dir_remover(prefs_dir);
569
570 Prefs prefs;
571 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
572 << "Failed to initialize preferences.";
573
574 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
575
576 ASSERT_FALSE(TestUpdateCheck(
577 &prefs, // prefs
578 params,
579 GetUpdateResponse2(OmahaRequestParams::kAppId,
580 "1.2.3.4", // version
581 "http://more/info",
582 "true", // prompt
583 "http://code/base", // dl url
584 "HASH1234=", // checksum
585 "false", // needs admin
586 "123", // size
587 "", // deadline
588 Time::Now(), // published on
589 "7"), // max days to scatter
590 -1,
591 false, // ping_only
592 kActionCodeOmahaUpdateDeferredPerPolicy,
593 &response,
594 NULL));
595
596 int64 count;
597 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
598 // count remains the same, as the decrementing happens in update_attempter
599 // which this test doesn't exercise.
600 ASSERT_TRUE(count == 5);
601 EXPECT_FALSE(response.update_exists);
602}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700603
Darin Petkov6a5b3222010-07-13 14:55:28 -0700604TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700605 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
606
607 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
608
Darin Petkov9c096d62010-11-17 14:49:04 -0800609 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700610 OmahaRequestParams params = kDefaultTestParams;
611 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700612 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800613 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700614 NULL),
615 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700616 OmahaRequestActionTestProcessorDelegate delegate;
617 delegate.loop_ = loop;
618 ActionProcessor processor;
619 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700620 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700621
622 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
623 g_main_loop_run(loop);
624 g_main_loop_unref(loop);
625 EXPECT_FALSE(processor.IsRunning());
626}
627
628TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700629 OmahaResponse response;
630 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700631 TestUpdateCheck(NULL, // prefs
632 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700633 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700634 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700635 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700636 kActionCodeOmahaRequestXMLParseError,
637 &response,
638 NULL));
639 EXPECT_FALSE(response.update_exists);
640}
641
642TEST(OmahaRequestActionTest, EmptyResponseTest) {
643 OmahaResponse response;
644 ASSERT_FALSE(
645 TestUpdateCheck(NULL, // prefs
646 kDefaultTestParams,
647 "",
648 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700649 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700650 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700651 &response,
652 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700653 EXPECT_FALSE(response.update_exists);
654}
655
656TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700657 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700658 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700659 NULL, // prefs
660 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700661 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
662 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
663 "appid=\"foo\" status=\"ok\"><ping "
664 "status=\"ok\"/><updatecheck/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700665 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700666 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700667 kActionCodeOmahaRequestNoUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700668 &response,
669 NULL));
670 EXPECT_FALSE(response.update_exists);
671}
672
673TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700674 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700675 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700676 NULL, // prefs
677 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700678 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
679 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
680 "appid=\"foo\" status=\"ok\"><ping "
681 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700682 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700683 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700684 kActionCodeOmahaRequestBadUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700685 &response,
686 NULL));
687 EXPECT_FALSE(response.update_exists);
688}
689
690TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700691 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700692 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700693 NULL, // prefs
694 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700695 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
696 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
697 "appid=\"foo\" status=\"ok\"><ping "
698 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700699 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700700 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700701 kActionCodeOmahaRequestNoUpdateCheckNode,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700702 &response,
703 NULL));
704 EXPECT_FALSE(response.update_exists);
705}
706
707TEST(OmahaRequestActionTest, MissingFieldTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700708 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700709 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
710 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700711 string("<?xml version=\"1.0\" "
712 "encoding=\"UTF-8\"?><gupdate "
713 "xmlns=\"http://www.google.com/"
714 "update2/response\" "
715 "protocol=\"2.0\"><app appid=\"") +
716 OmahaRequestParams::kAppId
717 + "\" status=\"ok\"><ping "
718 "status=\"ok\"/><updatecheck "
719 "DisplayVersion=\"1.2.3.4\" "
Jay Srinivasan0a708742012-03-20 11:26:12 -0700720 "ChromeOSVersion=\"1.2.3.4\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700721 "Prompt=\"false\" "
Darin Petkov7ed561b2011-10-04 02:59:03 -0700722 "IsDelta=\"true\" "
Darin Petkovd22cb292010-09-29 10:02:29 -0700723 "codebase=\"http://code/base\" hash=\"foo\" "
724 "sha256=\"HASH1234=\" needsadmin=\"true\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700725 "size=\"123\" "
726 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700727 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700728 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700729 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700730 &response,
731 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700732 EXPECT_TRUE(response.update_exists);
733 EXPECT_EQ("1.2.3.4", response.display_version);
734 EXPECT_EQ("http://code/base", response.codebase);
735 EXPECT_EQ("", response.more_info_url);
736 EXPECT_EQ("HASH1234=", response.hash);
737 EXPECT_EQ(123, response.size);
738 EXPECT_TRUE(response.needs_admin);
739 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700740 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700741}
742
743namespace {
744class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
745 public:
746 void ProcessingStopped(const ActionProcessor* processor) {
747 ASSERT_TRUE(loop_);
748 g_main_loop_quit(loop_);
749 }
750 GMainLoop *loop_;
751};
752
753gboolean TerminateTransferTestStarter(gpointer data) {
754 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
755 processor->StartProcessing();
756 CHECK(processor->IsRunning());
757 processor->StopProcessing();
758 return FALSE;
759}
760} // namespace {}
761
762TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700763 string http_response("doesn't matter");
764 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
765
Darin Petkov9c096d62010-11-17 14:49:04 -0800766 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700767 OmahaRequestParams params = kDefaultTestParams;
768 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700769 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800770 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700771 NULL),
772 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700773 TerminateEarlyTestProcessorDelegate delegate;
774 delegate.loop_ = loop;
775 ActionProcessor processor;
776 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700777 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700778
779 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
780 g_main_loop_run(loop);
781 g_main_loop_unref(loop);
782}
783
784TEST(OmahaRequestActionTest, XmlEncodeTest) {
785 EXPECT_EQ("ab", XmlEncode("ab"));
786 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
787 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
788 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
789 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
790
791 vector<char> post_data;
792
793 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700794 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700795 OmahaRequestParams::kOsVersion,
796 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700797 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700798 OmahaRequestParams::kAppId,
799 "0.1.0.0",
800 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700801 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700802 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700803 false, // delta okay
Jay Srinivasan0a708742012-03-20 11:26:12 -0700804 "http://url",
805 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700806 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700807 OmahaResponse response;
808 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700809 TestUpdateCheck(NULL, // prefs
810 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700811 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700812 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700813 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700814 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700815 &response,
816 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700817 // convert post_data to string
818 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700819 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
820 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700821 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
822 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
823 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
824 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700825 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
826 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700827}
828
829TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700830 OmahaResponse response;
831 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700832 TestUpdateCheck(NULL, // prefs
833 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700834 GetUpdateResponse(OmahaRequestParams::kAppId,
835 "1.2.3.4", // version
836 "testthe&lt;url", // more info
837 "true", // prompt
838 "testthe&amp;codebase", // dl url
839 "HASH1234=", // checksum
840 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700841 "123", // size
842 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700843 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700844 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700845 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700846 &response,
847 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700848
849 EXPECT_EQ(response.more_info_url, "testthe<url");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700850 EXPECT_EQ(response.codebase, "testthe&codebase");
Darin Petkov6c118642010-10-21 12:06:30 -0700851 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700852}
853
854TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700855 OmahaResponse response;
856 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700857 TestUpdateCheck(NULL, // prefs
858 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700859 GetUpdateResponse(OmahaRequestParams::kAppId,
860 "1.2.3.4", // version
861 "theurl", // more info
862 "true", // prompt
863 "thecodebase", // dl url
864 "HASH1234=", // checksum
865 "false", // needs admin
866 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700867 "123123123123123", // size
868 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700869 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700870 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700871 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700872 &response,
873 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700874
875 EXPECT_EQ(response.size, 123123123123123ll);
876}
877
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700878TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
879 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800880 NiceMock<PrefsMock> prefs;
881 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
882 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
883 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
884 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700885 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700886 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700887 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700888 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700889 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700890 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700891 &post_data));
892 // convert post_data to string
893 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700894 EXPECT_NE(post_str.find(
Jay Srinivasan0a708742012-03-20 11:26:12 -0700895 " <o:ping active=\"1\" a=\"-1\" r=\"-1\"></o:ping>\n"
896 " <o:updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700897 " targetversionprefix=\"\""
898 "></o:updatecheck>\n"),
899 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700900 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
901 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700902 EXPECT_EQ(post_str.find("o:event"), string::npos);
903}
904
Jay Srinivasan0a708742012-03-20 11:26:12 -0700905
Jay Srinivasan56d5aa42012-03-26 14:27:59 -0700906TEST(OmahaRequestActionTest, FormatTargetVersionPrefixTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800907 vector<char> post_data;
908 NiceMock<PrefsMock> prefs;
909 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700910 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
911 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
912 OmahaRequestParams params = kDefaultTestParams;
913 params.update_disabled = true;
Darin Petkov95508da2011-01-05 12:42:29 -0800914 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700915 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800916 "invalid xml>",
917 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700918 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800919 kActionCodeOmahaRequestXMLParseError,
920 NULL, // response
921 &post_data));
922 // convert post_data to string
923 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700924 EXPECT_NE(post_str.find(
Jay Srinivasan0a708742012-03-20 11:26:12 -0700925 " <o:ping active=\"1\" a=\"-1\" r=\"-1\"></o:ping>\n"
926 " <o:updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700927 " targetversionprefix=\"\""
928 "></o:updatecheck>\n"),
929 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800930 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
931 string::npos);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700932 EXPECT_EQ(post_str.find("o:event"), string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800933}
934
Darin Petkove17f86b2010-07-20 09:12:01 -0700935TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
936 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700937 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700938 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
939 "invalid xml>",
940 &post_data);
941 // convert post_data to string
942 string post_str(&post_data[0], post_data.size());
943 string expected_event = StringPrintf(
944 " <o:event eventtype=\"%d\" eventresult=\"%d\"></o:event>\n",
945 OmahaEvent::kTypeUpdateDownloadStarted,
946 OmahaEvent::kResultSuccess);
947 EXPECT_NE(post_str.find(expected_event), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700948 EXPECT_EQ(post_str.find("o:ping"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700949 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
950}
951
952TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
953 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700954 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700955 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
956 OmahaEvent::kResultError,
957 kActionCodeError),
958 "invalid xml>",
959 &post_data);
960 // convert post_data to string
961 string post_str(&post_data[0], post_data.size());
962 string expected_event = StringPrintf(
963 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
964 "errorcode=\"%d\"></o:event>\n",
965 OmahaEvent::kTypeDownloadComplete,
966 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700967 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700968 EXPECT_NE(post_str.find(expected_event), string::npos);
969 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
970}
971
972TEST(OmahaRequestActionTest, IsEventTest) {
973 string http_response("doesn't matter");
Darin Petkov9c096d62010-11-17 14:49:04 -0800974 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700975 OmahaRequestParams params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700976 OmahaRequestAction update_check_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700977 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700978 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700979 NULL,
980 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800981 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700982 NULL),
983 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700984 EXPECT_FALSE(update_check_action.IsEvent());
985
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700986 params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700987 OmahaRequestAction event_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700988 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700989 &params,
Darin Petkove17f86b2010-07-20 09:12:01 -0700990 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700991 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800992 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700993 NULL),
994 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700995 EXPECT_TRUE(event_action.IsEvent());
996}
997
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700998TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
999 for (int i = 0; i < 2; i++) {
1000 bool delta_okay = i == 1;
1001 const char* delta_okay_str = delta_okay ? "true" : "false";
1002 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -07001003 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001004 OmahaRequestParams::kOsVersion,
1005 "service_pack",
1006 "x86-generic",
1007 OmahaRequestParams::kAppId,
1008 "0.1.0.0",
1009 "en-US",
1010 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001011 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001012 delta_okay,
Jay Srinivasan0a708742012-03-20 11:26:12 -07001013 "http://url",
1014 false, // update_disabled
1015 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001016 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1017 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001018 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001019 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001020 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001021 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001022 NULL,
1023 &post_data));
1024 // convert post_data to string
1025 string post_str(&post_data[0], post_data.size());
1026 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1027 string::npos)
1028 << "i = " << i;
1029 }
1030}
1031
Darin Petkove17f86b2010-07-20 09:12:01 -07001032TEST(OmahaRequestActionTest, OmahaEventTest) {
1033 OmahaEvent default_event;
1034 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1035 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1036 EXPECT_EQ(kActionCodeError, default_event.error_code);
1037
1038 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1039 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1040 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1041 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1042
1043 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1044 OmahaEvent::kResultError,
1045 kActionCodeError);
1046 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1047 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1048 EXPECT_EQ(kActionCodeError, error_event.error_code);
1049}
1050
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001051TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001052 for (int ping_only = 0; ping_only < 2; ping_only++) {
1053 NiceMock<PrefsMock> prefs;
1054 // Add a few hours to the day difference to test no rounding, etc.
1055 int64_t five_days_ago =
1056 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1057 int64_t six_days_ago =
1058 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1059 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1060 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1061 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1062 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1063 vector<char> post_data;
1064 ASSERT_TRUE(
1065 TestUpdateCheck(&prefs,
1066 kDefaultTestParams,
1067 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1068 -1,
1069 ping_only,
1070 kActionCodeSuccess,
1071 NULL,
1072 &post_data));
1073 string post_str(&post_data[0], post_data.size());
1074 EXPECT_NE(post_str.find("<o:ping active=\"1\" a=\"6\" r=\"5\"></o:ping>"),
1075 string::npos);
1076 if (ping_only) {
1077 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
1078 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1079 } else {
1080 EXPECT_NE(post_str.find("o:updatecheck"), string::npos);
1081 EXPECT_NE(post_str.find("previousversion"), string::npos);
1082 }
1083 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001084}
1085
1086TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001087 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001088 int64_t three_days_ago =
1089 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1090 int64_t now = Time::Now().ToInternalValue();
1091 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1092 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1093 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1094 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1095 vector<char> post_data;
1096 ASSERT_TRUE(
1097 TestUpdateCheck(&prefs,
1098 kDefaultTestParams,
1099 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001100 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001101 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001102 kActionCodeSuccess,
1103 NULL,
1104 &post_data));
1105 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001106 EXPECT_NE(post_str.find("<o:ping active=\"1\" a=\"3\"></o:ping>"),
1107 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001108}
1109
1110TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001111 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001112 int64_t four_days_ago =
1113 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1114 int64_t now = Time::Now().ToInternalValue();
1115 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1116 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1117 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1118 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1119 vector<char> post_data;
1120 ASSERT_TRUE(
1121 TestUpdateCheck(&prefs,
1122 kDefaultTestParams,
1123 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001124 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001125 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001126 kActionCodeSuccess,
1127 NULL,
1128 &post_data));
1129 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001130 EXPECT_NE(post_str.find("<o:ping active=\"1\" r=\"4\"></o:ping>\n"),
1131 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001132}
1133
1134TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001135 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001136 int64_t one_hour_ago =
1137 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1138 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1139 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1140 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1141 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1142 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1143 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1144 vector<char> post_data;
1145 ASSERT_TRUE(
1146 TestUpdateCheck(&prefs,
1147 kDefaultTestParams,
1148 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001149 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001150 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001151 kActionCodeSuccess,
1152 NULL,
1153 &post_data));
1154 string post_str(&post_data[0], post_data.size());
1155 EXPECT_EQ(post_str.find("o:ping"), string::npos);
1156}
1157
Thieu Leb44e9e82011-06-06 14:34:04 -07001158TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1159 // This test ensures that we ignore empty ping only requests.
1160 NiceMock<PrefsMock> prefs;
1161 int64_t now = Time::Now().ToInternalValue();
1162 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1163 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1164 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1165 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1166 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1167 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1168 vector<char> post_data;
1169 EXPECT_TRUE(
1170 TestUpdateCheck(&prefs,
1171 kDefaultTestParams,
1172 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1173 -1,
1174 true, // ping_only
1175 kActionCodeSuccess,
1176 NULL,
1177 &post_data));
1178 EXPECT_EQ(post_data.size(), 0);
1179}
1180
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001181TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001182 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001183 int64_t future =
1184 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1185 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1186 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1187 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1188 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1189 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1190 .WillOnce(Return(true));
1191 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1192 .WillOnce(Return(true));
1193 vector<char> post_data;
1194 ASSERT_TRUE(
1195 TestUpdateCheck(&prefs,
1196 kDefaultTestParams,
1197 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1198 "xmlns=\"http://www.google.com/update2/response\" "
1199 "protocol=\"2.0\"><daystart elapsed_seconds=\"100\"/>"
1200 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1201 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001202 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001203 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001204 kActionCodeSuccess,
1205 NULL,
1206 &post_data));
1207 string post_str(&post_data[0], post_data.size());
1208 EXPECT_EQ(post_str.find("o:ping"), string::npos);
1209}
1210
1211TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1212 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001213 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001214 // may fail if it runs for longer than 5 seconds. It shouldn't run
1215 // that long though.
1216 int64_t midnight =
1217 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1218 int64_t midnight_slack =
1219 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001220 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001221 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1222 AllOf(Ge(midnight), Le(midnight_slack))))
1223 .WillOnce(Return(true));
1224 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1225 AllOf(Ge(midnight), Le(midnight_slack))))
1226 .WillOnce(Return(true));
1227 ASSERT_TRUE(
1228 TestUpdateCheck(&prefs,
1229 kDefaultTestParams,
1230 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1231 "xmlns=\"http://www.google.com/update2/response\" "
1232 "protocol=\"2.0\"><daystart elapsed_seconds=\"200\"/>"
1233 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1234 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001235 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001236 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001237 kActionCodeSuccess,
1238 NULL,
1239 NULL));
1240}
1241
1242TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001243 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001244 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1245 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1246 ASSERT_TRUE(
1247 TestUpdateCheck(&prefs,
1248 kDefaultTestParams,
1249 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1250 "xmlns=\"http://www.google.com/update2/response\" "
1251 "protocol=\"2.0\"><daystart blah=\"200\"/>"
1252 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1253 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001254 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001255 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001256 kActionCodeSuccess,
1257 NULL,
1258 NULL));
1259}
1260
1261TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001262 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001263 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1264 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1265 ASSERT_TRUE(
1266 TestUpdateCheck(&prefs,
1267 kDefaultTestParams,
1268 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
1269 "xmlns=\"http://www.google.com/update2/response\" "
1270 "protocol=\"2.0\"><daystart elapsed_seconds=\"x\"/>"
1271 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
1272 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001273 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001274 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001275 kActionCodeSuccess,
1276 NULL,
1277 NULL));
1278}
1279
Darin Petkov84c763c2010-07-29 16:27:58 -07001280TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1281 vector<char> post_data;
1282 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1283 kDefaultTestParams,
1284 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001285 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001286 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001287 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001288 NULL, // response
1289 &post_data));
1290 // convert post_data to string
1291 string post_str(&post_data[0], post_data.size());
1292 EXPECT_EQ(post_str.find("machineid="), string::npos);
1293 EXPECT_EQ(post_str.find("userid="), string::npos);
1294}
1295
Darin Petkovedc522e2010-11-05 09:35:17 -07001296TEST(OmahaRequestActionTest, NetworkFailureTest) {
1297 OmahaResponse response;
1298 ASSERT_FALSE(
1299 TestUpdateCheck(NULL, // prefs
1300 kDefaultTestParams,
1301 "",
1302 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001303 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001304 static_cast<ActionExitCode>(
1305 kActionCodeOmahaRequestHTTPResponseBase + 501),
1306 &response,
1307 NULL));
1308 EXPECT_FALSE(response.update_exists);
1309}
1310
1311TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1312 OmahaResponse response;
1313 ASSERT_FALSE(
1314 TestUpdateCheck(NULL, // prefs
1315 kDefaultTestParams,
1316 "",
1317 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001318 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001319 static_cast<ActionExitCode>(
1320 kActionCodeOmahaRequestHTTPResponseBase + 999),
1321 &response,
1322 NULL));
1323 EXPECT_FALSE(response.update_exists);
1324}
1325
Darin Petkov6a5b3222010-07-13 14:55:28 -07001326} // namespace chromeos_update_engine