Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2016 The Chromium Authors. All rights reserved. | 1 // Copyright 2016 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/remoting/courier_renderer.h" | 5 #include "media/remoting/courier_renderer.h" |
| 6 | 6 |
| 7 #include "base/memory/ptr_util.h" | 7 #include "base/memory/ptr_util.h" |
| 8 #include "base/run_loop.h" | 8 #include "base/run_loop.h" |
| 9 #include "base/test/simple_test_tick_clock.h" | 9 #include "base/test/simple_test_tick_clock.h" |
| 10 #include "base/threading/thread_task_runner_handle.h" | 10 #include "base/threading/thread_task_runner_handle.h" |
| (...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 126 public: | 126 public: |
| 127 CourierRendererTest() | 127 CourierRendererTest() |
| 128 : receiver_renderer_handle_(10), | 128 : receiver_renderer_handle_(10), |
| 129 receiver_audio_demuxer_callback_handle_(11), | 129 receiver_audio_demuxer_callback_handle_(11), |
| 130 receiver_video_demuxer_callback_handle_(12), | 130 receiver_video_demuxer_callback_handle_(12), |
| 131 sender_client_handle_(RpcBroker::kInvalidHandle), | 131 sender_client_handle_(RpcBroker::kInvalidHandle), |
| 132 sender_renderer_callback_handle_(RpcBroker::kInvalidHandle), | 132 sender_renderer_callback_handle_(RpcBroker::kInvalidHandle), |
| 133 sender_audio_demuxer_handle_(RpcBroker::kInvalidHandle), | 133 sender_audio_demuxer_handle_(RpcBroker::kInvalidHandle), |
| 134 sender_video_demuxer_handle_(RpcBroker::kInvalidHandle), | 134 sender_video_demuxer_handle_(RpcBroker::kInvalidHandle), |
| 135 received_audio_ds_init_cb_(false), | 135 received_audio_ds_init_cb_(false), |
| 136 received_video_ds_init_cb_(false), | 136 received_video_ds_init_cb_(false) {} |
| 137 renderer_initialized_(false) {} | |
| 138 ~CourierRendererTest() override = default; | 137 ~CourierRendererTest() override = default; |
| 139 | 138 |
| 140 // Use this function to mimic receiver to handle RPC message for renderer | 139 // Use this function to mimic receiver to handle RPC message for renderer |
| 141 // initialization, | 140 // initialization, |
| 142 void RpcMessageResponseBot(std::unique_ptr<std::vector<uint8_t>> message) { | 141 void RpcMessageResponseBot(std::unique_ptr<std::vector<uint8_t>> message) { |
| 143 std::unique_ptr<pb::RpcMessage> rpc(new pb::RpcMessage()); | 142 std::unique_ptr<pb::RpcMessage> rpc(new pb::RpcMessage()); |
| 144 ASSERT_TRUE(rpc->ParseFromArray(message->data(), message->size())); | 143 ASSERT_TRUE(rpc->ParseFromArray(message->data(), message->size())); |
| 145 switch (rpc->proc()) { | 144 switch (rpc->proc()) { |
| 146 case pb::RpcMessage::RPC_ACQUIRE_RENDERER: { | 145 case pb::RpcMessage::RPC_ACQUIRE_RENDERER: { |
| 147 // Issues RPC_ACQUIRE_RENDERER_DONE RPC message. | 146 // Issues RPC_ACQUIRE_RENDERER_DONE RPC message. |
| (...skipping 40 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 188 | 187 |
| 189 // Issues RPC_R_INITIALIZE_CALLBACK RPC message when receiving | 188 // Issues RPC_R_INITIALIZE_CALLBACK RPC message when receiving |
| 190 // RPC_DS_INITIALIZE_CALLBACK on available streams. | 189 // RPC_DS_INITIALIZE_CALLBACK on available streams. |
| 191 if (received_audio_ds_init_cb_ == | 190 if (received_audio_ds_init_cb_ == |
| 192 (sender_audio_demuxer_handle_ != RpcBroker::kInvalidHandle) && | 191 (sender_audio_demuxer_handle_ != RpcBroker::kInvalidHandle) && |
| 193 received_video_ds_init_cb_ == | 192 received_video_ds_init_cb_ == |
| 194 (sender_video_demuxer_handle_ != RpcBroker::kInvalidHandle)) { | 193 (sender_video_demuxer_handle_ != RpcBroker::kInvalidHandle)) { |
| 195 std::unique_ptr<pb::RpcMessage> init_cb(new pb::RpcMessage()); | 194 std::unique_ptr<pb::RpcMessage> init_cb(new pb::RpcMessage()); |
| 196 init_cb->set_handle(sender_renderer_callback_handle_); | 195 init_cb->set_handle(sender_renderer_callback_handle_); |
| 197 init_cb->set_proc(pb::RpcMessage::RPC_R_INITIALIZE_CALLBACK); | 196 init_cb->set_proc(pb::RpcMessage::RPC_R_INITIALIZE_CALLBACK); |
| 198 init_cb->set_boolean_value(true); | 197 init_cb->set_boolean_value(is_successfully_initialized_); |
| 199 controller_->GetRpcBroker()->ProcessMessageFromRemote( | 198 controller_->GetRpcBroker()->ProcessMessageFromRemote( |
| 200 std::move(init_cb)); | 199 std::move(init_cb)); |
| 201 renderer_initialized_ = true; | |
| 202 } | 200 } |
| 203 | 201 |
| 204 } break; | 202 } break; |
| 205 case pb::RpcMessage::RPC_R_FLUSHUNTIL: { | 203 case pb::RpcMessage::RPC_R_FLUSHUNTIL: { |
| 206 // Issues RPC_R_FLUSHUNTIL_CALLBACK RPC message. | 204 // Issues RPC_R_FLUSHUNTIL_CALLBACK RPC message. |
| 207 std::unique_ptr<pb::RpcMessage> flush_cb(new pb::RpcMessage()); | 205 std::unique_ptr<pb::RpcMessage> flush_cb(new pb::RpcMessage()); |
| 208 flush_cb->set_handle(rpc->renderer_flushuntil_rpc().callback_handle()); | 206 flush_cb->set_handle(rpc->renderer_flushuntil_rpc().callback_handle()); |
| 209 flush_cb->set_proc(pb::RpcMessage::RPC_R_FLUSHUNTIL_CALLBACK); | 207 flush_cb->set_proc(pb::RpcMessage::RPC_R_FLUSHUNTIL_CALLBACK); |
| 210 controller_->GetRpcBroker()->ProcessMessageFromRemote( | 208 controller_->GetRpcBroker()->ProcessMessageFromRemote( |
| 211 std::move(flush_cb)); | 209 std::move(flush_cb)); |
| (...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 339 | 337 |
| 340 // RPC handles. | 338 // RPC handles. |
| 341 const int receiver_renderer_handle_; | 339 const int receiver_renderer_handle_; |
| 342 const int receiver_audio_demuxer_callback_handle_; | 340 const int receiver_audio_demuxer_callback_handle_; |
| 343 const int receiver_video_demuxer_callback_handle_; | 341 const int receiver_video_demuxer_callback_handle_; |
| 344 int sender_client_handle_; | 342 int sender_client_handle_; |
| 345 int sender_renderer_callback_handle_; | 343 int sender_renderer_callback_handle_; |
| 346 int sender_audio_demuxer_handle_; | 344 int sender_audio_demuxer_handle_; |
| 347 int sender_video_demuxer_handle_; | 345 int sender_video_demuxer_handle_; |
| 348 | 346 |
| 349 // flag to indicate if RPC_DS_INITIALIZE_CALLBACK RPC messages are received. | 347 // Indicate whether RPC_DS_INITIALIZE_CALLBACK RPC messages are received. |
| 350 bool received_audio_ds_init_cb_; | 348 bool received_audio_ds_init_cb_; |
| 351 bool received_video_ds_init_cb_; | 349 bool received_video_ds_init_cb_; |
| 352 | 350 |
| 353 // Check if |renderer_| is initialized successfully or not. | 351 // Indicates whether the renderer on receiver side is successfully |
|
miu
2017/02/02 22:37:58
nit: To be clearer, let's say "...whether the test
xjz
2017/02/02 23:03:31
Done.
| |
| 354 bool renderer_initialized_; | 352 // initialized. |
| 353 bool is_successfully_initialized_ = true; | |
| 355 | 354 |
| 356 // vector to store received RPC message with proc value | 355 // Stores RPC messages that are sending to remote sink. |
| 357 std::vector<std::unique_ptr<pb::RpcMessage>> received_rpc_; | 356 std::vector<std::unique_ptr<pb::RpcMessage>> received_rpc_; |
| 358 | 357 |
| 359 private: | 358 private: |
| 360 DISALLOW_COPY_AND_ASSIGN(CourierRendererTest); | 359 DISALLOW_COPY_AND_ASSIGN(CourierRendererTest); |
| 361 }; | 360 }; |
| 362 | 361 |
| 363 TEST_F(CourierRendererTest, Initialize) { | 362 TEST_F(CourierRendererTest, Initialize) { |
| 364 InitializeRenderer(); | 363 InitializeRenderer(); |
| 365 RunPendingTasks(); | 364 RunPendingTasks(); |
| 366 | 365 |
| 367 ASSERT_TRUE(IsRendererInitialized()); | 366 ASSERT_TRUE(IsRendererInitialized()); |
| 368 ASSERT_EQ(render_client_->status(), PIPELINE_OK); | 367 ASSERT_EQ(render_client_->status(), PIPELINE_OK); |
| 369 } | 368 } |
| 370 | 369 |
| 370 TEST_F(CourierRendererTest, InitializeFailed) { | |
|
miu
2017/02/02 22:37:58
Looks great! :)
| |
| 371 is_successfully_initialized_ = false; | |
| 372 InitializeRenderer(); | |
| 373 RunPendingTasks(); | |
| 374 ASSERT_FALSE(IsRendererInitialized()); | |
| 375 ASSERT_TRUE(DidEncounterFatalError()); | |
| 376 // Don't report error to prevent breaking the pipeline. | |
| 377 ASSERT_EQ(render_client_->status(), PIPELINE_OK); | |
| 378 | |
| 379 // The CourierRenderer should act as a no-op renderer from this point. | |
| 380 | |
| 381 ResetReceivedRpcMessage(); | |
| 382 EXPECT_CALL(*render_client_, OnFlushCallback()).Times(1); | |
| 383 renderer_->Flush(base::Bind(&RendererClientImpl::OnFlushCallback, | |
| 384 base::Unretained(render_client_.get()))); | |
| 385 RunPendingTasks(); | |
| 386 ASSERT_EQ(0, ReceivedRpcMessageCount()); | |
| 387 | |
| 388 base::TimeDelta seek = base::TimeDelta::FromMicroseconds(100); | |
| 389 renderer_->StartPlayingFrom(seek); | |
| 390 RunPendingTasks(); | |
| 391 ASSERT_EQ(0, ReceivedRpcMessageCount()); | |
| 392 | |
| 393 renderer_->SetVolume(3.0); | |
| 394 RunPendingTasks(); | |
| 395 ASSERT_EQ(0, ReceivedRpcMessageCount()); | |
| 396 | |
| 397 renderer_->SetPlaybackRate(2.5); | |
| 398 RunPendingTasks(); | |
| 399 ASSERT_EQ(0, ReceivedRpcMessageCount()); | |
| 400 } | |
| 401 | |
| 371 TEST_F(CourierRendererTest, Flush) { | 402 TEST_F(CourierRendererTest, Flush) { |
| 372 // Initialize Renderer. | 403 // Initialize Renderer. |
| 373 InitializeRenderer(); | 404 InitializeRenderer(); |
| 374 RunPendingTasks(); | 405 RunPendingTasks(); |
| 375 ASSERT_TRUE(IsRendererInitialized()); | 406 ASSERT_TRUE(IsRendererInitialized()); |
| 376 ASSERT_EQ(render_client_->status(), PIPELINE_OK); | 407 ASSERT_EQ(render_client_->status(), PIPELINE_OK); |
| 377 | 408 |
| 378 // Flush Renderer. | 409 // Flush Renderer. |
| 379 // Redirect RPC message for simulate receiver scenario | 410 // Redirect RPC message for simulate receiver scenario |
| 380 controller_->GetRpcBroker()->SetMessageCallbackForTesting(base::Bind( | 411 controller_->GetRpcBroker()->SetMessageCallbackForTesting(base::Bind( |
| (...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 425 } | 456 } |
| 426 | 457 |
| 427 TEST_F(CourierRendererTest, SetPlaybackRate) { | 458 TEST_F(CourierRendererTest, SetPlaybackRate) { |
| 428 // Initialize Renderer because, as of this writing, the pipeline guarantees it | 459 // Initialize Renderer because, as of this writing, the pipeline guarantees it |
| 429 // will not call SetPlaybackRate() until after the media::Renderer is | 460 // will not call SetPlaybackRate() until after the media::Renderer is |
| 430 // initialized. | 461 // initialized. |
| 431 InitializeRenderer(); | 462 InitializeRenderer(); |
| 432 RunPendingTasks(); | 463 RunPendingTasks(); |
| 433 ASSERT_EQ(0, ReceivedRpcMessageCount()); | 464 ASSERT_EQ(0, ReceivedRpcMessageCount()); |
| 434 | 465 |
| 435 controller_->GetRpcBroker()->SetMessageCallbackForTesting(base::Bind( | |
| 436 &CourierRendererTest::OnSendMessageToSink, base::Unretained(this))); | |
| 437 renderer_->SetPlaybackRate(2.5); | 466 renderer_->SetPlaybackRate(2.5); |
| 438 RunPendingTasks(); | 467 RunPendingTasks(); |
| 439 ASSERT_EQ(1, ReceivedRpcMessageCount()); | 468 ASSERT_EQ(1, ReceivedRpcMessageCount()); |
| 440 // Checks if it sends out RPC message with correct value. | 469 // Checks if it sends out RPC message with correct value. |
| 441 const pb::RpcMessage* rpc = | 470 const pb::RpcMessage* rpc = |
| 442 PeekRpcMessage(pb::RpcMessage::RPC_R_SETPLAYBACKRATE); | 471 PeekRpcMessage(pb::RpcMessage::RPC_R_SETPLAYBACKRATE); |
| 443 ASSERT_TRUE(rpc); | 472 ASSERT_TRUE(rpc); |
| 444 ASSERT_TRUE(rpc->double_value() == 2.5); | 473 ASSERT_TRUE(rpc->double_value() == 2.5); |
| 445 } | 474 } |
| 446 | 475 |
| (...skipping 165 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 612 ASSERT_FALSE(DidEncounterFatalError()); // Not enough measurements. | 641 ASSERT_FALSE(DidEncounterFatalError()); // Not enough measurements. |
| 613 IssueStatisticsUpdateRpc(); | 642 IssueStatisticsUpdateRpc(); |
| 614 clock_->Advance(base::TimeDelta::FromSeconds(1)); | 643 clock_->Advance(base::TimeDelta::FromSeconds(1)); |
| 615 RunPendingTasks(); | 644 RunPendingTasks(); |
| 616 } | 645 } |
| 617 ASSERT_TRUE(DidEncounterFatalError()); | 646 ASSERT_TRUE(DidEncounterFatalError()); |
| 618 } | 647 } |
| 619 | 648 |
| 620 } // namespace remoting | 649 } // namespace remoting |
| 621 } // namespace media | 650 } // namespace media |
| OLD | NEW |