blob: 90c01a4c08e1f4392aeacde2b8dd7f03968f8c39 [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(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070060 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
61 "<daystart elapsed_seconds=\"100\"/>"
62 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
63 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070064}
65
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070066string GetUpdateResponse2(const string& app_id,
67 const string& display_version,
68 const string& more_info_url,
69 const string& prompt,
70 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070071 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070072 const string& hash,
73 const string& needsadmin,
74 const string& size,
75 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070076 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070077 string response =
78 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
79 "protocol=\"3.0\">"
80 "<daystart elapsed_seconds=\"100\"/>"
81 "<app appid=\"" + app_id + "\" status=\"ok\">"
82 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
83 "<urls><url codebase=\"" + codebase + "\"/></urls>"
84 "<manifest version=\"" + display_version + "\">"
85 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
86 "size=\"" + size + "\"/></packages>"
87 "<actions><action event=\"postinstall\" "
88 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070089 "ChromeOSVersion=\"" + display_version + "\" "
90 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
91 "IsDelta=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070092 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070093 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -070094 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070095 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -070096 "/></actions></manifest></updatecheck></app></response>";
97 LOG(INFO) << "Response = " << response;
98 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070099}
100
Darin Petkov6a5b3222010-07-13 14:55:28 -0700101string GetUpdateResponse(const string& app_id,
102 const string& display_version,
103 const string& more_info_url,
104 const string& prompt,
105 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700106 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700107 const string& hash,
108 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700109 const string& size,
110 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700111 return GetUpdateResponse2(app_id,
112 display_version,
113 more_info_url,
114 prompt,
115 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700116 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700117 hash,
118 needsadmin,
119 size,
120 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700121 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700122}
123
124class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
125 public:
126 OmahaRequestActionTestProcessorDelegate()
127 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700128 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700129 virtual ~OmahaRequestActionTestProcessorDelegate() {
130 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700131 virtual void ProcessingDone(const ActionProcessor* processor,
132 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700133 ASSERT_TRUE(loop_);
134 g_main_loop_quit(loop_);
135 }
136
137 virtual void ActionCompleted(ActionProcessor* processor,
138 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700139 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700140 // make sure actions always succeed
141 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700142 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700143 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700144 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700145 }
146 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700147 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700148};
149
150gboolean StartProcessorInRunLoop(gpointer data) {
151 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
152 processor->StartProcessing();
153 return FALSE;
154}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700155} // namespace {}
156
157class OutputObjectCollectorAction;
158
159template<>
160class ActionTraits<OutputObjectCollectorAction> {
161 public:
162 // Does not take an object for input
163 typedef OmahaResponse InputObjectType;
164 // On success, puts the output path on output
165 typedef NoneType OutputObjectType;
166};
167
168class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
169 public:
170 OutputObjectCollectorAction() : has_input_object_(false) {}
171 void PerformAction() {
172 // copy input object
173 has_input_object_ = HasInputObject();
174 if (has_input_object_)
175 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700176 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700177 }
178 // Should never be called
179 void TerminateProcessing() {
180 CHECK(false);
181 }
182 // Debugging/logging
183 static std::string StaticType() {
184 return "OutputObjectCollectorAction";
185 }
186 std::string Type() const { return StaticType(); }
187 bool has_input_object_;
188 OmahaResponse omaha_response_;
189};
190
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700191// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700192// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700193// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
194// the transfer will fail with that code. |ping_only| is passed through to the
195// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
196// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700197bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700198 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700199 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700200 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700201 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700202 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700203 OmahaResponse* out_response,
204 vector<char>* out_post_data) {
205 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
206 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800207 http_response.size(),
208 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700209 if (fail_http_response_code >= 0) {
210 fetcher->FailTransfer(fail_http_response_code);
211 }
Darin Petkov9c096d62010-11-17 14:49:04 -0800212 NiceMock<PrefsMock> local_prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700213 OmahaRequestAction action(prefs ? prefs : &local_prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700214 &params,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700215 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700216 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700217 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700218 OmahaRequestActionTestProcessorDelegate delegate;
219 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700220 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700221
Darin Petkov6a5b3222010-07-13 14:55:28 -0700222 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700223 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700224 processor.EnqueueAction(&action);
225
226 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 BondActions(&action, &collector_action);
228 processor.EnqueueAction(&collector_action);
229
230 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
231 g_main_loop_run(loop);
232 g_main_loop_unref(loop);
233 if (collector_action.has_input_object_ && out_response)
234 *out_response = collector_action.omaha_response_;
235 if (out_post_data)
236 *out_post_data = fetcher->post_data();
237 return collector_action.has_input_object_;
238}
239
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700240// Tests Event requests -- they should always succeed. |out_post_data|
241// may be null; if non-null, the post-data received by the mock
242// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700243void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700244 OmahaEvent* event,
245 const string& http_response,
246 vector<char>* out_post_data) {
247 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
248 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800249 http_response.size(),
250 NULL);
Darin Petkov9c096d62010-11-17 14:49:04 -0800251 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700252 OmahaRequestAction action(&prefs, &params, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700253 OmahaRequestActionTestProcessorDelegate delegate;
254 delegate.loop_ = loop;
255 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700256 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700257 processor.EnqueueAction(&action);
258
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700259 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
260 g_main_loop_run(loop);
261 g_main_loop_unref(loop);
262 if (out_post_data)
263 *out_post_data = fetcher->post_data();
264}
265
Darin Petkov6a5b3222010-07-13 14:55:28 -0700266TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700267 OmahaResponse response;
268 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700269 TestUpdateCheck(NULL, // prefs
270 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700271 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700272 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700273 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700274 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700275 &response,
276 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700277 EXPECT_FALSE(response.update_exists);
278}
279
280TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700281 OmahaResponse response;
282 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700283 TestUpdateCheck(NULL, // prefs
284 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700285 GetUpdateResponse(OmahaRequestParams::kAppId,
286 "1.2.3.4", // version
287 "http://more/info",
288 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700289 "http://code/base/", // dl url
290 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700291 "HASH1234=", // checksum
292 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700293 "123", // size
294 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700295 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700296 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700297 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700298 &response,
299 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700300 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700301 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700302 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700303 EXPECT_EQ("http://code/base/file.signed", response.codebase);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700304 EXPECT_EQ("http://more/info", response.more_info_url);
305 EXPECT_EQ("HASH1234=", response.hash);
306 EXPECT_EQ(123, response.size);
307 EXPECT_FALSE(response.needs_admin);
308 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700309 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310}
311
Jay Srinivasan0a708742012-03-20 11:26:12 -0700312TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
313 OmahaResponse response;
314 OmahaRequestParams params = kDefaultTestParams;
315 params.update_disabled = true;
316 ASSERT_FALSE(
317 TestUpdateCheck(NULL, // prefs
318 params,
319 GetUpdateResponse(OmahaRequestParams::kAppId,
320 "1.2.3.4", // version
321 "http://more/info",
322 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700323 "http://code/base/", // dl url
324 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700325 "HASH1234=", // checksum
326 "false", // needs admin
327 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700328 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700329 -1,
330 false, // ping_only
331 kActionCodeOmahaUpdateIgnoredPerPolicy,
332 &response,
333 NULL));
334 EXPECT_FALSE(response.update_exists);
335}
336
Jay Srinivasan0a708742012-03-20 11:26:12 -0700337TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
338 OmahaResponse response;
339 OmahaRequestParams params = kDefaultTestParams;
340 params.update_disabled = true;
341 ASSERT_TRUE(
342 TestUpdateCheck(NULL, // prefs
343 params,
344 GetNoUpdateResponse(OmahaRequestParams::kAppId),
345 -1,
346 false, // ping_only
347 kActionCodeSuccess,
348 &response,
349 NULL));
350 EXPECT_FALSE(response.update_exists);
351}
352
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700353TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
354 OmahaResponse response;
355 OmahaRequestParams params = kDefaultTestParams;
356 params.wall_clock_based_wait_enabled = true;
357 params.update_check_count_wait_enabled = false;
358 params.waiting_period = TimeDelta::FromDays(2);
359
360 string prefs_dir;
361 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
362 &prefs_dir));
363 ScopedDirRemover temp_dir_remover(prefs_dir);
364
365 Prefs prefs;
366 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
367 << "Failed to initialize preferences.";
368
369 ASSERT_FALSE(
370 TestUpdateCheck(&prefs, // prefs
371 params,
372 GetUpdateResponse2(OmahaRequestParams::kAppId,
373 "1.2.3.4", // version
374 "http://more/info",
375 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700376 "http://code/base/", // dl url
377 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700378 "HASH1234=", // checksum
379 "false", // needs admin
380 "123", // size
381 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700382 "7"), // max days to scatter
383 -1,
384 false, // ping_only
385 kActionCodeOmahaUpdateDeferredPerPolicy,
386 &response,
387 NULL));
388 EXPECT_FALSE(response.update_exists);
389}
390
391TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
392 OmahaResponse response;
393 OmahaRequestParams params = kDefaultTestParams;
394 params.wall_clock_based_wait_enabled = false;
395 params.waiting_period = TimeDelta::FromDays(2);
396
397 params.update_check_count_wait_enabled = true;
398 params.min_update_checks_needed = 1;
399 params.max_update_checks_allowed = 8;
400
401 string prefs_dir;
402 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
403 &prefs_dir));
404 ScopedDirRemover temp_dir_remover(prefs_dir);
405
406 Prefs prefs;
407 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
408 << "Failed to initialize preferences.";
409
410 ASSERT_TRUE(
411 TestUpdateCheck(&prefs, // prefs
412 params,
413 GetUpdateResponse2(OmahaRequestParams::kAppId,
414 "1.2.3.4", // version
415 "http://more/info",
416 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700417 "http://code/base/", // dl url
418 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700419 "HASH1234=", // checksum
420 "false", // needs admin
421 "123", // size
422 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700423 "7"), // max days to scatter
424 -1,
425 false, // ping_only
426 kActionCodeSuccess,
427 &response,
428 NULL));
429 EXPECT_TRUE(response.update_exists);
430}
431
432TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
433 OmahaResponse response;
434 OmahaRequestParams params = kDefaultTestParams;
435 params.wall_clock_based_wait_enabled = true;
436 params.waiting_period = TimeDelta::FromDays(2);
437
438 params.update_check_count_wait_enabled = true;
439 params.min_update_checks_needed = 1;
440 params.max_update_checks_allowed = 8;
441
442 string prefs_dir;
443 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
444 &prefs_dir));
445 ScopedDirRemover temp_dir_remover(prefs_dir);
446
447 Prefs prefs;
448 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
449 << "Failed to initialize preferences.";
450
451 ASSERT_TRUE(
452 TestUpdateCheck(&prefs, // prefs
453 params,
454 GetUpdateResponse2(OmahaRequestParams::kAppId,
455 "1.2.3.4", // version
456 "http://more/info",
457 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700458 "http://code/base/", // dl url
459 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700460 "HASH1234=", // checksum
461 "false", // needs admin
462 "123", // size
463 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700464 "0"), // max days to scatter
465 -1,
466 false, // ping_only
467 kActionCodeSuccess,
468 &response,
469 NULL));
470 EXPECT_TRUE(response.update_exists);
471}
472
473
474TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
475 OmahaResponse response;
476 OmahaRequestParams params = kDefaultTestParams;
477 params.wall_clock_based_wait_enabled = true;
478 params.waiting_period = TimeDelta();
479
480 params.update_check_count_wait_enabled = true;
481 params.min_update_checks_needed = 0;
482 params.max_update_checks_allowed = 0;
483
484 string prefs_dir;
485 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
486 &prefs_dir));
487 ScopedDirRemover temp_dir_remover(prefs_dir);
488
489 Prefs prefs;
490 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
491 << "Failed to initialize preferences.";
492
493 ASSERT_TRUE(TestUpdateCheck(
494 &prefs, // prefs
495 params,
496 GetUpdateResponse2(OmahaRequestParams::kAppId,
497 "1.2.3.4", // version
498 "http://more/info",
499 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700500 "http://code/base/", // dl url
501 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700502 "HASH1234=", // checksum
503 "false", // needs admin
504 "123", // size
505 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700506 "7"), // max days to scatter
507 -1,
508 false, // ping_only
509 kActionCodeSuccess,
510 &response,
511 NULL));
512
513 int64 count;
514 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
515 ASSERT_TRUE(count == 0);
516 EXPECT_TRUE(response.update_exists);
517}
518
519TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
520 OmahaResponse response;
521 OmahaRequestParams params = kDefaultTestParams;
522 params.wall_clock_based_wait_enabled = true;
523 params.waiting_period = TimeDelta();
524
525 params.update_check_count_wait_enabled = true;
526 params.min_update_checks_needed = 1;
527 params.max_update_checks_allowed = 8;
528
529 string prefs_dir;
530 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
531 &prefs_dir));
532 ScopedDirRemover temp_dir_remover(prefs_dir);
533
534 Prefs prefs;
535 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
536 << "Failed to initialize preferences.";
537
538 ASSERT_FALSE(TestUpdateCheck(
539 &prefs, // prefs
540 params,
541 GetUpdateResponse2(OmahaRequestParams::kAppId,
542 "1.2.3.4", // version
543 "http://more/info",
544 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700545 "http://code/base/", // dl url
546 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700547 "HASH1234=", // checksum
548 "false", // needs admin
549 "123", // size
550 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700551 "7"), // max days to scatter
552 -1,
553 false, // ping_only
554 kActionCodeOmahaUpdateDeferredPerPolicy,
555 &response,
556 NULL));
557
558 int64 count;
559 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
560 ASSERT_TRUE(count > 0);
561 EXPECT_FALSE(response.update_exists);
562}
563
564TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
565 OmahaResponse response;
566 OmahaRequestParams params = kDefaultTestParams;
567 params.wall_clock_based_wait_enabled = true;
568 params.waiting_period = TimeDelta();
569
570 params.update_check_count_wait_enabled = true;
571 params.min_update_checks_needed = 1;
572 params.max_update_checks_allowed = 8;
573
574 string prefs_dir;
575 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
576 &prefs_dir));
577 ScopedDirRemover temp_dir_remover(prefs_dir);
578
579 Prefs prefs;
580 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
581 << "Failed to initialize preferences.";
582
583 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
584
585 ASSERT_FALSE(TestUpdateCheck(
586 &prefs, // prefs
587 params,
588 GetUpdateResponse2(OmahaRequestParams::kAppId,
589 "1.2.3.4", // version
590 "http://more/info",
591 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700592 "http://code/base/", // dl url
593 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700594 "HASH1234=", // checksum
595 "false", // needs admin
596 "123", // size
597 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700598 "7"), // max days to scatter
599 -1,
600 false, // ping_only
601 kActionCodeOmahaUpdateDeferredPerPolicy,
602 &response,
603 NULL));
604
605 int64 count;
606 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
607 // count remains the same, as the decrementing happens in update_attempter
608 // which this test doesn't exercise.
609 ASSERT_TRUE(count == 5);
610 EXPECT_FALSE(response.update_exists);
611}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700612
Darin Petkov6a5b3222010-07-13 14:55:28 -0700613TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700614 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
615
616 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
617
Darin Petkov9c096d62010-11-17 14:49:04 -0800618 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700619 OmahaRequestParams params = kDefaultTestParams;
620 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700621 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800622 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700623 NULL),
624 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700625 OmahaRequestActionTestProcessorDelegate delegate;
626 delegate.loop_ = loop;
627 ActionProcessor processor;
628 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700629 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700630
631 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
632 g_main_loop_run(loop);
633 g_main_loop_unref(loop);
634 EXPECT_FALSE(processor.IsRunning());
635}
636
637TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700638 OmahaResponse response;
639 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700640 TestUpdateCheck(NULL, // prefs
641 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700642 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700643 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700644 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700645 kActionCodeOmahaRequestXMLParseError,
646 &response,
647 NULL));
648 EXPECT_FALSE(response.update_exists);
649}
650
651TEST(OmahaRequestActionTest, EmptyResponseTest) {
652 OmahaResponse response;
653 ASSERT_FALSE(
654 TestUpdateCheck(NULL, // prefs
655 kDefaultTestParams,
656 "",
657 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700658 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700659 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700660 &response,
661 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700662 EXPECT_FALSE(response.update_exists);
663}
664
665TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700666 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700667 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700668 NULL, // prefs
669 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700670 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
671 "<daystart elapsed_seconds=\"100\"/>"
672 "<app appid=\"foo\" status=\"ok\">"
673 "<ping status=\"ok\"/>"
674 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700675 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700676 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700677 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700678 &response,
679 NULL));
680 EXPECT_FALSE(response.update_exists);
681}
682
683TEST(OmahaRequestActionTest, InvalidStatusTest) {
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,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700688 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
689 "<daystart elapsed_seconds=\"100\"/>"
690 "<app appid=\"foo\" status=\"ok\">"
691 "<ping status=\"ok\"/>"
692 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700693 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700694 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700695 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700696 &response,
697 NULL));
698 EXPECT_FALSE(response.update_exists);
699}
700
701TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700702 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700703 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700704 NULL, // prefs
705 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700706 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
707 "<daystart elapsed_seconds=\"100\"/>"
708 "<app appid=\"foo\" status=\"ok\">"
709 "<ping status=\"ok\"/>"
710 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700711 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700712 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700713 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700714 &response,
715 NULL));
716 EXPECT_FALSE(response.update_exists);
717}
718
719TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700720 string input_response =
721 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
722 "<daystart elapsed_seconds=\"100\"/>"
723 "<app appid=\"xyz\" status=\"ok\">"
724 "<updatecheck status=\"ok\">"
725 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
726 "<manifest version=\"1.0.0.0\">"
727 "<packages><package hash=\"not-used\" name=\"f\" "
728 "size=\"587\"/></packages>"
729 "<actions><action event=\"postinstall\" "
730 "DisplayVersion=\"10.2.3.4\" "
731 "ChromeOSVersion=\"10.2.3.4\" "
732 "Prompt=\"false\" "
733 "IsDelta=\"true\" "
734 "sha256=\"lkq34j5345\" "
735 "needsadmin=\"true\" "
736 "/></actions></manifest></updatecheck></app></response>";
737 LOG(INFO) << "Input Response = " << input_response;
738
Darin Petkov6a5b3222010-07-13 14:55:28 -0700739 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700740 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
741 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700742 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700743 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700744 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700745 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700746 &response,
747 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700748 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700749 EXPECT_EQ("10.2.3.4", response.display_version);
750 EXPECT_EQ("http://missing/field/test/f", response.codebase);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700751 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700752 EXPECT_EQ("lkq34j5345", response.hash);
753 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700754 EXPECT_TRUE(response.needs_admin);
755 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700756 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700757}
758
759namespace {
760class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
761 public:
762 void ProcessingStopped(const ActionProcessor* processor) {
763 ASSERT_TRUE(loop_);
764 g_main_loop_quit(loop_);
765 }
766 GMainLoop *loop_;
767};
768
769gboolean TerminateTransferTestStarter(gpointer data) {
770 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
771 processor->StartProcessing();
772 CHECK(processor->IsRunning());
773 processor->StopProcessing();
774 return FALSE;
775}
776} // namespace {}
777
778TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700779 string http_response("doesn't matter");
780 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
781
Darin Petkov9c096d62010-11-17 14:49:04 -0800782 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700783 OmahaRequestParams params = kDefaultTestParams;
784 OmahaRequestAction action(&prefs, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700785 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800786 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700787 NULL),
788 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700789 TerminateEarlyTestProcessorDelegate delegate;
790 delegate.loop_ = loop;
791 ActionProcessor processor;
792 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700793 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700794
795 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
796 g_main_loop_run(loop);
797 g_main_loop_unref(loop);
798}
799
800TEST(OmahaRequestActionTest, XmlEncodeTest) {
801 EXPECT_EQ("ab", XmlEncode("ab"));
802 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
803 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
804 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
805 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
806
807 vector<char> post_data;
808
809 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700810 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700811 OmahaRequestParams::kOsVersion,
812 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700813 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700814 OmahaRequestParams::kAppId,
815 "0.1.0.0",
816 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700817 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700818 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700819 false, // delta okay
Jay Srinivasan0a708742012-03-20 11:26:12 -0700820 "http://url",
821 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700822 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700823 OmahaResponse response;
824 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700825 TestUpdateCheck(NULL, // prefs
826 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700827 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700828 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700829 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700830 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700831 &response,
832 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700833 // convert post_data to string
834 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700835 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
836 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700837 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
838 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
839 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
840 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700841 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
842 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700843}
844
845TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700846 OmahaResponse response;
847 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700848 TestUpdateCheck(NULL, // prefs
849 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700850 GetUpdateResponse(OmahaRequestParams::kAppId,
851 "1.2.3.4", // version
852 "testthe&lt;url", // more info
853 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700854 "testthe&amp;codebase/", // dl url
855 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700856 "HASH1234=", // checksum
857 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700858 "123", // size
859 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700860 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700861 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700862 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700863 &response,
864 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700865
866 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700867 EXPECT_EQ(response.codebase, "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700868 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700869}
870
871TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700872 OmahaResponse response;
873 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700874 TestUpdateCheck(NULL, // prefs
875 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700876 GetUpdateResponse(OmahaRequestParams::kAppId,
877 "1.2.3.4", // version
878 "theurl", // more info
879 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700880 "thecodebase/", // dl url
881 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700882 "HASH1234=", // checksum
883 "false", // needs admin
884 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700885 "123123123123123", // size
886 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700887 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700888 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700889 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700890 &response,
891 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700892
893 EXPECT_EQ(response.size, 123123123123123ll);
894}
895
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700896TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
897 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800898 NiceMock<PrefsMock> prefs;
899 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
900 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
901 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
902 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700903 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700904 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700905 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700906 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700907 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700908 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700909 &post_data));
910 // convert post_data to string
911 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700912 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700913 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
914 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700915 " targetversionprefix=\"\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700916 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700917 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700918 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
919 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700920 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700921}
922
Jay Srinivasan0a708742012-03-20 11:26:12 -0700923
Jay Srinivasan56d5aa42012-03-26 14:27:59 -0700924TEST(OmahaRequestActionTest, FormatTargetVersionPrefixTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800925 vector<char> post_data;
926 NiceMock<PrefsMock> prefs;
927 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700928 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
929 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
930 OmahaRequestParams params = kDefaultTestParams;
931 params.update_disabled = true;
Darin Petkov95508da2011-01-05 12:42:29 -0800932 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700933 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800934 "invalid xml>",
935 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700936 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800937 kActionCodeOmahaRequestXMLParseError,
938 NULL, // response
939 &post_data));
940 // convert post_data to string
941 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700942 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700943 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
944 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700945 " targetversionprefix=\"\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700946 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700947 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800948 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
949 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700950 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800951}
952
Darin Petkove17f86b2010-07-20 09:12:01 -0700953TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
954 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700955 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700956 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
957 "invalid xml>",
958 &post_data);
959 // convert post_data to string
960 string post_str(&post_data[0], post_data.size());
961 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700962 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700963 OmahaEvent::kTypeUpdateDownloadStarted,
964 OmahaEvent::kResultSuccess);
965 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700966 EXPECT_EQ(post_str.find("ping"), string::npos);
967 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700968}
969
970TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
971 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700972 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700973 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
974 OmahaEvent::kResultError,
975 kActionCodeError),
976 "invalid xml>",
977 &post_data);
978 // convert post_data to string
979 string post_str(&post_data[0], post_data.size());
980 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700981 " <event eventtype=\"%d\" eventresult=\"%d\" "
982 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700983 OmahaEvent::kTypeDownloadComplete,
984 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700985 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700986 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700987 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700988}
989
990TEST(OmahaRequestActionTest, IsEventTest) {
991 string http_response("doesn't matter");
Darin Petkov9c096d62010-11-17 14:49:04 -0800992 NiceMock<PrefsMock> prefs;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700993 OmahaRequestParams params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700994 OmahaRequestAction update_check_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700995 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700996 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700997 NULL,
998 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800999 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001000 NULL),
1001 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001002 EXPECT_FALSE(update_check_action.IsEvent());
1003
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001004 params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001005 OmahaRequestAction event_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001006 &prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001007 &params,
Darin Petkove17f86b2010-07-20 09:12:01 -07001008 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001009 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001010 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001011 NULL),
1012 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001013 EXPECT_TRUE(event_action.IsEvent());
1014}
1015
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001016TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1017 for (int i = 0; i < 2; i++) {
1018 bool delta_okay = i == 1;
1019 const char* delta_okay_str = delta_okay ? "true" : "false";
1020 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -07001021 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001022 OmahaRequestParams::kOsVersion,
1023 "service_pack",
1024 "x86-generic",
1025 OmahaRequestParams::kAppId,
1026 "0.1.0.0",
1027 "en-US",
1028 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001029 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001030 delta_okay,
Jay Srinivasan0a708742012-03-20 11:26:12 -07001031 "http://url",
1032 false, // update_disabled
1033 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001034 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1035 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001036 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001037 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001038 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001039 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001040 NULL,
1041 &post_data));
1042 // convert post_data to string
1043 string post_str(&post_data[0], post_data.size());
1044 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1045 string::npos)
1046 << "i = " << i;
1047 }
1048}
1049
Darin Petkove17f86b2010-07-20 09:12:01 -07001050TEST(OmahaRequestActionTest, OmahaEventTest) {
1051 OmahaEvent default_event;
1052 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1053 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1054 EXPECT_EQ(kActionCodeError, default_event.error_code);
1055
1056 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1057 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1058 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1059 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1060
1061 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1062 OmahaEvent::kResultError,
1063 kActionCodeError);
1064 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1065 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1066 EXPECT_EQ(kActionCodeError, error_event.error_code);
1067}
1068
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001069TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001070 for (int ping_only = 0; ping_only < 2; ping_only++) {
1071 NiceMock<PrefsMock> prefs;
1072 // Add a few hours to the day difference to test no rounding, etc.
1073 int64_t five_days_ago =
1074 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1075 int64_t six_days_ago =
1076 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1077 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1078 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1079 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1080 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1081 vector<char> post_data;
1082 ASSERT_TRUE(
1083 TestUpdateCheck(&prefs,
1084 kDefaultTestParams,
1085 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1086 -1,
1087 ping_only,
1088 kActionCodeSuccess,
1089 NULL,
1090 &post_data));
1091 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001092 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001093 string::npos);
1094 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001095 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001096 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1097 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001098 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001099 EXPECT_NE(post_str.find("previousversion"), string::npos);
1100 }
1101 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001102}
1103
1104TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001105 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001106 int64_t three_days_ago =
1107 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1108 int64_t now = Time::Now().ToInternalValue();
1109 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1110 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1111 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1112 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1113 vector<char> post_data;
1114 ASSERT_TRUE(
1115 TestUpdateCheck(&prefs,
1116 kDefaultTestParams,
1117 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001118 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001119 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001120 kActionCodeSuccess,
1121 NULL,
1122 &post_data));
1123 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001124 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001125 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001126}
1127
1128TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001129 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001130 int64_t four_days_ago =
1131 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1132 int64_t now = Time::Now().ToInternalValue();
1133 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1134 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1135 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1136 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
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());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001148 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001149 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001150}
1151
1152TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001153 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001154 int64_t one_hour_ago =
1155 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1156 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1157 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1158 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1159 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1160 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1161 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1162 vector<char> post_data;
1163 ASSERT_TRUE(
1164 TestUpdateCheck(&prefs,
1165 kDefaultTestParams,
1166 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001167 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001168 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001169 kActionCodeSuccess,
1170 NULL,
1171 &post_data));
1172 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001173 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001174}
1175
Thieu Leb44e9e82011-06-06 14:34:04 -07001176TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1177 // This test ensures that we ignore empty ping only requests.
1178 NiceMock<PrefsMock> prefs;
1179 int64_t now = Time::Now().ToInternalValue();
1180 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1181 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1182 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1183 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1184 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1185 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1186 vector<char> post_data;
1187 EXPECT_TRUE(
1188 TestUpdateCheck(&prefs,
1189 kDefaultTestParams,
1190 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1191 -1,
1192 true, // ping_only
1193 kActionCodeSuccess,
1194 NULL,
1195 &post_data));
1196 EXPECT_EQ(post_data.size(), 0);
1197}
1198
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001199TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001200 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001201 int64_t future =
1202 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1203 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1204 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1205 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1206 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1207 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1208 .WillOnce(Return(true));
1209 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1210 .WillOnce(Return(true));
1211 vector<char> post_data;
1212 ASSERT_TRUE(
1213 TestUpdateCheck(&prefs,
1214 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001215 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1216 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001217 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001218 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001219 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001220 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001221 kActionCodeSuccess,
1222 NULL,
1223 &post_data));
1224 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001225 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001226}
1227
1228TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1229 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001230 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001231 // may fail if it runs for longer than 5 seconds. It shouldn't run
1232 // that long though.
1233 int64_t midnight =
1234 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1235 int64_t midnight_slack =
1236 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001237 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001238 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1239 AllOf(Ge(midnight), Le(midnight_slack))))
1240 .WillOnce(Return(true));
1241 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1242 AllOf(Ge(midnight), Le(midnight_slack))))
1243 .WillOnce(Return(true));
1244 ASSERT_TRUE(
1245 TestUpdateCheck(&prefs,
1246 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001247 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1248 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001249 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001250 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001251 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001252 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001253 kActionCodeSuccess,
1254 NULL,
1255 NULL));
1256}
1257
1258TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001259 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001260 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1261 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1262 ASSERT_TRUE(
1263 TestUpdateCheck(&prefs,
1264 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001265 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1266 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001267 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001268 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001269 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001270 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001271 kActionCodeSuccess,
1272 NULL,
1273 NULL));
1274}
1275
1276TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001277 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001278 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1279 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1280 ASSERT_TRUE(
1281 TestUpdateCheck(&prefs,
1282 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001283 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1284 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001285 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001286 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001287 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001288 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001289 kActionCodeSuccess,
1290 NULL,
1291 NULL));
1292}
1293
Darin Petkov84c763c2010-07-29 16:27:58 -07001294TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1295 vector<char> post_data;
1296 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1297 kDefaultTestParams,
1298 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001299 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001300 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001301 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001302 NULL, // response
1303 &post_data));
1304 // convert post_data to string
1305 string post_str(&post_data[0], post_data.size());
1306 EXPECT_EQ(post_str.find("machineid="), string::npos);
1307 EXPECT_EQ(post_str.find("userid="), string::npos);
1308}
1309
Darin Petkovedc522e2010-11-05 09:35:17 -07001310TEST(OmahaRequestActionTest, NetworkFailureTest) {
1311 OmahaResponse response;
1312 ASSERT_FALSE(
1313 TestUpdateCheck(NULL, // prefs
1314 kDefaultTestParams,
1315 "",
1316 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001317 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001318 static_cast<ActionExitCode>(
1319 kActionCodeOmahaRequestHTTPResponseBase + 501),
1320 &response,
1321 NULL));
1322 EXPECT_FALSE(response.update_exists);
1323}
1324
1325TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1326 OmahaResponse response;
1327 ASSERT_FALSE(
1328 TestUpdateCheck(NULL, // prefs
1329 kDefaultTestParams,
1330 "",
1331 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001332 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001333 static_cast<ActionExitCode>(
1334 kActionCodeOmahaRequestHTTPResponseBase + 999),
1335 &response,
1336 NULL));
1337 EXPECT_FALSE(response.update_exists);
1338}
1339
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001340TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1341 OmahaResponse response;
1342 OmahaRequestParams params = kDefaultTestParams;
1343 params.wall_clock_based_wait_enabled = true;
1344 params.waiting_period = TimeDelta().FromDays(1);
1345 params.update_check_count_wait_enabled = false;
1346
1347 string prefs_dir;
1348 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1349 &prefs_dir));
1350 ScopedDirRemover temp_dir_remover(prefs_dir);
1351
1352 Prefs prefs;
1353 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1354 << "Failed to initialize preferences.";
1355
1356 ASSERT_FALSE(TestUpdateCheck(
1357 &prefs, // prefs
1358 params,
1359 GetUpdateResponse2(OmahaRequestParams::kAppId,
1360 "1.2.3.4", // version
1361 "http://more/info",
1362 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001363 "http://code/base/", // dl url
1364 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001365 "HASH1234=", // checksum
1366 "false", // needs admin
1367 "123", // size
1368 "", // deadline
1369 "7"), // max days to scatter
1370 -1,
1371 false, // ping_only
1372 kActionCodeOmahaUpdateDeferredPerPolicy,
1373 &response,
1374 NULL));
1375
1376 int64 timestamp = 0;
1377 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1378 ASSERT_TRUE(timestamp > 0);
1379 EXPECT_FALSE(response.update_exists);
1380}
1381
1382TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1383 OmahaResponse response;
1384 OmahaRequestParams params = kDefaultTestParams;
1385 params.wall_clock_based_wait_enabled = true;
1386 params.waiting_period = TimeDelta().FromDays(1);
1387 params.update_check_count_wait_enabled = false;
1388
1389 string prefs_dir;
1390 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1391 &prefs_dir));
1392 ScopedDirRemover temp_dir_remover(prefs_dir);
1393
1394 Prefs prefs;
1395 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1396 << "Failed to initialize preferences.";
1397
1398 // Set the timestamp to a very old value such that it exceeds the
1399 // waiting period set above.
1400 Time t1;
1401 Time::FromString("1/1/2012", &t1);
1402 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1403 ASSERT_TRUE(TestUpdateCheck(
1404 &prefs, // prefs
1405 params,
1406 GetUpdateResponse2(OmahaRequestParams::kAppId,
1407 "1.2.3.4", // version
1408 "http://more/info",
1409 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001410 "http://code/base/", // dl url
1411 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001412 "HASH1234=", // checksum
1413 "false", // needs admin
1414 "123", // size
1415 "", // deadline
1416 "7"), // max days to scatter
1417 -1,
1418 false, // ping_only
1419 kActionCodeSuccess,
1420 &response,
1421 NULL));
1422
1423 EXPECT_TRUE(response.update_exists);
1424
1425 // Make sure the timestamp t1 is unchanged showing that it was reused.
1426 int64 timestamp = 0;
1427 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1428 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1429}
1430
Darin Petkov6a5b3222010-07-13 14:55:28 -07001431} // namespace chromeos_update_engine