| OLD | NEW |
| 1 // Copyright (c) 2010 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 "media/base/composite_filter.h" | 5 #include "media/base/composite_filter.h" |
| 6 #include "media/base/mock_callback.h" |
| 6 #include "media/base/mock_filter_host.h" | 7 #include "media/base/mock_filter_host.h" |
| 7 #include "media/base/mock_filters.h" | 8 #include "media/base/mock_filters.h" |
| 8 #include "testing/gtest/include/gtest/gtest.h" | 9 #include "testing/gtest/include/gtest/gtest.h" |
| 9 | 10 |
| 10 using ::testing::_; | 11 using ::testing::_; |
| 11 using ::testing::InSequence; | 12 using ::testing::InSequence; |
| 12 using ::testing::Return; | 13 using ::testing::Return; |
| 13 using ::testing::SaveArg; | 14 using ::testing::SaveArg; |
| 14 using ::testing::StrictMock; | 15 using ::testing::StrictMock; |
| 15 | 16 |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 202 case SEEK: | 203 case SEEK: |
| 203 filter->Seek(seek_time, callback); | 204 filter->Seek(seek_time, callback); |
| 204 break; | 205 break; |
| 205 }; | 206 }; |
| 206 } | 207 } |
| 207 | 208 |
| 208 void CompositeFilterTest::ExpectSuccess(MethodToCall method_to_call, | 209 void CompositeFilterTest::ExpectSuccess(MethodToCall method_to_call, |
| 209 base::TimeDelta seek_time) { | 210 base::TimeDelta seek_time) { |
| 210 InSequence seq; | 211 InSequence seq; |
| 211 | 212 |
| 212 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 213 new StrictMock<MockFilterCallback>(false)); | |
| 214 | |
| 215 bool is_parallel_call = (method_to_call == FLUSH); | 213 bool is_parallel_call = (method_to_call == FLUSH); |
| 216 | 214 |
| 217 ExpectFilterCall(method_to_call, filter_1_.get(), seek_time); | 215 ExpectFilterCall(method_to_call, filter_1_.get(), seek_time); |
| 218 | 216 |
| 219 if (is_parallel_call) { | 217 if (is_parallel_call) { |
| 220 ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); | 218 ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); |
| 221 } | 219 } |
| 222 | 220 |
| 223 // Make method call on the composite. | 221 // Make method call on the composite. |
| 224 DoFilterCall(method_to_call, composite_.get(), seek_time, | 222 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 225 mock_callback->NewCallback()); | 223 DoFilterCall(method_to_call, composite_.get(), seek_time, callback); |
| 226 | 224 |
| 227 if (is_parallel_call) { | 225 if (is_parallel_call) { |
| 228 // Make sure both filters have their callbacks set. | 226 // Make sure both filters have their callbacks set. |
| 229 EXPECT_TRUE(filter_1_callback_ != NULL); | 227 EXPECT_TRUE(filter_1_callback_ != NULL); |
| 230 EXPECT_TRUE(filter_2_callback_ != NULL); | 228 EXPECT_TRUE(filter_2_callback_ != NULL); |
| 231 | 229 |
| 232 RunFilter1Callback(); | 230 RunFilter1Callback(); |
| 233 } else { | 231 } else { |
| 234 // Make sure that only |filter_1_| has its callback set. | 232 // Make sure that only |filter_1_| has its callback set. |
| 235 EXPECT_TRUE(filter_1_callback_ != NULL); | 233 EXPECT_TRUE(filter_1_callback_ != NULL); |
| 236 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 234 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 237 | 235 |
| 238 ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); | 236 ExpectFilterCall(method_to_call, filter_2_.get(), seek_time); |
| 239 | 237 |
| 240 RunFilter1Callback(); | 238 RunFilter1Callback(); |
| 241 | 239 |
| 242 // Verify that |filter_2_| was called by checking the callback pointer. | 240 // Verify that |filter_2_| was called by checking the callback pointer. |
| 243 EXPECT_TRUE(filter_2_callback_ != NULL); | 241 EXPECT_TRUE(filter_2_callback_ != NULL); |
| 244 } | 242 } |
| 245 | 243 |
| 246 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 244 EXPECT_CALL(*callback, RunWithParams(_)); |
| 245 EXPECT_CALL(*callback, Destructor()); |
| 247 | 246 |
| 248 RunFilter2Callback(); | 247 RunFilter2Callback(); |
| 249 } | 248 } |
| 250 | 249 |
| 251 void CompositeFilterTest::DoPlay() { | 250 void CompositeFilterTest::DoPlay() { |
| 252 ExpectSuccess(PLAY); | 251 ExpectSuccess(PLAY); |
| 253 } | 252 } |
| 254 | 253 |
| 255 void CompositeFilterTest::DoPause() { | 254 void CompositeFilterTest::DoPause() { |
| 256 ExpectSuccess(PAUSE); | 255 ExpectSuccess(PAUSE); |
| 257 } | 256 } |
| 258 | 257 |
| 259 void CompositeFilterTest::DoFlush() { | 258 void CompositeFilterTest::DoFlush() { |
| 260 ExpectSuccess(FLUSH); | 259 ExpectSuccess(FLUSH); |
| 261 } | 260 } |
| 262 | 261 |
| 263 void CompositeFilterTest::DoStop() { | 262 void CompositeFilterTest::DoStop() { |
| 264 ExpectSuccess(STOP); | 263 ExpectSuccess(STOP); |
| 265 } | 264 } |
| 266 | 265 |
| 267 void CompositeFilterTest::DoSeek(base::TimeDelta time) { | 266 void CompositeFilterTest::DoSeek(base::TimeDelta time) { |
| 268 ExpectSuccess(SEEK, time); | 267 ExpectSuccess(SEEK, time); |
| 269 } | 268 } |
| 270 | 269 |
| 271 void CompositeFilterTest::ExpectInvalidStateFail(MethodToCall method_to_call, | 270 void CompositeFilterTest::ExpectInvalidStateFail(MethodToCall method_to_call, |
| 272 base::TimeDelta seek_time) { | 271 base::TimeDelta seek_time) { |
| 273 InSequence seq; | 272 InSequence seq; |
| 274 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 275 new StrictMock<MockFilterCallback>(false)); | |
| 276 | 273 |
| 277 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_INVALID_STATE)) | 274 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_INVALID_STATE)) |
| 278 .WillOnce(Return()); | 275 .WillOnce(Return()); |
| 279 EXPECT_CALL(*mock_callback, OnFilterCallback()); | |
| 280 | 276 |
| 281 DoFilterCall(method_to_call, composite_, seek_time, | 277 DoFilterCall(method_to_call, composite_, seek_time, NewExpectedCallback()); |
| 282 mock_callback->NewCallback()); | |
| 283 | 278 |
| 284 // Make sure that neither of the filters were called by | 279 // Make sure that neither of the filters were called by |
| 285 // verifying that the callback pointers weren't set. | 280 // verifying that the callback pointers weren't set. |
| 286 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); | 281 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); |
| 287 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 282 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 288 } | 283 } |
| 289 | 284 |
| 290 void CompositeFilterTest::RunFilter1Callback() { | 285 void CompositeFilterTest::RunFilter1Callback() { |
| 291 EXPECT_TRUE(filter_1_callback_ != NULL); | 286 EXPECT_TRUE(filter_1_callback_ != NULL); |
| 292 FilterCallback* callback = filter_1_callback_; | 287 FilterCallback* callback = filter_1_callback_; |
| (...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 357 | 352 |
| 358 TEST_F(CompositeFilterTest, TestPlay) { | 353 TEST_F(CompositeFilterTest, TestPlay) { |
| 359 InSequence sequence; | 354 InSequence sequence; |
| 360 | 355 |
| 361 SetupAndAdd2Filters(); | 356 SetupAndAdd2Filters(); |
| 362 | 357 |
| 363 // Verify successful call to Play(). | 358 // Verify successful call to Play(). |
| 364 DoPlay(); | 359 DoPlay(); |
| 365 | 360 |
| 366 // At this point we are now in the kPlaying state. | 361 // At this point we are now in the kPlaying state. |
| 367 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 368 new StrictMock<MockFilterCallback>(false)); | |
| 369 | 362 |
| 370 // Try calling Play() again to make sure that we simply get a callback. | 363 // Try calling Play() again to make sure that we simply get a callback. |
| 371 // We are already in the Play() state so there is no point calling the | 364 // We are already in the Play() state so there is no point calling the |
| 372 // filters. | 365 // filters. |
| 373 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 366 composite_->Play(NewExpectedCallback()); |
| 374 | |
| 375 composite_->Play(mock_callback->NewCallback()); | |
| 376 | 367 |
| 377 // Verify that neither of the filter callbacks were set. | 368 // Verify that neither of the filter callbacks were set. |
| 378 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); | 369 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); |
| 379 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 370 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 380 | 371 |
| 381 // Stop playback. | 372 // Stop playback. |
| 382 DoStop(); | 373 DoStop(); |
| 383 | 374 |
| 384 // At this point we should be in the kStopped state. | 375 // At this point we should be in the kStopped state. |
| 385 | 376 |
| 386 // Try calling Stop() again to make sure neither filter is called. | 377 // Try calling Stop() again to make sure neither filter is called. |
| 387 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 378 composite_->Stop(NewExpectedCallback()); |
| 388 | |
| 389 composite_->Stop(mock_callback->NewCallback()); | |
| 390 | 379 |
| 391 // Verify that neither of the filter callbacks were set. | 380 // Verify that neither of the filter callbacks were set. |
| 392 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); | 381 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); |
| 393 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 382 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 394 | 383 |
| 395 // Try calling Play() again to make sure we get an error. | 384 // Try calling Play() again to make sure we get an error. |
| 396 ExpectInvalidStateFail(PLAY); | 385 ExpectInvalidStateFail(PLAY); |
| 397 } | 386 } |
| 398 | 387 |
| 399 // Test errors in the middle of a serial call sequence like Play(). | 388 // Test errors in the middle of a serial call sequence like Play(). |
| 400 TEST_F(CompositeFilterTest, TestPlayErrors) { | 389 TEST_F(CompositeFilterTest, TestPlayErrors) { |
| 401 InSequence sequence; | 390 InSequence sequence; |
| 402 | 391 |
| 403 SetupAndAdd2Filters(); | 392 SetupAndAdd2Filters(); |
| 404 | 393 |
| 405 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 406 new StrictMock<MockFilterCallback>(false)); | |
| 407 | |
| 408 EXPECT_CALL(*filter_1_, Play(_)); | 394 EXPECT_CALL(*filter_1_, Play(_)); |
| 409 | 395 |
| 410 // Call Play() on the composite. | 396 // Call Play() on the composite. |
| 411 composite_->Play(mock_callback->NewCallback()); | 397 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 398 composite_->Play(callback); |
| 412 | 399 |
| 413 EXPECT_CALL(*filter_2_, Play(_)); | 400 EXPECT_CALL(*filter_2_, Play(_)); |
| 414 | 401 |
| 415 // Run callback to indicate that |filter_1_|'s Play() has completed. | 402 // Run callback to indicate that |filter_1_|'s Play() has completed. |
| 416 RunFilter1Callback(); | 403 RunFilter1Callback(); |
| 417 | 404 |
| 418 // At this point Play() has been called on |filter_2_|. Simulate an | 405 // At this point Play() has been called on |filter_2_|. Simulate an |
| 419 // error by calling SetError() on its FilterHost interface. | 406 // error by calling SetError() on its FilterHost interface. |
| 420 filter_2_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); | 407 filter_2_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); |
| 421 | 408 |
| 422 // Expect error to be reported and "play done" callback to be called. | 409 // Expect error to be reported and "play done" callback to be called. |
| 423 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); | 410 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); |
| 424 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 411 EXPECT_CALL(*callback, RunWithParams(_)); |
| 412 EXPECT_CALL(*callback, Destructor()); |
| 425 | 413 |
| 426 // Run callback to indicate that |filter_2_|'s Play() has completed. | 414 // Run callback to indicate that |filter_2_|'s Play() has completed. |
| 427 RunFilter2Callback(); | 415 RunFilter2Callback(); |
| 428 | 416 |
| 429 // Verify that Play/Pause/Flush/Seek fail now that an error occured. | 417 // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
| 430 ExpectInvalidStateFail(PLAY); | 418 ExpectInvalidStateFail(PLAY); |
| 431 ExpectInvalidStateFail(PAUSE); | 419 ExpectInvalidStateFail(PAUSE); |
| 432 ExpectInvalidStateFail(FLUSH); | 420 ExpectInvalidStateFail(FLUSH); |
| 433 ExpectInvalidStateFail(SEEK); | 421 ExpectInvalidStateFail(SEEK); |
| 434 | 422 |
| 435 // Make sure you can still Stop(). | 423 // Make sure you can still Stop(). |
| 436 DoStop(); | 424 DoStop(); |
| 437 } | 425 } |
| 438 | 426 |
| 439 TEST_F(CompositeFilterTest, TestPause) { | 427 TEST_F(CompositeFilterTest, TestPause) { |
| 440 InSequence sequence; | 428 InSequence sequence; |
| 441 | 429 |
| 442 SetupAndAdd2Filters(); | 430 SetupAndAdd2Filters(); |
| 443 | 431 |
| 444 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 445 new StrictMock<MockFilterCallback>(false)); | |
| 446 | |
| 447 // Try calling Pause() to make sure we get an error because we aren't in | 432 // Try calling Pause() to make sure we get an error because we aren't in |
| 448 // the playing state. | 433 // the playing state. |
| 449 ExpectInvalidStateFail(PAUSE); | 434 ExpectInvalidStateFail(PAUSE); |
| 450 | 435 |
| 451 // Transition to playing state. | 436 // Transition to playing state. |
| 452 DoPlay(); | 437 DoPlay(); |
| 453 | 438 |
| 454 // Issue a successful Pause(). | 439 // Issue a successful Pause(). |
| 455 DoPause(); | 440 DoPause(); |
| 456 | 441 |
| 457 // At this point we are paused. | 442 // At this point we are paused. |
| 458 | 443 |
| 459 // Try calling Pause() again to make sure that the filters aren't called | 444 // Try calling Pause() again to make sure that the filters aren't called |
| 460 // because we are already in the paused state. | 445 // because we are already in the paused state. |
| 461 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 446 composite_->Pause(NewExpectedCallback()); |
| 462 | |
| 463 composite_->Pause(mock_callback->NewCallback()); | |
| 464 | 447 |
| 465 // Verify that neither of the filter callbacks were set. | 448 // Verify that neither of the filter callbacks were set. |
| 466 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); | 449 EXPECT_EQ((FilterCallback*)NULL, filter_1_callback_); |
| 467 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 450 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 468 | 451 |
| 469 // Verify that we can transition pack to the play state. | 452 // Verify that we can transition pack to the play state. |
| 470 DoPlay(); | 453 DoPlay(); |
| 471 | 454 |
| 472 // Go back to the pause state. | 455 // Go back to the pause state. |
| 473 DoPause(); | 456 DoPause(); |
| 474 | 457 |
| 475 // Transition to the stop state. | 458 // Transition to the stop state. |
| 476 DoStop(); | 459 DoStop(); |
| 477 | 460 |
| 478 // Try calling Pause() to make sure we get an error because we aren't in | 461 // Try calling Pause() to make sure we get an error because we aren't in |
| 479 // the playing state. | 462 // the playing state. |
| 480 ExpectInvalidStateFail(PAUSE); | 463 ExpectInvalidStateFail(PAUSE); |
| 481 } | 464 } |
| 482 | 465 |
| 483 // Test errors in the middle of a serial call sequence like Pause(). | 466 // Test errors in the middle of a serial call sequence like Pause(). |
| 484 TEST_F(CompositeFilterTest, TestPauseErrors) { | 467 TEST_F(CompositeFilterTest, TestPauseErrors) { |
| 485 InSequence sequence; | 468 InSequence sequence; |
| 486 | 469 |
| 487 SetupAndAdd2Filters(); | 470 SetupAndAdd2Filters(); |
| 488 | 471 |
| 489 DoPlay(); | 472 DoPlay(); |
| 490 | 473 |
| 491 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 492 new StrictMock<MockFilterCallback>(false)); | |
| 493 | |
| 494 EXPECT_CALL(*filter_1_, Pause(_)); | 474 EXPECT_CALL(*filter_1_, Pause(_)); |
| 495 | 475 |
| 496 // Call Pause() on the composite. | 476 // Call Pause() on the composite. |
| 497 composite_->Pause(mock_callback->NewCallback()); | 477 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 478 composite_->Pause(callback); |
| 498 | 479 |
| 499 // Simulate an error by calling SetError() on |filter_1_|'s FilterHost | 480 // Simulate an error by calling SetError() on |filter_1_|'s FilterHost |
| 500 // interface. | 481 // interface. |
| 501 filter_1_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); | 482 filter_1_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); |
| 502 | 483 |
| 503 // Expect error to be reported and "pause done" callback to be called. | 484 // Expect error to be reported and "pause done" callback to be called. |
| 504 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); | 485 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); |
| 505 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 486 EXPECT_CALL(*callback, RunWithParams(_)); |
| 487 EXPECT_CALL(*callback, Destructor()); |
| 506 | 488 |
| 507 RunFilter1Callback(); | 489 RunFilter1Callback(); |
| 508 | 490 |
| 509 // Make sure |filter_2_callback_| was not set. | 491 // Make sure |filter_2_callback_| was not set. |
| 510 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); | 492 EXPECT_EQ((FilterCallback*)NULL, filter_2_callback_); |
| 511 | 493 |
| 512 // Verify that Play/Pause/Flush/Seek fail now that an error occured. | 494 // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
| 513 ExpectInvalidStateFail(PLAY); | 495 ExpectInvalidStateFail(PLAY); |
| 514 ExpectInvalidStateFail(PAUSE); | 496 ExpectInvalidStateFail(PAUSE); |
| 515 ExpectInvalidStateFail(FLUSH); | 497 ExpectInvalidStateFail(FLUSH); |
| 516 ExpectInvalidStateFail(SEEK); | 498 ExpectInvalidStateFail(SEEK); |
| 517 | 499 |
| 518 // Make sure you can still Stop(). | 500 // Make sure you can still Stop(). |
| 519 DoStop(); | 501 DoStop(); |
| 520 } | 502 } |
| 521 | 503 |
| 522 TEST_F(CompositeFilterTest, TestFlush) { | 504 TEST_F(CompositeFilterTest, TestFlush) { |
| 523 InSequence sequence; | 505 InSequence sequence; |
| 524 | 506 |
| 525 SetupAndAdd2Filters(); | 507 SetupAndAdd2Filters(); |
| 526 | 508 |
| 527 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 528 new StrictMock<MockFilterCallback>(false)); | |
| 529 | |
| 530 // Make sure Flush() works before calling Play(). | 509 // Make sure Flush() works before calling Play(). |
| 531 DoFlush(); | 510 DoFlush(); |
| 532 | 511 |
| 533 // Transition to playing state. | 512 // Transition to playing state. |
| 534 DoPlay(); | 513 DoPlay(); |
| 535 | 514 |
| 536 // Call Flush() to make sure we get an error because we are in | 515 // Call Flush() to make sure we get an error because we are in |
| 537 // the playing state. | 516 // the playing state. |
| 538 ExpectInvalidStateFail(FLUSH); | 517 ExpectInvalidStateFail(FLUSH); |
| 539 | 518 |
| (...skipping 12 matching lines...) Expand all Loading... |
| 552 // Try calling Flush() to make sure we get an error because we are stopped. | 531 // Try calling Flush() to make sure we get an error because we are stopped. |
| 553 ExpectInvalidStateFail(FLUSH); | 532 ExpectInvalidStateFail(FLUSH); |
| 554 } | 533 } |
| 555 | 534 |
| 556 // Test errors in the middle of a parallel call sequence like Flush(). | 535 // Test errors in the middle of a parallel call sequence like Flush(). |
| 557 TEST_F(CompositeFilterTest, TestFlushErrors) { | 536 TEST_F(CompositeFilterTest, TestFlushErrors) { |
| 558 InSequence sequence; | 537 InSequence sequence; |
| 559 | 538 |
| 560 SetupAndAdd2Filters(); | 539 SetupAndAdd2Filters(); |
| 561 | 540 |
| 562 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 563 new StrictMock<MockFilterCallback>(false)); | |
| 564 | |
| 565 EXPECT_CALL(*filter_1_, Flush(_)); | 541 EXPECT_CALL(*filter_1_, Flush(_)); |
| 566 EXPECT_CALL(*filter_2_, Flush(_)); | 542 EXPECT_CALL(*filter_2_, Flush(_)); |
| 567 | 543 |
| 568 // Call Flush() on the composite. | 544 // Call Flush() on the composite. |
| 569 composite_->Flush(mock_callback->NewCallback()); | 545 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 546 composite_->Flush(callback); |
| 570 | 547 |
| 571 // Simulate an error by calling SetError() on |filter_1_|'s FilterHost | 548 // Simulate an error by calling SetError() on |filter_1_|'s FilterHost |
| 572 // interface. | 549 // interface. |
| 573 filter_1_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); | 550 filter_1_->host()->SetError(PIPELINE_ERROR_OUT_OF_MEMORY); |
| 574 | 551 |
| 575 RunFilter1Callback(); | 552 RunFilter1Callback(); |
| 576 | 553 |
| 577 // Expect error to be reported and "pause done" callback to be called. | 554 // Expect error to be reported and "pause done" callback to be called. |
| 578 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); | 555 EXPECT_CALL(*mock_filter_host_, SetError(PIPELINE_ERROR_OUT_OF_MEMORY)); |
| 579 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 556 EXPECT_CALL(*callback, RunWithParams(_)); |
| 557 EXPECT_CALL(*callback, Destructor()); |
| 580 | 558 |
| 581 RunFilter2Callback(); | 559 RunFilter2Callback(); |
| 582 | 560 |
| 583 // Verify that Play/Pause/Flush/Seek fail now that an error occured. | 561 // Verify that Play/Pause/Flush/Seek fail now that an error occured. |
| 584 ExpectInvalidStateFail(PLAY); | 562 ExpectInvalidStateFail(PLAY); |
| 585 ExpectInvalidStateFail(PAUSE); | 563 ExpectInvalidStateFail(PAUSE); |
| 586 ExpectInvalidStateFail(FLUSH); | 564 ExpectInvalidStateFail(FLUSH); |
| 587 ExpectInvalidStateFail(SEEK); | 565 ExpectInvalidStateFail(SEEK); |
| 588 | 566 |
| 589 // Make sure you can still Stop(). | 567 // Make sure you can still Stop(). |
| 590 DoStop(); | 568 DoStop(); |
| 591 } | 569 } |
| 592 | 570 |
| 593 TEST_F(CompositeFilterTest, TestSeek) { | 571 TEST_F(CompositeFilterTest, TestSeek) { |
| 594 InSequence sequence; | 572 InSequence sequence; |
| 595 | 573 |
| 596 SetupAndAdd2Filters(); | 574 SetupAndAdd2Filters(); |
| 597 | 575 |
| 598 // Verify that seek is allowed to be called before a Play() call. | 576 // Verify that seek is allowed to be called before a Play() call. |
| 599 DoSeek(base::TimeDelta::FromSeconds(5)); | 577 DoSeek(base::TimeDelta::FromSeconds(5)); |
| 600 | 578 |
| 601 // Verify we can issue a Play() after the Seek(). | 579 // Verify we can issue a Play() after the Seek(). |
| 602 DoPlay(); | 580 DoPlay(); |
| 603 | 581 |
| 604 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 605 new StrictMock<MockFilterCallback>(false)); | |
| 606 | |
| 607 // Try calling Seek() while playing to make sure we get an error. | 582 // Try calling Seek() while playing to make sure we get an error. |
| 608 ExpectInvalidStateFail(SEEK); | 583 ExpectInvalidStateFail(SEEK); |
| 609 | 584 |
| 610 // Transition to paused state. | 585 // Transition to paused state. |
| 611 DoPause(); | 586 DoPause(); |
| 612 | 587 |
| 613 // Verify that seek is allowed after pausing. | 588 // Verify that seek is allowed after pausing. |
| 614 DoSeek(base::TimeDelta::FromSeconds(5)); | 589 DoSeek(base::TimeDelta::FromSeconds(5)); |
| 615 | 590 |
| 616 // Verify we can still play again. | 591 // Verify we can still play again. |
| 617 DoPlay(); | 592 DoPlay(); |
| 618 | 593 |
| 619 // Stop playback. | 594 // Stop playback. |
| 620 DoStop(); | 595 DoStop(); |
| 621 | 596 |
| 622 // Try calling Seek() to make sure we get an error. | 597 // Try calling Seek() to make sure we get an error. |
| 623 ExpectInvalidStateFail(SEEK); | 598 ExpectInvalidStateFail(SEEK); |
| 624 } | 599 } |
| 625 | 600 |
| 626 TEST_F(CompositeFilterTest, TestStop) { | 601 TEST_F(CompositeFilterTest, TestStop) { |
| 627 InSequence sequence; | 602 InSequence sequence; |
| 628 | 603 |
| 629 // Test Stop() before any other call. | 604 // Test Stop() before any other call. |
| 630 SetupAndAdd2Filters(); | 605 SetupAndAdd2Filters(); |
| 631 DoStop(); | 606 DoStop(); |
| 632 | 607 |
| 633 // Test error during Stop() sequence. | 608 // Test error during Stop() sequence. |
| 634 SetupAndAdd2Filters(); | 609 SetupAndAdd2Filters(); |
| 635 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 636 new StrictMock<MockFilterCallback>(false)); | |
| 637 | 610 |
| 638 EXPECT_CALL(*filter_1_, Stop(_)); | 611 EXPECT_CALL(*filter_1_, Stop(_)); |
| 639 | 612 |
| 640 composite_->Stop(mock_callback->NewCallback()); | 613 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 614 composite_->Stop(callback); |
| 641 | 615 |
| 642 // Have |filter_1_| signal an error. | 616 // Have |filter_1_| signal an error. |
| 643 filter_1_->host()->SetError(PIPELINE_ERROR_READ); | 617 filter_1_->host()->SetError(PIPELINE_ERROR_READ); |
| 644 | 618 |
| 645 EXPECT_CALL(*filter_2_, Stop(_)); | 619 EXPECT_CALL(*filter_2_, Stop(_)); |
| 646 | 620 |
| 647 RunFilter1Callback(); | 621 RunFilter1Callback(); |
| 648 | 622 |
| 649 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 623 EXPECT_CALL(*callback, RunWithParams(_)); |
| 624 EXPECT_CALL(*callback, Destructor()); |
| 650 | 625 |
| 651 RunFilter2Callback(); | 626 RunFilter2Callback(); |
| 652 } | 627 } |
| 653 | 628 |
| 654 // Test stopping in the middle of a serial call sequence. | 629 // Test stopping in the middle of a serial call sequence. |
| 655 TEST_F(CompositeFilterTest, TestStopWhilePlayPending) { | 630 TEST_F(CompositeFilterTest, TestStopWhilePlayPending) { |
| 656 InSequence sequence; | 631 InSequence sequence; |
| 657 | 632 |
| 658 SetupAndAdd2Filters(); | 633 SetupAndAdd2Filters(); |
| 659 | 634 |
| 660 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 661 new StrictMock<MockFilterCallback>()); | |
| 662 | |
| 663 EXPECT_CALL(*filter_1_, Play(_)); | 635 EXPECT_CALL(*filter_1_, Play(_)); |
| 664 | 636 |
| 665 composite_->Play(mock_callback->NewCallback()); | 637 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 638 composite_->Play(callback); |
| 666 | 639 |
| 667 // Note: Play() is pending on |filter_1_| right now. | 640 // Note: Play() is pending on |filter_1_| right now. |
| 668 | 641 |
| 669 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback_2( | 642 EXPECT_CALL(*callback, Destructor()); |
| 670 new StrictMock<MockFilterCallback>(false)); | |
| 671 | 643 |
| 672 EXPECT_CALL(*mock_callback, OnCallbackDestroyed()); | 644 callback = new StrictMock<MockCallback>(); |
| 673 | 645 composite_->Stop(callback); |
| 674 composite_->Stop(mock_callback_2->NewCallback()); | |
| 675 | 646 |
| 676 EXPECT_CALL(*filter_1_, Stop(_)); | 647 EXPECT_CALL(*filter_1_, Stop(_)); |
| 677 | 648 |
| 678 // Run |filter_1_|'s callback again to indicate Play() has completed. | 649 // Run |filter_1_|'s callback again to indicate Play() has completed. |
| 679 RunFilter1Callback(); | 650 RunFilter1Callback(); |
| 680 | 651 |
| 681 EXPECT_CALL(*filter_2_, Stop(_)); | 652 EXPECT_CALL(*filter_2_, Stop(_)); |
| 682 | 653 |
| 683 // Run |filter_1_|'s callback again to indicate Stop() has completed. | 654 // Run |filter_1_|'s callback again to indicate Stop() has completed. |
| 684 RunFilter1Callback(); | 655 RunFilter1Callback(); |
| 685 | 656 |
| 686 EXPECT_CALL(*mock_callback_2, OnFilterCallback()); | 657 EXPECT_CALL(*callback, RunWithParams(_)); |
| 658 EXPECT_CALL(*callback, Destructor()); |
| 687 | 659 |
| 688 // Run |filter_2_|'s callback to indicate Stop() has completed. | 660 // Run |filter_2_|'s callback to indicate Stop() has completed. |
| 689 RunFilter2Callback(); | 661 RunFilter2Callback(); |
| 690 } | 662 } |
| 691 | 663 |
| 692 // Test stopping in the middle of a parallel call sequence. | 664 // Test stopping in the middle of a parallel call sequence. |
| 693 TEST_F(CompositeFilterTest, TestStopWhileFlushPending) { | 665 TEST_F(CompositeFilterTest, TestStopWhileFlushPending) { |
| 694 InSequence sequence; | 666 InSequence sequence; |
| 695 | 667 |
| 696 SetupAndAdd2Filters(); | 668 SetupAndAdd2Filters(); |
| 697 | 669 |
| 698 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | |
| 699 new StrictMock<MockFilterCallback>()); | |
| 700 | |
| 701 EXPECT_CALL(*filter_1_, Flush(_)); | 670 EXPECT_CALL(*filter_1_, Flush(_)); |
| 702 EXPECT_CALL(*filter_2_, Flush(_)); | 671 EXPECT_CALL(*filter_2_, Flush(_)); |
| 703 | 672 |
| 704 composite_->Flush(mock_callback->NewCallback()); | 673 StrictMock<MockCallback>* callback = new StrictMock<MockCallback>(); |
| 674 composite_->Flush(callback); |
| 705 | 675 |
| 706 // Note: |filter_1_| and |filter_2_| have pending Flush() calls at this point. | 676 // Note: |filter_1_| and |filter_2_| have pending Flush() calls at this point. |
| 707 | 677 |
| 708 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback_2( | 678 EXPECT_CALL(*callback, Destructor()); |
| 709 new StrictMock<MockFilterCallback>(false)); | |
| 710 | 679 |
| 711 EXPECT_CALL(*mock_callback, OnCallbackDestroyed()); | 680 callback = new StrictMock<MockCallback>(); |
| 712 | 681 composite_->Stop(callback); |
| 713 composite_->Stop(mock_callback_2->NewCallback()); | |
| 714 | 682 |
| 715 // Run callback to indicate that |filter_1_|'s Flush() has completed. | 683 // Run callback to indicate that |filter_1_|'s Flush() has completed. |
| 716 RunFilter1Callback(); | 684 RunFilter1Callback(); |
| 717 | 685 |
| 718 EXPECT_CALL(*filter_1_, Stop(_)); | 686 EXPECT_CALL(*filter_1_, Stop(_)); |
| 719 | 687 |
| 720 // Run callback to indicate that |filter_2_|'s Flush() has completed. | 688 // Run callback to indicate that |filter_2_|'s Flush() has completed. |
| 721 RunFilter2Callback(); | 689 RunFilter2Callback(); |
| 722 | 690 |
| 723 EXPECT_CALL(*filter_2_, Stop(_)); | 691 EXPECT_CALL(*filter_2_, Stop(_)); |
| 724 | 692 |
| 725 // Run callback to indicate that |filter_1_|'s Stop() has completed. | 693 // Run callback to indicate that |filter_1_|'s Stop() has completed. |
| 726 RunFilter1Callback(); | 694 RunFilter1Callback(); |
| 727 | 695 |
| 728 EXPECT_CALL(*mock_callback_2, OnFilterCallback()); | 696 EXPECT_CALL(*callback, RunWithParams(_)); |
| 697 EXPECT_CALL(*callback, Destructor()); |
| 729 | 698 |
| 730 // Run callback to indicate that |filter_2_|'s Stop() has completed. | 699 // Run callback to indicate that |filter_2_|'s Stop() has completed. |
| 731 RunFilter2Callback(); | 700 RunFilter2Callback(); |
| 732 } | 701 } |
| 733 | 702 |
| 734 TEST_F(CompositeFilterTest, TestErrorWhilePlaying) { | 703 TEST_F(CompositeFilterTest, TestErrorWhilePlaying) { |
| 735 InSequence sequence; | 704 InSequence sequence; |
| 736 | 705 |
| 737 SetupAndAdd2Filters(); | 706 SetupAndAdd2Filters(); |
| 738 | 707 |
| (...skipping 21 matching lines...) Expand all Loading... |
| 760 filter_2_->host()->SetError(PIPELINE_ERROR_NETWORK); | 729 filter_2_->host()->SetError(PIPELINE_ERROR_NETWORK); |
| 761 } | 730 } |
| 762 | 731 |
| 763 // Make sure that state transitions act as expected even | 732 // Make sure that state transitions act as expected even |
| 764 // if the composite doesn't contain any filters. | 733 // if the composite doesn't contain any filters. |
| 765 TEST_F(CompositeFilterTest, TestEmptyComposite) { | 734 TEST_F(CompositeFilterTest, TestEmptyComposite) { |
| 766 InSequence sequence; | 735 InSequence sequence; |
| 767 | 736 |
| 768 composite_->set_host(mock_filter_host_.get()); | 737 composite_->set_host(mock_filter_host_.get()); |
| 769 | 738 |
| 770 scoped_ptr<StrictMock<MockFilterCallback> > mock_callback( | 739 // Issue a Play() and expect no errors. |
| 771 new StrictMock<MockFilterCallback>(false)); | 740 composite_->Play(NewExpectedCallback()); |
| 741 |
| 742 // Issue a Pause() and expect no errors. |
| 743 composite_->Pause(NewExpectedCallback()); |
| 744 |
| 745 // Issue a Flush() and expect no errors. |
| 746 composite_->Flush(NewExpectedCallback()); |
| 747 |
| 748 // Issue a Seek() and expect no errors. |
| 749 composite_->Seek(base::TimeDelta::FromSeconds(5), |
| 750 NewExpectedCallback()); |
| 772 | 751 |
| 773 // Issue a Play() and expect no errors. | 752 // Issue a Play() and expect no errors. |
| 774 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 753 composite_->Play(NewExpectedCallback()); |
| 775 composite_->Play(mock_callback->NewCallback()); | |
| 776 | |
| 777 // Issue a Pause() and expect no errors. | |
| 778 EXPECT_CALL(*mock_callback, OnFilterCallback()); | |
| 779 composite_->Pause(mock_callback->NewCallback()); | |
| 780 | |
| 781 // Issue a Flush() and expect no errors. | |
| 782 EXPECT_CALL(*mock_callback, OnFilterCallback()); | |
| 783 composite_->Flush(mock_callback->NewCallback()); | |
| 784 | |
| 785 // Issue a Seek() and expect no errors. | |
| 786 EXPECT_CALL(*mock_callback, OnFilterCallback()); | |
| 787 composite_->Seek(base::TimeDelta::FromSeconds(5), | |
| 788 mock_callback->NewCallback()); | |
| 789 | |
| 790 // Issue a Play() and expect no errors. | |
| 791 EXPECT_CALL(*mock_callback, OnFilterCallback()); | |
| 792 composite_->Play(mock_callback->NewCallback()); | |
| 793 | 754 |
| 794 // Issue a Stop() and expect no errors. | 755 // Issue a Stop() and expect no errors. |
| 795 EXPECT_CALL(*mock_callback, OnFilterCallback()); | 756 composite_->Stop(NewExpectedCallback()); |
| 796 composite_->Stop(mock_callback->NewCallback()); | |
| 797 } | 757 } |
| 798 | 758 |
| 799 } // namespace media | 759 } // namespace media |
| OLD | NEW |