| OLD | NEW |
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "content/browser/loader/async_resource_handler.h" | 5 #include "content/browser/loader/async_resource_handler.h" |
| 6 | 6 |
| 7 #include <stddef.h> | 7 #include <stddef.h> |
| 8 #include <stdint.h> | 8 #include <stdint.h> |
| 9 #include <memory> | 9 #include <memory> |
| 10 #include <string> | 10 #include <string> |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 57 namespace { | 57 namespace { |
| 58 | 58 |
| 59 std::string GenerateHeader(size_t response_data_size) { | 59 std::string GenerateHeader(size_t response_data_size) { |
| 60 return base::StringPrintf( | 60 return base::StringPrintf( |
| 61 "HTTP/1.1 200 OK\n" | 61 "HTTP/1.1 200 OK\n" |
| 62 "Content-type: text/html\n" | 62 "Content-type: text/html\n" |
| 63 "Content-Length: %" PRIuS "\n", | 63 "Content-Length: %" PRIuS "\n", |
| 64 response_data_size); | 64 response_data_size); |
| 65 } | 65 } |
| 66 | 66 |
| 67 int64_t TotalReceivedBytes(size_t response_data_size) { | |
| 68 return response_data_size + GenerateHeader(response_data_size).size(); | |
| 69 } | |
| 70 | |
| 71 std::string GenerateData(size_t response_data_size) { | 67 std::string GenerateData(size_t response_data_size) { |
| 72 return std::string(response_data_size, 'a'); | 68 return std::string(response_data_size, 'a'); |
| 73 } | 69 } |
| 74 | 70 |
| 75 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { | 71 class TestProtocolHandler : public net::URLRequestJobFactory::ProtocolHandler { |
| 76 public: | 72 public: |
| 77 TestProtocolHandler(size_t response_data_size) | 73 TestProtocolHandler(size_t response_data_size) |
| 78 : response_data_size_(response_data_size) {} | 74 : response_data_size_(response_data_size) {} |
| 79 | 75 |
| 80 net::URLRequestJob* MaybeCreateJob( | 76 net::URLRequestJob* MaybeCreateJob( |
| (...skipping 164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 245 std::unique_ptr<base::RunLoop> finish_waiter_; | 241 std::unique_ptr<base::RunLoop> finish_waiter_; |
| 246 }; | 242 }; |
| 247 | 243 |
| 248 TEST_F(AsyncResourceHandlerTest, Construct) { | 244 TEST_F(AsyncResourceHandlerTest, Construct) { |
| 249 CreateRequestWithResponseDataSize(1); | 245 CreateRequestWithResponseDataSize(1); |
| 250 } | 246 } |
| 251 | 247 |
| 252 TEST_F(AsyncResourceHandlerTest, OneChunkLengths) { | 248 TEST_F(AsyncResourceHandlerTest, OneChunkLengths) { |
| 253 // Larger than kInlinedLeadingChunkSize and smaller than | 249 // Larger than kInlinedLeadingChunkSize and smaller than |
| 254 // kMaxAllocationSize. | 250 // kMaxAllocationSize. |
| 255 constexpr auto kDataSize = 4096; | 251 StartRequestAndWaitWithResponseDataSize(4096); |
| 256 StartRequestAndWaitWithResponseDataSize(kDataSize); | |
| 257 const auto& messages = filter_->messages(); | 252 const auto& messages = filter_->messages(); |
| 258 ASSERT_EQ(4u, messages.size()); | 253 ASSERT_EQ(4u, messages.size()); |
| 259 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2]->type()); | 254 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2]->type()); |
| 260 ResourceMsg_DataReceived::Param params; | 255 ResourceMsg_DataReceived::Param params; |
| 261 ResourceMsg_DataReceived::Read(messages[2].get(), ¶ms); | 256 ResourceMsg_DataReceived::Read(messages[2].get(), ¶ms); |
| 262 | 257 |
| 263 int encoded_data_length = std::get<3>(params); | 258 int encoded_data_length = std::get<3>(params); |
| 264 EXPECT_EQ(kDataSize, encoded_data_length); | 259 EXPECT_EQ(4096, encoded_data_length); |
| 265 int encoded_body_length = std::get<4>(params); | 260 int encoded_body_length = std::get<4>(params); |
| 266 EXPECT_EQ(kDataSize, encoded_body_length); | 261 EXPECT_EQ(4096, encoded_body_length); |
| 267 | |
| 268 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[3]->type()); | |
| 269 ResourceMsg_RequestComplete::Param completion_params; | |
| 270 ResourceMsg_RequestComplete::Read(messages[3].get(), &completion_params); | |
| 271 ResourceRequestCompletionStatus completion_status = | |
| 272 std::get<1>(completion_params); | |
| 273 | |
| 274 EXPECT_EQ(TotalReceivedBytes(kDataSize), | |
| 275 completion_status.encoded_data_length); | |
| 276 EXPECT_EQ(kDataSize, completion_status.encoded_body_length); | |
| 277 } | 262 } |
| 278 | 263 |
| 279 TEST_F(AsyncResourceHandlerTest, InlinedChunkLengths) { | 264 TEST_F(AsyncResourceHandlerTest, InlinedChunkLengths) { |
| 280 // TODO(ricea): Remove this Feature-enabling code once the feature is on by | 265 // TODO(ricea): Remove this Feature-enabling code once the feature is on by |
| 281 // default. | 266 // default. |
| 282 base::test::ScopedFeatureList scoped_feature_list; | 267 base::test::ScopedFeatureList scoped_feature_list; |
| 283 scoped_feature_list.InitAndEnableFeature( | 268 scoped_feature_list.InitAndEnableFeature( |
| 284 features::kOptimizeLoadingIPCForSmallResources); | 269 features::kOptimizeLoadingIPCForSmallResources); |
| 285 | 270 |
| 286 // Smaller than kInlinedLeadingChunkSize. | 271 // Smaller than kInlinedLeadingChunkSize. |
| 287 constexpr auto kDataSize = 8; | 272 StartRequestAndWaitWithResponseDataSize(8); |
| 288 StartRequestAndWaitWithResponseDataSize(kDataSize); | |
| 289 const auto& messages = filter_->messages(); | 273 const auto& messages = filter_->messages(); |
| 290 ASSERT_EQ(3u, messages.size()); | 274 ASSERT_EQ(3u, messages.size()); |
| 291 ASSERT_EQ(ResourceMsg_InlinedDataChunkReceived::ID, messages[1]->type()); | 275 ASSERT_EQ(ResourceMsg_InlinedDataChunkReceived::ID, messages[1]->type()); |
| 292 ResourceMsg_InlinedDataChunkReceived::Param params; | 276 ResourceMsg_InlinedDataChunkReceived::Param params; |
| 293 ResourceMsg_InlinedDataChunkReceived::Read(messages[1].get(), ¶ms); | 277 ResourceMsg_InlinedDataChunkReceived::Read(messages[1].get(), ¶ms); |
| 294 | 278 |
| 295 int encoded_data_length = std::get<2>(params); | 279 int encoded_data_length = std::get<2>(params); |
| 296 EXPECT_EQ(kDataSize, encoded_data_length); | 280 EXPECT_EQ(8, encoded_data_length); |
| 297 int encoded_body_length = std::get<3>(params); | 281 int encoded_body_length = std::get<3>(params); |
| 298 EXPECT_EQ(kDataSize, encoded_body_length); | 282 EXPECT_EQ(8, encoded_body_length); |
| 299 | |
| 300 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[2]->type()); | |
| 301 ResourceMsg_RequestComplete::Param completion_params; | |
| 302 ResourceMsg_RequestComplete::Read(messages[2].get(), &completion_params); | |
| 303 ResourceRequestCompletionStatus completion_status = | |
| 304 std::get<1>(completion_params); | |
| 305 | |
| 306 EXPECT_EQ(TotalReceivedBytes(kDataSize), | |
| 307 completion_status.encoded_data_length); | |
| 308 EXPECT_EQ(kDataSize, completion_status.encoded_body_length); | |
| 309 } | 283 } |
| 310 | 284 |
| 311 TEST_F(AsyncResourceHandlerTest, TwoChunksLengths) { | 285 TEST_F(AsyncResourceHandlerTest, TwoChunksLengths) { |
| 312 // Larger than kMaxAllocationSize. | 286 // Larger than kMaxAllocationSize. |
| 313 constexpr auto kDataSize = 64 * 1024; | 287 StartRequestAndWaitWithResponseDataSize(64*1024); |
| 314 StartRequestAndWaitWithResponseDataSize(kDataSize); | |
| 315 const auto& messages = filter_->messages(); | 288 const auto& messages = filter_->messages(); |
| 316 ASSERT_EQ(5u, messages.size()); | 289 ASSERT_EQ(5u, messages.size()); |
| 317 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2]->type()); | 290 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[2]->type()); |
| 318 ResourceMsg_DataReceived::Param params; | 291 ResourceMsg_DataReceived::Param params; |
| 319 ResourceMsg_DataReceived::Read(messages[2].get(), ¶ms); | 292 ResourceMsg_DataReceived::Read(messages[2].get(), ¶ms); |
| 320 | 293 |
| 321 int encoded_data_length = std::get<3>(params); | 294 int encoded_data_length = std::get<3>(params); |
| 322 EXPECT_EQ(32768, encoded_data_length); | 295 EXPECT_EQ(32768, encoded_data_length); |
| 323 int encoded_body_length = std::get<4>(params); | 296 int encoded_body_length = std::get<4>(params); |
| 324 EXPECT_EQ(32768, encoded_body_length); | 297 EXPECT_EQ(32768, encoded_body_length); |
| 325 | 298 |
| 326 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[3]->type()); | 299 ASSERT_EQ(ResourceMsg_DataReceived::ID, messages[3]->type()); |
| 327 ResourceMsg_DataReceived::Read(messages[3].get(), ¶ms); | 300 ResourceMsg_DataReceived::Read(messages[3].get(), ¶ms); |
| 328 | 301 |
| 329 encoded_data_length = std::get<3>(params); | 302 encoded_data_length = std::get<3>(params); |
| 330 EXPECT_EQ(32768, encoded_data_length); | 303 EXPECT_EQ(32768, encoded_data_length); |
| 331 encoded_body_length = std::get<4>(params); | 304 encoded_body_length = std::get<4>(params); |
| 332 EXPECT_EQ(32768, encoded_body_length); | 305 EXPECT_EQ(32768, encoded_body_length); |
| 333 | |
| 334 ASSERT_EQ(ResourceMsg_RequestComplete::ID, messages[4]->type()); | |
| 335 ResourceMsg_RequestComplete::Param completion_params; | |
| 336 ResourceMsg_RequestComplete::Read(messages[4].get(), &completion_params); | |
| 337 ResourceRequestCompletionStatus completion_status = | |
| 338 std::get<1>(completion_params); | |
| 339 EXPECT_EQ(TotalReceivedBytes(kDataSize), | |
| 340 completion_status.encoded_data_length); | |
| 341 EXPECT_EQ(kDataSize, completion_status.encoded_body_length); | |
| 342 } | 306 } |
| 343 | 307 |
| 344 } // namespace | 308 } // namespace |
| 345 | 309 |
| 346 } // namespace content | 310 } // namespace content |
| OLD | NEW |