blob: de5f49fe5d81d07da7dcaae1ac672f98dd60a046 [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",
Chris Sosac1972482013-04-30 22:31:10 -070056 "ChromeOSFirmware.1.0",
57 "0X0A1",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070058 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -080059 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -070060 "http://url",
61 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070062 ""); // target_version_prefix);
Darin Petkov1cbd78f2010-07-29 12:38:34 -070063
Darin Petkov6a5b3222010-07-13 14:55:28 -070064string GetNoUpdateResponse(const string& app_id) {
65 return string(
Jay Srinivasan23b92a52012-10-27 02:00:21 -070066 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
67 "<daystart elapsed_seconds=\"100\"/>"
68 "<app appid=\"") + app_id + "\" status=\"ok\"><ping "
69 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></response>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070070}
71
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070072string GetUpdateResponse2(const string& app_id,
73 const string& display_version,
74 const string& more_info_url,
75 const string& prompt,
76 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -070077 const string& filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070078 const string& hash,
79 const string& needsadmin,
80 const string& size,
81 const string& deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070082 const string& max_days_to_scatter) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -070083 string response =
84 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
85 "protocol=\"3.0\">"
86 "<daystart elapsed_seconds=\"100\"/>"
87 "<app appid=\"" + app_id + "\" status=\"ok\">"
88 "<ping status=\"ok\"/><updatecheck status=\"ok\">"
89 "<urls><url codebase=\"" + codebase + "\"/></urls>"
90 "<manifest version=\"" + display_version + "\">"
91 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
92 "size=\"" + size + "\"/></packages>"
93 "<actions><action event=\"postinstall\" "
94 "DisplayVersion=\"" + display_version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070095 "ChromeOSVersion=\"" + display_version + "\" "
96 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
97 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080098 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070099 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700100 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700101 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700102 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700103 "/></actions></manifest></updatecheck></app></response>";
104 LOG(INFO) << "Response = " << response;
105 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700106}
107
Darin Petkov6a5b3222010-07-13 14:55:28 -0700108string GetUpdateResponse(const string& app_id,
109 const string& display_version,
110 const string& more_info_url,
111 const string& prompt,
112 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700113 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700114 const string& hash,
115 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700116 const string& size,
117 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700118 return GetUpdateResponse2(app_id,
119 display_version,
120 more_info_url,
121 prompt,
122 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700123 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700124 hash,
125 needsadmin,
126 size,
127 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700128 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700129}
130
131class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
132 public:
133 OmahaRequestActionTestProcessorDelegate()
134 : loop_(NULL),
David Zeuthena99981f2013-04-29 13:42:47 -0700135 expected_code_(kErrorCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700136 virtual ~OmahaRequestActionTestProcessorDelegate() {
137 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700138 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700139 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700140 ASSERT_TRUE(loop_);
141 g_main_loop_quit(loop_);
142 }
143
144 virtual void ActionCompleted(ActionProcessor* processor,
145 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700146 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700147 // make sure actions always succeed
148 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700149 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700150 else
David Zeuthena99981f2013-04-29 13:42:47 -0700151 EXPECT_EQ(kErrorCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700152 }
153 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700154 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700155};
156
157gboolean StartProcessorInRunLoop(gpointer data) {
158 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
159 processor->StartProcessing();
160 return FALSE;
161}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700162} // namespace {}
163
164class OutputObjectCollectorAction;
165
166template<>
167class ActionTraits<OutputObjectCollectorAction> {
168 public:
169 // Does not take an object for input
170 typedef OmahaResponse InputObjectType;
171 // On success, puts the output path on output
172 typedef NoneType OutputObjectType;
173};
174
175class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
176 public:
177 OutputObjectCollectorAction() : has_input_object_(false) {}
178 void PerformAction() {
179 // copy input object
180 has_input_object_ = HasInputObject();
181 if (has_input_object_)
182 omaha_response_ = GetInputObject();
David Zeuthena99981f2013-04-29 13:42:47 -0700183 processor_->ActionComplete(this, kErrorCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700184 }
185 // Should never be called
186 void TerminateProcessing() {
187 CHECK(false);
188 }
189 // Debugging/logging
190 static std::string StaticType() {
191 return "OutputObjectCollectorAction";
192 }
193 std::string Type() const { return StaticType(); }
194 bool has_input_object_;
195 OmahaResponse omaha_response_;
196};
197
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700198// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700199// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700200// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
201// the transfer will fail with that code. |ping_only| is passed through to the
202// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
203// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700204bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700205 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700206 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700207 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700208 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700209 ErrorCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700210 OmahaResponse* out_response,
211 vector<char>* out_post_data) {
212 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
213 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800214 http_response.size(),
215 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700216 if (fail_http_response_code >= 0) {
217 fetcher->FailTransfer(fail_http_response_code);
218 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800219 MockSystemState mock_system_state;
220 if (prefs)
221 mock_system_state.set_prefs(prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700222 mock_system_state.set_request_params(&params);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800223 OmahaRequestAction action(&mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700224 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700225 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700226 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700227 OmahaRequestActionTestProcessorDelegate delegate;
228 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700229 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700230
Darin Petkov6a5b3222010-07-13 14:55:28 -0700231 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700232 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700233 processor.EnqueueAction(&action);
234
235 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700236 BondActions(&action, &collector_action);
237 processor.EnqueueAction(&collector_action);
238
239 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
240 g_main_loop_run(loop);
241 g_main_loop_unref(loop);
242 if (collector_action.has_input_object_ && out_response)
243 *out_response = collector_action.omaha_response_;
244 if (out_post_data)
245 *out_post_data = fetcher->post_data();
246 return collector_action.has_input_object_;
247}
248
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700249// Tests Event requests -- they should always succeed. |out_post_data|
250// may be null; if non-null, the post-data received by the mock
251// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700252void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700253 OmahaEvent* event,
254 const string& http_response,
255 vector<char>* out_post_data) {
256 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
257 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800258 http_response.size(),
259 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800260 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700261 mock_system_state.set_request_params(&params);
262 OmahaRequestAction action(&mock_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700263 OmahaRequestActionTestProcessorDelegate delegate;
264 delegate.loop_ = loop;
265 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700266 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700267 processor.EnqueueAction(&action);
268
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700269 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
270 g_main_loop_run(loop);
271 g_main_loop_unref(loop);
272 if (out_post_data)
273 *out_post_data = fetcher->post_data();
274}
275
Darin Petkov6a5b3222010-07-13 14:55:28 -0700276TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700277 OmahaResponse response;
278 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700279 TestUpdateCheck(NULL, // prefs
280 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700281 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700282 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700283 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700284 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700285 &response,
286 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700287 EXPECT_FALSE(response.update_exists);
288}
289
290TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700291 OmahaResponse response;
292 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700293 TestUpdateCheck(NULL, // prefs
294 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700295 GetUpdateResponse(OmahaRequestParams::kAppId,
296 "1.2.3.4", // version
297 "http://more/info",
298 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700299 "http://code/base/", // dl url
300 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700301 "HASH1234=", // checksum
302 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700303 "123", // size
304 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700305 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700306 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700307 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700308 &response,
309 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700311 EXPECT_TRUE(response.update_exists);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700312 EXPECT_EQ("1.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800313 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700314 EXPECT_EQ("http://more/info", response.more_info_url);
315 EXPECT_EQ("HASH1234=", response.hash);
316 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700317 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700318 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700319}
320
Jay Srinivasan0a708742012-03-20 11:26:12 -0700321TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
322 OmahaResponse response;
323 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700324 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700325 ASSERT_FALSE(
326 TestUpdateCheck(NULL, // prefs
327 params,
328 GetUpdateResponse(OmahaRequestParams::kAppId,
329 "1.2.3.4", // version
330 "http://more/info",
331 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700332 "http://code/base/", // dl url
333 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700334 "HASH1234=", // checksum
335 "false", // needs admin
336 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700337 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700338 -1,
339 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700340 kErrorCodeOmahaUpdateIgnoredPerPolicy,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700341 &response,
342 NULL));
343 EXPECT_FALSE(response.update_exists);
344}
345
Jay Srinivasan0a708742012-03-20 11:26:12 -0700346TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
347 OmahaResponse response;
348 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700349 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700350 ASSERT_TRUE(
351 TestUpdateCheck(NULL, // prefs
352 params,
353 GetNoUpdateResponse(OmahaRequestParams::kAppId),
354 -1,
355 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700356 kErrorCodeSuccess,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700357 &response,
358 NULL));
359 EXPECT_FALSE(response.update_exists);
360}
361
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700362TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
363 OmahaResponse response;
364 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700365 params.set_wall_clock_based_wait_enabled(true);
366 params.set_update_check_count_wait_enabled(false);
367 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700368
369 string prefs_dir;
370 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
371 &prefs_dir));
372 ScopedDirRemover temp_dir_remover(prefs_dir);
373
374 Prefs prefs;
375 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
376 << "Failed to initialize preferences.";
377
378 ASSERT_FALSE(
379 TestUpdateCheck(&prefs, // prefs
380 params,
381 GetUpdateResponse2(OmahaRequestParams::kAppId,
382 "1.2.3.4", // version
383 "http://more/info",
384 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700385 "http://code/base/", // dl url
386 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700387 "HASH1234=", // checksum
388 "false", // needs admin
389 "123", // size
390 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700391 "7"), // max days to scatter
392 -1,
393 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700394 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700395 &response,
396 NULL));
397 EXPECT_FALSE(response.update_exists);
398}
399
400TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
401 OmahaResponse response;
402 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700403 params.set_wall_clock_based_wait_enabled(false);
404 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700405
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700406 params.set_update_check_count_wait_enabled(true);
407 params.set_min_update_checks_needed(1);
408 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700409
410 string prefs_dir;
411 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
412 &prefs_dir));
413 ScopedDirRemover temp_dir_remover(prefs_dir);
414
415 Prefs prefs;
416 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
417 << "Failed to initialize preferences.";
418
419 ASSERT_TRUE(
420 TestUpdateCheck(&prefs, // prefs
421 params,
422 GetUpdateResponse2(OmahaRequestParams::kAppId,
423 "1.2.3.4", // version
424 "http://more/info",
425 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700426 "http://code/base/", // dl url
427 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700428 "HASH1234=", // checksum
429 "false", // needs admin
430 "123", // size
431 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700432 "7"), // max days to scatter
433 -1,
434 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700435 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700436 &response,
437 NULL));
438 EXPECT_TRUE(response.update_exists);
439}
440
441TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
442 OmahaResponse response;
443 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700444 params.set_wall_clock_based_wait_enabled(true);
445 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700446
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700447 params.set_update_check_count_wait_enabled(true);
448 params.set_min_update_checks_needed(1);
449 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700450
451 string prefs_dir;
452 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
453 &prefs_dir));
454 ScopedDirRemover temp_dir_remover(prefs_dir);
455
456 Prefs prefs;
457 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
458 << "Failed to initialize preferences.";
459
460 ASSERT_TRUE(
461 TestUpdateCheck(&prefs, // prefs
462 params,
463 GetUpdateResponse2(OmahaRequestParams::kAppId,
464 "1.2.3.4", // version
465 "http://more/info",
466 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700467 "http://code/base/", // dl url
468 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700469 "HASH1234=", // checksum
470 "false", // needs admin
471 "123", // size
472 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700473 "0"), // max days to scatter
474 -1,
475 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700476 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700477 &response,
478 NULL));
479 EXPECT_TRUE(response.update_exists);
480}
481
482
483TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
484 OmahaResponse response;
485 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700486 params.set_wall_clock_based_wait_enabled(true);
487 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700488
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700489 params.set_update_check_count_wait_enabled(true);
490 params.set_min_update_checks_needed(0);
491 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700492
493 string prefs_dir;
494 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
495 &prefs_dir));
496 ScopedDirRemover temp_dir_remover(prefs_dir);
497
498 Prefs prefs;
499 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
500 << "Failed to initialize preferences.";
501
502 ASSERT_TRUE(TestUpdateCheck(
503 &prefs, // prefs
504 params,
505 GetUpdateResponse2(OmahaRequestParams::kAppId,
506 "1.2.3.4", // version
507 "http://more/info",
508 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700509 "http://code/base/", // dl url
510 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700511 "HASH1234=", // checksum
512 "false", // needs admin
513 "123", // size
514 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700515 "7"), // max days to scatter
516 -1,
517 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700518 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700519 &response,
520 NULL));
521
522 int64 count;
523 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
524 ASSERT_TRUE(count == 0);
525 EXPECT_TRUE(response.update_exists);
526}
527
528TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
529 OmahaResponse response;
530 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700531 params.set_wall_clock_based_wait_enabled(true);
532 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700533
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700534 params.set_update_check_count_wait_enabled(true);
535 params.set_min_update_checks_needed(1);
536 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700537
538 string prefs_dir;
539 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
540 &prefs_dir));
541 ScopedDirRemover temp_dir_remover(prefs_dir);
542
543 Prefs prefs;
544 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
545 << "Failed to initialize preferences.";
546
547 ASSERT_FALSE(TestUpdateCheck(
548 &prefs, // prefs
549 params,
550 GetUpdateResponse2(OmahaRequestParams::kAppId,
551 "1.2.3.4", // version
552 "http://more/info",
553 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700554 "http://code/base/", // dl url
555 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700556 "HASH1234=", // checksum
557 "false", // needs admin
558 "123", // size
559 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700560 "7"), // max days to scatter
561 -1,
562 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700563 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700564 &response,
565 NULL));
566
567 int64 count;
568 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
569 ASSERT_TRUE(count > 0);
570 EXPECT_FALSE(response.update_exists);
571}
572
573TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
574 OmahaResponse response;
575 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700576 params.set_wall_clock_based_wait_enabled(true);
577 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700578
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700579 params.set_update_check_count_wait_enabled(true);
580 params.set_min_update_checks_needed(1);
581 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700582
583 string prefs_dir;
584 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
585 &prefs_dir));
586 ScopedDirRemover temp_dir_remover(prefs_dir);
587
588 Prefs prefs;
589 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
590 << "Failed to initialize preferences.";
591
592 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
593
594 ASSERT_FALSE(TestUpdateCheck(
595 &prefs, // prefs
596 params,
597 GetUpdateResponse2(OmahaRequestParams::kAppId,
598 "1.2.3.4", // version
599 "http://more/info",
600 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700601 "http://code/base/", // dl url
602 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700603 "HASH1234=", // checksum
604 "false", // needs admin
605 "123", // size
606 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700607 "7"), // max days to scatter
608 -1,
609 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700610 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700611 &response,
612 NULL));
613
614 int64 count;
615 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
616 // count remains the same, as the decrementing happens in update_attempter
617 // which this test doesn't exercise.
618 ASSERT_TRUE(count == 5);
619 EXPECT_FALSE(response.update_exists);
620}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700621
Darin Petkov6a5b3222010-07-13 14:55:28 -0700622TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700623 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
624
625 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
626
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800627 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700628 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700629 mock_system_state.set_request_params(&params);
630 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700631 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800632 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700633 NULL),
634 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700635 OmahaRequestActionTestProcessorDelegate delegate;
636 delegate.loop_ = loop;
637 ActionProcessor processor;
638 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700639 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700640
641 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
642 g_main_loop_run(loop);
643 g_main_loop_unref(loop);
644 EXPECT_FALSE(processor.IsRunning());
645}
646
647TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700648 OmahaResponse response;
649 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700650 TestUpdateCheck(NULL, // prefs
651 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700652 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700653 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700654 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700655 kErrorCodeOmahaRequestXMLParseError,
Darin Petkovedc522e2010-11-05 09:35:17 -0700656 &response,
657 NULL));
658 EXPECT_FALSE(response.update_exists);
659}
660
661TEST(OmahaRequestActionTest, EmptyResponseTest) {
662 OmahaResponse response;
663 ASSERT_FALSE(
664 TestUpdateCheck(NULL, // prefs
665 kDefaultTestParams,
666 "",
667 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700668 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700669 kErrorCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700670 &response,
671 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700672 EXPECT_FALSE(response.update_exists);
673}
674
675TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700676 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700677 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700678 NULL, // prefs
679 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700680 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
681 "<daystart elapsed_seconds=\"100\"/>"
682 "<app appid=\"foo\" status=\"ok\">"
683 "<ping status=\"ok\"/>"
684 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700685 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700686 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700687 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700688 &response,
689 NULL));
690 EXPECT_FALSE(response.update_exists);
691}
692
693TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700694 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700695 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700696 NULL, // prefs
697 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700698 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
699 "<daystart elapsed_seconds=\"100\"/>"
700 "<app appid=\"foo\" status=\"ok\">"
701 "<ping status=\"ok\"/>"
702 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700703 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700704 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700705 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700706 &response,
707 NULL));
708 EXPECT_FALSE(response.update_exists);
709}
710
711TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700712 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700713 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700714 NULL, // prefs
715 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700716 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
717 "<daystart elapsed_seconds=\"100\"/>"
718 "<app appid=\"foo\" status=\"ok\">"
719 "<ping status=\"ok\"/>"
720 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700721 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700722 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700723 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700724 &response,
725 NULL));
726 EXPECT_FALSE(response.update_exists);
727}
728
729TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700730 string input_response =
731 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
732 "<daystart elapsed_seconds=\"100\"/>"
733 "<app appid=\"xyz\" status=\"ok\">"
734 "<updatecheck status=\"ok\">"
735 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
736 "<manifest version=\"1.0.0.0\">"
737 "<packages><package hash=\"not-used\" name=\"f\" "
738 "size=\"587\"/></packages>"
739 "<actions><action event=\"postinstall\" "
740 "DisplayVersion=\"10.2.3.4\" "
741 "ChromeOSVersion=\"10.2.3.4\" "
742 "Prompt=\"false\" "
743 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800744 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700745 "sha256=\"lkq34j5345\" "
746 "needsadmin=\"true\" "
747 "/></actions></manifest></updatecheck></app></response>";
748 LOG(INFO) << "Input Response = " << input_response;
749
Darin Petkov6a5b3222010-07-13 14:55:28 -0700750 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700751 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
752 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700753 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700754 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700755 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700756 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700757 &response,
758 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700759 EXPECT_TRUE(response.update_exists);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700760 EXPECT_EQ("10.2.3.4", response.display_version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800761 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700762 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700763 EXPECT_EQ("lkq34j5345", response.hash);
764 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700765 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700766 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700767}
768
769namespace {
770class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
771 public:
772 void ProcessingStopped(const ActionProcessor* processor) {
773 ASSERT_TRUE(loop_);
774 g_main_loop_quit(loop_);
775 }
776 GMainLoop *loop_;
777};
778
779gboolean TerminateTransferTestStarter(gpointer data) {
780 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
781 processor->StartProcessing();
782 CHECK(processor->IsRunning());
783 processor->StopProcessing();
784 return FALSE;
785}
786} // namespace {}
787
788TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700789 string http_response("doesn't matter");
790 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
791
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800792 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700793 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700794 mock_system_state.set_request_params(&params);
795 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700796 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800797 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700798 NULL),
799 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700800 TerminateEarlyTestProcessorDelegate delegate;
801 delegate.loop_ = loop;
802 ActionProcessor processor;
803 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700804 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700805
806 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
807 g_main_loop_run(loop);
808 g_main_loop_unref(loop);
809}
810
811TEST(OmahaRequestActionTest, XmlEncodeTest) {
812 EXPECT_EQ("ab", XmlEncode("ab"));
813 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
814 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
815 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
816 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
817
818 vector<char> post_data;
819
820 // Make sure XML Encode is being called on the params
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700821 MockSystemState mock_system_state;
822 OmahaRequestParams params(&mock_system_state,
823 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700824 OmahaRequestParams::kOsVersion,
825 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700826 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700827 OmahaRequestParams::kAppId,
828 "0.1.0.0",
829 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700830 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700831 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -0700832 "ChromeOSFirmware.1.0",
833 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700834 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800835 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700836 "http://url",
837 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700838 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700839 OmahaResponse response;
840 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700841 TestUpdateCheck(NULL, // prefs
842 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700843 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700844 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700845 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700846 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700847 &response,
848 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849 // convert post_data to string
850 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700851 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
852 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700853 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
854 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
855 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
856 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700857 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
858 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700859}
860
861TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700862 OmahaResponse response;
863 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700864 TestUpdateCheck(NULL, // prefs
865 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700866 GetUpdateResponse(OmahaRequestParams::kAppId,
867 "1.2.3.4", // version
868 "testthe&lt;url", // more info
869 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700870 "testthe&amp;codebase/", // dl url
871 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700872 "HASH1234=", // checksum
873 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700874 "123", // size
875 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700876 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700877 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700878 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700879 &response,
880 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700881
882 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800883 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700884 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700885}
886
887TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700888 OmahaResponse response;
889 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700890 TestUpdateCheck(NULL, // prefs
891 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700892 GetUpdateResponse(OmahaRequestParams::kAppId,
893 "1.2.3.4", // version
894 "theurl", // more info
895 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700896 "thecodebase/", // dl url
897 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700898 "HASH1234=", // checksum
899 "false", // needs admin
900 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700901 "123123123123123", // size
902 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700903 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700904 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700905 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700906 &response,
907 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700908
909 EXPECT_EQ(response.size, 123123123123123ll);
910}
911
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700912TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
913 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800914 NiceMock<PrefsMock> prefs;
915 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
916 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700917 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -0800918 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700919 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700920 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700921 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700922 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700923 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700924 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700925 &post_data));
926 // convert post_data to string
927 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700928 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700929 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700930 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700931 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700932 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
933 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -0700934 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
935 string::npos);
936 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
937 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700938}
939
Jay Srinivasan0a708742012-03-20 11:26:12 -0700940
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700941TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800942 vector<char> post_data;
943 NiceMock<PrefsMock> prefs;
944 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700945 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700946 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700947 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700948 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -0800949 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700950 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800951 "invalid xml>",
952 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700953 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700954 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov95508da2011-01-05 12:42:29 -0800955 NULL, // response
956 &post_data));
957 // convert post_data to string
958 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700959 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700960 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700961 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700962 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800963 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
964 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -0700965 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
966 string::npos);
967 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
968 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800969}
970
Darin Petkove17f86b2010-07-20 09:12:01 -0700971TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
972 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700973 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700974 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
975 "invalid xml>",
976 &post_data);
977 // convert post_data to string
978 string post_str(&post_data[0], post_data.size());
979 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700980 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700981 OmahaEvent::kTypeUpdateDownloadStarted,
982 OmahaEvent::kResultSuccess);
983 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700984 EXPECT_EQ(post_str.find("ping"), string::npos);
985 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700986}
987
988TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
989 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700990 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700991 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
992 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -0700993 kErrorCodeError),
Darin Petkove17f86b2010-07-20 09:12:01 -0700994 "invalid xml>",
995 &post_data);
996 // convert post_data to string
997 string post_str(&post_data[0], post_data.size());
998 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700999 " <event eventtype=\"%d\" eventresult=\"%d\" "
1000 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001001 OmahaEvent::kTypeDownloadComplete,
1002 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001003 kErrorCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001004 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001005 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001006}
1007
1008TEST(OmahaRequestActionTest, IsEventTest) {
1009 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001010 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001011 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001012 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001013 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001014 &mock_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001015 NULL,
1016 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001017 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001018 NULL),
1019 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001020 EXPECT_FALSE(update_check_action.IsEvent());
1021
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001022 params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001023 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001024 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001025 &mock_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001026 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001027 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001028 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001029 NULL),
1030 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001031 EXPECT_TRUE(event_action.IsEvent());
1032}
1033
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001034TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1035 for (int i = 0; i < 2; i++) {
1036 bool delta_okay = i == 1;
1037 const char* delta_okay_str = delta_okay ? "true" : "false";
1038 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001039 MockSystemState mock_system_state;
1040 OmahaRequestParams params(&mock_system_state,
1041 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001042 OmahaRequestParams::kOsVersion,
1043 "service_pack",
1044 "x86-generic",
1045 OmahaRequestParams::kAppId,
1046 "0.1.0.0",
1047 "en-US",
1048 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001049 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001050 "ChromeOSFirmware.1.0",
1051 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001052 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001053 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001054 "http://url",
1055 false, // update_disabled
1056 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001057 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1058 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001059 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001060 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001061 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001062 kErrorCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001063 NULL,
1064 &post_data));
1065 // convert post_data to string
1066 string post_str(&post_data[0], post_data.size());
1067 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1068 string::npos)
1069 << "i = " << i;
1070 }
1071}
1072
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001073TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1074 for (int i = 0; i < 2; i++) {
1075 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001076 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001077 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001078 MockSystemState mock_system_state;
1079 OmahaRequestParams params(&mock_system_state,
1080 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001081 OmahaRequestParams::kOsVersion,
1082 "service_pack",
1083 "x86-generic",
1084 OmahaRequestParams::kAppId,
1085 "0.1.0.0",
1086 "en-US",
1087 "unittest_track",
1088 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001089 "ChromeOSFirmware.1.0",
1090 "EC100",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001091 true, // delta_okay
1092 interactive,
1093 "http://url",
1094 false, // update_disabled
1095 ""); // target_version_prefix
1096 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1097 params,
1098 "invalid xml>",
1099 -1,
1100 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001101 kErrorCodeOmahaRequestXMLParseError,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001102 NULL,
1103 &post_data));
1104 // convert post_data to string
1105 string post_str(&post_data[0], post_data.size());
Gilad Arnold8a659d82013-01-24 11:26:00 -08001106 EXPECT_NE(post_str.find(StringPrintf("installsource=\"%s\"",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001107 interactive_str)),
1108 string::npos)
1109 << "i = " << i;
1110 }
1111}
1112
Darin Petkove17f86b2010-07-20 09:12:01 -07001113TEST(OmahaRequestActionTest, OmahaEventTest) {
1114 OmahaEvent default_event;
1115 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1116 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001117 EXPECT_EQ(kErrorCodeError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001118
1119 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1120 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1121 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001122 EXPECT_EQ(kErrorCodeSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001123
1124 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1125 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001126 kErrorCodeError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001127 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1128 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001129 EXPECT_EQ(kErrorCodeError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001130}
1131
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001132TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001133 for (int ping_only = 0; ping_only < 2; ping_only++) {
1134 NiceMock<PrefsMock> prefs;
1135 // Add a few hours to the day difference to test no rounding, etc.
1136 int64_t five_days_ago =
1137 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1138 int64_t six_days_ago =
1139 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1140 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1141 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1142 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1143 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1144 vector<char> post_data;
1145 ASSERT_TRUE(
1146 TestUpdateCheck(&prefs,
1147 kDefaultTestParams,
1148 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1149 -1,
1150 ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -07001151 kErrorCodeSuccess,
Darin Petkov265f2902011-05-09 15:17:40 -07001152 NULL,
1153 &post_data));
1154 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001155 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001156 string::npos);
1157 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001158 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001159 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1160 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001161 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001162 EXPECT_NE(post_str.find("previousversion"), string::npos);
1163 }
1164 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001165}
1166
1167TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001168 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001169 int64_t three_days_ago =
1170 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1171 int64_t now = Time::Now().ToInternalValue();
1172 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1173 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1174 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1175 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1176 vector<char> post_data;
1177 ASSERT_TRUE(
1178 TestUpdateCheck(&prefs,
1179 kDefaultTestParams,
1180 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001181 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001182 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001183 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001184 NULL,
1185 &post_data));
1186 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001187 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001188 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001189}
1190
1191TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001192 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001193 int64_t four_days_ago =
1194 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1195 int64_t now = Time::Now().ToInternalValue();
1196 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1197 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1198 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1199 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1200 vector<char> post_data;
1201 ASSERT_TRUE(
1202 TestUpdateCheck(&prefs,
1203 kDefaultTestParams,
1204 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001205 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001206 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001207 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001208 NULL,
1209 &post_data));
1210 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001211 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001212 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001213}
1214
1215TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001216 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001217 int64_t one_hour_ago =
1218 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1219 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1220 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1221 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1222 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1223 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1224 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1225 vector<char> post_data;
1226 ASSERT_TRUE(
1227 TestUpdateCheck(&prefs,
1228 kDefaultTestParams,
1229 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001230 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001231 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001232 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001233 NULL,
1234 &post_data));
1235 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001236 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001237}
1238
Thieu Leb44e9e82011-06-06 14:34:04 -07001239TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1240 // This test ensures that we ignore empty ping only requests.
1241 NiceMock<PrefsMock> prefs;
1242 int64_t now = Time::Now().ToInternalValue();
1243 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1244 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1245 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1246 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1247 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1248 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1249 vector<char> post_data;
1250 EXPECT_TRUE(
1251 TestUpdateCheck(&prefs,
1252 kDefaultTestParams,
1253 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1254 -1,
1255 true, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001256 kErrorCodeSuccess,
Thieu Leb44e9e82011-06-06 14:34:04 -07001257 NULL,
1258 &post_data));
1259 EXPECT_EQ(post_data.size(), 0);
1260}
1261
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001262TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001263 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001264 int64_t future =
1265 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1266 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1267 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1268 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1269 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1270 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1271 .WillOnce(Return(true));
1272 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1273 .WillOnce(Return(true));
1274 vector<char> post_data;
1275 ASSERT_TRUE(
1276 TestUpdateCheck(&prefs,
1277 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001278 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1279 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001280 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001281 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001282 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001283 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001284 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001285 NULL,
1286 &post_data));
1287 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001288 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001289}
1290
1291TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1292 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001293 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001294 // may fail if it runs for longer than 5 seconds. It shouldn't run
1295 // that long though.
1296 int64_t midnight =
1297 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1298 int64_t midnight_slack =
1299 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001300 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001301 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1302 AllOf(Ge(midnight), Le(midnight_slack))))
1303 .WillOnce(Return(true));
1304 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1305 AllOf(Ge(midnight), Le(midnight_slack))))
1306 .WillOnce(Return(true));
1307 ASSERT_TRUE(
1308 TestUpdateCheck(&prefs,
1309 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001310 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1311 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001312 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001313 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001314 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001315 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001316 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001317 NULL,
1318 NULL));
1319}
1320
1321TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001322 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001323 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1324 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1325 ASSERT_TRUE(
1326 TestUpdateCheck(&prefs,
1327 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001328 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1329 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001330 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001331 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001332 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001333 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001334 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001335 NULL,
1336 NULL));
1337}
1338
1339TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001340 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001341 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1342 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1343 ASSERT_TRUE(
1344 TestUpdateCheck(&prefs,
1345 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001346 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1347 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001348 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001349 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001350 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001351 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001352 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001353 NULL,
1354 NULL));
1355}
1356
Darin Petkov84c763c2010-07-29 16:27:58 -07001357TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1358 vector<char> post_data;
1359 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1360 kDefaultTestParams,
1361 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001362 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001363 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001364 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001365 NULL, // response
1366 &post_data));
1367 // convert post_data to string
1368 string post_str(&post_data[0], post_data.size());
1369 EXPECT_EQ(post_str.find("machineid="), string::npos);
1370 EXPECT_EQ(post_str.find("userid="), string::npos);
1371}
1372
Darin Petkovedc522e2010-11-05 09:35:17 -07001373TEST(OmahaRequestActionTest, NetworkFailureTest) {
1374 OmahaResponse response;
1375 ASSERT_FALSE(
1376 TestUpdateCheck(NULL, // prefs
1377 kDefaultTestParams,
1378 "",
1379 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001380 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001381 static_cast<ErrorCode>(
1382 kErrorCodeOmahaRequestHTTPResponseBase + 501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001383 &response,
1384 NULL));
1385 EXPECT_FALSE(response.update_exists);
1386}
1387
1388TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1389 OmahaResponse response;
1390 ASSERT_FALSE(
1391 TestUpdateCheck(NULL, // prefs
1392 kDefaultTestParams,
1393 "",
1394 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001395 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001396 static_cast<ErrorCode>(
1397 kErrorCodeOmahaRequestHTTPResponseBase + 999),
Darin Petkovedc522e2010-11-05 09:35:17 -07001398 &response,
1399 NULL));
1400 EXPECT_FALSE(response.update_exists);
1401}
1402
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001403TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1404 OmahaResponse response;
1405 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001406 params.set_wall_clock_based_wait_enabled(true);
1407 params.set_waiting_period(TimeDelta().FromDays(1));
1408 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001409
1410 string prefs_dir;
1411 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1412 &prefs_dir));
1413 ScopedDirRemover temp_dir_remover(prefs_dir);
1414
1415 Prefs prefs;
1416 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1417 << "Failed to initialize preferences.";
1418
1419 ASSERT_FALSE(TestUpdateCheck(
1420 &prefs, // prefs
1421 params,
1422 GetUpdateResponse2(OmahaRequestParams::kAppId,
1423 "1.2.3.4", // version
1424 "http://more/info",
1425 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001426 "http://code/base/", // dl url
1427 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001428 "HASH1234=", // checksum
1429 "false", // needs admin
1430 "123", // size
1431 "", // deadline
1432 "7"), // max days to scatter
1433 -1,
1434 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001435 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001436 &response,
1437 NULL));
1438
1439 int64 timestamp = 0;
1440 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1441 ASSERT_TRUE(timestamp > 0);
1442 EXPECT_FALSE(response.update_exists);
1443}
1444
1445TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1446 OmahaResponse response;
1447 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001448 params.set_wall_clock_based_wait_enabled(true);
1449 params.set_waiting_period(TimeDelta().FromDays(1));
1450 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001451
1452 string prefs_dir;
1453 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1454 &prefs_dir));
1455 ScopedDirRemover temp_dir_remover(prefs_dir);
1456
1457 Prefs prefs;
1458 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1459 << "Failed to initialize preferences.";
1460
1461 // Set the timestamp to a very old value such that it exceeds the
1462 // waiting period set above.
1463 Time t1;
1464 Time::FromString("1/1/2012", &t1);
1465 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1466 ASSERT_TRUE(TestUpdateCheck(
1467 &prefs, // prefs
1468 params,
1469 GetUpdateResponse2(OmahaRequestParams::kAppId,
1470 "1.2.3.4", // version
1471 "http://more/info",
1472 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001473 "http://code/base/", // dl url
1474 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001475 "HASH1234=", // checksum
1476 "false", // needs admin
1477 "123", // size
1478 "", // deadline
1479 "7"), // max days to scatter
1480 -1,
1481 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001482 kErrorCodeSuccess,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001483 &response,
1484 NULL));
1485
1486 EXPECT_TRUE(response.update_exists);
1487
1488 // Make sure the timestamp t1 is unchanged showing that it was reused.
1489 int64 timestamp = 0;
1490 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1491 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1492}
1493
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001494TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
1495 const string kTestDir = "omaha_request_action-test";
1496 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1497 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001498 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001499 vector<char> post_data;
1500 NiceMock<PrefsMock> prefs;
1501 ASSERT_TRUE(WriteFileString(
1502 kTestDir + "/etc/lsb-release",
1503 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1504 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1505 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1506 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -07001507 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001508 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1509 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1510 OmahaRequestParams params = kDefaultTestParams;
1511 params.set_root(string("./") + kTestDir);
1512 params.SetLockDown(false);
1513 params.Init("1.2.3.4", "", 0);
1514 EXPECT_EQ("canary-channel", params.current_channel());
1515 EXPECT_EQ("stable-channel", params.target_channel());
1516 EXPECT_TRUE(params.to_more_stable_channel());
1517 EXPECT_TRUE(params.is_powerwash_allowed());
1518 ASSERT_FALSE(TestUpdateCheck(&prefs,
1519 params,
1520 "invalid xml>",
1521 -1,
1522 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001523 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001524 NULL, // response
1525 &post_data));
1526 // convert post_data to string
1527 string post_str(&post_data[0], post_data.size());
1528 EXPECT_NE(string::npos, post_str.find(
1529 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1530 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1531 "track=\"stable-channel\" from_track=\"canary-channel\" "));
1532}
1533
1534TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
1535 const string kTestDir = "omaha_request_action-test";
1536 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir + "/etc"));
1537 ASSERT_EQ(0, System(string("mkdir -p ") + kTestDir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001538 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001539 vector<char> post_data;
1540 NiceMock<PrefsMock> prefs;
1541 ASSERT_TRUE(WriteFileString(
1542 kTestDir + "/etc/lsb-release",
1543 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1544 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1545 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1546 ASSERT_TRUE(WriteFileString(
Chris Sosabe45bef2013-04-09 18:25:12 -07001547 kTestDir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001548 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1549 OmahaRequestParams params = kDefaultTestParams;
1550 params.set_root(string("./") + kTestDir);
1551 params.SetLockDown(false);
1552 params.Init("5.6.7.8", "", 0);
1553 EXPECT_EQ("stable-channel", params.current_channel());
1554 EXPECT_EQ("canary-channel", params.target_channel());
1555 EXPECT_FALSE(params.to_more_stable_channel());
1556 EXPECT_FALSE(params.is_powerwash_allowed());
1557 ASSERT_FALSE(TestUpdateCheck(&prefs,
1558 params,
1559 "invalid xml>",
1560 -1,
1561 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001562 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001563 NULL, // response
1564 &post_data));
1565 // convert post_data to string
1566 string post_str(&post_data[0], post_data.size());
1567 EXPECT_NE(string::npos, post_str.find(
1568 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1569 "version=\"5.6.7.8\" "
1570 "track=\"canary-channel\" from_track=\"stable-channel\""));
1571 EXPECT_EQ(string::npos, post_str.find( "from_version"));
1572}
1573
Darin Petkov6a5b3222010-07-13 14:55:28 -07001574} // namespace chromeos_update_engine