blob: c730b407102b20abaab39d3222a9cc22576cbb9c [file] [log] [blame]
rspangler@google.com49fdf182009-10-10 00:57:34 +00001// 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>
adlr@google.comc98a7ed2009-12-04 18:54:03 +00006#include <vector>
rspangler@google.com49fdf182009-10-10 00:57:34 +00007#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
rspangler@google.com49fdf182009-10-10 00:57:34 +000015using std::string;
adlr@google.comc98a7ed2009-12-04 18:54:03 +000016using std::vector;
17
18namespace chromeos_update_engine {
rspangler@google.com49fdf182009-10-10 00:57:34 +000019
20class UpdateCheckActionTest : public ::testing::Test { };
21
22namespace {
23string 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
31string 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 "
adlr@google.comc98a7ed2009-12-04 18:54:03 +000040 "xmlns=\"http://www.google.com/update2/response\" "
41 "protocol=\"2.0\"><app "
42 "appid=\"") + app_id + "\" status=\"ok\"><ping "
rspangler@google.com49fdf182009-10-10 00:57:34 +000043 "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
50class UpdateCheckActionTestProcessorDelegate : public ActionProcessorDelegate {
51 public:
52 UpdateCheckActionTestProcessorDelegate()
53 : loop_(NULL),
54 expected_success_(true) {}
55 virtual ~UpdateCheckActionTestProcessorDelegate() {
56 }
Andrew de los Reyes4fe15d02009-12-10 19:01:36 -080057 virtual void ProcessingDone(const ActionProcessor* processor, bool success) {
rspangler@google.com49fdf182009-10-10 00:57:34 +000058 ASSERT_TRUE(loop_);
59 g_main_loop_quit(loop_);
60 }
61
adlr@google.comc98a7ed2009-12-04 18:54:03 +000062 virtual void ActionCompleted(ActionProcessor* processor,
63 AbstractAction* action,
rspangler@google.com49fdf182009-10-10 00:57:34 +000064 bool success) {
65 // make sure actions always succeed
adlr@google.comc98a7ed2009-12-04 18:54:03 +000066 if (action->Type() == UpdateCheckAction::StaticType())
rspangler@google.com49fdf182009-10-10 00:57:34 +000067 EXPECT_EQ(expected_success_, success);
68 else
69 EXPECT_TRUE(success);
70 }
71 GMainLoop *loop_;
72 bool expected_success_;
73};
74
75gboolean StartProcessorInRunLoop(gpointer data) {
76 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
77 processor->StartProcessing();
78 return FALSE;
79}
80
81} // namespace {}
82
83class OutputObjectCollectorAction;
84
85template<>
86class 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
94class OutputObjectCollectorAction : public Action<OutputObjectCollectorAction> {
95 public:
Andrew de los Reyes08c4e272010-04-15 14:02:17 -070096 OutputObjectCollectorAction() : has_input_object_(false) {}
rspangler@google.com49fdf182009-10-10 00:57:34 +000097 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
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000109 static std::string StaticType() {
110 return "OutputObjectCollectorAction";
111 }
112 std::string Type() const { return StaticType(); }
rspangler@google.com49fdf182009-10-10 00:57:34 +0000113 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.
121bool 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());
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000129 ObjectFeederAction<UpdateCheckParams> feeder_action;
130 UpdateCheckAction action(fetcher); // takes ownership of fetcher
rspangler@google.com49fdf182009-10-10 00:57:34 +0000131 UpdateCheckActionTestProcessorDelegate delegate;
132 delegate.loop_ = loop;
133 delegate.expected_success_ = expected_success;
134 ActionProcessor processor;
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000135 feeder_action.set_obj(params);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000136 processor.set_delegate(&delegate);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000137 processor.EnqueueAction(&feeder_action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000138 processor.EnqueueAction(&action);
139
140 OutputObjectCollectorAction collector_action;
141
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000142 BondActions(&feeder_action, &action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000143 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
156TEST(UpdateCheckActionTest, NoUpdateTest) {
157 UpdateCheckParams params("", // machine_id
158 "", // user_id
159 UpdateCheckParams::kOsPlatform,
160 UpdateCheckParams::kOsVersion,
161 "", // os_sp
162 UpdateCheckParams::kAppId,
163 "0.1.0.0",
164 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700165 "unittest",
166 ""); // url
rspangler@google.com49fdf182009-10-10 00:57:34 +0000167 UpdateCheckResponse response;
168 ASSERT_TRUE(
169 TestUpdateCheckAction(params,
170 GetNoUpdateResponse(UpdateCheckParams::kAppId),
171 true,
172 &response,
173 NULL));
174 EXPECT_FALSE(response.update_exists);
175}
176
177TEST(UpdateCheckActionTest, ValidUpdateTest) {
178 UpdateCheckParams params("machine_id",
179 "user_id",
180 UpdateCheckParams::kOsPlatform,
181 UpdateCheckParams::kOsVersion,
182 "service_pack",
183 UpdateCheckParams::kAppId,
184 "0.1.0.0",
185 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700186 "unittest_track",
187 ""); // url
rspangler@google.com49fdf182009-10-10 00:57:34 +0000188 UpdateCheckResponse response;
189 ASSERT_TRUE(
190 TestUpdateCheckAction(params,
191 GetUpdateResponse(UpdateCheckParams::kAppId,
192 "1.2.3.4", // version
193 "http://more/info",
194 "true", // prompt
195 "http://code/base", // dl url
196 "HASH1234=", // checksum
197 "false", // needs admin
198 "123"), // size
199 true,
200 &response,
201 NULL));
202 EXPECT_TRUE(response.update_exists);
203 EXPECT_EQ("1.2.3.4", response.display_version);
204 EXPECT_EQ("http://code/base", response.codebase);
205 EXPECT_EQ("http://more/info", response.more_info_url);
206 EXPECT_EQ("HASH1234=", response.hash);
207 EXPECT_EQ(123, response.size);
208 EXPECT_FALSE(response.needs_admin);
209 EXPECT_TRUE(response.prompt);
210}
211
212TEST(UpdateCheckActionTest, NoOutputPipeTest) {
213 UpdateCheckParams params("", // machine_id
214 "", // usr_id
215 UpdateCheckParams::kOsPlatform,
216 UpdateCheckParams::kOsVersion,
217 "", // os_sp
218 UpdateCheckParams::kAppId,
219 "0.1.0.0",
220 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700221 "unittest",
222 ""); // url
rspangler@google.com49fdf182009-10-10 00:57:34 +0000223 const string http_response(GetNoUpdateResponse(UpdateCheckParams::kAppId));
224
225 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
226
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000227 ObjectFeederAction<UpdateCheckParams> feeder_action;
228 feeder_action.set_obj(params);
229 UpdateCheckAction action(new MockHttpFetcher(http_response.data(),
rspangler@google.com49fdf182009-10-10 00:57:34 +0000230 http_response.size()));
231 UpdateCheckActionTestProcessorDelegate delegate;
232 delegate.loop_ = loop;
233 ActionProcessor processor;
234 processor.set_delegate(&delegate);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000235 processor.EnqueueAction(&feeder_action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000236 processor.EnqueueAction(&action);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000237 BondActions(&feeder_action, &action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000238
239 g_timeout_add(0, &StartProcessorInRunLoop, &processor);
240 g_main_loop_run(loop);
241 g_main_loop_unref(loop);
242 EXPECT_FALSE(processor.IsRunning());
243}
244
245TEST(UpdateCheckActionTest, InvalidXmlTest) {
246 UpdateCheckParams params("machine_id",
247 "user_id",
248 UpdateCheckParams::kOsPlatform,
249 UpdateCheckParams::kOsVersion,
250 "service_pack",
251 UpdateCheckParams::kAppId,
252 "0.1.0.0",
253 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700254 "unittest_track",
255 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000256 UpdateCheckResponse response;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700257 ASSERT_FALSE(
rspangler@google.com49fdf182009-10-10 00:57:34 +0000258 TestUpdateCheckAction(params,
259 "invalid xml>",
260 false,
261 &response,
262 NULL));
263 EXPECT_FALSE(response.update_exists);
264}
265
266TEST(UpdateCheckActionTest, MissingStatusTest) {
267 UpdateCheckParams params("machine_id",
268 "user_id",
269 UpdateCheckParams::kOsPlatform,
270 UpdateCheckParams::kOsVersion,
271 "service_pack",
272 UpdateCheckParams::kAppId,
273 "0.1.0.0",
274 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700275 "unittest_track",
276 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000277 UpdateCheckResponse response;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700278 ASSERT_FALSE(TestUpdateCheckAction(
rspangler@google.com49fdf182009-10-10 00:57:34 +0000279 params,
280 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
281 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
282 "appid=\"foo\" status=\"ok\"><ping "
283 "status=\"ok\"/><updatecheck/></app></gupdate>",
284 false,
285 &response,
286 NULL));
287 EXPECT_FALSE(response.update_exists);
288}
289
290TEST(UpdateCheckActionTest, InvalidStatusTest) {
291 UpdateCheckParams params("machine_id",
292 "user_id",
293 UpdateCheckParams::kOsPlatform,
294 UpdateCheckParams::kOsVersion,
295 "service_pack",
296 UpdateCheckParams::kAppId,
297 "0.1.0.0",
298 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700299 "unittest_track",
300 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000301 UpdateCheckResponse response;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700302 ASSERT_FALSE(TestUpdateCheckAction(
rspangler@google.com49fdf182009-10-10 00:57:34 +0000303 params,
304 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
305 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
306 "appid=\"foo\" status=\"ok\"><ping "
307 "status=\"ok\"/><updatecheck status=\"foo\"/></app></gupdate>",
308 false,
309 &response,
310 NULL));
311 EXPECT_FALSE(response.update_exists);
312}
313
314TEST(UpdateCheckActionTest, MissingNodesetTest) {
315 UpdateCheckParams params("machine_id",
316 "user_id",
317 UpdateCheckParams::kOsPlatform,
318 UpdateCheckParams::kOsVersion,
319 "service_pack",
320 UpdateCheckParams::kAppId,
321 "0.1.0.0",
322 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700323 "unittest_track",
324 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000325 UpdateCheckResponse response;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700326 ASSERT_FALSE(TestUpdateCheckAction(
rspangler@google.com49fdf182009-10-10 00:57:34 +0000327 params,
328 "<?xml version=\"1.0\" encoding=\"UTF-8\"?><gupdate "
329 "xmlns=\"http://www.google.com/update2/response\" protocol=\"2.0\"><app "
330 "appid=\"foo\" status=\"ok\"><ping "
331 "status=\"ok\"/></app></gupdate>",
332 false,
333 &response,
334 NULL));
335 EXPECT_FALSE(response.update_exists);
336}
337
338TEST(UpdateCheckActionTest, MissingFieldTest) {
339 UpdateCheckParams params("machine_id",
340 "user_id",
341 UpdateCheckParams::kOsPlatform,
342 UpdateCheckParams::kOsVersion,
343 "service_pack",
344 UpdateCheckParams::kAppId,
345 "0.1.0.0",
346 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700347 "unittest_track",
348 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000349 UpdateCheckResponse response;
350 ASSERT_TRUE(TestUpdateCheckAction(params,
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000351 string("<?xml version=\"1.0\" "
352 "encoding=\"UTF-8\"?><gupdate "
353 "xmlns=\"http://www.google.com/"
354 "update2/response\" "
355 "protocol=\"2.0\"><app appid=\"") +
356 UpdateCheckParams::kAppId
357 + "\" status=\"ok\"><ping "
358 "status=\"ok\"/><updatecheck "
359 "DisplayVersion=\"1.2.3.4\" "
360 "Prompt=\"false\" "
361 "codebase=\"http://code/base\" "
362 "hash=\"HASH1234=\" needsadmin=\"true\" "
363 "size=\"123\" "
364 "status=\"ok\"/></app></gupdate>",
365 true,
366 &response,
367 NULL));
rspangler@google.com49fdf182009-10-10 00:57:34 +0000368 EXPECT_TRUE(response.update_exists);
369 EXPECT_EQ("1.2.3.4", response.display_version);
370 EXPECT_EQ("http://code/base", response.codebase);
371 EXPECT_EQ("", response.more_info_url);
372 EXPECT_EQ("HASH1234=", response.hash);
373 EXPECT_EQ(123, response.size);
374 EXPECT_TRUE(response.needs_admin);
375 EXPECT_FALSE(response.prompt);
376}
377
378namespace {
379class TerminateEarlyTestProcessorDelegate : public ActionProcessorDelegate {
380 public:
381 void ProcessingStopped(const ActionProcessor* processor) {
382 ASSERT_TRUE(loop_);
383 g_main_loop_quit(loop_);
384 }
385 GMainLoop *loop_;
386};
387
388gboolean TerminateTransferTestStarter(gpointer data) {
389 ActionProcessor *processor = reinterpret_cast<ActionProcessor*>(data);
390 processor->StartProcessing();
391 CHECK(processor->IsRunning());
392 processor->StopProcessing();
393 return FALSE;
394}
395} // namespace {}
396
397TEST(UpdateCheckActionTest, TerminateTransferTest) {
398 UpdateCheckParams params("", // machine_id
399 "", // usr_id
400 UpdateCheckParams::kOsPlatform,
401 UpdateCheckParams::kOsVersion,
402 "", // os_sp
403 UpdateCheckParams::kAppId,
404 "0.1.0.0",
405 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700406 "unittest",
407 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000408 string http_response("doesn't matter");
409 GMainLoop *loop = g_main_loop_new(g_main_context_default(), FALSE);
410
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000411 ObjectFeederAction<UpdateCheckParams> feeder_action;
412 feeder_action.set_obj(params);
413 UpdateCheckAction action(new MockHttpFetcher(http_response.data(),
rspangler@google.com49fdf182009-10-10 00:57:34 +0000414 http_response.size()));
415 TerminateEarlyTestProcessorDelegate delegate;
416 delegate.loop_ = loop;
417 ActionProcessor processor;
418 processor.set_delegate(&delegate);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000419 processor.EnqueueAction(&feeder_action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000420 processor.EnqueueAction(&action);
adlr@google.comc98a7ed2009-12-04 18:54:03 +0000421 BondActions(&feeder_action, &action);
rspangler@google.com49fdf182009-10-10 00:57:34 +0000422
423 g_timeout_add(0, &TerminateTransferTestStarter, &processor);
424 g_main_loop_run(loop);
425 g_main_loop_unref(loop);
426}
427
428TEST(UpdateCheckActionTest, 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
438 UpdateCheckParams params("testthemachine<id",
439 "testtheuser_id&lt;",
440 UpdateCheckParams::kOsPlatform,
441 UpdateCheckParams::kOsVersion,
442 "testtheservice_pack>",
443 UpdateCheckParams::kAppId,
444 "0.1.0.0",
445 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700446 "unittest_track",
447 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000448 UpdateCheckResponse response;
Andrew de los Reyes08c4e272010-04-15 14:02:17 -0700449 ASSERT_FALSE(
rspangler@google.com49fdf182009-10-10 00:57:34 +0000450 TestUpdateCheckAction(params,
451 "invalid xml>",
452 false,
453 &response,
454 &post_data));
455 // convert post_data to string
456 string post_str(&post_data[0], post_data.size());
457 EXPECT_NE(post_str.find("testthemachine&lt;id"), string::npos);
458 EXPECT_EQ(post_str.find("testthemachine<id"), string::npos);
459 EXPECT_NE(post_str.find("testtheuser_id&amp;lt;"), string::npos);
460 EXPECT_EQ(post_str.find("testtheuser_id&lt;"), string::npos);
461 EXPECT_NE(post_str.find("testtheservice_pack&gt;"), string::npos);
462 EXPECT_EQ(post_str.find("testtheservice_pack>"), string::npos);
463}
464
465TEST(UpdateCheckActionTest, XmlDecodeTest) {
466 UpdateCheckParams params("machine_id",
467 "user_id",
468 UpdateCheckParams::kOsPlatform,
469 UpdateCheckParams::kOsVersion,
470 "service_pack",
471 UpdateCheckParams::kAppId,
472 "0.1.0.0",
473 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700474 "unittest_track",
475 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000476 UpdateCheckResponse response;
477 ASSERT_TRUE(
478 TestUpdateCheckAction(params,
479 GetUpdateResponse(UpdateCheckParams::kAppId,
480 "1.2.3.4", // version
481 "testthe&lt;url", // more info
482 "true", // prompt
483 "testthe&amp;codebase", // dl url
484 "HASH1234=", // checksum
485 "false", // needs admin
486 "123"), // size
487 true,
488 &response,
489 NULL));
490
491 EXPECT_EQ(response.more_info_url, "testthe<url");
492 EXPECT_EQ(response.codebase, "testthe&codebase");
493}
494
495TEST(UpdateCheckActionTest, ParseIntTest) {
496 UpdateCheckParams params("machine_id",
497 "user_id",
498 UpdateCheckParams::kOsPlatform,
499 UpdateCheckParams::kOsVersion,
500 "service_pack",
501 UpdateCheckParams::kAppId,
502 "0.1.0.0",
503 "en-US",
Andrew de los Reyesf9714432010-05-04 10:21:23 -0700504 "unittest_track",
505 "http://url");
rspangler@google.com49fdf182009-10-10 00:57:34 +0000506 UpdateCheckResponse response;
507 ASSERT_TRUE(
508 TestUpdateCheckAction(params,
509 GetUpdateResponse(UpdateCheckParams::kAppId,
510 "1.2.3.4", // version
511 "theurl", // more info
512 "true", // prompt
513 "thecodebase", // dl url
514 "HASH1234=", // checksum
515 "false", // needs admin
516 // overflows int32:
517 "123123123123123"), // size
518 true,
519 &response,
520 NULL));
521
522 EXPECT_EQ(response.size, 123123123123123ll);
523}
524
525} // namespace chromeos_update_engine