Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1027)

Side by Side Diff: webkit/glue/media/buffered_resource_loader_unittest.cc

Issue 6625059: Implementing preload=metadata for video (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: fix indent Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « webkit/glue/media/buffered_resource_loader.cc ('k') | webkit/glue/media/simple_data_source.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « webkit/glue/media/buffered_resource_loader.cc ('k') | webkit/glue/media/simple_data_source.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698