blob: 2501d2d8ae2c4437bb096f6164fdf773b4ff8fff [file] [log] [blame]
Darin Petkova4a8a8c2010-07-15 22:21:12 -07001// Copyright (c) 2010 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"
Darin Petkov1cbd78f2010-07-29 12:38:34 -070011#include "base/time.h"
Darin Petkov0dc8e9a2010-07-14 14:51:57 -070012#include "gtest/gtest.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070013#include "update_engine/action_pipe.h"
14#include "update_engine/mock_http_fetcher.h"
15#include "update_engine/omaha_hash_calculator.h"
16#include "update_engine/omaha_request_action.h"
Darin Petkova4a8a8c2010-07-15 22:21:12 -070017#include "update_engine/omaha_request_params.h"
Darin Petkov1cbd78f2010-07-29 12:38:34 -070018#include "update_engine/prefs_mock.h"
Darin Petkov6a5b3222010-07-13 14:55:28 -070019#include "update_engine/test_utils.h"
20
Darin Petkov1cbd78f2010-07-29 12:38:34 -070021using base::Time;
22using base::TimeDelta;
Darin Petkov6a5b3222010-07-13 14:55:28 -070023using std::string;
24using std::vector;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070025using testing::_;
26using testing::AllOf;
27using testing::Ge;
28using testing::Le;
29using testing::Return;
30using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070031
32namespace chromeos_update_engine {
33
34class OmahaRequestActionTest : public ::testing::Test { };
35
36namespace {
Darin Petkov1cbd78f2010-07-29 12:38:34 -070037const OmahaRequestParams kDefaultTestParams(
Darin Petkov1cbd78f2010-07-29 12:38:34 -070038 OmahaRequestParams::kOsPlatform,
39 OmahaRequestParams::kOsVersion,
40 "service_pack",
41 "x86-generic",
42 OmahaRequestParams::kAppId,
43 "0.1.0.0",
44 "en-US",
45 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070046 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070047 false, // delta okay
48 "http://url");
49
Darin Petkov6a5b3222010-07-13 14:55:28 -070050string GetNoUpdateResponse(const string& app_id) {
51 return string(
52 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
53 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
54 "appid=\"") + app_id + "\" status=\"ok\"><ping "
55 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
56}
57
58string GetUpdateResponse(const string& app_id,
59 const string& display_version,
60 const string& more_info_url,
61 const string& prompt,
62 const string& codebase,
63 const string& hash,
64 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -070065 const string& size,
66 const string& deadline) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070067 return string("<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
68 "xmlns=\"http://www.google.com/update2/response\" "
69 "protocol=\"2.0\"><app "
70 "appid=\"") + app_id + "\" status=\"ok\"><ping "
71 "status=\"ok\"/><updatecheck DisplayVersion=\"" + display_version + "\" "
72 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
Andrew de los Reyes3270f742010-07-15 22:28:14 -070073 "IsDelta=\"true\" "
Darin Petkovd22cb292010-09-29 10:02:29 -070074 "codebase=\"" + codebase + "\" hash=\"not-applicable\" "
75 "sha256=\"" + hash + "\" needsadmin=\"" + needsadmin + "\" "
Darin Petkov6c118642010-10-21 12:06:30 -070076 "size=\"" + size + "\" deadline=\"" + deadline +
77 "\" status=\"ok\"/></app></gupdate>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070078}
79
80class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
81 public:
82 OmahaRequestActionTestProcessorDelegate()
83 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -070084 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -070085 virtual ~OmahaRequestActionTestProcessorDelegate() {
86 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070087 virtual void ProcessingDone(const ActionProcessor* processor,
88 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070089 ASSERT_TRUE(loop_);
90 g_main_loop_quit(loop_);
91 }
92
93 virtual void ActionCompleted(ActionProcessor* processor,
94 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070095 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070096 // make sure actions always succeed
97 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -070098 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -070099 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700100 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700101 }
102 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700103 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700104};
105
106gboolean StartProcessorInRunLoop(gpointer data) {
107 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
108 processor->StartProcessing();
109 return FALSE;
110}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700111} // namespace {}
112
113class OutputObjectCollectorAction;
114
115template<>
116class ActionTraits<OutputObjectCollectorAction> {
117 public:
118 // Does not take an object for input
119 typedef OmahaResponse InputObjectType;
120 // On success, puts the output path on output
121 typedef NoneType OutputObjectType;
122};
123
124class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
125 public:
126 OutputObjectCollectorAction() : has_input_object_(false) {}
127 void PerformAction() {
128 // copy input object
129 has_input_object_ = HasInputObject();
130 if (has_input_object_)
131 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700132 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700133 }
134 // Should never be called
135 void TerminateProcessing() {
136 CHECK(false);
137 }
138 // Debugging/logging
139 static std::string StaticType() {
140 return "OutputObjectCollectorAction";
141 }
142 std::string Type() const { return StaticType(); }
143 bool has_input_object_;
144 OmahaResponse omaha_response_;
145};
146
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700147// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700148// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
149// used. out_response may be NULL. If |fail_http_response_code| is
150// non-negative, the transfer will fail with that code. out_post_data may be
151// null; if non-null, the post-data received by the mock HttpFetcher is
152// returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700153bool TestUpdateCheck(PrefsInterface* prefs,
154 const OmahaRequestParams& params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700155 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700156 int fail_http_response_code,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700157 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700158 OmahaResponse* out_response,
159 vector<char>* out_post_data) {
160 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
161 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700162 http_response.size());
Darin Petkovedc522e2010-11-05 09:35:17 -0700163 if (fail_http_response_code >= 0) {
164 fetcher->FailTransfer(fail_http_response_code);
165 }
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700166 PrefsMock local_prefs;
167 OmahaRequestAction action(prefs ? prefs : &local_prefs,
168 params,
169 NULL,
170 fetcher);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700171 OmahaRequestActionTestProcessorDelegate delegate;
172 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700173 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700174
Darin Petkov6a5b3222010-07-13 14:55:28 -0700175 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700176 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700177 processor.EnqueueAction(&action);
178
179 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700180 BondActions(&action, &collector_action);
181 processor.EnqueueAction(&collector_action);
182
183 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
184 g_main_loop_run(loop);
185 g_main_loop_unref(loop);
186 if (collector_action.has_input_object_ && out_response)
187 *out_response = collector_action.omaha_response_;
188 if (out_post_data)
189 *out_post_data = fetcher->post_data();
190 return collector_action.has_input_object_;
191}
192
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700193// Tests Event requests -- they should always succeed. |out_post_data|
194// may be null; if non-null, the post-data received by the mock
195// HttpFetcher is returned.
196void TestEvent(const OmahaRequestParams& params,
197 OmahaEvent* event,
198 const string& http_response,
199 vector<char>* out_post_data) {
200 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
201 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
202 http_response.size());
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700203 PrefsMock prefs;
204 OmahaRequestAction action(&prefs, params, event, fetcher);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700205 OmahaRequestActionTestProcessorDelegate delegate;
206 delegate.loop_ = loop;
207 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700208 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700209 processor.EnqueueAction(&action);
210
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700211 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
212 g_main_loop_run(loop);
213 g_main_loop_unref(loop);
214 if (out_post_data)
215 *out_post_data = fetcher->post_data();
216}
217
Darin Petkov6a5b3222010-07-13 14:55:28 -0700218TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700219 OmahaResponse response;
220 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700221 TestUpdateCheck(NULL, // prefs
222 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700223 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700224 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700225 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700226 &response,
227 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700228 EXPECT_FALSE(response.update_exists);
229}
230
231TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700232 OmahaResponse response;
233 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700234 TestUpdateCheck(NULL, // prefs
235 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700236 GetUpdateResponse(OmahaRequestParams::kAppId,
237 "1.2.3.4", // version
238 "http://more/info",
239 "true", // prompt
240 "http://code/base", // dl url
241 "HASH1234=", // checksum
242 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700243 "123", // size
244 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700245 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700246 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700247 &response,
248 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700249 EXPECT_TRUE(response.update_exists);
250 EXPECT_EQ("1.2.3.4", response.display_version);
251 EXPECT_EQ("http://code/base", response.codebase);
252 EXPECT_EQ("http://more/info", response.more_info_url);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700253 EXPECT_TRUE(response.is_delta);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700254 EXPECT_EQ("HASH1234=", response.hash);
255 EXPECT_EQ(123, response.size);
256 EXPECT_FALSE(response.needs_admin);
257 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700258 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700259}
260
261TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700262 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
263
264 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
265
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700266 PrefsMock prefs;
267 OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700268 new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700269 http_response.size()));
270 OmahaRequestActionTestProcessorDelegate delegate;
271 delegate.loop_ = loop;
272 ActionProcessor processor;
273 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700274 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275
276 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
277 g_main_loop_run(loop);
278 g_main_loop_unref(loop);
279 EXPECT_FALSE(processor.IsRunning());
280}
281
282TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700283 OmahaResponse response;
284 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700285 TestUpdateCheck(NULL, // prefs
286 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700287 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700288 -1,
289 kActionCodeOmahaRequestXMLParseError,
290 &response,
291 NULL));
292 EXPECT_FALSE(response.update_exists);
293}
294
295TEST(OmahaRequestActionTest, EmptyResponseTest) {
296 OmahaResponse response;
297 ASSERT_FALSE(
298 TestUpdateCheck(NULL, // prefs
299 kDefaultTestParams,
300 "",
301 -1,
302 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700303 &response,
304 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700305 EXPECT_FALSE(response.update_exists);
306}
307
308TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700309 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700310 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700311 NULL, // prefs
312 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700313 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
314 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
315 "appid=\"foo\" status=\"ok\"><ping "
316 "status=\"ok\"/><updatecheck/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700317 -1,
318 kActionCodeOmahaRequestNoUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700319 &response,
320 NULL));
321 EXPECT_FALSE(response.update_exists);
322}
323
324TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700325 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700326 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700327 NULL, // prefs
328 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700329 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
330 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
331 "appid=\"foo\" status=\"ok\"><ping "
332 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700333 -1,
334 kActionCodeOmahaRequestBadUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700335 &response,
336 NULL));
337 EXPECT_FALSE(response.update_exists);
338}
339
340TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700341 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700342 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700343 NULL, // prefs
344 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700345 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
346 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
347 "appid=\"foo\" status=\"ok\"><ping "
348 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700349 -1,
350 kActionCodeOmahaRequestNoUpdateCheckNode,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700351 &response,
352 NULL));
353 EXPECT_FALSE(response.update_exists);
354}
355
356TEST(OmahaRequestActionTest, MissingFieldTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700357 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700358 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
359 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700360 string("<?xml version=\"1.0\" "
361 "encoding=\"UTF-8\"?><gupdate "
362 "xmlns=\"http://www.google.com/"
363 "update2/response\" "
364 "protocol=\"2.0\"><app appid=\"") +
365 OmahaRequestParams::kAppId
366 + "\" status=\"ok\"><ping "
367 "status=\"ok\"/><updatecheck "
368 "DisplayVersion=\"1.2.3.4\" "
369 "Prompt=\"false\" "
Darin Petkovd22cb292010-09-29 10:02:29 -0700370 "codebase=\"http://code/base\" hash=\"foo\" "
371 "sha256=\"HASH1234=\" needsadmin=\"true\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700372 "size=\"123\" "
373 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700374 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700375 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700376 &response,
377 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700378 EXPECT_TRUE(response.update_exists);
379 EXPECT_EQ("1.2.3.4", response.display_version);
380 EXPECT_EQ("http://code/base", response.codebase);
381 EXPECT_EQ("", response.more_info_url);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700382 EXPECT_FALSE(response.is_delta);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700383 EXPECT_EQ("HASH1234=", response.hash);
384 EXPECT_EQ(123, response.size);
385 EXPECT_TRUE(response.needs_admin);
386 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700387 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700388}
389
390namespace {
391class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
392 public:
393 void ProcessingStopped(const ActionProcessor* processor) {
394 ASSERT_TRUE(loop_);
395 g_main_loop_quit(loop_);
396 }
397 GMainLoop *loop_;
398};
399
400gboolean TerminateTransferTestStarter(gpointer data) {
401 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
402 processor->StartProcessing();
403 CHECK(processor->IsRunning());
404 processor->StopProcessing();
405 return FALSE;
406}
407} // namespace {}
408
409TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700410 string http_response("doesn't matter");
411 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
412
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700413 PrefsMock prefs;
414 OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700415 new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700416 http_response.size()));
417 TerminateEarlyTestProcessorDelegate delegate;
418 delegate.loop_ = loop;
419 ActionProcessor processor;
420 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700421 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700422
423 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
424 g_main_loop_run(loop);
425 g_main_loop_unref(loop);
426}
427
428TEST(OmahaRequestActionTest, XmlEncodeTest) {
429 EXPECT_EQ("ab", XmlEncode("ab"));
430 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
431 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
432 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
433 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
434
435 vector<char> post_data;
436
437 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700438 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700439 OmahaRequestParams::kOsVersion,
440 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700441 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700442 OmahaRequestParams::kAppId,
443 "0.1.0.0",
444 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700445 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700446 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700447 false, // delta okay
Darin Petkov6a5b3222010-07-13 14:55:28 -0700448 "http://url");
449 OmahaResponse response;
450 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700451 TestUpdateCheck(NULL, // prefs
452 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700453 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700454 -1,
455 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700456 &response,
457 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700458 // convert post_data to string
459 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700460 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
461 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700462 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
463 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
464 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
465 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700466 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
467 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700468}
469
470TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700471 OmahaResponse response;
472 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700473 TestUpdateCheck(NULL, // prefs
474 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700475 GetUpdateResponse(OmahaRequestParams::kAppId,
476 "1.2.3.4", // version
477 "testthe&lt;url", // more info
478 "true", // prompt
479 "testthe&amp;codebase", // dl url
480 "HASH1234=", // checksum
481 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700482 "123", // size
483 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700484 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700485 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700486 &response,
487 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700488
489 EXPECT_EQ(response.more_info_url, "testthe<url");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700490 EXPECT_EQ(response.codebase, "testthe&codebase");
Darin Petkov6c118642010-10-21 12:06:30 -0700491 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700492}
493
494TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700495 OmahaResponse response;
496 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700497 TestUpdateCheck(NULL, // prefs
498 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700499 GetUpdateResponse(OmahaRequestParams::kAppId,
500 "1.2.3.4", // version
501 "theurl", // more info
502 "true", // prompt
503 "thecodebase", // dl url
504 "HASH1234=", // checksum
505 "false", // needs admin
506 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700507 "123123123123123", // size
508 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700509 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700510 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700511 &response,
512 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700513
514 EXPECT_EQ(response.size, 123123123123123ll);
515}
516
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700517TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
518 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700519 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
520 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700521 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700522 -1,
523 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700524 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700525 &post_data));
526 // convert post_data to string
527 string post_str(&post_data[0], post_data.size());
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700528 EXPECT_NE(post_str.find(" <o:ping a=\"-1\" r=\"-1\"></o:ping>\n"
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700529 " <o:updatecheck></o:updatecheck>\n"),
530 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700531 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
532 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700533 EXPECT_EQ(post_str.find("o:event"), string::npos);
534}
535
Darin Petkove17f86b2010-07-20 09:12:01 -0700536TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
537 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700538 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700539 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
540 "invalid xml>",
541 &post_data);
542 // convert post_data to string
543 string post_str(&post_data[0], post_data.size());
544 string expected_event = StringPrintf(
545 " <o:event eventtype=\"%d\" eventresult=\"%d\"></o:event>\n",
546 OmahaEvent::kTypeUpdateDownloadStarted,
547 OmahaEvent::kResultSuccess);
548 EXPECT_NE(post_str.find(expected_event), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700549 EXPECT_EQ(post_str.find("o:ping"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700550 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
551}
552
553TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
554 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700555 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700556 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
557 OmahaEvent::kResultError,
558 kActionCodeError),
559 "invalid xml>",
560 &post_data);
561 // convert post_data to string
562 string post_str(&post_data[0], post_data.size());
563 string expected_event = StringPrintf(
564 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
565 "errorcode=\"%d\"></o:event>\n",
566 OmahaEvent::kTypeDownloadComplete,
567 OmahaEvent::kResultError,
568 kActionCodeError);
569 EXPECT_NE(post_str.find(expected_event), string::npos);
570 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
571}
572
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700573TEST(OmahaRequestActionTest, FormatEventOutputTest) {
574 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700575 TestEvent(kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700576 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
577 OmahaEvent::kResultError,
Darin Petkove17f86b2010-07-20 09:12:01 -0700578 kActionCodeError),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700579 "invalid xml>",
580 &post_data);
581 // convert post_data to string
582 string post_str(&post_data[0], post_data.size());
583 string expected_event = StringPrintf(
584 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
585 "errorcode=\"%d\"></o:event>\n",
586 OmahaEvent::kTypeDownloadComplete,
587 OmahaEvent::kResultError,
Darin Petkove17f86b2010-07-20 09:12:01 -0700588 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700589 EXPECT_NE(post_str.find(expected_event), string::npos);
590 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
591}
592
593TEST(OmahaRequestActionTest, IsEventTest) {
594 string http_response("doesn't matter");
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700595 PrefsMock prefs;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700596 OmahaRequestAction update_check_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700597 &prefs,
598 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700599 NULL,
600 new MockHttpFetcher(http_response.data(),
601 http_response.size()));
602 EXPECT_FALSE(update_check_action.IsEvent());
603
604 OmahaRequestAction event_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700605 &prefs,
606 kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700607 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700608 new MockHttpFetcher(http_response.data(),
609 http_response.size()));
610 EXPECT_TRUE(event_action.IsEvent());
611}
612
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700613TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
614 for (int i = 0; i < 2; i++) {
615 bool delta_okay = i == 1;
616 const char* delta_okay_str = delta_okay ? "true" : "false";
617 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -0700618 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700619 OmahaRequestParams::kOsVersion,
620 "service_pack",
621 "x86-generic",
622 OmahaRequestParams::kAppId,
623 "0.1.0.0",
624 "en-US",
625 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -0700626 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700627 delta_okay,
628 "http://url");
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700629 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
630 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700631 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700632 -1,
633 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700634 NULL,
635 &post_data));
636 // convert post_data to string
637 string post_str(&post_data[0], post_data.size());
638 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
639 string::npos)
640 << "i = " << i;
641 }
642}
643
Darin Petkove17f86b2010-07-20 09:12:01 -0700644TEST(OmahaRequestActionTest, OmahaEventTest) {
645 OmahaEvent default_event;
646 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
647 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
648 EXPECT_EQ(kActionCodeError, default_event.error_code);
649
650 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
651 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
652 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
653 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
654
655 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
656 OmahaEvent::kResultError,
657 kActionCodeError);
658 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
659 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
660 EXPECT_EQ(kActionCodeError, error_event.error_code);
661}
662
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700663TEST(OmahaRequestActionTest, PingTest) {
664 PrefsMock prefs;
665 // Add a few hours to the day difference to test no rounding, etc.
666 int64_t five_days_ago =
667 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
668 int64_t six_days_ago =
669 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
670 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
671 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
672 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
673 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
674 vector<char> post_data;
675 ASSERT_TRUE(
676 TestUpdateCheck(&prefs,
677 kDefaultTestParams,
678 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700679 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700680 kActionCodeSuccess,
681 NULL,
682 &post_data));
683 string post_str(&post_data[0], post_data.size());
684 EXPECT_NE(post_str.find("<o:ping a=\"6\" r=\"5\"></o:ping>"), string::npos);
685}
686
687TEST(OmahaRequestActionTest, ActivePingTest) {
688 PrefsMock prefs;
689 int64_t three_days_ago =
690 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
691 int64_t now = Time::Now().ToInternalValue();
692 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
693 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
694 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
695 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
696 vector<char> post_data;
697 ASSERT_TRUE(
698 TestUpdateCheck(&prefs,
699 kDefaultTestParams,
700 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700701 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700702 kActionCodeSuccess,
703 NULL,
704 &post_data));
705 string post_str(&post_data[0], post_data.size());
706 EXPECT_NE(post_str.find("<o:ping a=\"3\"></o:ping>"), string::npos);
707}
708
709TEST(OmahaRequestActionTest, RollCallPingTest) {
710 PrefsMock prefs;
711 int64_t four_days_ago =
712 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
713 int64_t now = Time::Now().ToInternalValue();
714 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
715 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
716 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
717 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
718 vector<char> post_data;
719 ASSERT_TRUE(
720 TestUpdateCheck(&prefs,
721 kDefaultTestParams,
722 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700723 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700724 kActionCodeSuccess,
725 NULL,
726 &post_data));
727 string post_str(&post_data[0], post_data.size());
728 EXPECT_NE(post_str.find("<o:ping r=\"4\"></o:ping>\n"), string::npos);
729}
730
731TEST(OmahaRequestActionTest, NoPingTest) {
732 PrefsMock prefs;
733 int64_t one_hour_ago =
734 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
735 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
736 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
737 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
738 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
739 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
740 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
741 vector<char> post_data;
742 ASSERT_TRUE(
743 TestUpdateCheck(&prefs,
744 kDefaultTestParams,
745 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700746 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700747 kActionCodeSuccess,
748 NULL,
749 &post_data));
750 string post_str(&post_data[0], post_data.size());
751 EXPECT_EQ(post_str.find("o:ping"), string::npos);
752}
753
754TEST(OmahaRequestActionTest, BackInTimePingTest) {
755 PrefsMock prefs;
756 int64_t future =
757 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
758 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
759 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
760 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
761 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
762 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
763 .WillOnce(Return(true));
764 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
765 .WillOnce(Return(true));
766 vector<char> post_data;
767 ASSERT_TRUE(
768 TestUpdateCheck(&prefs,
769 kDefaultTestParams,
770 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
771 "xmlns=\"http://www.google.com/update2/response\" "
772 "protocol=\"2.0\"><daystart elapsed_seconds=\"100\"/>"
773 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
774 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700775 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700776 kActionCodeSuccess,
777 NULL,
778 &post_data));
779 string post_str(&post_data[0], post_data.size());
780 EXPECT_EQ(post_str.find("o:ping"), string::npos);
781}
782
783TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
784 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -0700785 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700786 // may fail if it runs for longer than 5 seconds. It shouldn't run
787 // that long though.
788 int64_t midnight =
789 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
790 int64_t midnight_slack =
791 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
792 PrefsMock prefs;
793 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
794 AllOf(Ge(midnight), Le(midnight_slack))))
795 .WillOnce(Return(true));
796 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
797 AllOf(Ge(midnight), Le(midnight_slack))))
798 .WillOnce(Return(true));
799 ASSERT_TRUE(
800 TestUpdateCheck(&prefs,
801 kDefaultTestParams,
802 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
803 "xmlns=\"http://www.google.com/update2/response\" "
804 "protocol=\"2.0\"><daystart elapsed_seconds=\"200\"/>"
805 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
806 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700807 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700808 kActionCodeSuccess,
809 NULL,
810 NULL));
811}
812
813TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
814 PrefsMock prefs;
815 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
816 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
817 ASSERT_TRUE(
818 TestUpdateCheck(&prefs,
819 kDefaultTestParams,
820 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
821 "xmlns=\"http://www.google.com/update2/response\" "
822 "protocol=\"2.0\"><daystart blah=\"200\"/>"
823 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
824 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700825 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700826 kActionCodeSuccess,
827 NULL,
828 NULL));
829}
830
831TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
832 PrefsMock prefs;
833 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
834 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
835 ASSERT_TRUE(
836 TestUpdateCheck(&prefs,
837 kDefaultTestParams,
838 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
839 "xmlns=\"http://www.google.com/update2/response\" "
840 "protocol=\"2.0\"><daystart elapsed_seconds=\"x\"/>"
841 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
842 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700843 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700844 kActionCodeSuccess,
845 NULL,
846 NULL));
847}
848
Darin Petkov84c763c2010-07-29 16:27:58 -0700849TEST(OmahaRequestActionTest, NoUniqueIDTest) {
850 vector<char> post_data;
851 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
852 kDefaultTestParams,
853 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700854 -1,
855 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -0700856 NULL, // response
857 &post_data));
858 // convert post_data to string
859 string post_str(&post_data[0], post_data.size());
860 EXPECT_EQ(post_str.find("machineid="), string::npos);
861 EXPECT_EQ(post_str.find("userid="), string::npos);
862}
863
Darin Petkovedc522e2010-11-05 09:35:17 -0700864TEST(OmahaRequestActionTest, NetworkFailureTest) {
865 OmahaResponse response;
866 ASSERT_FALSE(
867 TestUpdateCheck(NULL, // prefs
868 kDefaultTestParams,
869 "",
870 501,
871 static_cast<ActionExitCode>(
872 kActionCodeOmahaRequestHTTPResponseBase + 501),
873 &response,
874 NULL));
875 EXPECT_FALSE(response.update_exists);
876}
877
878TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
879 OmahaResponse response;
880 ASSERT_FALSE(
881 TestUpdateCheck(NULL, // prefs
882 kDefaultTestParams,
883 "",
884 1500,
885 static_cast<ActionExitCode>(
886 kActionCodeOmahaRequestHTTPResponseBase + 999),
887 &response,
888 NULL));
889 EXPECT_FALSE(response.update_exists);
890}
891
Darin Petkov6a5b3222010-07-13 14:55:28 -0700892} // namespace chromeos_update_engine