| 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 | 6 |
| 7 #include "base/format_macros.h" | 7 #include "base/format_macros.h" |
| 8 #include "base/stringprintf.h" | 8 #include "base/stringprintf.h" |
| 9 #include "net/base/net_errors.h" | 9 #include "net/base/net_errors.h" |
| 10 #include "net/http/http_util.h" | 10 #include "net/http/http_util.h" |
| (...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 169 void ReadLoader(int64 position, int size, uint8* buffer) { | 169 void ReadLoader(int64 position, int size, uint8* buffer) { |
| 170 loader_->Read(position, size, buffer, | 170 loader_->Read(position, size, buffer, |
| 171 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); | 171 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); |
| 172 } | 172 } |
| 173 | 173 |
| 174 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. | 174 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. |
| 175 void VerifyBuffer(uint8* buffer, int pos, int size) { | 175 void VerifyBuffer(uint8* buffer, int pos, int size) { |
| 176 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); | 176 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); |
| 177 } | 177 } |
| 178 | 178 |
| 179 // Helper method to disallow deferring in |loader_|. | 179 void ConfirmLoaderDeferredState(bool expectedVal) { |
| 180 void DisallowLoaderDefer() { | 180 EXPECT_EQ(loader_->deferred_, expectedVal); |
| 181 if (loader_->deferred_) { | |
| 182 EXPECT_CALL(*url_loader_, setDefersLoading(false)); | |
| 183 EXPECT_CALL(*this, NetworkCallback()); | |
| 184 } | |
| 185 loader_->SetAllowDefer(false); | |
| 186 } | |
| 187 | |
| 188 // Helper method to allow deferring in |loader_|. | |
| 189 void AllowLoaderDefer() { | |
| 190 loader_->SetAllowDefer(true); | |
| 191 } | 181 } |
| 192 | 182 |
| 193 MOCK_METHOD1(StartCallback, void(int error)); | 183 MOCK_METHOD1(StartCallback, void(int error)); |
| 194 MOCK_METHOD1(ReadCallback, void(int error)); | 184 MOCK_METHOD1(ReadCallback, void(int error)); |
| 195 MOCK_METHOD0(NetworkCallback, void()); | 185 MOCK_METHOD0(NetworkCallback, void()); |
| 196 | 186 |
| 197 protected: | 187 protected: |
| 198 GURL gurl_; | 188 GURL gurl_; |
| 199 int64 first_position_; | 189 int64 first_position_; |
| 200 int64 last_position_; | 190 int64 last_position_; |
| (...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 268 WebString::fromUTF8(base::StringPrintf("bytes " | 258 WebString::fromUTF8(base::StringPrintf("bytes " |
| 269 "%d-%d/%d", 1, 10, 1024))); | 259 "%d-%d/%d", 1, 10, 1024))); |
| 270 response.setExpectedContentLength(10); | 260 response.setExpectedContentLength(10); |
| 271 response.setHTTPStatusCode(kHttpPartialContent); | 261 response.setHTTPStatusCode(kHttpPartialContent); |
| 272 loader_->didReceiveResponse(url_loader_, response); | 262 loader_->didReceiveResponse(url_loader_, response); |
| 273 } | 263 } |
| 274 | 264 |
| 275 // Tests the logic of sliding window for data buffering and reading. | 265 // Tests the logic of sliding window for data buffering and reading. |
| 276 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { | 266 TEST_F(BufferedResourceLoaderTest, BufferAndRead) { |
| 277 Initialize(kHttpUrl, 10, 29); | 267 Initialize(kHttpUrl, 10, 29); |
| 268 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
| 278 Start(); | 269 Start(); |
| 279 PartialResponse(10, 29, 30); | 270 PartialResponse(10, 29, 30); |
| 280 | 271 |
| 281 uint8 buffer[10]; | 272 uint8 buffer[10]; |
| 282 InSequence s; | 273 InSequence s; |
| 283 | 274 |
| 284 // Writes 10 bytes and read them back. | 275 // Writes 10 bytes and read them back. |
| 285 WriteLoader(10, 10); | 276 WriteLoader(10, 10); |
| 286 EXPECT_CALL(*this, ReadCallback(10)); | 277 EXPECT_CALL(*this, ReadCallback(10)); |
| 287 ReadLoader(10, 10, buffer); | 278 ReadLoader(10, 10, buffer); |
| (...skipping 30 matching lines...) Expand all Loading... |
| 318 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 309 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
| 319 ReadLoader(5, 10, buffer); | 310 ReadLoader(5, 10, buffer); |
| 320 | 311 |
| 321 // Try to read beyond the instance size. | 312 // Try to read beyond the instance size. |
| 322 EXPECT_CALL(*this, ReadCallback(0)); | 313 EXPECT_CALL(*this, ReadCallback(0)); |
| 323 ReadLoader(30, 10, buffer); | 314 ReadLoader(30, 10, buffer); |
| 324 } | 315 } |
| 325 | 316 |
| 326 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) { | 317 TEST_F(BufferedResourceLoaderTest, ReadOutsideBuffer) { |
| 327 Initialize(kHttpUrl, 10, 0x00FFFFFF); | 318 Initialize(kHttpUrl, 10, 0x00FFFFFF); |
| 319 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
| 328 Start(); | 320 Start(); |
| 329 PartialResponse(10, 0x00FFFFFF, 0x01000000); | 321 PartialResponse(10, 0x00FFFFFF, 0x01000000); |
| 330 | 322 |
| 331 uint8 buffer[10]; | 323 uint8 buffer[10]; |
| 332 InSequence s; | 324 InSequence s; |
| 333 | 325 |
| 334 // Read very far aheard will get a cache miss. | 326 // Read very far aheard will get a cache miss. |
| 335 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 327 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
| 336 ReadLoader(0x00FFFFFF, 1, buffer); | 328 ReadLoader(0x00FFFFFF, 1, buffer); |
| 337 | 329 |
| (...skipping 23 matching lines...) Expand all Loading... |
| 361 InSequence s; | 353 InSequence s; |
| 362 | 354 |
| 363 ReadLoader(10, 10, buffer); | 355 ReadLoader(10, 10, buffer); |
| 364 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); | 356 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); |
| 365 EXPECT_CALL(*this, NetworkCallback()); | 357 EXPECT_CALL(*this, NetworkCallback()); |
| 366 WebURLError error; | 358 WebURLError error; |
| 367 error.reason = net::ERR_FAILED; | 359 error.reason = net::ERR_FAILED; |
| 368 loader_->didFail(url_loader_, error); | 360 loader_->didFail(url_loader_, error); |
| 369 } | 361 } |
| 370 | 362 |
| 371 // Tests the logic of caching data to disk when media is paused. | 363 // Tests the data buffering logic of NeverDefer strategy. |
| 372 TEST_F(BufferedResourceLoaderTest, AllowDefer_NoDataReceived) { | 364 TEST_F(BufferedResourceLoaderTest, NeverDeferStrategy) { |
| 373 Initialize(kHttpUrl, 10, 99); | 365 Initialize(kHttpUrl, 10, 99); |
| 374 SetLoaderBuffer(10, 20); | 366 SetLoaderBuffer(10, 20); |
| 375 Start(); | 367 loader_->UpdateDeferStrategy(BufferedResourceLoader::kNeverDefer); |
| 376 PartialResponse(10, 99, 100); | |
| 377 | |
| 378 // Start in undeferred state, then disallow defer, then allow defer | |
| 379 // without receiving data in between. | |
| 380 DisallowLoaderDefer(); | |
| 381 AllowLoaderDefer(); | |
| 382 StopWhenLoad(); | |
| 383 } | |
| 384 | |
| 385 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadSameWindow) { | |
| 386 Initialize(kHttpUrl, 10, 99); | |
| 387 SetLoaderBuffer(10, 20); | |
| 388 Start(); | 368 Start(); |
| 389 PartialResponse(10, 99, 100); | 369 PartialResponse(10, 99, 100); |
| 390 | 370 |
| 391 uint8 buffer[10]; | 371 uint8 buffer[10]; |
| 392 | 372 |
| 393 // Start in undeferred state, disallow defer, receive data but don't shift | 373 // Read past the buffer size; should not defer regardless. |
| 394 // buffer window, then allow defer and read. | |
| 395 DisallowLoaderDefer(); | |
| 396 WriteLoader(10, 10); | 374 WriteLoader(10, 10); |
| 397 AllowLoaderDefer(); | 375 WriteLoader(20, 50); |
| 376 ConfirmLoaderDeferredState(false); |
| 398 | 377 |
| 399 EXPECT_CALL(*this, ReadCallback(10)); | 378 // Should move past window. |
| 379 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); |
| 400 ReadLoader(10, 10, buffer); | 380 ReadLoader(10, 10, buffer); |
| 401 VerifyBuffer(buffer, 10, 10); | 381 |
| 402 StopWhenLoad(); | 382 StopWhenLoad(); |
| 403 } | 383 } |
| 404 | 384 |
| 405 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadPastWindow) { | 385 // Tests the data buffering logic of ReadThenDefer strategy. |
| 386 TEST_F(BufferedResourceLoaderTest, ReadThenDeferStrategy) { |
| 406 Initialize(kHttpUrl, 10, 99); | 387 Initialize(kHttpUrl, 10, 99); |
| 407 SetLoaderBuffer(10, 20); | 388 SetLoaderBuffer(10, 20); |
| 389 loader_->UpdateDeferStrategy(BufferedResourceLoader::kReadThenDefer); |
| 408 Start(); | 390 Start(); |
| 409 PartialResponse(10, 99, 100); | 391 PartialResponse(10, 99, 100); |
| 410 | 392 |
| 411 uint8 buffer[10]; | 393 uint8 buffer[10]; |
| 412 | 394 |
| 413 // Not deferred, disallow defer, received data and shift buffer window, | 395 // Make an outstanding read request. |
| 414 // allow defer, then read in area outside of buffer window. | 396 // We should disable deferring after the read request, so expect |
| 415 DisallowLoaderDefer(); | 397 // a network event. |
| 416 WriteLoader(10, 10); | 398 EXPECT_CALL(*this, NetworkCallback()); |
| 417 WriteLoader(20, 50); | 399 ReadLoader(10, 10, buffer); |
| 418 AllowLoaderDefer(); | |
| 419 | 400 |
| 420 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | 401 // Receive almost enough data to cover, shouldn't defer. |
| 421 ReadLoader(10, 10, buffer); | 402 WriteLoader(10, 9); |
| 403 ConfirmLoaderDeferredState(false); |
| 404 |
| 405 // As soon as we have received enough data to fulfill the read, defer. |
| 406 EXPECT_CALL(*this, NetworkCallback()); |
| 407 EXPECT_CALL(*this, ReadCallback(10)); |
| 408 WriteLoader(19, 1); |
| 409 |
| 410 ConfirmLoaderDeferredState(true); |
| 411 VerifyBuffer(buffer, 10, 10); |
| 412 |
| 422 StopWhenLoad(); | 413 StopWhenLoad(); |
| 423 } | 414 } |
| 424 | 415 |
| 425 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredNoDataReceived) { | 416 // Tests the data buffering logic of ThresholdDefer strategy. |
| 417 TEST_F(BufferedResourceLoaderTest, ThresholdDeferStrategy) { |
| 426 Initialize(kHttpUrl, 10, 99); | 418 Initialize(kHttpUrl, 10, 99); |
| 427 SetLoaderBuffer(10, 20); | 419 SetLoaderBuffer(10, 20); |
| 420 loader_->UpdateDeferStrategy(BufferedResourceLoader::kThresholdDefer); |
| 428 Start(); | 421 Start(); |
| 429 PartialResponse(10, 99, 100); | 422 PartialResponse(10, 99, 100); |
| 430 | 423 |
| 431 uint8 buffer[10]; | 424 uint8 buffer[10]; |
| 432 | 425 |
| 433 // Start in deferred state, then disallow defer, receive no data, and | 426 WriteLoader(10, 5); |
| 434 // allow defer and read. | 427 // Haven't reached threshold, don't defer. |
| 435 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | 428 ConfirmLoaderDeferredState(false); |
| 429 |
| 430 // We're at the threshold now, let's defer. |
| 436 EXPECT_CALL(*this, NetworkCallback()); | 431 EXPECT_CALL(*this, NetworkCallback()); |
| 437 WriteLoader(10, 40); | 432 WriteLoader(15, 5); |
| 433 ConfirmLoaderDeferredState(true); |
| 438 | 434 |
| 439 DisallowLoaderDefer(); | 435 // Now we've read over half of the buffer, disable deferring. |
| 440 AllowLoaderDefer(); | 436 EXPECT_CALL(*this, ReadCallback(6)); |
| 437 EXPECT_CALL(*this, NetworkCallback()); |
| 438 ReadLoader(10, 6, buffer); |
| 441 | 439 |
| 442 EXPECT_CALL(*this, ReadCallback(10)); | 440 ConfirmLoaderDeferredState(false); |
| 443 ReadLoader(20, 10, buffer); | 441 VerifyBuffer(buffer, 10, 6); |
| 444 VerifyBuffer(buffer, 20, 10); | 442 |
| 445 StopWhenLoad(); | 443 StopWhenLoad(); |
| 446 } | 444 } |
| 447 | 445 |
| 448 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadSameWindow) { | |
| 449 Initialize(kHttpUrl, 10, 99); | |
| 450 SetLoaderBuffer(10, 20); | |
| 451 Start(); | |
| 452 PartialResponse(10, 99, 100); | |
| 453 | |
| 454 uint8 buffer[10]; | |
| 455 | |
| 456 // Start in deferred state, disallow defer, receive data and shift buffer | |
| 457 // window, allow defer, and read in a place that's still in the window. | |
| 458 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | |
| 459 EXPECT_CALL(*this, NetworkCallback()); | |
| 460 WriteLoader(10, 30); | |
| 461 | |
| 462 DisallowLoaderDefer(); | |
| 463 WriteLoader(40, 5); | |
| 464 AllowLoaderDefer(); | |
| 465 | |
| 466 EXPECT_CALL(*this, ReadCallback(10)); | |
| 467 ReadLoader(20, 10, buffer); | |
| 468 VerifyBuffer(buffer, 20, 10); | |
| 469 StopWhenLoad(); | |
| 470 } | |
| 471 | |
| 472 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadPastWindow) { | |
| 473 Initialize(kHttpUrl, 10, 99); | |
| 474 SetLoaderBuffer(10, 20); | |
| 475 Start(); | |
| 476 PartialResponse(10, 99, 100); | |
| 477 | |
| 478 uint8 buffer[10]; | |
| 479 | |
| 480 // Start in deferred state, disallow defer, receive data and shift buffer | |
| 481 // window, allow defer, and read outside of the buffer window. | |
| 482 EXPECT_CALL(*url_loader_, setDefersLoading(true)); | |
| 483 EXPECT_CALL(*this, NetworkCallback()); | |
| 484 WriteLoader(10, 40); | |
| 485 | |
| 486 DisallowLoaderDefer(); | |
| 487 WriteLoader(50, 20); | |
| 488 WriteLoader(70, 40); | |
| 489 AllowLoaderDefer(); | |
| 490 | |
| 491 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS)); | |
| 492 ReadLoader(20, 5, buffer); | |
| 493 StopWhenLoad(); | |
| 494 } | |
| 495 | |
| 496 // NOTE: This test will need to be reworked a little once | 446 // NOTE: This test will need to be reworked a little once |
| 497 // http://code.google.com/p/chromium/issues/detail?id=72578 | 447 // http://code.google.com/p/chromium/issues/detail?id=72578 |
| 498 // is fixed. | 448 // is fixed. |
| 499 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { | 449 TEST_F(BufferedResourceLoaderTest, HasSingleOrigin) { |
| 500 // Make sure no redirect case works as expected. | 450 // Make sure no redirect case works as expected. |
| 501 Initialize(kHttpUrl, -1, -1); | 451 Initialize(kHttpUrl, -1, -1); |
| 502 Start(); | 452 Start(); |
| 503 FullResponse(1024); | 453 FullResponse(1024); |
| 504 EXPECT_TRUE(loader_->HasSingleOrigin()); | 454 EXPECT_TRUE(loader_->HasSingleOrigin()); |
| 505 StopWhenLoad(); | 455 StopWhenLoad(); |
| (...skipping 27 matching lines...) Expand all Loading... |
| 533 Start(); | 483 Start(); |
| 534 Redirect(kHttpRedirectToSameDomainUrl1); | 484 Redirect(kHttpRedirectToSameDomainUrl1); |
| 535 Redirect(kHttpRedirectToDifferentDomainUrl1); | 485 Redirect(kHttpRedirectToDifferentDomainUrl1); |
| 536 EXPECT_FALSE(loader_->HasSingleOrigin()); | 486 EXPECT_FALSE(loader_->HasSingleOrigin()); |
| 537 StopWhenLoad(); | 487 StopWhenLoad(); |
| 538 } | 488 } |
| 539 | 489 |
| 540 // TODO(hclam): add unit test for defer loading. | 490 // TODO(hclam): add unit test for defer loading. |
| 541 | 491 |
| 542 } // namespace webkit_glue | 492 } // namespace webkit_glue |
| OLD | NEW |