video_destination_handler_unittest.cc revision 010d83a9304c5a91596085d917d248abff47903a
1// Copyright (c) 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 <string> 6 7#include "base/message_loop/message_loop.h" 8#include "base/run_loop.h" 9#include "base/strings/utf_string_conversions.h" 10#include "content/child/child_process.h" 11#include "content/renderer/media/media_stream.h" 12#include "content/renderer/media/media_stream_video_track.h" 13#include "content/renderer/media/mock_media_stream_registry.h" 14#include "content/renderer/media/mock_media_stream_video_sink.h" 15#include "content/renderer/media/webrtc/video_destination_handler.h" 16#include "content/renderer/pepper/pepper_plugin_instance_impl.h" 17#include "content/renderer/pepper/ppb_image_data_impl.h" 18#include "content/test/ppapi_unittest.h" 19#include "testing/gmock/include/gmock/gmock.h" 20#include "testing/gtest/include/gtest/gtest.h" 21#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 22#include "third_party/WebKit/public/platform/WebString.h" 23 24using ::testing::_; 25 26namespace content { 27 28ACTION_P(RunClosure, closure) { 29 closure.Run(); 30} 31 32static const std::string kTestStreamUrl = "stream_url"; 33static const std::string kUnknownStreamUrl = "unknown_stream_url"; 34 35class VideoDestinationHandlerTest : public PpapiUnittest { 36 public: 37 VideoDestinationHandlerTest() 38 : child_process_(new ChildProcess()), 39 registry_(MockMediaStreamRegistry()) { 40 registry_.Init(kTestStreamUrl); 41 } 42 43 base::MessageLoop* io_message_loop() const { 44 return child_process_->io_message_loop(); 45 } 46 47 protected: 48 scoped_ptr<ChildProcess> child_process_; 49 MockMediaStreamRegistry registry_; 50}; 51 52TEST_F(VideoDestinationHandlerTest, Open) { 53 FrameWriterInterface* frame_writer = NULL; 54 // Unknow url will return false. 55 EXPECT_FALSE(VideoDestinationHandler::Open(®istry_, 56 kUnknownStreamUrl, &frame_writer)); 57 EXPECT_TRUE(VideoDestinationHandler::Open(®istry_, 58 kTestStreamUrl, &frame_writer)); 59 // The |frame_writer| is a proxy and is owned by whoever call Open. 60 delete frame_writer; 61} 62 63TEST_F(VideoDestinationHandlerTest, PutFrame) { 64 FrameWriterInterface* frame_writer = NULL; 65 EXPECT_TRUE(VideoDestinationHandler::Open(®istry_, 66 kTestStreamUrl, &frame_writer)); 67 ASSERT_TRUE(frame_writer); 68 69 // Verify the video track has been added. 70 const blink::WebMediaStream test_stream = registry_.test_stream(); 71 blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 72 test_stream.videoTracks(video_tracks); 73 ASSERT_EQ(1u, video_tracks.size()); 74 75 // Verify the native video track has been added. 76 MediaStreamVideoTrack* native_track = 77 MediaStreamVideoTrack::GetVideoTrack(video_tracks[0]); 78 ASSERT_TRUE(native_track != NULL); 79 80 MockMediaStreamVideoSink sink; 81 native_track->AddSink(&sink); 82 83 scoped_refptr<PPB_ImageData_Impl> image( 84 new PPB_ImageData_Impl(instance()->pp_instance(), 85 PPB_ImageData_Impl::ForTest())); 86 image->Init(PP_IMAGEDATAFORMAT_BGRA_PREMUL, 640, 360, true); 87 { 88 base::RunLoop run_loop; 89 base::Closure quit_closure = run_loop.QuitClosure(); 90 91 EXPECT_CALL(sink, OnVideoFrame()).WillOnce( 92 RunClosure(quit_closure)); 93 frame_writer->PutFrame(image, 10); 94 run_loop.Run(); 95 } 96 // TODO(perkj): Verify that the track output I420 when 97 // https://codereview.chromium.org/213423006/ is landed. 98 EXPECT_EQ(1, sink.number_of_frames()); 99 native_track->RemoveSink(&sink); 100 101 // The |frame_writer| is a proxy and is owned by whoever call Open. 102 delete frame_writer; 103} 104 105} // namespace content 106