Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(20)

Side by Side Diff: update_check_action_unittest.cc

Issue 2981007: Rename UpdateCheckAction|Params to OmahaRequestAction|Params. (Closed) Base URL: ssh://git@gitrw.chromium.org:9222/update_engine.git
Patch Set: fix the comment Created 10 years, 5 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « update_attempter.cc ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 // Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
2 // 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>
7 #include <glib.h>
8 #include <gtest/gtest.h>
9 #include "update_engine/action_pipe.h"
10 #include "update_engine/update_check_action.h"
11 #include "update_engine/mock_http_fetcher.h"
12 #include "update_engine/omaha_hash_calculator.h"
13 #include "update_engine/test_utils.h"
14
15 using std::string;
16 using std::vector;
17
18 namespace chromeos_update_engine {
19
20 class UpdateCheckActionTest : public ::testing::Test { };
21
22 namespace {
23 string GetNoUpdateResponse(const string& app_id) {
24 return string(
25 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
26 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
27 "appid=\"") + app_id + "\" status=\"ok\"><ping "
28 "status=\"ok\"/><updatecheck status=\"noupdate\"/></app></gupdate>";
29 }
30
31 string GetUpdateResponse(const string& app_id,
32 const string& display_version,
33 const string& more_info_url,
34 const string& prompt,
35 const string& codebase,
36 const string& hash,
37 const string& needsadmin,
38 const string& size) {
39 return string("<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
40 "xmlns=\"http://www.google.com/update2/response\" "
41 "protocol=\"2.0\"><app "
42 "appid=\"") + app_id + "\" status=\"ok\"><ping "
43 "status=\"ok\"/><updatecheck DisplayVersion=\"" + display_version + "\" "
44 "MoreInfo=\"" + more_info_url + "\" Prompt=\"" + prompt + "\" "
45 "codebase=\"" + codebase + "\" "
46 "hash=\"" + hash + "\" needsadmin=\"" + needsadmin + "\" "
47 "size=\"" + size + "\" status=\"ok\"/></app></gupdate>";
48 }
49
50 class UpdateCheckActionTestProcessorDelegate : public ActionProcessorDelegate {
51 public:
52 UpdateCheckActionTestProcessorDelegate()
53 : loop_(NULL),
54 expected_success_(true) {}
55 virtual ~UpdateCheckActionTestProcessorDelegate() {
56 }
57 virtual void ProcessingDone(const ActionProcessor* processor, bool success) {
58 ASSERT_TRUE(loop_);
59 g_main_loop_quit(loop_);
60 }
61
62 virtual void ActionCompleted(ActionProcessor* processor,
63 AbstractAction* action,
64 bool success) {
65 // make sure actions always succeed
66 if (action->Type() == UpdateCheckAction::StaticType())
67 EXPECT_EQ(expected_success_, success);
68 else
69 EXPECT_TRUE(success);
70 }
71 GMainLoop *loop_;
72 bool expected_success_;
73 };
74
75 gboolean StartProcessorInRunLoop(gpointer data) {
76 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
77 processor->StartProcessing();
78 return FALSE;
79 }
80
81 } // namespace {}
82
83 class OutputObjectCollectorAction;
84
85 template<>
86 class ActionTraits<OutputObjectCollectorAction> {
87 public:
88 // Does not take an object for input
89 typedef UpdateCheckResponse InputObjectType;
90 // On success, puts the output path on output
91 typedef NoneType OutputObjectType;
92 };
93
94 class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
95 public:
96 OutputObjectCollectorAction() : has_input_object_(false) {}
97 void PerformAction() {
98 // copy input object
99 has_input_object_ = HasInputObject();
100 if (has_input_object_)
101 update_check_response_ = GetInputObject();
102 processor_->ActionComplete(this, true);
103 }
104 // Should never be called
105 void TerminateProcessing() {
106 CHECK(false);
107 }
108 // Debugging/logging
109 static std::string StaticType() {
110 return "OutputObjectCollectorAction";
111 }
112 std::string Type() const { return StaticType(); }
113 bool has_input_object_;
114 UpdateCheckResponse update_check_response_;
115 };
116
117 // returns true iff an output response was obtained from the
118 // UpdateCheckAction. out_response may be NULL.
119 // out_post_data may be null; if non-null, the post-data received by the
120 // mock HttpFetcher is returned.
121 bool TestUpdateCheckAction(const UpdateCheckParams& params,
122 const string& http_response,
123 bool expected_success,
124 UpdateCheckResponse* out_response,
125 vector<char> *out_post_data) {
126 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
127 MockHttpFetcher *fetcher = new MockHttpFetcher(http_response.data(),
128 http_response.size());
129 ObjectFeederAction<UpdateCheckParams> feeder_action;
130 UpdateCheckAction action(fetcher); // takes ownership of fetcher
131 UpdateCheckActionTestProcessorDelegate delegate;
132 delegate.loop_ = loop;
133 delegate.expected_success_ = expected_success;
134 ActionProcessor processor;
135 feeder_action.set_obj(params);
136 processor.set_delegate(&delegate);
137 processor.EnqueueAction(&feeder_action);
138 processor.EnqueueAction(&action);
139
140 OutputObjectCollectorAction collector_action;
141
142 BondActions(&feeder_action, &action);
143 BondActions(&action, &collector_action);
144 processor.EnqueueAction(&collector_action);
145
146 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
147 g_main_loop_run(loop);
148 g_main_loop_unref(loop);
149 if (collector_action.has_input_object_ && out_response)
150 *out_response = collector_action.update_check_response_;
151 if (out_post_data)
152 *out_post_data = fetcher->post_data();
153 return collector_action.has_input_object_;
154 }
155
156 TEST(UpdateCheckActionTest, NoUpdateTest) {
157 UpdateCheckParams params("", // machine_id
158 "", // user_id
159 UpdateCheckParams::kOsPlatform,
160 UpdateCheckParams::kOsVersion,
161 "", // os_sp
162 "x86-generic",
163 UpdateCheckParams::kAppId,
164 "0.1.0.0",
165 "en-US",
166 "unittest",
167 ""); // url
168 UpdateCheckResponse response;
169 ASSERT_TRUE(
170 TestUpdateCheckAction(params,
171 GetNoUpdateResponse(UpdateCheckParams::kAppId),
172 true,
173 &response,
174 NULL));
175 EXPECT_FALSE(response.update_exists);
176 }
177
178 TEST(UpdateCheckActionTest, ValidUpdateTest) {
179 UpdateCheckParams params("machine_id",
180 "user_id",
181 UpdateCheckParams::kOsPlatform,
182 UpdateCheckParams::kOsVersion,
183 "service_pack",
184 "arm-generic",
185 UpdateCheckParams::kAppId,
186 "0.1.0.0",
187 "en-US",
188 "unittest_track",
189 ""); // url
190 UpdateCheckResponse response;
191 ASSERT_TRUE(
192 TestUpdateCheckAction(params,
193 GetUpdateResponse(UpdateCheckParams::kAppId,
194 "1.2.3.4", // version
195 "http://more/info",
196 "true", // prompt
197 "http://code/base", // dl url
198 "HASH1234=", // checksum
199 "false", // needs admin
200 "123"), // size
201 true,
202 &response,
203 NULL));
204 EXPECT_TRUE(response.update_exists);
205 EXPECT_EQ("1.2.3.4", response.display_version);
206 EXPECT_EQ("http://code/base", response.codebase);
207 EXPECT_EQ("http://more/info", response.more_info_url);
208 EXPECT_EQ("HASH1234=", response.hash);
209 EXPECT_EQ(123, response.size);
210 EXPECT_FALSE(response.needs_admin);
211 EXPECT_TRUE(response.prompt);
212 }
213
214 TEST(UpdateCheckActionTest, NoOutputPipeTest) {
215 UpdateCheckParams params("", // machine_id
216 "", // usr_id
217 UpdateCheckParams::kOsPlatform,
218 UpdateCheckParams::kOsVersion,
219 "", // os_sp
220 "", // os_board
221 UpdateCheckParams::kAppId,
222 "0.1.0.0",
223 "en-US",
224 "unittest",
225 ""); // url
226 const string http_response(GetNoUpdateResponse(UpdateCheckParams::kAppId));
227
228 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
229
230 ObjectFeederAction<UpdateCheckParams> feeder_action;
231 feeder_action.set_obj(params);
232 UpdateCheckAction action(new MockHttpFetcher(http_response.data(),
233 http_response.size()));
234 UpdateCheckActionTestProcessorDelegate delegate;
235 delegate.loop_ = loop;
236 ActionProcessor processor;
237 processor.set_delegate(&delegate);
238 processor.EnqueueAction(&feeder_action);
239 processor.EnqueueAction(&action);
240 BondActions(&feeder_action, &action);
241
242 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
243 g_main_loop_run(loop);
244 g_main_loop_unref(loop);
245 EXPECT_FALSE(processor.IsRunning());
246 }
247
248 TEST(UpdateCheckActionTest, InvalidXmlTest) {
249 UpdateCheckParams params("machine_id",
250 "user_id",
251 UpdateCheckParams::kOsPlatform,
252 UpdateCheckParams::kOsVersion,
253 "service_pack",
254 "x86-generic",
255 UpdateCheckParams::kAppId,
256 "0.1.0.0",
257 "en-US",
258 "unittest_track",
259 "http://url");
260 UpdateCheckResponse response;
261 ASSERT_FALSE(
262 TestUpdateCheckAction(params,
263 "invalid xml>",
264 false,
265 &response,
266 NULL));
267 EXPECT_FALSE(response.update_exists);
268 }
269
270 TEST(UpdateCheckActionTest, MissingStatusTest) {
271 UpdateCheckParams params("machine_id",
272 "user_id",
273 UpdateCheckParams::kOsPlatform,
274 UpdateCheckParams::kOsVersion,
275 "service_pack",
276 "x86-generic",
277 UpdateCheckParams::kAppId,
278 "0.1.0.0",
279 "en-US",
280 "unittest_track",
281 "http://url");
282 UpdateCheckResponse response;
283 ASSERT_FALSE(TestUpdateCheckAction(
284 params,
285 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
286 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
287 "appid=\"foo\" status=\"ok\"><ping "
288 "status=\"ok\"/><updatecheck/></app></gupdate>",
289 false,
290 &response,
291 NULL));
292 EXPECT_FALSE(response.update_exists);
293 }
294
295 TEST(UpdateCheckActionTest, InvalidStatusTest) {
296 UpdateCheckParams params("machine_id",
297 "user_id",
298 UpdateCheckParams::kOsPlatform,
299 UpdateCheckParams::kOsVersion,
300 "service_pack",
301 "x86-generic",
302 UpdateCheckParams::kAppId,
303 "0.1.0.0",
304 "en-US",
305 "unittest_track",
306 "http://url");
307 UpdateCheckResponse response;
308 ASSERT_FALSE(TestUpdateCheckAction(
309 params,
310 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
311 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
312 "appid=\"foo\" status=\"ok\"><ping "
313 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
314 false,
315 &response,
316 NULL));
317 EXPECT_FALSE(response.update_exists);
318 }
319
320 TEST(UpdateCheckActionTest, MissingNodesetTest) {
321 UpdateCheckParams params("machine_id",
322 "user_id",
323 UpdateCheckParams::kOsPlatform,
324 UpdateCheckParams::kOsVersion,
325 "service_pack",
326 "x86-generic",
327 UpdateCheckParams::kAppId,
328 "0.1.0.0",
329 "en-US",
330 "unittest_track",
331 "http://url");
332 UpdateCheckResponse response;
333 ASSERT_FALSE(TestUpdateCheckAction(
334 params,
335 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
336 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
337 "appid=\"foo\" status=\"ok\"><ping "
338 "status=\"ok\"/></app></gupdate>",
339 false,
340 &response,
341 NULL));
342 EXPECT_FALSE(response.update_exists);
343 }
344
345 TEST(UpdateCheckActionTest, MissingFieldTest) {
346 UpdateCheckParams params("machine_id",
347 "user_id",
348 UpdateCheckParams::kOsPlatform,
349 UpdateCheckParams::kOsVersion,
350 "service_pack",
351 "x86-generic",
352 UpdateCheckParams::kAppId,
353 "0.1.0.0",
354 "en-US",
355 "unittest_track",
356 "http://url");
357 UpdateCheckResponse response;
358 ASSERT_TRUE(TestUpdateCheckAction(params,
359 string("<?xml version=\"1.0\" "
360 "encoding=\"UTF-8\"?><gupdate "
361 "xmlns=\"http://www.google.com/"
362 "update2/response\" "
363 "protocol=\"2.0\"><app appid=\"") +
364 UpdateCheckParams::kAppId
365 + "\" status=\"ok\"><ping "
366 "status=\"ok\"/><updatecheck "
367 "DisplayVersion=\"1.2.3.4\" "
368 "Prompt=\"false\" "
369 "codebase=\"http://code/base\" "
370 "hash=\"HASH1234=\" needsadmin=\"true\" "
371 "size=\"123\" "
372 "status=\"ok\"/></app></gupdate>",
373 true,
374 &response,
375 NULL));
376 EXPECT_TRUE(response.update_exists);
377 EXPECT_EQ("1.2.3.4", response.display_version);
378 EXPECT_EQ("http://code/base", response.codebase);
379 EXPECT_EQ("", response.more_info_url);
380 EXPECT_EQ("HASH1234=", response.hash);
381 EXPECT_EQ(123, response.size);
382 EXPECT_TRUE(response.needs_admin);
383 EXPECT_FALSE(response.prompt);
384 }
385
386 namespace {
387 class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
388 public:
389 void ProcessingStopped(const ActionProcessor* processor) {
390 ASSERT_TRUE(loop_);
391 g_main_loop_quit(loop_);
392 }
393 GMainLoop *loop_;
394 };
395
396 gboolean TerminateTransferTestStarter(gpointer data) {
397 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
398 processor->StartProcessing();
399 CHECK(processor->IsRunning());
400 processor->StopProcessing();
401 return FALSE;
402 }
403 } // namespace {}
404
405 TEST(UpdateCheckActionTest, TerminateTransferTest) {
406 UpdateCheckParams params("", // machine_id
407 "", // usr_id
408 UpdateCheckParams::kOsPlatform,
409 UpdateCheckParams::kOsVersion,
410 "", // os_sp
411 "", // os_board
412 UpdateCheckParams::kAppId,
413 "0.1.0.0",
414 "en-US",
415 "unittest",
416 "http://url");
417 string http_response("doesn't matter");
418 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
419
420 ObjectFeederAction<UpdateCheckParams> feeder_action;
421 feeder_action.set_obj(params);
422 UpdateCheckAction action(new MockHttpFetcher(http_response.data(),
423 http_response.size()));
424 TerminateEarlyTestProcessorDelegate delegate;
425 delegate.loop_ = loop;
426 ActionProcessor processor;
427 processor.set_delegate(&delegate);
428 processor.EnqueueAction(&feeder_action);
429 processor.EnqueueAction(&action);
430 BondActions(&feeder_action, &action);
431
432 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
433 g_main_loop_run(loop);
434 g_main_loop_unref(loop);
435 }
436
437 TEST(UpdateCheckActionTest, XmlEncodeTest) {
438 EXPECT_EQ("ab", XmlEncode("ab"));
439 EXPECT_EQ("a&lt;b", XmlEncode("a<b"));
440 EXPECT_EQ("foo-&#x3A9;", XmlEncode("foo-\xce\xa9"));
441 EXPECT_EQ("&lt;&amp;&gt;", XmlEncode("<&>"));
442 EXPECT_EQ("&amp;lt;&amp;amp;&amp;gt;", XmlEncode("&lt;&amp;&gt;"));
443
444 vector<char> post_data;
445
446 // Make sure XML Encode is being called on the params
447 UpdateCheckParams params("testthemachine<id",
448 "testtheuser_id&lt;",
449 UpdateCheckParams::kOsPlatform,
450 UpdateCheckParams::kOsVersion,
451 "testtheservice_pack>",
452 "x86 generic",
453 UpdateCheckParams::kAppId,
454 "0.1.0.0",
455 "en-US",
456 "unittest_track",
457 "http://url");
458 UpdateCheckResponse response;
459 ASSERT_FALSE(
460 TestUpdateCheckAction(params,
461 "invalid xml>",
462 false,
463 &response,
464 &post_data));
465 // convert post_data to string
466 string post_str(&post_data[0], post_data.size());
467 EXPECT_NE(post_str.find("testthemachine&lt;id"), string::npos);
468 EXPECT_EQ(post_str.find("testthemachine<id"), string::npos);
469 EXPECT_NE(post_str.find("testtheuser_id&amp;lt;"), string::npos);
470 EXPECT_EQ(post_str.find("testtheuser_id&lt;"), string::npos);
471 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
472 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
473 EXPECT_NE(post_str.find("x86 generic"), string::npos);
474 }
475
476 TEST(UpdateCheckActionTest, XmlDecodeTest) {
477 UpdateCheckParams params("machine_id",
478 "user_id",
479 UpdateCheckParams::kOsPlatform,
480 UpdateCheckParams::kOsVersion,
481 "service_pack",
482 "x86-generic",
483 UpdateCheckParams::kAppId,
484 "0.1.0.0",
485 "en-US",
486 "unittest_track",
487 "http://url");
488 UpdateCheckResponse response;
489 ASSERT_TRUE(
490 TestUpdateCheckAction(params,
491 GetUpdateResponse(UpdateCheckParams::kAppId,
492 "1.2.3.4", // version
493 "testthe&lt;url", // more info
494 "true", // prompt
495 "testthe&amp;codebase", // dl url
496 "HASH1234=", // checksum
497 "false", // needs admin
498 "123"), // size
499 true,
500 &response,
501 NULL));
502
503 EXPECT_EQ(response.more_info_url, "testthe<url");
504 EXPECT_EQ(response.codebase, "testthe&codebase");
505 }
506
507 TEST(UpdateCheckActionTest, ParseIntTest) {
508 UpdateCheckParams params("machine_id",
509 "user_id",
510 UpdateCheckParams::kOsPlatform,
511 UpdateCheckParams::kOsVersion,
512 "service_pack",
513 "the_board",
514 UpdateCheckParams::kAppId,
515 "0.1.0.0",
516 "en-US",
517 "unittest_track",
518 "http://url");
519 UpdateCheckResponse response;
520 ASSERT_TRUE(
521 TestUpdateCheckAction(params,
522 GetUpdateResponse(UpdateCheckParams::kAppId,
523 "1.2.3.4", // version
524 "theurl", // more info
525 "true", // prompt
526 "thecodebase", // dl url
527 "HASH1234=", // checksum
528 "false", // needs admin
529 // overflows int32:
530 "123123123123123"), // size
531 true,
532 &response,
533 NULL));
534
535 EXPECT_EQ(response.size, 123123123123123ll);
536 }
537
538 } // namespace chromeos_update_engine
OLDNEW
« no previous file with comments | « update_attempter.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698