blob: cb305f7e33cb6b51eb2887ca632fb2856cefc94a [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);
Chris Sosa968d0572013-08-23 14:46:02 -0700397
398 // Verify if we are interactive check we don't defer.
399 params.set_interactive(true);
400 ASSERT_TRUE(
401 TestUpdateCheck(&prefs, // prefs
402 params,
403 GetUpdateResponse2(OmahaRequestParams::kAppId,
404 "1.2.3.4", // version
405 "http://more/info",
406 "true", // prompt
407 "http://code/base/", // dl url
408 "file.signed", // file name
409 "HASH1234=", // checksum
410 "false", // needs admin
411 "123", // size
412 "", // deadline
413 "7"), // max days to scatter
414 -1,
415 false, // ping_only
416 kErrorCodeSuccess,
417 &response,
418 NULL));
419 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700420}
421
422TEST(OmahaRequestActionTest, NoWallClockBasedWaitCausesNoScattering) {
423 OmahaResponse response;
424 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700425 params.set_wall_clock_based_wait_enabled(false);
426 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700427
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700428 params.set_update_check_count_wait_enabled(true);
429 params.set_min_update_checks_needed(1);
430 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700431
432 string prefs_dir;
433 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
434 &prefs_dir));
435 ScopedDirRemover temp_dir_remover(prefs_dir);
436
437 Prefs prefs;
438 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
439 << "Failed to initialize preferences.";
440
441 ASSERT_TRUE(
442 TestUpdateCheck(&prefs, // prefs
443 params,
444 GetUpdateResponse2(OmahaRequestParams::kAppId,
445 "1.2.3.4", // version
446 "http://more/info",
447 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700448 "http://code/base/", // dl url
449 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700450 "HASH1234=", // checksum
451 "false", // needs admin
452 "123", // size
453 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700454 "7"), // max days to scatter
455 -1,
456 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700457 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700458 &response,
459 NULL));
460 EXPECT_TRUE(response.update_exists);
461}
462
463TEST(OmahaRequestActionTest, ZeroMaxDaysToScatterCausesNoScattering) {
464 OmahaResponse response;
465 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700466 params.set_wall_clock_based_wait_enabled(true);
467 params.set_waiting_period(TimeDelta::FromDays(2));
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700468
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700469 params.set_update_check_count_wait_enabled(true);
470 params.set_min_update_checks_needed(1);
471 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700472
473 string prefs_dir;
474 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
475 &prefs_dir));
476 ScopedDirRemover temp_dir_remover(prefs_dir);
477
478 Prefs prefs;
479 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
480 << "Failed to initialize preferences.";
481
482 ASSERT_TRUE(
483 TestUpdateCheck(&prefs, // prefs
484 params,
485 GetUpdateResponse2(OmahaRequestParams::kAppId,
486 "1.2.3.4", // version
487 "http://more/info",
488 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700489 "http://code/base/", // dl url
490 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700491 "HASH1234=", // checksum
492 "false", // needs admin
493 "123", // size
494 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700495 "0"), // max days to scatter
496 -1,
497 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700498 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700499 &response,
500 NULL));
501 EXPECT_TRUE(response.update_exists);
502}
503
504
505TEST(OmahaRequestActionTest, ZeroUpdateCheckCountCausesNoScattering) {
506 OmahaResponse response;
507 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700508 params.set_wall_clock_based_wait_enabled(true);
509 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700510
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700511 params.set_update_check_count_wait_enabled(true);
512 params.set_min_update_checks_needed(0);
513 params.set_max_update_checks_allowed(0);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700514
515 string prefs_dir;
516 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
517 &prefs_dir));
518 ScopedDirRemover temp_dir_remover(prefs_dir);
519
520 Prefs prefs;
521 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
522 << "Failed to initialize preferences.";
523
524 ASSERT_TRUE(TestUpdateCheck(
525 &prefs, // prefs
526 params,
527 GetUpdateResponse2(OmahaRequestParams::kAppId,
528 "1.2.3.4", // version
529 "http://more/info",
530 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700531 "http://code/base/", // dl url
532 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700533 "HASH1234=", // checksum
534 "false", // needs admin
535 "123", // size
536 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700537 "7"), // max days to scatter
538 -1,
539 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700540 kErrorCodeSuccess,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700541 &response,
542 NULL));
543
544 int64 count;
545 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
546 ASSERT_TRUE(count == 0);
547 EXPECT_TRUE(response.update_exists);
548}
549
550TEST(OmahaRequestActionTest, NonZeroUpdateCheckCountCausesScattering) {
551 OmahaResponse response;
552 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700553 params.set_wall_clock_based_wait_enabled(true);
554 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700555
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700556 params.set_update_check_count_wait_enabled(true);
557 params.set_min_update_checks_needed(1);
558 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700559
560 string prefs_dir;
561 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
562 &prefs_dir));
563 ScopedDirRemover temp_dir_remover(prefs_dir);
564
565 Prefs prefs;
566 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
567 << "Failed to initialize preferences.";
568
569 ASSERT_FALSE(TestUpdateCheck(
570 &prefs, // prefs
571 params,
572 GetUpdateResponse2(OmahaRequestParams::kAppId,
573 "1.2.3.4", // version
574 "http://more/info",
575 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700576 "http://code/base/", // dl url
577 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700578 "HASH1234=", // checksum
579 "false", // needs admin
580 "123", // size
581 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700582 "7"), // max days to scatter
583 -1,
584 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700585 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700586 &response,
587 NULL));
588
589 int64 count;
590 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
591 ASSERT_TRUE(count > 0);
592 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700593
594 // Verify if we are interactive check we don't defer.
595 params.set_interactive(true);
596 ASSERT_TRUE(
597 TestUpdateCheck(&prefs, // prefs
598 params,
599 GetUpdateResponse2(OmahaRequestParams::kAppId,
600 "1.2.3.4", // version
601 "http://more/info",
602 "true", // prompt
603 "http://code/base/", // dl url
604 "file.signed", // file name
605 "HASH1234=", // checksum
606 "false", // needs admin
607 "123", // size
608 "", // deadline
609 "7"), // max days to scatter
610 -1,
611 false, // ping_only
612 kErrorCodeSuccess,
613 &response,
614 NULL));
615 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700616}
617
618TEST(OmahaRequestActionTest, ExistingUpdateCheckCountCausesScattering) {
619 OmahaResponse response;
620 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700621 params.set_wall_clock_based_wait_enabled(true);
622 params.set_waiting_period(TimeDelta());
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700623
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700624 params.set_update_check_count_wait_enabled(true);
625 params.set_min_update_checks_needed(1);
626 params.set_max_update_checks_allowed(8);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700627
628 string prefs_dir;
629 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
630 &prefs_dir));
631 ScopedDirRemover temp_dir_remover(prefs_dir);
632
633 Prefs prefs;
634 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
635 << "Failed to initialize preferences.";
636
637 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateCheckCount, 5));
638
639 ASSERT_FALSE(TestUpdateCheck(
640 &prefs, // prefs
641 params,
642 GetUpdateResponse2(OmahaRequestParams::kAppId,
643 "1.2.3.4", // version
644 "http://more/info",
645 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700646 "http://code/base/", // dl url
647 "file.signed", // file name
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700648 "HASH1234=", // checksum
649 "false", // needs admin
650 "123", // size
651 "", // deadline
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700652 "7"), // max days to scatter
653 -1,
654 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700655 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700656 &response,
657 NULL));
658
659 int64 count;
660 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateCheckCount, &count));
661 // count remains the same, as the decrementing happens in update_attempter
662 // which this test doesn't exercise.
663 ASSERT_TRUE(count == 5);
664 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -0700665
666 // Verify if we are interactive check we don't defer.
667 params.set_interactive(true);
668 ASSERT_TRUE(
669 TestUpdateCheck(&prefs, // prefs
670 params,
671 GetUpdateResponse2(OmahaRequestParams::kAppId,
672 "1.2.3.4", // version
673 "http://more/info",
674 "true", // prompt
675 "http://code/base/", // dl url
676 "file.signed", // file name
677 "HASH1234=", // checksum
678 "false", // needs admin
679 "123", // size
680 "", // deadline
681 "7"), // max days to scatter
682 -1,
683 false, // ping_only
684 kErrorCodeSuccess,
685 &response,
686 NULL));
687 EXPECT_TRUE(response.update_exists);
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700688}
Jay Srinivasan0a708742012-03-20 11:26:12 -0700689
Darin Petkov6a5b3222010-07-13 14:55:28 -0700690TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700691 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
692
693 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
694
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800695 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700696 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700697 mock_system_state.set_request_params(&params);
698 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700699 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800700 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700701 NULL),
702 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700703 OmahaRequestActionTestProcessorDelegate delegate;
704 delegate.loop_ = loop;
705 ActionProcessor processor;
706 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700707 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700708
709 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
710 g_main_loop_run(loop);
711 g_main_loop_unref(loop);
712 EXPECT_FALSE(processor.IsRunning());
713}
714
715TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700716 OmahaResponse response;
717 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700718 TestUpdateCheck(NULL, // prefs
719 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700720 "invalid xml>",
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 kErrorCodeOmahaRequestXMLParseError,
Darin Petkovedc522e2010-11-05 09:35:17 -0700724 &response,
725 NULL));
726 EXPECT_FALSE(response.update_exists);
727}
728
729TEST(OmahaRequestActionTest, EmptyResponseTest) {
730 OmahaResponse response;
731 ASSERT_FALSE(
732 TestUpdateCheck(NULL, // prefs
733 kDefaultTestParams,
734 "",
735 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700736 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700737 kErrorCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700738 &response,
739 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700740 EXPECT_FALSE(response.update_exists);
741}
742
743TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700744 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700745 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700746 NULL, // prefs
747 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700748 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
749 "<daystart elapsed_seconds=\"100\"/>"
750 "<app appid=\"foo\" status=\"ok\">"
751 "<ping status=\"ok\"/>"
752 "<updatecheck/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700753 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700754 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700755 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700756 &response,
757 NULL));
758 EXPECT_FALSE(response.update_exists);
759}
760
761TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700762 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700763 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700764 NULL, // prefs
765 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700766 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
767 "<daystart elapsed_seconds=\"100\"/>"
768 "<app appid=\"foo\" status=\"ok\">"
769 "<ping status=\"ok\"/>"
770 "<updatecheck status=\"InvalidStatusTest\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700771 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700772 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700773 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700774 &response,
775 NULL));
776 EXPECT_FALSE(response.update_exists);
777}
778
779TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700780 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700781 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700782 NULL, // prefs
783 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700784 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
785 "<daystart elapsed_seconds=\"100\"/>"
786 "<app appid=\"foo\" status=\"ok\">"
787 "<ping status=\"ok\"/>"
788 "</app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700789 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700790 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700791 kErrorCodeOmahaResponseInvalid,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700792 &response,
793 NULL));
794 EXPECT_FALSE(response.update_exists);
795}
796
797TEST(OmahaRequestActionTest, MissingFieldTest) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700798 string input_response =
799 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response protocol=\"3.0\">"
800 "<daystart elapsed_seconds=\"100\"/>"
801 "<app appid=\"xyz\" status=\"ok\">"
802 "<updatecheck status=\"ok\">"
803 "<urls><url codebase=\"http://missing/field/test/\"/></urls>"
Chris Sosa3b748432013-06-20 16:42:59 -0700804 "<manifest version=\"10.2.3.4\">"
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700805 "<packages><package hash=\"not-used\" name=\"f\" "
806 "size=\"587\"/></packages>"
807 "<actions><action event=\"postinstall\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700808 "ChromeOSVersion=\"10.2.3.4\" "
809 "Prompt=\"false\" "
810 "IsDelta=\"true\" "
Jay Srinivasand671e972013-01-11 17:17:19 -0800811 "IsDeltaPayload=\"false\" "
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700812 "sha256=\"lkq34j5345\" "
813 "needsadmin=\"true\" "
814 "/></actions></manifest></updatecheck></app></response>";
815 LOG(INFO) << "Input Response = " << input_response;
816
Darin Petkov6a5b3222010-07-13 14:55:28 -0700817 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700818 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
819 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700820 input_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700821 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700822 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700823 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700824 &response,
825 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700826 EXPECT_TRUE(response.update_exists);
Chris Sosa3b748432013-06-20 16:42:59 -0700827 EXPECT_EQ("10.2.3.4", response.version);
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800828 EXPECT_EQ("http://missing/field/test/f", response.payload_urls[0]);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700829 EXPECT_EQ("", response.more_info_url);
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700830 EXPECT_EQ("lkq34j5345", response.hash);
831 EXPECT_EQ(587, response.size);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700832 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700833 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700834}
835
836namespace {
837class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
838 public:
839 void ProcessingStopped(const ActionProcessor* processor) {
840 ASSERT_TRUE(loop_);
841 g_main_loop_quit(loop_);
842 }
843 GMainLoop *loop_;
844};
845
846gboolean TerminateTransferTestStarter(gpointer data) {
847 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
848 processor->StartProcessing();
849 CHECK(processor->IsRunning());
850 processor->StopProcessing();
851 return FALSE;
852}
853} // namespace {}
854
855TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700856 string http_response("doesn't matter");
857 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
858
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800859 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700860 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700861 mock_system_state.set_request_params(&params);
862 OmahaRequestAction action(&mock_system_state, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700863 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -0800864 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -0700865 NULL),
866 false);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700867 TerminateEarlyTestProcessorDelegate delegate;
868 delegate.loop_ = loop;
869 ActionProcessor processor;
870 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700871 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700872
873 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
874 g_main_loop_run(loop);
875 g_main_loop_unref(loop);
876}
877
878TEST(OmahaRequestActionTest, XmlEncodeTest) {
879 EXPECT_EQ("ab", XmlEncode("ab"));
880 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
881 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
882 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
883 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
884
885 vector<char> post_data;
886
887 // Make sure XML Encode is being called on the params
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700888 MockSystemState mock_system_state;
889 OmahaRequestParams params(&mock_system_state,
890 OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700891 OmahaRequestParams::kOsVersion,
892 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700893 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700894 OmahaRequestParams::kAppId,
895 "0.1.0.0",
896 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700897 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700898 "<OEM MODEL>",
Chris Sosac1972482013-04-30 22:31:10 -0700899 "ChromeOSFirmware.1.0",
900 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700901 false, // delta okay
Gilad Arnoldbbdd4902013-01-10 16:06:30 -0800902 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -0700903 "http://url",
904 false, // update_disabled
Jay Srinivasan480ddfa2012-06-01 19:15:26 -0700905 ""); // target_version_prefix
Darin Petkov6a5b3222010-07-13 14:55:28 -0700906 OmahaResponse response;
907 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700908 TestUpdateCheck(NULL, // prefs
909 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700910 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700911 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700912 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700913 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700914 &response,
915 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700916 // convert post_data to string
917 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700918 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
919 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700920 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
921 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
922 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
923 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700924 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
925 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700926}
927
928TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700929 OmahaResponse response;
930 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700931 TestUpdateCheck(NULL, // prefs
932 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700933 GetUpdateResponse(OmahaRequestParams::kAppId,
934 "1.2.3.4", // version
935 "testthe&lt;url", // more info
936 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700937 "testthe&amp;codebase/", // dl url
938 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700939 "HASH1234=", // checksum
940 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700941 "123", // size
942 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700943 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700944 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700945 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700946 &response,
947 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700948
949 EXPECT_EQ(response.more_info_url, "testthe<url");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -0800950 EXPECT_EQ(response.payload_urls[0], "testthe&codebase/file.signed");
Darin Petkov6c118642010-10-21 12:06:30 -0700951 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700952}
953
954TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700955 OmahaResponse response;
956 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700957 TestUpdateCheck(NULL, // prefs
958 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700959 GetUpdateResponse(OmahaRequestParams::kAppId,
960 "1.2.3.4", // version
961 "theurl", // more info
962 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700963 "thecodebase/", // dl url
964 "file.signed", // file name
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700965 "HASH1234=", // checksum
966 "false", // needs admin
967 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700968 "123123123123123", // size
969 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700970 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700971 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700972 kErrorCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700973 &response,
974 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700975
976 EXPECT_EQ(response.size, 123123123123123ll);
977}
978
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700979TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
980 vector<char> post_data;
Darin Petkov95508da2011-01-05 12:42:29 -0800981 NiceMock<PrefsMock> prefs;
982 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
983 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700984 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Darin Petkov95508da2011-01-05 12:42:29 -0800985 ASSERT_FALSE(TestUpdateCheck(&prefs,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700986 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700987 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700988 -1,
Darin Petkov265f2902011-05-09 15:17:40 -0700989 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -0700990 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700991 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700992 &post_data));
993 // convert post_data to string
994 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -0700995 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -0700996 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -0700997 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -0700998 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700999 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1000 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001001 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1002 string::npos);
1003 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1004 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001005}
1006
Jay Srinivasan0a708742012-03-20 11:26:12 -07001007
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001008TEST(OmahaRequestActionTest, FormatUpdateDisabledOutputTest) {
Darin Petkov95508da2011-01-05 12:42:29 -08001009 vector<char> post_data;
1010 NiceMock<PrefsMock> prefs;
1011 EXPECT_CALL(prefs, GetString(kPrefsPreviousVersion, _))
Jay Srinivasan0a708742012-03-20 11:26:12 -07001012 .WillOnce(DoAll(SetArgumentPointee<1>(string("")), Return(true)));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001013 EXPECT_CALL(prefs, SetString(kPrefsPreviousVersion, _)).Times(1);
Jay Srinivasan0a708742012-03-20 11:26:12 -07001014 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001015 params.set_update_disabled(true);
Darin Petkov95508da2011-01-05 12:42:29 -08001016 ASSERT_FALSE(TestUpdateCheck(&prefs,
Jay Srinivasan0a708742012-03-20 11:26:12 -07001017 params,
Darin Petkov95508da2011-01-05 12:42:29 -08001018 "invalid xml>",
1019 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001020 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001021 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov95508da2011-01-05 12:42:29 -08001022 NULL, // response
1023 &post_data));
1024 // convert post_data to string
1025 string post_str(&post_data[0], post_data.size());
Thieu Le116fda32011-04-19 11:01:54 -07001026 EXPECT_NE(post_str.find(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001027 " <ping active=\"1\" a=\"-1\" r=\"-1\"></ping>\n"
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001028 " <updatecheck targetversionprefix=\"\"></updatecheck>\n"),
Jay Srinivasan0a708742012-03-20 11:26:12 -07001029 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001030 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
1031 string::npos);
Chris Sosac1972482013-04-30 22:31:10 -07001032 EXPECT_NE(post_str.find("fw_version=\"ChromeOSFirmware.1.0\""),
1033 string::npos);
1034 EXPECT_NE(post_str.find("ec_version=\"0X0A1\""),
1035 string::npos);
Darin Petkov95508da2011-01-05 12:42:29 -08001036}
1037
Darin Petkove17f86b2010-07-20 09:12:01 -07001038TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
1039 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001040 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001041 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
1042 "invalid xml>",
1043 &post_data);
1044 // convert post_data to string
1045 string post_str(&post_data[0], post_data.size());
1046 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001047 " <event eventtype=\"%d\" eventresult=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001048 OmahaEvent::kTypeUpdateDownloadStarted,
1049 OmahaEvent::kResultSuccess);
1050 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001051 EXPECT_EQ(post_str.find("ping"), string::npos);
1052 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -07001053}
1054
1055TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
1056 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001057 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -07001058 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
1059 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001060 kErrorCodeError),
Darin Petkove17f86b2010-07-20 09:12:01 -07001061 "invalid xml>",
1062 &post_data);
1063 // convert post_data to string
1064 string post_str(&post_data[0], post_data.size());
1065 string expected_event = StringPrintf(
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001066 " <event eventtype=\"%d\" eventresult=\"%d\" "
1067 "errorcode=\"%d\"></event>\n",
Darin Petkove17f86b2010-07-20 09:12:01 -07001068 OmahaEvent::kTypeDownloadComplete,
1069 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001070 kErrorCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001071 EXPECT_NE(post_str.find(expected_event), string::npos);
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001072 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001073}
1074
1075TEST(OmahaRequestActionTest, IsEventTest) {
1076 string http_response("doesn't matter");
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001077 MockSystemState mock_system_state;
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001078 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001079 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001080 OmahaRequestAction update_check_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001081 &mock_system_state,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001082 NULL,
1083 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001084 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001085 NULL),
1086 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001087 EXPECT_FALSE(update_check_action.IsEvent());
1088
Jay Srinivasan480ddfa2012-06-01 19:15:26 -07001089 params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001090 mock_system_state.set_request_params(&params);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001091 OmahaRequestAction event_action(
Jay Srinivasan6f6ea002012-12-14 11:26:28 -08001092 &mock_system_state,
Darin Petkove17f86b2010-07-20 09:12:01 -07001093 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001094 new MockHttpFetcher(http_response.data(),
Andrew de los Reyes45168102010-11-22 11:13:50 -08001095 http_response.size(),
Thieu Le116fda32011-04-19 11:01:54 -07001096 NULL),
1097 false);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -07001098 EXPECT_TRUE(event_action.IsEvent());
1099}
1100
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001101TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
1102 for (int i = 0; i < 2; i++) {
1103 bool delta_okay = i == 1;
1104 const char* delta_okay_str = delta_okay ? "true" : "false";
1105 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001106 MockSystemState mock_system_state;
1107 OmahaRequestParams params(&mock_system_state,
1108 OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001109 OmahaRequestParams::kOsVersion,
1110 "service_pack",
1111 "x86-generic",
1112 OmahaRequestParams::kAppId,
1113 "0.1.0.0",
1114 "en-US",
1115 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -07001116 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001117 "ChromeOSFirmware.1.0",
1118 "EC100",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001119 delta_okay,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001120 false, // interactive
Jay Srinivasan0a708742012-03-20 11:26:12 -07001121 "http://url",
1122 false, // update_disabled
1123 ""); // target_version_prefix
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001124 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1125 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001126 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001127 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001128 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001129 kErrorCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -07001130 NULL,
1131 &post_data));
1132 // convert post_data to string
1133 string post_str(&post_data[0], post_data.size());
1134 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
1135 string::npos)
1136 << "i = " << i;
1137 }
1138}
1139
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001140TEST(OmahaRequestActionTest, FormatInteractiveOutputTest) {
1141 for (int i = 0; i < 2; i++) {
1142 bool interactive = i == 1;
Gilad Arnold8a659d82013-01-24 11:26:00 -08001143 const char* interactive_str = interactive ? "ondemandupdate" : "scheduler";
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001144 vector<char> post_data;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001145 MockSystemState mock_system_state;
1146 OmahaRequestParams params(&mock_system_state,
1147 OmahaRequestParams::kOsPlatform,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001148 OmahaRequestParams::kOsVersion,
1149 "service_pack",
1150 "x86-generic",
1151 OmahaRequestParams::kAppId,
1152 "0.1.0.0",
1153 "en-US",
1154 "unittest_track",
1155 "OEM MODEL REV 1234",
Chris Sosac1972482013-04-30 22:31:10 -07001156 "ChromeOSFirmware.1.0",
1157 "EC100",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001158 true, // delta_okay
1159 interactive,
1160 "http://url",
1161 false, // update_disabled
1162 ""); // target_version_prefix
1163 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1164 params,
1165 "invalid xml>",
1166 -1,
1167 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001168 kErrorCodeOmahaRequestXMLParseError,
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001169 NULL,
1170 &post_data));
1171 // convert post_data to string
1172 string post_str(&post_data[0], post_data.size());
Gilad Arnold8a659d82013-01-24 11:26:00 -08001173 EXPECT_NE(post_str.find(StringPrintf("installsource=\"%s\"",
Gilad Arnoldbbdd4902013-01-10 16:06:30 -08001174 interactive_str)),
1175 string::npos)
1176 << "i = " << i;
1177 }
1178}
1179
Darin Petkove17f86b2010-07-20 09:12:01 -07001180TEST(OmahaRequestActionTest, OmahaEventTest) {
1181 OmahaEvent default_event;
1182 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
1183 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001184 EXPECT_EQ(kErrorCodeError, default_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001185
1186 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
1187 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
1188 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001189 EXPECT_EQ(kErrorCodeSuccess, success_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001190
1191 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
1192 OmahaEvent::kResultError,
David Zeuthena99981f2013-04-29 13:42:47 -07001193 kErrorCodeError);
Darin Petkove17f86b2010-07-20 09:12:01 -07001194 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
1195 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
David Zeuthena99981f2013-04-29 13:42:47 -07001196 EXPECT_EQ(kErrorCodeError, error_event.error_code);
Darin Petkove17f86b2010-07-20 09:12:01 -07001197}
1198
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001199TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov265f2902011-05-09 15:17:40 -07001200 for (int ping_only = 0; ping_only < 2; ping_only++) {
1201 NiceMock<PrefsMock> prefs;
1202 // Add a few hours to the day difference to test no rounding, etc.
1203 int64_t five_days_ago =
1204 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
1205 int64_t six_days_ago =
1206 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
1207 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1208 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
1209 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1210 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
1211 vector<char> post_data;
1212 ASSERT_TRUE(
1213 TestUpdateCheck(&prefs,
1214 kDefaultTestParams,
1215 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1216 -1,
1217 ping_only,
David Zeuthena99981f2013-04-29 13:42:47 -07001218 kErrorCodeSuccess,
Darin Petkov265f2902011-05-09 15:17:40 -07001219 NULL,
1220 &post_data));
1221 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001222 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"6\" r=\"5\"></ping>"),
Darin Petkov265f2902011-05-09 15:17:40 -07001223 string::npos);
1224 if (ping_only) {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001225 EXPECT_EQ(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001226 EXPECT_EQ(post_str.find("previousversion"), string::npos);
1227 } else {
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001228 EXPECT_NE(post_str.find("updatecheck"), string::npos);
Darin Petkov265f2902011-05-09 15:17:40 -07001229 EXPECT_NE(post_str.find("previousversion"), string::npos);
1230 }
1231 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001232}
1233
1234TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001235 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001236 int64_t three_days_ago =
1237 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
1238 int64_t now = Time::Now().ToInternalValue();
1239 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1240 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
1241 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1242 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1243 vector<char> post_data;
1244 ASSERT_TRUE(
1245 TestUpdateCheck(&prefs,
1246 kDefaultTestParams,
1247 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001248 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001249 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001250 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001251 NULL,
1252 &post_data));
1253 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001254 EXPECT_NE(post_str.find("<ping active=\"1\" a=\"3\"></ping>"),
Thieu Le116fda32011-04-19 11:01:54 -07001255 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001256}
1257
1258TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001259 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001260 int64_t four_days_ago =
1261 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
1262 int64_t now = Time::Now().ToInternalValue();
1263 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1264 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1265 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1266 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
1267 vector<char> post_data;
1268 ASSERT_TRUE(
1269 TestUpdateCheck(&prefs,
1270 kDefaultTestParams,
1271 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001272 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001273 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001274 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001275 NULL,
1276 &post_data));
1277 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001278 EXPECT_NE(post_str.find("<ping active=\"1\" r=\"4\"></ping>\n"),
Thieu Le116fda32011-04-19 11:01:54 -07001279 string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001280}
1281
1282TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001283 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001284 int64_t one_hour_ago =
1285 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
1286 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1287 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1288 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1289 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
1290 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1291 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1292 vector<char> post_data;
1293 ASSERT_TRUE(
1294 TestUpdateCheck(&prefs,
1295 kDefaultTestParams,
1296 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -07001297 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001298 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001299 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001300 NULL,
1301 &post_data));
1302 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001303 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001304}
1305
Thieu Leb44e9e82011-06-06 14:34:04 -07001306TEST(OmahaRequestActionTest, IgnoreEmptyPingTest) {
1307 // This test ensures that we ignore empty ping only requests.
1308 NiceMock<PrefsMock> prefs;
1309 int64_t now = Time::Now().ToInternalValue();
1310 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1311 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1312 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1313 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
1314 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1315 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1316 vector<char> post_data;
1317 EXPECT_TRUE(
1318 TestUpdateCheck(&prefs,
1319 kDefaultTestParams,
1320 GetNoUpdateResponse(OmahaRequestParams::kAppId),
1321 -1,
1322 true, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001323 kErrorCodeSuccess,
Thieu Leb44e9e82011-06-06 14:34:04 -07001324 NULL,
1325 &post_data));
1326 EXPECT_EQ(post_data.size(), 0);
1327}
1328
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001329TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001330 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001331 int64_t future =
1332 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
1333 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
1334 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1335 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
1336 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
1337 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
1338 .WillOnce(Return(true));
1339 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
1340 .WillOnce(Return(true));
1341 vector<char> post_data;
1342 ASSERT_TRUE(
1343 TestUpdateCheck(&prefs,
1344 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001345 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1346 "protocol=\"3.0\"><daystart elapsed_seconds=\"100\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001347 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001348 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001349 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001350 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001351 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001352 NULL,
1353 &post_data));
1354 string post_str(&post_data[0], post_data.size());
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001355 EXPECT_EQ(post_str.find("ping"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001356}
1357
1358TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
1359 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -07001360 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001361 // may fail if it runs for longer than 5 seconds. It shouldn't run
1362 // that long though.
1363 int64_t midnight =
1364 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
1365 int64_t midnight_slack =
1366 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -08001367 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001368 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
1369 AllOf(Ge(midnight), Le(midnight_slack))))
1370 .WillOnce(Return(true));
1371 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
1372 AllOf(Ge(midnight), Le(midnight_slack))))
1373 .WillOnce(Return(true));
1374 ASSERT_TRUE(
1375 TestUpdateCheck(&prefs,
1376 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001377 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1378 "protocol=\"3.0\"><daystart elapsed_seconds=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001379 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001380 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001381 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001382 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001383 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001384 NULL,
1385 NULL));
1386}
1387
1388TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001389 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001390 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1391 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1392 ASSERT_TRUE(
1393 TestUpdateCheck(&prefs,
1394 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001395 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1396 "protocol=\"3.0\"><daystart blah=\"200\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001397 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001398 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001399 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001400 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001401 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001402 NULL,
1403 NULL));
1404}
1405
1406TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -08001407 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001408 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
1409 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
1410 ASSERT_TRUE(
1411 TestUpdateCheck(&prefs,
1412 kDefaultTestParams,
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001413 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><response "
1414 "protocol=\"3.0\"><daystart elapsed_seconds=\"x\"/>"
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001415 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001416 "<updatecheck status=\"noupdate\"/></app></response>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001417 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001418 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001419 kErrorCodeSuccess,
Darin Petkov1cbd78f2010-07-29 12:38:34 -07001420 NULL,
1421 NULL));
1422}
1423
Darin Petkov84c763c2010-07-29 16:27:58 -07001424TEST(OmahaRequestActionTest, NoUniqueIDTest) {
1425 vector<char> post_data;
1426 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
1427 kDefaultTestParams,
1428 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -07001429 -1,
Darin Petkov265f2902011-05-09 15:17:40 -07001430 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001431 kErrorCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -07001432 NULL, // response
1433 &post_data));
1434 // convert post_data to string
1435 string post_str(&post_data[0], post_data.size());
1436 EXPECT_EQ(post_str.find("machineid="), string::npos);
1437 EXPECT_EQ(post_str.find("userid="), string::npos);
1438}
1439
Darin Petkovedc522e2010-11-05 09:35:17 -07001440TEST(OmahaRequestActionTest, NetworkFailureTest) {
1441 OmahaResponse response;
1442 ASSERT_FALSE(
1443 TestUpdateCheck(NULL, // prefs
1444 kDefaultTestParams,
1445 "",
1446 501,
Darin Petkov265f2902011-05-09 15:17:40 -07001447 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001448 static_cast<ErrorCode>(
1449 kErrorCodeOmahaRequestHTTPResponseBase + 501),
Darin Petkovedc522e2010-11-05 09:35:17 -07001450 &response,
1451 NULL));
1452 EXPECT_FALSE(response.update_exists);
1453}
1454
1455TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
1456 OmahaResponse response;
1457 ASSERT_FALSE(
1458 TestUpdateCheck(NULL, // prefs
1459 kDefaultTestParams,
1460 "",
1461 1500,
Darin Petkov265f2902011-05-09 15:17:40 -07001462 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001463 static_cast<ErrorCode>(
1464 kErrorCodeOmahaRequestHTTPResponseBase + 999),
Darin Petkovedc522e2010-11-05 09:35:17 -07001465 &response,
1466 NULL));
1467 EXPECT_FALSE(response.update_exists);
1468}
1469
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001470TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsPersistedFirstTime) {
1471 OmahaResponse response;
1472 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001473 params.set_wall_clock_based_wait_enabled(true);
1474 params.set_waiting_period(TimeDelta().FromDays(1));
1475 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001476
1477 string prefs_dir;
1478 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1479 &prefs_dir));
1480 ScopedDirRemover temp_dir_remover(prefs_dir);
1481
1482 Prefs prefs;
1483 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1484 << "Failed to initialize preferences.";
1485
1486 ASSERT_FALSE(TestUpdateCheck(
1487 &prefs, // prefs
1488 params,
1489 GetUpdateResponse2(OmahaRequestParams::kAppId,
1490 "1.2.3.4", // version
1491 "http://more/info",
1492 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001493 "http://code/base/", // dl url
1494 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001495 "HASH1234=", // checksum
1496 "false", // needs admin
1497 "123", // size
1498 "", // deadline
1499 "7"), // max days to scatter
1500 -1,
1501 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001502 kErrorCodeOmahaUpdateDeferredPerPolicy,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001503 &response,
1504 NULL));
1505
1506 int64 timestamp = 0;
1507 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1508 ASSERT_TRUE(timestamp > 0);
1509 EXPECT_FALSE(response.update_exists);
Chris Sosa968d0572013-08-23 14:46:02 -07001510
1511 // Verify if we are interactive check we don't defer.
1512 params.set_interactive(true);
1513 ASSERT_TRUE(
1514 TestUpdateCheck(&prefs, // prefs
1515 params,
1516 GetUpdateResponse2(OmahaRequestParams::kAppId,
1517 "1.2.3.4", // version
1518 "http://more/info",
1519 "true", // prompt
1520 "http://code/base/", // dl url
1521 "file.signed", // file name
1522 "HASH1234=", // checksum
1523 "false", // needs admin
1524 "123", // size
1525 "", // deadline
1526 "7"), // max days to scatter
1527 -1,
1528 false, // ping_only
1529 kErrorCodeSuccess,
1530 &response,
1531 NULL));
1532 EXPECT_TRUE(response.update_exists);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001533}
1534
1535TEST(OmahaRequestActionTest, TestUpdateFirstSeenAtGetsUsedIfAlreadyPresent) {
1536 OmahaResponse response;
1537 OmahaRequestParams params = kDefaultTestParams;
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001538 params.set_wall_clock_based_wait_enabled(true);
1539 params.set_waiting_period(TimeDelta().FromDays(1));
1540 params.set_update_check_count_wait_enabled(false);
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001541
1542 string prefs_dir;
1543 EXPECT_TRUE(utils::MakeTempDirectory("/tmp/ue_ut_prefs.XXXXXX",
1544 &prefs_dir));
1545 ScopedDirRemover temp_dir_remover(prefs_dir);
1546
1547 Prefs prefs;
1548 LOG_IF(ERROR, !prefs.Init(FilePath(prefs_dir)))
1549 << "Failed to initialize preferences.";
1550
1551 // Set the timestamp to a very old value such that it exceeds the
1552 // waiting period set above.
1553 Time t1;
1554 Time::FromString("1/1/2012", &t1);
1555 ASSERT_TRUE(prefs.SetInt64(kPrefsUpdateFirstSeenAt, t1.ToInternalValue()));
1556 ASSERT_TRUE(TestUpdateCheck(
1557 &prefs, // prefs
1558 params,
1559 GetUpdateResponse2(OmahaRequestParams::kAppId,
1560 "1.2.3.4", // version
1561 "http://more/info",
1562 "true", // prompt
Jay Srinivasan23b92a52012-10-27 02:00:21 -07001563 "http://code/base/", // dl url
1564 "file.signed", // file name
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001565 "HASH1234=", // checksum
1566 "false", // needs admin
1567 "123", // size
1568 "", // deadline
1569 "7"), // max days to scatter
1570 -1,
1571 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001572 kErrorCodeSuccess,
Jay Srinivasan34b5d862012-07-23 11:43:22 -07001573 &response,
1574 NULL));
1575
1576 EXPECT_TRUE(response.update_exists);
1577
1578 // Make sure the timestamp t1 is unchanged showing that it was reused.
1579 int64 timestamp = 0;
1580 ASSERT_TRUE(prefs.GetInt64(kPrefsUpdateFirstSeenAt, &timestamp));
1581 ASSERT_TRUE(timestamp == t1.ToInternalValue());
1582}
1583
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001584TEST(OmahaRequestActionTest, TestChangingToMoreStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001585 // Create a uniquely named test directory.
1586 string test_dir;
1587 ASSERT_TRUE(utils::MakeTempDirectory(
1588 "omaha_request_action-test-XXXXXX", &test_dir));
1589
1590 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1591 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001592 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001593 vector<char> post_data;
1594 NiceMock<PrefsMock> prefs;
1595 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001596 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001597 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1598 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1599 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1600 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001601 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001602 "CHROMEOS_IS_POWERWASH_ALLOWED=true\n"
1603 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1604 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001605 params.set_root(string("./") + test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001606 params.SetLockDown(false);
1607 params.Init("1.2.3.4", "", 0);
1608 EXPECT_EQ("canary-channel", params.current_channel());
1609 EXPECT_EQ("stable-channel", params.target_channel());
1610 EXPECT_TRUE(params.to_more_stable_channel());
1611 EXPECT_TRUE(params.is_powerwash_allowed());
1612 ASSERT_FALSE(TestUpdateCheck(&prefs,
1613 params,
1614 "invalid xml>",
1615 -1,
1616 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001617 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001618 NULL, // response
1619 &post_data));
1620 // convert post_data to string
1621 string post_str(&post_data[0], post_data.size());
1622 EXPECT_NE(string::npos, post_str.find(
1623 "appid=\"{22222222-2222-2222-2222-222222222222}\" "
1624 "version=\"0.0.0.0\" from_version=\"1.2.3.4\" "
1625 "track=\"stable-channel\" from_track=\"canary-channel\" "));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001626
1627 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001628}
1629
1630TEST(OmahaRequestActionTest, TestChangingToLessStableChannel) {
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001631 // Create a uniquely named test directory.
1632 string test_dir;
1633 ASSERT_TRUE(utils::MakeTempDirectory(
1634 "omaha_request_action-test-XXXXXX", &test_dir));
1635
1636 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir + "/etc"));
1637 ASSERT_EQ(0, System(string("mkdir -p ") + test_dir +
Chris Sosabe45bef2013-04-09 18:25:12 -07001638 kStatefulPartition + "/etc"));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001639 vector<char> post_data;
1640 NiceMock<PrefsMock> prefs;
1641 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001642 test_dir + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001643 "CHROMEOS_RELEASE_APPID={11111111-1111-1111-1111-111111111111}\n"
1644 "CHROMEOS_BOARD_APPID={22222222-2222-2222-2222-222222222222}\n"
1645 "CHROMEOS_RELEASE_TRACK=stable-channel\n"));
1646 ASSERT_TRUE(WriteFileString(
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001647 test_dir + kStatefulPartition + "/etc/lsb-release",
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001648 "CHROMEOS_RELEASE_TRACK=canary-channel\n"));
1649 OmahaRequestParams params = kDefaultTestParams;
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001650 params.set_root(string("./") + test_dir);
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001651 params.SetLockDown(false);
1652 params.Init("5.6.7.8", "", 0);
1653 EXPECT_EQ("stable-channel", params.current_channel());
1654 EXPECT_EQ("canary-channel", params.target_channel());
1655 EXPECT_FALSE(params.to_more_stable_channel());
1656 EXPECT_FALSE(params.is_powerwash_allowed());
1657 ASSERT_FALSE(TestUpdateCheck(&prefs,
1658 params,
1659 "invalid xml>",
1660 -1,
1661 false, // ping_only
David Zeuthena99981f2013-04-29 13:42:47 -07001662 kErrorCodeOmahaRequestXMLParseError,
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001663 NULL, // response
1664 &post_data));
1665 // convert post_data to string
1666 string post_str(&post_data[0], post_data.size());
1667 EXPECT_NE(string::npos, post_str.find(
1668 "appid=\"{11111111-1111-1111-1111-111111111111}\" "
1669 "version=\"5.6.7.8\" "
1670 "track=\"canary-channel\" from_track=\"stable-channel\""));
1671 EXPECT_EQ(string::npos, post_str.find( "from_version"));
Gilad Arnoldeff87cc2013-07-22 18:32:09 -07001672
1673 ASSERT_TRUE(utils::RecursiveUnlinkDir(test_dir));
Jay Srinivasanae4697c2013-03-18 17:08:08 -07001674}
1675
Darin Petkov6a5b3222010-07-13 14:55:28 -07001676} // namespace chromeos_update_engine