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 <string> 6c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)#include <vector> 75821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 85821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "base/memory/scoped_ptr.h" 9010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "base/message_loop/message_loop.h" 10868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "base/strings/utf_string_conversions.h" 112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "base/values.h" 12010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles)#include "content/child/child_process.h" 13a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream.h" 14a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream_audio_source.h" 15a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream_source.h" 16a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/media_stream_video_track.h" 17a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)#include "content/renderer/media/mock_media_stream_video_source.h" 185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/mock_peer_connection_impl.h" 195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/mock_web_rtc_peer_connection_handler_client.h" 202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/peer_connection_tracker.h" 212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "content/renderer/media/rtc_media_constraints.h" 225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "content/renderer/media/rtc_peer_connection_handler.h" 23cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles)#include "content/renderer/media/webrtc/mock_peer_connection_dependency_factory.h" 245d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles)#include "content/renderer/media/webrtc/webrtc_local_audio_track_adapter.h" 25bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch#include "content/renderer/media/webrtc_audio_capturer.h" 262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "testing/gmock/include/gmock/gmock.h" 275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)#include "testing/gtest/include/gtest/gtest.h" 28868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaConstraints.h" 29868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStream.h" 30868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamSource.h" 31868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebMediaStreamTrack.h" 32868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCConfiguration.h" 33868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCDTMFSenderHandler.h" 34868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCDataChannelHandler.h" 357d4cd473f85ac64c3747c96c277f9e506a0d2246Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h" 36868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCICECandidate.h" 37868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h" 38868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCSessionDescription.h" 39868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCSessionDescriptionRequest.h" 40868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCStatsRequest.h" 41868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebRTCVoidRequest.h" 42868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles)#include "third_party/WebKit/public/platform/WebURL.h" 432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)#include "third_party/libjingle/source/talk/app/webrtc/peerconnectioninterface.h" 445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kDummySdp[] = "dummy sdp"; 465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)static const char kDummySdpType[] = "dummy type"; 475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 48f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)using blink::WebRTCPeerConnectionHandlerClient; 492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::NiceMock; 502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)using testing::_; 51c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)using testing::Ref; 522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)namespace content { 545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockRTCStatsResponse : public LocalRTCStatsResponse { 562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRTCStatsResponse() 582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : report_count_(0), 592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) statistic_count_(0) { 602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 62f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual size_t addReport(blink::WebString type, 63f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString id, 642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) double timestamp) OVERRIDE { 652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++report_count_; 662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return report_count_; 672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void addStatistic(size_t report, 70f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString name, blink::WebString value) 712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE { 722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ++statistic_count_; 732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int report_count() const { return report_count_; } 752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int report_count_; 782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) int statistic_count_; 792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 81f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles)// Mocked wrapper for blink::WebRTCStatsRequest 822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockRTCStatsRequest : public LocalRTCStatsRequest { 832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRTCStatsRequest() 852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) : has_selector_(false), 862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_succeeded_called_(false) {} 872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual bool hasSelector() const OVERRIDE { 892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return has_selector_; 902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 91f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) virtual blink::WebMediaStreamTrack component() const OVERRIDE { 922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return component_; 932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual scoped_refptr<LocalRTCStatsResponse> createResponse() OVERRIDE { 95868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) DCHECK(!response_.get()); 962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) response_ = new talk_base::RefCountedObject<MockRTCStatsResponse>(); 972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return response_; 982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void requestSucceeded(const LocalRTCStatsResponse* response) 1012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) OVERRIDE { 1022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(response, response_.get()); 1032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) request_succeeded_called_ = true; 1042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Function for setting whether or not a selector is available. 107f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) void setSelector(const blink::WebMediaStreamTrack& component) { 1082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) has_selector_ = true; 1092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) component_ = component; 1102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Function for inspecting the result of a stats request. 1132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MockRTCStatsResponse* result() { 1142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) if (request_succeeded_called_) { 1152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return response_.get(); 1162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } else { 1172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) return NULL; 1182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) } 1202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) private: 1222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool has_selector_; 123f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamTrack component_; 1242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsResponse> response_; 1252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) bool request_succeeded_called_; 1262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)class MockPeerConnectionTracker : public PeerConnectionTracker { 1292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) public: 1302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(UnregisterPeerConnection, 1312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler)); 132c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // TODO(jiayl): add coverage for the following methods 1332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(TrackCreateOffer, 1342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& constraints)); 1362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(TrackCreateAnswer, 1372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& constraints)); 1392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3(TrackSetSessionDescription, 1402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 141f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRTCSessionDescription& desc, 1422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source source)); 1432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3( 1442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackUpdateIce, 1452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const std::vector< 1472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::IceServer>& servers, 1482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const RTCMediaConstraints& options)); 1492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3(TrackAddIceCandidate, 1502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 151f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebRTCICECandidate& candidate, 1522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source source)); 1532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3(TrackAddStream, 1542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 155f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& stream, 1562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source source)); 1572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3(TrackRemoveStream, 1582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 159f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& stream, 1602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source source)); 1612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(TrackOnIceComplete, 1622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler)); 1632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD3(TrackCreateDataChannel, 1642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) const webrtc::DataChannelInterface* data_channel, 1662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) Source source)); 1672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(TrackStop, void(RTCPeerConnectionHandler* pc_handler)); 1682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(TrackSignalingStateChange, 1692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingState state)); 1712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2( 1722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackIceConnectionStateChange, 1732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionState state)); 1752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2( 1762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackIceGatheringStateChange, 1772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 1782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringState state)); 1792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD1(TrackOnRenegotiationNeeded, 1802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler)); 1812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) MOCK_METHOD2(TrackCreateDTMFSender, 182c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) void(RTCPeerConnectionHandler* pc_handler, 183f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStreamTrack& track)); 1842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)}; 1852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 1865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RTCPeerConnectionHandlerUnderTest : public RTCPeerConnectionHandler { 1875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 1885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RTCPeerConnectionHandlerUnderTest( 1892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient* client, 190cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) PeerConnectionDependencyFactory* dependency_factory) 1915821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) : RTCPeerConnectionHandler(client, dependency_factory) { 1925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1935821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 1945821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPeerConnectionImpl* native_peer_connection() { 1950529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch return static_cast<MockPeerConnectionImpl*>( 1960529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch RTCPeerConnectionHandler::native_peer_connection()); 1975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 1985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 1995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)class RTCPeerConnectionHandlerTest : public ::testing::Test { 2015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) public: 2025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) RTCPeerConnectionHandlerTest() : mock_peer_connection_(NULL) { 203010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) child_process_.reset(new ChildProcess()); 2045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) virtual void SetUp() { 2072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_client_.reset(new NiceMock<MockWebRTCPeerConnectionHandlerClient>()); 208cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) mock_dependency_factory_.reset(new MockPeerConnectionDependencyFactory()); 2095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_.reset( 2105821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) new RTCPeerConnectionHandlerUnderTest(mock_client_.get(), 2115821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_dependency_factory_.get())); 2122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_tracker_.reset(new NiceMock<MockPeerConnectionTracker>()); 213f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCConfiguration config; 214f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 2152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(pc_handler_->InitializeForTest(config, constraints, 2162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_tracker_.get())); 2175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_peer_connection_ = pc_handler_->native_peer_connection(); 2195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_peer_connection_); 2205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a WebKit local MediaStream. 223f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream CreateLocalMediaStream( 2245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& stream_label) { 2255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string video_track_label("video-label"); 2265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string audio_track_label("audio-label"); 2275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 228f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamSource audio_source; 229f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) audio_source.initialize(blink::WebString::fromUTF8(audio_track_label), 230f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamSource::TypeAudio, 231f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8("audio_track")); 232a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) audio_source.setExtraData(new MediaStreamAudioSource()); 233f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamSource video_source; 234f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) video_source.initialize(blink::WebString::fromUTF8(video_track_label), 235f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamSource::TypeVideo, 236f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString::fromUTF8("video_track")); 237effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch MockMediaStreamVideoSource* native_video_source = 2380529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new MockMediaStreamVideoSource(false); 239effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_source.setExtraData(native_video_source); 240effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch 241f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> audio_tracks( 2425821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(1)); 243bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch audio_tracks[0].initialize(audio_source.id(), audio_source); 244a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) audio_tracks[0].setExtraData( 245a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) new MediaStreamTrack( 246a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) WebRtcLocalAudioTrackAdapter::Create(audio_track_label, 247a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) NULL), 248a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) true)); 249f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> video_tracks( 2505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) static_cast<size_t>(1)); 251effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch blink::WebMediaConstraints constraints; 252effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch constraints.initialize(); 253effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch video_tracks[0] = MediaStreamVideoTrack::CreateVideoTrack( 254effb81e5f8246d0db0270817048dc992db66e9fbBen Murdoch native_video_source, constraints, 2550529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch MediaStreamVideoSource::ConstraintsCallback(), true); 256bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch 257f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream local_stream; 2585d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) local_stream.initialize(base::UTF8ToUTF16(stream_label), audio_tracks, 259bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch video_tracks); 260868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) local_stream.setExtraData( 2610529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch new MediaStream(local_stream)); 2625821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return local_stream; 2635821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Creates a remote MediaStream and adds it to the mocked native 2665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // peer connection. 2675821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> 2685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRemoteMockMediaStream(const std::string& stream_label, 2695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& video_track_label, 2705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) const std::string& audio_track_label) { 2712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> stream( 2725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_dependency_factory_->CreateLocalMediaStream(stream_label)); 2735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!video_track_label.empty()) { 274c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webrtc::VideoSourceInterface* source = NULL; 2752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<webrtc::VideoTrackInterface> video_track( 2765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_dependency_factory_->CreateLocalVideoTrack( 277c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_track_label, source)); 278868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stream->AddTrack(video_track.get()); 2795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2805821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) if (!audio_track_label.empty()) { 281bb1529ce867d8845a77ec7cdf3e3003ef1771a40Ben Murdoch scoped_refptr<WebRtcAudioCapturer> capturer; 2822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<webrtc::AudioTrackInterface> audio_track( 2835d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) WebRtcLocalAudioTrackAdapter::Create(audio_track_label, NULL)); 284868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) stream->AddTrack(audio_track.get()); 2855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 286868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) mock_peer_connection_->AddRemoteStream(stream.get()); 2875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) return stream; 2885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) } 2895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 290cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) base::MessageLoop message_loop_; 291010d83a9304c5a91596085d917d248abff47903aTorne (Richard Coles) scoped_ptr<ChildProcess> child_process_; 2925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<MockWebRTCPeerConnectionHandlerClient> mock_client_; 293cedac228d2dd51db4b79ea1e72c7f249408ee061Torne (Richard Coles) scoped_ptr<MockPeerConnectionDependencyFactory> mock_dependency_factory_; 2942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_ptr<NiceMock<MockPeerConnectionTracker> > mock_tracker_; 2955821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<RTCPeerConnectionHandlerUnderTest> pc_handler_; 2965821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 2975821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // Weak reference to the mocked native peer connection implementation. 2985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) MockPeerConnectionImpl* mock_peer_connection_; 2995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)}; 3005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, Destruct) { 3022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), UnregisterPeerConnection(pc_handler_.get())) 3032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) .Times(1); 3042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.reset(NULL); 3052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 3062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, CreateOffer) { 308f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCSessionDescriptionRequest request; 309f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints options; 3102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackCreateOffer(pc_handler_.get(), _)); 3112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 312f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so 3135821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the |reqest| requestSucceeded can be tested? Currently the |request| object 3145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can not be initialized from a unit test. 3155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL); 3165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->createOffer(request, options); 3175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL); 3185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, CreateAnswer) { 321f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCSessionDescriptionRequest request; 322f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints options; 3232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackCreateAnswer(pc_handler_.get(), _)); 324f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) // TODO(perkj): Can blink::WebRTCSessionDescriptionRequest be changed so 3255821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // the |reqest| requestSucceeded can be tested? Currently the |request| object 3265821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // can not be initialized from a unit test. 3275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_FALSE(mock_peer_connection_->created_session_description() != NULL); 3285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->createAnswer(request, options); 3295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(mock_peer_connection_->created_session_description() != NULL); 3305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3315821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3325821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, setLocalDescription) { 333f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCVoidRequest request; 334f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCSessionDescription description; 335c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) description.initialize(kDummySdpType, kDummySdp); 3362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PeerConnectionTracker::TrackSetSessionDescription is expected to be called 3372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before |mock_peer_connection| is called. 3382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 3392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 340c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TrackSetSessionDescription(pc_handler_.get(), Ref(description), 3412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_LOCAL)); 3422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_peer_connection_, SetLocalDescription(_, _)); 3432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3445821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->setLocalDescription(request, description); 3455821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(description.type(), pc_handler_->localDescription().type()); 3465821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(description.sdp(), pc_handler_->localDescription().sdp()); 3475821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3485821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sdp_string; 3495821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_peer_connection_->local_description() != NULL); 3505821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdpType, mock_peer_connection_->local_description()->type()); 3515821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_peer_connection_->local_description()->ToString(&sdp_string); 3525821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdp, sdp_string); 3535821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3545821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3555821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, setRemoteDescription) { 356f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCVoidRequest request; 357f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCSessionDescription description; 358c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) description.initialize(kDummySdpType, kDummySdp); 359c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 3602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // PeerConnectionTracker::TrackSetSessionDescription is expected to be called 3612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // before |mock_peer_connection| is called. 3622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 3632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 364c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) TrackSetSessionDescription(pc_handler_.get(), Ref(description), 3652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_REMOTE)); 3662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_peer_connection_, SetRemoteDescription(_, _)); 3672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3685821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->setRemoteDescription(request, description); 3695821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(description.type(), pc_handler_->remoteDescription().type()); 3705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(description.sdp(), pc_handler_->remoteDescription().sdp()); 3715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string sdp_string; 3735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) ASSERT_TRUE(mock_peer_connection_->remote_description() != NULL); 3745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdpType, mock_peer_connection_->remote_description()->type()); 3755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_peer_connection_->remote_description()->ToString(&sdp_string); 3765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdp, sdp_string); 3775821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3785821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3795821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, updateICE) { 380f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCConfiguration config; 381f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 3825821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackUpdateIce(pc_handler_.get(), _, _)); 3845821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // TODO(perkj): Test that the parameters in |config| can be translated when a 3855821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // WebRTCConfiguration can be constructed. It's WebKit class and can't be 3865821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) // initialized from a test. 3875821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc_handler_->updateICE(config, constraints)); 3885821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 3895821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 3905821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, addICECandidate) { 391f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebRTCICECandidate candidate; 3925821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) candidate.initialize(kDummySdp, "mid", 1); 3932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 3942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 3952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackAddIceCandidate(pc_handler_.get(), 3962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::Ref(candidate), 3972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_REMOTE)); 3985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc_handler_->addICECandidate(candidate)); 3995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdp, mock_peer_connection_->ice_sdp()); 4005821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, mock_peer_connection_->sdp_mline_index()); 4015821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("mid", mock_peer_connection_->sdp_mid()); 4025821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4035821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4045821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, addAndRemoveStream) { 4055821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string stream_label = "local_stream"; 406f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream local_stream( 4075821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) CreateLocalMediaStream(stream_label)); 408f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 4095821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 4112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackAddStream(pc_handler_.get(), 4122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::Ref(local_stream), 4132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_LOCAL)); 4142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 4152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackRemoveStream(pc_handler_.get(), 4162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::Ref(local_stream), 4172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_LOCAL)); 4185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints)); 4195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); 4205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, 4212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size()); 4225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1u, 4232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size()); 4245821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 4250529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch EXPECT_FALSE(pc_handler_->addStream(local_stream, constraints)); 4260529e5d033099cbfc42635f6f6183833b09dff6eBen Murdoch 4275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->removeStream(local_stream); 4285821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(0u, mock_peer_connection_->local_streams()->count()); 4295821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 4305821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 431a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, addStreamWithStoppedAudioAndVideoTrack) { 432a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) std::string stream_label = "local_stream"; 433a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebMediaStream local_stream( 434a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) CreateLocalMediaStream(stream_label)); 435a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebMediaConstraints constraints; 436a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 437a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 438a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_stream.audioTracks(audio_tracks); 439a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaStreamAudioSource* native_audio_source = 440a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<MediaStreamAudioSource*>( 441a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) audio_tracks[0].source().extraData()); 442a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) native_audio_source->StopSource(); 443a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 444a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 445a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) local_stream.videoTracks(video_tracks); 446a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) MediaStreamVideoSource* native_video_source = 447a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) static_cast<MediaStreamVideoSource*>( 448a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) video_tracks[0].source().extraData()); 449a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) native_video_source->StopSource(); 450a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 451a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_TRUE(pc_handler_->addStream(local_stream, constraints)); 452a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); 453a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ( 454a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1u, 455a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mock_peer_connection_->local_streams()->at(0)->GetAudioTracks().size()); 456a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) EXPECT_EQ( 457a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 1u, 458a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) mock_peer_connection_->local_streams()->at(0)->GetVideoTracks().size()); 459a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles)} 460a1401311d1ab56c4ed0a474bd38c108f75cb0cd9Torne (Richard Coles) 4612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, GetStatsNoSelector) { 4622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsRequest> request( 4632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new talk_base::RefCountedObject<MockRTCStatsRequest>()); 4642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->getStats(request.get()); 4652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that callback gets executed synchronously by mock. 4662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(request->result()); 4672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LT(1, request->result()->report_count()); 4682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, GetStatsAfterClose) { 4712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsRequest> request( 4722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new talk_base::RefCountedObject<MockRTCStatsRequest>()); 4732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->stop(); 4742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->getStats(request.get()); 4752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Note that callback gets executed synchronously by mock. 4762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_TRUE(request->result()); 4772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_LT(1, request->result()->report_count()); 4782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithLocalSelector) { 481f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream local_stream( 4822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateLocalMediaStream("local_stream")); 483f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 4842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->addStream(local_stream, constraints); 485f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> tracks; 486bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch local_stream.audioTracks(tracks); 4872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LE(1ul, tracks.size()); 4882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsRequest> request( 4902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new talk_base::RefCountedObject<MockRTCStatsRequest>()); 4911e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) request->setSelector(tracks[0]); 4922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->getStats(request.get()); 4932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, request->result()->report_count()); 4942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 4952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 4962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithRemoteSelector) { 4972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> stream( 4982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) AddRemoteMockMediaStream("remote_stream", "video", "audio")); 499868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnAddStream(stream.get()); 500f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& remote_stream = mock_client_->remote_stream(); 5012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 502f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> tracks; 503bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch remote_stream.audioTracks(tracks); 5042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LE(1ul, tracks.size()); 5052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsRequest> request( 5072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new talk_base::RefCountedObject<MockRTCStatsRequest>()); 5081e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) request->setSelector(tracks[0]); 5092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->getStats(request.get()); 5102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(1, request->result()->report_count()); 5112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, GetStatsWithBadSelector) { 5142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // The setup is the same as GetStatsWithLocalSelector, but the stream is not 5152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // added to the PeerConnection. 516f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream local_stream( 5172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) CreateLocalMediaStream("local_stream_2")); 518f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 519f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> tracks; 5202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 521bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch local_stream.audioTracks(tracks); 522f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStreamTrack component = tracks[0]; 5232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) mock_peer_connection_->SetGetStatsResult(false); 5242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) scoped_refptr<MockRTCStatsRequest> request( 5262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new talk_base::RefCountedObject<MockRTCStatsRequest>()); 5271e9bf3e0803691d0a228da41fc608347b6db4340Torne (Richard Coles) request->setSelector(component); 5282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->getStats(request.get()); 5292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(0, request->result()->report_count()); 5302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnSignalingChange) { 5332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 5342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::SignalingState new_state = 5362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::kHaveRemoteOffer; 5372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( 5382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); 5402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( 5412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemoteOffer)); 5422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnSignalingChange(new_state); 5432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kHaveLocalPrAnswer; 5452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( 5462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer)); 5482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( 5492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalPrAnswer)); 5502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnSignalingChange(new_state); 5512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kHaveLocalOffer; 5532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( 5542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer)); 5562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( 5572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveLocalOffer)); 5582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnSignalingChange(new_state); 5592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kHaveRemotePrAnswer; 5612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( 5622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer)); 5642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( 5652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateHaveRemotePrAnswer)); 5662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnSignalingChange(new_state); 5672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kClosed; 5692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackSignalingStateChange( 5702a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5712a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateClosed)); 5722a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeSignalingState( 5732a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::SignalingStateClosed)); 5742a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnSignalingChange(new_state); 5752a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 5762a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnIceConnectionChange) { 5782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 5792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5802a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::IceConnectionState new_state = 5812a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::kIceConnectionNew; 5822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 5832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5842a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting)); 5852a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 5862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateStarting)); 5872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 5882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5892a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionChecking; 5902a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 5912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 5922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking)); 5932a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 5942a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateChecking)); 5952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 5962a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 5972a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionConnected; 5982a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 5992a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6002a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected)); 6012a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 6022a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateConnected)); 6032a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 6042a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6052a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionCompleted; 6062a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 6072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted)); 6092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 6102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted)); 6112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 6122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionFailed; 6142a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 6152a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6162a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed)); 6172a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 6182a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateFailed)); 6192a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 6202a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6212a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionDisconnected; 6222a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 6232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected)); 6252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 6262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateDisconnected)); 6272a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 6282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceConnectionClosed; 6302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceConnectionStateChange( 6312a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed)); 6332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEConnectionState( 6342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEConnectionStateClosed)); 6352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceConnectionChange(new_state); 6362a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 6372a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnIceGatheringChange) { 6392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 6402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange( 6412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew)); 6432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState( 6442a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateNew)); 6452a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange( 6462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering)); 6482a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState( 6492a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateGathering)); 6502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackIceGatheringStateChange( 6512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 6522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete)); 6532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didChangeICEGatheringState( 6542a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete)); 6552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::IceGatheringState new_state = 6572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) webrtc::PeerConnectionInterface::kIceGatheringNew; 6582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceGatheringChange(new_state); 6592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceGatheringGathering; 6612a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceGatheringChange(new_state); 6622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) new_state = webrtc::PeerConnectionInterface::kIceGatheringComplete; 6642a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->OnIceGatheringChange(new_state); 6652a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6662a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) // Check NULL candidate after ice gathering is completed. 6672a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", mock_client_->candidate_mid()); 6682a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(-1, mock_client_->candidate_mlineindex()); 6692a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ("", mock_client_->candidate_sdp()); 6705821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6715821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6725821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnAddAndOnRemoveStream) { 6735821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) std::string remote_stream_label("remote_stream"); 6745821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> remote_stream( 6755821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) AddRemoteMockMediaStream(remote_stream_label, "video", "audio")); 6765821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 6772a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 6782a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackAddStream( 6792a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 680f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 6815d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)), 6822a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_REMOTE)); 6832a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didAddRemoteStream( 684f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 6855d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)))); 6862a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 6872a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), TrackRemoveStream( 6882a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_.get(), 689f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 6905d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)), 6912a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_REMOTE)); 6922a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didRemoveRemoteStream( 693f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 6945d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)))); 6952a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 696868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnAddStream(remote_stream.get()); 697868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnRemoveStream(remote_stream.get()); 6985821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 6995821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 700c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)// This test that WebKit is notified about remote track state changes. 701c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, RemoteTrackState) { 702c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string remote_stream_label("remote_stream"); 703c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> remote_stream( 704c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddRemoteMockMediaStream(remote_stream_label, "video", "audio")); 705c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 706c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) testing::InSequence sequence; 707c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didAddRemoteStream( 708f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 7095d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)))); 710868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnAddStream(remote_stream.get()); 711f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream(); 712c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 713f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 714c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_stream.audioTracks(audio_tracks); 715f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, 716c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) audio_tracks[0].source().readyState()); 717c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 718f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 719c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_stream.videoTracks(video_tracks); 720f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateLive, 721c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_tracks[0].source().readyState()); 722c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 723c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remote_stream->GetAudioTracks()[0]->set_state( 724c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webrtc::MediaStreamTrackInterface::kEnded); 725f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, 726c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) audio_tracks[0].source().readyState()); 727c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 728c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remote_stream->GetVideoTracks()[0]->set_state( 729c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webrtc::MediaStreamTrackInterface::kEnded); 730f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) EXPECT_EQ(blink::WebMediaStreamSource::ReadyStateEnded, 731c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) video_tracks[0].source().readyState()); 732c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 733c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 734c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddAudioTrackFromRemoteStream) { 735c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string remote_stream_label("remote_stream"); 736c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> remote_stream( 737c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddRemoteMockMediaStream(remote_stream_label, "video", "audio")); 738c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 739c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didAddRemoteStream( 740f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 7415d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)))); 742868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnAddStream(remote_stream.get()); 743f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream(); 744c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 745a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch { 746a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Test in a small scope so that |audio_tracks| don't hold on to destroyed 747a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // source later. 748a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebVector<blink::WebMediaStreamTrack> audio_tracks; 749a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webkit_stream.audioTracks(audio_tracks); 750a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1u, audio_tracks.size()); 751a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 752c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 753c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove the Webrtc audio track from the Webrtc MediaStream. 754c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<webrtc::AudioTrackInterface> webrtc_track = 755c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remote_stream->GetAudioTracks()[0].get(); 756868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_stream->RemoveTrack(webrtc_track.get()); 757a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch 758a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch { 759a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks1; 760a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webkit_stream.audioTracks(modified_audio_tracks1); 761a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0u, modified_audio_tracks1.size()); 762a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 763c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 764c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add the WebRtc audio track again. 765868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_stream->AddTrack(webrtc_track.get()); 766f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> modified_audio_tracks2; 767c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_stream.audioTracks(modified_audio_tracks2); 768c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, modified_audio_tracks2.size()); 769c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 770c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 771c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, RemoveAndAddVideoTrackFromRemoteStream) { 772c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) std::string remote_stream_label("remote_stream"); 773c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<webrtc::MediaStreamInterface> remote_stream( 774c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) AddRemoteMockMediaStream(remote_stream_label, "video", "video")); 775c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 776c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didAddRemoteStream( 777f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) testing::Property(&blink::WebMediaStream::id, 7785d1f7b1de12d16ceb2c938c56701a3e8bfa558f7Torne (Richard Coles) base::UTF8ToUTF16(remote_stream_label)))); 779868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) pc_handler_->OnAddStream(remote_stream.get()); 780f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) const blink::WebMediaStream& webkit_stream = mock_client_->remote_stream(); 781c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 782a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch { 783a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // Test in a small scope so that |video_tracks| don't hold on to destroyed 784a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch // source later. 785a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebVector<blink::WebMediaStreamTrack> video_tracks; 786a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webkit_stream.videoTracks(video_tracks); 787a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(1u, video_tracks.size()); 788a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 789c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 790c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Remove the Webrtc video track from the Webrtc MediaStream. 791c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) scoped_refptr<webrtc::VideoTrackInterface> webrtc_track = 792c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) remote_stream->GetVideoTracks()[0].get(); 793868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_stream->RemoveTrack(webrtc_track.get()); 794a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch { 795a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks1; 796a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch webkit_stream.videoTracks(modified_video_tracks1); 797a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch EXPECT_EQ(0u, modified_video_tracks1.size()); 798a02191e04bc25c4935f804f2c080ae28663d096dBen Murdoch } 799c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 800c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) // Add the WebRtc video track again. 801868fa2fe829687343ffae624259930155e16dbd8Torne (Richard Coles) remote_stream->AddTrack(webrtc_track.get()); 802f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> modified_video_tracks2; 803c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) webkit_stream.videoTracks(modified_video_tracks2); 804c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) EXPECT_EQ(1u, modified_video_tracks2.size()); 805c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles)} 806c2e0dbddbe15c98d52c4786dac06cb8952a8ae6dTorne (Richard Coles) 8072a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnIceCandidate) { 8082a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 8092a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 8102a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackAddIceCandidate(pc_handler_.get(), _, 8112a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_LOCAL)); 8122a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), didGenerateICECandidate(_)); 8132a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8145821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) scoped_ptr<webrtc::IceCandidateInterface> native_candidate( 8155821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) mock_dependency_factory_->CreateIceCandidate("mid", 1, kDummySdp)); 8165821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->OnIceCandidate(native_candidate.get()); 8175821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ("mid", mock_client_->candidate_mid()); 8185821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(1, mock_client_->candidate_mlineindex()); 8195821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) EXPECT_EQ(kDummySdp, mock_client_->candidate_sdp()); 8205821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8215821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8225821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, OnRenegotiationNeeded) { 8232a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::InSequence sequence; 8242a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 8252a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackOnRenegotiationNeeded(pc_handler_.get())); 8262a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_client_.get(), negotiationNeeded()); 8275821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) pc_handler_->OnRenegotiationNeeded(); 8282a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8292a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8302a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, CreateDataChannel) { 831f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebString label = "d1"; 8322a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 8332a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackCreateDataChannel(pc_handler_.get(), 8342a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::NotNull(), 8352a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) PeerConnectionTracker::SOURCE_LOCAL)); 836f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebRTCDataChannelHandler> channel( 837f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) pc_handler_->createDataChannel("d1", blink::WebRTCDataChannelInit())); 8382a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(channel.get() != NULL); 8392a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_EQ(label, channel->label()); 8402a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)} 8412a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8422a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles)TEST_F(RTCPeerConnectionHandlerTest, CreateDtmfSender) { 8432a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) std::string stream_label = "local_stream"; 844f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaStream local_stream(CreateLocalMediaStream(stream_label)); 845f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebMediaConstraints constraints; 8462a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->addStream(local_stream, constraints); 8472a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 848f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) blink::WebVector<blink::WebMediaStreamTrack> tracks; 849bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch local_stream.videoTracks(tracks); 8502a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8512a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LE(1ul, tracks.size()); 8522a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_FALSE(pc_handler_->createDTMFSender(tracks[0])); 8532a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 854bbcdd45c55eb7c4641ab97aef9889b0fc828e7d3Ben Murdoch local_stream.audioTracks(tracks); 8552a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) ASSERT_LE(1ul, tracks.size()); 8562a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 8572a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_CALL(*mock_tracker_.get(), 8582a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) TrackCreateDTMFSender(pc_handler_.get(), 8592a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) testing::Ref(tracks[0]))); 8602a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) 861f2477e01787aa58f445919b809d89e252beef54fTorne (Richard Coles) scoped_ptr<blink::WebRTCDTMFSenderHandler> sender( 8622a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) pc_handler_->createDTMFSender(tracks[0])); 8632a99a7e74a7f215066514fe81d2bfa6639d9edddTorne (Richard Coles) EXPECT_TRUE(sender.get()); 8645821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} 8655821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles) 8665821806d5e7f356e8fa4b058a389a808ea183019Torne (Richard Coles)} // namespace content 867