OLD | NEW |
(Empty) | |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. |
| 4 |
| 5 #include <string> |
| 6 |
| 7 #include "base/memory/scoped_ptr.h" |
| 8 #include "base/message_loop.h" |
| 9 #include "base/utf_string_conversions.h" |
| 10 #include "content/renderer/media/mock_media_stream_dependency_factory.h" |
| 11 #include "content/renderer/media/mock_media_stream_impl.h" |
| 12 #include "content/renderer/media/mock_web_peer_connection_00_handler_client.h" |
| 13 #include "content/renderer/media/mock_peer_connection_impl.h" |
| 14 #include "content/renderer/media/peer_connection_handler_jsep.h" |
| 15 #include "content/renderer/media/rtc_video_decoder.h" |
| 16 #include "jingle/glue/thread_wrapper.h" |
| 17 #include "testing/gtest/include/gtest/gtest.h" |
| 18 #include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h" |
| 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebICECandid
ateDescriptor.h" |
| 20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebICEOption
s.h" |
| 21 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaHint
s.h" |
| 22 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amDescriptor.h" |
| 23 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amSource.h" |
| 24 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSessionDe
scriptionDescriptor.h" |
| 25 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
| 26 |
| 27 namespace webrtc { |
| 28 |
| 29 class MockVideoRendererWrapper : public VideoRendererWrapperInterface { |
| 30 public: |
| 31 virtual cricket::VideoRenderer* renderer() OVERRIDE { return NULL; } |
| 32 |
| 33 protected: |
| 34 virtual ~MockVideoRendererWrapper() {} |
| 35 }; |
| 36 |
| 37 } // namespace webrtc |
| 38 |
| 39 TEST(PeerConnectionHandlerJsepTest, Basic) { |
| 40 MessageLoop loop; |
| 41 |
| 42 scoped_ptr<WebKit::MockWebPeerConnection00HandlerClient> mock_client( |
| 43 new WebKit::MockWebPeerConnection00HandlerClient()); |
| 44 scoped_refptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl()); |
| 45 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory( |
| 46 new MockMediaStreamDependencyFactory()); |
| 47 mock_dependency_factory->CreatePeerConnectionFactory(NULL, |
| 48 NULL, |
| 49 NULL, |
| 50 NULL, |
| 51 NULL); |
| 52 scoped_ptr<PeerConnectionHandlerJsep> pc_handler( |
| 53 new PeerConnectionHandlerJsep(mock_client.get(), |
| 54 mock_ms_impl.get(), |
| 55 mock_dependency_factory.get())); |
| 56 |
| 57 WebKit::WebString server_config( |
| 58 WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); |
| 59 WebKit::WebString username; |
| 60 pc_handler->initialize(server_config, username); |
| 61 EXPECT_TRUE(pc_handler->native_peer_connection_.get()); |
| 62 webrtc::MockPeerConnectionImpl* mock_peer_connection = |
| 63 static_cast<webrtc::MockPeerConnectionImpl*>( |
| 64 pc_handler->native_peer_connection_.get()); |
| 65 |
| 66 // Create offer. |
| 67 WebKit::WebMediaHints hints; |
| 68 hints.initialize(true, true); |
| 69 WebKit::WebSessionDescriptionDescriptor offer = |
| 70 pc_handler->createOffer(hints); |
| 71 EXPECT_FALSE(offer.isNull()); |
| 72 EXPECT_EQ(std::string(mock_peer_connection->kDummyOffer), |
| 73 UTF16ToUTF8(offer.initialSDP())); |
| 74 EXPECT_EQ(hints.audio(), mock_peer_connection->hint_audio()); |
| 75 EXPECT_EQ(hints.video(), mock_peer_connection->hint_video()); |
| 76 |
| 77 // Create answer. |
| 78 WebKit::WebString offer_string = "offer"; |
| 79 hints.reset(); |
| 80 hints.initialize(false, false); |
| 81 WebKit::WebSessionDescriptionDescriptor answer = |
| 82 pc_handler->createAnswer(offer_string, hints); |
| 83 EXPECT_FALSE(answer.isNull()); |
| 84 EXPECT_EQ(UTF16ToUTF8(offer_string), UTF16ToUTF8(answer.initialSDP())); |
| 85 EXPECT_EQ(UTF16ToUTF8(offer_string), mock_peer_connection->description_sdp()); |
| 86 EXPECT_EQ(hints.audio(), mock_peer_connection->hint_audio()); |
| 87 EXPECT_EQ(hints.video(), mock_peer_connection->hint_video()); |
| 88 |
| 89 // Set local description. |
| 90 PeerConnectionHandlerJsep::Action action = |
| 91 PeerConnectionHandlerJsep::ActionSDPOffer; |
| 92 WebKit::WebSessionDescriptionDescriptor description; |
| 93 WebKit::WebString sdp = "test sdp"; |
| 94 description.initialize(sdp); |
| 95 EXPECT_TRUE(pc_handler->setLocalDescription(action, description)); |
| 96 EXPECT_EQ(webrtc::PeerConnectionInterface::kOffer, |
| 97 mock_peer_connection->action()); |
| 98 EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->description_sdp()); |
| 99 |
| 100 // Get local description. |
| 101 description.reset(); |
| 102 description = pc_handler->localDescription(); |
| 103 EXPECT_FALSE(description.isNull()); |
| 104 EXPECT_EQ(UTF16ToUTF8(sdp), UTF16ToUTF8(description.initialSDP())); |
| 105 |
| 106 // Set remote description. |
| 107 action = PeerConnectionHandlerJsep::ActionSDPAnswer; |
| 108 sdp = "test sdp 2"; |
| 109 description.reset(); |
| 110 description.initialize(sdp); |
| 111 EXPECT_TRUE(pc_handler->setRemoteDescription(action, description)); |
| 112 EXPECT_EQ(webrtc::PeerConnectionInterface::kAnswer, |
| 113 mock_peer_connection->action()); |
| 114 EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->description_sdp()); |
| 115 |
| 116 // Get remote description. |
| 117 description.reset(); |
| 118 description = pc_handler->remoteDescription(); |
| 119 EXPECT_FALSE(description.isNull()); |
| 120 EXPECT_EQ(UTF16ToUTF8(sdp), UTF16ToUTF8(description.initialSDP())); |
| 121 |
| 122 // Start ICE. |
| 123 WebKit::WebICEOptions options; |
| 124 options.initialize(WebKit::WebICEOptions::CandidateTypeAll); |
| 125 EXPECT_TRUE(pc_handler->startIce(options)); |
| 126 EXPECT_EQ(webrtc::PeerConnectionInterface::kUseAll, |
| 127 mock_peer_connection->ice_options()); |
| 128 |
| 129 // Process ICE message. |
| 130 WebKit::WebICECandidateDescriptor candidate; |
| 131 WebKit::WebString label = "test label"; |
| 132 sdp = "test sdp"; |
| 133 candidate.initialize(label, sdp); |
| 134 EXPECT_TRUE(pc_handler->processIceMessage(candidate)); |
| 135 EXPECT_EQ(UTF16ToUTF8(label), mock_peer_connection->ice_label()); |
| 136 EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->ice_sdp()); |
| 137 |
| 138 // Add stream. |
| 139 // TODO(grunell): Add an audio track as well. |
| 140 std::string stream_label("stream-label"); |
| 141 std::string video_track_label("video-label"); |
| 142 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> local_video_track( |
| 143 mock_dependency_factory->CreateLocalVideoTrack(video_track_label, NULL)); |
| 144 mock_ms_impl->AddTrack(video_track_label, local_video_track); |
| 145 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector( |
| 146 static_cast<size_t>(1)); |
| 147 source_vector[0].initialize(WebKit::WebString::fromUTF8(video_track_label), |
| 148 WebKit::WebMediaStreamSource::TypeVideo, |
| 149 WebKit::WebString::fromUTF8("RemoteVideo")); |
| 150 WebKit::WebMediaStreamDescriptor local_stream; |
| 151 local_stream.initialize(UTF8ToUTF16(stream_label), source_vector); |
| 152 pc_handler->addStream(local_stream); |
| 153 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
| 154 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
| 155 |
| 156 // On add stream. |
| 157 std::string remote_stream_label(stream_label); |
| 158 remote_stream_label += "-remote"; |
| 159 std::string remote_video_track_label(video_track_label); |
| 160 remote_video_track_label += "-remote"; |
| 161 // We use a local stream as a remote since for testing purposes we really |
| 162 // only need the MediaStreamInterface. |
| 163 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> remote_stream( |
| 164 mock_dependency_factory->CreateLocalMediaStream(remote_stream_label)); |
| 165 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> remote_video_track( |
| 166 mock_dependency_factory->CreateLocalVideoTrack(remote_video_track_label, |
| 167 NULL)); |
| 168 remote_video_track->set_enabled(true); |
| 169 remote_stream->AddTrack(remote_video_track); |
| 170 mock_peer_connection->AddRemoteStream(remote_stream); |
| 171 pc_handler->OnAddStream(remote_stream); |
| 172 EXPECT_EQ(remote_stream_label, mock_client->stream_label()); |
| 173 |
| 174 // Set renderer. |
| 175 talk_base::scoped_refptr<webrtc::MockVideoRendererWrapper> renderer( |
| 176 new talk_base::RefCountedObject<webrtc::MockVideoRendererWrapper>()); |
| 177 pc_handler->SetVideoRenderer(remote_stream_label, renderer); |
| 178 EXPECT_EQ(renderer, static_cast<webrtc::MockLocalVideoTrack*>( |
| 179 remote_video_track.get())->renderer()); |
| 180 |
| 181 // Remove stream. |
| 182 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( |
| 183 static_cast<size_t>(0)); |
| 184 pc_handler->removeStream(local_stream); |
| 185 EXPECT_EQ("", mock_peer_connection->stream_label()); |
| 186 mock_peer_connection->ClearStreamChangesCommitted(); |
| 187 EXPECT_TRUE(!mock_peer_connection->stream_changes_committed()); |
| 188 |
| 189 // On remove stream. |
| 190 pc_handler->OnRemoveStream(remote_stream); |
| 191 EXPECT_TRUE(mock_client->stream_label().empty()); |
| 192 |
| 193 // Add stream again. |
| 194 pc_handler->addStream(local_stream); |
| 195 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
| 196 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
| 197 |
| 198 // On state change. |
| 199 mock_peer_connection->SetReadyState(webrtc::PeerConnectionInterface::kActive); |
| 200 webrtc::PeerConnectionObserver::StateType state = |
| 201 webrtc::PeerConnectionObserver::kReadyState; |
| 202 pc_handler->OnStateChange(state); |
| 203 EXPECT_EQ(WebKit::WebPeerConnection00HandlerClient::ReadyStateActive, |
| 204 mock_client->ready_state()); |
| 205 |
| 206 // On ICE candidate. |
| 207 std::string candidate_label = "test label"; |
| 208 std::string candidate_sdp = "test sdp"; |
| 209 scoped_ptr<webrtc::IceCandidateInterface> native_candidate( |
| 210 mock_dependency_factory->CreateIceCandidate(candidate_label, |
| 211 candidate_sdp)); |
| 212 pc_handler->OnIceCandidate(native_candidate.get()); |
| 213 EXPECT_EQ(candidate_label, mock_client->candidate_label()); |
| 214 EXPECT_EQ(candidate_sdp, mock_client->candidate_sdp()); |
| 215 EXPECT_TRUE(mock_client->more_to_follow()); |
| 216 |
| 217 // On ICE complete. |
| 218 pc_handler->OnIceComplete(); |
| 219 EXPECT_TRUE(mock_client->candidate_label().empty()); |
| 220 EXPECT_TRUE(mock_client->candidate_sdp().empty()); |
| 221 EXPECT_FALSE(mock_client->more_to_follow()); |
| 222 |
| 223 // Stop. |
| 224 pc_handler->stop(); |
| 225 EXPECT_FALSE(pc_handler->native_peer_connection_.get()); |
| 226 |
| 227 // PC handler is expected to be deleted when stop calls |
| 228 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of |
| 229 // in the mock. |
| 230 pc_handler.reset(); |
| 231 } |
OLD | NEW |