blob: 784fb207ba8235ec35456b68227dd13e07dea0a1 [file] [log] [blame]
Artem Stryginaf1b43422017-09-12 18:48:241// 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
Lei Zhange98901a2018-04-25 23:23:595#include "pdf/document_loader_impl.h"
Artem Stryginaf1b43422017-09-12 18:48:246
Lei Zhang02a3a0f2017-12-11 20:25:487#include <algorithm>
Artem Stryginaf1b43422017-09-12 18:48:248#include <memory>
9#include <string>
K. Moon544e09532020-07-07 17:08:5510#include <utility>
Lei Zhang533165f2018-02-27 19:09:1011#include <vector>
Artem Stryginaf1b43422017-09-12 18:48:2412
K. Moon544e09532020-07-07 17:08:5513#include "base/callback.h"
Hans Wennborg5078d102020-04-29 18:26:4614#include "base/check.h"
K. Moonf2a14142020-08-12 19:39:4015#include "base/test/scoped_feature_list.h"
16#include "pdf/pdf_features.h"
K. Moon544e09532020-07-07 17:08:5517#include "pdf/ppapi_migration/callback.h"
Artem Stryginaf1b43422017-09-12 18:48:2418#include "pdf/url_loader_wrapper.h"
19#include "testing/gmock/include/gmock/gmock.h"
20#include "testing/gtest/include/gtest/gtest.h"
21#include "ui/gfx/range/range.h"
22
23using ::testing::_;
24using ::testing::Mock;
Artem Stryginaf1b43422017-09-12 18:48:2425using ::testing::NiceMock;
26using ::testing::Return;
Lei Zhangad086172020-06-30 05:53:4627using ::testing::Sequence;
Artem Stryginaf1b43422017-09-12 18:48:2428
29namespace chrome_pdf {
30
31namespace {
32
Lei Zhange98901a2018-04-25 23:23:5933constexpr uint32_t kDefaultRequestSize =
34 DocumentLoaderImpl::kDefaultRequestSize;
Lei Zhang533165f2018-02-27 19:09:1035
Artem Stryginaf1b43422017-09-12 18:48:2436class TestURLLoader : public URLLoaderWrapper {
37 public:
38 class LoaderData {
39 public:
Chris Watkinsda547692017-11-30 03:49:2440 LoaderData() = default;
Hui Yingsteb451e42020-08-11 18:41:2441 LoaderData(const LoaderData&) = delete;
42 LoaderData& operator=(const LoaderData&) = delete;
Artem Stryginaf1b43422017-09-12 18:48:2443 ~LoaderData() {
44 // We should call callbacks to prevent memory leaks.
45 // The callbacks don't do anything, because the objects that created the
46 // callbacks have been destroyed.
47 if (IsWaitRead())
48 CallReadCallback(-1);
49 if (IsWaitOpen())
50 CallOpenCallback(-1);
51 }
52
53 int content_length() const { return content_length_; }
54 void set_content_length(int content_length) {
55 content_length_ = content_length;
56 }
57 bool accept_ranges_bytes() const { return accept_ranges_bytes_; }
58 void set_accept_ranges_bytes(bool accept_ranges_bytes) {
59 accept_ranges_bytes_ = accept_ranges_bytes;
60 }
61 bool content_encoded() const { return content_encoded_; }
62 void set_content_encoded(bool content_encoded) {
63 content_encoded_ = content_encoded;
64 }
65 const std::string& content_type() const { return content_type_; }
66 void set_content_type(const std::string& content_type) {
67 content_type_ = content_type;
68 }
69 const std::string& content_disposition() const {
70 return content_disposition_;
71 }
72 void set_content_disposition(const std::string& content_disposition) {
73 content_disposition_ = content_disposition;
74 }
75 const std::string& multipart_boundary() const {
76 return multipart_boundary_;
77 }
78 void set_multipart_boundary(const std::string& multipart_boundary) {
79 multipart_boundary_ = multipart_boundary;
80 }
81 const gfx::Range& byte_range() const { return byte_range_; }
82 void set_byte_range(const gfx::Range& byte_range) {
83 byte_range_ = byte_range;
84 }
85 bool is_multipart() const { return is_multipart_; }
86 void set_is_multipart(bool is_multipart) { is_multipart_ = is_multipart; }
87 int status_code() const { return status_code_; }
88 void set_status_code(int status_code) { status_code_ = status_code; }
89 bool closed() const { return closed_; }
90 void set_closed(bool closed) { closed_ = closed; }
91 const gfx::Range& open_byte_range() const { return open_byte_range_; }
92 void set_open_byte_range(const gfx::Range& open_byte_range) {
93 open_byte_range_ = open_byte_range;
94 }
95
K. Moon544e09532020-07-07 17:08:5596 bool IsWaitRead() const { return !did_read_callback_.is_null(); }
97 bool IsWaitOpen() const { return !did_open_callback_.is_null(); }
Artem Stryginaf1b43422017-09-12 18:48:2498 char* buffer() const { return buffer_; }
99 int buffer_size() const { return buffer_size_; }
100
K. Moon544e09532020-07-07 17:08:55101 void SetReadCallback(ResultCallback read_callback,
Artem Stryginaf1b43422017-09-12 18:48:24102 char* buffer,
103 int buffer_size) {
K. Moon544e09532020-07-07 17:08:55104 did_read_callback_ = std::move(read_callback);
Artem Stryginaf1b43422017-09-12 18:48:24105 buffer_ = buffer;
106 buffer_size_ = buffer_size;
107 }
108
K. Moon544e09532020-07-07 17:08:55109 void SetOpenCallback(ResultCallback open_callback,
Artem Stryginaf1b43422017-09-12 18:48:24110 gfx::Range req_byte_range) {
K. Moon544e09532020-07-07 17:08:55111 did_open_callback_ = std::move(open_callback);
Artem Stryginaf1b43422017-09-12 18:48:24112 set_open_byte_range(req_byte_range);
113 }
114
115 void CallOpenCallback(int result) {
116 DCHECK(IsWaitOpen());
K. Moon544e09532020-07-07 17:08:55117 std::move(did_open_callback_).Run(result);
Artem Stryginaf1b43422017-09-12 18:48:24118 }
119
120 void CallReadCallback(int result) {
121 DCHECK(IsWaitRead());
K. Moon544e09532020-07-07 17:08:55122 std::move(did_read_callback_).Run(result);
Artem Stryginaf1b43422017-09-12 18:48:24123 }
124
125 private:
K. Moon544e09532020-07-07 17:08:55126 ResultCallback did_open_callback_;
127 ResultCallback did_read_callback_;
Artem Stryginaf1b43422017-09-12 18:48:24128 char* buffer_ = nullptr;
129 int buffer_size_ = 0;
130
131 int content_length_ = -1;
132 bool accept_ranges_bytes_ = false;
133 bool content_encoded_ = false;
134 std::string content_type_;
135 std::string content_disposition_;
136 std::string multipart_boundary_;
137 gfx::Range byte_range_ = gfx::Range::InvalidRange();
138 bool is_multipart_ = false;
139 int status_code_ = 0;
140 bool closed_ = true;
141 gfx::Range open_byte_range_ = gfx::Range::InvalidRange();
Artem Stryginaf1b43422017-09-12 18:48:24142 };
143
144 explicit TestURLLoader(LoaderData* data) : data_(data) {
145 data_->set_closed(false);
146 }
Hui Yingsteb451e42020-08-11 18:41:24147 TestURLLoader(const TestURLLoader&) = delete;
148 TestURLLoader& operator=(const TestURLLoader&) = delete;
Artem Stryginaf1b43422017-09-12 18:48:24149 ~TestURLLoader() override { Close(); }
150
151 int GetContentLength() const override { return data_->content_length(); }
152
153 bool IsAcceptRangesBytes() const override {
154 return data_->accept_ranges_bytes();
155 }
156
157 bool IsContentEncoded() const override { return data_->content_encoded(); }
158
159 std::string GetContentType() const override { return data_->content_type(); }
160
161 std::string GetContentDisposition() const override {
162 return data_->content_disposition();
163 }
164
165 int GetStatusCode() const override { return data_->status_code(); }
166
167 bool IsMultipart() const override { return data_->is_multipart(); }
168
Lei Zhang02a3a0f2017-12-11 20:25:48169 bool GetByteRangeStart(int* start) const override {
Artem Stryginaf1b43422017-09-12 18:48:24170 *start = data_->byte_range().start();
Artem Stryginaf1b43422017-09-12 18:48:24171 return data_->byte_range().IsValid();
172 }
173
174 void Close() override { data_->set_closed(true); }
175
176 void OpenRange(const std::string& url,
177 const std::string& referrer_url,
178 uint32_t position,
179 uint32_t size,
K. Moon544e09532020-07-07 17:08:55180 ResultCallback callback) override {
181 data_->SetOpenCallback(std::move(callback),
182 gfx::Range(position, position + size));
Artem Stryginaf1b43422017-09-12 18:48:24183 }
184
185 void ReadResponseBody(char* buffer,
186 int buffer_size,
K. Moon544e09532020-07-07 17:08:55187 ResultCallback callback) override {
188 data_->SetReadCallback(std::move(callback), buffer, buffer_size);
Artem Stryginaf1b43422017-09-12 18:48:24189 }
190
Artem Stryginaf1b43422017-09-12 18:48:24191 private:
192 LoaderData* data_;
Artem Stryginaf1b43422017-09-12 18:48:24193};
194
195class TestClient : public DocumentLoader::Client {
196 public:
197 TestClient() { full_page_loader_data()->set_content_type("application/pdf"); }
Hui Yingsteb451e42020-08-11 18:41:24198 TestClient(const TestClient&) = delete;
199 TestClient& operator=(const TestClient&) = delete;
Chris Watkinsda547692017-11-30 03:49:24200 ~TestClient() override = default;
Artem Stryginaf1b43422017-09-12 18:48:24201
202 // DocumentLoader::Client overrides:
203 pp::Instance* GetPluginInstance() override { return nullptr; }
204 std::unique_ptr<URLLoaderWrapper> CreateURLLoader() override {
205 return std::unique_ptr<URLLoaderWrapper>(
206 new TestURLLoader(partial_loader_data()));
207 }
208 void OnPendingRequestComplete() override {}
209 void OnNewDataReceived() override {}
210 void OnDocumentComplete() override {}
211 void OnDocumentCanceled() override {}
Artem Stryginaf1b43422017-09-12 18:48:24212
213 std::unique_ptr<URLLoaderWrapper> CreateFullPageLoader() {
214 return std::unique_ptr<URLLoaderWrapper>(
215 new TestURLLoader(full_page_loader_data()));
216 }
217
218 TestURLLoader::LoaderData* full_page_loader_data() {
219 return &full_page_loader_data_;
220 }
221 TestURLLoader::LoaderData* partial_loader_data() {
222 return &partial_loader_data_;
223 }
224
225 void SetCanUsePartialLoading() {
226 full_page_loader_data()->set_content_length(10 * 1024 * 1024);
227 full_page_loader_data()->set_content_encoded(false);
228 full_page_loader_data()->set_accept_ranges_bytes(true);
229 }
230
231 void SendAllPartialData() {
232 partial_loader_data_.set_byte_range(partial_loader_data_.open_byte_range());
233 partial_loader_data_.CallOpenCallback(0);
234 uint32_t length = partial_loader_data_.byte_range().length();
235 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:43236 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Stryginaf1b43422017-09-12 18:48:24237 const uint32_t part_len = std::min(length, max_part_len);
238 partial_loader_data_.CallReadCallback(part_len);
239 length -= part_len;
240 }
241 if (partial_loader_data_.IsWaitRead()) {
242 partial_loader_data_.CallReadCallback(0);
243 }
244 }
245
246 private:
247 TestURLLoader::LoaderData full_page_loader_data_;
248 TestURLLoader::LoaderData partial_loader_data_;
Artem Stryginaf1b43422017-09-12 18:48:24249};
250
251class MockClient : public TestClient {
252 public:
Chris Watkinsda547692017-11-30 03:49:24253 MockClient() = default;
Hui Yingsteb451e42020-08-11 18:41:24254 MockClient(const MockClient&) = delete;
255 MockClient& operator=(const MockClient&) = delete;
Artem Stryginaf1b43422017-09-12 18:48:24256
K. Moonf4c9f0612020-07-21 07:05:31257 MOCK_METHOD(void, OnPendingRequestComplete, (), (override));
258 MOCK_METHOD(void, OnNewDataReceived, (), (override));
259 MOCK_METHOD(void, OnDocumentComplete, (), (override));
260 MOCK_METHOD(void, OnDocumentCanceled, (), (override));
Artem Stryginaf1b43422017-09-12 18:48:24261};
262
263} // namespace
264
K. Moonf2a14142020-08-12 19:39:40265class DocumentLoaderImplTest : public testing::Test {
266 protected:
267 DocumentLoaderImplTest() {
268 scoped_feature_list_.InitAndEnableFeature(features::kPdfPartialLoading);
269 }
270
271 base::test::ScopedFeatureList scoped_feature_list_;
272};
273
274TEST_F(DocumentLoaderImplTest, PartialLoadingFeatureDefault) {
275 scoped_feature_list_.Reset();
276 scoped_feature_list_.Init();
277
278 // Test that partial loading is enabled when feature is defaulted.
279 TestClient client;
280 client.SetCanUsePartialLoading();
281 DocumentLoaderImpl loader(&client);
282 loader.Init(client.CreateFullPageLoader(), "http://url.com");
283 loader.RequestData(1000000, 1);
284 EXPECT_FALSE(loader.is_partial_loader_active());
285 // Always send initial data from FullPageLoader.
286 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
287 EXPECT_TRUE(loader.is_partial_loader_active());
288}
289
290TEST_F(DocumentLoaderImplTest, PartialLoadingFeatureDisabled) {
291 scoped_feature_list_.Reset();
292 scoped_feature_list_.InitAndDisableFeature(features::kPdfPartialLoading);
293
294 // Test that partial loading is disabled when feature is disabled.
295 TestClient client;
296 client.SetCanUsePartialLoading();
297 DocumentLoaderImpl loader(&client);
298 loader.Init(client.CreateFullPageLoader(), "http://url.com");
299 loader.RequestData(1000000, 1);
300 EXPECT_FALSE(loader.is_partial_loader_active());
301 // Always send initial data from FullPageLoader.
302 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
303 EXPECT_FALSE(loader.is_partial_loader_active());
304}
Artem Stryginaf1b43422017-09-12 18:48:24305
Lei Zhange98901a2018-04-25 23:23:59306TEST_F(DocumentLoaderImplTest, PartialLoadingEnabled) {
K. Moonf2a14142020-08-12 19:39:40307 // Test that partial loading is enabled. (Fixture enables PdfPartialLoading.)
Artem Stryginaf1b43422017-09-12 18:48:24308 TestClient client;
309 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59310 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24311 loader.Init(client.CreateFullPageLoader(), "http://url.com");
312 loader.RequestData(1000000, 1);
313 EXPECT_FALSE(loader.is_partial_loader_active());
314 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10315 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24316 EXPECT_TRUE(loader.is_partial_loader_active());
317}
318
Lei Zhange98901a2018-04-25 23:23:59319TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledOnSmallFiles) {
Artem Stryginaf1b43422017-09-12 18:48:24320 TestClient client;
321 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10322 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 2);
Lei Zhange98901a2018-04-25 23:23:59323 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24324 loader.Init(client.CreateFullPageLoader(), "http://url.com");
325 loader.RequestData(1000000, 1);
326 EXPECT_FALSE(loader.is_partial_loader_active());
327 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10328 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24329 EXPECT_FALSE(loader.is_partial_loader_active());
330}
331
Lei Zhange98901a2018-04-25 23:23:59332TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledIfContentEncoded) {
Artem Stryginaf1b43422017-09-12 18:48:24333 TestClient client;
334 client.SetCanUsePartialLoading();
335 client.full_page_loader_data()->set_content_encoded(true);
Lei Zhange98901a2018-04-25 23:23:59336 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24337 loader.Init(client.CreateFullPageLoader(), "http://url.com");
338 loader.RequestData(1000000, 1);
339 EXPECT_FALSE(loader.is_partial_loader_active());
340 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10341 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24342 EXPECT_FALSE(loader.is_partial_loader_active());
343}
344
Lei Zhange98901a2018-04-25 23:23:59345TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledNoAcceptRangeBytes) {
Artem Stryginaf1b43422017-09-12 18:48:24346 TestClient client;
347 client.SetCanUsePartialLoading();
348 client.full_page_loader_data()->set_accept_ranges_bytes(false);
Lei Zhange98901a2018-04-25 23:23:59349 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24350 loader.Init(client.CreateFullPageLoader(), "http://url.com");
351 loader.RequestData(1000000, 1);
352 EXPECT_FALSE(loader.is_partial_loader_active());
353 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10354 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24355 EXPECT_FALSE(loader.is_partial_loader_active());
356}
357
Lei Zhange98901a2018-04-25 23:23:59358TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromBegin) {
Artem Stryginaf1b43422017-09-12 18:48:24359 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59360 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24361 client.SetCanUsePartialLoading();
362 loader.SetPartialLoadingEnabled(false);
363 loader.Init(client.CreateFullPageLoader(), "http://url.com");
364 // We should not start partial loading if requested data is beside full page
365 // loading position.
Lei Zhang533165f2018-02-27 19:09:10366 loader.RequestData(kDefaultRequestSize, 1);
Artem Stryginaf1b43422017-09-12 18:48:24367 EXPECT_FALSE(loader.is_partial_loader_active());
368 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10369 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24370 EXPECT_FALSE(loader.is_partial_loader_active());
371}
372
Lei Zhange98901a2018-04-25 23:23:59373TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromMiddle) {
Artem Stryginaf1b43422017-09-12 18:48:24374 TestClient client;
375 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59376 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24377 loader.SetPartialLoadingEnabled(false);
378 loader.Init(client.CreateFullPageLoader(), "http://url.com");
379 loader.RequestData(1000000, 1);
380 EXPECT_FALSE(loader.is_partial_loader_active());
381 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10382 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24383 EXPECT_FALSE(loader.is_partial_loader_active());
384}
385
Lei Zhange98901a2018-04-25 23:23:59386TEST_F(DocumentLoaderImplTest, PartialLoadingSimple) {
Artem Stryginaf1b43422017-09-12 18:48:24387 TestClient client;
388 client.SetCanUsePartialLoading();
389
Lei Zhange98901a2018-04-25 23:23:59390 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24391 loader.Init(client.CreateFullPageLoader(), "http://url.com");
392
393 // While we have no requests, we should not start partial loading.
394 EXPECT_FALSE(loader.is_partial_loader_active());
395
396 loader.RequestData(5000000, 1);
397
398 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
399 EXPECT_FALSE(loader.is_partial_loader_active());
400
401 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10402 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24403
404 // Partial loader should request headers.
405 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
406 EXPECT_TRUE(loader.is_partial_loader_active());
407 // Loader should be stopped.
408 EXPECT_TRUE(client.full_page_loader_data()->closed());
409
410 EXPECT_EQ("{4980736,10485760}",
411 client.partial_loader_data()->open_byte_range().ToString());
412}
413
Lei Zhange98901a2018-04-25 23:23:59414TEST_F(DocumentLoaderImplTest, PartialLoadingBackOrder) {
Artem Stryginaf1b43422017-09-12 18:48:24415 TestClient client;
416 client.SetCanUsePartialLoading();
417
Lei Zhange98901a2018-04-25 23:23:59418 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24419 loader.Init(client.CreateFullPageLoader(), "http://url.com");
420
421 // While we have no requests, we should not start partial loading.
422 EXPECT_FALSE(loader.is_partial_loader_active());
423
424 loader.RequestData(client.full_page_loader_data()->content_length() - 1, 1);
425
426 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
427 EXPECT_FALSE(loader.is_partial_loader_active());
428
429 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10430 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24431
432 // Partial loader should request headers.
433 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
434 EXPECT_TRUE(loader.is_partial_loader_active());
435 // Loader should be stopped.
436 EXPECT_TRUE(client.full_page_loader_data()->closed());
437
438 // Requested range should be enlarged.
439 EXPECT_GT(client.partial_loader_data()->open_byte_range().length(), 1u);
440 EXPECT_EQ("{9830400,10485760}",
441 client.partial_loader_data()->open_byte_range().ToString());
442}
443
Lei Zhange98901a2018-04-25 23:23:59444TEST_F(DocumentLoaderImplTest, CompleteWithoutPartial) {
Artem Stryginaf1b43422017-09-12 18:48:24445 TestClient client;
446 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59447 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24448 loader.Init(client.CreateFullPageLoader(), "http://url.com");
449 EXPECT_FALSE(client.full_page_loader_data()->closed());
450 while (client.full_page_loader_data()->IsWaitRead()) {
451 client.full_page_loader_data()->CallReadCallback(1000);
452 }
453 EXPECT_TRUE(loader.IsDocumentComplete());
454 EXPECT_TRUE(client.full_page_loader_data()->closed());
455}
456
Lei Zhange98901a2018-04-25 23:23:59457TEST_F(DocumentLoaderImplTest, ErrorDownloadFullDocument) {
Artem Stryginaf1b43422017-09-12 18:48:24458 TestClient client;
459 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:59460 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24461 loader.Init(client.CreateFullPageLoader(), "http://url.com");
462 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
463 EXPECT_FALSE(client.full_page_loader_data()->closed());
464 client.full_page_loader_data()->CallReadCallback(-3);
465 EXPECT_TRUE(client.full_page_loader_data()->closed());
466 EXPECT_FALSE(loader.IsDocumentComplete());
467}
468
Lei Zhange98901a2018-04-25 23:23:59469TEST_F(DocumentLoaderImplTest, CompleteNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:24470 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59471 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24472 loader.Init(client.CreateFullPageLoader(), "http://url.com");
473 EXPECT_FALSE(client.full_page_loader_data()->closed());
474 for (int i = 0; i < 10; ++i) {
475 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
476 client.full_page_loader_data()->CallReadCallback(1000);
477 }
478 EXPECT_TRUE(client.full_page_loader_data()->IsWaitRead());
479 client.full_page_loader_data()->CallReadCallback(0);
480 EXPECT_EQ(10000ul, loader.GetDocumentSize());
481 EXPECT_TRUE(loader.IsDocumentComplete());
482 EXPECT_TRUE(client.full_page_loader_data()->closed());
483}
484
Lei Zhange98901a2018-04-25 23:23:59485TEST_F(DocumentLoaderImplTest, CompleteWithPartial) {
Artem Stryginaf1b43422017-09-12 18:48:24486 TestClient client;
487 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10488 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59489 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24490 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10491 loader.RequestData(19 * kDefaultRequestSize, kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24492 EXPECT_FALSE(client.full_page_loader_data()->closed());
493 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
494 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
495
496 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10497 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24498 EXPECT_TRUE(client.full_page_loader_data()->closed());
499 EXPECT_FALSE(client.partial_loader_data()->closed());
500
501 client.SendAllPartialData();
502 // Now we should send other document data.
503 client.SendAllPartialData();
504 EXPECT_TRUE(client.full_page_loader_data()->closed());
505 EXPECT_TRUE(client.partial_loader_data()->closed());
506}
507
Lei Zhange98901a2018-04-25 23:23:59508TEST_F(DocumentLoaderImplTest, PartialRequestLastChunk) {
Henrique Nakashima1c5da8e2018-10-05 21:56:43509 constexpr uint32_t kLastChunkSize = 300;
Artem Stryginaf1b43422017-09-12 18:48:24510 TestClient client;
511 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10512 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
513 kLastChunkSize);
Lei Zhange98901a2018-04-25 23:23:59514 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24515 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10516 loader.RequestData(20 * kDefaultRequestSize, 1);
Artem Stryginaf1b43422017-09-12 18:48:24517
518 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10519 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24520
521 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
522 EXPECT_EQ(
523 static_cast<int>(client.partial_loader_data()->open_byte_range().end()),
524 client.full_page_loader_data()->content_length());
525 client.partial_loader_data()->set_byte_range(
526 client.partial_loader_data()->open_byte_range());
527 client.partial_loader_data()->CallOpenCallback(0);
528 uint32_t data_length = client.partial_loader_data()->byte_range().length();
Lei Zhang533165f2018-02-27 19:09:10529 while (data_length > kDefaultRequestSize) {
530 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
531 data_length -= kDefaultRequestSize;
Artem Stryginaf1b43422017-09-12 18:48:24532 }
533 EXPECT_EQ(kLastChunkSize, data_length);
534 client.partial_loader_data()->CallReadCallback(kLastChunkSize);
Lei Zhang533165f2018-02-27 19:09:10535 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize * 20, kLastChunkSize));
Artem Stryginaf1b43422017-09-12 18:48:24536}
537
Lei Zhange98901a2018-04-25 23:23:59538TEST_F(DocumentLoaderImplTest, DocumentSize) {
Artem Stryginaf1b43422017-09-12 18:48:24539 TestClient client;
540 client.SetCanUsePartialLoading();
541 client.full_page_loader_data()->set_content_length(123456789);
Lei Zhange98901a2018-04-25 23:23:59542 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24543 loader.Init(client.CreateFullPageLoader(), "http://url.com");
544 EXPECT_EQ(static_cast<int>(loader.GetDocumentSize()),
545 client.full_page_loader_data()->content_length());
546}
547
Lei Zhange98901a2018-04-25 23:23:59548TEST_F(DocumentLoaderImplTest, DocumentSizeNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:24549 TestClient client;
Lei Zhange98901a2018-04-25 23:23:59550 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24551 loader.Init(client.CreateFullPageLoader(), "http://url.com");
552 EXPECT_EQ(0ul, loader.GetDocumentSize());
Lei Zhang533165f2018-02-27 19:09:10553 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24554 client.full_page_loader_data()->CallReadCallback(1000);
555 client.full_page_loader_data()->CallReadCallback(500);
556 client.full_page_loader_data()->CallReadCallback(0);
Lei Zhang533165f2018-02-27 19:09:10557 EXPECT_EQ(kDefaultRequestSize + 1000ul + 500ul, loader.GetDocumentSize());
Artem Stryginaf1b43422017-09-12 18:48:24558 EXPECT_TRUE(loader.IsDocumentComplete());
559}
560
Lei Zhange98901a2018-04-25 23:23:59561TEST_F(DocumentLoaderImplTest, ClearPendingRequests) {
Artem Stryginaf1b43422017-09-12 18:48:24562 TestClient client;
563 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10564 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
565 58383);
Lei Zhange98901a2018-04-25 23:23:59566 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24567 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10568 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
Artem Stryginaf1b43422017-09-12 18:48:24569 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10570 loader.RequestData(15 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24571 // pending requests are accumulating, and will be processed after initial data
572 // load.
573 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
574
575 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10576 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24577
578 {
579 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43580 constexpr gfx::Range range_requested(15 * kDefaultRequestSize,
581 16 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24582 EXPECT_EQ(range_requested.start(),
583 client.partial_loader_data()->open_byte_range().start());
584 EXPECT_LE(range_requested.end(),
585 client.partial_loader_data()->open_byte_range().end());
586 client.partial_loader_data()->set_byte_range(
587 client.partial_loader_data()->open_byte_range());
588 }
589 // clear requests before Open callback.
590 loader.ClearPendingRequests();
591 // Current request should continue loading.
592 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
593 client.partial_loader_data()->CallOpenCallback(0);
Lei Zhang533165f2018-02-27 19:09:10594 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24595 EXPECT_FALSE(client.partial_loader_data()->closed());
596 // Current request should continue loading, because no other request queued.
597
Lei Zhang533165f2018-02-27 19:09:10598 loader.RequestData(18 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24599 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10600 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24601 // New request within close distance from the one currently loading. Loading
602 // isn't restarted.
603 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
604
605 loader.ClearPendingRequests();
606 // request again two.
Lei Zhang533165f2018-02-27 19:09:10607 loader.RequestData(60 * kDefaultRequestSize + 100, 10);
608 loader.RequestData(35 * kDefaultRequestSize + 200, 20);
Artem Stryginaf1b43422017-09-12 18:48:24609 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10610 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24611 {
612 // new requset not with in close distance from current loading.
613 // Loading should be restarted.
614 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
615 // The first requested chunk should be processed.
Henrique Nakashima1c5da8e2018-10-05 21:56:43616 constexpr gfx::Range range_requested(35 * kDefaultRequestSize,
617 36 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24618 EXPECT_EQ(range_requested.start(),
619 client.partial_loader_data()->open_byte_range().start());
620 EXPECT_LE(range_requested.end(),
621 client.partial_loader_data()->open_byte_range().end());
622 client.partial_loader_data()->set_byte_range(
623 client.partial_loader_data()->open_byte_range());
624 }
625 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
626 client.partial_loader_data()->CallOpenCallback(0);
627 // Override pending requests.
628 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10629 loader.RequestData(70 * kDefaultRequestSize + 100, 10);
Artem Stryginaf1b43422017-09-12 18:48:24630
631 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10632 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24633 {
634 // New requset not with in close distance from current loading.
635 // Loading should be restarted .
636 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
637 // The first requested chunk should be processed.
Henrique Nakashima1c5da8e2018-10-05 21:56:43638 constexpr gfx::Range range_requested(70 * kDefaultRequestSize,
639 71 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24640 EXPECT_EQ(range_requested.start(),
641 client.partial_loader_data()->open_byte_range().start());
642 EXPECT_LE(range_requested.end(),
643 client.partial_loader_data()->open_byte_range().end());
644 client.partial_loader_data()->set_byte_range(
645 client.partial_loader_data()->open_byte_range());
646 }
647 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
648}
649
Lei Zhange98901a2018-04-25 23:23:59650TEST_F(DocumentLoaderImplTest, GetBlock) {
Lei Zhang533165f2018-02-27 19:09:10651 std::vector<char> buffer(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24652 TestClient client;
653 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10654 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
655 58383);
Lei Zhange98901a2018-04-25 23:23:59656 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24657 loader.Init(client.CreateFullPageLoader(), "http://url.com");
658 EXPECT_FALSE(loader.GetBlock(0, 1000, buffer.data()));
Lei Zhang533165f2018-02-27 19:09:10659 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24660 EXPECT_TRUE(loader.GetBlock(0, 1000, buffer.data()));
Lei Zhang533165f2018-02-27 19:09:10661 EXPECT_FALSE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
662 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
663 EXPECT_TRUE(loader.GetBlock(kDefaultRequestSize, 1500, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24664
Lei Zhang533165f2018-02-27 19:09:10665 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
666 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
667 EXPECT_FALSE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24668
669 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10670 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24671
672 client.SendAllPartialData();
Lei Zhang533165f2018-02-27 19:09:10673 EXPECT_TRUE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data()));
Artem Stryginaf1b43422017-09-12 18:48:24674}
675
Lei Zhange98901a2018-04-25 23:23:59676TEST_F(DocumentLoaderImplTest, IsDataAvailable) {
Artem Stryginaf1b43422017-09-12 18:48:24677 TestClient client;
678 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10679 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
680 58383);
Lei Zhange98901a2018-04-25 23:23:59681 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24682 loader.Init(client.CreateFullPageLoader(), "http://url.com");
683 EXPECT_FALSE(loader.IsDataAvailable(0, 1000));
Lei Zhang533165f2018-02-27 19:09:10684 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24685 EXPECT_TRUE(loader.IsDataAvailable(0, 1000));
Lei Zhang533165f2018-02-27 19:09:10686 EXPECT_FALSE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
687 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
688 EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize, 1500));
Artem Stryginaf1b43422017-09-12 18:48:24689
Lei Zhang533165f2018-02-27 19:09:10690 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
691 loader.RequestData(17 * kDefaultRequestSize + 100, 10);
692 EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
Artem Stryginaf1b43422017-09-12 18:48:24693
694 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10695 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24696
697 client.SendAllPartialData();
Lei Zhang533165f2018-02-27 19:09:10698 EXPECT_TRUE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000));
Artem Stryginaf1b43422017-09-12 18:48:24699}
700
Lei Zhange98901a2018-04-25 23:23:59701TEST_F(DocumentLoaderImplTest, RequestData) {
Artem Stryginaf1b43422017-09-12 18:48:24702 TestClient client;
703 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10704 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 +
705 58383);
Lei Zhange98901a2018-04-25 23:23:59706 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24707 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10708 loader.RequestData(37 * kDefaultRequestSize + 200, 10);
709 loader.RequestData(25 * kDefaultRequestSize + 600, 100);
710 loader.RequestData(13 * kDefaultRequestSize + 900, 500);
Artem Stryginaf1b43422017-09-12 18:48:24711
712 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10713 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24714
715 {
716 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43717 constexpr gfx::Range range_requested(13 * kDefaultRequestSize,
718 14 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24719 EXPECT_EQ(range_requested.start(),
720 client.partial_loader_data()->open_byte_range().start());
721 EXPECT_LE(range_requested.end(),
722 client.partial_loader_data()->open_byte_range().end());
723 client.partial_loader_data()->set_byte_range(
724 client.partial_loader_data()->open_byte_range());
725 }
726 client.partial_loader_data()->CallOpenCallback(0);
727 // Override pending requests.
728 loader.ClearPendingRequests();
Lei Zhang533165f2018-02-27 19:09:10729 loader.RequestData(38 * kDefaultRequestSize + 200, 10);
730 loader.RequestData(26 * kDefaultRequestSize + 600, 100);
Artem Stryginaf1b43422017-09-12 18:48:24731 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10732 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24733 {
734 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43735 constexpr gfx::Range range_requested(26 * kDefaultRequestSize,
736 27 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24737 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();
Lei Zhang533165f2018-02-27 19:09:10747 loader.RequestData(39 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24748 // Requests queue is processed only on receiving data.
Lei Zhang533165f2018-02-27 19:09:10749 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24750 {
751 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
Henrique Nakashima1c5da8e2018-10-05 21:56:43752 constexpr gfx::Range range_requested(39 * kDefaultRequestSize,
753 40 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24754 EXPECT_EQ(range_requested.start(),
755 client.partial_loader_data()->open_byte_range().start());
756 EXPECT_LE(range_requested.end(),
757 client.partial_loader_data()->open_byte_range().end());
758 client.partial_loader_data()->set_byte_range(
759 client.partial_loader_data()->open_byte_range());
760 }
761 // Fill all gaps.
762 while (!loader.IsDocumentComplete()) {
763 client.SendAllPartialData();
764 }
765 EXPECT_TRUE(client.partial_loader_data()->closed());
766}
767
Lei Zhange98901a2018-04-25 23:23:59768TEST_F(DocumentLoaderImplTest, DoNotLoadAvailablePartialData) {
Artem Stryginaf1b43422017-09-12 18:48:24769 TestClient client;
770 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10771 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 +
772 58383);
Lei Zhange98901a2018-04-25 23:23:59773 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24774 loader.Init(client.CreateFullPageLoader(), "http://url.com");
775 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10776 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24777
778 // Send more data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10779 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24780
Lei Zhang533165f2018-02-27 19:09:10781 loader.RequestData(2 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24782
783 // Send more data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10784 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24785
786 // Partial loading should not have started for already available data.
787 EXPECT_TRUE(client.partial_loader_data()->closed());
788}
789
Lei Zhange98901a2018-04-25 23:23:59790TEST_F(DocumentLoaderImplTest, DoNotLoadDataAfterComplete) {
Artem Stryginaf1b43422017-09-12 18:48:24791 TestClient client;
792 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10793 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59794 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24795 loader.Init(client.CreateFullPageLoader(), "http://url.com");
796
797 for (int i = 0; i < 20; ++i) {
Lei Zhang533165f2018-02-27 19:09:10798 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24799 }
800
801 EXPECT_TRUE(loader.IsDocumentComplete());
802
Lei Zhang533165f2018-02-27 19:09:10803 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24804
805 EXPECT_TRUE(client.partial_loader_data()->closed());
806 EXPECT_TRUE(client.full_page_loader_data()->closed());
807}
808
Lei Zhange98901a2018-04-25 23:23:59809TEST_F(DocumentLoaderImplTest, DoNotLoadPartialDataAboveDocumentSize) {
Artem Stryginaf1b43422017-09-12 18:48:24810 TestClient client;
811 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10812 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59813 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24814 loader.Init(client.CreateFullPageLoader(), "http://url.com");
815
Lei Zhang533165f2018-02-27 19:09:10816 loader.RequestData(20 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24817
818 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10819 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24820
821 EXPECT_TRUE(client.partial_loader_data()->closed());
822}
823
Lei Zhange98901a2018-04-25 23:23:59824TEST_F(DocumentLoaderImplTest, MergePendingRequests) {
Artem Stryginaf1b43422017-09-12 18:48:24825 TestClient client;
826 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10827 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 50 +
828 58383);
Lei Zhange98901a2018-04-25 23:23:59829 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24830 loader.Init(client.CreateFullPageLoader(), "http://url.com");
Lei Zhang533165f2018-02-27 19:09:10831 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
832 loader.RequestData(16 * kDefaultRequestSize + 600, 100);
Artem Stryginaf1b43422017-09-12 18:48:24833
834 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10835 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24836
Henrique Nakashima1c5da8e2018-10-05 21:56:43837 constexpr gfx::Range range_requested(16 * kDefaultRequestSize,
838 18 * kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24839 EXPECT_EQ(range_requested.start(),
840 client.partial_loader_data()->open_byte_range().start());
841 EXPECT_LE(range_requested.end(),
842 client.partial_loader_data()->open_byte_range().end());
843
844 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
845
846 // Fill all gaps.
847 while (!loader.IsDocumentComplete()) {
848 client.SendAllPartialData();
849 }
850 EXPECT_TRUE(client.partial_loader_data()->closed());
851}
852
Lei Zhange98901a2018-04-25 23:23:59853TEST_F(DocumentLoaderImplTest, PartialStopOnStatusCodeError) {
Artem Stryginaf1b43422017-09-12 18:48:24854 TestClient client;
855 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10856 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59857 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24858 loader.Init(client.CreateFullPageLoader(), "http://url.com");
859
Lei Zhang533165f2018-02-27 19:09:10860 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24861
862 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10863 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24864
865 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
866 client.partial_loader_data()->set_status_code(404);
867 client.partial_loader_data()->CallOpenCallback(0);
868 EXPECT_TRUE(client.partial_loader_data()->closed());
869}
870
Lei Zhange98901a2018-04-25 23:23:59871TEST_F(DocumentLoaderImplTest,
Artem Stryginaf1b43422017-09-12 18:48:24872 PartialAsFullDocumentLoadingRangeRequestNoRangeField) {
873 TestClient client;
874 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10875 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59876 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24877 loader.Init(client.CreateFullPageLoader(), "http://url.com");
878
Lei Zhang533165f2018-02-27 19:09:10879 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24880
881 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10882 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24883
884 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
885 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
886 client.partial_loader_data()->CallOpenCallback(0);
887 EXPECT_FALSE(client.partial_loader_data()->closed());
888 // Partial loader is used to load the whole page, like full page loader.
889 EXPECT_FALSE(loader.is_partial_loader_active());
890}
891
Lei Zhange98901a2018-04-25 23:23:59892TEST_F(DocumentLoaderImplTest, PartialMultiPart) {
Artem Stryginaf1b43422017-09-12 18:48:24893 TestClient client;
894 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10895 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59896 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24897 loader.Init(client.CreateFullPageLoader(), "http://url.com");
898
Lei Zhang533165f2018-02-27 19:09:10899 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24900
901 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10902 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24903
904 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
905 client.partial_loader_data()->set_is_multipart(true);
906 client.partial_loader_data()->CallOpenCallback(0);
907 client.partial_loader_data()->set_byte_range(
Lei Zhang533165f2018-02-27 19:09:10908 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
909 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
910 EXPECT_TRUE(
911 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24912}
913
Lei Zhange98901a2018-04-25 23:23:59914TEST_F(DocumentLoaderImplTest, PartialMultiPartRangeError) {
Artem Stryginaf1b43422017-09-12 18:48:24915 TestClient client;
916 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10917 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59918 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24919 loader.Init(client.CreateFullPageLoader(), "http://url.com");
920
Lei Zhang533165f2018-02-27 19:09:10921 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24922
923 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10924 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24925
926 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
927 client.partial_loader_data()->set_is_multipart(true);
928 client.partial_loader_data()->CallOpenCallback(0);
929 client.partial_loader_data()->set_byte_range(gfx::Range::InvalidRange());
Lei Zhang533165f2018-02-27 19:09:10930 client.partial_loader_data()->CallReadCallback(kDefaultRequestSize);
931 EXPECT_FALSE(
932 loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24933 EXPECT_TRUE(client.partial_loader_data()->closed());
934}
935
Lei Zhange98901a2018-04-25 23:23:59936TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnOpen) {
Artem Stryginaf1b43422017-09-12 18:48:24937 TestClient client;
938 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10939 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59940 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24941 loader.Init(client.CreateFullPageLoader(), "http://url.com");
942
Lei Zhang533165f2018-02-27 19:09:10943 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24944
945 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10946 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24947
948 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
949 client.partial_loader_data()->CallOpenCallback(-3);
950 EXPECT_TRUE(client.partial_loader_data()->closed());
951
952 // Partial loading should not restart after any error.
Lei Zhang533165f2018-02-27 19:09:10953 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24954
955 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
956 EXPECT_TRUE(client.partial_loader_data()->closed());
957}
958
Lei Zhange98901a2018-04-25 23:23:59959TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnRead) {
Artem Stryginaf1b43422017-09-12 18:48:24960 TestClient client;
961 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10962 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59963 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24964 loader.Init(client.CreateFullPageLoader(), "http://url.com");
965
Lei Zhang533165f2018-02-27 19:09:10966 loader.RequestData(17 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24967
968 // Send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:10969 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24970
971 EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen());
972 client.partial_loader_data()->set_byte_range(
Lei Zhang533165f2018-02-27 19:09:10973 gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize));
Artem Stryginaf1b43422017-09-12 18:48:24974 client.partial_loader_data()->CallOpenCallback(0);
975 EXPECT_TRUE(client.partial_loader_data()->IsWaitRead());
976 client.partial_loader_data()->CallReadCallback(-3);
977 EXPECT_TRUE(client.partial_loader_data()->closed());
978
979 // Partial loading should not restart after any error.
Lei Zhang533165f2018-02-27 19:09:10980 loader.RequestData(18 * kDefaultRequestSize + 200, 10);
Artem Stryginaf1b43422017-09-12 18:48:24981
982 EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen());
983 EXPECT_TRUE(client.partial_loader_data()->closed());
984}
985
Lei Zhange98901a2018-04-25 23:23:59986TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacks) {
Artem Stryginaf1b43422017-09-12 18:48:24987 MockClient client;
988 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:10989 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:59990 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:24991 loader.Init(client.CreateFullPageLoader(), "http://url.com");
992
993 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:10994 for (int i = 0; i < 19; ++i)
995 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:24996 Mock::VerifyAndClear(&client);
997
998 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:10999 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241000 Mock::VerifyAndClear(&client);
1001}
1002
Lei Zhange98901a2018-04-25 23:23:591003TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacksNoContentLength) {
Artem Stryginaf1b43422017-09-12 18:48:241004 MockClient client;
Lei Zhange98901a2018-04-25 23:23:591005 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241006 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1007
1008 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1009 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:101010 for (int i = 0; i < 20; ++i)
1011 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241012 Mock::VerifyAndClear(&client);
1013
1014 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1015 EXPECT_CALL(client, OnDocumentComplete()).Times(1);
1016 client.full_page_loader_data()->CallReadCallback(0);
1017 Mock::VerifyAndClear(&client);
1018}
1019
Lei Zhange98901a2018-04-25 23:23:591020TEST_F(DocumentLoaderImplTest, ClientCancelCallback) {
Artem Stryginaf1b43422017-09-12 18:48:241021 MockClient client;
1022 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:101023 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:591024 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241025 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1026
1027 EXPECT_CALL(client, OnDocumentCanceled()).Times(0);
1028 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
Lei Zhang533165f2018-02-27 19:09:101029 for (int i = 0; i < 10; ++i)
1030 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241031 Mock::VerifyAndClear(&client);
1032
1033 EXPECT_CALL(client, OnDocumentComplete()).Times(0);
1034 EXPECT_CALL(client, OnDocumentCanceled()).Times(1);
1035 client.full_page_loader_data()->CallReadCallback(-3);
1036 Mock::VerifyAndClear(&client);
1037}
1038
Lei Zhange98901a2018-04-25 23:23:591039TEST_F(DocumentLoaderImplTest, NewDataAvailable) {
Artem Stryginaf1b43422017-09-12 18:48:241040 MockClient client;
1041 client.SetCanUsePartialLoading();
Lei Zhang533165f2018-02-27 19:09:101042 client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20);
Lei Zhange98901a2018-04-25 23:23:591043 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241044 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1045
1046 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101047 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241048 Mock::VerifyAndClear(&client);
1049
1050 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101051 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize - 100);
Artem Stryginaf1b43422017-09-12 18:48:241052 Mock::VerifyAndClear(&client);
1053
1054 EXPECT_CALL(client, OnNewDataReceived()).Times(1);
1055 client.full_page_loader_data()->CallReadCallback(100);
1056 Mock::VerifyAndClear(&client);
1057}
1058
Lei Zhange98901a2018-04-25 23:23:591059TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompleteFullLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241060 MockClient client;
1061 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591062 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241063 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1064
1065 loader.RequestData(1000, 4000);
1066
1067 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101068 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241069 Mock::VerifyAndClear(&client);
1070}
1071
Lei Zhange98901a2018-04-25 23:23:591072TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompletePartialLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241073 MockClient client;
1074 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591075 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241076 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1077
1078 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101079 loader.RequestData(15 * kDefaultRequestSize + 4000, 4000);
Artem Stryginaf1b43422017-09-12 18:48:241080
1081 // Always send initial data from FullPageLoader.
Lei Zhang533165f2018-02-27 19:09:101082 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241083
1084 client.SendAllPartialData();
1085 Mock::VerifyAndClear(&client);
1086}
1087
Lei Zhange98901a2018-04-25 23:23:591088TEST_F(DocumentLoaderImplTest,
1089 ClientPendingRequestCompletePartialAndFullLoader) {
Artem Stryginaf1b43422017-09-12 18:48:241090 MockClient client;
1091 client.SetCanUsePartialLoading();
Lei Zhange98901a2018-04-25 23:23:591092 DocumentLoaderImpl loader(&client);
Artem Stryginaf1b43422017-09-12 18:48:241093 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1094
1095 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
Lei Zhang533165f2018-02-27 19:09:101096 loader.RequestData(16 * kDefaultRequestSize + 4000, 4000);
1097 loader.RequestData(4 * kDefaultRequestSize + 4000, 4000);
Artem Stryginaf1b43422017-09-12 18:48:241098
Lei Zhang533165f2018-02-27 19:09:101099 for (int i = 0; i < 5; ++i)
1100 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
Artem Stryginaf1b43422017-09-12 18:48:241101
1102 Mock::VerifyAndClear(&client);
1103
1104 EXPECT_CALL(client, OnPendingRequestComplete()).Times(1);
1105 client.SendAllPartialData();
1106 Mock::VerifyAndClear(&client);
1107}
1108
Artem Strygin2cf20af42018-06-14 14:26:531109TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartial) {
1110 static constexpr uint32_t kDocSize = kDefaultRequestSize * 80 - 321;
1111 TestClient client;
1112 client.SetCanUsePartialLoading();
1113 client.full_page_loader_data()->set_content_length(kDocSize);
1114 DocumentLoaderImpl loader(&client);
1115 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1116 // Request data at and.
1117 loader.RequestData(kDocSize - 100, 100);
1118
1119 // Always send initial data from FullPageLoader.
1120 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1121 EXPECT_TRUE(client.full_page_loader_data()->closed());
1122 EXPECT_FALSE(client.partial_loader_data()->closed());
1123
1124 // Request data at middle to continue loading partial, but not all remaining
1125 // data.
1126 loader.RequestData(kDocSize / 2, 100);
1127
1128 // Fill data at the end, the partial loding should be started for second
1129 // requested data after receive data for first request.
1130 client.SendAllPartialData();
1131
1132 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1133 // Process second request.
1134 const uint32_t expected_length =
1135 client.partial_loader_data()->open_byte_range().length();
1136
1137 // Send data.
1138 client.partial_loader_data()->set_byte_range(
1139 client.partial_loader_data()->open_byte_range());
1140 client.partial_loader_data()->CallOpenCallback(0);
1141 uint32_t length = expected_length;
1142 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:431143 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Strygin2cf20af42018-06-14 14:26:531144 const uint32_t part_len = std::min(length, max_part_len);
1145 client.partial_loader_data()->CallReadCallback(part_len);
1146 length -= part_len;
1147 }
1148
1149 // The partial loading should be finished for current chunks sequence, if
1150 // expected range was received, and remaining sequence should start loading.
1151 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1152 ASSERT_TRUE(client.partial_loader_data()->IsWaitOpen());
1153
1154 // Send other document data.
1155 client.SendAllPartialData();
1156 // The downloads should be finished.
1157 EXPECT_TRUE(client.full_page_loader_data()->closed());
1158 EXPECT_TRUE(client.partial_loader_data()->closed());
1159}
1160
1161TEST_F(DocumentLoaderImplTest, IgnoreDataMoreThanExpectedWithPartialAtFileEnd) {
1162 static constexpr uint32_t kExtraSize = 100;
1163 static constexpr uint32_t kRealSize = kDefaultRequestSize * 20 - 300;
1164 static constexpr uint32_t kDocSize = kRealSize - kExtraSize;
1165 TestClient client;
1166 client.SetCanUsePartialLoading();
1167 client.full_page_loader_data()->set_content_length(kDocSize);
1168 DocumentLoaderImpl loader(&client);
1169 loader.Init(client.CreateFullPageLoader(), "http://url.com");
1170 // Request data at middle.
1171 static constexpr uint32_t kFirstPartial = kDefaultRequestSize * 11;
1172 loader.RequestData(kFirstPartial, kDefaultRequestSize);
1173
1174 // Always send initial data from FullPageLoader.
1175 client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize);
1176 EXPECT_TRUE(client.full_page_loader_data()->closed());
1177 EXPECT_FALSE(client.partial_loader_data()->closed());
1178
1179 // Send data to file end and extra non expected data.
1180 client.partial_loader_data()->set_byte_range(
1181 gfx::Range(kFirstPartial, kRealSize));
1182 client.partial_loader_data()->CallOpenCallback(0);
1183 uint32_t length = client.partial_loader_data()->byte_range().length();
1184 while (length > 0) {
Henrique Nakashima1c5da8e2018-10-05 21:56:431185 constexpr uint32_t max_part_len = kDefaultRequestSize;
Artem Strygin2cf20af42018-06-14 14:26:531186 const uint32_t part_len = std::min(length, max_part_len);
1187 client.partial_loader_data()->CallReadCallback(part_len);
1188 length -= part_len;
1189 }
1190
1191 // The partial loading should be finished for current chunks sequence, if
1192 // eof was reached, and remaining sequence should start loading.
1193 EXPECT_FALSE(client.partial_loader_data()->IsWaitRead());
1194 EXPECT_EQ(gfx::Range(kDefaultRequestSize, kFirstPartial),
1195 client.partial_loader_data()->open_byte_range());
1196
1197 // Send other document data.
1198 client.SendAllPartialData();
1199 // The downloads should be finished.
1200 EXPECT_TRUE(client.full_page_loader_data()->closed());
1201 EXPECT_TRUE(client.partial_loader_data()->closed());
1202}
1203
Artem Stryginaf1b43422017-09-12 18:48:241204} // namespace chrome_pdf