1c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Copyright (c) 2013 The Chromium Authors. All rights reserved. 2c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 3c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// found in the LICENSE file. 4c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 5c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <string> 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 7cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "base/message_loop/message_loop.h" 8868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/child_process.h" 10cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/common/media/video_capture.h" 11c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch#include "content/public/renderer/media_stream_video_sink.h" 12a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream.h" 13c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/media_stream_registry_interface.h" 14c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/mock_media_stream_registry.h" 15c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "content/renderer/media/video_source_handler.h" 16c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 17c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 18868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 19868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebString.h" 201320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci#include "third_party/WebKit/public/web/WebHeap.h" 21c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 22c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)namespace content { 23c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 24c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kTestStreamUrl = "stream_url"; 25c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kTestVideoTrackId = "video_track_id"; 26c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)static const std::string kUnknownStreamUrl = "unknown_stream_url"; 27c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 28c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class FakeFrameReader : public FrameReaderInterface { 29c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 30c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch virtual bool GotFrame( 31c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const scoped_refptr<media::VideoFrame>& frame) OVERRIDE { 32c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch last_frame_ = frame; 33c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return true; 34c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 35c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 36c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const media::VideoFrame* last_frame() { 37c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) return last_frame_.get(); 38c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 39c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 40c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) private: 41c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<media::VideoFrame> last_frame_; 42c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 43c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 44c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)class VideoSourceHandlerTest : public ::testing::Test { 45c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) public: 46010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) VideoSourceHandlerTest() 47010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) : child_process_(new ChildProcess()), 481320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_(new MockMediaStreamRegistry()) { 491320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci handler_.reset(new VideoSourceHandler(registry_.get())); 501320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_->Init(kTestStreamUrl); 511320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_->AddVideoTrack(kTestVideoTrackId); 521320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci } 531320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci 541320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci virtual void TearDown() { 551320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci registry_.reset(); 561320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci blink::WebHeap::collectAllGarbageForTesting(); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) protected: 60cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop message_loop_; 61010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<ChildProcess> child_process_; 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_ptr<VideoSourceHandler> handler_; 631320f92c476a1ad9d19dba2a48c72b75566198e9Primiano Tucci scoped_ptr<MockMediaStreamRegistry> registry_; 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)}; 65c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 66c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(VideoSourceHandlerTest, OpenClose) { 67c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) FakeFrameReader reader; 68c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Unknow url will return false. 69c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_FALSE(handler_->Open(kUnknownStreamUrl, &reader)); 70c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader)); 71a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 72c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int width = 640; 73c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch int height = 360; 74c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch base::TimeDelta ts = base::TimeDelta::FromInternalValue(789012); 75a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 76a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // A new frame is captured. 77c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch scoped_refptr<media::VideoFrame> captured_frame = 78c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch media::VideoFrame::CreateBlackFrame(gfx::Size(width, height)); 79c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch captured_frame->set_timestamp(ts); 80c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch 81c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch // The frame is delivered to VideoSourceHandler. 82cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) handler_->DeliverFrameForTesting(&reader, captured_frame); 83c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 84a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) // Compare |frame| to |captured_frame|. 85c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch const media::VideoFrame* frame = reader.last_frame(); 86c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) ASSERT_TRUE(frame != NULL); 87c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(width, frame->coded_size().width()); 88c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(height, frame->coded_size().height()); 89c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(ts, frame->timestamp()); 90c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch EXPECT_EQ(captured_frame->data(media::VideoFrame::kYPlane), 91c5cede9ae108bb15f6b7a8aea21c7e1fefa2834cBen Murdoch frame->data(media::VideoFrame::kYPlane)); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 935d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_FALSE(handler_->Close(NULL)); 945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(handler_->Close(&reader)); 95c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 96c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 975d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)TEST_F(VideoSourceHandlerTest, OpenWithoutClose) { 985d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) FakeFrameReader reader; 995d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) EXPECT_TRUE(handler_->Open(kTestStreamUrl, &reader)); 1005d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)} 1015d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) 102c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} // namespace content 103