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 |