blob: c3a3f1bf40c3e247f62e7696bc2e3d5b942f24f0 [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"
Jay Srinivasand29695d2013-04-08 15:08:05 -070014
Darin Petkov6a5b3222010-07-13 14:55:28 -070015#include "update_engine/action_pipe.h"
Jay Srinivasand29695d2013-04-08 15:08:05 -070016#include "update_engine/constants.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070017#include "update_engine/mock_http_fetcher.h"
18#include "update_engine/omaha_hash_calculator.h"
19#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070020#include "update_engine/omaha_request_params.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070021#include "update_engine/prefs.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070022#include "update_engine/test_utils.h"
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070023#include "update_engine/utils.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070024
Darin Petkov1cbd78f2010-07-29 12:38:34 -070025using base::Time;
26using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070027using std::string;
28using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070029using testing::_;
30using testing::AllOf;
Jay Srinivasan34b5d862012-07-23 11:43:22 -070031using testing::DoAll;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070032using testing::Ge;
33using testing::Le;
Darin Petkov9c096d62010-11-17 14:49:04 -080034using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070035using testing::Return;
36using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070037
38namespace chromeos_update_engine {
39
Jay Srinivasanae4697c2013-03-18 17:08:08 -070040class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070041
42namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070043
Jay Srinivasanae4697c2013-03-18 17:08:08 -070044MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070045OmahaRequestParams kDefaultTestParams(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070046 &mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070047 OmahaRequestParams::kOsPlatform,
48 OmahaRequestParams::kOsVersion,
49 "service_pack",
50 "x86-generic",
51 OmahaRequestParams::kAppId,
52 "0.1.0.0",
53 "en-US",
54 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070055 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070056 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080057 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070058 "http://url",
59 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070060 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070061
Darin Petkov6a5b3222010-07-13 14:55:28 -070062string GetNoUpdateResponse(const string& app_id) {
63 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070064 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
65 "<daystart elapsed_seconds=\"100\"/>"
66 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
67 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070068}
69
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070070string GetUpdateResponse2(const string& app_id,
71 const string& display_version,
72 const string& more_info_url,
73 const string& prompt,
74 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070075 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070076 const string& hash,
77 const string& needsadmin,
78 const string& size,
79 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070080 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070081 string response =
82 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
83 "protocol=\"3.0\">"
84 "<daystart elapsed_seconds=\"100\"/>"
85 "<app appid=\"" + app_id + "\" status=\"ok\">"
86 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
87 "<urls><url codebase=\"" + codebase + "\"/></urls>"
88 "<manifest version=\"" + display_version + "\">"
89 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
90 "size=\"" + size + "\"/></packages>"
91 "<actions><action event=\"postinstall\" "
92 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070093 "ChromeOSVersion=\"" + display_version + "\" "
94 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
95 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080096 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070097 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070098 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -070099 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700100 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700101 "/></actions></manifest></updatecheck></app></response>";
102 LOG(INFO) << "Response = " << response;
103 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700104}
105
Darin Petkov6a5b3222010-07-13 14:55:28 -0700106string GetUpdateResponse(const string& app_id,
107 const string& display_version,
108 const string& more_info_url,
109 const string& prompt,
110 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700111 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700112 const string& hash,
113 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700114 const string& size,
115 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700116 return GetUpdateResponse2(app_id,
117 display_version,
118 more_info_url,
119 prompt,
120 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700121 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700122 hash,
123 needsadmin,
124 size,
125 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700126 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700127}
128
129class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
130 public:
131 OmahaRequestActionTestProcessorDelegate()
132 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700133 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 virtual ~OmahaRequestActionTestProcessorDelegate() {
135 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700136 virtual void ProcessingDone(const ActionProcessor* processor,
137 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700138 ASSERT_TRUE(loop_);
139 g_main_loop_quit(loop_);
140 }
141
142 virtual void ActionCompleted(ActionProcessor* processor,
143 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700144 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700145 // make sure actions always succeed
146 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700147 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700148 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700149 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700150 }
151 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700152 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700153};
154
155gboolean StartProcessorInRunLoop(gpointer data) {
156 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
157 processor->StartProcessing();
158 return FALSE;
159}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700160} // namespace {}
161
162class OutputObjectCollectorAction;
163
164template<>
165class ActionTraits<OutputObjectCollectorAction> {
166 public:
167 // Does not take an object for input
168 typedef OmahaResponse InputObjectType;
169 // On success, puts the output path on output
170 typedef NoneType OutputObjectType;
171};
172
173class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
174 public:
175 OutputObjectCollectorAction() : has_input_object_(false) {}
176 void PerformAction() {
177 // copy input object
178 has_input_object_ = HasInputObject();
179 if (has_input_object_)
180 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700181 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700182 }
183 // Should never be called
184 void TerminateProcessing() {
185 CHECK(false);
186 }
187 // Debugging/logging
188 static std::string StaticType() {
189 return "OutputObjectCollectorAction";
190 }
191 std::string Type() const { return StaticType(); }
192 bool has_input_object_;
193 OmahaResponse omaha_response_;
194};
195
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700196// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700197// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700198// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
199// the transfer will fail with that code. |ping_only| is passed through to the
200// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
201// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700202bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700203 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700204 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700205 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700206 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700207 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700208 OmahaResponse* out_response,
209 vector<char>* out_post_data) {
210 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
211 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800212 http_response.size(),
213 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700214 if (fail_http_response_code >= 0) {
215 fetcher->FailTransfer(fail_http_response_code);
216 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800217 MockSystemState mock_system_state;
218 if (prefs)
219 mock_system_state.set_prefs(prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700220 mock_system_state.set_request_params(&params);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800221 OmahaRequestAction action(&mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700222 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700223 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700224 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700225 OmahaRequestActionTestProcessorDelegate delegate;
226 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700227 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700228
Darin Petkov6a5b3222010-07-13 14:55:28 -0700229 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700230 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700231 processor.EnqueueAction(&action);
232
233 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700234 BondActions(&action, &collector_action);
235 processor.EnqueueAction(&collector_action);
236
237 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
238 g_main_loop_run(loop);
239 g_main_loop_unref(loop);
240 if (collector_action.has_input_object_ && out_response)
241 *out_response = collector_action.omaha_response_;
242 if (out_post_data)
243 *out_post_data = fetcher->post_data();
244 return collector_action.has_input_object_;
245}
246
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700247// Tests Event requests -- they should always succeed. |out_post_data|
248// may be null; if non-null, the post-data received by the mock
249// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700250void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700251 OmahaEvent* event,
252 const string& http_response,
253 vector<char>* out_post_data) {
254 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
255 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800256 http_response.size(),
257 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800258 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700259 mock_system_state.set_request_params(&params);
260 OmahaRequestAction action(&mock_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700261 OmahaRequestActionTestProcessorDelegate delegate;
262 delegate.loop_ = loop;
263 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700264 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700265 processor.EnqueueAction(&action);
266
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700267 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
268 g_main_loop_run(loop);
269 g_main_loop_unref(loop);
270 if (out_post_data)
271 *out_post_data = fetcher->post_data();
272}
273
Darin Petkov6a5b3222010-07-13 14:55:28 -0700274TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275 OmahaResponse response;
276 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700277 TestUpdateCheck(NULL, // prefs
278 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700279 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700280 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700281 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700282 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700283 &response,
284 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700285 EXPECT_FALSE(response.update_exists);
286}
287
288TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700289 OmahaResponse response;
290 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700291 TestUpdateCheck(NULL, // prefs
292 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700293 GetUpdateResponse(OmahaRequestParams::kAppId,
294 "1.2.3.4", // version
295 "http://more/info",
296 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700297 "http://code/base/", // dl url
298 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700299 "HASH1234=", // checksum
300 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700301 "123", // size
302 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700303 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700304 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700305 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700306 &response,
307 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700308 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700309 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800311 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312 EXPECT_EQ("http://more/info", response.more_info_url);
313 EXPECT_EQ("HASH1234=", response.hash);
314 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700315 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700316 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700317}
318
Jay Srinivasan0a708742012-03-20 11:26:12 -0700319TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
320 OmahaResponse response;
321 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700322 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700323 ASSERT_FALSE(
324 TestUpdateCheck(NULL, // prefs
325 params,
326 GetUpdateResponse(OmahaRequestParams::kAppId,
327 "1.2.3.4", // version
328 "http://more/info",
329 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700330 "http://code/base/", // dl url
331 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700332 "HASH1234=", // checksum
333 "false", // needs admin
334 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700335 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700336 -1,
337 false, // ping_only
338 kActionCodeOmahaUpdateIgnoredPerPolicy,
339 &response,
340 NULL));
341 EXPECT_FALSE(response.update_exists);
342}
343
Jay Srinivasan0a708742012-03-20 11:26:12 -0700344TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
345 OmahaResponse response;
346 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700347 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700348 ASSERT_TRUE(
349 TestUpdateCheck(NULL, // prefs
350 params,
351 GetNoUpdateResponse(OmahaRequestParams::kAppId),
352 -1,
353 false, // ping_only
354 kActionCodeSuccess,
355 &response,
356 NULL));
357 EXPECT_FALSE(response.update_exists);
358}
359
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700360TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
361 OmahaResponse response;
362 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700363 params.set_wall_clock_based_wait_enabled(true);
364 params.set_update_check_count_wait_enabled(false);
365 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700366
367 string prefs_dir;
368 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
369 &prefs_dir));
370 ScopedDirRemover temp_dir_remover(prefs_dir);
371
372 Prefs prefs;
373 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
374 << "Failed to initialize preferences.";
375
376 ASSERT_FALSE(
377 TestUpdateCheck(&prefs, // prefs
378 params,
379 GetUpdateResponse2(OmahaRequestParams::kAppId,
380 "1.2.3.4", // version
381 "http://more/info",
382 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700383 "http://code/base/", // dl url
384 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700385 "HASH1234=", // checksum
386 "false", // needs admin
387 "123", // size
388 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700389 "7"), // max days to scatter
390 -1,
391 false, // ping_only
392 kActionCodeOmahaUpdateDeferredPerPolicy,
393 &response,
394 NULL));
395 EXPECT_FALSE(response.update_exists);
396}
397
398TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
399 OmahaResponse response;
400 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700401 params.set_wall_clock_based_wait_enabled(false);
402 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700403
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700404 params.set_update_check_count_wait_enabled(true);
405 params.set_min_update_checks_needed(1);
406 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700407
408 string prefs_dir;
409 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
410 &prefs_dir));
411 ScopedDirRemover temp_dir_remover(prefs_dir);
412
413 Prefs prefs;
414 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
415 << "Failed to initialize preferences.";
416
417 ASSERT_TRUE(
418 TestUpdateCheck(&prefs, // prefs
419 params,
420 GetUpdateResponse2(OmahaRequestParams::kAppId,
421 "1.2.3.4", // version
422 "http://more/info",
423 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700424 "http://code/base/", // dl url
425 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700426 "HASH1234=", // checksum
427 "false", // needs admin
428 "123", // size
429 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700430 "7"), // max days to scatter
431 -1,
432 false, // ping_only
433 kActionCodeSuccess,
434 &response,
435 NULL));
436 EXPECT_TRUE(response.update_exists);
437}
438
439TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
440 OmahaResponse response;
441 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700442 params.set_wall_clock_based_wait_enabled(true);
443 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700444
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700445 params.set_update_check_count_wait_enabled(true);
446 params.set_min_update_checks_needed(1);
447 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700448
449 string prefs_dir;
450 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
451 &prefs_dir));
452 ScopedDirRemover temp_dir_remover(prefs_dir);
453
454 Prefs prefs;
455 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
456 << "Failed to initialize preferences.";
457
458 ASSERT_TRUE(
459 TestUpdateCheck(&prefs, // prefs
460 params,
461 GetUpdateResponse2(OmahaRequestParams::kAppId,
462 "1.2.3.4", // version
463 "http://more/info",
464 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700465 "http://code/base/", // dl url
466 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700467 "HASH1234=", // checksum
468 "false", // needs admin
469 "123", // size
470 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700471 "0"), // max days to scatter
472 -1,
473 false, // ping_only
474 kActionCodeSuccess,
475 &response,
476 NULL));
477 EXPECT_TRUE(response.update_exists);
478}
479
480
481TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
482 OmahaResponse response;
483 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700484 params.set_wall_clock_based_wait_enabled(true);
485 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700486
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700487 params.set_update_check_count_wait_enabled(true);
488 params.set_min_update_checks_needed(0);
489 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700490
491 string prefs_dir;
492 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
493 &prefs_dir));
494 ScopedDirRemover temp_dir_remover(prefs_dir);
495
496 Prefs prefs;
497 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
498 << "Failed to initialize preferences.";
499
500 ASSERT_TRUE(TestUpdateCheck(
501 &prefs, // prefs
502 params,
503 GetUpdateResponse2(OmahaRequestParams::kAppId,
504 "1.2.3.4", // version
505 "http://more/info",
506 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700507 "http://code/base/", // dl url
508 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700509 "HASH1234=", // checksum
510 "false", // needs admin
511 "123", // size
512 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700513 "7"), // max days to scatter
514 -1,
515 false, // ping_only
516 kActionCodeSuccess,
517 &response,
518 NULL));
519
520 int64 count;
521 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
522 ASSERT_TRUE(count == 0);
523 EXPECT_TRUE(response.update_exists);
524}
525
526TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
527 OmahaResponse response;
528 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700529 params.set_wall_clock_based_wait_enabled(true);
530 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700531
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700532 params.set_update_check_count_wait_enabled(true);
533 params.set_min_update_checks_needed(1);
534 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700535
536 string prefs_dir;
537 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
538 &prefs_dir));
539 ScopedDirRemover temp_dir_remover(prefs_dir);
540
541 Prefs prefs;
542 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
543 << "Failed to initialize preferences.";
544
545 ASSERT_FALSE(TestUpdateCheck(
546 &prefs, // prefs
547 params,
548 GetUpdateResponse2(OmahaRequestParams::kAppId,
549 "1.2.3.4", // version
550 "http://more/info",
551 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700552 "http://code/base/", // dl url
553 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700554 "HASH1234=", // checksum
555 "false", // needs admin
556 "123", // size
557 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700558 "7"), // max days to scatter
559 -1,
560 false, // ping_only
561 kActionCodeOmahaUpdateDeferredPerPolicy,
562 &response,
563 NULL));
564
565 int64 count;
566 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
567 ASSERT_TRUE(count > 0);
568 EXPECT_FALSE(response.update_exists);
569}
570
571TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
572 OmahaResponse response;
573 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700574 params.set_wall_clock_based_wait_enabled(true);
575 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700576
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700577 params.set_update_check_count_wait_enabled(true);
578 params.set_min_update_checks_needed(1);
579 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700580
581 string prefs_dir;
582 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
583 &prefs_dir));
584 ScopedDirRemover temp_dir_remover(prefs_dir);
585
586 Prefs prefs;
587 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
588 << "Failed to initialize preferences.";
589
590 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
591
592 ASSERT_FALSE(TestUpdateCheck(
593 &prefs, // prefs
594 params,
595 GetUpdateResponse2(OmahaRequestParams::kAppId,
596 "1.2.3.4", // version
597 "http://more/info",
598 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700599 "http://code/base/", // dl url
600 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700601 "HASH1234=", // checksum
602 "false", // needs admin
603 "123", // size
604 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700605 "7"), // max days to scatter
606 -1,
607 false, // ping_only
608 kActionCodeOmahaUpdateDeferredPerPolicy,
609 &response,
610 NULL));
611
612 int64 count;
613 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
614 // count remains the same, as the decrementing happens in update_attempter
615 // which this test doesn't exercise.
616 ASSERT_TRUE(count == 5);
617 EXPECT_FALSE(response.update_exists);
618}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700619
Darin Petkov6a5b3222010-07-13 14:55:28 -0700620TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700621 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
622
623 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
624
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800625 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700626 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700627 mock_system_state.set_request_params(&params);
628 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700629 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800630 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700631 NULL),
632 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700633 OmahaRequestActionTestProcessorDelegate delegate;
634 delegate.loop_ = loop;
635 ActionProcessor processor;
636 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700637 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700638
639 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
640 g_main_loop_run(loop);
641 g_main_loop_unref(loop);
642 EXPECT_FALSE(processor.IsRunning());
643}
644
645TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700646 OmahaResponse response;
647 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700648 TestUpdateCheck(NULL, // prefs
649 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700650 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700651 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700652 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700653 kActionCodeOmahaRequestXMLParseError,
654 &response,
655 NULL));
656 EXPECT_FALSE(response.update_exists);
657}
658
659TEST(OmahaRequestActionTest, EmptyResponseTest) {
660 OmahaResponse response;
661 ASSERT_FALSE(
662 TestUpdateCheck(NULL, // prefs
663 kDefaultTestParams,
664 "",
665 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700666 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700667 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700668 &response,
669 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700670 EXPECT_FALSE(response.update_exists);
671}
672
673TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700674 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700675 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700676 NULL, // prefs
677 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700678 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
679 "<daystart elapsed_seconds=\"100\"/>"
680 "<app appid=\"foo\" status=\"ok\">"
681 "<ping status=\"ok\"/>"
682 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700683 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700684 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700685 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700686 &response,
687 NULL));
688 EXPECT_FALSE(response.update_exists);
689}
690
691TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700692 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700693 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700694 NULL, // prefs
695 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700696 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
697 "<daystart elapsed_seconds=\"100\"/>"
698 "<app appid=\"foo\" status=\"ok\">"
699 "<ping status=\"ok\"/>"
700 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700701 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700702 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700703 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700704 &response,
705 NULL));
706 EXPECT_FALSE(response.update_exists);
707}
708
709TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700710 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700711 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700712 NULL, // prefs
713 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700714 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
715 "<daystart elapsed_seconds=\"100\"/>"
716 "<app appid=\"foo\" status=\"ok\">"
717 "<ping status=\"ok\"/>"
718 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700719 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700720 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700721 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700722 &response,
723 NULL));
724 EXPECT_FALSE(response.update_exists);
725}
726
727TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700728 string input_response =
729 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
730 "<daystart elapsed_seconds=\"100\"/>"
731 "<app appid=\"xyz\" status=\"ok\">"
732 "<updatecheck status=\"ok\">"
733 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
734 "<manifest version=\"1.0.0.0\">"
735 "<packages><package hash=\"not-used\" name=\"f\" "
736 "size=\"587\"/></packages>"
737 "<actions><action event=\"postinstall\" "
738 "DisplayVersion=\"10.2.3.4\" "
739 "ChromeOSVersion=\"10.2.3.4\" "
740 "Prompt=\"false\" "
741 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800742 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700743 "sha256=\"lkq34j5345\" "
744 "needsadmin=\"true\" "
745 "/></actions></manifest></updatecheck></app></response>";
746 LOG(INFO) << "Input Response = " << input_response;
747
Darin Petkov6a5b3222010-07-13 14:55:28 -0700748 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700749 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
750 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700751 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700752 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700753 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700754 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700755 &response,
756 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700757 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700758 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800759 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700760 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700761 EXPECT_EQ("lkq34j5345", response.hash);
762 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700763 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700764 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700765}
766
767namespace {
768class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
769 public:
770 void ProcessingStopped(const ActionProcessor* processor) {
771 ASSERT_TRUE(loop_);
772 g_main_loop_quit(loop_);
773 }
774 GMainLoop *loop_;
775};
776
777gboolean TerminateTransferTestStarter(gpointer data) {
778 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
779 processor->StartProcessing();
780 CHECK(processor->IsRunning());
781 processor->StopProcessing();
782 return FALSE;
783}
784} // namespace {}
785
786TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700787 string http_response("doesn't matter");
788 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
789
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800790 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700791 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700792 mock_system_state.set_request_params(&params);
793 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700794 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800795 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700796 NULL),
797 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700798 TerminateEarlyTestProcessorDelegate delegate;
799 delegate.loop_ = loop;
800 ActionProcessor processor;
801 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700802 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700803
804 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
805 g_main_loop_run(loop);
806 g_main_loop_unref(loop);
807}
808
809TEST(OmahaRequestActionTest, XmlEncodeTest) {
810 EXPECT_EQ("ab", XmlEncode("ab"));
811 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
812 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
813 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
814 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
815
816 vector<char> post_data;
817
818 // Make sure XML Encode is being called on the params
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700819 MockSystemState mock_system_state;
820 OmahaRequestParams params(&mock_system_state,
821 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700822 OmahaRequestParams::kOsVersion,
823 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700824 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700825 OmahaRequestParams::kAppId,
826 "0.1.0.0",
827 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700828 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700829 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700830 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800831 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700832 "http://url",
833 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700834 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700835 OmahaResponse response;
836 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700837 TestUpdateCheck(NULL, // prefs
838 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700839 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700840 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700841 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700842 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700843 &response,
844 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700845 // convert post_data to string
846 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700847 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
848 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700849 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
850 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
851 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
852 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700853 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
854 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700855}
856
857TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700858 OmahaResponse response;
859 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700860 TestUpdateCheck(NULL, // prefs
861 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700862 GetUpdateResponse(OmahaRequestParams::kAppId,
863 "1.2.3.4", // version
864 "testthe&lt;url", // more info
865 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700866 "testthe&amp;codebase/", // dl url
867 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700868 "HASH1234=", // checksum
869 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700870 "123", // size
871 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700872 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700873 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700874 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700875 &response,
876 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700877
878 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800879 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700880 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700881}
882
883TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700884 OmahaResponse response;
885 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700886 TestUpdateCheck(NULL, // prefs
887 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700888 GetUpdateResponse(OmahaRequestParams::kAppId,
889 "1.2.3.4", // version
890 "theurl", // more info
891 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700892 "thecodebase/", // dl url
893 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700894 "HASH1234=", // checksum
895 "false", // needs admin
896 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700897 "123123123123123", // size
898 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700899 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700900 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700901 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700902 &response,
903 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700904
905 EXPECT_EQ(response.size, 123123123123123ll);
906}
907
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700908TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
909 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800910 NiceMock<PrefsMock> prefs;
911 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
912 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700913 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -0800914 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700915 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700916 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700917 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700918 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700919 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700920 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700921 &post_data));
922 // convert post_data to string
923 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700924 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700925 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700926 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700927 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700928 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
929 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700930}
931
Jay Srinivasan0a708742012-03-20 11:26:12 -0700932
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700933TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800934 vector<char> post_data;
935 NiceMock<PrefsMock> prefs;
936 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700937 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700938 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700939 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700940 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -0800941 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700942 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800943 "invalid xml>",
944 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700945 false, // ping_only
Darin Petkov95508da2011-01-05 12:42:29 -0800946 kActionCodeOmahaRequestXMLParseError,
947 NULL, // response
948 &post_data));
949 // convert post_data to string
950 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700951 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700952 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700953 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700954 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800955 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
956 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800957}
958
Darin Petkove17f86b2010-07-20 09:12:01 -0700959TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
960 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700961 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700962 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
963 "invalid xml>",
964 &post_data);
965 // convert post_data to string
966 string post_str(&post_data[0], post_data.size());
967 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700968 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700969 OmahaEvent::kTypeUpdateDownloadStarted,
970 OmahaEvent::kResultSuccess);
971 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700972 EXPECT_EQ(post_str.find("ping"), string::npos);
973 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700974}
975
976TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
977 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700978 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700979 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
980 OmahaEvent::kResultError,
981 kActionCodeError),
982 "invalid xml>",
983 &post_data);
984 // convert post_data to string
985 string post_str(&post_data[0], post_data.size());
986 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700987 " <event eventtype=\"%d\" eventresult=\"%d\" "
988 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700989 OmahaEvent::kTypeDownloadComplete,
990 OmahaEvent::kResultError,
Darin Petkov44d98d92011-03-21 16:08:11 -0700991 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700992 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700993 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700994}
995
996TEST(OmahaRequestActionTest, IsEventTest) {
997 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800998 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700999 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001000 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001001 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001002 &mock_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001003 NULL,
1004 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001005 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001006 NULL),
1007 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001008 EXPECT_FALSE(update_check_action.IsEvent());
1009
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001010 params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001011 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001012 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001013 &mock_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001014 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001015 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001016 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001017 NULL),
1018 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001019 EXPECT_TRUE(event_action.IsEvent());
1020}
1021
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001022TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1023 for (int i = 0; i < 2; i++) {
1024 bool delta_okay = i == 1;
1025 const char* delta_okay_str = delta_okay ? "true" : "false";
1026 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001027 MockSystemState mock_system_state;
1028 OmahaRequestParams params(&mock_system_state,
1029 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001030 OmahaRequestParams::kOsVersion,
1031 "service_pack",
1032 "x86-generic",
1033 OmahaRequestParams::kAppId,
1034 "0.1.0.0",
1035 "en-US",
1036 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001037 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001038 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001039 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001040 "http://url",
1041 false, // update_disabled
1042 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001043 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1044 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001045 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001046 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001047 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001048 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001049 NULL,
1050 &post_data));
1051 // convert post_data to string
1052 string post_str(&post_data[0], post_data.size());
1053 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1054 string::npos)
1055 << "i = " << i;
1056 }
1057}
1058
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001059TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1060 for (int i = 0; i < 2; i++) {
1061 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001062 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001063 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001064 MockSystemState mock_system_state;
1065 OmahaRequestParams params(&mock_system_state,
1066 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001067 OmahaRequestParams::kOsVersion,
1068 "service_pack",
1069 "x86-generic",
1070 OmahaRequestParams::kAppId,
1071 "0.1.0.0",
1072 "en-US",
1073 "unittest_track",
1074 "OEM MODEL REV 1234",
1075 true, // delta_okay
1076 interactive,
1077 "http://url",
1078 false, // update_disabled
1079 ""); // target_version_prefix
1080 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1081 params,
1082 "invalid xml>",
1083 -1,
1084 false, // ping_only
1085 kActionCodeOmahaRequestXMLParseError,
1086 NULL,
1087 &post_data));
1088 // convert post_data to string
1089 string post_str(&post_data[0], post_data.size());
Gilad Arnold8a659d82013-01-24 11:26:00 -08001090 EXPECT_NE(post_str.find(StringPrintf("installsource=\"%s\"",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001091 interactive_str)),
1092 string::npos)
1093 << "i = " << i;
1094 }
1095}
1096
Darin Petkove17f86b2010-07-20 09:12:01 -07001097TEST(OmahaRequestActionTest, OmahaEventTest) {
1098 OmahaEvent default_event;
1099 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1100 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
1101 EXPECT_EQ(kActionCodeError, default_event.error_code);
1102
1103 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1104 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1105 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
1106 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
1107
1108 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1109 OmahaEvent::kResultError,
1110 kActionCodeError);
1111 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1112 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
1113 EXPECT_EQ(kActionCodeError, error_event.error_code);
1114}
1115
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001116TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001117 for (int ping_only = 0; ping_only < 2; ping_only++) {
1118 NiceMock<PrefsMock> prefs;
1119 // Add a few hours to the day difference to test no rounding, etc.
1120 int64_t five_days_ago =
1121 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1122 int64_t six_days_ago =
1123 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1124 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1125 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1126 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1127 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1128 vector<char> post_data;
1129 ASSERT_TRUE(
1130 TestUpdateCheck(&prefs,
1131 kDefaultTestParams,
1132 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1133 -1,
1134 ping_only,
1135 kActionCodeSuccess,
1136 NULL,
1137 &post_data));
1138 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001139 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001140 string::npos);
1141 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001142 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001143 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1144 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001145 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001146 EXPECT_NE(post_str.find("previousversion"), string::npos);
1147 }
1148 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001149}
1150
1151TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001152 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001153 int64_t three_days_ago =
1154 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1155 int64_t now = Time::Now().ToInternalValue();
1156 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1157 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1158 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1159 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1160 vector<char> post_data;
1161 ASSERT_TRUE(
1162 TestUpdateCheck(&prefs,
1163 kDefaultTestParams,
1164 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001165 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001166 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001167 kActionCodeSuccess,
1168 NULL,
1169 &post_data));
1170 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001171 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001172 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001173}
1174
1175TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001176 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001177 int64_t four_days_ago =
1178 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1179 int64_t now = Time::Now().ToInternalValue();
1180 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1181 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1182 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1183 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1184 vector<char> post_data;
1185 ASSERT_TRUE(
1186 TestUpdateCheck(&prefs,
1187 kDefaultTestParams,
1188 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001189 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001190 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001191 kActionCodeSuccess,
1192 NULL,
1193 &post_data));
1194 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001195 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001196 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001197}
1198
1199TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001200 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001201 int64_t one_hour_ago =
1202 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1203 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1204 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1205 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1206 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1207 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1208 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1209 vector<char> post_data;
1210 ASSERT_TRUE(
1211 TestUpdateCheck(&prefs,
1212 kDefaultTestParams,
1213 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001214 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001215 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001216 kActionCodeSuccess,
1217 NULL,
1218 &post_data));
1219 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001220 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001221}
1222
Thieu Leb44e9e82011-06-06 14:34:04 -07001223TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1224 // This test ensures that we ignore empty ping only requests.
1225 NiceMock<PrefsMock> prefs;
1226 int64_t now = Time::Now().ToInternalValue();
1227 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1228 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1229 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1230 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1231 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1232 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1233 vector<char> post_data;
1234 EXPECT_TRUE(
1235 TestUpdateCheck(&prefs,
1236 kDefaultTestParams,
1237 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1238 -1,
1239 true, // ping_only
1240 kActionCodeSuccess,
1241 NULL,
1242 &post_data));
1243 EXPECT_EQ(post_data.size(), 0);
1244}
1245
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001246TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001247 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001248 int64_t future =
1249 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1250 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1251 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1252 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1253 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1254 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1255 .WillOnce(Return(true));
1256 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1257 .WillOnce(Return(true));
1258 vector<char> post_data;
1259 ASSERT_TRUE(
1260 TestUpdateCheck(&prefs,
1261 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001262 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1263 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001264 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001265 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001266 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001267 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001268 kActionCodeSuccess,
1269 NULL,
1270 &post_data));
1271 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001272 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001273}
1274
1275TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1276 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001277 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001278 // may fail if it runs for longer than 5 seconds. It shouldn't run
1279 // that long though.
1280 int64_t midnight =
1281 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1282 int64_t midnight_slack =
1283 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001284 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001285 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1286 AllOf(Ge(midnight), Le(midnight_slack))))
1287 .WillOnce(Return(true));
1288 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1289 AllOf(Ge(midnight), Le(midnight_slack))))
1290 .WillOnce(Return(true));
1291 ASSERT_TRUE(
1292 TestUpdateCheck(&prefs,
1293 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001294 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1295 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001296 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001297 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001298 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001299 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001300 kActionCodeSuccess,
1301 NULL,
1302 NULL));
1303}
1304
1305TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001306 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001307 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1308 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1309 ASSERT_TRUE(
1310 TestUpdateCheck(&prefs,
1311 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001312 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1313 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001314 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001315 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001316 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001317 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001318 kActionCodeSuccess,
1319 NULL,
1320 NULL));
1321}
1322
1323TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001324 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001325 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1326 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1327 ASSERT_TRUE(
1328 TestUpdateCheck(&prefs,
1329 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001330 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1331 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001332 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001333 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001334 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001335 false, // ping_only
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001336 kActionCodeSuccess,
1337 NULL,
1338 NULL));
1339}
1340
Darin Petkov84c763c2010-07-29 16:27:58 -07001341TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1342 vector<char> post_data;
1343 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1344 kDefaultTestParams,
1345 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001346 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001347 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001348 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001349 NULL, // response
1350 &post_data));
1351 // convert post_data to string
1352 string post_str(&post_data[0], post_data.size());
1353 EXPECT_EQ(post_str.find("machineid="), string::npos);
1354 EXPECT_EQ(post_str.find("userid="), string::npos);
1355}
1356
Darin Petkovedc522e2010-11-05 09:35:17 -07001357TEST(OmahaRequestActionTest, NetworkFailureTest) {
1358 OmahaResponse response;
1359 ASSERT_FALSE(
1360 TestUpdateCheck(NULL, // prefs
1361 kDefaultTestParams,
1362 "",
1363 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001364 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001365 static_cast<ActionExitCode>(
1366 kActionCodeOmahaRequestHTTPResponseBase + 501),
1367 &response,
1368 NULL));
1369 EXPECT_FALSE(response.update_exists);
1370}
1371
1372TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1373 OmahaResponse response;
1374 ASSERT_FALSE(
1375 TestUpdateCheck(NULL, // prefs
1376 kDefaultTestParams,
1377 "",
1378 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001379 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -07001380 static_cast<ActionExitCode>(
1381 kActionCodeOmahaRequestHTTPResponseBase + 999),
1382 &response,
1383 NULL));
1384 EXPECT_FALSE(response.update_exists);
1385}
1386
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001387TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1388 OmahaResponse response;
1389 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001390 params.set_wall_clock_based_wait_enabled(true);
1391 params.set_waiting_period(TimeDelta().FromDays(1));
1392 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001393
1394 string prefs_dir;
1395 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1396 &prefs_dir));
1397 ScopedDirRemover temp_dir_remover(prefs_dir);
1398
1399 Prefs prefs;
1400 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1401 << "Failed to initialize preferences.";
1402
1403 ASSERT_FALSE(TestUpdateCheck(
1404 &prefs, // prefs
1405 params,
1406 GetUpdateResponse2(OmahaRequestParams::kAppId,
1407 "1.2.3.4", // version
1408 "http://more/info",
1409 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001410 "http://code/base/", // dl url
1411 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001412 "HASH1234=", // checksum
1413 "false", // needs admin
1414 "123", // size
1415 "", // deadline
1416 "7"), // max days to scatter
1417 -1,
1418 false, // ping_only
1419 kActionCodeOmahaUpdateDeferredPerPolicy,
1420 &response,
1421 NULL));
1422
1423 int64 timestamp = 0;
1424 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1425 ASSERT_TRUE(timestamp > 0);
1426 EXPECT_FALSE(response.update_exists);
1427}
1428
1429TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1430 OmahaResponse response;
1431 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001432 params.set_wall_clock_based_wait_enabled(true);
1433 params.set_waiting_period(TimeDelta().FromDays(1));
1434 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001435
1436 string prefs_dir;
1437 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1438 &prefs_dir));
1439 ScopedDirRemover temp_dir_remover(prefs_dir);
1440
1441 Prefs prefs;
1442 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1443 << "Failed to initialize preferences.";
1444
1445 // Set the timestamp to a very old value such that it exceeds the
1446 // waiting period set above.
1447 Time t1;
1448 Time::FromString("1/1/2012", &t1);
1449 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1450 ASSERT_TRUE(TestUpdateCheck(
1451 &prefs, // prefs
1452 params,
1453 GetUpdateResponse2(OmahaRequestParams::kAppId,
1454 "1.2.3.4", // version
1455 "http://more/info",
1456 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001457 "http://code/base/", // dl url
1458 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001459 "HASH1234=", // checksum
1460 "false", // needs admin
1461 "123", // size
1462 "", // deadline
1463 "7"), // max days to scatter
1464 -1,
1465 false, // ping_only
1466 kActionCodeSuccess,
1467 &response,
1468 NULL));
1469
1470 EXPECT_TRUE(response.update_exists);
1471
1472 // Make sure the timestamp t1 is unchanged showing that it was reused.
1473 int64 timestamp = 0;
1474 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1475 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1476}
1477
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001478TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
1479 const string kTestDir = "omaha_request_action-test";
1480 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1481 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001482 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001483 vector<char> post_data;
1484 NiceMock<PrefsMock> prefs;
1485 ASSERT_TRUE(WriteFileString(
1486 kTestDir + "/etc/lsb-release",
1487 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1488 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1489 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1490 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -07001491 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001492 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1493 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1494 OmahaRequestParams params = kDefaultTestParams;
1495 params.set_root(string("./") + kTestDir);
1496 params.SetLockDown(false);
1497 params.Init("1.2.3.4", "", 0);
1498 EXPECT_EQ("canary-channel", params.current_channel());
1499 EXPECT_EQ("stable-channel", params.target_channel());
1500 EXPECT_TRUE(params.to_more_stable_channel());
1501 EXPECT_TRUE(params.is_powerwash_allowed());
1502 ASSERT_FALSE(TestUpdateCheck(&prefs,
1503 params,
1504 "invalid xml>",
1505 -1,
1506 false, // ping_only
1507 kActionCodeOmahaRequestXMLParseError,
1508 NULL, // response
1509 &post_data));
1510 // convert post_data to string
1511 string post_str(&post_data[0], post_data.size());
1512 EXPECT_NE(string::npos, post_str.find(
1513 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1514 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1515 "track=\"stable-channel\" from_track=\"canary-channel\" "));
1516}
1517
1518TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
1519 const string kTestDir = "omaha_request_action-test";
1520 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1521 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001522 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001523 vector<char> post_data;
1524 NiceMock<PrefsMock> prefs;
1525 ASSERT_TRUE(WriteFileString(
1526 kTestDir + "/etc/lsb-release",
1527 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1528 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1529 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1530 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -07001531 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001532 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1533 OmahaRequestParams params = kDefaultTestParams;
1534 params.set_root(string("./") + kTestDir);
1535 params.SetLockDown(false);
1536 params.Init("5.6.7.8", "", 0);
1537 EXPECT_EQ("stable-channel", params.current_channel());
1538 EXPECT_EQ("canary-channel", params.target_channel());
1539 EXPECT_FALSE(params.to_more_stable_channel());
1540 EXPECT_FALSE(params.is_powerwash_allowed());
1541 ASSERT_FALSE(TestUpdateCheck(&prefs,
1542 params,
1543 "invalid xml>",
1544 -1,
1545 false, // ping_only
1546 kActionCodeOmahaRequestXMLParseError,
1547 NULL, // response
1548 &post_data));
1549 // convert post_data to string
1550 string post_str(&post_data[0], post_data.size());
1551 EXPECT_NE(string::npos, post_str.find(
1552 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1553 "version=\"5.6.7.8\" "
1554 "track=\"canary-channel\" from_track=\"stable-channel\""));
1555 EXPECT_EQ(string::npos, post_str.find( "from_version"));
1556}
1557
Darin Petkov6a5b3222010-07-13 14:55:28 -07001558} // namespace chromeos_update_engine