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

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

Issue 2908003: Video Buffering: Caches data to disk when paused (resubmit) (Closed)
Patch Set: Added bug number to valgrind bug, also fixed spacing issue Created 10 years, 5 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
« no previous file with comments | « webkit/glue/media/buffered_data_source.cc ('k') | no next file » | 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) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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/callback.h" 7 #include "base/callback.h"
8 #include "base/format_macros.h" 8 #include "base/format_macros.h"
9 #include "base/string_util.h" 9 #include "base/string_util.h"
10 #include "media/base/filters.h" 10 #include "media/base/filters.h"
(...skipping 61 matching lines...) Expand 10 before | Expand all | Expand 10 after
72 void Initialize(const char* url, int first_position, int last_position) { 72 void Initialize(const char* url, int first_position, int last_position) {
73 gurl_ = GURL(url); 73 gurl_ = GURL(url);
74 first_position_ = first_position; 74 first_position_ = first_position;
75 last_position_ = last_position; 75 last_position_ = last_position;
76 76
77 loader_ = new BufferedResourceLoader(&bridge_factory_, gurl_, 77 loader_ = new BufferedResourceLoader(&bridge_factory_, gurl_,
78 first_position_, last_position_); 78 first_position_, last_position_);
79 EXPECT_EQ(gurl_.spec(), loader_->GetURLForDebugging().spec()); 79 EXPECT_EQ(gurl_.spec(), loader_->GetURLForDebugging().spec());
80 } 80 }
81 81
82 void SetLoaderBuffer(size_t forward_capacity, size_t backward_capacity) {
83 loader_->buffer_.reset(
84 new media::SeekableBuffer(backward_capacity, forward_capacity));
85 }
86
82 void Start() { 87 void Start() {
83 InSequence s; 88 InSequence s;
84 EXPECT_CALL(bridge_factory_, 89 EXPECT_CALL(bridge_factory_,
85 CreateBridge(gurl_, _, first_position_, last_position_)) 90 CreateBridge(gurl_, _, first_position_, last_position_))
86 .WillOnce(Return(bridge_.get())); 91 .WillOnce(Return(bridge_.get()));
87 EXPECT_CALL(*bridge_, Start(loader_.get())); 92 EXPECT_CALL(*bridge_, Start(loader_.get()));
88 loader_->Start( 93 loader_->Start(
89 NewCallback(this, &BufferedResourceLoaderTest::StartCallback), 94 NewCallback(this, &BufferedResourceLoaderTest::StartCallback),
90 NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback)); 95 NewCallback(this, &BufferedResourceLoaderTest::NetworkCallback));
91 } 96 }
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after
133 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); 138 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge));
134 loader_->Stop(); 139 loader_->Stop();
135 } 140 }
136 141
137 void ReleaseBridge() { 142 void ReleaseBridge() {
138 ignore_result(bridge_.release()); 143 ignore_result(bridge_.release());
139 } 144 }
140 145
141 // Helper method to write to |loader_| from |data_|. 146 // Helper method to write to |loader_| from |data_|.
142 void WriteLoader(int position, int size) { 147 void WriteLoader(int position, int size) {
143 EXPECT_CALL(*this, NetworkCallback()); 148 EXPECT_CALL(*this, NetworkCallback())
149 .RetiresOnSaturation();
144 loader_->OnReceivedData(reinterpret_cast<char*>(data_ + position), size); 150 loader_->OnReceivedData(reinterpret_cast<char*>(data_ + position), size);
145 } 151 }
146 152
147 // Helper method to read from |loader_|. 153 // Helper method to read from |loader_|.
148 void ReadLoader(int64 position, int size, uint8* buffer) { 154 void ReadLoader(int64 position, int size, uint8* buffer) {
149 loader_->Read(position, size, buffer, 155 loader_->Read(position, size, buffer,
150 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback)); 156 NewCallback(this, &BufferedResourceLoaderTest::ReadCallback));
151 } 157 }
152 158
153 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size]. 159 // Verifis that data in buffer[0...size] is equal to data_[pos...pos+size].
154 void VerifyBuffer(uint8* buffer, int pos, int size) { 160 void VerifyBuffer(uint8* buffer, int pos, int size) {
155 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size)); 161 EXPECT_EQ(0, memcmp(buffer, data_ + pos, size));
156 } 162 }
157 163
164 // Helper method to disallow deferring in |loader_|.
165 void DisallowLoaderDefer() {
166 if (loader_->deferred_) {
167 EXPECT_CALL(*bridge_, SetDefersLoading(false));
168 EXPECT_CALL(*this, NetworkCallback());
169 }
170 loader_->SetAllowDefer(false);
171 }
172
173 // Helper method to allow deferring in |loader_|.
174 void AllowLoaderDefer() {
175 loader_->SetAllowDefer(true);
176 }
177
158 MOCK_METHOD1(StartCallback, void(int error)); 178 MOCK_METHOD1(StartCallback, void(int error));
159 MOCK_METHOD1(ReadCallback, void(int error)); 179 MOCK_METHOD1(ReadCallback, void(int error));
160 MOCK_METHOD0(NetworkCallback, void()); 180 MOCK_METHOD0(NetworkCallback, void());
161 181
162 protected: 182 protected:
163 GURL gurl_; 183 GURL gurl_;
164 int64 first_position_; 184 int64 first_position_;
165 int64 last_position_; 185 int64 last_position_;
166 186
167 scoped_refptr<BufferedResourceLoader> loader_; 187 scoped_refptr<BufferedResourceLoader> loader_;
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
355 ReadLoader(10, 10, buffer); 375 ReadLoader(10, 10, buffer);
356 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED)); 376 EXPECT_CALL(*this, ReadCallback(net::ERR_FAILED));
357 EXPECT_CALL(*this, NetworkCallback()); 377 EXPECT_CALL(*this, NetworkCallback());
358 EXPECT_CALL(*bridge_, OnDestroy()) 378 EXPECT_CALL(*bridge_, OnDestroy())
359 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge)); 379 .WillOnce(Invoke(this, &BufferedResourceLoaderTest::ReleaseBridge));
360 URLRequestStatus status; 380 URLRequestStatus status;
361 status.set_status(URLRequestStatus::FAILED); 381 status.set_status(URLRequestStatus::FAILED);
362 loader_->OnCompletedRequest(status, ""); 382 loader_->OnCompletedRequest(status, "");
363 } 383 }
364 384
385 // Tests the logic of caching data to disk when media is paused.
386 TEST_F(BufferedResourceLoaderTest, AllowDefer_NoDataReceived) {
387 Initialize(kHttpUrl, 10, 99);
388 SetLoaderBuffer(10, 20);
389 Start();
390 PartialResponse(10, 99, 100);
391
392 // Start in undeferred state, then disallow defer, then allow defer
393 // without receiving data in between.
394 DisallowLoaderDefer();
395 AllowLoaderDefer();
396 StopWhenLoad();
397 }
398
399 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadSameWindow) {
400 Initialize(kHttpUrl, 10, 99);
401 SetLoaderBuffer(10, 20);
402 Start();
403 PartialResponse(10, 99, 100);
404
405 uint8 buffer[10];
406
407 // Start in undeferred state, disallow defer, receive data but don't shift
408 // buffer window, then allow defer and read.
409 DisallowLoaderDefer();
410 WriteLoader(10, 10);
411 AllowLoaderDefer();
412
413 EXPECT_CALL(*this, ReadCallback(10));
414 ReadLoader(10, 10, buffer);
415 VerifyBuffer(buffer, 10, 10);
416 StopWhenLoad();
417 }
418
419 TEST_F(BufferedResourceLoaderTest, AllowDefer_ReadPastWindow) {
420 Initialize(kHttpUrl, 10, 99);
421 SetLoaderBuffer(10, 20);
422 Start();
423 PartialResponse(10, 99, 100);
424
425 uint8 buffer[10];
426
427 // Not deferred, disallow defer, received data and shift buffer window,
428 // allow defer, then read in area outside of buffer window.
429 DisallowLoaderDefer();
430 WriteLoader(10, 10);
431 WriteLoader(20, 50);
432 AllowLoaderDefer();
433
434 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
435 ReadLoader(10, 10, buffer);
436 StopWhenLoad();
437 }
438
439 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredNoDataReceived) {
440 Initialize(kHttpUrl, 10, 99);
441 SetLoaderBuffer(10, 20);
442 Start();
443 PartialResponse(10, 99, 100);
444
445 uint8 buffer[10];
446
447 // Start in deferred state, then disallow defer, receive no data, and
448 // allow defer and read.
449 EXPECT_CALL(*bridge_, SetDefersLoading(true));
450 EXPECT_CALL(*this, NetworkCallback());
451 WriteLoader(10, 40);
452
453 DisallowLoaderDefer();
454 AllowLoaderDefer();
455
456 EXPECT_CALL(*this, ReadCallback(10));
457 ReadLoader(20, 10, buffer);
458 VerifyBuffer(buffer, 20, 10);
459 StopWhenLoad();
460 }
461
462 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadSameWindow) {
463 Initialize(kHttpUrl, 10, 99);
464 SetLoaderBuffer(10, 20);
465 Start();
466 PartialResponse(10, 99, 100);
467
468 uint8 buffer[10];
469
470 // Start in deferred state, disallow defer, receive data and shift buffer
471 // window, allow defer, and read in a place that's still in the window.
472 EXPECT_CALL(*bridge_, SetDefersLoading(true));
473 EXPECT_CALL(*this, NetworkCallback());
474 WriteLoader(10, 30);
475
476 DisallowLoaderDefer();
477 WriteLoader(40, 5);
478 AllowLoaderDefer();
479
480 EXPECT_CALL(*this, ReadCallback(10));
481 ReadLoader(20, 10, buffer);
482 VerifyBuffer(buffer, 20, 10);
483 StopWhenLoad();
484 }
485
486 TEST_F(BufferedResourceLoaderTest, AllowDefer_DeferredReadPastWindow) {
487 Initialize(kHttpUrl, 10, 99);
488 SetLoaderBuffer(10, 20);
489 Start();
490 PartialResponse(10, 99, 100);
491
492 uint8 buffer[10];
493
494 // Start in deferred state, disallow defer, receive data and shift buffer
495 // window, allow defer, and read outside of the buffer window.
496 EXPECT_CALL(*bridge_, SetDefersLoading(true));
497 EXPECT_CALL(*this, NetworkCallback());
498 WriteLoader(10, 40);
499
500 DisallowLoaderDefer();
501 WriteLoader(50, 20);
502 WriteLoader(70, 40);
503 AllowLoaderDefer();
504
505 EXPECT_CALL(*this, ReadCallback(net::ERR_CACHE_MISS));
506 ReadLoader(20, 5, buffer);
507 StopWhenLoad();
508 }
509
365 // TODO(hclam): add unit test for defer loading. 510 // TODO(hclam): add unit test for defer loading.
366 511
367 class MockBufferedResourceLoader : public BufferedResourceLoader { 512 class MockBufferedResourceLoader : public BufferedResourceLoader {
368 public: 513 public:
369 MockBufferedResourceLoader() : BufferedResourceLoader() { 514 MockBufferedResourceLoader() : BufferedResourceLoader() {
370 } 515 }
371 516
372 MOCK_METHOD2(Start, void(net::CompletionCallback* read_callback, 517 MOCK_METHOD2(Start, void(net::CompletionCallback* read_callback,
373 NetworkEventCallback* network_callback)); 518 NetworkEventCallback* network_callback));
374 MOCK_METHOD0(Stop, void()); 519 MOCK_METHOD0(Stop, void());
(...skipping 405 matching lines...) Expand 10 before | Expand all | Expand 10 after
780 StopDataSource(); 925 StopDataSource();
781 } 926 }
782 927
783 TEST_F(BufferedDataSourceTest, FileHasLoadedState) { 928 TEST_F(BufferedDataSourceTest, FileHasLoadedState) {
784 InitializeDataSource(kFileUrl, net::OK, true, 1024, LOADED); 929 InitializeDataSource(kFileUrl, net::OK, true, 1024, LOADED);
785 ReadDataSourceTimesOut(20, 10); 930 ReadDataSourceTimesOut(20, 10);
786 StopDataSource(); 931 StopDataSource();
787 } 932 }
788 933
789 } // namespace webkit_glue 934 } // namespace webkit_glue
OLDNEW
« no previous file with comments | « webkit/glue/media/buffered_data_source.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698