Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 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 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 5 | #include "pdf/document_loader_impl.h" |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 6 | |
Lei Zhang | 02a3a0f | 2017-12-11 20:25:48 | [diff] [blame] | 7 | #include <algorithm> |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 8 | #include <memory> |
| 9 | #include <string> |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 10 | #include <utility> |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 11 | #include <vector> |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 12 | |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 13 | #include "base/callback.h" |
Hans Wennborg | 5078d10 | 2020-04-29 18:26:46 | [diff] [blame] | 14 | #include "base/check.h" |
K. Moon | f2a1414 | 2020-08-12 19:39:40 | [diff] [blame] | 15 | #include "base/test/scoped_feature_list.h" |
| 16 | #include "pdf/pdf_features.h" |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 17 | #include "pdf/ppapi_migration/callback.h" |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 18 | #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 | |
| 23 | using ::testing::_; |
| 24 | using ::testing::Mock; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 25 | using ::testing::NiceMock; |
| 26 | using ::testing::Return; |
Lei Zhang | ad08617 | 2020-06-30 05:53:46 | [diff] [blame] | 27 | using ::testing::Sequence; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 28 | |
| 29 | namespace chrome_pdf { |
| 30 | |
| 31 | namespace { |
| 32 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 33 | constexpr uint32_t kDefaultRequestSize = |
| 34 | DocumentLoaderImpl::kDefaultRequestSize; |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 35 | |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 36 | class TestURLLoader : public URLLoaderWrapper { |
| 37 | public: |
| 38 | class LoaderData { |
| 39 | public: |
Chris Watkins | da54769 | 2017-11-30 03:49:24 | [diff] [blame] | 40 | LoaderData() = default; |
Hui Yingst | eb451e4 | 2020-08-11 18:41:24 | [diff] [blame] | 41 | LoaderData(const LoaderData&) = delete; |
| 42 | LoaderData& operator=(const LoaderData&) = delete; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 43 | ~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. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 96 | bool IsWaitRead() const { return !did_read_callback_.is_null(); } |
| 97 | bool IsWaitOpen() const { return !did_open_callback_.is_null(); } |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 98 | char* buffer() const { return buffer_; } |
| 99 | int buffer_size() const { return buffer_size_; } |
| 100 | |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 101 | void SetReadCallback(ResultCallback read_callback, |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 102 | char* buffer, |
| 103 | int buffer_size) { |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 104 | did_read_callback_ = std::move(read_callback); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 105 | buffer_ = buffer; |
| 106 | buffer_size_ = buffer_size; |
| 107 | } |
| 108 | |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 109 | void SetOpenCallback(ResultCallback open_callback, |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 110 | gfx::Range req_byte_range) { |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 111 | did_open_callback_ = std::move(open_callback); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 112 | set_open_byte_range(req_byte_range); |
| 113 | } |
| 114 | |
| 115 | void CallOpenCallback(int result) { |
| 116 | DCHECK(IsWaitOpen()); |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 117 | std::move(did_open_callback_).Run(result); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 118 | } |
| 119 | |
| 120 | void CallReadCallback(int result) { |
| 121 | DCHECK(IsWaitRead()); |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 122 | std::move(did_read_callback_).Run(result); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 123 | } |
| 124 | |
| 125 | private: |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 126 | ResultCallback did_open_callback_; |
| 127 | ResultCallback did_read_callback_; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 128 | 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 142 | }; |
| 143 | |
| 144 | explicit TestURLLoader(LoaderData* data) : data_(data) { |
| 145 | data_->set_closed(false); |
| 146 | } |
Hui Yingst | eb451e4 | 2020-08-11 18:41:24 | [diff] [blame] | 147 | TestURLLoader(const TestURLLoader&) = delete; |
| 148 | TestURLLoader& operator=(const TestURLLoader&) = delete; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 149 | ~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 Zhang | 02a3a0f | 2017-12-11 20:25:48 | [diff] [blame] | 169 | bool GetByteRangeStart(int* start) const override { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 170 | *start = data_->byte_range().start(); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 171 | 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. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 180 | ResultCallback callback) override { |
| 181 | data_->SetOpenCallback(std::move(callback), |
| 182 | gfx::Range(position, position + size)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 183 | } |
| 184 | |
| 185 | void ReadResponseBody(char* buffer, |
| 186 | int buffer_size, |
K. Moon | 544e0953 | 2020-07-07 17:08:55 | [diff] [blame] | 187 | ResultCallback callback) override { |
| 188 | data_->SetReadCallback(std::move(callback), buffer, buffer_size); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 189 | } |
| 190 | |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 191 | private: |
| 192 | LoaderData* data_; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 193 | }; |
| 194 | |
| 195 | class TestClient : public DocumentLoader::Client { |
| 196 | public: |
| 197 | TestClient() { full_page_loader_data()->set_content_type("application/pdf"); } |
Hui Yingst | eb451e4 | 2020-08-11 18:41:24 | [diff] [blame] | 198 | TestClient(const TestClient&) = delete; |
| 199 | TestClient& operator=(const TestClient&) = delete; |
Chris Watkins | da54769 | 2017-11-30 03:49:24 | [diff] [blame] | 200 | ~TestClient() override = default; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 201 | |
| 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 212 | |
| 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 Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 236 | constexpr uint32_t max_part_len = kDefaultRequestSize; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 237 | 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 249 | }; |
| 250 | |
| 251 | class MockClient : public TestClient { |
| 252 | public: |
Chris Watkins | da54769 | 2017-11-30 03:49:24 | [diff] [blame] | 253 | MockClient() = default; |
Hui Yingst | eb451e4 | 2020-08-11 18:41:24 | [diff] [blame] | 254 | MockClient(const MockClient&) = delete; |
| 255 | MockClient& operator=(const MockClient&) = delete; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 256 | |
K. Moon | f4c9f061 | 2020-07-21 07:05:31 | [diff] [blame] | 257 | MOCK_METHOD(void, OnPendingRequestComplete, (), (override)); |
| 258 | MOCK_METHOD(void, OnNewDataReceived, (), (override)); |
| 259 | MOCK_METHOD(void, OnDocumentComplete, (), (override)); |
| 260 | MOCK_METHOD(void, OnDocumentCanceled, (), (override)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 261 | }; |
| 262 | |
| 263 | } // namespace |
| 264 | |
K. Moon | f2a1414 | 2020-08-12 19:39:40 | [diff] [blame] | 265 | class 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 | |
| 274 | TEST_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 | |
| 290 | TEST_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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 305 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 306 | TEST_F(DocumentLoaderImplTest, PartialLoadingEnabled) { |
K. Moon | f2a1414 | 2020-08-12 19:39:40 | [diff] [blame] | 307 | // Test that partial loading is enabled. (Fixture enables PdfPartialLoading.) |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 308 | TestClient client; |
| 309 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 310 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 311 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 315 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 316 | EXPECT_TRUE(loader.is_partial_loader_active()); |
| 317 | } |
| 318 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 319 | TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledOnSmallFiles) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 320 | TestClient client; |
| 321 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 322 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 2); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 323 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 324 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 328 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 329 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 330 | } |
| 331 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 332 | TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledIfContentEncoded) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 333 | TestClient client; |
| 334 | client.SetCanUsePartialLoading(); |
| 335 | client.full_page_loader_data()->set_content_encoded(true); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 336 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 337 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 341 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 342 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 343 | } |
| 344 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 345 | TEST_F(DocumentLoaderImplTest, PartialLoadingDisabledNoAcceptRangeBytes) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 346 | TestClient client; |
| 347 | client.SetCanUsePartialLoading(); |
| 348 | client.full_page_loader_data()->set_accept_ranges_bytes(false); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 349 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 350 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 354 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 355 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 356 | } |
| 357 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 358 | TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromBegin) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 359 | TestClient client; |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 360 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 361 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 366 | loader.RequestData(kDefaultRequestSize, 1); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 367 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 368 | // Always send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 369 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 370 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 371 | } |
| 372 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 373 | TEST_F(DocumentLoaderImplTest, PartialLoadingReallyDisabledRequestFromMiddle) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 374 | TestClient client; |
| 375 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 376 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 377 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 382 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 383 | EXPECT_FALSE(loader.is_partial_loader_active()); |
| 384 | } |
| 385 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 386 | TEST_F(DocumentLoaderImplTest, PartialLoadingSimple) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 387 | TestClient client; |
| 388 | client.SetCanUsePartialLoading(); |
| 389 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 390 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 391 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 402 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 403 | |
| 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 414 | TEST_F(DocumentLoaderImplTest, PartialLoadingBackOrder) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 415 | TestClient client; |
| 416 | client.SetCanUsePartialLoading(); |
| 417 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 418 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 419 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 430 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 431 | |
| 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 444 | TEST_F(DocumentLoaderImplTest, CompleteWithoutPartial) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 445 | TestClient client; |
| 446 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 447 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 448 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 457 | TEST_F(DocumentLoaderImplTest, ErrorDownloadFullDocument) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 458 | TestClient client; |
| 459 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 460 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 461 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 469 | TEST_F(DocumentLoaderImplTest, CompleteNoContentLength) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 470 | TestClient client; |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 471 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 472 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 485 | TEST_F(DocumentLoaderImplTest, CompleteWithPartial) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 486 | TestClient client; |
| 487 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 488 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 489 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 490 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 491 | loader.RequestData(19 * kDefaultRequestSize, kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 492 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 497 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 498 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 508 | TEST_F(DocumentLoaderImplTest, PartialRequestLastChunk) { |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 509 | constexpr uint32_t kLastChunkSize = 300; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 510 | TestClient client; |
| 511 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 512 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 + |
| 513 | kLastChunkSize); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 514 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 515 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 516 | loader.RequestData(20 * kDefaultRequestSize, 1); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 517 | |
| 518 | // Always send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 519 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 520 | |
| 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 529 | while (data_length > kDefaultRequestSize) { |
| 530 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
| 531 | data_length -= kDefaultRequestSize; |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 532 | } |
| 533 | EXPECT_EQ(kLastChunkSize, data_length); |
| 534 | client.partial_loader_data()->CallReadCallback(kLastChunkSize); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 535 | EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize * 20, kLastChunkSize)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 536 | } |
| 537 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 538 | TEST_F(DocumentLoaderImplTest, DocumentSize) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 539 | TestClient client; |
| 540 | client.SetCanUsePartialLoading(); |
| 541 | client.full_page_loader_data()->set_content_length(123456789); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 542 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 543 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 548 | TEST_F(DocumentLoaderImplTest, DocumentSizeNoContentLength) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 549 | TestClient client; |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 550 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 551 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 552 | EXPECT_EQ(0ul, loader.GetDocumentSize()); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 553 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 554 | client.full_page_loader_data()->CallReadCallback(1000); |
| 555 | client.full_page_loader_data()->CallReadCallback(500); |
| 556 | client.full_page_loader_data()->CallReadCallback(0); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 557 | EXPECT_EQ(kDefaultRequestSize + 1000ul + 500ul, loader.GetDocumentSize()); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 558 | EXPECT_TRUE(loader.IsDocumentComplete()); |
| 559 | } |
| 560 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 561 | TEST_F(DocumentLoaderImplTest, ClearPendingRequests) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 562 | TestClient client; |
| 563 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 564 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 + |
| 565 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 566 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 567 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 568 | loader.RequestData(17 * kDefaultRequestSize + 100, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 569 | loader.ClearPendingRequests(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 570 | loader.RequestData(15 * kDefaultRequestSize + 200, 20); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 571 | // 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 576 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 577 | |
| 578 | { |
| 579 | EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen()); |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 580 | constexpr gfx::Range range_requested(15 * kDefaultRequestSize, |
| 581 | 16 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 582 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 594 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 595 | EXPECT_FALSE(client.partial_loader_data()->closed()); |
| 596 | // Current request should continue loading, because no other request queued. |
| 597 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 598 | loader.RequestData(18 * kDefaultRequestSize + 200, 20); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 599 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 600 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 601 | // 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 607 | loader.RequestData(60 * kDefaultRequestSize + 100, 10); |
| 608 | loader.RequestData(35 * kDefaultRequestSize + 200, 20); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 609 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 610 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 611 | { |
| 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 Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 616 | constexpr gfx::Range range_requested(35 * kDefaultRequestSize, |
| 617 | 36 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 618 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 629 | loader.RequestData(70 * kDefaultRequestSize + 100, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 630 | |
| 631 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 632 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 633 | { |
| 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 Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 638 | constexpr gfx::Range range_requested(70 * kDefaultRequestSize, |
| 639 | 71 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 640 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 650 | TEST_F(DocumentLoaderImplTest, GetBlock) { |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 651 | std::vector<char> buffer(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 652 | TestClient client; |
| 653 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 654 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 + |
| 655 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 656 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 657 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 658 | EXPECT_FALSE(loader.GetBlock(0, 1000, buffer.data())); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 659 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 660 | EXPECT_TRUE(loader.GetBlock(0, 1000, buffer.data())); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 661 | 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 664 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 665 | 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 668 | |
| 669 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 670 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 671 | |
| 672 | client.SendAllPartialData(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 673 | EXPECT_TRUE(loader.GetBlock(17 * kDefaultRequestSize, 3000, buffer.data())); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 674 | } |
| 675 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 676 | TEST_F(DocumentLoaderImplTest, IsDataAvailable) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 677 | TestClient client; |
| 678 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 679 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 + |
| 680 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 681 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 682 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 683 | EXPECT_FALSE(loader.IsDataAvailable(0, 1000)); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 684 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 685 | EXPECT_TRUE(loader.IsDataAvailable(0, 1000)); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 686 | EXPECT_FALSE(loader.IsDataAvailable(kDefaultRequestSize, 1500)); |
| 687 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
| 688 | EXPECT_TRUE(loader.IsDataAvailable(kDefaultRequestSize, 1500)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 689 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 690 | EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000)); |
| 691 | loader.RequestData(17 * kDefaultRequestSize + 100, 10); |
| 692 | EXPECT_FALSE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 693 | |
| 694 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 695 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 696 | |
| 697 | client.SendAllPartialData(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 698 | EXPECT_TRUE(loader.IsDataAvailable(17 * kDefaultRequestSize, 3000)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 699 | } |
| 700 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 701 | TEST_F(DocumentLoaderImplTest, RequestData) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 702 | TestClient client; |
| 703 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 704 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 100 + |
| 705 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 706 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 707 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 708 | loader.RequestData(37 * kDefaultRequestSize + 200, 10); |
| 709 | loader.RequestData(25 * kDefaultRequestSize + 600, 100); |
| 710 | loader.RequestData(13 * kDefaultRequestSize + 900, 500); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 711 | |
| 712 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 713 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 714 | |
| 715 | { |
| 716 | EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen()); |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 717 | constexpr gfx::Range range_requested(13 * kDefaultRequestSize, |
| 718 | 14 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 719 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 729 | loader.RequestData(38 * kDefaultRequestSize + 200, 10); |
| 730 | loader.RequestData(26 * kDefaultRequestSize + 600, 100); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 731 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 732 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 733 | { |
| 734 | EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen()); |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 735 | constexpr gfx::Range range_requested(26 * kDefaultRequestSize, |
| 736 | 27 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 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(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 747 | loader.RequestData(39 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 748 | // Requests queue is processed only on receiving data. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 749 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 750 | { |
| 751 | EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen()); |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 752 | constexpr gfx::Range range_requested(39 * kDefaultRequestSize, |
| 753 | 40 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 754 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 768 | TEST_F(DocumentLoaderImplTest, DoNotLoadAvailablePartialData) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 769 | TestClient client; |
| 770 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 771 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20 + |
| 772 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 773 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 774 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 775 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 776 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 777 | |
| 778 | // Send more data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 779 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 780 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 781 | loader.RequestData(2 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 782 | |
| 783 | // Send more data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 784 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 785 | |
| 786 | // Partial loading should not have started for already available data. |
| 787 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 788 | } |
| 789 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 790 | TEST_F(DocumentLoaderImplTest, DoNotLoadDataAfterComplete) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 791 | TestClient client; |
| 792 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 793 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 794 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 795 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 796 | |
| 797 | for (int i = 0; i < 20; ++i) { |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 798 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 799 | } |
| 800 | |
| 801 | EXPECT_TRUE(loader.IsDocumentComplete()); |
| 802 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 803 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 804 | |
| 805 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 806 | EXPECT_TRUE(client.full_page_loader_data()->closed()); |
| 807 | } |
| 808 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 809 | TEST_F(DocumentLoaderImplTest, DoNotLoadPartialDataAboveDocumentSize) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 810 | TestClient client; |
| 811 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 812 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 813 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 814 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 815 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 816 | loader.RequestData(20 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 817 | |
| 818 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 819 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 820 | |
| 821 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 822 | } |
| 823 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 824 | TEST_F(DocumentLoaderImplTest, MergePendingRequests) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 825 | TestClient client; |
| 826 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 827 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 50 + |
| 828 | 58383); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 829 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 830 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 831 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
| 832 | loader.RequestData(16 * kDefaultRequestSize + 600, 100); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 833 | |
| 834 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 835 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 836 | |
Henrique Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 837 | constexpr gfx::Range range_requested(16 * kDefaultRequestSize, |
| 838 | 18 * kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 839 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 853 | TEST_F(DocumentLoaderImplTest, PartialStopOnStatusCodeError) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 854 | TestClient client; |
| 855 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 856 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 857 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 858 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 859 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 860 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 861 | |
| 862 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 863 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 864 | |
| 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 871 | TEST_F(DocumentLoaderImplTest, |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 872 | PartialAsFullDocumentLoadingRangeRequestNoRangeField) { |
| 873 | TestClient client; |
| 874 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 875 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 876 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 877 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 878 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 879 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 880 | |
| 881 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 882 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 883 | |
| 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 892 | TEST_F(DocumentLoaderImplTest, PartialMultiPart) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 893 | TestClient client; |
| 894 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 895 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 896 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 897 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 898 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 899 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 900 | |
| 901 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 902 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 903 | |
| 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 908 | gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize)); |
| 909 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
| 910 | EXPECT_TRUE( |
| 911 | loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 912 | } |
| 913 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 914 | TEST_F(DocumentLoaderImplTest, PartialMultiPartRangeError) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 915 | TestClient client; |
| 916 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 917 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 918 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 919 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 920 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 921 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 922 | |
| 923 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 924 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 925 | |
| 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 930 | client.partial_loader_data()->CallReadCallback(kDefaultRequestSize); |
| 931 | EXPECT_FALSE( |
| 932 | loader.IsDataAvailable(17 * kDefaultRequestSize, kDefaultRequestSize)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 933 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 934 | } |
| 935 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 936 | TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnOpen) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 937 | TestClient client; |
| 938 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 939 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 940 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 941 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 942 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 943 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 944 | |
| 945 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 946 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 947 | |
| 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 953 | loader.RequestData(18 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 954 | |
| 955 | EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen()); |
| 956 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 957 | } |
| 958 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 959 | TEST_F(DocumentLoaderImplTest, PartialConnectionErrorOnRead) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 960 | TestClient client; |
| 961 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 962 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 963 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 964 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 965 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 966 | loader.RequestData(17 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 967 | |
| 968 | // Send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 969 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 970 | |
| 971 | EXPECT_TRUE(client.partial_loader_data()->IsWaitOpen()); |
| 972 | client.partial_loader_data()->set_byte_range( |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 973 | gfx::Range(17 * kDefaultRequestSize, 18 * kDefaultRequestSize)); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 974 | 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 Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 980 | loader.RequestData(18 * kDefaultRequestSize + 200, 10); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 981 | |
| 982 | EXPECT_FALSE(client.partial_loader_data()->IsWaitOpen()); |
| 983 | EXPECT_TRUE(client.partial_loader_data()->closed()); |
| 984 | } |
| 985 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 986 | TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacks) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 987 | MockClient client; |
| 988 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 989 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 990 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 991 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 992 | |
| 993 | EXPECT_CALL(client, OnDocumentComplete()).Times(0); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 994 | for (int i = 0; i < 19; ++i) |
| 995 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 996 | Mock::VerifyAndClear(&client); |
| 997 | |
| 998 | EXPECT_CALL(client, OnDocumentComplete()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 999 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1000 | Mock::VerifyAndClear(&client); |
| 1001 | } |
| 1002 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1003 | TEST_F(DocumentLoaderImplTest, ClientCompleteCallbacksNoContentLength) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1004 | MockClient client; |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1005 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1006 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1007 | |
| 1008 | EXPECT_CALL(client, OnDocumentCanceled()).Times(0); |
| 1009 | EXPECT_CALL(client, OnDocumentComplete()).Times(0); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1010 | for (int i = 0; i < 20; ++i) |
| 1011 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1012 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1020 | TEST_F(DocumentLoaderImplTest, ClientCancelCallback) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1021 | MockClient client; |
| 1022 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1023 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1024 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1025 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1026 | |
| 1027 | EXPECT_CALL(client, OnDocumentCanceled()).Times(0); |
| 1028 | EXPECT_CALL(client, OnDocumentComplete()).Times(0); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1029 | for (int i = 0; i < 10; ++i) |
| 1030 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1031 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1039 | TEST_F(DocumentLoaderImplTest, NewDataAvailable) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1040 | MockClient client; |
| 1041 | client.SetCanUsePartialLoading(); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1042 | client.full_page_loader_data()->set_content_length(kDefaultRequestSize * 20); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1043 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1044 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1045 | |
| 1046 | EXPECT_CALL(client, OnNewDataReceived()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1047 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1048 | Mock::VerifyAndClear(&client); |
| 1049 | |
| 1050 | EXPECT_CALL(client, OnNewDataReceived()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1051 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize - 100); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1052 | 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 Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1059 | TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompleteFullLoader) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1060 | MockClient client; |
| 1061 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1062 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1063 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1064 | |
| 1065 | loader.RequestData(1000, 4000); |
| 1066 | |
| 1067 | EXPECT_CALL(client, OnPendingRequestComplete()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1068 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1069 | Mock::VerifyAndClear(&client); |
| 1070 | } |
| 1071 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1072 | TEST_F(DocumentLoaderImplTest, ClientPendingRequestCompletePartialLoader) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1073 | MockClient client; |
| 1074 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1075 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1076 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1077 | |
| 1078 | EXPECT_CALL(client, OnPendingRequestComplete()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1079 | loader.RequestData(15 * kDefaultRequestSize + 4000, 4000); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1080 | |
| 1081 | // Always send initial data from FullPageLoader. |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1082 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1083 | |
| 1084 | client.SendAllPartialData(); |
| 1085 | Mock::VerifyAndClear(&client); |
| 1086 | } |
| 1087 | |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1088 | TEST_F(DocumentLoaderImplTest, |
| 1089 | ClientPendingRequestCompletePartialAndFullLoader) { |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1090 | MockClient client; |
| 1091 | client.SetCanUsePartialLoading(); |
Lei Zhang | e98901a | 2018-04-25 23:23:59 | [diff] [blame] | 1092 | DocumentLoaderImpl loader(&client); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1093 | loader.Init(client.CreateFullPageLoader(), "http://url.com"); |
| 1094 | |
| 1095 | EXPECT_CALL(client, OnPendingRequestComplete()).Times(1); |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1096 | loader.RequestData(16 * kDefaultRequestSize + 4000, 4000); |
| 1097 | loader.RequestData(4 * kDefaultRequestSize + 4000, 4000); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1098 | |
Lei Zhang | 533165f | 2018-02-27 19:09:10 | [diff] [blame] | 1099 | for (int i = 0; i < 5; ++i) |
| 1100 | client.full_page_loader_data()->CallReadCallback(kDefaultRequestSize); |
Artem Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1101 | |
| 1102 | Mock::VerifyAndClear(&client); |
| 1103 | |
| 1104 | EXPECT_CALL(client, OnPendingRequestComplete()).Times(1); |
| 1105 | client.SendAllPartialData(); |
| 1106 | Mock::VerifyAndClear(&client); |
| 1107 | } |
| 1108 | |
Artem Strygin | 2cf20af4 | 2018-06-14 14:26:53 | [diff] [blame] | 1109 | TEST_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 Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 1143 | constexpr uint32_t max_part_len = kDefaultRequestSize; |
Artem Strygin | 2cf20af4 | 2018-06-14 14:26:53 | [diff] [blame] | 1144 | 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 | |
| 1161 | TEST_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 Nakashima | 1c5da8e | 2018-10-05 21:56:43 | [diff] [blame] | 1185 | constexpr uint32_t max_part_len = kDefaultRequestSize; |
Artem Strygin | 2cf20af4 | 2018-06-14 14:26:53 | [diff] [blame] | 1186 | 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 Strygin | af1b4342 | 2017-09-12 18:48:24 | [diff] [blame] | 1204 | } // namespace chrome_pdf |