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