15821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Copyright (c) 2012 The Chromium Authors. All rights reserved. 25821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Use of this source code is governed by a BSD-style license that can be 35821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// found in the LICENSE file. 45821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 55821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 65821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/common/media/media_stream_options.h" 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_extra_data.h" 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/media_stream_source_extra_data.h" 95821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/mock_media_stream_dependency_factory.h" 105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h" 115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 12868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaConstraints.h" 13868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStream.h" 14868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 15868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 16868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandler.h" 17868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebVector.h" 182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/libjingle/source/talk/app/webrtc/videosourceinterface.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaSourceCreatedObserver { 235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaSourceCreatedObserver() 255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : result_(false), 265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description_(NULL) { 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) void OnCreateNativeSourcesComplete( 302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaStream* description, 315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool request_succeeded) { 325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) result_ = request_succeeded; 335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) description_ = description; 345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaStream* description() const { 375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return description_; 385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 395821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result() const { return result_; } 405821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 415821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) private: 425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) bool result_; 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaStream* description_; 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class MediaStreamDependencyFactoryTest : public ::testing::Test { 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_.reset(new MockMediaStreamDependencyFactory()); 505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 52c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) virtual void TearDown() OVERRIDE { 53c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(tommyw): Remove this once WebKit::MediaStreamSource::Owner has been 54c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // implemented to fully avoid a circular dependency. 55c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < audio_sources_.size(); ++i) 56c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) audio_sources_[i].setExtraData(NULL); 57c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 58c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) for (size_t i = 0; i < video_sources_.size(); ++i) 59c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_sources_[i].setExtraData(NULL); 60c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 61c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 62c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebMediaStream CreateWebKitMediaStream(bool audio, bool video) { 635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( 64c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) audio ? static_cast<size_t>(1) : 0); 655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( 665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video ? static_cast<size_t>(1) : 0); 675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (audio) { 695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfo info; 702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.type = content::MEDIA_DEVICE_AUDIO_CAPTURE; 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.name = "audio"; 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.sample_rate = 0; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.channel_layout = 0; 745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.session_id = 99; 755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_sources[0].initialize("audio", 765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebMediaStreamSource::TypeAudio, 775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "audio"); 785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) audio_sources[0].setExtraData( 79c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MediaStreamSourceExtraData(info, audio_sources[0])); 80c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) audio_sources_.assign(audio_sources); 815821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (video) { 835821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) StreamDeviceInfo info; 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.type = content::MEDIA_DEVICE_VIDEO_CAPTURE; 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) info.device.name = "video"; 865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) info.session_id = 98; 875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_sources[0].initialize("video", 885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebMediaStreamSource::TypeVideo, 895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) "video"); 905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) video_sources[0].setExtraData( 91c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) new MediaStreamSourceExtraData(info, video_sources[0])); 92c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_sources_.assign(video_sources); 935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaStream stream_desc; 95bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_track_vector( 96bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_sources.size()); 97bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (size_t i = 0; i < audio_track_vector.size(); ++i) { 98bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_track_vector[i].initialize(audio_sources[i].id(), 99bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_sources[i]); 100bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 101bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 102bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebVector<WebKit::WebMediaStreamTrack> video_track_vector( 103bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_sources.size()); 104bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch for (size_t i = 0; i < video_track_vector.size(); ++i) { 105bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_track_vector[i].initialize(video_sources[i].id(), 106bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_sources[i]); 107bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch } 1085821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 109bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch stream_desc.initialize("media stream", audio_track_vector, 110bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_track_vector); 1115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stream_desc; 1125821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void CreateNativeSources(WebKit::WebMediaStream* descriptor) { 115c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static const int kRenderViewId = 1; 116c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MediaSourceCreatedObserver observer; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaConstraints audio_constraints; 1195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_->CreateNativeMediaSources( 120c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) kRenderViewId, 1215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebMediaConstraints(), 1225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) WebKit::WebMediaConstraints(), 1235821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) descriptor, 1245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Bind( 1255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) &MediaSourceCreatedObserver::OnCreateNativeSourcesComplete, 1265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) base::Unretained(&observer))); 1275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(observer.result()); 1295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Change the state of the created source to live. This should trigger 1305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // MediaSourceCreatedObserver::OnCreateNativeSourcesComplete 1315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (dependency_factory_->last_video_source()) { 1322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) dependency_factory_->last_audio_source()->SetLive(); 1335821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_->last_video_source()->SetLive(); 1345821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1355821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.result()); 1365821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(observer.description() == descriptor); 1375821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1385821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 139c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void VerifyMediaStream(const WebKit::WebMediaStream& stream_desc, 140c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t num_audio_tracks, 141c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) size_t num_video_tracks) { 142c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) content::MediaStreamExtraData* extra_data = 143c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) static_cast<content::MediaStreamExtraData*>(stream_desc.extraData()); 144868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) ASSERT_TRUE(extra_data && extra_data->stream().get()); 145c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(extra_data->is_local()); 146c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(num_audio_tracks, extra_data->stream()->GetAudioTracks().size()); 147c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(num_video_tracks, extra_data->stream()->GetVideoTracks().size()); 148c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) } 149c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 1505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) protected: 1515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockMediaStreamDependencyFactory> dependency_factory_; 152c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources_; 153c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources_; 1545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1565821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamDependencyFactoryTest, CreateRTCPeerConnectionHandler) { 1575821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockWebRTCPeerConnectionHandlerClient client_jsep; 1585821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<WebKit::WebRTCPeerConnectionHandler> pc_handler( 1595821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_->CreateRTCPeerConnectionHandler(&client_jsep)); 1605821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc_handler.get() != NULL); 1615821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamDependencyFactoryTest, CreateNativeMediaStream) { 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebKit::WebMediaStream stream_desc = CreateWebKitMediaStream(true, true); 1655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateNativeSources(&stream_desc); 1665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_->CreateNativeLocalMediaStream(&stream_desc); 168c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 1, 1); 1695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 1705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// Test that we don't crash if a MediaStream is created in WebKit with unknown 1725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// sources. This can for example happen if a MediaStream is created with 1735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)// remote tracks. 1745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(MediaStreamDependencyFactoryTest, CreateNativeMediaStreamWithoutSource) { 1755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Create a WebKit MediaStream description. 176bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebMediaStreamSource audio_source; 177bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_source.initialize("audio source", 178bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebMediaStreamSource::TypeAudio, 179bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "something"); 180bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebMediaStreamSource video_source; 181bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_source.initialize("video source", 182bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebMediaStreamSource::TypeVideo, 183bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch "something"); 184bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 185bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks( 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(1)); 187bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_tracks[0].initialize(audio_source.id(), audio_source); 188bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks( 1895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(1)); 190bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_tracks[0].initialize(video_source.id(), video_source); 191bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 192bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch WebKit::WebMediaStream stream_desc; 193bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch stream_desc.initialize("new stream", audio_tracks, video_tracks); 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(dependency_factory_->EnsurePeerConnectionFactory()); 1965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) dependency_factory_->CreateNativeLocalMediaStream(&stream_desc); 197c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 0, 0); 198c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 199c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 200c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(MediaStreamDependencyFactoryTest, AddAndRemoveNativeTrack) { 201c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebMediaStream stream_desc = CreateWebKitMediaStream(true, true); 202c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) CreateNativeSources(&stream_desc); 203c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 204c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) dependency_factory_->CreateNativeLocalMediaStream(&stream_desc); 205c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 1, 1); 206c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 207c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamTrack> audio_tracks; 208c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc.audioTracks(audio_tracks); 209c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(dependency_factory_->RemoveNativeMediaStreamTrack( 210c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc, audio_tracks[0])); 211c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 0, 1); 212c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 213c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(dependency_factory_->AddNativeMediaStreamTrack( 214c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc, audio_tracks[0])); 215c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 1, 1); 216c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 217c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) WebKit::WebVector<WebKit::WebMediaStreamTrack> video_tracks; 218c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc.videoTracks(video_tracks); 219c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(dependency_factory_->RemoveNativeMediaStreamTrack( 220c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc, video_tracks[0])); 221c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 1, 0); 222c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 223c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_TRUE(dependency_factory_->AddNativeMediaStreamTrack( 224c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) stream_desc, video_tracks[0])); 225c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) VerifyMediaStream(stream_desc, 1, 1); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 229