blob: ffcb91a428cbaa6e9b0509b30039eff5781e81b1 [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,
Chris Sosa3b748432013-06-20 16:42:59 -070073 const string& version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070074 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>"
Chris Sosa3b748432013-06-20 16:42:59 -070090 "<manifest version=\"" + version + "\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -070091 "<packages><package hash=\"not-used\" name=\"" + filename + "\" "
92 "size=\"" + size + "\"/></packages>"
93 "<actions><action event=\"postinstall\" "
Chris Sosa3b748432013-06-20 16:42:59 -070094 "ChromeOSVersion=\"" + version + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070095 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
96 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -080097 "IsDeltaPayload=\"true\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070098 "MaxDaysToScatter=\"" + max_days_to_scatter + "\" "
Jay Srinivasan480ddfa2012-06-01 19:15:26 -070099 "sha256=\"" + hash + "\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700100 "needsadmin=\"" + needsadmin + "\" " +
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700101 (deadline.empty() ? "" : ("deadline=\"" + deadline + "\" ")) +
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700102 "/></actions></manifest></updatecheck></app></response>";
103 LOG(INFO) << "Response = " << response;
104 return response;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700105}
106
Darin Petkov6a5b3222010-07-13 14:55:28 -0700107string GetUpdateResponse(const string& app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700108 const string& version,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700109 const string& more_info_url,
110 const string& prompt,
111 const string& codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700112 const string& filename,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700113 const string& hash,
114 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -0700115 const string& size,
116 const string& deadline) {
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700117 return GetUpdateResponse2(app_id,
Chris Sosa3b748432013-06-20 16:42:59 -0700118 version,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700119 more_info_url,
120 prompt,
121 codebase,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700122 filename,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700123 hash,
124 needsadmin,
125 size,
126 deadline,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700127 "7");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700128}
129
130class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
131 public:
132 OmahaRequestActionTestProcessorDelegate()
133 : loop_(NULL),
David Zeuthena99981f2013-04-29 13:42:47 -0700134 expected_code_(kErrorCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700135 virtual ~OmahaRequestActionTestProcessorDelegate() {
136 }
Darin Petkovc1a8b422010-07-19 11:34:49 -0700137 virtual void ProcessingDone(const ActionProcessor* processor,
David Zeuthena99981f2013-04-29 13:42:47 -0700138 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700139 ASSERT_TRUE(loop_);
140 g_main_loop_quit(loop_);
141 }
142
143 virtual void ActionCompleted(ActionProcessor* processor,
144 AbstractAction* action,
David Zeuthena99981f2013-04-29 13:42:47 -0700145 ErrorCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700146 // make sure actions always succeed
147 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -0700148 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700149 else
David Zeuthena99981f2013-04-29 13:42:47 -0700150 EXPECT_EQ(kErrorCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700151 }
152 GMainLoop *loop_;
David Zeuthena99981f2013-04-29 13:42:47 -0700153 ErrorCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700154};
155
156gboolean StartProcessorInRunLoop(gpointer data) {
157 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
158 processor->StartProcessing();
159 return FALSE;
160}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700161} // namespace {}
162
163class OutputObjectCollectorAction;
164
165template<>
166class ActionTraits<OutputObjectCollectorAction> {
167 public:
168 // Does not take an object for input
169 typedef OmahaResponse InputObjectType;
170 // On success, puts the output path on output
171 typedef NoneType OutputObjectType;
172};
173
174class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
175 public:
176 OutputObjectCollectorAction() : has_input_object_(false) {}
177 void PerformAction() {
178 // copy input object
179 has_input_object_ = HasInputObject();
180 if (has_input_object_)
181 omaha_response_ = GetInputObject();
David Zeuthena99981f2013-04-29 13:42:47 -0700182 processor_->ActionComplete(this, kErrorCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700183 }
184 // Should never be called
185 void TerminateProcessing() {
186 CHECK(false);
187 }
188 // Debugging/logging
189 static std::string StaticType() {
190 return "OutputObjectCollectorAction";
191 }
192 std::string Type() const { return StaticType(); }
193 bool has_input_object_;
194 OmahaResponse omaha_response_;
195};
196
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700197// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700198// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
Darin Petkov265f2902011-05-09 15:17:40 -0700199// used. out_response may be NULL. If |fail_http_response_code| is non-negative,
200// the transfer will fail with that code. |ping_only| is passed through to the
201// OmahaRequestAction constructor. out_post_data may be null; if non-null, the
202// post-data received by the mock HttpFetcher is returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700203bool TestUpdateCheck(PrefsInterface* prefs,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700204 OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700205 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700206 int fail_http_response_code,
Darin Petkov265f2902011-05-09 15:17:40 -0700207 bool ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -0700208 ErrorCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700209 OmahaResponse* out_response,
210 vector<char>* out_post_data) {
211 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
212 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800213 http_response.size(),
214 NULL);
Darin Petkovedc522e2010-11-05 09:35:17 -0700215 if (fail_http_response_code >= 0) {
216 fetcher->FailTransfer(fail_http_response_code);
217 }
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800218 MockSystemState mock_system_state;
219 if (prefs)
220 mock_system_state.set_prefs(prefs);
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700221 mock_system_state.set_request_params(&params);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800222 OmahaRequestAction action(&mock_system_state,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700223 NULL,
Thieu Le116fda32011-04-19 11:01:54 -0700224 fetcher,
Darin Petkov265f2902011-05-09 15:17:40 -0700225 ping_only);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700226 OmahaRequestActionTestProcessorDelegate delegate;
227 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700228 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700229
Darin Petkov6a5b3222010-07-13 14:55:28 -0700230 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700231 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700232 processor.EnqueueAction(&action);
233
234 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700235 BondActions(&action, &collector_action);
236 processor.EnqueueAction(&collector_action);
237
238 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
239 g_main_loop_run(loop);
240 g_main_loop_unref(loop);
241 if (collector_action.has_input_object_ && out_response)
242 *out_response = collector_action.omaha_response_;
243 if (out_post_data)
244 *out_post_data = fetcher->post_data();
245 return collector_action.has_input_object_;
246}
247
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700248// Tests Event requests -- they should always succeed. |out_post_data|
249// may be null; if non-null, the post-data received by the mock
250// HttpFetcher is returned.
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700251void TestEvent(OmahaRequestParams params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700252 OmahaEvent* event,
253 const string& http_response,
254 vector<char>* out_post_data) {
255 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
256 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800257 http_response.size(),
258 NULL);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800259 MockSystemState mock_system_state;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700260 mock_system_state.set_request_params(&params);
261 OmahaRequestAction action(&mock_system_state, event, fetcher, false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700262 OmahaRequestActionTestProcessorDelegate delegate;
263 delegate.loop_ = loop;
264 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700265 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700266 processor.EnqueueAction(&action);
267
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700268 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
269 g_main_loop_run(loop);
270 g_main_loop_unref(loop);
271 if (out_post_data)
272 *out_post_data = fetcher->post_data();
273}
274
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700276 OmahaResponse response;
277 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700278 TestUpdateCheck(NULL, // prefs
279 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700280 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700281 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700282 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700283 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700284 &response,
285 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700286 EXPECT_FALSE(response.update_exists);
287}
288
289TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700290 OmahaResponse response;
291 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700292 TestUpdateCheck(NULL, // prefs
293 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700294 GetUpdateResponse(OmahaRequestParams::kAppId,
295 "1.2.3.4", // version
296 "http://more/info",
297 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700298 "http://code/base/", // dl url
299 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700300 "HASH1234=", // checksum
301 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700302 "123", // size
303 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700304 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700305 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700306 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700307 &response,
308 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700309 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -0700310 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700311 EXPECT_EQ("1.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800312 EXPECT_EQ("http://code/base/file.signed", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700313 EXPECT_EQ("http://more/info", response.more_info_url);
314 EXPECT_EQ("HASH1234=", response.hash);
315 EXPECT_EQ(123, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700316 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700317 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700318}
319
Jay Srinivasan0a708742012-03-20 11:26:12 -0700320TEST(OmahaRequestActionTest, ValidUpdateBlockedByPolicyTest) {
321 OmahaResponse response;
322 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700323 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700324 ASSERT_FALSE(
325 TestUpdateCheck(NULL, // prefs
326 params,
327 GetUpdateResponse(OmahaRequestParams::kAppId,
328 "1.2.3.4", // version
329 "http://more/info",
330 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700331 "http://code/base/", // dl url
332 "file.signed", // file name
Jay Srinivasan0a708742012-03-20 11:26:12 -0700333 "HASH1234=", // checksum
334 "false", // needs admin
335 "123", // size
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700336 ""), // deadline
Jay Srinivasan0a708742012-03-20 11:26:12 -0700337 -1,
338 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700339 kErrorCodeOmahaUpdateIgnoredPerPolicy,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700340 &response,
341 NULL));
342 EXPECT_FALSE(response.update_exists);
343}
344
Jay Srinivasan0a708742012-03-20 11:26:12 -0700345TEST(OmahaRequestActionTest, NoUpdatesSentWhenBlockedByPolicyTest) {
346 OmahaResponse response;
347 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700348 params.set_update_disabled(true);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700349 ASSERT_TRUE(
350 TestUpdateCheck(NULL, // prefs
351 params,
352 GetNoUpdateResponse(OmahaRequestParams::kAppId),
353 -1,
354 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700355 kErrorCodeSuccess,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700356 &response,
357 NULL));
358 EXPECT_FALSE(response.update_exists);
359}
360
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700361TEST(OmahaRequestActionTest, WallClockBasedWaitAloneCausesScattering) {
362 OmahaResponse response;
363 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700364 params.set_wall_clock_based_wait_enabled(true);
365 params.set_update_check_count_wait_enabled(false);
366 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700367
368 string prefs_dir;
369 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
370 &prefs_dir));
371 ScopedDirRemover temp_dir_remover(prefs_dir);
372
373 Prefs prefs;
374 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
375 << "Failed to initialize preferences.";
376
377 ASSERT_FALSE(
378 TestUpdateCheck(&prefs, // prefs
379 params,
380 GetUpdateResponse2(OmahaRequestParams::kAppId,
381 "1.2.3.4", // version
382 "http://more/info",
383 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700384 "http://code/base/", // dl url
385 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700386 "HASH1234=", // checksum
387 "false", // needs admin
388 "123", // size
389 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700390 "7"), // max days to scatter
391 -1,
392 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700393 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700394 &response,
395 NULL));
396 EXPECT_FALSE(response.update_exists);
397}
398
399TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
400 OmahaResponse response;
401 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700402 params.set_wall_clock_based_wait_enabled(false);
403 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700404
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700405 params.set_update_check_count_wait_enabled(true);
406 params.set_min_update_checks_needed(1);
407 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700408
409 string prefs_dir;
410 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
411 &prefs_dir));
412 ScopedDirRemover temp_dir_remover(prefs_dir);
413
414 Prefs prefs;
415 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
416 << "Failed to initialize preferences.";
417
418 ASSERT_TRUE(
419 TestUpdateCheck(&prefs, // prefs
420 params,
421 GetUpdateResponse2(OmahaRequestParams::kAppId,
422 "1.2.3.4", // version
423 "http://more/info",
424 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700425 "http://code/base/", // dl url
426 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700427 "HASH1234=", // checksum
428 "false", // needs admin
429 "123", // size
430 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700431 "7"), // max days to scatter
432 -1,
433 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700434 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700435 &response,
436 NULL));
437 EXPECT_TRUE(response.update_exists);
438}
439
440TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
441 OmahaResponse response;
442 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700443 params.set_wall_clock_based_wait_enabled(true);
444 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700445
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700446 params.set_update_check_count_wait_enabled(true);
447 params.set_min_update_checks_needed(1);
448 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700449
450 string prefs_dir;
451 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
452 &prefs_dir));
453 ScopedDirRemover temp_dir_remover(prefs_dir);
454
455 Prefs prefs;
456 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
457 << "Failed to initialize preferences.";
458
459 ASSERT_TRUE(
460 TestUpdateCheck(&prefs, // prefs
461 params,
462 GetUpdateResponse2(OmahaRequestParams::kAppId,
463 "1.2.3.4", // version
464 "http://more/info",
465 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700466 "http://code/base/", // dl url
467 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700468 "HASH1234=", // checksum
469 "false", // needs admin
470 "123", // size
471 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700472 "0"), // max days to scatter
473 -1,
474 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700475 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700476 &response,
477 NULL));
478 EXPECT_TRUE(response.update_exists);
479}
480
481
482TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
483 OmahaResponse response;
484 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700485 params.set_wall_clock_based_wait_enabled(true);
486 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700487
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700488 params.set_update_check_count_wait_enabled(true);
489 params.set_min_update_checks_needed(0);
490 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700491
492 string prefs_dir;
493 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
494 &prefs_dir));
495 ScopedDirRemover temp_dir_remover(prefs_dir);
496
497 Prefs prefs;
498 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
499 << "Failed to initialize preferences.";
500
501 ASSERT_TRUE(TestUpdateCheck(
502 &prefs, // prefs
503 params,
504 GetUpdateResponse2(OmahaRequestParams::kAppId,
505 "1.2.3.4", // version
506 "http://more/info",
507 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700508 "http://code/base/", // dl url
509 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700510 "HASH1234=", // checksum
511 "false", // needs admin
512 "123", // size
513 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700514 "7"), // max days to scatter
515 -1,
516 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700517 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700518 &response,
519 NULL));
520
521 int64 count;
522 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
523 ASSERT_TRUE(count == 0);
524 EXPECT_TRUE(response.update_exists);
525}
526
527TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
528 OmahaResponse response;
529 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700530 params.set_wall_clock_based_wait_enabled(true);
531 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700532
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700533 params.set_update_check_count_wait_enabled(true);
534 params.set_min_update_checks_needed(1);
535 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700536
537 string prefs_dir;
538 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
539 &prefs_dir));
540 ScopedDirRemover temp_dir_remover(prefs_dir);
541
542 Prefs prefs;
543 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
544 << "Failed to initialize preferences.";
545
546 ASSERT_FALSE(TestUpdateCheck(
547 &prefs, // prefs
548 params,
549 GetUpdateResponse2(OmahaRequestParams::kAppId,
550 "1.2.3.4", // version
551 "http://more/info",
552 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700553 "http://code/base/", // dl url
554 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700555 "HASH1234=", // checksum
556 "false", // needs admin
557 "123", // size
558 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700559 "7"), // max days to scatter
560 -1,
561 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700562 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700563 &response,
564 NULL));
565
566 int64 count;
567 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
568 ASSERT_TRUE(count > 0);
569 EXPECT_FALSE(response.update_exists);
570}
571
572TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
573 OmahaResponse response;
574 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700575 params.set_wall_clock_based_wait_enabled(true);
576 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700577
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700578 params.set_update_check_count_wait_enabled(true);
579 params.set_min_update_checks_needed(1);
580 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700581
582 string prefs_dir;
583 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
584 &prefs_dir));
585 ScopedDirRemover temp_dir_remover(prefs_dir);
586
587 Prefs prefs;
588 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
589 << "Failed to initialize preferences.";
590
591 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
592
593 ASSERT_FALSE(TestUpdateCheck(
594 &prefs, // prefs
595 params,
596 GetUpdateResponse2(OmahaRequestParams::kAppId,
597 "1.2.3.4", // version
598 "http://more/info",
599 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700600 "http://code/base/", // dl url
601 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700602 "HASH1234=", // checksum
603 "false", // needs admin
604 "123", // size
605 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700606 "7"), // max days to scatter
607 -1,
608 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700609 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700610 &response,
611 NULL));
612
613 int64 count;
614 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
615 // count remains the same, as the decrementing happens in update_attempter
616 // which this test doesn't exercise.
617 ASSERT_TRUE(count == 5);
618 EXPECT_FALSE(response.update_exists);
619}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700620
Darin Petkov6a5b3222010-07-13 14:55:28 -0700621TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700622 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
623
624 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
625
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800626 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700627 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700628 mock_system_state.set_request_params(&params);
629 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700630 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800631 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700632 NULL),
633 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700634 OmahaRequestActionTestProcessorDelegate delegate;
635 delegate.loop_ = loop;
636 ActionProcessor processor;
637 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700638 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700639
640 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
641 g_main_loop_run(loop);
642 g_main_loop_unref(loop);
643 EXPECT_FALSE(processor.IsRunning());
644}
645
646TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700647 OmahaResponse response;
648 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700649 TestUpdateCheck(NULL, // prefs
650 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700651 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700652 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700653 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700654 kErrorCodeOmahaRequestXMLParseError,
Darin Petkovedc522e2010-11-05 09:35:17 -0700655 &response,
656 NULL));
657 EXPECT_FALSE(response.update_exists);
658}
659
660TEST(OmahaRequestActionTest, EmptyResponseTest) {
661 OmahaResponse response;
662 ASSERT_FALSE(
663 TestUpdateCheck(NULL, // prefs
664 kDefaultTestParams,
665 "",
666 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700667 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700668 kErrorCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700669 &response,
670 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700671 EXPECT_FALSE(response.update_exists);
672}
673
674TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700675 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700676 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700677 NULL, // prefs
678 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700679 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
680 "<daystart elapsed_seconds=\"100\"/>"
681 "<app appid=\"foo\" status=\"ok\">"
682 "<ping status=\"ok\"/>"
683 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700684 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700685 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700686 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700687 &response,
688 NULL));
689 EXPECT_FALSE(response.update_exists);
690}
691
692TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700693 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700694 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700695 NULL, // prefs
696 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700697 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
698 "<daystart elapsed_seconds=\"100\"/>"
699 "<app appid=\"foo\" status=\"ok\">"
700 "<ping status=\"ok\"/>"
701 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700702 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700703 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700704 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700705 &response,
706 NULL));
707 EXPECT_FALSE(response.update_exists);
708}
709
710TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700711 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700712 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700713 NULL, // prefs
714 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700715 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
716 "<daystart elapsed_seconds=\"100\"/>"
717 "<app appid=\"foo\" status=\"ok\">"
718 "<ping status=\"ok\"/>"
719 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700720 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700721 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700722 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700723 &response,
724 NULL));
725 EXPECT_FALSE(response.update_exists);
726}
727
728TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700729 string input_response =
730 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
731 "<daystart elapsed_seconds=\"100\"/>"
732 "<app appid=\"xyz\" status=\"ok\">"
733 "<updatecheck status=\"ok\">"
734 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700735 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700736 "<packages><package hash=\"not-used\" name=\"f\" "
737 "size=\"587\"/></packages>"
738 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700739 "ChromeOSVersion=\"10.2.3.4\" "
740 "Prompt=\"false\" "
741 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800742 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700743 "sha256=\"lkq34j5345\" "
744 "needsadmin=\"true\" "
745 "/></actions></manifest></updatecheck></app></response>";
746 LOG(INFO) << "Input Response = " << input_response;
747
Darin Petkov6a5b3222010-07-13 14:55:28 -0700748 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700749 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
750 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700751 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700752 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700753 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700754 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700755 &response,
756 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700757 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700758 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800759 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700760 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700761 EXPECT_EQ("lkq34j5345", response.hash);
762 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700763 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700764 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700765}
766
767namespace {
768class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
769 public:
770 void ProcessingStopped(const ActionProcessor* processor) {
771 ASSERT_TRUE(loop_);
772 g_main_loop_quit(loop_);
773 }
774 GMainLoop *loop_;
775};
776
777gboolean TerminateTransferTestStarter(gpointer data) {
778 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
779 processor->StartProcessing();
780 CHECK(processor->IsRunning());
781 processor->StopProcessing();
782 return FALSE;
783}
784} // namespace {}
785
786TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700787 string http_response("doesn't matter");
788 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
789
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800790 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700791 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700792 mock_system_state.set_request_params(&params);
793 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700794 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800795 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700796 NULL),
797 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700798 TerminateEarlyTestProcessorDelegate delegate;
799 delegate.loop_ = loop;
800 ActionProcessor processor;
801 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700802 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700803
804 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
805 g_main_loop_run(loop);
806 g_main_loop_unref(loop);
807}
808
809TEST(OmahaRequestActionTest, XmlEncodeTest) {
810 EXPECT_EQ("ab", XmlEncode("ab"));
811 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
812 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
813 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
814 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
815
816 vector<char> post_data;
817
818 // Make sure XML Encode is being called on the params
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700819 MockSystemState mock_system_state;
820 OmahaRequestParams params(&mock_system_state,
821 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700822 OmahaRequestParams::kOsVersion,
823 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700824 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700825 OmahaRequestParams::kAppId,
826 "0.1.0.0",
827 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700828 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700829 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -0700830 "ChromeOSFirmware.1.0",
831 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700832 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800833 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700834 "http://url",
835 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700836 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700837 OmahaResponse response;
838 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700839 TestUpdateCheck(NULL, // prefs
840 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700841 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700842 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700843 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700844 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700845 &response,
846 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700847 // convert post_data to string
848 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700849 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
850 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700851 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
852 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
853 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
854 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700855 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
856 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700857}
858
859TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700860 OmahaResponse response;
861 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700862 TestUpdateCheck(NULL, // prefs
863 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700864 GetUpdateResponse(OmahaRequestParams::kAppId,
865 "1.2.3.4", // version
866 "testthe&lt;url", // more info
867 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700868 "testthe&amp;codebase/", // dl url
869 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700870 "HASH1234=", // checksum
871 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700872 "123", // size
873 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700874 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700875 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700876 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700877 &response,
878 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700879
880 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800881 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700882 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700883}
884
885TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700886 OmahaResponse response;
887 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700888 TestUpdateCheck(NULL, // prefs
889 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700890 GetUpdateResponse(OmahaRequestParams::kAppId,
891 "1.2.3.4", // version
892 "theurl", // more info
893 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700894 "thecodebase/", // dl url
895 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700896 "HASH1234=", // checksum
897 "false", // needs admin
898 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700899 "123123123123123", // size
900 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700901 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700902 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700903 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700904 &response,
905 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700906
907 EXPECT_EQ(response.size, 123123123123123ll);
908}
909
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700910TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
911 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800912 NiceMock<PrefsMock> prefs;
913 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
914 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700915 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -0800916 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700917 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700918 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700919 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700920 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700921 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700922 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700923 &post_data));
924 // convert post_data to string
925 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700926 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700927 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700928 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700929 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700930 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
931 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -0700932 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
933 string::npos);
934 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
935 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700936}
937
Jay Srinivasan0a708742012-03-20 11:26:12 -0700938
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700939TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -0800940 vector<char> post_data;
941 NiceMock<PrefsMock> prefs;
942 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -0700943 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700944 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -0700945 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700946 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -0800947 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -0700948 params,
Darin Petkov95508da2011-01-05 12:42:29 -0800949 "invalid xml>",
950 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700951 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700952 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov95508da2011-01-05 12:42:29 -0800953 NULL, // response
954 &post_data));
955 // convert post_data to string
956 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700957 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700958 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700959 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700960 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800961 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
962 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -0700963 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
964 string::npos);
965 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
966 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -0800967}
968
Darin Petkove17f86b2010-07-20 09:12:01 -0700969TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
970 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700971 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700972 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
973 "invalid xml>",
974 &post_data);
975 // convert post_data to string
976 string post_str(&post_data[0], post_data.size());
977 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700978 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700979 OmahaEvent::kTypeUpdateDownloadStarted,
980 OmahaEvent::kResultSuccess);
981 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700982 EXPECT_EQ(post_str.find("ping"), string::npos);
983 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700984}
985
986TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
987 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700988 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700989 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
990 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -0700991 kErrorCodeError),
Darin Petkove17f86b2010-07-20 09:12:01 -0700992 "invalid xml>",
993 &post_data);
994 // convert post_data to string
995 string post_str(&post_data[0], post_data.size());
996 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700997 " <event eventtype=\"%d\" eventresult=\"%d\" "
998 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -0700999 OmahaEvent::kTypeDownloadComplete,
1000 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001001 kErrorCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001002 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001003 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001004}
1005
1006TEST(OmahaRequestActionTest, IsEventTest) {
1007 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001008 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001009 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001010 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001011 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001012 &mock_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001013 NULL,
1014 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001015 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001016 NULL),
1017 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001018 EXPECT_FALSE(update_check_action.IsEvent());
1019
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001020 params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001021 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001022 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001023 &mock_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001024 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001025 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001026 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001027 NULL),
1028 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001029 EXPECT_TRUE(event_action.IsEvent());
1030}
1031
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001032TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1033 for (int i = 0; i < 2; i++) {
1034 bool delta_okay = i == 1;
1035 const char* delta_okay_str = delta_okay ? "true" : "false";
1036 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001037 MockSystemState mock_system_state;
1038 OmahaRequestParams params(&mock_system_state,
1039 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001040 OmahaRequestParams::kOsVersion,
1041 "service_pack",
1042 "x86-generic",
1043 OmahaRequestParams::kAppId,
1044 "0.1.0.0",
1045 "en-US",
1046 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001047 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001048 "ChromeOSFirmware.1.0",
1049 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001050 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001051 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001052 "http://url",
1053 false, // update_disabled
1054 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001055 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1056 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001057 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001058 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001059 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001060 kErrorCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001061 NULL,
1062 &post_data));
1063 // convert post_data to string
1064 string post_str(&post_data[0], post_data.size());
1065 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1066 string::npos)
1067 << "i = " << i;
1068 }
1069}
1070
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001071TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1072 for (int i = 0; i < 2; i++) {
1073 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001074 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001075 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001076 MockSystemState mock_system_state;
1077 OmahaRequestParams params(&mock_system_state,
1078 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001079 OmahaRequestParams::kOsVersion,
1080 "service_pack",
1081 "x86-generic",
1082 OmahaRequestParams::kAppId,
1083 "0.1.0.0",
1084 "en-US",
1085 "unittest_track",
1086 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001087 "ChromeOSFirmware.1.0",
1088 "EC100",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001089 true, // delta_okay
1090 interactive,
1091 "http://url",
1092 false, // update_disabled
1093 ""); // target_version_prefix
1094 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1095 params,
1096 "invalid xml>",
1097 -1,
1098 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001099 kErrorCodeOmahaRequestXMLParseError,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001100 NULL,
1101 &post_data));
1102 // convert post_data to string
1103 string post_str(&post_data[0], post_data.size());
Gilad Arnold8a659d82013-01-24 11:26:00 -08001104 EXPECT_NE(post_str.find(StringPrintf("installsource=\"%s\"",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001105 interactive_str)),
1106 string::npos)
1107 << "i = " << i;
1108 }
1109}
1110
Darin Petkove17f86b2010-07-20 09:12:01 -07001111TEST(OmahaRequestActionTest, OmahaEventTest) {
1112 OmahaEvent default_event;
1113 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1114 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001115 EXPECT_EQ(kErrorCodeError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001116
1117 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1118 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1119 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001120 EXPECT_EQ(kErrorCodeSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001121
1122 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1123 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001124 kErrorCodeError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001125 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1126 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001127 EXPECT_EQ(kErrorCodeError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001128}
1129
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001130TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001131 for (int ping_only = 0; ping_only < 2; ping_only++) {
1132 NiceMock<PrefsMock> prefs;
1133 // Add a few hours to the day difference to test no rounding, etc.
1134 int64_t five_days_ago =
1135 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1136 int64_t six_days_ago =
1137 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1138 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1139 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1140 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1141 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1142 vector<char> post_data;
1143 ASSERT_TRUE(
1144 TestUpdateCheck(&prefs,
1145 kDefaultTestParams,
1146 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1147 -1,
1148 ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -07001149 kErrorCodeSuccess,
Darin Petkov265f2902011-05-09 15:17:40 -07001150 NULL,
1151 &post_data));
1152 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001153 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001154 string::npos);
1155 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001156 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001157 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1158 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001159 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001160 EXPECT_NE(post_str.find("previousversion"), string::npos);
1161 }
1162 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001163}
1164
1165TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001166 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001167 int64_t three_days_ago =
1168 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1169 int64_t now = Time::Now().ToInternalValue();
1170 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1171 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1172 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1173 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1174 vector<char> post_data;
1175 ASSERT_TRUE(
1176 TestUpdateCheck(&prefs,
1177 kDefaultTestParams,
1178 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001179 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001180 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001181 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001182 NULL,
1183 &post_data));
1184 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001185 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001186 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001187}
1188
1189TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001190 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001191 int64_t four_days_ago =
1192 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1193 int64_t now = Time::Now().ToInternalValue();
1194 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1195 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1196 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1197 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1198 vector<char> post_data;
1199 ASSERT_TRUE(
1200 TestUpdateCheck(&prefs,
1201 kDefaultTestParams,
1202 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001203 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001204 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001205 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001206 NULL,
1207 &post_data));
1208 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001209 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001210 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001211}
1212
1213TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001214 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001215 int64_t one_hour_ago =
1216 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1217 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1218 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1219 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1220 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1221 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1222 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1223 vector<char> post_data;
1224 ASSERT_TRUE(
1225 TestUpdateCheck(&prefs,
1226 kDefaultTestParams,
1227 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001228 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001229 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001230 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001231 NULL,
1232 &post_data));
1233 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001234 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001235}
1236
Thieu Leb44e9e82011-06-06 14:34:04 -07001237TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1238 // This test ensures that we ignore empty ping only requests.
1239 NiceMock<PrefsMock> prefs;
1240 int64_t now = Time::Now().ToInternalValue();
1241 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1242 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1243 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1244 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1245 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1246 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1247 vector<char> post_data;
1248 EXPECT_TRUE(
1249 TestUpdateCheck(&prefs,
1250 kDefaultTestParams,
1251 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1252 -1,
1253 true, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001254 kErrorCodeSuccess,
Thieu Leb44e9e82011-06-06 14:34:04 -07001255 NULL,
1256 &post_data));
1257 EXPECT_EQ(post_data.size(), 0);
1258}
1259
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001260TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001261 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001262 int64_t future =
1263 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1264 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1265 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1266 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1267 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1268 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1269 .WillOnce(Return(true));
1270 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1271 .WillOnce(Return(true));
1272 vector<char> post_data;
1273 ASSERT_TRUE(
1274 TestUpdateCheck(&prefs,
1275 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001276 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1277 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001278 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001279 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001280 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001281 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001282 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001283 NULL,
1284 &post_data));
1285 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001286 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001287}
1288
1289TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1290 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001291 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001292 // may fail if it runs for longer than 5 seconds. It shouldn't run
1293 // that long though.
1294 int64_t midnight =
1295 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1296 int64_t midnight_slack =
1297 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001298 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001299 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1300 AllOf(Ge(midnight), Le(midnight_slack))))
1301 .WillOnce(Return(true));
1302 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1303 AllOf(Ge(midnight), Le(midnight_slack))))
1304 .WillOnce(Return(true));
1305 ASSERT_TRUE(
1306 TestUpdateCheck(&prefs,
1307 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001308 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1309 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001310 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001311 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001312 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001313 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001314 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001315 NULL,
1316 NULL));
1317}
1318
1319TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001320 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001321 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1322 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1323 ASSERT_TRUE(
1324 TestUpdateCheck(&prefs,
1325 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001326 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1327 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001328 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001329 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001330 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001331 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001332 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001333 NULL,
1334 NULL));
1335}
1336
1337TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001338 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001339 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1340 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1341 ASSERT_TRUE(
1342 TestUpdateCheck(&prefs,
1343 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001344 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1345 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001346 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001347 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001348 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001349 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001350 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001351 NULL,
1352 NULL));
1353}
1354
Darin Petkov84c763c2010-07-29 16:27:58 -07001355TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1356 vector<char> post_data;
1357 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1358 kDefaultTestParams,
1359 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001360 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001361 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001362 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001363 NULL, // response
1364 &post_data));
1365 // convert post_data to string
1366 string post_str(&post_data[0], post_data.size());
1367 EXPECT_EQ(post_str.find("machineid="), string::npos);
1368 EXPECT_EQ(post_str.find("userid="), string::npos);
1369}
1370
Darin Petkovedc522e2010-11-05 09:35:17 -07001371TEST(OmahaRequestActionTest, NetworkFailureTest) {
1372 OmahaResponse response;
1373 ASSERT_FALSE(
1374 TestUpdateCheck(NULL, // prefs
1375 kDefaultTestParams,
1376 "",
1377 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001378 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001379 static_cast<ErrorCode>(
1380 kErrorCodeOmahaRequestHTTPResponseBase + 501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001381 &response,
1382 NULL));
1383 EXPECT_FALSE(response.update_exists);
1384}
1385
1386TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1387 OmahaResponse response;
1388 ASSERT_FALSE(
1389 TestUpdateCheck(NULL, // prefs
1390 kDefaultTestParams,
1391 "",
1392 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001393 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001394 static_cast<ErrorCode>(
1395 kErrorCodeOmahaRequestHTTPResponseBase + 999),
Darin Petkovedc522e2010-11-05 09:35:17 -07001396 &response,
1397 NULL));
1398 EXPECT_FALSE(response.update_exists);
1399}
1400
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001401TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1402 OmahaResponse response;
1403 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001404 params.set_wall_clock_based_wait_enabled(true);
1405 params.set_waiting_period(TimeDelta().FromDays(1));
1406 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001407
1408 string prefs_dir;
1409 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1410 &prefs_dir));
1411 ScopedDirRemover temp_dir_remover(prefs_dir);
1412
1413 Prefs prefs;
1414 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1415 << "Failed to initialize preferences.";
1416
1417 ASSERT_FALSE(TestUpdateCheck(
1418 &prefs, // prefs
1419 params,
1420 GetUpdateResponse2(OmahaRequestParams::kAppId,
1421 "1.2.3.4", // version
1422 "http://more/info",
1423 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001424 "http://code/base/", // dl url
1425 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001426 "HASH1234=", // checksum
1427 "false", // needs admin
1428 "123", // size
1429 "", // deadline
1430 "7"), // max days to scatter
1431 -1,
1432 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001433 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001434 &response,
1435 NULL));
1436
1437 int64 timestamp = 0;
1438 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1439 ASSERT_TRUE(timestamp > 0);
1440 EXPECT_FALSE(response.update_exists);
1441}
1442
1443TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1444 OmahaResponse response;
1445 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001446 params.set_wall_clock_based_wait_enabled(true);
1447 params.set_waiting_period(TimeDelta().FromDays(1));
1448 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001449
1450 string prefs_dir;
1451 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1452 &prefs_dir));
1453 ScopedDirRemover temp_dir_remover(prefs_dir);
1454
1455 Prefs prefs;
1456 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1457 << "Failed to initialize preferences.";
1458
1459 // Set the timestamp to a very old value such that it exceeds the
1460 // waiting period set above.
1461 Time t1;
1462 Time::FromString("1/1/2012", &t1);
1463 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1464 ASSERT_TRUE(TestUpdateCheck(
1465 &prefs, // prefs
1466 params,
1467 GetUpdateResponse2(OmahaRequestParams::kAppId,
1468 "1.2.3.4", // version
1469 "http://more/info",
1470 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001471 "http://code/base/", // dl url
1472 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001473 "HASH1234=", // checksum
1474 "false", // needs admin
1475 "123", // size
1476 "", // deadline
1477 "7"), // max days to scatter
1478 -1,
1479 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001480 kErrorCodeSuccess,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001481 &response,
1482 NULL));
1483
1484 EXPECT_TRUE(response.update_exists);
1485
1486 // Make sure the timestamp t1 is unchanged showing that it was reused.
1487 int64 timestamp = 0;
1488 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1489 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1490}
1491
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001492TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001493 // Create a uniquely named test directory.
1494 string test_dir;
1495 ASSERT_TRUE(utils::MakeTempDirectory(
1496 "omaha_request_action-test-XXXXXX", &test_dir));
1497
1498 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1499 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001500 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001501 vector<char> post_data;
1502 NiceMock<PrefsMock> prefs;
1503 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001504 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001505 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1506 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1507 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1508 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001509 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001510 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1511 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1512 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001513 params.set_root(string("./") + test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001514 params.SetLockDown(false);
1515 params.Init("1.2.3.4", "", 0);
1516 EXPECT_EQ("canary-channel", params.current_channel());
1517 EXPECT_EQ("stable-channel", params.target_channel());
1518 EXPECT_TRUE(params.to_more_stable_channel());
1519 EXPECT_TRUE(params.is_powerwash_allowed());
1520 ASSERT_FALSE(TestUpdateCheck(&prefs,
1521 params,
1522 "invalid xml>",
1523 -1,
1524 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001525 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001526 NULL, // response
1527 &post_data));
1528 // convert post_data to string
1529 string post_str(&post_data[0], post_data.size());
1530 EXPECT_NE(string::npos, post_str.find(
1531 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1532 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1533 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001534
1535 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001536}
1537
1538TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001539 // Create a uniquely named test directory.
1540 string test_dir;
1541 ASSERT_TRUE(utils::MakeTempDirectory(
1542 "omaha_request_action-test-XXXXXX", &test_dir));
1543
1544 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1545 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001546 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001547 vector<char> post_data;
1548 NiceMock<PrefsMock> prefs;
1549 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001550 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001551 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1552 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1553 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1554 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001555 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001556 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1557 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001558 params.set_root(string("./") + test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001559 params.SetLockDown(false);
1560 params.Init("5.6.7.8", "", 0);
1561 EXPECT_EQ("stable-channel", params.current_channel());
1562 EXPECT_EQ("canary-channel", params.target_channel());
1563 EXPECT_FALSE(params.to_more_stable_channel());
1564 EXPECT_FALSE(params.is_powerwash_allowed());
1565 ASSERT_FALSE(TestUpdateCheck(&prefs,
1566 params,
1567 "invalid xml>",
1568 -1,
1569 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001570 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001571 NULL, // response
1572 &post_data));
1573 // convert post_data to string
1574 string post_str(&post_data[0], post_data.size());
1575 EXPECT_NE(string::npos, post_str.find(
1576 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1577 "version=\"5.6.7.8\" "
1578 "track=\"canary-channel\" from_track=\"stable-channel\""));
1579 EXPECT_EQ(string::npos, post_str.find( "from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001580
1581 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001582}
1583
Darin Petkov6a5b3222010-07-13 14:55:28 -07001584} // namespace chromeos_update_engine