blob: 69d5895c9ce19dce81f13015fbb1d38cfa11270b [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
Jay Srinivasan0a708742012-03-20 11:26:12 -070053 "http://url",
54 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070055 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056
Darin Petkov6a5b3222010-07-13 14:55:28 -070057string GetNoUpdateResponse(const string& app_id) {
58 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070059 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
60 "<daystart elapsed_seconds=\"100\"/>"
61 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
62 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070063}
64
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070065string GetUpdateResponse2(const string& app_id,
66 const string& display_version,
67 const string& more_info_url,
68 const string& prompt,
69 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070070 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070071 const string& hash,
72 const string& needsadmin,
73 const string& size,
74 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070075 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070076 string response =
77 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
78 "protocol=\"3.0\">"
79 "<daystart elapsed_seconds=\"100\"/>"
80 "<app appid=\"" + app_id + "\" status=\"ok\">"
81 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
82 "<urls><url codebase=\"" + codebase + "\"/></urls>"
83 "<manifest version=\"" + display_version + "\">"
84 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
85 "size=\"" + size + "\"/></packages>"
86 "<actions><action event=\"postinstall\" "
87 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070088 "ChromeOSVersion=\"" + display_version + "\" "
89 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
90 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080091 "IsDeltaPayload=\"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 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800212 MockSystemState mock_system_state;
213 if (prefs)
214 mock_system_state.set_prefs(prefs);
215 OmahaRequestAction action(&mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700216 &params,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700217 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700218 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700219 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700220 OmahaRequestActionTestProcessorDelegate delegate;
221 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700222 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700223
Darin Petkov6a5b3222010-07-13 14:55:28 -0700224 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700225 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700226 processor.EnqueueAction(&action);
227
228 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700229 BondActions(&action, &collector_action);
230 processor.EnqueueAction(&collector_action);
231
232 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
233 g_main_loop_run(loop);
234 g_main_loop_unref(loop);
235 if (collector_action.has_input_object_ && out_response)
236 *out_response = collector_action.omaha_response_;
237 if (out_post_data)
238 *out_post_data = fetcher->post_data();
239 return collector_action.has_input_object_;
240}
241
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700242// Tests Event requests -- they should always succeed. |out_post_data|
243// may be null; if non-null, the post-data received by the mock
244// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700245void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700246 OmahaEvent* event,
247 const string& http_response,
248 vector<char>* out_post_data) {
249 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
250 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800251 http_response.size(),
252 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800253 MockSystemState mock_system_state;
254 OmahaRequestAction action(&mock_system_state, &params, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700255 OmahaRequestActionTestProcessorDelegate delegate;
256 delegate.loop_ = loop;
257 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700258 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700259 processor.EnqueueAction(&action);
260
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700261 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
262 g_main_loop_run(loop);
263 g_main_loop_unref(loop);
264 if (out_post_data)
265 *out_post_data = fetcher->post_data();
266}
267
Darin Petkov6a5b3222010-07-13 14:55:28 -0700268TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 OmahaResponse response;
270 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700271 TestUpdateCheck(NULL, // prefs
272 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700273 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700274 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700275 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700276 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700277 &response,
278 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700279 EXPECT_FALSE(response.update_exists);
280}
281
282TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700283 OmahaResponse response;
284 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700285 TestUpdateCheck(NULL, // prefs
286 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700287 GetUpdateResponse(OmahaRequestParams::kAppId,
288 "1.2.3.4", // version
289 "http://more/info",
290 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700291 "http://code/base/", // dl url
292 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700293 "HASH1234=", // checksum
294 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700295 "123", // size
296 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700297 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700298 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700299 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700300 &response,
301 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700302 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700303 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700304 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800305 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700306 EXPECT_EQ("http://more/info", response.more_info_url);
307 EXPECT_EQ("HASH1234=", response.hash);
308 EXPECT_EQ(123, response.size);
309 EXPECT_FALSE(response.needs_admin);
310 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700311 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312}
313
Jay Srinivasan0a708742012-03-20 11:26:12 -0700314TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
315 OmahaResponse response;
316 OmahaRequestParams params = kDefaultTestParams;
317 params.update_disabled = true;
318 ASSERT_FALSE(
319 TestUpdateCheck(NULL, // prefs
320 params,
321 GetUpdateResponse(OmahaRequestParams::kAppId,
322 "1.2.3.4", // version
323 "http://more/info",
324 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700325 "http://code/base/", // dl url
326 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700327 "HASH1234=", // checksum
328 "false", // needs admin
329 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700330 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700331 -1,
332 false, // ping_only
333 kActionCodeOmahaUpdateIgnoredPerPolicy,
334 &response,
335 NULL));
336 EXPECT_FALSE(response.update_exists);
337}
338
Jay Srinivasan0a708742012-03-20 11:26:12 -0700339TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
340 OmahaResponse response;
341 OmahaRequestParams params = kDefaultTestParams;
342 params.update_disabled = true;
343 ASSERT_TRUE(
344 TestUpdateCheck(NULL, // prefs
345 params,
346 GetNoUpdateResponse(OmahaRequestParams::kAppId),
347 -1,
348 false, // ping_only
349 kActionCodeSuccess,
350 &response,
351 NULL));
352 EXPECT_FALSE(response.update_exists);
353}
354
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700355TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
356 OmahaResponse response;
357 OmahaRequestParams params = kDefaultTestParams;
358 params.wall_clock_based_wait_enabled = true;
359 params.update_check_count_wait_enabled = false;
360 params.waiting_period = TimeDelta::FromDays(2);
361
362 string prefs_dir;
363 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
364 &prefs_dir));
365 ScopedDirRemover temp_dir_remover(prefs_dir);
366
367 Prefs prefs;
368 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
369 << "Failed to initialize preferences.";
370
371 ASSERT_FALSE(
372 TestUpdateCheck(&prefs, // prefs
373 params,
374 GetUpdateResponse2(OmahaRequestParams::kAppId,
375 "1.2.3.4", // version
376 "http://more/info",
377 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700378 "http://code/base/", // dl url
379 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700380 "HASH1234=", // checksum
381 "false", // needs admin
382 "123", // size
383 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700384 "7"), // max days to scatter
385 -1,
386 false, // ping_only
387 kActionCodeOmahaUpdateDeferredPerPolicy,
388 &response,
389 NULL));
390 EXPECT_FALSE(response.update_exists);
391}
392
393TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
394 OmahaResponse response;
395 OmahaRequestParams params = kDefaultTestParams;
396 params.wall_clock_based_wait_enabled = false;
397 params.waiting_period = TimeDelta::FromDays(2);
398
399 params.update_check_count_wait_enabled = true;
400 params.min_update_checks_needed = 1;
401 params.max_update_checks_allowed = 8;
402
403 string prefs_dir;
404 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
405 &prefs_dir));
406 ScopedDirRemover temp_dir_remover(prefs_dir);
407
408 Prefs prefs;
409 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
410 << "Failed to initialize preferences.";
411
412 ASSERT_TRUE(
413 TestUpdateCheck(&prefs, // prefs
414 params,
415 GetUpdateResponse2(OmahaRequestParams::kAppId,
416 "1.2.3.4", // version
417 "http://more/info",
418 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700419 "http://code/base/", // dl url
420 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700421 "HASH1234=", // checksum
422 "false", // needs admin
423 "123", // size
424 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700425 "7"), // max days to scatter
426 -1,
427 false, // ping_only
428 kActionCodeSuccess,
429 &response,
430 NULL));
431 EXPECT_TRUE(response.update_exists);
432}
433
434TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
435 OmahaResponse response;
436 OmahaRequestParams params = kDefaultTestParams;
437 params.wall_clock_based_wait_enabled = true;
438 params.waiting_period = TimeDelta::FromDays(2);
439
440 params.update_check_count_wait_enabled = true;
441 params.min_update_checks_needed = 1;
442 params.max_update_checks_allowed = 8;
443
444 string prefs_dir;
445 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
446 &prefs_dir));
447 ScopedDirRemover temp_dir_remover(prefs_dir);
448
449 Prefs prefs;
450 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
451 << "Failed to initialize preferences.";
452
453 ASSERT_TRUE(
454 TestUpdateCheck(&prefs, // prefs
455 params,
456 GetUpdateResponse2(OmahaRequestParams::kAppId,
457 "1.2.3.4", // version
458 "http://more/info",
459 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700460 "http://code/base/", // dl url
461 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700462 "HASH1234=", // checksum
463 "false", // needs admin
464 "123", // size
465 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700466 "0"), // max days to scatter
467 -1,
468 false, // ping_only
469 kActionCodeSuccess,
470 &response,
471 NULL));
472 EXPECT_TRUE(response.update_exists);
473}
474
475
476TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
477 OmahaResponse response;
478 OmahaRequestParams params = kDefaultTestParams;
479 params.wall_clock_based_wait_enabled = true;
480 params.waiting_period = TimeDelta();
481
482 params.update_check_count_wait_enabled = true;
483 params.min_update_checks_needed = 0;
484 params.max_update_checks_allowed = 0;
485
486 string prefs_dir;
487 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
488 &prefs_dir));
489 ScopedDirRemover temp_dir_remover(prefs_dir);
490
491 Prefs prefs;
492 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
493 << "Failed to initialize preferences.";
494
495 ASSERT_TRUE(TestUpdateCheck(
496 &prefs, // prefs
497 params,
498 GetUpdateResponse2(OmahaRequestParams::kAppId,
499 "1.2.3.4", // version
500 "http://more/info",
501 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700502 "http://code/base/", // dl url
503 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700504 "HASH1234=", // checksum
505 "false", // needs admin
506 "123", // size
507 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700508 "7"), // max days to scatter
509 -1,
510 false, // ping_only
511 kActionCodeSuccess,
512 &response,
513 NULL));
514
515 int64 count;
516 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
517 ASSERT_TRUE(count == 0);
518 EXPECT_TRUE(response.update_exists);
519}
520
521TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
522 OmahaResponse response;
523 OmahaRequestParams params = kDefaultTestParams;
524 params.wall_clock_based_wait_enabled = true;
525 params.waiting_period = TimeDelta();
526
527 params.update_check_count_wait_enabled = true;
528 params.min_update_checks_needed = 1;
529 params.max_update_checks_allowed = 8;
530
531 string prefs_dir;
532 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
533 &prefs_dir));
534 ScopedDirRemover temp_dir_remover(prefs_dir);
535
536 Prefs prefs;
537 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
538 << "Failed to initialize preferences.";
539
540 ASSERT_FALSE(TestUpdateCheck(
541 &prefs, // prefs
542 params,
543 GetUpdateResponse2(OmahaRequestParams::kAppId,
544 "1.2.3.4", // version
545 "http://more/info",
546 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700547 "http://code/base/", // dl url
548 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700549 "HASH1234=", // checksum
550 "false", // needs admin
551 "123", // size
552 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700553 "7"), // max days to scatter
554 -1,
555 false, // ping_only
556 kActionCodeOmahaUpdateDeferredPerPolicy,
557 &response,
558 NULL));
559
560 int64 count;
561 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
562 ASSERT_TRUE(count > 0);
563 EXPECT_FALSE(response.update_exists);
564}
565
566TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
567 OmahaResponse response;
568 OmahaRequestParams params = kDefaultTestParams;
569 params.wall_clock_based_wait_enabled = true;
570 params.waiting_period = TimeDelta();
571
572 params.update_check_count_wait_enabled = true;
573 params.min_update_checks_needed = 1;
574 params.max_update_checks_allowed = 8;
575
576 string prefs_dir;
577 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
578 &prefs_dir));
579 ScopedDirRemover temp_dir_remover(prefs_dir);
580
581 Prefs prefs;
582 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
583 << "Failed to initialize preferences.";
584
585 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
586
587 ASSERT_FALSE(TestUpdateCheck(
588 &prefs, // prefs
589 params,
590 GetUpdateResponse2(OmahaRequestParams::kAppId,
591 "1.2.3.4", // version
592 "http://more/info",
593 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700594 "http://code/base/", // dl url
595 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700596 "HASH1234=", // checksum
597 "false", // needs admin
598 "123", // size
599 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700600 "7"), // max days to scatter
601 -1,
602 false, // ping_only
603 kActionCodeOmahaUpdateDeferredPerPolicy,
604 &response,
605 NULL));
606
607 int64 count;
608 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
609 // count remains the same, as the decrementing happens in update_attempter
610 // which this test doesn't exercise.
611 ASSERT_TRUE(count == 5);
612 EXPECT_FALSE(response.update_exists);
613}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700614
Darin Petkov6a5b3222010-07-13 14:55:28 -0700615TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700616 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
617
618 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
619
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800620 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700621 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800622 OmahaRequestAction action(&mock_system_state, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700623 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800624 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700625 NULL),
626 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700627 OmahaRequestActionTestProcessorDelegate delegate;
628 delegate.loop_ = loop;
629 ActionProcessor processor;
630 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700631 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700632
633 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
634 g_main_loop_run(loop);
635 g_main_loop_unref(loop);
636 EXPECT_FALSE(processor.IsRunning());
637}
638
639TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700640 OmahaResponse response;
641 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700642 TestUpdateCheck(NULL, // prefs
643 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700644 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700645 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700646 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700647 kActionCodeOmahaRequestXMLParseError,
648 &response,
649 NULL));
650 EXPECT_FALSE(response.update_exists);
651}
652
653TEST(OmahaRequestActionTest, EmptyResponseTest) {
654 OmahaResponse response;
655 ASSERT_FALSE(
656 TestUpdateCheck(NULL, // prefs
657 kDefaultTestParams,
658 "",
659 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700660 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700661 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700662 &response,
663 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700664 EXPECT_FALSE(response.update_exists);
665}
666
667TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700668 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700669 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700670 NULL, // prefs
671 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700672 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
673 "<daystart elapsed_seconds=\"100\"/>"
674 "<app appid=\"foo\" status=\"ok\">"
675 "<ping status=\"ok\"/>"
676 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700677 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700678 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700679 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700680 &response,
681 NULL));
682 EXPECT_FALSE(response.update_exists);
683}
684
685TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700686 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700687 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700688 NULL, // prefs
689 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700690 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
691 "<daystart elapsed_seconds=\"100\"/>"
692 "<app appid=\"foo\" status=\"ok\">"
693 "<ping status=\"ok\"/>"
694 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700695 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700696 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700697 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700698 &response,
699 NULL));
700 EXPECT_FALSE(response.update_exists);
701}
702
703TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700704 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700705 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700706 NULL, // prefs
707 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700708 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
709 "<daystart elapsed_seconds=\"100\"/>"
710 "<app appid=\"foo\" status=\"ok\">"
711 "<ping status=\"ok\"/>"
712 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700713 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700714 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700715 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700716 &response,
717 NULL));
718 EXPECT_FALSE(response.update_exists);
719}
720
721TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700722 string input_response =
723 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
724 "<daystart elapsed_seconds=\"100\"/>"
725 "<app appid=\"xyz\" status=\"ok\">"
726 "<updatecheck status=\"ok\">"
727 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
728 "<manifest version=\"1.0.0.0\">"
729 "<packages><package hash=\"not-used\" name=\"f\" "
730 "size=\"587\"/></packages>"
731 "<actions><action event=\"postinstall\" "
732 "DisplayVersion=\"10.2.3.4\" "
733 "ChromeOSVersion=\"10.2.3.4\" "
734 "Prompt=\"false\" "
735 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800736 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700737 "sha256=\"lkq34j5345\" "
738 "needsadmin=\"true\" "
739 "/></actions></manifest></updatecheck></app></response>";
740 LOG(INFO) << "Input Response = " << input_response;
741
Darin Petkov6a5b3222010-07-13 14:55:28 -0700742 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700743 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
744 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700745 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700746 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700747 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700748 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700749 &response,
750 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700751 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700752 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800753 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700754 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700755 EXPECT_EQ("lkq34j5345", response.hash);
756 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700757 EXPECT_TRUE(response.needs_admin);
758 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700759 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700760}
761
762namespace {
763class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
764 public:
765 void ProcessingStopped(const ActionProcessor* processor) {
766 ASSERT_TRUE(loop_);
767 g_main_loop_quit(loop_);
768 }
769 GMainLoop *loop_;
770};
771
772gboolean TerminateTransferTestStarter(gpointer data) {
773 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
774 processor->StartProcessing();
775 CHECK(processor->IsRunning());
776 processor->StopProcessing();
777 return FALSE;
778}
779} // namespace {}
780
781TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700782 string http_response("doesn't matter");
783 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
784
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800785 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700786 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800787 OmahaRequestAction action(&mock_system_state, &params, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700788 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800789 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700790 NULL),
791 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700792 TerminateEarlyTestProcessorDelegate delegate;
793 delegate.loop_ = loop;
794 ActionProcessor processor;
795 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700796 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700797
798 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
799 g_main_loop_run(loop);
800 g_main_loop_unref(loop);
801}
802
803TEST(OmahaRequestActionTest, XmlEncodeTest) {
804 EXPECT_EQ("ab", XmlEncode("ab"));
805 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
806 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
807 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
808 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
809
810 vector<char> post_data;
811
812 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700813 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700814 OmahaRequestParams::kOsVersion,
815 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700816 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700817 OmahaRequestParams::kAppId,
818 "0.1.0.0",
819 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700820 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700821 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700822 false, // delta okay
Jay Srinivasan0a708742012-03-20 11:26:12 -0700823 "http://url",
824 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700825 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700826 OmahaResponse response;
827 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700828 TestUpdateCheck(NULL, // prefs
829 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700830 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700831 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700832 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700833 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700834 &response,
835 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700836 // convert post_data to string
837 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700838 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
839 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700840 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
841 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
842 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
843 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700844 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
845 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700846}
847
848TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849 OmahaResponse response;
850 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700851 TestUpdateCheck(NULL, // prefs
852 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700853 GetUpdateResponse(OmahaRequestParams::kAppId,
854 "1.2.3.4", // version
855 "testthe&lt;url", // more info
856 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700857 "testthe&amp;codebase/", // dl url
858 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700859 "HASH1234=", // checksum
860 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700861 "123", // size
862 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700863 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700864 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700865 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700866 &response,
867 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700868
869 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800870 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700871 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700872}
873
874TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700875 OmahaResponse response;
876 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700877 TestUpdateCheck(NULL, // prefs
878 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700879 GetUpdateResponse(OmahaRequestParams::kAppId,
880 "1.2.3.4", // version
881 "theurl", // more info
882 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700883 "thecodebase/", // dl url
884 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700885 "HASH1234=", // checksum
886 "false", // needs admin
887 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700888 "123123123123123", // size
889 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700890 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700891 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700892 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700893 &response,
894 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700895
896 EXPECT_EQ(response.size, 123123123123123ll);
897}
898
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700899TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
900 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800901 NiceMock<PrefsMock> prefs;
902 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
903 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
904 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
905 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700906 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700907 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700908 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700909 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700910 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700911 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700912 &post_data));
913 // convert post_data to string
914 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700915 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700916 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
917 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700918 " targetversionprefix=\"\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700919 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700920 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700921 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
922 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700923 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700924}
925
Jay Srinivasan0a708742012-03-20 11:26:12 -0700926
Jay Srinivasan56d5aa42012-03-26 14:27:59 -0700927TEST(OmahaRequestActionTest, FormatTargetVersionPrefixTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800928 vector<char> post_data;
929 NiceMock<PrefsMock> prefs;
930 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700931 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
932 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(0);
933 OmahaRequestParams params = kDefaultTestParams;
934 params.update_disabled = true;
Darin Petkov95508da2011-01-05 12:42:29 -0800935 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700936 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800937 "invalid xml>",
938 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700939 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800940 kActionCodeOmahaRequestXMLParseError,
941 NULL, // response
942 &post_data));
943 // convert post_data to string
944 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700945 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700946 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
947 " <updatecheck"
Jay Srinivasan0a708742012-03-20 11:26:12 -0700948 " targetversionprefix=\"\""
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700949 "></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700950 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800951 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
952 string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700953 EXPECT_EQ(post_str.find("event"), string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800954}
955
Darin Petkove17f86b2010-07-20 09:12:01 -0700956TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
957 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700958 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700959 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
960 "invalid xml>",
961 &post_data);
962 // convert post_data to string
963 string post_str(&post_data[0], post_data.size());
964 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700965 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700966 OmahaEvent::kTypeUpdateDownloadStarted,
967 OmahaEvent::kResultSuccess);
968 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700969 EXPECT_EQ(post_str.find("ping"), string::npos);
970 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700971}
972
973TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
974 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700975 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700976 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
977 OmahaEvent::kResultError,
978 kActionCodeError),
979 "invalid xml>",
980 &post_data);
981 // convert post_data to string
982 string post_str(&post_data[0], post_data.size());
983 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700984 " <event eventtype=\"%d\" eventresult=\"%d\" "
985 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700986 OmahaEvent::kTypeDownloadComplete,
987 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700988 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700989 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700990 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700991}
992
993TEST(OmahaRequestActionTest, IsEventTest) {
994 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800995 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700996 OmahaRequestParams params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700997 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800998 &mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700999 &params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001000 NULL,
1001 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001002 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001003 NULL),
1004 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001005 EXPECT_FALSE(update_check_action.IsEvent());
1006
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001007 params = kDefaultTestParams;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001008 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001009 &mock_system_state,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001010 &params,
Darin Petkove17f86b2010-07-20 09:12:01 -07001011 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001012 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001013 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001014 NULL),
1015 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001016 EXPECT_TRUE(event_action.IsEvent());
1017}
1018
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001019TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1020 for (int i = 0; i < 2; i++) {
1021 bool delta_okay = i == 1;
1022 const char* delta_okay_str = delta_okay ? "true" : "false";
1023 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -07001024 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001025 OmahaRequestParams::kOsVersion,
1026 "service_pack",
1027 "x86-generic",
1028 OmahaRequestParams::kAppId,
1029 "0.1.0.0",
1030 "en-US",
1031 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001032 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001033 delta_okay,
Jay Srinivasan0a708742012-03-20 11:26:12 -07001034 "http://url",
1035 false, // update_disabled
1036 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001037 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1038 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001039 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001040 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001041 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001042 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001043 NULL,
1044 &post_data));
1045 // convert post_data to string
1046 string post_str(&post_data[0], post_data.size());
1047 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1048 string::npos)
1049 << "i = " << i;
1050 }
1051}
1052
Darin Petkove17f86b2010-07-20 09:12:01 -07001053TEST(OmahaRequestActionTest, OmahaEventTest) {
1054 OmahaEvent default_event;
1055 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1056 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1057 EXPECT_EQ(kActionCodeError, default_event.error_code);
1058
1059 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1060 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1061 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1062 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1063
1064 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1065 OmahaEvent::kResultError,
1066 kActionCodeError);
1067 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1068 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1069 EXPECT_EQ(kActionCodeError, error_event.error_code);
1070}
1071
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001072TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001073 for (int ping_only = 0; ping_only < 2; ping_only++) {
1074 NiceMock<PrefsMock> prefs;
1075 // Add a few hours to the day difference to test no rounding, etc.
1076 int64_t five_days_ago =
1077 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1078 int64_t six_days_ago =
1079 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1080 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1081 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1082 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1083 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1084 vector<char> post_data;
1085 ASSERT_TRUE(
1086 TestUpdateCheck(&prefs,
1087 kDefaultTestParams,
1088 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1089 -1,
1090 ping_only,
1091 kActionCodeSuccess,
1092 NULL,
1093 &post_data));
1094 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001095 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001096 string::npos);
1097 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001098 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001099 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1100 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001101 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001102 EXPECT_NE(post_str.find("previousversion"), string::npos);
1103 }
1104 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001105}
1106
1107TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001108 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001109 int64_t three_days_ago =
1110 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1111 int64_t now = Time::Now().ToInternalValue();
1112 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1113 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1114 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1115 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1116 vector<char> post_data;
1117 ASSERT_TRUE(
1118 TestUpdateCheck(&prefs,
1119 kDefaultTestParams,
1120 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001121 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001122 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001123 kActionCodeSuccess,
1124 NULL,
1125 &post_data));
1126 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001127 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001128 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001129}
1130
1131TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001132 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001133 int64_t four_days_ago =
1134 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1135 int64_t now = Time::Now().ToInternalValue();
1136 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1137 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1138 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1139 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1140 vector<char> post_data;
1141 ASSERT_TRUE(
1142 TestUpdateCheck(&prefs,
1143 kDefaultTestParams,
1144 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001145 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001146 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001147 kActionCodeSuccess,
1148 NULL,
1149 &post_data));
1150 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001151 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001152 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001153}
1154
1155TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001156 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001157 int64_t one_hour_ago =
1158 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1159 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1160 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1161 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1162 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1163 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1164 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1165 vector<char> post_data;
1166 ASSERT_TRUE(
1167 TestUpdateCheck(&prefs,
1168 kDefaultTestParams,
1169 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001170 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001171 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001172 kActionCodeSuccess,
1173 NULL,
1174 &post_data));
1175 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001176 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001177}
1178
Thieu Leb44e9e82011-06-06 14:34:04 -07001179TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1180 // This test ensures that we ignore empty ping only requests.
1181 NiceMock<PrefsMock> prefs;
1182 int64_t now = Time::Now().ToInternalValue();
1183 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1184 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1185 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1186 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1187 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1188 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1189 vector<char> post_data;
1190 EXPECT_TRUE(
1191 TestUpdateCheck(&prefs,
1192 kDefaultTestParams,
1193 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1194 -1,
1195 true, // ping_only
1196 kActionCodeSuccess,
1197 NULL,
1198 &post_data));
1199 EXPECT_EQ(post_data.size(), 0);
1200}
1201
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001202TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001203 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001204 int64_t future =
1205 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1206 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1207 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1208 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1209 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1210 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1211 .WillOnce(Return(true));
1212 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1213 .WillOnce(Return(true));
1214 vector<char> post_data;
1215 ASSERT_TRUE(
1216 TestUpdateCheck(&prefs,
1217 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001218 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1219 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001220 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001221 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001222 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001223 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001224 kActionCodeSuccess,
1225 NULL,
1226 &post_data));
1227 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001228 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001229}
1230
1231TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1232 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001233 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001234 // may fail if it runs for longer than 5 seconds. It shouldn't run
1235 // that long though.
1236 int64_t midnight =
1237 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1238 int64_t midnight_slack =
1239 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001240 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001241 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1242 AllOf(Ge(midnight), Le(midnight_slack))))
1243 .WillOnce(Return(true));
1244 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1245 AllOf(Ge(midnight), Le(midnight_slack))))
1246 .WillOnce(Return(true));
1247 ASSERT_TRUE(
1248 TestUpdateCheck(&prefs,
1249 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001250 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1251 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001252 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001253 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001254 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001255 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001256 kActionCodeSuccess,
1257 NULL,
1258 NULL));
1259}
1260
1261TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001262 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001263 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1264 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1265 ASSERT_TRUE(
1266 TestUpdateCheck(&prefs,
1267 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001268 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1269 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001270 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001271 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001272 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001273 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001274 kActionCodeSuccess,
1275 NULL,
1276 NULL));
1277}
1278
1279TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001280 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001281 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1282 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1283 ASSERT_TRUE(
1284 TestUpdateCheck(&prefs,
1285 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001286 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1287 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001288 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001289 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001290 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001291 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001292 kActionCodeSuccess,
1293 NULL,
1294 NULL));
1295}
1296
Darin Petkov84c763c2010-07-29 16:27:58 -07001297TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1298 vector<char> post_data;
1299 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1300 kDefaultTestParams,
1301 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001302 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001303 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001304 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001305 NULL, // response
1306 &post_data));
1307 // convert post_data to string
1308 string post_str(&post_data[0], post_data.size());
1309 EXPECT_EQ(post_str.find("machineid="), string::npos);
1310 EXPECT_EQ(post_str.find("userid="), string::npos);
1311}
1312
Darin Petkovedc522e2010-11-05 09:35:17 -07001313TEST(OmahaRequestActionTest, NetworkFailureTest) {
1314 OmahaResponse response;
1315 ASSERT_FALSE(
1316 TestUpdateCheck(NULL, // prefs
1317 kDefaultTestParams,
1318 "",
1319 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001320 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001321 static_cast<ActionExitCode>(
1322 kActionCodeOmahaRequestHTTPResponseBase + 501),
1323 &response,
1324 NULL));
1325 EXPECT_FALSE(response.update_exists);
1326}
1327
1328TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1329 OmahaResponse response;
1330 ASSERT_FALSE(
1331 TestUpdateCheck(NULL, // prefs
1332 kDefaultTestParams,
1333 "",
1334 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001335 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001336 static_cast<ActionExitCode>(
1337 kActionCodeOmahaRequestHTTPResponseBase + 999),
1338 &response,
1339 NULL));
1340 EXPECT_FALSE(response.update_exists);
1341}
1342
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001343TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1344 OmahaResponse response;
1345 OmahaRequestParams params = kDefaultTestParams;
1346 params.wall_clock_based_wait_enabled = true;
1347 params.waiting_period = TimeDelta().FromDays(1);
1348 params.update_check_count_wait_enabled = false;
1349
1350 string prefs_dir;
1351 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1352 &prefs_dir));
1353 ScopedDirRemover temp_dir_remover(prefs_dir);
1354
1355 Prefs prefs;
1356 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1357 << "Failed to initialize preferences.";
1358
1359 ASSERT_FALSE(TestUpdateCheck(
1360 &prefs, // prefs
1361 params,
1362 GetUpdateResponse2(OmahaRequestParams::kAppId,
1363 "1.2.3.4", // version
1364 "http://more/info",
1365 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001366 "http://code/base/", // dl url
1367 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001368 "HASH1234=", // checksum
1369 "false", // needs admin
1370 "123", // size
1371 "", // deadline
1372 "7"), // max days to scatter
1373 -1,
1374 false, // ping_only
1375 kActionCodeOmahaUpdateDeferredPerPolicy,
1376 &response,
1377 NULL));
1378
1379 int64 timestamp = 0;
1380 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1381 ASSERT_TRUE(timestamp > 0);
1382 EXPECT_FALSE(response.update_exists);
1383}
1384
1385TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1386 OmahaResponse response;
1387 OmahaRequestParams params = kDefaultTestParams;
1388 params.wall_clock_based_wait_enabled = true;
1389 params.waiting_period = TimeDelta().FromDays(1);
1390 params.update_check_count_wait_enabled = false;
1391
1392 string prefs_dir;
1393 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1394 &prefs_dir));
1395 ScopedDirRemover temp_dir_remover(prefs_dir);
1396
1397 Prefs prefs;
1398 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1399 << "Failed to initialize preferences.";
1400
1401 // Set the timestamp to a very old value such that it exceeds the
1402 // waiting period set above.
1403 Time t1;
1404 Time::FromString("1/1/2012", &t1);
1405 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1406 ASSERT_TRUE(TestUpdateCheck(
1407 &prefs, // prefs
1408 params,
1409 GetUpdateResponse2(OmahaRequestParams::kAppId,
1410 "1.2.3.4", // version
1411 "http://more/info",
1412 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001413 "http://code/base/", // dl url
1414 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001415 "HASH1234=", // checksum
1416 "false", // needs admin
1417 "123", // size
1418 "", // deadline
1419 "7"), // max days to scatter
1420 -1,
1421 false, // ping_only
1422 kActionCodeSuccess,
1423 &response,
1424 NULL));
1425
1426 EXPECT_TRUE(response.update_exists);
1427
1428 // Make sure the timestamp t1 is unchanged showing that it was reused.
1429 int64 timestamp = 0;
1430 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1431 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1432}
1433
Darin Petkov6a5b3222010-07-13 14:55:28 -07001434} // namespace chromeos_update_engine