OLD | NEW |
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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 <algorithm> | 5 #include <algorithm> |
6 #include <string> | 6 #include <string> |
7 | 7 |
8 #include "base/bind.h" | 8 #include "base/bind.h" |
9 #include "base/format_macros.h" | 9 #include "base/format_macros.h" |
10 #include "base/stringprintf.h" | 10 #include "base/stringprintf.h" |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
46 static const int kDataSize = 1024; | 46 static const int kDataSize = 1024; |
47 static const int kHttpOK = 200; | 47 static const int kHttpOK = 200; |
48 static const int kHttpPartialContent = 206; | 48 static const int kHttpPartialContent = 206; |
49 | 49 |
50 enum NetworkState { | 50 enum NetworkState { |
51 NONE, | 51 NONE, |
52 LOADED, | 52 LOADED, |
53 LOADING | 53 LOADING |
54 }; | 54 }; |
55 | 55 |
56 // Submit a request completed event to the resource loader due to request | |
57 // being canceled. Pretending the event is from external. | |
58 ACTION_P(RequestCanceled, loader) { | |
59 WebURLError error; | |
60 error.reason = net::ERR_ABORTED; | |
61 error.domain = WebString::fromUTF8(net::kErrorDomain); | |
62 loader->didFail(NULL, error); | |
63 } | |
64 | |
65 // Predicate that tests that request disallows compressed data. | 56 // Predicate that tests that request disallows compressed data. |
66 static bool CorrectAcceptEncoding(const WebKit::WebURLRequest &request) { | 57 static bool CorrectAcceptEncoding(const WebKit::WebURLRequest &request) { |
67 std::string value = request.httpHeaderField( | 58 std::string value = request.httpHeaderField( |
68 WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding)).utf8(); | 59 WebString::fromUTF8(net::HttpRequestHeaders::kAcceptEncoding)).utf8(); |
69 return (value.find("identity;q=1") != std::string::npos) && | 60 return (value.find("identity;q=1") != std::string::npos) && |
70 (value.find("*;q=0") != std::string::npos); | 61 (value.find("*;q=0") != std::string::npos); |
71 } | 62 } |
72 | 63 |
73 class BufferedResourceLoaderTest : public testing::Test { | 64 class BufferedResourceLoaderTest : public testing::Test { |
74 public: | 65 public: |
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
113 base::Unretained(this)), | 104 base::Unretained(this)), |
114 view_->mainFrame()); | 105 view_->mainFrame()); |
115 } | 106 } |
116 | 107 |
117 void FullResponse(int64 instance_size) { | 108 void FullResponse(int64 instance_size) { |
118 FullResponse(instance_size, net::OK); | 109 FullResponse(instance_size, net::OK); |
119 } | 110 } |
120 | 111 |
121 void FullResponse(int64 instance_size, int status) { | 112 void FullResponse(int64 instance_size, int status) { |
122 EXPECT_CALL(*this, StartCallback(status)); | 113 EXPECT_CALL(*this, StartCallback(status)); |
123 if (status != net::OK) { | |
124 EXPECT_CALL(*url_loader_, cancel()) | |
125 .WillOnce(RequestCanceled(loader_)); | |
126 } | |
127 | 114 |
128 WebURLResponse response(gurl_); | 115 WebURLResponse response(gurl_); |
129 response.setHTTPHeaderField(WebString::fromUTF8("Content-Length"), | 116 response.setHTTPHeaderField(WebString::fromUTF8("Content-Length"), |
130 WebString::fromUTF8(base::StringPrintf("%" | 117 WebString::fromUTF8(base::StringPrintf("%" |
131 PRId64, instance_size))); | 118 PRId64, instance_size))); |
132 response.setExpectedContentLength(instance_size); | 119 response.setExpectedContentLength(instance_size); |
133 response.setHTTPStatusCode(kHttpOK); | 120 response.setHTTPStatusCode(kHttpOK); |
134 loader_->didReceiveResponse(url_loader_, response); | 121 loader_->didReceiveResponse(url_loader_, response); |
135 | 122 |
136 if (status == net::OK) { | 123 if (status == net::OK) { |
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
194 WebKit::WebURLRequest newRequest(redirectUrl); | 181 WebKit::WebURLRequest newRequest(redirectUrl); |
195 WebKit::WebURLResponse redirectResponse(gurl_); | 182 WebKit::WebURLResponse redirectResponse(gurl_); |
196 | 183 |
197 loader_->willSendRequest(url_loader_, newRequest, redirectResponse); | 184 loader_->willSendRequest(url_loader_, newRequest, redirectResponse); |
198 | 185 |
199 MessageLoop::current()->RunAllPending(); | 186 MessageLoop::current()->RunAllPending(); |
200 } | 187 } |
201 | 188 |
202 void StopWhenLoad() { | 189 void StopWhenLoad() { |
203 InSequence s; | 190 InSequence s; |
204 EXPECT_CALL(*url_loader_, cancel()) | 191 EXPECT_CALL(*url_loader_, cancel()); |
205 .WillOnce(RequestCanceled(loader_)); | |
206 loader_->Stop(); | 192 loader_->Stop(); |
207 loader_ = NULL; | 193 loader_ = NULL; |
208 } | 194 } |
209 | 195 |
210 // Helper method to write to |loader_| from |data_|. | 196 // Helper method to write to |loader_| from |data_|. |
211 void WriteLoader(int position, int size) { | 197 void WriteLoader(int position, int size) { |
212 EXPECT_CALL(*this, NetworkCallback()) | 198 EXPECT_CALL(*this, NetworkCallback()) |
213 .RetiresOnSaturation(); | 199 .RetiresOnSaturation(); |
214 loader_->didReceiveData(url_loader_, | 200 loader_->didReceiveData(url_loader_, |
215 reinterpret_cast<char*>(data_ + position), | 201 reinterpret_cast<char*>(data_ + position), |
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
267 void ConfirmLoaderBufferBackwardCapacity(size_t expected_backward_capacity) { | 253 void ConfirmLoaderBufferBackwardCapacity(size_t expected_backward_capacity) { |
268 EXPECT_EQ(loader_->buffer_->backward_capacity(), | 254 EXPECT_EQ(loader_->buffer_->backward_capacity(), |
269 expected_backward_capacity); | 255 expected_backward_capacity); |
270 } | 256 } |
271 | 257 |
272 void ConfirmLoaderBufferForwardCapacity(size_t expected_forward_capacity) { | 258 void ConfirmLoaderBufferForwardCapacity(size_t expected_forward_capacity) { |
273 EXPECT_EQ(loader_->buffer_->forward_capacity(), expected_forward_capacity); | 259 EXPECT_EQ(loader_->buffer_->forward_capacity(), expected_forward_capacity); |
274 } | 260 } |
275 | 261 |
276 void ConfirmLoaderDeferredState(bool expectedVal) { | 262 void ConfirmLoaderDeferredState(bool expectedVal) { |
277 EXPECT_EQ(loader_->deferred_, expectedVal); | 263 EXPECT_EQ(loader_->active_loader_->deferred(), expectedVal); |
278 } | 264 } |
279 | 265 |
280 // Makes sure the |loader_| buffer window is in a reasonable range. | 266 // Makes sure the |loader_| buffer window is in a reasonable range. |
281 void CheckBufferWindowBounds() { | 267 void CheckBufferWindowBounds() { |
282 // Corresponds to value defined in buffered_resource_loader.cc. | 268 // Corresponds to value defined in buffered_resource_loader.cc. |
283 static const size_t kMinBufferCapacity = 2 * 1024 * 1024; | 269 static const size_t kMinBufferCapacity = 2 * 1024 * 1024; |
284 EXPECT_GE(loader_->buffer_->forward_capacity(), kMinBufferCapacity); | 270 EXPECT_GE(loader_->buffer_->forward_capacity(), kMinBufferCapacity); |
285 EXPECT_GE(loader_->buffer_->backward_capacity(), kMinBufferCapacity); | 271 EXPECT_GE(loader_->buffer_->backward_capacity(), kMinBufferCapacity); |
286 | 272 |
287 // Corresponds to value defined in buffered_resource_loader.cc. | 273 // Corresponds to value defined in buffered_resource_loader.cc. |
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
320 Start(); | 306 Start(); |
321 StopWhenLoad(); | 307 StopWhenLoad(); |
322 } | 308 } |
323 | 309 |
324 // Tests that a bad HTTP response is recived, e.g. file not found. | 310 // Tests that a bad HTTP response is recived, e.g. file not found. |
325 TEST_F(BufferedResourceLoaderTest, BadHttpResponse) { | 311 TEST_F(BufferedResourceLoaderTest, BadHttpResponse) { |
326 Initialize(kHttpUrl, -1, -1); | 312 Initialize(kHttpUrl, -1, -1); |
327 Start(); | 313 Start(); |
328 | 314 |
329 EXPECT_CALL(*this, StartCallback(net::ERR_FAILED)); | 315 EXPECT_CALL(*this, StartCallback(net::ERR_FAILED)); |
330 EXPECT_CALL(*url_loader_, cancel()) | |
331 .WillOnce(RequestCanceled(loader_)); | |
332 | 316 |
333 WebURLResponse response(gurl_); | 317 WebURLResponse response(gurl_); |
334 response.setHTTPStatusCode(404); | 318 response.setHTTPStatusCode(404); |
335 response.setHTTPStatusText("Not Found\n"); | 319 response.setHTTPStatusText("Not Found\n"); |
336 loader_->didReceiveResponse(url_loader_, response); | 320 loader_->didReceiveResponse(url_loader_, response); |
| 321 StopWhenLoad(); |
337 } | 322 } |
338 | 323 |
339 // Tests that partial content is requested but not fulfilled. | 324 // Tests that partial content is requested but not fulfilled. |
340 TEST_F(BufferedResourceLoaderTest, NotPartialResponse) { | 325 TEST_F(BufferedResourceLoaderTest, NotPartialResponse) { |
341 Initialize(kHttpUrl, 100, -1); | 326 Initialize(kHttpUrl, 100, -1); |
342 Start(); | 327 Start(); |
343 FullResponse(1024, net::ERR_INVALID_RESPONSE); | 328 FullResponse(1024, net::ERR_INVALID_RESPONSE); |
| 329 StopWhenLoad(); |
344 } | 330 } |
345 | 331 |
346 // Tests that a 200 response is received. | 332 // Tests that a 200 response is received. |
347 TEST_F(BufferedResourceLoaderTest, FullResponse) { | 333 TEST_F(BufferedResourceLoaderTest, FullResponse) { |
348 Initialize(kHttpUrl, -1, -1); | 334 Initialize(kHttpUrl, -1, -1); |
349 Start(); | 335 Start(); |
350 FullResponse(1024); | 336 FullResponse(1024); |
351 StopWhenLoad(); | 337 StopWhenLoad(); |
352 } | 338 } |
353 | 339 |
(...skipping 25 matching lines...) Expand all Loading... |
379 PartialResponse(100, 200, 1024, true, false); | 365 PartialResponse(100, 200, 1024, true, false); |
380 StopWhenLoad(); | 366 StopWhenLoad(); |
381 } | 367 } |
382 | 368 |
383 // Tests that an invalid partial response is received. | 369 // Tests that an invalid partial response is received. |
384 TEST_F(BufferedResourceLoaderTest, InvalidPartialResponse) { | 370 TEST_F(BufferedResourceLoaderTest, InvalidPartialResponse) { |
385 Initialize(kHttpUrl, 0, 10); | 371 Initialize(kHttpUrl, 0, 10); |
386 Start(); | 372 Start(); |
387 | 373 |
388 EXPECT_CALL(*this, StartCallback(net::ERR_INVALID_RESPONSE)); | 374 EXPECT_CALL(*this, StartCallback(net::ERR_INVALID_RESPONSE)); |
389 EXPECT_CALL(*url_loader_, cancel()) | |
390 .WillOnce(RequestCanceled(loader_)); | |
391 | 375 |
392 WebURLResponse response(gurl_); | 376 WebURLResponse response(gurl_); |
393 response.setHTTPHeaderField(WebString::fromUTF8("Content-Range"), | 377 response.setHTTPHeaderField(WebString::fromUTF8("Content-Range"), |
394 WebString::fromUTF8(base::StringPrintf("bytes " | 378 WebString::fromUTF8(base::StringPrintf("bytes " |
395 "%d-%d/%d", 1, 10, 1024))); | 379 "%d-%d/%d", 1, 10, 1024))); |
396 response.setExpectedContentLength(10); | 380 response.setExpectedContentLength(10); |
397 response.setHTTPStatusCode(kHttpPartialContent); | 381 response.setHTTPStatusCode(kHttpPartialContent); |
398 loader_->didReceiveResponse(url_loader_, response); | 382 loader_->didReceiveResponse(url_loader_, response); |
| 383 StopWhenLoad(); |
399 } | 384 } |
400 | 385 |
401 // Tests the logic of sliding window for data buffering and reading. | 386 // Tests the logic of sliding window for data buffering and reading. |
402 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { | 387 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { |
403 Initialize(kHttpUrl, 10, 29); | 388 Initialize(kHttpUrl, 10, 29); |
404 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); | 389 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
405 Start(); | 390 Start(); |
406 PartialResponse(10, 29, 30); | 391 PartialResponse(10, 29, 30); |
407 | 392 |
408 uint8 buffer[10]; | 393 uint8 buffer[10]; |
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
520 ReadLoader(10, 10, buffer); | 505 ReadLoader(10, 10, buffer); |
521 | 506 |
522 // Writing to loader will fulfill the read request. | 507 // Writing to loader will fulfill the read request. |
523 EXPECT_CALL(*this, ReadCallback(10)); | 508 EXPECT_CALL(*this, ReadCallback(10)); |
524 WriteLoader(10, 20); | 509 WriteLoader(10, 20); |
525 VerifyBuffer(buffer, 10, 10); | 510 VerifyBuffer(buffer, 10, 10); |
526 | 511 |
527 // The following call cannot be fulfilled now. | 512 // The following call cannot be fulfilled now. |
528 ReadLoader(25, 10, buffer); | 513 ReadLoader(25, 10, buffer); |
529 | 514 |
| 515 EXPECT_CALL(*this, NetworkCallback()); |
530 EXPECT_CALL(*this, ReadCallback(5)); | 516 EXPECT_CALL(*this, ReadCallback(5)); |
531 EXPECT_CALL(*this, NetworkCallback()); | |
532 loader_->didFinishLoading(url_loader_, 0); | 517 loader_->didFinishLoading(url_loader_, 0); |
533 } | 518 } |
534 | 519 |
535 TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) { | 520 TEST_F(BufferedResourceLoaderTest, RequestFailedWhenRead) { |
536 Initialize(kHttpUrl, 10, 29); | 521 Initialize(kHttpUrl, 10, 29); |
537 Start(); | 522 Start(); |
538 PartialResponse(10, 29, 30); | 523 PartialResponse(10, 29, 30); |
539 | 524 |
540 uint8 buffer[10]; | 525 uint8 buffer[10]; |
541 InSequence s; | 526 InSequence s; |
542 | 527 |
543 ReadLoader(10, 10, buffer); | 528 ReadLoader(10, 10, buffer); |
| 529 EXPECT_CALL(*this, NetworkCallback()); |
544 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); | 530 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); |
545 EXPECT_CALL(*this, NetworkCallback()); | |
546 WebURLError error; | 531 WebURLError error; |
547 error.reason = net::ERR_FAILED; | 532 error.reason = net::ERR_FAILED; |
548 loader_->didFail(url_loader_, error); | 533 loader_->didFail(url_loader_, error); |
549 } | 534 } |
550 | 535 |
551 // Tests the data buffering logic of NeverDefer strategy. | 536 // Tests the data buffering logic of NeverDefer strategy. |
552 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { | 537 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { |
553 Initialize(kHttpUrl, 10, 99); | 538 Initialize(kHttpUrl, 10, 99); |
554 SetLoaderBuffer(10, 20); | 539 SetLoaderBuffer(10, 20); |
555 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); | 540 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); |
(...skipping 18 matching lines...) Expand all Loading... |
574 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { | 559 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { |
575 Initialize(kHttpUrl, 10, 99); | 560 Initialize(kHttpUrl, 10, 99); |
576 SetLoaderBuffer(10, 20); | 561 SetLoaderBuffer(10, 20); |
577 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); | 562 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); |
578 Start(); | 563 Start(); |
579 PartialResponse(10, 99, 100); | 564 PartialResponse(10, 99, 100); |
580 | 565 |
581 uint8 buffer[10]; | 566 uint8 buffer[10]; |
582 | 567 |
583 // Make an outstanding read request. | 568 // Make an outstanding read request. |
584 // We should disable deferring after the read request, so expect | |
585 // a network event. | |
586 EXPECT_CALL(*this, NetworkCallback()); | |
587 ReadLoader(10, 10, buffer); | 569 ReadLoader(10, 10, buffer); |
588 | 570 |
589 // Receive almost enough data to cover, shouldn't defer. | 571 // Receive almost enough data to cover, shouldn't defer. |
590 WriteLoader(10, 9); | 572 WriteLoader(10, 9); |
591 ConfirmLoaderDeferredState(false); | 573 ConfirmLoaderDeferredState(false); |
592 | 574 |
593 // As soon as we have received enough data to fulfill the read, defer. | 575 // As soon as we have received enough data to fulfill the read, defer. |
594 EXPECT_CALL(*this, NetworkCallback()); | 576 EXPECT_CALL(*this, NetworkCallback()); |
595 EXPECT_CALL(*this, ReadCallback(10)); | 577 EXPECT_CALL(*this, ReadCallback(10)); |
596 WriteLoader(19, 1); | 578 WriteLoader(19, 1); |
(...skipping 505 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1102 | 1084 |
1103 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_AboveUpperBound) { | 1085 TEST_F(BufferedResourceLoaderTest, BufferWindow_PlaybackRate_AboveUpperBound) { |
1104 Initialize(kHttpUrl, -1, -1); | 1086 Initialize(kHttpUrl, -1, -1); |
1105 Start(); | 1087 Start(); |
1106 loader_->SetPlaybackRate(100); | 1088 loader_->SetPlaybackRate(100); |
1107 CheckBufferWindowBounds(); | 1089 CheckBufferWindowBounds(); |
1108 StopWhenLoad(); | 1090 StopWhenLoad(); |
1109 } | 1091 } |
1110 | 1092 |
1111 } // namespace webkit_media | 1093 } // namespace webkit_media |
OLD | NEW |