OLD | NEW |
| (Empty) |
1 // Copyright 2013 The Chromium Authors. All rights reserved. | |
2 // Use of this source code is governed by a BSD-style license that can be | |
3 // found in the LICENSE file. | |
4 | |
5 #include "base/bind.h" | |
6 #include "base/message_loop.h" | |
7 #include "media/base/media_log.h" | |
8 #include "media/base/mock_data_source_host.h" | |
9 #include "media/base/mock_filters.h" | |
10 #include "media/base/test_helpers.h" | |
11 #include "third_party/WebKit/public/platform/WebURLResponse.h" | |
12 #include "third_party/WebKit/public/web/WebView.h" | |
13 #include "webkit/mocks/mock_webframeclient.h" | |
14 #include "webkit/mocks/mock_weburlloader.h" | |
15 #include "webkit/renderer/media/buffered_data_source.h" | |
16 #include "webkit/renderer/media/test_response_generator.h" | |
17 | |
18 using ::testing::_; | |
19 using ::testing::Assign; | |
20 using ::testing::Invoke; | |
21 using ::testing::InSequence; | |
22 using ::testing::NiceMock; | |
23 using ::testing::StrictMock; | |
24 | |
25 using WebKit::WebFrame; | |
26 using WebKit::WebString; | |
27 using WebKit::WebURLLoader; | |
28 using WebKit::WebURLResponse; | |
29 using WebKit::WebView; | |
30 | |
31 using webkit_glue::MockWebFrameClient; | |
32 using webkit_glue::MockWebURLLoader; | |
33 | |
34 namespace webkit_media { | |
35 | |
36 // Overrides CreateResourceLoader() to permit injecting a MockWebURLLoader. | |
37 // Also keeps track of whether said MockWebURLLoader is actively loading. | |
38 class MockBufferedDataSource : public BufferedDataSource { | |
39 public: | |
40 MockBufferedDataSource( | |
41 const scoped_refptr<base::MessageLoopProxy>& message_loop, | |
42 WebFrame* frame) | |
43 : BufferedDataSource(message_loop, frame, new media::MediaLog(), | |
44 base::Bind(&MockBufferedDataSource::set_downloading, | |
45 base::Unretained(this))), | |
46 downloading_(false), | |
47 loading_(false) { | |
48 } | |
49 virtual ~MockBufferedDataSource() {} | |
50 | |
51 MOCK_METHOD2(CreateResourceLoader, BufferedResourceLoader*(int64, int64)); | |
52 BufferedResourceLoader* CreateMockResourceLoader(int64 first_byte_position, | |
53 int64 last_byte_position) { | |
54 CHECK(!loading_) << "Previous resource load wasn't cancelled"; | |
55 | |
56 BufferedResourceLoader* loader = | |
57 BufferedDataSource::CreateResourceLoader(first_byte_position, | |
58 last_byte_position); | |
59 | |
60 // Keep track of active loading state via loadAsynchronously() and cancel(). | |
61 NiceMock<MockWebURLLoader>* url_loader = new NiceMock<MockWebURLLoader>(); | |
62 ON_CALL(*url_loader, loadAsynchronously(_, _)) | |
63 .WillByDefault(Assign(&loading_, true)); | |
64 ON_CALL(*url_loader, cancel()) | |
65 .WillByDefault(Assign(&loading_, false)); | |
66 | |
67 // |test_loader_| will be used when Start() is called. | |
68 loader->test_loader_ = scoped_ptr<WebURLLoader>(url_loader); | |
69 return loader; | |
70 } | |
71 | |
72 bool loading() { return loading_; } | |
73 void set_loading(bool loading) { loading_ = loading; } | |
74 bool downloading() { return downloading_; } | |
75 void set_downloading(bool downloading) { downloading_ = downloading; } | |
76 | |
77 private: | |
78 // Whether the resource is downloading or deferred. | |
79 bool downloading_; | |
80 | |
81 // Whether the resource load has starting loading but yet to been cancelled. | |
82 bool loading_; | |
83 | |
84 DISALLOW_COPY_AND_ASSIGN(MockBufferedDataSource); | |
85 }; | |
86 | |
87 static const int64 kFileSize = 5000000; | |
88 static const int64 kFarReadPosition = 4000000; | |
89 static const int kDataSize = 1024; | |
90 | |
91 static const char kHttpUrl[] = "http://localhost/foo.webm"; | |
92 static const char kFileUrl[] = "file:///tmp/bar.webm"; | |
93 | |
94 class BufferedDataSourceTest : public testing::Test { | |
95 public: | |
96 BufferedDataSourceTest() | |
97 : view_(WebView::create(NULL)) { | |
98 view_->initializeMainFrame(&client_); | |
99 | |
100 data_source_.reset(new MockBufferedDataSource( | |
101 message_loop_.message_loop_proxy(), view_->mainFrame())); | |
102 data_source_->set_host(&host_); | |
103 } | |
104 | |
105 virtual ~BufferedDataSourceTest() { | |
106 view_->close(); | |
107 } | |
108 | |
109 MOCK_METHOD1(OnInitialize, void(bool)); | |
110 | |
111 void Initialize(const char* url, bool expected) { | |
112 GURL gurl(url); | |
113 response_generator_.reset(new TestResponseGenerator(gurl, kFileSize)); | |
114 | |
115 ExpectCreateResourceLoader(); | |
116 EXPECT_CALL(*this, OnInitialize(expected)); | |
117 data_source_->Initialize( | |
118 gurl, BufferedResourceLoader::kUnspecified, base::Bind( | |
119 &BufferedDataSourceTest::OnInitialize, base::Unretained(this))); | |
120 message_loop_.RunUntilIdle(); | |
121 | |
122 bool is_http = gurl.SchemeIs(kHttpScheme) || gurl.SchemeIs(kHttpsScheme); | |
123 EXPECT_EQ(data_source_->downloading(), is_http); | |
124 } | |
125 | |
126 // Helper to initialize tests with a valid 206 response. | |
127 void InitializeWith206Response() { | |
128 Initialize(kHttpUrl, true); | |
129 | |
130 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | |
131 Respond(response_generator_->Generate206(0)); | |
132 } | |
133 | |
134 // Helper to initialize tests with a valid file:// response. | |
135 void InitializeWithFileResponse() { | |
136 Initialize(kFileUrl, true); | |
137 | |
138 EXPECT_CALL(host_, SetTotalBytes(kFileSize)); | |
139 EXPECT_CALL(host_, AddBufferedByteRange(0, kFileSize)); | |
140 Respond(response_generator_->GenerateFileResponse(0)); | |
141 } | |
142 | |
143 // Stops any active loaders and shuts down the data source. | |
144 // | |
145 // This typically happens when the page is closed and for our purposes is | |
146 // appropriate to do when tearing down a test. | |
147 void Stop() { | |
148 if (data_source_->loading()) { | |
149 loader()->didFail(url_loader(), response_generator_->GenerateError()); | |
150 message_loop_.RunUntilIdle(); | |
151 } | |
152 | |
153 data_source_->Stop(media::NewExpectedClosure()); | |
154 message_loop_.RunUntilIdle(); | |
155 } | |
156 | |
157 void ExpectCreateResourceLoader() { | |
158 EXPECT_CALL(*data_source_, CreateResourceLoader(_, _)) | |
159 .WillOnce(Invoke(data_source_.get(), | |
160 &MockBufferedDataSource::CreateMockResourceLoader)); | |
161 message_loop_.RunUntilIdle(); | |
162 } | |
163 | |
164 void Respond(const WebURLResponse& response) { | |
165 loader()->didReceiveResponse(url_loader(), response); | |
166 message_loop_.RunUntilIdle(); | |
167 } | |
168 | |
169 void ReceiveData(int size) { | |
170 scoped_ptr<char[]> data(new char[size]); | |
171 memset(data.get(), 0xA5, size); // Arbitrary non-zero value. | |
172 | |
173 loader()->didReceiveData(url_loader(), data.get(), size, size); | |
174 message_loop_.RunUntilIdle(); | |
175 } | |
176 | |
177 void FinishLoading() { | |
178 data_source_->set_loading(false); | |
179 loader()->didFinishLoading(url_loader(), 0); | |
180 message_loop_.RunUntilIdle(); | |
181 } | |
182 | |
183 MOCK_METHOD1(ReadCallback, void(int size)); | |
184 | |
185 void ReadAt(int64 position) { | |
186 data_source_->Read(position, kDataSize, buffer_, | |
187 base::Bind(&BufferedDataSourceTest::ReadCallback, | |
188 base::Unretained(this))); | |
189 message_loop_.RunUntilIdle(); | |
190 } | |
191 | |
192 // Accessors for private variables on |data_source_|. | |
193 BufferedResourceLoader* loader() { | |
194 return data_source_->loader_.get(); | |
195 } | |
196 WebURLLoader* url_loader() { | |
197 return loader()->active_loader_->loader_.get(); | |
198 } | |
199 | |
200 Preload preload() { return data_source_->preload_; } | |
201 BufferedResourceLoader::DeferStrategy defer_strategy() { | |
202 return loader()->defer_strategy_; | |
203 } | |
204 int data_source_bitrate() { return data_source_->bitrate_; } | |
205 int data_source_playback_rate() { return data_source_->playback_rate_; } | |
206 int loader_bitrate() { return loader()->bitrate_; } | |
207 int loader_playback_rate() { return loader()->playback_rate_; } | |
208 | |
209 scoped_ptr<MockBufferedDataSource> data_source_; | |
210 | |
211 scoped_ptr<TestResponseGenerator> response_generator_; | |
212 MockWebFrameClient client_; | |
213 WebView* view_; | |
214 | |
215 StrictMock<media::MockDataSourceHost> host_; | |
216 base::MessageLoop message_loop_; | |
217 | |
218 private: | |
219 // Used for calling BufferedDataSource::Read(). | |
220 uint8 buffer_[kDataSize]; | |
221 | |
222 DISALLOW_COPY_AND_ASSIGN(BufferedDataSourceTest); | |
223 }; | |
224 | |
225 TEST_F(BufferedDataSourceTest, Range_Supported) { | |
226 Initialize(kHttpUrl, true); | |
227 | |
228 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | |
229 Respond(response_generator_->Generate206(0)); | |
230 | |
231 EXPECT_TRUE(data_source_->loading()); | |
232 EXPECT_FALSE(data_source_->IsStreaming()); | |
233 Stop(); | |
234 } | |
235 | |
236 TEST_F(BufferedDataSourceTest, Range_InstanceSizeUnknown) { | |
237 Initialize(kHttpUrl, true); | |
238 | |
239 Respond(response_generator_->Generate206( | |
240 0, TestResponseGenerator::kNoContentRangeInstanceSize)); | |
241 | |
242 EXPECT_TRUE(data_source_->loading()); | |
243 EXPECT_TRUE(data_source_->IsStreaming()); | |
244 Stop(); | |
245 } | |
246 | |
247 TEST_F(BufferedDataSourceTest, Range_NotFound) { | |
248 Initialize(kHttpUrl, false); | |
249 Respond(response_generator_->Generate404()); | |
250 | |
251 EXPECT_FALSE(data_source_->loading()); | |
252 Stop(); | |
253 } | |
254 | |
255 TEST_F(BufferedDataSourceTest, Range_NotSupported) { | |
256 Initialize(kHttpUrl, true); | |
257 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | |
258 Respond(response_generator_->Generate200()); | |
259 | |
260 EXPECT_TRUE(data_source_->loading()); | |
261 EXPECT_TRUE(data_source_->IsStreaming()); | |
262 Stop(); | |
263 } | |
264 | |
265 // Special carve-out for Apache versions that choose to return a 200 for | |
266 // Range:0- ("because it's more efficient" than a 206) | |
267 TEST_F(BufferedDataSourceTest, Range_SupportedButReturned200) { | |
268 Initialize(kHttpUrl, true); | |
269 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | |
270 WebURLResponse response = response_generator_->Generate200(); | |
271 response.setHTTPHeaderField(WebString::fromUTF8("Accept-Ranges"), | |
272 WebString::fromUTF8("bytes")); | |
273 Respond(response); | |
274 | |
275 EXPECT_TRUE(data_source_->loading()); | |
276 EXPECT_FALSE(data_source_->IsStreaming()); | |
277 Stop(); | |
278 } | |
279 | |
280 TEST_F(BufferedDataSourceTest, Range_MissingContentRange) { | |
281 Initialize(kHttpUrl, false); | |
282 Respond(response_generator_->Generate206( | |
283 0, TestResponseGenerator::kNoContentRange)); | |
284 | |
285 EXPECT_FALSE(data_source_->loading()); | |
286 Stop(); | |
287 } | |
288 | |
289 TEST_F(BufferedDataSourceTest, Range_MissingContentLength) { | |
290 Initialize(kHttpUrl, true); | |
291 | |
292 // It'll manage without a Content-Length response. | |
293 EXPECT_CALL(host_, SetTotalBytes(response_generator_->content_length())); | |
294 Respond(response_generator_->Generate206( | |
295 0, TestResponseGenerator::kNoContentLength)); | |
296 | |
297 EXPECT_TRUE(data_source_->loading()); | |
298 EXPECT_FALSE(data_source_->IsStreaming()); | |
299 Stop(); | |
300 } | |
301 | |
302 TEST_F(BufferedDataSourceTest, Range_WrongContentRange) { | |
303 Initialize(kHttpUrl, false); | |
304 | |
305 // Now it's done and will fail. | |
306 Respond(response_generator_->Generate206(1337)); | |
307 | |
308 EXPECT_FALSE(data_source_->loading()); | |
309 Stop(); | |
310 } | |
311 | |
312 // Test the case where the initial response from the server indicates that | |
313 // Range requests are supported, but a later request prove otherwise. | |
314 TEST_F(BufferedDataSourceTest, Range_ServerLied) { | |
315 InitializeWith206Response(); | |
316 | |
317 // Read causing a new request to be made -- we'll expect it to error. | |
318 ExpectCreateResourceLoader(); | |
319 ReadAt(kFarReadPosition); | |
320 | |
321 // Return a 200 in response to a range request. | |
322 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
323 Respond(response_generator_->Generate200()); | |
324 | |
325 EXPECT_FALSE(data_source_->loading()); | |
326 Stop(); | |
327 } | |
328 | |
329 TEST_F(BufferedDataSourceTest, Http_AbortWhileReading) { | |
330 InitializeWith206Response(); | |
331 | |
332 // Make sure there's a pending read -- we'll expect it to error. | |
333 ReadAt(0); | |
334 | |
335 // Abort!!! | |
336 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
337 data_source_->Abort(); | |
338 message_loop_.RunUntilIdle(); | |
339 | |
340 EXPECT_FALSE(data_source_->loading()); | |
341 Stop(); | |
342 } | |
343 | |
344 TEST_F(BufferedDataSourceTest, File_AbortWhileReading) { | |
345 InitializeWithFileResponse(); | |
346 | |
347 // Make sure there's a pending read -- we'll expect it to error. | |
348 ReadAt(0); | |
349 | |
350 // Abort!!! | |
351 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
352 data_source_->Abort(); | |
353 message_loop_.RunUntilIdle(); | |
354 | |
355 EXPECT_FALSE(data_source_->loading()); | |
356 Stop(); | |
357 } | |
358 | |
359 TEST_F(BufferedDataSourceTest, Http_Retry) { | |
360 InitializeWith206Response(); | |
361 | |
362 // Read to advance our position. | |
363 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
364 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
365 ReadAt(0); | |
366 ReceiveData(kDataSize); | |
367 | |
368 // Issue a pending read but terminate the connection to force a retry. | |
369 ReadAt(kDataSize); | |
370 ExpectCreateResourceLoader(); | |
371 FinishLoading(); | |
372 Respond(response_generator_->Generate206(kDataSize)); | |
373 | |
374 // Complete the read. | |
375 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
376 EXPECT_CALL(host_, AddBufferedByteRange(kDataSize, (kDataSize * 2) - 1)); | |
377 ReceiveData(kDataSize); | |
378 | |
379 EXPECT_TRUE(data_source_->loading()); | |
380 Stop(); | |
381 } | |
382 | |
383 TEST_F(BufferedDataSourceTest, File_Retry) { | |
384 InitializeWithFileResponse(); | |
385 | |
386 // Read to advance our position. | |
387 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
388 ReadAt(0); | |
389 ReceiveData(kDataSize); | |
390 | |
391 // Issue a pending read but terminate the connection to force a retry. | |
392 ReadAt(kDataSize); | |
393 ExpectCreateResourceLoader(); | |
394 FinishLoading(); | |
395 Respond(response_generator_->GenerateFileResponse(kDataSize)); | |
396 | |
397 // Complete the read. | |
398 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
399 ReceiveData(kDataSize); | |
400 | |
401 EXPECT_TRUE(data_source_->loading()); | |
402 Stop(); | |
403 } | |
404 | |
405 TEST_F(BufferedDataSourceTest, Http_TooManyRetries) { | |
406 InitializeWith206Response(); | |
407 | |
408 // Make sure there's a pending read -- we'll expect it to error. | |
409 ReadAt(0); | |
410 | |
411 // It'll try three times. | |
412 ExpectCreateResourceLoader(); | |
413 FinishLoading(); | |
414 Respond(response_generator_->Generate206(0)); | |
415 | |
416 ExpectCreateResourceLoader(); | |
417 FinishLoading(); | |
418 Respond(response_generator_->Generate206(0)); | |
419 | |
420 ExpectCreateResourceLoader(); | |
421 FinishLoading(); | |
422 Respond(response_generator_->Generate206(0)); | |
423 | |
424 // It'll error after this. | |
425 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
426 FinishLoading(); | |
427 | |
428 EXPECT_FALSE(data_source_->loading()); | |
429 Stop(); | |
430 } | |
431 | |
432 TEST_F(BufferedDataSourceTest, File_TooManyRetries) { | |
433 InitializeWithFileResponse(); | |
434 | |
435 // Make sure there's a pending read -- we'll expect it to error. | |
436 ReadAt(0); | |
437 | |
438 // It'll try three times. | |
439 ExpectCreateResourceLoader(); | |
440 FinishLoading(); | |
441 Respond(response_generator_->GenerateFileResponse(0)); | |
442 | |
443 ExpectCreateResourceLoader(); | |
444 FinishLoading(); | |
445 Respond(response_generator_->GenerateFileResponse(0)); | |
446 | |
447 ExpectCreateResourceLoader(); | |
448 FinishLoading(); | |
449 Respond(response_generator_->GenerateFileResponse(0)); | |
450 | |
451 // It'll error after this. | |
452 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
453 FinishLoading(); | |
454 | |
455 EXPECT_FALSE(data_source_->loading()); | |
456 Stop(); | |
457 } | |
458 | |
459 TEST_F(BufferedDataSourceTest, File_InstanceSizeUnknown) { | |
460 Initialize(kFileUrl, false); | |
461 EXPECT_FALSE(data_source_->downloading()); | |
462 | |
463 Respond(response_generator_->GenerateFileResponse(-1)); | |
464 | |
465 EXPECT_FALSE(data_source_->loading()); | |
466 Stop(); | |
467 } | |
468 | |
469 TEST_F(BufferedDataSourceTest, File_Successful) { | |
470 InitializeWithFileResponse(); | |
471 | |
472 EXPECT_TRUE(data_source_->loading()); | |
473 EXPECT_FALSE(data_source_->IsStreaming()); | |
474 Stop(); | |
475 } | |
476 | |
477 static void SetTrue(bool* value) { | |
478 *value = true; | |
479 } | |
480 | |
481 // This test makes sure that Stop() does not require a task to run on | |
482 // |message_loop_| before it calls its callback. This prevents accidental | |
483 // introduction of a pipeline teardown deadlock. The pipeline owner blocks | |
484 // the render message loop while waiting for Stop() to complete. Since this | |
485 // object runs on the render message loop, Stop() will not complete if it | |
486 // requires a task to run on the the message loop that is being blocked. | |
487 TEST_F(BufferedDataSourceTest, StopDoesNotUseMessageLoopForCallback) { | |
488 InitializeWith206Response(); | |
489 | |
490 // Stop() the data source, using a callback that lets us verify that it was | |
491 // called before Stop() returns. This is to make sure that the callback does | |
492 // not require |message_loop_| to execute tasks before being called. | |
493 bool stop_done_called = false; | |
494 EXPECT_TRUE(data_source_->loading()); | |
495 data_source_->Stop(base::Bind(&SetTrue, &stop_done_called)); | |
496 | |
497 // Verify that the callback was called inside the Stop() call. | |
498 EXPECT_TRUE(stop_done_called); | |
499 message_loop_.RunUntilIdle(); | |
500 } | |
501 | |
502 TEST_F(BufferedDataSourceTest, StopDuringRead) { | |
503 InitializeWith206Response(); | |
504 | |
505 uint8 buffer[256]; | |
506 data_source_->Read(0, arraysize(buffer), buffer, base::Bind( | |
507 &BufferedDataSourceTest::ReadCallback, base::Unretained(this))); | |
508 | |
509 // The outstanding read should fail before the stop callback runs. | |
510 { | |
511 InSequence s; | |
512 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
513 data_source_->Stop(media::NewExpectedClosure()); | |
514 } | |
515 message_loop_.RunUntilIdle(); | |
516 } | |
517 | |
518 TEST_F(BufferedDataSourceTest, DefaultValues) { | |
519 InitializeWith206Response(); | |
520 | |
521 // Ensure we have sane values for default loading scenario. | |
522 EXPECT_EQ(AUTO, preload()); | |
523 EXPECT_EQ(BufferedResourceLoader::kCapacityDefer, defer_strategy()); | |
524 | |
525 EXPECT_EQ(0, data_source_bitrate()); | |
526 EXPECT_EQ(0.0f, data_source_playback_rate()); | |
527 EXPECT_EQ(0, loader_bitrate()); | |
528 EXPECT_EQ(0.0f, loader_playback_rate()); | |
529 | |
530 EXPECT_TRUE(data_source_->loading()); | |
531 Stop(); | |
532 } | |
533 | |
534 TEST_F(BufferedDataSourceTest, SetBitrate) { | |
535 InitializeWith206Response(); | |
536 | |
537 data_source_->SetBitrate(1234); | |
538 message_loop_.RunUntilIdle(); | |
539 EXPECT_EQ(1234, data_source_bitrate()); | |
540 EXPECT_EQ(1234, loader_bitrate()); | |
541 | |
542 // Read so far ahead to cause the loader to get recreated. | |
543 BufferedResourceLoader* old_loader = loader(); | |
544 ExpectCreateResourceLoader(); | |
545 ReadAt(kFarReadPosition); | |
546 Respond(response_generator_->Generate206(kFarReadPosition)); | |
547 | |
548 // Verify loader changed but still has same bitrate. | |
549 EXPECT_NE(old_loader, loader()); | |
550 EXPECT_EQ(1234, loader_bitrate()); | |
551 | |
552 EXPECT_TRUE(data_source_->loading()); | |
553 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
554 Stop(); | |
555 } | |
556 | |
557 TEST_F(BufferedDataSourceTest, SetPlaybackRate) { | |
558 InitializeWith206Response(); | |
559 | |
560 data_source_->SetPlaybackRate(2.0f); | |
561 message_loop_.RunUntilIdle(); | |
562 EXPECT_EQ(2.0f, data_source_playback_rate()); | |
563 EXPECT_EQ(2.0f, loader_playback_rate()); | |
564 | |
565 // Read so far ahead to cause the loader to get recreated. | |
566 BufferedResourceLoader* old_loader = loader(); | |
567 ExpectCreateResourceLoader(); | |
568 ReadAt(kFarReadPosition); | |
569 Respond(response_generator_->Generate206(kFarReadPosition)); | |
570 | |
571 // Verify loader changed but still has same playback rate. | |
572 EXPECT_NE(old_loader, loader()); | |
573 | |
574 EXPECT_TRUE(data_source_->loading()); | |
575 EXPECT_CALL(*this, ReadCallback(media::DataSource::kReadError)); | |
576 Stop(); | |
577 } | |
578 | |
579 TEST_F(BufferedDataSourceTest, Http_Read) { | |
580 InitializeWith206Response(); | |
581 | |
582 ReadAt(0); | |
583 | |
584 // Receive first half of the read. | |
585 EXPECT_CALL(host_, AddBufferedByteRange(0, (kDataSize / 2) - 1)); | |
586 ReceiveData(kDataSize / 2); | |
587 | |
588 // Receive last half of the read. | |
589 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
590 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
591 ReceiveData(kDataSize / 2); | |
592 | |
593 EXPECT_TRUE(data_source_->downloading()); | |
594 Stop(); | |
595 } | |
596 | |
597 TEST_F(BufferedDataSourceTest, Http_Read_Seek) { | |
598 InitializeWith206Response(); | |
599 | |
600 // Read a bit from the beginning. | |
601 ReadAt(0); | |
602 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
603 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize - 1)); | |
604 ReceiveData(kDataSize); | |
605 | |
606 // Simulate a seek by reading a bit beyond kDataSize. | |
607 ReadAt(kDataSize * 2); | |
608 | |
609 // We receive data leading up to but not including our read. | |
610 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 2 - 1)); | |
611 ReceiveData(kDataSize); | |
612 | |
613 // We now receive the rest of the data for our read. | |
614 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
615 EXPECT_CALL(host_, AddBufferedByteRange(0, kDataSize * 3 - 1)); | |
616 ReceiveData(kDataSize); | |
617 | |
618 EXPECT_TRUE(data_source_->downloading()); | |
619 Stop(); | |
620 } | |
621 | |
622 TEST_F(BufferedDataSourceTest, File_Read) { | |
623 InitializeWithFileResponse(); | |
624 | |
625 ReadAt(0); | |
626 | |
627 // Receive first half of the read but no buffering update. | |
628 ReceiveData(kDataSize / 2); | |
629 | |
630 // Receive last half of the read but no buffering update. | |
631 EXPECT_CALL(*this, ReadCallback(kDataSize)); | |
632 ReceiveData(kDataSize / 2); | |
633 | |
634 Stop(); | |
635 } | |
636 | |
637 TEST_F(BufferedDataSourceTest, Http_FinishLoading) { | |
638 InitializeWith206Response(); | |
639 | |
640 EXPECT_TRUE(data_source_->downloading()); | |
641 FinishLoading(); | |
642 EXPECT_FALSE(data_source_->downloading()); | |
643 | |
644 Stop(); | |
645 } | |
646 | |
647 TEST_F(BufferedDataSourceTest, File_FinishLoading) { | |
648 InitializeWithFileResponse(); | |
649 | |
650 EXPECT_FALSE(data_source_->downloading()); | |
651 FinishLoading(); | |
652 EXPECT_FALSE(data_source_->downloading()); | |
653 | |
654 Stop(); | |
655 } | |
656 | |
657 } // namespace webkit_media | |
OLD | NEW |