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