blob: 9bdc167009e892b4e214659344291a51194b57e4 [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
Jay Srinivasanae4697c2013-03-18 17:08:08 -070038class OmahaRequestActionTest : public ::testing::Test {};
Darin Petkov6a5b3222010-07-13 14:55:28 -070039
40namespace {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070041
Jay Srinivasanae4697c2013-03-18 17:08:08 -070042MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070043OmahaRequestParams kDefaultTestParams(
Jay Srinivasanae4697c2013-03-18 17:08:08 -070044 &mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -070045 OmahaRequestParams::kOsPlatform,
46 OmahaRequestParams::kOsVersion,
47 "service_pack",
48 "x86-generic",
49 OmahaRequestParams::kAppId,
50 "0.1.0.0",
51 "en-US",
52 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070053 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070054 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080055 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070056 "http://url",
57 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070058 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070059
Darin Petkov6a5b3222010-07-13 14:55:28 -070060string GetNoUpdateResponse(const string& app_id) {
61 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070062 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
63 "<daystart elapsed_seconds=\"100\"/>"
64 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
65 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070066}
67
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070068string GetUpdateResponse2(const string& app_id,
69 const string& display_version,
70 const string& more_info_url,
71 const string& prompt,
72 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070073 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070074 const string& hash,
75 const string& needsadmin,
76 const string& size,
77 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070078 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070079 string response =
80 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
81 "protocol=\"3.0\">"
82 "<daystart elapsed_seconds=\"100\"/>"
83 "<app appid=\"" + app_id + "\" status=\"ok\">"
84 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
85 "<urls><url codebase=\"" + codebase + "\"/></urls>"
86 "<manifest version=\"" + display_version + "\">"
87 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
88 "size=\"" + size + "\"/></packages>"
89 "<actions><action event=\"postinstall\" "
90 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070091 "ChromeOSVersion=\"" + display_version + "\" "
92 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
93 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080094 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070095 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070096 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -070097 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070098 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -070099 "/></actions></manifest></updatecheck></app></response>";
100 LOG(INFO) << "Response = " << response;
101 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700102}
103
Darin Petkov6a5b3222010-07-13 14:55:28 -0700104string GetUpdateResponse(const string& app_id,
105 const string& display_version,
106 const string& more_info_url,
107 const string& prompt,
108 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700109 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700110 const string& hash,
111 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700112 const string& size,
113 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700114 return GetUpdateResponse2(app_id,
115 display_version,
116 more_info_url,
117 prompt,
118 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700119 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700120 hash,
121 needsadmin,
122 size,
123 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700124 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700125}
126
127class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
128 public:
129 OmahaRequestActionTestProcessorDelegate()
130 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -0700131 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700132 virtual ~OmahaRequestActionTestProcessorDelegate() {
133 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700134 virtual void ProcessingDone(const ActionProcessor* processor,
135 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700136 ASSERT_TRUE(loop_);
137 g_main_loop_quit(loop_);
138 }
139
140 virtual void ActionCompleted(ActionProcessor* processor,
141 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700142 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700143 // make sure actions always succeed
144 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700145 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700146 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700147 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700148 }
149 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700150 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700151};
152
153gboolean StartProcessorInRunLoop(gpointer data) {
154 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
155 processor->StartProcessing();
156 return FALSE;
157}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700158} // namespace {}
159
160class OutputObjectCollectorAction;
161
162template<>
163class ActionTraits<OutputObjectCollectorAction> {
164 public:
165 // Does not take an object for input
166 typedef OmahaResponse InputObjectType;
167 // On success, puts the output path on output
168 typedef NoneType OutputObjectType;
169};
170
171class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
172 public:
173 OutputObjectCollectorAction() : has_input_object_(false) {}
174 void PerformAction() {
175 // copy input object
176 has_input_object_ = HasInputObject();
177 if (has_input_object_)
178 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700179 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700180 }
181 // Should never be called
182 void TerminateProcessing() {
183 CHECK(false);
184 }
185 // Debugging/logging
186 static std::string StaticType() {
187 return "OutputObjectCollectorAction";
188 }
189 std::string Type() const { return StaticType(); }
190 bool has_input_object_;
191 OmahaResponse omaha_response_;
192};
193
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700194// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700195// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700196// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
197// the transfer will fail with that code. |ping_only| is passed through to the
198// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
199// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700200bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700201 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700202 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700203 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700204 bool ping_only,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700205 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700206 OmahaResponse* out_response,
207 vector<char>* out_post_data) {
208 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
209 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800210 http_response.size(),
211 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700212 if (fail_http_response_code >= 0) {
213 fetcher->FailTransfer(fail_http_response_code);
214 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800215 MockSystemState mock_system_state;
216 if (prefs)
217 mock_system_state.set_prefs(prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700218 mock_system_state.set_request_params(&params);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800219 OmahaRequestAction action(&mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700220 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700221 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700222 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700223 OmahaRequestActionTestProcessorDelegate delegate;
224 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700225 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700226
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700228 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700229 processor.EnqueueAction(&action);
230
231 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700232 BondActions(&action, &collector_action);
233 processor.EnqueueAction(&collector_action);
234
235 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
236 g_main_loop_run(loop);
237 g_main_loop_unref(loop);
238 if (collector_action.has_input_object_ && out_response)
239 *out_response = collector_action.omaha_response_;
240 if (out_post_data)
241 *out_post_data = fetcher->post_data();
242 return collector_action.has_input_object_;
243}
244
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700245// Tests Event requests -- they should always succeed. |out_post_data|
246// may be null; if non-null, the post-data received by the mock
247// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700248void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700249 OmahaEvent* event,
250 const string& http_response,
251 vector<char>* out_post_data) {
252 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
253 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800254 http_response.size(),
255 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800256 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700257 mock_system_state.set_request_params(&params);
258 OmahaRequestAction action(&mock_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700259 OmahaRequestActionTestProcessorDelegate delegate;
260 delegate.loop_ = loop;
261 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700262 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700263 processor.EnqueueAction(&action);
264
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700265 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
266 g_main_loop_run(loop);
267 g_main_loop_unref(loop);
268 if (out_post_data)
269 *out_post_data = fetcher->post_data();
270}
271
Darin Petkov6a5b3222010-07-13 14:55:28 -0700272TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700273 OmahaResponse response;
274 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700275 TestUpdateCheck(NULL, // prefs
276 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700277 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700278 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700279 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700280 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700281 &response,
282 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700283 EXPECT_FALSE(response.update_exists);
284}
285
286TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700287 OmahaResponse response;
288 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700289 TestUpdateCheck(NULL, // prefs
290 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700291 GetUpdateResponse(OmahaRequestParams::kAppId,
292 "1.2.3.4", // version
293 "http://more/info",
294 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700295 "http://code/base/", // dl url
296 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700297 "HASH1234=", // checksum
298 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700299 "123", // size
300 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700301 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700302 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700303 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700304 &response,
305 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700306 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700307 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700308 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800309 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 EXPECT_EQ("http://more/info", response.more_info_url);
311 EXPECT_EQ("HASH1234=", response.hash);
312 EXPECT_EQ(123, response.size);
313 EXPECT_FALSE(response.needs_admin);
314 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700315 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700316}
317
Jay Srinivasan0a708742012-03-20 11:26:12 -0700318TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
319 OmahaResponse response;
320 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700321 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700322 ASSERT_FALSE(
323 TestUpdateCheck(NULL, // prefs
324 params,
325 GetUpdateResponse(OmahaRequestParams::kAppId,
326 "1.2.3.4", // version
327 "http://more/info",
328 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700329 "http://code/base/", // dl url
330 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700331 "HASH1234=", // checksum
332 "false", // needs admin
333 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700334 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700335 -1,
336 false, // ping_only
337 kActionCodeOmahaUpdateIgnoredPerPolicy,
338 &response,
339 NULL));
340 EXPECT_FALSE(response.update_exists);
341}
342
Jay Srinivasan0a708742012-03-20 11:26:12 -0700343TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
344 OmahaResponse response;
345 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700346 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700347 ASSERT_TRUE(
348 TestUpdateCheck(NULL, // prefs
349 params,
350 GetNoUpdateResponse(OmahaRequestParams::kAppId),
351 -1,
352 false, // ping_only
353 kActionCodeSuccess,
354 &response,
355 NULL));
356 EXPECT_FALSE(response.update_exists);
357}
358
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700359TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
360 OmahaResponse response;
361 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700362 params.set_wall_clock_based_wait_enabled(true);
363 params.set_update_check_count_wait_enabled(false);
364 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700365
366 string prefs_dir;
367 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
368 &prefs_dir));
369 ScopedDirRemover temp_dir_remover(prefs_dir);
370
371 Prefs prefs;
372 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
373 << "Failed to initialize preferences.";
374
375 ASSERT_FALSE(
376 TestUpdateCheck(&prefs, // prefs
377 params,
378 GetUpdateResponse2(OmahaRequestParams::kAppId,
379 "1.2.3.4", // version
380 "http://more/info",
381 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700382 "http://code/base/", // dl url
383 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700384 "HASH1234=", // checksum
385 "false", // needs admin
386 "123", // size
387 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700388 "7"), // max days to scatter
389 -1,
390 false, // ping_only
391 kActionCodeOmahaUpdateDeferredPerPolicy,
392 &response,
393 NULL));
394 EXPECT_FALSE(response.update_exists);
395}
396
397TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
398 OmahaResponse response;
399 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700400 params.set_wall_clock_based_wait_enabled(false);
401 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700402
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700403 params.set_update_check_count_wait_enabled(true);
404 params.set_min_update_checks_needed(1);
405 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700406
407 string prefs_dir;
408 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
409 &prefs_dir));
410 ScopedDirRemover temp_dir_remover(prefs_dir);
411
412 Prefs prefs;
413 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
414 << "Failed to initialize preferences.";
415
416 ASSERT_TRUE(
417 TestUpdateCheck(&prefs, // prefs
418 params,
419 GetUpdateResponse2(OmahaRequestParams::kAppId,
420 "1.2.3.4", // version
421 "http://more/info",
422 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700423 "http://code/base/", // dl url
424 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700425 "HASH1234=", // checksum
426 "false", // needs admin
427 "123", // size
428 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700429 "7"), // max days to scatter
430 -1,
431 false, // ping_only
432 kActionCodeSuccess,
433 &response,
434 NULL));
435 EXPECT_TRUE(response.update_exists);
436}
437
438TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
439 OmahaResponse response;
440 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700441 params.set_wall_clock_based_wait_enabled(true);
442 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700443
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700444 params.set_update_check_count_wait_enabled(true);
445 params.set_min_update_checks_needed(1);
446 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700447
448 string prefs_dir;
449 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
450 &prefs_dir));
451 ScopedDirRemover temp_dir_remover(prefs_dir);
452
453 Prefs prefs;
454 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
455 << "Failed to initialize preferences.";
456
457 ASSERT_TRUE(
458 TestUpdateCheck(&prefs, // prefs
459 params,
460 GetUpdateResponse2(OmahaRequestParams::kAppId,
461 "1.2.3.4", // version
462 "http://more/info",
463 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700464 "http://code/base/", // dl url
465 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700466 "HASH1234=", // checksum
467 "false", // needs admin
468 "123", // size
469 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700470 "0"), // max days to scatter
471 -1,
472 false, // ping_only
473 kActionCodeSuccess,
474 &response,
475 NULL));
476 EXPECT_TRUE(response.update_exists);
477}
478
479
480TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
481 OmahaResponse response;
482 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700483 params.set_wall_clock_based_wait_enabled(true);
484 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700485
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700486 params.set_update_check_count_wait_enabled(true);
487 params.set_min_update_checks_needed(0);
488 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700489
490 string prefs_dir;
491 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
492 &prefs_dir));
493 ScopedDirRemover temp_dir_remover(prefs_dir);
494
495 Prefs prefs;
496 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
497 << "Failed to initialize preferences.";
498
499 ASSERT_TRUE(TestUpdateCheck(
500 &prefs, // prefs
501 params,
502 GetUpdateResponse2(OmahaRequestParams::kAppId,
503 "1.2.3.4", // version
504 "http://more/info",
505 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700506 "http://code/base/", // dl url
507 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700508 "HASH1234=", // checksum
509 "false", // needs admin
510 "123", // size
511 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700512 "7"), // max days to scatter
513 -1,
514 false, // ping_only
515 kActionCodeSuccess,
516 &response,
517 NULL));
518
519 int64 count;
520 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
521 ASSERT_TRUE(count == 0);
522 EXPECT_TRUE(response.update_exists);
523}
524
525TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
526 OmahaResponse response;
527 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700528 params.set_wall_clock_based_wait_enabled(true);
529 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700530
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700531 params.set_update_check_count_wait_enabled(true);
532 params.set_min_update_checks_needed(1);
533 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700534
535 string prefs_dir;
536 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
537 &prefs_dir));
538 ScopedDirRemover temp_dir_remover(prefs_dir);
539
540 Prefs prefs;
541 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
542 << "Failed to initialize preferences.";
543
544 ASSERT_FALSE(TestUpdateCheck(
545 &prefs, // prefs
546 params,
547 GetUpdateResponse2(OmahaRequestParams::kAppId,
548 "1.2.3.4", // version
549 "http://more/info",
550 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700551 "http://code/base/", // dl url
552 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700553 "HASH1234=", // checksum
554 "false", // needs admin
555 "123", // size
556 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700557 "7"), // max days to scatter
558 -1,
559 false, // ping_only
560 kActionCodeOmahaUpdateDeferredPerPolicy,
561 &response,
562 NULL));
563
564 int64 count;
565 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
566 ASSERT_TRUE(count > 0);
567 EXPECT_FALSE(response.update_exists);
568}
569
570TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
571 OmahaResponse response;
572 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700573 params.set_wall_clock_based_wait_enabled(true);
574 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700575
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700576 params.set_update_check_count_wait_enabled(true);
577 params.set_min_update_checks_needed(1);
578 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700579
580 string prefs_dir;
581 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
582 &prefs_dir));
583 ScopedDirRemover temp_dir_remover(prefs_dir);
584
585 Prefs prefs;
586 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
587 << "Failed to initialize preferences.";
588
589 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
590
591 ASSERT_FALSE(TestUpdateCheck(
592 &prefs, // prefs
593 params,
594 GetUpdateResponse2(OmahaRequestParams::kAppId,
595 "1.2.3.4", // version
596 "http://more/info",
597 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700598 "http://code/base/", // dl url
599 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700600 "HASH1234=", // checksum
601 "false", // needs admin
602 "123", // size
603 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700604 "7"), // max days to scatter
605 -1,
606 false, // ping_only
607 kActionCodeOmahaUpdateDeferredPerPolicy,
608 &response,
609 NULL));
610
611 int64 count;
612 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
613 // count remains the same, as the decrementing happens in update_attempter
614 // which this test doesn't exercise.
615 ASSERT_TRUE(count == 5);
616 EXPECT_FALSE(response.update_exists);
617}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700618
Darin Petkov6a5b3222010-07-13 14:55:28 -0700619TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700620 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
621
622 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
623
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800624 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700625 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700626 mock_system_state.set_request_params(&params);
627 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700628 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800629 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700630 NULL),
631 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700632 OmahaRequestActionTestProcessorDelegate delegate;
633 delegate.loop_ = loop;
634 ActionProcessor processor;
635 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700636 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700637
638 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
639 g_main_loop_run(loop);
640 g_main_loop_unref(loop);
641 EXPECT_FALSE(processor.IsRunning());
642}
643
644TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700645 OmahaResponse response;
646 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700647 TestUpdateCheck(NULL, // prefs
648 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700649 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700650 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700651 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700652 kActionCodeOmahaRequestXMLParseError,
653 &response,
654 NULL));
655 EXPECT_FALSE(response.update_exists);
656}
657
658TEST(OmahaRequestActionTest, EmptyResponseTest) {
659 OmahaResponse response;
660 ASSERT_FALSE(
661 TestUpdateCheck(NULL, // prefs
662 kDefaultTestParams,
663 "",
664 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700665 false, // ping_only
Darin Petkovedc522e2010-11-05 09:35:17 -0700666 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700667 &response,
668 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700669 EXPECT_FALSE(response.update_exists);
670}
671
672TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700673 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700674 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700675 NULL, // prefs
676 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700677 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
678 "<daystart elapsed_seconds=\"100\"/>"
679 "<app appid=\"foo\" status=\"ok\">"
680 "<ping status=\"ok\"/>"
681 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700682 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700683 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700684 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700685 &response,
686 NULL));
687 EXPECT_FALSE(response.update_exists);
688}
689
690TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700691 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700692 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700693 NULL, // prefs
694 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700695 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
696 "<daystart elapsed_seconds=\"100\"/>"
697 "<app appid=\"foo\" status=\"ok\">"
698 "<ping status=\"ok\"/>"
699 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700700 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700701 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700702 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700703 &response,
704 NULL));
705 EXPECT_FALSE(response.update_exists);
706}
707
708TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700709 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700710 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700711 NULL, // prefs
712 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700713 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
714 "<daystart elapsed_seconds=\"100\"/>"
715 "<app appid=\"foo\" status=\"ok\">"
716 "<ping status=\"ok\"/>"
717 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700718 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700719 false, // ping_only
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700720 kActionCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700721 &response,
722 NULL));
723 EXPECT_FALSE(response.update_exists);
724}
725
726TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700727 string input_response =
728 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
729 "<daystart elapsed_seconds=\"100\"/>"
730 "<app appid=\"xyz\" status=\"ok\">"
731 "<updatecheck status=\"ok\">"
732 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
733 "<manifest version=\"1.0.0.0\">"
734 "<packages><package hash=\"not-used\" name=\"f\" "
735 "size=\"587\"/></packages>"
736 "<actions><action event=\"postinstall\" "
737 "DisplayVersion=\"10.2.3.4\" "
738 "ChromeOSVersion=\"10.2.3.4\" "
739 "Prompt=\"false\" "
740 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800741 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700742 "sha256=\"lkq34j5345\" "
743 "needsadmin=\"true\" "
744 "/></actions></manifest></updatecheck></app></response>";
745 LOG(INFO) << "Input Response = " << input_response;
746
Darin Petkov6a5b3222010-07-13 14:55:28 -0700747 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700748 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
749 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700750 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700751 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700752 false, // ping_only
Darin Petkovc1a8b422010-07-19 11:34:49 -0700753 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700754 &response,
755 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700756 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700757 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800758 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700759 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700760 EXPECT_EQ("lkq34j5345", response.hash);
761 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700762 EXPECT_TRUE(response.needs_admin);
763 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 +
1482 utils::kStatefulPartition + "/etc"));
1483 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(
1491 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
1492 "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 +
1522 utils::kStatefulPartition + "/etc"));
1523 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(
1531 kTestDir + utils::kStatefulPartition + "/etc/lsb-release",
1532 "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