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 |