blob: dd71aabf9342b3f1b8e50344957dc23b0456ac72 [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;
Darin Petkov9c096d62010-11-17 14:49:04 -080029using testing::NiceMock;
Darin Petkov1cbd78f2010-07-29 12:38:34 -070030using testing::Return;
31using testing::SetArgumentPointee;
Darin Petkov6a5b3222010-07-13 14:55:28 -070032
33namespace chromeos_update_engine {
34
35class OmahaRequestActionTest : public ::testing::Test { };
36
37namespace {
Darin Petkov1cbd78f2010-07-29 12:38:34 -070038const OmahaRequestParams kDefaultTestParams(
Darin Petkov1cbd78f2010-07-29 12:38:34 -070039 OmahaRequestParams::kOsPlatform,
40 OmahaRequestParams::kOsVersion,
41 "service_pack",
42 "x86-generic",
43 OmahaRequestParams::kAppId,
44 "0.1.0.0",
45 "en-US",
46 "unittest",
Darin Petkovfbb40092010-07-29 17:05:50 -070047 "OEM MODEL 09235 7471",
Darin Petkov1cbd78f2010-07-29 12:38:34 -070048 false, // delta okay
49 "http://url");
50
Darin Petkov6a5b3222010-07-13 14:55:28 -070051string GetNoUpdateResponse(const string& app_id) {
52 return string(
53 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
54 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
55 "appid=\"") + app_id + "\" status=\"ok\"><ping "
56 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
57}
58
59string GetUpdateResponse(const string& app_id,
60 const string& display_version,
61 const string& more_info_url,
62 const string& prompt,
63 const string& codebase,
64 const string& hash,
65 const string& needsadmin,
Darin Petkov6c118642010-10-21 12:06:30 -070066 const string& size,
67 const string& deadline) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070068 return string("<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
69 "xmlns=\"http://www.google.com/update2/response\" "
70 "protocol=\"2.0\"><app "
71 "appid=\"") + app_id + "\" status=\"ok\"><ping "
72 "status=\"ok\"/><updatecheck DisplayVersion=\"" + display_version + "\" "
73 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
Andrew de los Reyes3270f742010-07-15 22:28:14 -070074 "IsDelta=\"true\" "
Darin Petkovd22cb292010-09-29 10:02:29 -070075 "codebase=\"" + codebase + "\" hash=\"not-applicable\" "
76 "sha256=\"" + hash + "\" needsadmin=\"" + needsadmin + "\" "
Darin Petkov6c118642010-10-21 12:06:30 -070077 "size=\"" + size + "\" deadline=\"" + deadline +
78 "\" status=\"ok\"/></app></gupdate>";
Darin Petkov6a5b3222010-07-13 14:55:28 -070079}
80
81class OmahaRequestActionTestProcessorDelegate : public ActionProcessorDelegate {
82 public:
83 OmahaRequestActionTestProcessorDelegate()
84 : loop_(NULL),
Darin Petkovc1a8b422010-07-19 11:34:49 -070085 expected_code_(kActionCodeSuccess) {}
Darin Petkov6a5b3222010-07-13 14:55:28 -070086 virtual ~OmahaRequestActionTestProcessorDelegate() {
87 }
Darin Petkovc1a8b422010-07-19 11:34:49 -070088 virtual void ProcessingDone(const ActionProcessor* processor,
89 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070090 ASSERT_TRUE(loop_);
91 g_main_loop_quit(loop_);
92 }
93
94 virtual void ActionCompleted(ActionProcessor* processor,
95 AbstractAction* action,
Darin Petkovc1a8b422010-07-19 11:34:49 -070096 ActionExitCode code) {
Darin Petkov6a5b3222010-07-13 14:55:28 -070097 // make sure actions always succeed
98 if (action->Type() == OmahaRequestAction::StaticType())
Darin Petkovc1a8b422010-07-19 11:34:49 -070099 EXPECT_EQ(expected_code_, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700100 else
Darin Petkovc1a8b422010-07-19 11:34:49 -0700101 EXPECT_EQ(kActionCodeSuccess, code);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700102 }
103 GMainLoop *loop_;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700104 ActionExitCode expected_code_;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700105};
106
107gboolean StartProcessorInRunLoop(gpointer data) {
108 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
109 processor->StartProcessing();
110 return FALSE;
111}
Darin Petkov6a5b3222010-07-13 14:55:28 -0700112} // namespace {}
113
114class OutputObjectCollectorAction;
115
116template<>
117class ActionTraits<OutputObjectCollectorAction> {
118 public:
119 // Does not take an object for input
120 typedef OmahaResponse InputObjectType;
121 // On success, puts the output path on output
122 typedef NoneType OutputObjectType;
123};
124
125class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
126 public:
127 OutputObjectCollectorAction() : has_input_object_(false) {}
128 void PerformAction() {
129 // copy input object
130 has_input_object_ = HasInputObject();
131 if (has_input_object_)
132 omaha_response_ = GetInputObject();
Darin Petkovc1a8b422010-07-19 11:34:49 -0700133 processor_->ActionComplete(this, kActionCodeSuccess);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700134 }
135 // Should never be called
136 void TerminateProcessing() {
137 CHECK(false);
138 }
139 // Debugging/logging
140 static std::string StaticType() {
141 return "OutputObjectCollectorAction";
142 }
143 std::string Type() const { return StaticType(); }
144 bool has_input_object_;
145 OmahaResponse omaha_response_;
146};
147
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700148// Returns true iff an output response was obtained from the
Darin Petkovedc522e2010-11-05 09:35:17 -0700149// OmahaRequestAction. |prefs| may be NULL, in which case a local PrefsMock is
150// used. out_response may be NULL. If |fail_http_response_code| is
151// non-negative, the transfer will fail with that code. out_post_data may be
152// null; if non-null, the post-data received by the mock HttpFetcher is
153// returned.
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700154bool TestUpdateCheck(PrefsInterface* prefs,
155 const OmahaRequestParams& params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700156 const string& http_response,
Darin Petkovedc522e2010-11-05 09:35:17 -0700157 int fail_http_response_code,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700158 ActionExitCode expected_code,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700159 OmahaResponse* out_response,
160 vector<char>* out_post_data) {
161 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
162 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700163 http_response.size());
Darin Petkovedc522e2010-11-05 09:35:17 -0700164 if (fail_http_response_code >= 0) {
165 fetcher->FailTransfer(fail_http_response_code);
166 }
Darin Petkov9c096d62010-11-17 14:49:04 -0800167 NiceMock<PrefsMock> local_prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700168 OmahaRequestAction action(prefs ? prefs : &local_prefs,
169 params,
170 NULL,
171 fetcher);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700172 OmahaRequestActionTestProcessorDelegate delegate;
173 delegate.loop_ = loop;
Darin Petkovc1a8b422010-07-19 11:34:49 -0700174 delegate.expected_code_ = expected_code;
Darin Petkova4a8a8c2010-07-15 22:21:12 -0700175
Darin Petkov6a5b3222010-07-13 14:55:28 -0700176 ActionProcessor processor;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700177 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700178 processor.EnqueueAction(&action);
179
180 OutputObjectCollectorAction collector_action;
Darin Petkov6a5b3222010-07-13 14:55:28 -0700181 BondActions(&action, &collector_action);
182 processor.EnqueueAction(&collector_action);
183
184 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
185 g_main_loop_run(loop);
186 g_main_loop_unref(loop);
187 if (collector_action.has_input_object_ && out_response)
188 *out_response = collector_action.omaha_response_;
189 if (out_post_data)
190 *out_post_data = fetcher->post_data();
191 return collector_action.has_input_object_;
192}
193
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700194// Tests Event requests -- they should always succeed. |out_post_data|
195// may be null; if non-null, the post-data received by the mock
196// HttpFetcher is returned.
197void TestEvent(const OmahaRequestParams& params,
198 OmahaEvent* event,
199 const string& http_response,
200 vector<char>* out_post_data) {
201 GMainLoop* loop = g_main_loop_new(g_main_context_default(), FALSE);
202 MockHttpFetcher* fetcher = new MockHttpFetcher(http_response.data(),
203 http_response.size());
Darin Petkov9c096d62010-11-17 14:49:04 -0800204 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700205 OmahaRequestAction action(&prefs, params, event, fetcher);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700206 OmahaRequestActionTestProcessorDelegate delegate;
207 delegate.loop_ = loop;
208 ActionProcessor processor;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700209 processor.set_delegate(&delegate);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700210 processor.EnqueueAction(&action);
211
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700212 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
213 g_main_loop_run(loop);
214 g_main_loop_unref(loop);
215 if (out_post_data)
216 *out_post_data = fetcher->post_data();
217}
218
Darin Petkov6a5b3222010-07-13 14:55:28 -0700219TEST(OmahaRequestActionTest, NoUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700220 OmahaResponse response;
221 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700222 TestUpdateCheck(NULL, // prefs
223 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700224 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700225 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700226 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700227 &response,
228 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700229 EXPECT_FALSE(response.update_exists);
230}
231
232TEST(OmahaRequestActionTest, ValidUpdateTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700233 OmahaResponse response;
234 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700235 TestUpdateCheck(NULL, // prefs
236 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700237 GetUpdateResponse(OmahaRequestParams::kAppId,
238 "1.2.3.4", // version
239 "http://more/info",
240 "true", // prompt
241 "http://code/base", // dl url
242 "HASH1234=", // checksum
243 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700244 "123", // size
245 "20101020"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700246 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700247 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700248 &response,
249 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700250 EXPECT_TRUE(response.update_exists);
251 EXPECT_EQ("1.2.3.4", response.display_version);
252 EXPECT_EQ("http://code/base", response.codebase);
253 EXPECT_EQ("http://more/info", response.more_info_url);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700254 EXPECT_TRUE(response.is_delta);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700255 EXPECT_EQ("HASH1234=", response.hash);
256 EXPECT_EQ(123, response.size);
257 EXPECT_FALSE(response.needs_admin);
258 EXPECT_TRUE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700259 EXPECT_EQ("20101020", response.deadline);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700260}
261
262TEST(OmahaRequestActionTest, NoOutputPipeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700263 const string http_response(GetNoUpdateResponse(OmahaRequestParams::kAppId));
264
265 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
266
Darin Petkov9c096d62010-11-17 14:49:04 -0800267 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700268 OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700269 new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700270 http_response.size()));
271 OmahaRequestActionTestProcessorDelegate delegate;
272 delegate.loop_ = loop;
273 ActionProcessor processor;
274 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700275 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700276
277 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
278 g_main_loop_run(loop);
279 g_main_loop_unref(loop);
280 EXPECT_FALSE(processor.IsRunning());
281}
282
283TEST(OmahaRequestActionTest, InvalidXmlTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700284 OmahaResponse response;
285 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700286 TestUpdateCheck(NULL, // prefs
287 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700288 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700289 -1,
290 kActionCodeOmahaRequestXMLParseError,
291 &response,
292 NULL));
293 EXPECT_FALSE(response.update_exists);
294}
295
296TEST(OmahaRequestActionTest, EmptyResponseTest) {
297 OmahaResponse response;
298 ASSERT_FALSE(
299 TestUpdateCheck(NULL, // prefs
300 kDefaultTestParams,
301 "",
302 -1,
303 kActionCodeOmahaRequestEmptyResponseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700304 &response,
305 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700306 EXPECT_FALSE(response.update_exists);
307}
308
309TEST(OmahaRequestActionTest, MissingStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700310 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700311 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700312 NULL, // prefs
313 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700314 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
315 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
316 "appid=\"foo\" status=\"ok\"><ping "
317 "status=\"ok\"/><updatecheck/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700318 -1,
319 kActionCodeOmahaRequestNoUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700320 &response,
321 NULL));
322 EXPECT_FALSE(response.update_exists);
323}
324
325TEST(OmahaRequestActionTest, InvalidStatusTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700326 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700327 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700328 NULL, // prefs
329 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700330 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
331 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
332 "appid=\"foo\" status=\"ok\"><ping "
333 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700334 -1,
335 kActionCodeOmahaRequestBadUpdateCheckStatus,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700336 &response,
337 NULL));
338 EXPECT_FALSE(response.update_exists);
339}
340
341TEST(OmahaRequestActionTest, MissingNodesetTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700342 OmahaResponse response;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700343 ASSERT_FALSE(TestUpdateCheck(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700344 NULL, // prefs
345 kDefaultTestParams,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700346 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
347 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
348 "appid=\"foo\" status=\"ok\"><ping "
349 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700350 -1,
351 kActionCodeOmahaRequestNoUpdateCheckNode,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700352 &response,
353 NULL));
354 EXPECT_FALSE(response.update_exists);
355}
356
357TEST(OmahaRequestActionTest, MissingFieldTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700358 OmahaResponse response;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700359 ASSERT_TRUE(TestUpdateCheck(NULL, // prefs
360 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700361 string("<?xml version=\"1.0\" "
362 "encoding=\"UTF-8\"?><gupdate "
363 "xmlns=\"http://www.google.com/"
364 "update2/response\" "
365 "protocol=\"2.0\"><app appid=\"") +
366 OmahaRequestParams::kAppId
367 + "\" status=\"ok\"><ping "
368 "status=\"ok\"/><updatecheck "
369 "DisplayVersion=\"1.2.3.4\" "
370 "Prompt=\"false\" "
Darin Petkovd22cb292010-09-29 10:02:29 -0700371 "codebase=\"http://code/base\" hash=\"foo\" "
372 "sha256=\"HASH1234=\" needsadmin=\"true\" "
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700373 "size=\"123\" "
374 "status=\"ok\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700375 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700376 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700377 &response,
378 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700379 EXPECT_TRUE(response.update_exists);
380 EXPECT_EQ("1.2.3.4", response.display_version);
381 EXPECT_EQ("http://code/base", response.codebase);
382 EXPECT_EQ("", response.more_info_url);
Andrew de los Reyes3270f742010-07-15 22:28:14 -0700383 EXPECT_FALSE(response.is_delta);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700384 EXPECT_EQ("HASH1234=", response.hash);
385 EXPECT_EQ(123, response.size);
386 EXPECT_TRUE(response.needs_admin);
387 EXPECT_FALSE(response.prompt);
Darin Petkov6c118642010-10-21 12:06:30 -0700388 EXPECT_TRUE(response.deadline.empty());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700389}
390
391namespace {
392class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
393 public:
394 void ProcessingStopped(const ActionProcessor* processor) {
395 ASSERT_TRUE(loop_);
396 g_main_loop_quit(loop_);
397 }
398 GMainLoop *loop_;
399};
400
401gboolean TerminateTransferTestStarter(gpointer data) {
402 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
403 processor->StartProcessing();
404 CHECK(processor->IsRunning());
405 processor->StopProcessing();
406 return FALSE;
407}
408} // namespace {}
409
410TEST(OmahaRequestActionTest, TerminateTransferTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700411 string http_response("doesn't matter");
412 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
413
Darin Petkov9c096d62010-11-17 14:49:04 -0800414 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700415 OmahaRequestAction action(&prefs, kDefaultTestParams, NULL,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700416 new MockHttpFetcher(http_response.data(),
Darin Petkov6a5b3222010-07-13 14:55:28 -0700417 http_response.size()));
418 TerminateEarlyTestProcessorDelegate delegate;
419 delegate.loop_ = loop;
420 ActionProcessor processor;
421 processor.set_delegate(&delegate);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700422 processor.EnqueueAction(&action);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700423
424 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
425 g_main_loop_run(loop);
426 g_main_loop_unref(loop);
427}
428
429TEST(OmahaRequestActionTest, XmlEncodeTest) {
430 EXPECT_EQ("ab", XmlEncode("ab"));
431 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
432 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
433 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
434 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
435
436 vector<char> post_data;
437
438 // Make sure XML Encode is being called on the params
Darin Petkov84c763c2010-07-29 16:27:58 -0700439 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Darin Petkov6a5b3222010-07-13 14:55:28 -0700440 OmahaRequestParams::kOsVersion,
441 "testtheservice_pack>",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700442 "x86 generic<id",
Darin Petkov6a5b3222010-07-13 14:55:28 -0700443 OmahaRequestParams::kAppId,
444 "0.1.0.0",
445 "en-US",
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700446 "unittest_track&lt;",
Darin Petkovfbb40092010-07-29 17:05:50 -0700447 "<OEM MODEL>",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700448 false, // delta okay
Darin Petkov6a5b3222010-07-13 14:55:28 -0700449 "http://url");
450 OmahaResponse response;
451 ASSERT_FALSE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700452 TestUpdateCheck(NULL, // prefs
453 params,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700454 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700455 -1,
456 kActionCodeOmahaRequestXMLParseError,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700457 &response,
458 &post_data));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700459 // convert post_data to string
460 string post_str(&post_data[0], post_data.size());
Darin Petkov6a5b3222010-07-13 14:55:28 -0700461 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
462 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700463 EXPECT_NE(post_str.find("x86 generic&lt;id"), string::npos);
464 EXPECT_EQ(post_str.find("x86 generic<id"), string::npos);
465 EXPECT_NE(post_str.find("unittest_track&amp;lt;"), string::npos);
466 EXPECT_EQ(post_str.find("unittest_track&lt;"), string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700467 EXPECT_NE(post_str.find("&lt;OEM MODEL&gt;"), string::npos);
468 EXPECT_EQ(post_str.find("<OEM MODEL>"), string::npos);
Darin Petkov6a5b3222010-07-13 14:55:28 -0700469}
470
471TEST(OmahaRequestActionTest, XmlDecodeTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700472 OmahaResponse response;
473 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700474 TestUpdateCheck(NULL, // prefs
475 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700476 GetUpdateResponse(OmahaRequestParams::kAppId,
477 "1.2.3.4", // version
478 "testthe&lt;url", // more info
479 "true", // prompt
480 "testthe&amp;codebase", // dl url
481 "HASH1234=", // checksum
482 "false", // needs admin
Darin Petkov6c118642010-10-21 12:06:30 -0700483 "123", // size
484 "&lt;20110101"), // deadline
Darin Petkovedc522e2010-11-05 09:35:17 -0700485 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700486 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700487 &response,
488 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700489
490 EXPECT_EQ(response.more_info_url, "testthe<url");
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700491 EXPECT_EQ(response.codebase, "testthe&codebase");
Darin Petkov6c118642010-10-21 12:06:30 -0700492 EXPECT_EQ(response.deadline, "<20110101");
Darin Petkov6a5b3222010-07-13 14:55:28 -0700493}
494
495TEST(OmahaRequestActionTest, ParseIntTest) {
Darin Petkov6a5b3222010-07-13 14:55:28 -0700496 OmahaResponse response;
497 ASSERT_TRUE(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700498 TestUpdateCheck(NULL, // prefs
499 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700500 GetUpdateResponse(OmahaRequestParams::kAppId,
501 "1.2.3.4", // version
502 "theurl", // more info
503 "true", // prompt
504 "thecodebase", // dl url
505 "HASH1234=", // checksum
506 "false", // needs admin
507 // overflows int32:
Darin Petkov6c118642010-10-21 12:06:30 -0700508 "123123123123123", // size
509 "deadline"),
Darin Petkovedc522e2010-11-05 09:35:17 -0700510 -1,
Darin Petkovc1a8b422010-07-19 11:34:49 -0700511 kActionCodeSuccess,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700512 &response,
513 NULL));
Darin Petkov6a5b3222010-07-13 14:55:28 -0700514
515 EXPECT_EQ(response.size, 123123123123123ll);
516}
517
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700518TEST(OmahaRequestActionTest, FormatUpdateCheckOutputTest) {
519 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700520 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
521 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700522 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700523 -1,
524 kActionCodeOmahaRequestXMLParseError,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700525 NULL, // response
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700526 &post_data));
527 // convert post_data to string
528 string post_str(&post_data[0], post_data.size());
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700529 EXPECT_NE(post_str.find(" <o:ping a=\"-1\" r=\"-1\"></o:ping>\n"
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700530 " <o:updatecheck></o:updatecheck>\n"),
531 string::npos);
Darin Petkovfbb40092010-07-29 17:05:50 -0700532 EXPECT_NE(post_str.find("hardware_class=\"OEM MODEL 09235 7471\""),
533 string::npos);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700534 EXPECT_EQ(post_str.find("o:event"), string::npos);
535}
536
Darin Petkove17f86b2010-07-20 09:12:01 -0700537TEST(OmahaRequestActionTest, FormatSuccessEventOutputTest) {
538 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700539 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700540 new OmahaEvent(OmahaEvent::kTypeUpdateDownloadStarted),
541 "invalid xml>",
542 &post_data);
543 // convert post_data to string
544 string post_str(&post_data[0], post_data.size());
545 string expected_event = StringPrintf(
546 " <o:event eventtype=\"%d\" eventresult=\"%d\"></o:event>\n",
547 OmahaEvent::kTypeUpdateDownloadStarted,
548 OmahaEvent::kResultSuccess);
549 EXPECT_NE(post_str.find(expected_event), string::npos);
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700550 EXPECT_EQ(post_str.find("o:ping"), string::npos);
Darin Petkove17f86b2010-07-20 09:12:01 -0700551 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
552}
553
554TEST(OmahaRequestActionTest, FormatErrorEventOutputTest) {
555 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700556 TestEvent(kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700557 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
558 OmahaEvent::kResultError,
559 kActionCodeError),
560 "invalid xml>",
561 &post_data);
562 // convert post_data to string
563 string post_str(&post_data[0], post_data.size());
564 string expected_event = StringPrintf(
565 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
566 "errorcode=\"%d\"></o:event>\n",
567 OmahaEvent::kTypeDownloadComplete,
568 OmahaEvent::kResultError,
569 kActionCodeError);
570 EXPECT_NE(post_str.find(expected_event), string::npos);
571 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
572}
573
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700574TEST(OmahaRequestActionTest, FormatEventOutputTest) {
575 vector<char> post_data;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700576 TestEvent(kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700577 new OmahaEvent(OmahaEvent::kTypeDownloadComplete,
578 OmahaEvent::kResultError,
Darin Petkove17f86b2010-07-20 09:12:01 -0700579 kActionCodeError),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700580 "invalid xml>",
581 &post_data);
582 // convert post_data to string
583 string post_str(&post_data[0], post_data.size());
584 string expected_event = StringPrintf(
585 " <o:event eventtype=\"%d\" eventresult=\"%d\" "
586 "errorcode=\"%d\"></o:event>\n",
587 OmahaEvent::kTypeDownloadComplete,
588 OmahaEvent::kResultError,
Darin Petkove17f86b2010-07-20 09:12:01 -0700589 kActionCodeError);
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700590 EXPECT_NE(post_str.find(expected_event), string::npos);
591 EXPECT_EQ(post_str.find("o:updatecheck"), string::npos);
592}
593
594TEST(OmahaRequestActionTest, IsEventTest) {
595 string http_response("doesn't matter");
Darin Petkov9c096d62010-11-17 14:49:04 -0800596 NiceMock<PrefsMock> prefs;
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700597 OmahaRequestAction update_check_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700598 &prefs,
599 kDefaultTestParams,
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700600 NULL,
601 new MockHttpFetcher(http_response.data(),
602 http_response.size()));
603 EXPECT_FALSE(update_check_action.IsEvent());
604
605 OmahaRequestAction event_action(
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700606 &prefs,
607 kDefaultTestParams,
Darin Petkove17f86b2010-07-20 09:12:01 -0700608 new OmahaEvent(OmahaEvent::kTypeUpdateComplete),
Darin Petkov0dc8e9a2010-07-14 14:51:57 -0700609 new MockHttpFetcher(http_response.data(),
610 http_response.size()));
611 EXPECT_TRUE(event_action.IsEvent());
612}
613
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700614TEST(OmahaRequestActionTest, FormatDeltaOkayOutputTest) {
615 for (int i = 0; i < 2; i++) {
616 bool delta_okay = i == 1;
617 const char* delta_okay_str = delta_okay ? "true" : "false";
618 vector<char> post_data;
Darin Petkov84c763c2010-07-29 16:27:58 -0700619 OmahaRequestParams params(OmahaRequestParams::kOsPlatform,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700620 OmahaRequestParams::kOsVersion,
621 "service_pack",
622 "x86-generic",
623 OmahaRequestParams::kAppId,
624 "0.1.0.0",
625 "en-US",
626 "unittest_track",
Darin Petkovfbb40092010-07-29 17:05:50 -0700627 "OEM MODEL REV 1234",
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700628 delta_okay,
629 "http://url");
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700630 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
631 params,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700632 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700633 -1,
634 kActionCodeOmahaRequestXMLParseError,
Andrew de los Reyes3f0303a2010-07-15 22:35:35 -0700635 NULL,
636 &post_data));
637 // convert post_data to string
638 string post_str(&post_data[0], post_data.size());
639 EXPECT_NE(post_str.find(StringPrintf(" delta_okay=\"%s\"", delta_okay_str)),
640 string::npos)
641 << "i = " << i;
642 }
643}
644
Darin Petkove17f86b2010-07-20 09:12:01 -0700645TEST(OmahaRequestActionTest, OmahaEventTest) {
646 OmahaEvent default_event;
647 EXPECT_EQ(OmahaEvent::kTypeUnknown, default_event.type);
648 EXPECT_EQ(OmahaEvent::kResultError, default_event.result);
649 EXPECT_EQ(kActionCodeError, default_event.error_code);
650
651 OmahaEvent success_event(OmahaEvent::kTypeUpdateDownloadStarted);
652 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadStarted, success_event.type);
653 EXPECT_EQ(OmahaEvent::kResultSuccess, success_event.result);
654 EXPECT_EQ(kActionCodeSuccess, success_event.error_code);
655
656 OmahaEvent error_event(OmahaEvent::kTypeUpdateDownloadFinished,
657 OmahaEvent::kResultError,
658 kActionCodeError);
659 EXPECT_EQ(OmahaEvent::kTypeUpdateDownloadFinished, error_event.type);
660 EXPECT_EQ(OmahaEvent::kResultError, error_event.result);
661 EXPECT_EQ(kActionCodeError, error_event.error_code);
662}
663
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700664TEST(OmahaRequestActionTest, PingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800665 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700666 // Add a few hours to the day difference to test no rounding, etc.
667 int64_t five_days_ago =
668 (Time::Now() - TimeDelta::FromHours(5 * 24 + 13)).ToInternalValue();
669 int64_t six_days_ago =
670 (Time::Now() - TimeDelta::FromHours(6 * 24 + 11)).ToInternalValue();
671 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
672 .WillOnce(DoAll(SetArgumentPointee<1>(six_days_ago), Return(true)));
673 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
674 .WillOnce(DoAll(SetArgumentPointee<1>(five_days_ago), Return(true)));
675 vector<char> post_data;
676 ASSERT_TRUE(
677 TestUpdateCheck(&prefs,
678 kDefaultTestParams,
679 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700680 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700681 kActionCodeSuccess,
682 NULL,
683 &post_data));
684 string post_str(&post_data[0], post_data.size());
685 EXPECT_NE(post_str.find("<o:ping a=\"6\" r=\"5\"></o:ping>"), string::npos);
686}
687
688TEST(OmahaRequestActionTest, ActivePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800689 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700690 int64_t three_days_ago =
691 (Time::Now() - TimeDelta::FromHours(3 * 24 + 12)).ToInternalValue();
692 int64_t now = Time::Now().ToInternalValue();
693 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
694 .WillOnce(DoAll(SetArgumentPointee<1>(three_days_ago), Return(true)));
695 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
696 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
697 vector<char> post_data;
698 ASSERT_TRUE(
699 TestUpdateCheck(&prefs,
700 kDefaultTestParams,
701 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700702 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700703 kActionCodeSuccess,
704 NULL,
705 &post_data));
706 string post_str(&post_data[0], post_data.size());
707 EXPECT_NE(post_str.find("<o:ping a=\"3\"></o:ping>"), string::npos);
708}
709
710TEST(OmahaRequestActionTest, RollCallPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800711 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700712 int64_t four_days_ago =
713 (Time::Now() - TimeDelta::FromHours(4 * 24)).ToInternalValue();
714 int64_t now = Time::Now().ToInternalValue();
715 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
716 .WillOnce(DoAll(SetArgumentPointee<1>(now), Return(true)));
717 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
718 .WillOnce(DoAll(SetArgumentPointee<1>(four_days_ago), Return(true)));
719 vector<char> post_data;
720 ASSERT_TRUE(
721 TestUpdateCheck(&prefs,
722 kDefaultTestParams,
723 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700724 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700725 kActionCodeSuccess,
726 NULL,
727 &post_data));
728 string post_str(&post_data[0], post_data.size());
729 EXPECT_NE(post_str.find("<o:ping r=\"4\"></o:ping>\n"), string::npos);
730}
731
732TEST(OmahaRequestActionTest, NoPingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800733 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700734 int64_t one_hour_ago =
735 (Time::Now() - TimeDelta::FromHours(1)).ToInternalValue();
736 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
737 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
738 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
739 .WillOnce(DoAll(SetArgumentPointee<1>(one_hour_ago), Return(true)));
740 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
741 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
742 vector<char> post_data;
743 ASSERT_TRUE(
744 TestUpdateCheck(&prefs,
745 kDefaultTestParams,
746 GetNoUpdateResponse(OmahaRequestParams::kAppId),
Darin Petkovedc522e2010-11-05 09:35:17 -0700747 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700748 kActionCodeSuccess,
749 NULL,
750 &post_data));
751 string post_str(&post_data[0], post_data.size());
752 EXPECT_EQ(post_str.find("o:ping"), string::npos);
753}
754
755TEST(OmahaRequestActionTest, BackInTimePingTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800756 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700757 int64_t future =
758 (Time::Now() + TimeDelta::FromHours(3 * 24 + 4)).ToInternalValue();
759 EXPECT_CALL(prefs, GetInt64(kPrefsLastActivePingDay, _))
760 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
761 EXPECT_CALL(prefs, GetInt64(kPrefsLastRollCallPingDay, _))
762 .WillOnce(DoAll(SetArgumentPointee<1>(future), Return(true)));
763 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _))
764 .WillOnce(Return(true));
765 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _))
766 .WillOnce(Return(true));
767 vector<char> post_data;
768 ASSERT_TRUE(
769 TestUpdateCheck(&prefs,
770 kDefaultTestParams,
771 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
772 "xmlns=\"http://www.google.com/update2/response\" "
773 "protocol=\"2.0\"><daystart elapsed_seconds=\"100\"/>"
774 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
775 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700776 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700777 kActionCodeSuccess,
778 NULL,
779 &post_data));
780 string post_str(&post_data[0], post_data.size());
781 EXPECT_EQ(post_str.find("o:ping"), string::npos);
782}
783
784TEST(OmahaRequestActionTest, LastPingDayUpdateTest) {
785 // This test checks that the action updates the last ping day to now
Darin Petkov84c763c2010-07-29 16:27:58 -0700786 // minus 200 seconds with a slack of 5 seconds. Therefore, the test
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700787 // may fail if it runs for longer than 5 seconds. It shouldn't run
788 // that long though.
789 int64_t midnight =
790 (Time::Now() - TimeDelta::FromSeconds(200)).ToInternalValue();
791 int64_t midnight_slack =
792 (Time::Now() - TimeDelta::FromSeconds(195)).ToInternalValue();
Darin Petkov9c096d62010-11-17 14:49:04 -0800793 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700794 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay,
795 AllOf(Ge(midnight), Le(midnight_slack))))
796 .WillOnce(Return(true));
797 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay,
798 AllOf(Ge(midnight), Le(midnight_slack))))
799 .WillOnce(Return(true));
800 ASSERT_TRUE(
801 TestUpdateCheck(&prefs,
802 kDefaultTestParams,
803 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
804 "xmlns=\"http://www.google.com/update2/response\" "
805 "protocol=\"2.0\"><daystart elapsed_seconds=\"200\"/>"
806 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
807 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700808 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700809 kActionCodeSuccess,
810 NULL,
811 NULL));
812}
813
814TEST(OmahaRequestActionTest, NoElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800815 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700816 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
817 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
818 ASSERT_TRUE(
819 TestUpdateCheck(&prefs,
820 kDefaultTestParams,
821 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
822 "xmlns=\"http://www.google.com/update2/response\" "
823 "protocol=\"2.0\"><daystart blah=\"200\"/>"
824 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
825 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700826 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700827 kActionCodeSuccess,
828 NULL,
829 NULL));
830}
831
832TEST(OmahaRequestActionTest, BadElapsedSecondsTest) {
Darin Petkov9c096d62010-11-17 14:49:04 -0800833 NiceMock<PrefsMock> prefs;
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700834 EXPECT_CALL(prefs, SetInt64(kPrefsLastActivePingDay, _)).Times(0);
835 EXPECT_CALL(prefs, SetInt64(kPrefsLastRollCallPingDay, _)).Times(0);
836 ASSERT_TRUE(
837 TestUpdateCheck(&prefs,
838 kDefaultTestParams,
839 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
840 "xmlns=\"http://www.google.com/update2/response\" "
841 "protocol=\"2.0\"><daystart elapsed_seconds=\"x\"/>"
842 "<app appid=\"foo\" status=\"ok\"><ping status=\"ok\"/>"
843 "<updatecheck status=\"noupdate\"/></app></gupdate>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700844 -1,
Darin Petkov1cbd78f2010-07-29 12:38:34 -0700845 kActionCodeSuccess,
846 NULL,
847 NULL));
848}
849
Darin Petkov84c763c2010-07-29 16:27:58 -0700850TEST(OmahaRequestActionTest, NoUniqueIDTest) {
851 vector<char> post_data;
852 ASSERT_FALSE(TestUpdateCheck(NULL, // prefs
853 kDefaultTestParams,
854 "invalid xml>",
Darin Petkovedc522e2010-11-05 09:35:17 -0700855 -1,
856 kActionCodeOmahaRequestXMLParseError,
Darin Petkov84c763c2010-07-29 16:27:58 -0700857 NULL, // response
858 &post_data));
859 // convert post_data to string
860 string post_str(&post_data[0], post_data.size());
861 EXPECT_EQ(post_str.find("machineid="), string::npos);
862 EXPECT_EQ(post_str.find("userid="), string::npos);
863}
864
Darin Petkovedc522e2010-11-05 09:35:17 -0700865TEST(OmahaRequestActionTest, NetworkFailureTest) {
866 OmahaResponse response;
867 ASSERT_FALSE(
868 TestUpdateCheck(NULL, // prefs
869 kDefaultTestParams,
870 "",
871 501,
872 static_cast<ActionExitCode>(
873 kActionCodeOmahaRequestHTTPResponseBase + 501),
874 &response,
875 NULL));
876 EXPECT_FALSE(response.update_exists);
877}
878
879TEST(OmahaRequestActionTest, NetworkFailureBadHTTPCodeTest) {
880 OmahaResponse response;
881 ASSERT_FALSE(
882 TestUpdateCheck(NULL, // prefs
883 kDefaultTestParams,
884 "",
885 1500,
886 static_cast<ActionExitCode>(
887 kActionCodeOmahaRequestHTTPResponseBase + 999),
888 &response,
889 NULL));
890 EXPECT_FALSE(response.update_exists);
891}
892
Darin Petkov6a5b3222010-07-13 14:55:28 -0700893} // namespace chromeos_update_engine