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