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

Side by Side Diff: pdf/document_loader_unittest.cc

Issue 2349753003: Improve linearized pdf load/show time. (Closed)
Patch Set: remove useless code. Created 4 years, 3 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
OLDNEW
(Empty)
1 // Copyright (c) 2016 The Chromium 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 "pdf/document_loader.h"
6
7 #include <memory>
8 #include <string>
9
10 #include "pdf/url_loader_wrapper.h"
11 #include "testing/gmock/include/gmock/gmock.h"
12 #include "testing/gtest/include/gtest/gtest.h"
13 #include "ui/gfx/range/range.h"
14
15 using ::testing::_;
16 using ::testing::Mock;
17 using ::testing::Sequence;
18 using ::testing::NiceMock;
19 using ::testing::Return;
20
21 namespace chrome_pdf {
22
23 namespace {
24 class TestURLLoader : public URLLoaderWrapper {
25 public:
26 struct LoaderData {
27 int content_length = -1;
28 bool accept_ranges_bytes = false;
29 bool content_encoded = false;
30 std::string content_type;
31 std::string content_disposition;
32 std::string multipart_boundary;
33 gfx::Range byte_range = gfx::Range::InvalidRange();
34 bool is_multipart = false;
35 int status_code = 0;
36 bool closed = true;
37 gfx::Range open_byte_range = gfx::Range::InvalidRange();
38
39 bool IsWaitRead() const { return wait_read_; }
40 bool IsWaitOpen() const { return wait_open_; }
41 char* buffer() const { return buffer_; }
42 int buffer_size() const { return buffer_size_; }
43
44 void SetReadCallback(const pp::CompletionCallback& read_callback,
45 char* buffer,
46 int buffer_size) {
47 wait_read_ = true;
48 did_read_callback_ = read_callback;
49 buffer_ = buffer;
50 buffer_size_ = buffer_size;
51 }
52
53 void SetOpenCallback(const pp::CompletionCallback& open_callback,
54 gfx::Range req_byte_range) {
55 wait_open_ = true;
56 did_open_callback_ = open_callback;
57 open_byte_range = req_byte_range;
58 }
59
60 void CallOpenCallback(int result) {
61 PP_DCHECK(wait_open_);
62 wait_open_ = false;
63 did_open_callback_.Run(result);
64 }
65
66 void CallReadCallback(int result) {
67 PP_DCHECK(wait_read_);
68 wait_read_ = false;
69 did_read_callback_.Run(result);
70 }
71
72 private:
73 bool wait_open_ = false;
74 pp::CompletionCallback did_open_callback_;
75 bool wait_read_ = false;
76 pp::CompletionCallback did_read_callback_;
77 char* buffer_ = nullptr;
78 int buffer_size_ = 0;
79 };
80
81 explicit TestURLLoader(LoaderData* data) : data_(data) {
82 data_->closed = false;
83 }
84
85 ~TestURLLoader() override { Close(); }
86
87 int GetContentLength() const override { return data_->content_length; }
88
89 bool IsAcceptRangesBytes() const override {
90 return data_->accept_ranges_bytes;
91 }
92
93 bool IsContentEncoded() const override { return data_->content_encoded; }
94
95 std::string GetContentType() const override { return data_->content_type; }
96
97 std::string GetContentDisposition() const override {
98 return data_->content_disposition;
99 }
100
101 int GetStatusCode() const override { return data_->status_code; }
102
103 bool IsMultipart() const override { return data_->is_multipart; }
104
105 bool GetByteRange(int* start, int* end) const override {
106 *start = data_->byte_range.start();
107 *end = data_->byte_range.end();
108 return data_->byte_range.IsValid();
109 }
110
111 void Close() override { data_->closed = true; }
112
113 void OpenRange(const std::string& url,
114 const std::string& referrer_url,
115 uint32_t position,
116 uint32_t size,
117 const pp::CompletionCallback& cc) override {
118 data_->SetOpenCallback(cc, gfx::Range(position, position + size));
119 }
120
121 void ReadResponseBody(char* buffer,
122 int buffer_size,
123 const pp::CompletionCallback& cc) override {
124 data_->SetReadCallback(cc, buffer, buffer_size);
125 }
126
127 bool GetDownloadProgress(int64_t* bytes_received,
128 int64_t* total_bytes_to_be_received) const override {
129 return false;
130 }
131
132 private:
133 LoaderData* data_;
134 };
135
136 class TestClient : public DocumentLoader::Client {
137 public:
138 TestClient() { full_page_loader_data()->content_type = "application/pdf"; }
139 ~TestClient() override {}
140 // DocumentLoader::Client overrides:
141 pp::Instance* GetPluginInstance() override { return nullptr; }
142 std::unique_ptr<URLLoaderWrapper> CreateURLLoader() override {
143 return std::unique_ptr<URLLoaderWrapper>(
144 new TestURLLoader(partial_loader_data()));
145 }
146 void OnPendingRequestComplete() override {}
147 void OnNewDataAvailable() override {}
148 void OnDocumentComplete() override {}
149 void OnDocumentCanceled() override {}
150 void CancelBrowserDownload() override {}
151
152 std::unique_ptr<URLLoaderWrapper> CreateFullPageLoader() {
153 return std::unique_ptr<URLLoaderWrapper>(
154 new TestURLLoader(full_page_loader_data()));
155 }
156
157 TestURLLoader::LoaderData* full_page_loader_data() {
158 return &full_page_loader_data_;
159 }
160 TestURLLoader::LoaderData* partial_loader_data() {
161 return &partial_loader_data_;
162 }
163
164 void SetCanUsePartialLoading() {
165 full_page_loader_data()->content_length = 10 * 1024 * 1024;
166 full_page_loader_data()->content_encoded = false;
167 full_page_loader_data()->accept_ranges_bytes = true;
168 }
169
170 void SendAllPartialData() {
171 partial_loader_data_.byte_range = partial_loader_data_.open_byte_range;
172 partial_loader_data_.CallOpenCallback(0);
173 uint32_t length = partial_loader_data_.byte_range.length();
174 while (length > 0) {
175 const uint32_t part_len = std::min(
176 length, static_cast<uint32_t>(DocumentLoader::kDefaultRequestSize));
177 partial_loader_data_.CallReadCallback(part_len);
178 length -= part_len;
179 }
180 if (partial_loader_data_.IsWaitRead()) {
181 partial_loader_data_.CallReadCallback(0);
182 }
183 }
184
185 private:
186 TestURLLoader::LoaderData full_page_loader_data_;
187 TestURLLoader::LoaderData partial_loader_data_;
188 };
189
190 class MockClient : public TestClient {
191 public:
192 MOCK_METHOD0(OnPendingRequestComplete, void());
193 MOCK_METHOD0(OnNewDataAvailable, void());
194 MOCK_METHOD0(OnDocumentComplete, void());
195 MOCK_METHOD0(OnDocumentCanceled, void());
196 };
197 } // namespace
198
199 class DocumentLoaderTest : public ::testing::Test {
200 public:
201 DocumentLoaderTest() {}
202 ~DocumentLoaderTest() override {}
203 void SetUp() override {}
204 void TearDown() override {}
205 };
206
207 TEST_F(DocumentLoaderTest, CanStartPartialLoading) {
208 TestClient client;
209 client.full_page_loader_data()->content_length = 1 * 1024 * 1024;
210 client.full_page_loader_data()->content_encoded = false;
211 client.full_page_loader_data()->accept_ranges_bytes = true;
212 {
213 DocumentLoader loader(&client);
214 loader.Init(client.CreateFullPageLoader(), "http://url.com");
215 loader.RequestData(1000000, 1);
216 EXPECT_FALSE(loader.is_partial_loader_active());
217 // Always send initial data from FullPageLoader.
218 client.full_page_loader_data()->CallReadCallback(
219 DocumentLoader::kDefaultRequestSize);
220 EXPECT_TRUE(loader.is_partial_loader_active());
221 }
222 {
223 client.full_page_loader_data()->content_length =
224 DocumentLoader::kDefaultRequestSize * 2;
225 DocumentLoader loader(&client);
226 loader.Init(client.CreateFullPageLoader(), "http://url.com");
227 loader.RequestData(1000000, 1);
228 EXPECT_FALSE(loader.is_partial_loader_active());
229 // Always send initial data from FullPageLoader.
230 client.full_page_loader_data()->CallReadCallback(
231 DocumentLoader::kDefaultRequestSize);
232 EXPECT_FALSE(loader.is_partial_loader_active());
233 client.full_page_loader_data()->content_length = 1 * 1024 * 1024;
234 }
235 {
236 client.full_page_loader_data()->content_encoded = true;
237 DocumentLoader loader(&client);
238 loader.Init(client.CreateFullPageLoader(), "http://url.com");
239 loader.RequestData(1000000, 1);
240 EXPECT_FALSE(loader.is_partial_loader_active());
241 // Always send initial data from FullPageLoader.
242 client.full_page_loader_data()->CallReadCallback(
243 DocumentLoader::kDefaultRequestSize);
244 EXPECT_FALSE(loader.is_partial_loader_active());
245 client.full_page_loader_data()->content_encoded = false;
246 }
247 {
248 client.full_page_loader_data()->accept_ranges_bytes = false;
249 DocumentLoader loader(&client);
250 loader.Init(client.CreateFullPageLoader(), "http://url.com");
251 loader.RequestData(1000000, 1);
252 EXPECT_FALSE(loader.is_partial_loader_active());
253 // Always send initial data from FullPageLoader.
254 client.full_page_loader_data()->CallReadCallback(
255 DocumentLoader::kDefaultRequestSize);
256 EXPECT_FALSE(loader.is_partial_loader_active());
257 client.full_page_loader_data()->accept_ranges_bytes = true;
258 }
259 {
260 DocumentLoader loader(&client);
261 loader.SetPartialLoadingEnabled(false);
262 loader.Init(client.CreateFullPageLoader(), "http://url.com");
263 // We should not start partial loading if requested data is beside full page
264 // loading position.
265 loader.RequestData(DocumentLoader::kDefaultRequestSize, 1);
266 EXPECT_FALSE(loader.is_partial_loader_active());
267 // Always send initial data from FullPageLoader.
268 client.full_page_loader_data()->CallReadCallback(
269 DocumentLoader::kDefaultRequestSize);
270 EXPECT_FALSE(loader.is_partial_loader_active());
271 }
272 {
273 DocumentLoader loader(&client);
274 loader.SetPartialLoadingEnabled(false);
275 loader.Init(client.CreateFullPageLoader(), "http://url.com");
276 loader.RequestData(1000000, 1);
277 EXPECT_FALSE(loader.is_partial_loader_active());
278 // Always send initial data from FullPageLoader.
279 client.full_page_loader_data()->CallReadCallback(
280 DocumentLoader::kDefaultRequestSize);
281 EXPECT_FALSE(loader.is_partial_loader_active());
282 }
283 }
284
285 TEST_F(DocumentLoaderTest, PartialLoadingSimple) {
286 TestClient client;
287 client.SetCanUsePartialLoading();
288
289 DocumentLoader loader(&client);
290 loader.Init(client.CreateFullPageLoader(), "http://url.com");
291
292 // While we have not requests, we shold not start partial loading.
293 EXPECT_FALSE(loader.is_partial_loader_active());
294
295 loader.RequestData(5000000, 1);
296
297 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
298 EXPECT_FALSE(loader.is_partial_loader_active());
299
300 // Always send initial data from FullPageLoader.
301 client.full_page_loader_data()->CallReadCallback(
302 DocumentLoader::kDefaultRequestSize);
303
304 // Partial loader should request headers.
305 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
306 EXPECT_TRUE(loader.is_partial_loader_active());
307 // Loader should be stopped.
308 EXPECT_TRUE(client.full_page_loader_data()->closed);
309
310 EXPECT_EQ(client.partial_loader_data()->open_byte_range.ToString(),
311 "{4980736,10485760}");
312 }
313
314 TEST_F(DocumentLoaderTest, PartialLoadingBackOrder) {
315 TestClient client;
316 client.SetCanUsePartialLoading();
317
318 DocumentLoader loader(&client);
319 loader.Init(client.CreateFullPageLoader(), "http://url.com");
320
321 // While we have not requests, we shold not start partial loading.
322 EXPECT_FALSE(loader.is_partial_loader_active());
323
324 loader.RequestData(client.full_page_loader_data()->content_length - 1, 1);
325
326 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
327 EXPECT_FALSE(loader.is_partial_loader_active());
328
329 // Always send initial data from FullPageLoader.
330 client.full_page_loader_data()->CallReadCallback(
331 DocumentLoader::kDefaultRequestSize);
332
333 // Partial loader should request headers.
334 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
335 EXPECT_TRUE(loader.is_partial_loader_active());
336 // Loader should be stopped.
337 EXPECT_TRUE(client.full_page_loader_data()->closed);
338
339 // Requested range should be enlarged.
340 EXPECT_GT(client.partial_loader_data()->open_byte_range.length(), 1u);
341 EXPECT_EQ(client.partial_loader_data()->open_byte_range.ToString(),
342 "{9830400,10485760}");
343 }
344
345 TEST_F(DocumentLoaderTest, CompleteWithoutPartial) {
346 TestClient client;
347 client.SetCanUsePartialLoading();
348 DocumentLoader loader(&client);
349 loader.Init(client.CreateFullPageLoader(), "http://url.com");
350 EXPECT_FALSE(client.full_page_loader_data()->closed);
351 while (client.full_page_loader_data()->IsWaitRead()) {
352 client.full_page_loader_data()->CallReadCallback(1000);
353 }
354 EXPECT_TRUE(loader.IsDocumentComplete());
355 EXPECT_TRUE(client.full_page_loader_data()->closed);
356 }
357
358 TEST_F(DocumentLoaderTest, ErrorDownloadFullDocument) {
359 TestClient client;
360 client.SetCanUsePartialLoading();
361 DocumentLoader loader(&client);
362 loader.Init(client.CreateFullPageLoader(), "http://url.com");
363 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
364 EXPECT_FALSE(client.full_page_loader_data()->closed);
365 client.full_page_loader_data()->CallReadCallback(-3);
366 EXPECT_TRUE(client.full_page_loader_data()->closed);
367 EXPECT_FALSE(loader.IsDocumentComplete());
368 }
369
370 TEST_F(DocumentLoaderTest, CompleteNoContentLength) {
371 TestClient client;
372 DocumentLoader loader(&client);
373 loader.Init(client.CreateFullPageLoader(), "http://url.com");
374 EXPECT_FALSE(client.full_page_loader_data()->closed);
375 for (int i = 0; i < 10; ++i) {
376 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
377 client.full_page_loader_data()->CallReadCallback(1000);
378 }
379 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
380 client.full_page_loader_data()->CallReadCallback(0);
381 EXPECT_EQ(loader.GetDocumentSize(), 10000ul);
382 EXPECT_TRUE(loader.IsDocumentComplete());
383 EXPECT_TRUE(client.full_page_loader_data()->closed);
384 }
385
386 TEST_F(DocumentLoaderTest, CompleteWithPartial) {
387 TestClient client;
388 client.SetCanUsePartialLoading();
389 client.full_page_loader_data()->content_length =
390 DocumentLoader::kDefaultRequestSize * 20;
391 DocumentLoader loader(&client);
392 loader.Init(client.CreateFullPageLoader(), "http://url.com");
393 loader.RequestData(19 * DocumentLoader::kDefaultRequestSize,
394 DocumentLoader::kDefaultRequestSize);
395 EXPECT_FALSE(client.full_page_loader_data()->closed);
396 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
397 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
398
399 // Always send initial data from FullPageLoader.
400 client.full_page_loader_data()->CallReadCallback(
401 DocumentLoader::kDefaultRequestSize);
402 EXPECT_TRUE(client.full_page_loader_data()->closed);
403 EXPECT_FALSE(client.partial_loader_data()->closed);
404
405 client.SendAllPartialData();
406 // Now we should send other document data.
407 client.SendAllPartialData();
408 EXPECT_TRUE(client.full_page_loader_data()->closed);
409 EXPECT_TRUE(client.partial_loader_data()->closed);
410 }
411
412 TEST_F(DocumentLoaderTest, PartialRequestLastChunk) {
413 const uint32_t kLastChunkSize = 300;
414 TestClient client;
415 client.SetCanUsePartialLoading();
416 client.full_page_loader_data()->content_length =
417 DocumentLoader::kDefaultRequestSize * 20 + kLastChunkSize;
418 DocumentLoader loader(&client);
419 loader.Init(client.CreateFullPageLoader(), "http://url.com");
420 loader.RequestData(20 * DocumentLoader::kDefaultRequestSize, 1);
421
422 // Always send initial data from FullPageLoader.
423 client.full_page_loader_data()->CallReadCallback(
424 DocumentLoader::kDefaultRequestSize);
425
426 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
427 EXPECT_EQ(client.partial_loader_data()->open_byte_range.end(),
428 client.full_page_loader_data()->content_length);
429 client.partial_loader_data()->byte_range =
430 client.partial_loader_data()->open_byte_range;
431 client.partial_loader_data()->CallOpenCallback(0);
432 uint32_t data_length = client.partial_loader_data()->byte_range.length();
433 while (data_length > DocumentLoader::kDefaultRequestSize) {
434 client.partial_loader_data()->CallReadCallback(
435 DocumentLoader::kDefaultRequestSize);
436 data_length -= DocumentLoader::kDefaultRequestSize;
437 }
438 EXPECT_EQ(kLastChunkSize, data_length);
439 client.partial_loader_data()->CallReadCallback(kLastChunkSize);
440 EXPECT_TRUE(loader.IsDataAvailable(DocumentLoader::kDefaultRequestSize * 20,
441 kLastChunkSize));
442 }
443
444 TEST_F(DocumentLoaderTest, DocumentSize) {
445 TestClient client;
446 client.SetCanUsePartialLoading();
447 client.full_page_loader_data()->content_length = 123456789;
448 DocumentLoader loader(&client);
449 loader.Init(client.CreateFullPageLoader(), "http://url.com");
450 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
451 client.full_page_loader_data()->content_length);
452 }
453
454 TEST_F(DocumentLoaderTest, DocumentSizeNoContentLength) {
455 TestClient client;
456 DocumentLoader loader(&client);
457 loader.Init(client.CreateFullPageLoader(), "http://url.com");
458 EXPECT_EQ(loader.GetDocumentSize(), 0ul);
459 client.full_page_loader_data()->CallReadCallback(
460 DocumentLoader::kDefaultRequestSize);
461 client.full_page_loader_data()->CallReadCallback(1000);
462 client.full_page_loader_data()->CallReadCallback(500);
463 client.full_page_loader_data()->CallReadCallback(0);
464 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
465 DocumentLoader::kDefaultRequestSize + 1000 + 500);
466 EXPECT_TRUE(loader.IsDocumentComplete());
467 }
468
469 TEST_F(DocumentLoaderTest, ClearPendingRequests) {
470 TestClient client;
471 client.SetCanUsePartialLoading();
472 client.full_page_loader_data()->content_length =
473 DocumentLoader::kDefaultRequestSize * 100 + 58383;
474 DocumentLoader loader(&client);
475 loader.Init(client.CreateFullPageLoader(), "http://url.com");
476 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 100, 10);
477 loader.ClearPendingRequests();
478 loader.RequestData(15 * DocumentLoader::kDefaultRequestSize + 200, 20);
479 // pending requests are accumulating, and will be processed after initial data
480 // load.
481 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
482
483 // Send initial data from FullPageLoader.
484 client.full_page_loader_data()->CallReadCallback(
485 DocumentLoader::kDefaultRequestSize);
486
487 {
488 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
489 const gfx::Range range_requested(15 * DocumentLoader::kDefaultRequestSize,
490 16 * DocumentLoader::kDefaultRequestSize);
491 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
492 range_requested.start());
493 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
494 range_requested.end());
495 client.partial_loader_data()->byte_range =
496 client.partial_loader_data()->open_byte_range;
497 }
498 // clear requests before Open callback.
499 loader.ClearPendingRequests();
500 // Current request should continue loading.
501 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
502 client.partial_loader_data()->CallOpenCallback(0);
503 client.partial_loader_data()->CallReadCallback(
504 DocumentLoader::kDefaultRequestSize);
505 EXPECT_FALSE(client.partial_loader_data()->closed);
506 // Current request should continue loading, because not other requests queued.
507
508 loader.RequestData(18 * DocumentLoader::kDefaultRequestSize + 200, 20);
509 // Requests queue is processed only on data receving.
510 client.partial_loader_data()->CallReadCallback(
511 DocumentLoader::kDefaultRequestSize);
512 // new requset with in close distance from current loading. Loading do not
513 // restarted.
514 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
515
516 loader.ClearPendingRequests();
517 // request again two.
518 loader.RequestData(60 * DocumentLoader::kDefaultRequestSize + 100, 10);
519 loader.RequestData(35 * DocumentLoader::kDefaultRequestSize + 200, 20);
520 // Requests queue is processed only on data receving.
521 client.partial_loader_data()->CallReadCallback(
522 DocumentLoader::kDefaultRequestSize);
523 {
524 // new requset not with in close distance from current loading.
525 // Loading should be restarted.
526 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
527 // The first requested chunk should be processed.
528 const gfx::Range range_requested(35 * DocumentLoader::kDefaultRequestSize,
529 36 * DocumentLoader::kDefaultRequestSize);
530 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
531 range_requested.start());
532 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
533 range_requested.end());
534 client.partial_loader_data()->byte_range =
535 client.partial_loader_data()->open_byte_range;
536 }
537 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
538 client.partial_loader_data()->CallOpenCallback(0);
539 // Override pending requests.
540 loader.ClearPendingRequests();
541 loader.RequestData(70 * DocumentLoader::kDefaultRequestSize + 100, 10);
542
543 // Requests queue is processed only on data receving.
544 client.partial_loader_data()->CallReadCallback(
545 DocumentLoader::kDefaultRequestSize);
546 {
547 // New requset not with in close distance from current loading.
548 // Loading should be restarted .
549 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
550 // The first requested chunk should be processed.
551 const gfx::Range range_requested(70 * DocumentLoader::kDefaultRequestSize,
552 71 * DocumentLoader::kDefaultRequestSize);
553 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
554 range_requested.start());
555 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
556 range_requested.end());
557 client.partial_loader_data()->byte_range =
558 client.partial_loader_data()->open_byte_range;
559 }
560 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
561 }
562
563 TEST_F(DocumentLoaderTest, GetBlock) {
564 char buffer[DocumentLoader::kDefaultRequestSize];
565 TestClient client;
566 client.SetCanUsePartialLoading();
567 client.full_page_loader_data()->content_length =
568 DocumentLoader::kDefaultRequestSize * 20 + 58383;
569 DocumentLoader loader(&client);
570 loader.Init(client.CreateFullPageLoader(), "http://url.com");
571 EXPECT_FALSE(loader.GetBlock(0, 1000, buffer));
572 client.full_page_loader_data()->CallReadCallback(
573 DocumentLoader::kDefaultRequestSize);
574 EXPECT_TRUE(loader.GetBlock(0, 1000, buffer));
575 EXPECT_FALSE(
576 loader.GetBlock(DocumentLoader::kDefaultRequestSize, 1500, buffer));
577 client.full_page_loader_data()->CallReadCallback(
578 DocumentLoader::kDefaultRequestSize);
579 EXPECT_TRUE(
580 loader.GetBlock(DocumentLoader::kDefaultRequestSize, 1500, buffer));
581
582 EXPECT_FALSE(
583 loader.GetBlock(17 * DocumentLoader::kDefaultRequestSize, 3000, buffer));
584 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 100, 10);
585 EXPECT_FALSE(
586 loader.GetBlock(17 * DocumentLoader::kDefaultRequestSize, 3000, buffer));
587
588 // Requests queue is processed only on data receving.
589 client.full_page_loader_data()->CallReadCallback(
590 DocumentLoader::kDefaultRequestSize);
591
592 client.SendAllPartialData();
593 EXPECT_TRUE(
594 loader.GetBlock(17 * DocumentLoader::kDefaultRequestSize, 3000, buffer));
595 }
596
597 TEST_F(DocumentLoaderTest, IsDataAvailable) {
598 TestClient client;
599 client.SetCanUsePartialLoading();
600 client.full_page_loader_data()->content_length =
601 DocumentLoader::kDefaultRequestSize * 20 + 58383;
602 DocumentLoader loader(&client);
603 loader.Init(client.CreateFullPageLoader(), "http://url.com");
604 EXPECT_FALSE(loader.IsDataAvailable(0, 1000));
605 client.full_page_loader_data()->CallReadCallback(
606 DocumentLoader::kDefaultRequestSize);
607 EXPECT_TRUE(loader.IsDataAvailable(0, 1000));
608 EXPECT_FALSE(
609 loader.IsDataAvailable(DocumentLoader::kDefaultRequestSize, 1500));
610 client.full_page_loader_data()->CallReadCallback(
611 DocumentLoader::kDefaultRequestSize);
612 EXPECT_TRUE(
613 loader.IsDataAvailable(DocumentLoader::kDefaultRequestSize, 1500));
614
615 EXPECT_FALSE(
616 loader.IsDataAvailable(17 * DocumentLoader::kDefaultRequestSize, 3000));
617 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 100, 10);
618 EXPECT_FALSE(
619 loader.IsDataAvailable(17 * DocumentLoader::kDefaultRequestSize, 3000));
620
621 // Requests queue is processed only on data receving.
622 client.full_page_loader_data()->CallReadCallback(
623 DocumentLoader::kDefaultRequestSize);
624
625 client.SendAllPartialData();
626 EXPECT_TRUE(
627 loader.IsDataAvailable(17 * DocumentLoader::kDefaultRequestSize, 3000));
628 }
629
630 TEST_F(DocumentLoaderTest, RequestData) {
631 TestClient client;
632 client.SetCanUsePartialLoading();
633 client.full_page_loader_data()->content_length =
634 DocumentLoader::kDefaultRequestSize * 100 + 58383;
635 DocumentLoader loader(&client);
636 loader.Init(client.CreateFullPageLoader(), "http://url.com");
637 loader.RequestData(37 * DocumentLoader::kDefaultRequestSize + 200, 10);
638 loader.RequestData(25 * DocumentLoader::kDefaultRequestSize + 600, 100);
639 loader.RequestData(13 * DocumentLoader::kDefaultRequestSize + 900, 500);
640
641 // Send initial data from FullPageLoader.
642 client.full_page_loader_data()->CallReadCallback(
643 DocumentLoader::kDefaultRequestSize);
644
645 {
646 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
647 const gfx::Range range_requested(13 * DocumentLoader::kDefaultRequestSize,
648 14 * DocumentLoader::kDefaultRequestSize);
649 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
650 range_requested.start());
651 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
652 range_requested.end());
653 client.partial_loader_data()->byte_range =
654 client.partial_loader_data()->open_byte_range;
655 }
656 client.partial_loader_data()->CallOpenCallback(0);
657 // Override pending requests.
658 loader.ClearPendingRequests();
659 loader.RequestData(38 * DocumentLoader::kDefaultRequestSize + 200, 10);
660 loader.RequestData(26 * DocumentLoader::kDefaultRequestSize + 600, 100);
661 // Requests queue is processed only on data receving.
662 client.partial_loader_data()->CallReadCallback(
663 DocumentLoader::kDefaultRequestSize);
664 {
665 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
666 const gfx::Range range_requested(26 * DocumentLoader::kDefaultRequestSize,
667 27 * DocumentLoader::kDefaultRequestSize);
668 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
669 range_requested.start());
670 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
671 range_requested.end());
672 client.partial_loader_data()->byte_range =
673 client.partial_loader_data()->open_byte_range;
674 }
675 client.partial_loader_data()->CallOpenCallback(0);
676 // Override pending requests.
677 loader.ClearPendingRequests();
678 loader.RequestData(39 * DocumentLoader::kDefaultRequestSize + 200, 10);
679 // Requests queue is processed only on data receving.
680 client.partial_loader_data()->CallReadCallback(
681 DocumentLoader::kDefaultRequestSize);
682 {
683 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
684 const gfx::Range range_requested(39 * DocumentLoader::kDefaultRequestSize,
685 40 * DocumentLoader::kDefaultRequestSize);
686 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
687 range_requested.start());
688 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
689 range_requested.end());
690 client.partial_loader_data()->byte_range =
691 client.partial_loader_data()->open_byte_range;
692 }
693 // Fill all gaps.
694 while (!loader.IsDocumentComplete()) {
695 client.SendAllPartialData();
696 }
697 EXPECT_TRUE(client.partial_loader_data()->closed);
698 }
699
700 TEST_F(DocumentLoaderTest, DoNotLoadAvailablePartialData) {
701 TestClient client;
702 client.SetCanUsePartialLoading();
703 client.full_page_loader_data()->content_length =
704 DocumentLoader::kDefaultRequestSize * 20 + 58383;
705 DocumentLoader loader(&client);
706 loader.Init(client.CreateFullPageLoader(), "http://url.com");
707 // Send initial data from FullPageLoader.
708 client.full_page_loader_data()->CallReadCallback(
709 DocumentLoader::kDefaultRequestSize);
710
711 // Send more data from FullPageLoader.
712 client.full_page_loader_data()->CallReadCallback(
713 DocumentLoader::kDefaultRequestSize);
714
715 loader.RequestData(2 * DocumentLoader::kDefaultRequestSize + 200, 10);
716
717 // Send more data from FullPageLoader.
718 client.full_page_loader_data()->CallReadCallback(
719 DocumentLoader::kDefaultRequestSize);
720
721 // Partial loading should not started for already available data.
722 EXPECT_TRUE(client.partial_loader_data()->closed);
723 }
724
725 TEST_F(DocumentLoaderTest, DoNotLoadDataAfterComplete) {
726 TestClient client;
727 client.SetCanUsePartialLoading();
728 client.full_page_loader_data()->content_length =
729 DocumentLoader::kDefaultRequestSize * 20;
730 DocumentLoader loader(&client);
731 loader.Init(client.CreateFullPageLoader(), "http://url.com");
732
733 for (int i = 0; i < 20; ++i) {
734 client.full_page_loader_data()->CallReadCallback(
735 DocumentLoader::kDefaultRequestSize);
736 }
737
738 EXPECT_TRUE(loader.IsDocumentComplete());
739
740 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
741
742 EXPECT_TRUE(client.partial_loader_data()->closed);
743 EXPECT_TRUE(client.full_page_loader_data()->closed);
744 }
745
746 TEST_F(DocumentLoaderTest, DoNotLoadPartialDataAboveDocumentSize) {
747 TestClient client;
748 client.SetCanUsePartialLoading();
749 client.full_page_loader_data()->content_length =
750 DocumentLoader::kDefaultRequestSize * 20;
751 DocumentLoader loader(&client);
752 loader.Init(client.CreateFullPageLoader(), "http://url.com");
753
754 loader.RequestData(20 * DocumentLoader::kDefaultRequestSize + 200, 10);
755
756 // Send initial data from FullPageLoader.
757 client.full_page_loader_data()->CallReadCallback(
758 DocumentLoader::kDefaultRequestSize);
759
760 EXPECT_TRUE(client.partial_loader_data()->closed);
761 }
762
763 TEST_F(DocumentLoaderTest, MergePendingRequests) {
764 TestClient client;
765 client.SetCanUsePartialLoading();
766 client.full_page_loader_data()->content_length =
767 DocumentLoader::kDefaultRequestSize * 50 + 58383;
768 DocumentLoader loader(&client);
769 loader.Init(client.CreateFullPageLoader(), "http://url.com");
770 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
771 loader.RequestData(16 * DocumentLoader::kDefaultRequestSize + 600, 100);
772
773 // Send initial data from FullPageLoader.
774 client.full_page_loader_data()->CallReadCallback(
775 DocumentLoader::kDefaultRequestSize);
776
777 const gfx::Range range_requested(16 * DocumentLoader::kDefaultRequestSize,
778 18 * DocumentLoader::kDefaultRequestSize);
779 EXPECT_EQ(client.partial_loader_data()->open_byte_range.start(),
780 range_requested.start());
781 EXPECT_GE(client.partial_loader_data()->open_byte_range.end(),
782 range_requested.end());
783
784 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
785
786 // Fill all gaps.
787 while (!loader.IsDocumentComplete()) {
788 client.SendAllPartialData();
789 }
790 EXPECT_TRUE(client.partial_loader_data()->closed);
791 }
792
793 TEST_F(DocumentLoaderTest, PartialStopOnStatusCodeError) {
794 TestClient client;
795 client.SetCanUsePartialLoading();
796 client.full_page_loader_data()->content_length =
797 DocumentLoader::kDefaultRequestSize * 20;
798 DocumentLoader loader(&client);
799 loader.Init(client.CreateFullPageLoader(), "http://url.com");
800
801 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
802
803 // Send initial data from FullPageLoader.
804 client.full_page_loader_data()->CallReadCallback(
805 DocumentLoader::kDefaultRequestSize);
806
807 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
808 client.partial_loader_data()->status_code = 404;
809 client.partial_loader_data()->CallOpenCallback(0);
810 EXPECT_TRUE(client.partial_loader_data()->closed);
811 }
812
813 TEST_F(DocumentLoaderTest,
814 PartialAsFullDocumentLoadingRangeRequestNoRangeField) {
815 TestClient client;
816 client.SetCanUsePartialLoading();
817 client.full_page_loader_data()->content_length =
818 DocumentLoader::kDefaultRequestSize * 20;
819 DocumentLoader loader(&client);
820 loader.Init(client.CreateFullPageLoader(), "http://url.com");
821
822 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
823
824 // Send initial data from FullPageLoader.
825 client.full_page_loader_data()->CallReadCallback(
826 DocumentLoader::kDefaultRequestSize);
827
828 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
829 client.partial_loader_data()->byte_range = gfx::Range::InvalidRange();
830 client.partial_loader_data()->CallOpenCallback(0);
831 EXPECT_FALSE(client.partial_loader_data()->closed);
832 // partial loader is used to load whole page, like full page loader.
833 EXPECT_FALSE(loader.is_partial_loader_active());
834 }
835
836 TEST_F(DocumentLoaderTest, PartialMultiPart) {
837 TestClient client;
838 client.SetCanUsePartialLoading();
839 client.full_page_loader_data()->content_length =
840 DocumentLoader::kDefaultRequestSize * 20;
841 DocumentLoader loader(&client);
842 loader.Init(client.CreateFullPageLoader(), "http://url.com");
843
844 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
845
846 // Send initial data from FullPageLoader.
847 client.full_page_loader_data()->CallReadCallback(
848 DocumentLoader::kDefaultRequestSize);
849
850 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
851 client.partial_loader_data()->is_multipart = true;
852 client.partial_loader_data()->CallOpenCallback(0);
853 client.partial_loader_data()->byte_range =
854 gfx::Range(17 * DocumentLoader::kDefaultRequestSize,
855 18 * DocumentLoader::kDefaultRequestSize);
856 client.partial_loader_data()->CallReadCallback(
857 DocumentLoader::kDefaultRequestSize);
858 EXPECT_TRUE(loader.IsDataAvailable(17 * DocumentLoader::kDefaultRequestSize,
859 DocumentLoader::kDefaultRequestSize));
860 }
861
862 TEST_F(DocumentLoaderTest, PartialMultiPartRangeError) {
863 TestClient client;
864 client.SetCanUsePartialLoading();
865 client.full_page_loader_data()->content_length =
866 DocumentLoader::kDefaultRequestSize * 20;
867 DocumentLoader loader(&client);
868 loader.Init(client.CreateFullPageLoader(), "http://url.com");
869
870 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
871
872 // Send initial data from FullPageLoader.
873 client.full_page_loader_data()->CallReadCallback(
874 DocumentLoader::kDefaultRequestSize);
875
876 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
877 client.partial_loader_data()->is_multipart = true;
878 client.partial_loader_data()->CallOpenCallback(0);
879 client.partial_loader_data()->byte_range = gfx::Range::InvalidRange();
880 client.partial_loader_data()->CallReadCallback(
881 DocumentLoader::kDefaultRequestSize);
882 EXPECT_FALSE(loader.IsDataAvailable(17 * DocumentLoader::kDefaultRequestSize,
883 DocumentLoader::kDefaultRequestSize));
884 EXPECT_TRUE(client.partial_loader_data()->closed);
885 }
886
887 TEST_F(DocumentLoaderTest, PartialConnectionErrorOnOpen) {
888 TestClient client;
889 client.SetCanUsePartialLoading();
890 client.full_page_loader_data()->content_length =
891 DocumentLoader::kDefaultRequestSize * 20;
892 DocumentLoader loader(&client);
893 loader.Init(client.CreateFullPageLoader(), "http://url.com");
894
895 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
896
897 // Send initial data from FullPageLoader.
898 client.full_page_loader_data()->CallReadCallback(
899 DocumentLoader::kDefaultRequestSize);
900
901 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
902 client.partial_loader_data()->CallOpenCallback(-3);
903 EXPECT_TRUE(client.partial_loader_data()->closed);
904
905 // Partial loading should not restart after any error.
906 loader.RequestData(18 * DocumentLoader::kDefaultRequestSize + 200, 10);
907
908 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
909 EXPECT_TRUE(client.partial_loader_data()->closed);
910 }
911
912 TEST_F(DocumentLoaderTest, PartialConnectionErrorOnRead) {
913 TestClient client;
914 client.SetCanUsePartialLoading();
915 client.full_page_loader_data()->content_length =
916 DocumentLoader::kDefaultRequestSize * 20;
917 DocumentLoader loader(&client);
918 loader.Init(client.CreateFullPageLoader(), "http://url.com");
919
920 loader.RequestData(17 * DocumentLoader::kDefaultRequestSize + 200, 10);
921
922 // Send initial data from FullPageLoader.
923 client.full_page_loader_data()->CallReadCallback(
924 DocumentLoader::kDefaultRequestSize);
925
926 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
927 client.partial_loader_data()->byte_range =
928 gfx::Range(17 * DocumentLoader::kDefaultRequestSize,
929 18 * DocumentLoader::kDefaultRequestSize);
930 client.partial_loader_data()->CallOpenCallback(0);
931 EXPECT_TRUE(client.partial_loader_data()->IsWaitRead());
932 client.partial_loader_data()->CallReadCallback(-3);
933 EXPECT_TRUE(client.partial_loader_data()->closed);
934
935 // Partial loading should not restart after any error.
936 loader.RequestData(18 * DocumentLoader::kDefaultRequestSize + 200, 10);
937
938 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
939 EXPECT_TRUE(client.partial_loader_data()->closed);
940 }
941
942 TEST_F(DocumentLoaderTest, GetProgress) {
943 TestClient client;
944 client.SetCanUsePartialLoading();
945 client.full_page_loader_data()->content_length =
946 DocumentLoader::kDefaultRequestSize * 20;
947 DocumentLoader loader(&client);
948 loader.Init(client.CreateFullPageLoader(), "http://url.com");
949 EXPECT_EQ(loader.GetProgress(), 0.);
950
951 for (int i = 0; i < 20; ++i) {
952 EXPECT_EQ(static_cast<int>(loader.GetProgress() * 100), i * 100 / 20);
953 client.full_page_loader_data()->CallReadCallback(
954 DocumentLoader::kDefaultRequestSize);
955 }
956 EXPECT_EQ(loader.GetProgress(), 1.);
957 }
958
959 TEST_F(DocumentLoaderTest, GetProgressNoContentLength) {
960 TestClient client;
961 DocumentLoader loader(&client);
962 loader.Init(client.CreateFullPageLoader(), "http://url.com");
963 EXPECT_EQ(loader.GetProgress(), -1.);
964
965 for (int i = 0; i < 20; ++i) {
966 EXPECT_EQ(loader.GetProgress(), -1.);
967 client.full_page_loader_data()->CallReadCallback(
968 DocumentLoader::kDefaultRequestSize);
969 }
970 client.full_page_loader_data()->CallReadCallback(0);
971 EXPECT_EQ(loader.GetProgress(), 1.);
972 }
973
974 TEST_F(DocumentLoaderTest, ClientCompleteCallbacks) {
975 MockClient client;
976 client.SetCanUsePartialLoading();
977 client.full_page_loader_data()->content_length =
978 DocumentLoader::kDefaultRequestSize * 20;
979 DocumentLoader loader(&client);
980 loader.Init(client.CreateFullPageLoader(), "http://url.com");
981
982 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
983 for (int i = 0; i < 19; ++i) {
984 client.full_page_loader_data()->CallReadCallback(
985 DocumentLoader::kDefaultRequestSize);
986 }
987 Mock::VerifyAndClear(&client);
988
989 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
990 client.full_page_loader_data()->CallReadCallback(
991 DocumentLoader::kDefaultRequestSize);
992 Mock::VerifyAndClear(&client);
993 }
994
995 TEST_F(DocumentLoaderTest, ClientCompleteCallbacksNoContentLength) {
996 MockClient client;
997 DocumentLoader loader(&client);
998 loader.Init(client.CreateFullPageLoader(), "http://url.com");
999
1000 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1001 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1002 for (int i = 0; i < 20; ++i) {
1003 client.full_page_loader_data()->CallReadCallback(
1004 DocumentLoader::kDefaultRequestSize);
1005 }
1006 Mock::VerifyAndClear(&client);
1007
1008 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1009 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
1010 client.full_page_loader_data()->CallReadCallback(0);
1011 Mock::VerifyAndClear(&client);
1012 }
1013
1014 TEST_F(DocumentLoaderTest, ClientCancelCallback) {
1015 MockClient client;
1016 client.SetCanUsePartialLoading();
1017 client.full_page_loader_data()->content_length =
1018 DocumentLoader::kDefaultRequestSize * 20;
1019 DocumentLoader loader(&client);
1020 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1021
1022 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1023 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1024 for (int i = 0; i < 10; ++i) {
1025 client.full_page_loader_data()->CallReadCallback(
1026 DocumentLoader::kDefaultRequestSize);
1027 }
1028 Mock::VerifyAndClear(&client);
1029
1030 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1031 EXPECT_CALL(client, OnDocumentCanceled()).Times(1);
1032 client.full_page_loader_data()->CallReadCallback(-3);
1033 Mock::VerifyAndClear(&client);
1034 }
1035
1036 TEST_F(DocumentLoaderTest, NewDataAvailable) {
1037 MockClient client;
1038 client.SetCanUsePartialLoading();
1039 client.full_page_loader_data()->content_length =
1040 DocumentLoader::kDefaultRequestSize * 20;
1041 DocumentLoader loader(&client);
1042 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1043
1044 EXPECT_CALL(client, OnNewDataAvailable()).Times(1);
1045 client.full_page_loader_data()->CallReadCallback(
1046 DocumentLoader::kDefaultRequestSize);
1047 Mock::VerifyAndClear(&client);
1048
1049 EXPECT_CALL(client, OnNewDataAvailable()).Times(0);
1050 client.full_page_loader_data()->CallReadCallback(
1051 DocumentLoader::kDefaultRequestSize - 100);
1052 Mock::VerifyAndClear(&client);
1053
1054 EXPECT_CALL(client, OnNewDataAvailable()).Times(1);
1055 client.full_page_loader_data()->CallReadCallback(100);
1056 Mock::VerifyAndClear(&client);
1057 }
1058
1059 TEST_F(DocumentLoaderTest, ClientPendingRequestCompleteFullLoader) {
1060 MockClient client;
1061 client.SetCanUsePartialLoading();
1062 DocumentLoader loader(&client);
1063 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1064
1065 loader.RequestData(1000, 4000);
1066
1067 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1068 client.full_page_loader_data()->CallReadCallback(
1069 DocumentLoader::kDefaultRequestSize);
1070 Mock::VerifyAndClear(&client);
1071 }
1072
1073 TEST_F(DocumentLoaderTest, ClientPendingRequestCompletePartialLoader) {
1074 MockClient client;
1075 client.SetCanUsePartialLoading();
1076 DocumentLoader loader(&client);
1077 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1078
1079 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1080 loader.RequestData(15 * DocumentLoader::kDefaultRequestSize + 4000, 4000);
1081
1082 // Always send initial data from FullPageLoader.
1083 client.full_page_loader_data()->CallReadCallback(
1084 DocumentLoader::kDefaultRequestSize);
1085
1086 client.SendAllPartialData();
1087 Mock::VerifyAndClear(&client);
1088 }
1089
1090 TEST_F(DocumentLoaderTest, ClientPendingRequestCompletePartialAndFullLoader) {
1091 MockClient client;
1092 client.SetCanUsePartialLoading();
1093 DocumentLoader loader(&client);
1094 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1095
1096 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1097 loader.RequestData(16 * DocumentLoader::kDefaultRequestSize + 4000, 4000);
1098 loader.RequestData(4 * DocumentLoader::kDefaultRequestSize + 4000, 4000);
1099
1100 for (int i = 0; i < 5; ++i) {
1101 client.full_page_loader_data()->CallReadCallback(
1102 DocumentLoader::kDefaultRequestSize);
1103 }
1104
1105 Mock::VerifyAndClear(&client);
1106
1107 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1108 client.SendAllPartialData();
1109 Mock::VerifyAndClear(&client);
1110 }
1111
1112 } // namespace chrome_pdf
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698