Index: content/renderer/media/peer_connection_handler_jsep_unittest.cc |
diff --git a/content/renderer/media/peer_connection_handler_jsep_unittest.cc b/content/renderer/media/peer_connection_handler_jsep_unittest.cc |
new file mode 100644 |
index 0000000000000000000000000000000000000000..03f3eb6a3f16d7042666f3a5f926db941354ae61 |
--- /dev/null |
+++ b/content/renderer/media/peer_connection_handler_jsep_unittest.cc |
@@ -0,0 +1,231 @@ |
+// Copyright (c) 2012 The Chromium Authors. All rights reserved. |
+// Use of this source code is governed by a BSD-style license that can be |
+// found in the LICENSE file. |
+ |
+#include <string> |
+ |
+#include "base/memory/scoped_ptr.h" |
+#include "base/message_loop.h" |
+#include "base/utf_string_conversions.h" |
+#include "content/renderer/media/mock_media_stream_dependency_factory.h" |
+#include "content/renderer/media/mock_media_stream_impl.h" |
+#include "content/renderer/media/mock_web_peer_connection_00_handler_client.h" |
+#include "content/renderer/media/mock_peer_connection_impl.h" |
+#include "content/renderer/media/peer_connection_handler_jsep.h" |
+#include "content/renderer/media/rtc_video_decoder.h" |
+#include "jingle/glue/thread_wrapper.h" |
+#include "testing/gtest/include/gtest/gtest.h" |
+#include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebICECandidateDescriptor.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebICEOptions.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaHints.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamDescriptor.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStreamSource.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebSessionDescriptionDescriptor.h" |
+#include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebString.h" |
+ |
+namespace webrtc { |
+ |
+class MockVideoRendererWrapper : public VideoRendererWrapperInterface { |
+ public: |
+ virtual cricket::VideoRenderer* renderer() OVERRIDE { return NULL; } |
+ |
+ protected: |
+ virtual ~MockVideoRendererWrapper() {} |
+}; |
+ |
+} // namespace webrtc |
+ |
+TEST(PeerConnectionHandlerJsepTest, Basic) { |
+ MessageLoop loop; |
+ |
+ scoped_ptr<WebKit::MockWebPeerConnection00HandlerClient> mock_client( |
+ new WebKit::MockWebPeerConnection00HandlerClient()); |
+ scoped_refptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl()); |
+ scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory( |
+ new MockMediaStreamDependencyFactory()); |
+ mock_dependency_factory->CreatePeerConnectionFactory(NULL, |
+ NULL, |
+ NULL, |
+ NULL, |
+ NULL); |
+ scoped_ptr<PeerConnectionHandlerJsep> pc_handler( |
+ new PeerConnectionHandlerJsep(mock_client.get(), |
+ mock_ms_impl.get(), |
+ mock_dependency_factory.get())); |
+ |
+ WebKit::WebString server_config( |
+ WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); |
+ WebKit::WebString username; |
+ pc_handler->initialize(server_config, username); |
+ EXPECT_TRUE(pc_handler->native_peer_connection_.get()); |
+ webrtc::MockPeerConnectionImpl* mock_peer_connection = |
+ static_cast<webrtc::MockPeerConnectionImpl*>( |
+ pc_handler->native_peer_connection_.get()); |
+ |
+ // Create offer. |
+ WebKit::WebMediaHints hints; |
+ hints.initialize(true, true); |
+ WebKit::WebSessionDescriptionDescriptor offer = |
+ pc_handler->createOffer(hints); |
+ EXPECT_FALSE(offer.isNull()); |
+ EXPECT_EQ(std::string(mock_peer_connection->kDummyOffer), |
+ UTF16ToUTF8(offer.initialSDP())); |
+ EXPECT_EQ(hints.audio(), mock_peer_connection->hint_audio()); |
+ EXPECT_EQ(hints.video(), mock_peer_connection->hint_video()); |
+ |
+ // Create answer. |
+ WebKit::WebString offer_string = "offer"; |
+ hints.reset(); |
+ hints.initialize(false, false); |
+ WebKit::WebSessionDescriptionDescriptor answer = |
+ pc_handler->createAnswer(offer_string, hints); |
+ EXPECT_FALSE(answer.isNull()); |
+ EXPECT_EQ(UTF16ToUTF8(offer_string), UTF16ToUTF8(answer.initialSDP())); |
+ EXPECT_EQ(UTF16ToUTF8(offer_string), mock_peer_connection->description_sdp()); |
+ EXPECT_EQ(hints.audio(), mock_peer_connection->hint_audio()); |
+ EXPECT_EQ(hints.video(), mock_peer_connection->hint_video()); |
+ |
+ // Set local description. |
+ PeerConnectionHandlerJsep::Action action = |
+ PeerConnectionHandlerJsep::ActionSDPOffer; |
+ WebKit::WebSessionDescriptionDescriptor description; |
+ WebKit::WebString sdp = "test sdp"; |
+ description.initialize(sdp); |
+ EXPECT_TRUE(pc_handler->setLocalDescription(action, description)); |
+ EXPECT_EQ(webrtc::PeerConnectionInterface::kOffer, |
+ mock_peer_connection->action()); |
+ EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->description_sdp()); |
+ |
+ // Get local description. |
+ description.reset(); |
+ description = pc_handler->localDescription(); |
+ EXPECT_FALSE(description.isNull()); |
+ EXPECT_EQ(UTF16ToUTF8(sdp), UTF16ToUTF8(description.initialSDP())); |
+ |
+ // Set remote description. |
+ action = PeerConnectionHandlerJsep::ActionSDPAnswer; |
+ sdp = "test sdp 2"; |
+ description.reset(); |
+ description.initialize(sdp); |
+ EXPECT_TRUE(pc_handler->setRemoteDescription(action, description)); |
+ EXPECT_EQ(webrtc::PeerConnectionInterface::kAnswer, |
+ mock_peer_connection->action()); |
+ EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->description_sdp()); |
+ |
+ // Get remote description. |
+ description.reset(); |
+ description = pc_handler->remoteDescription(); |
+ EXPECT_FALSE(description.isNull()); |
+ EXPECT_EQ(UTF16ToUTF8(sdp), UTF16ToUTF8(description.initialSDP())); |
+ |
+ // Start ICE. |
+ WebKit::WebICEOptions options; |
+ options.initialize(WebKit::WebICEOptions::CandidateTypeAll); |
+ EXPECT_TRUE(pc_handler->startIce(options)); |
+ EXPECT_EQ(webrtc::PeerConnectionInterface::kUseAll, |
+ mock_peer_connection->ice_options()); |
+ |
+ // Process ICE message. |
+ WebKit::WebICECandidateDescriptor candidate; |
+ WebKit::WebString label = "test label"; |
+ sdp = "test sdp"; |
+ candidate.initialize(label, sdp); |
+ EXPECT_TRUE(pc_handler->processIceMessage(candidate)); |
+ EXPECT_EQ(UTF16ToUTF8(label), mock_peer_connection->ice_label()); |
+ EXPECT_EQ(UTF16ToUTF8(sdp), mock_peer_connection->ice_sdp()); |
+ |
+ // Add stream. |
+ // TODO(grunell): Add an audio track as well. |
+ std::string stream_label("stream-label"); |
+ std::string video_track_label("video-label"); |
+ talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> local_video_track( |
+ mock_dependency_factory->CreateLocalVideoTrack(video_track_label, NULL)); |
+ mock_ms_impl->AddTrack(video_track_label, local_video_track); |
+ WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector( |
+ static_cast<size_t>(1)); |
+ source_vector[0].initialize(WebKit::WebString::fromUTF8(video_track_label), |
+ WebKit::WebMediaStreamSource::TypeVideo, |
+ WebKit::WebString::fromUTF8("RemoteVideo")); |
+ WebKit::WebMediaStreamDescriptor local_stream; |
+ local_stream.initialize(UTF8ToUTF16(stream_label), source_vector); |
+ pc_handler->addStream(local_stream); |
+ EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
+ EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
+ |
+ // On add stream. |
+ std::string remote_stream_label(stream_label); |
+ remote_stream_label += "-remote"; |
+ std::string remote_video_track_label(video_track_label); |
+ remote_video_track_label += "-remote"; |
+ // We use a local stream as a remote since for testing purposes we really |
+ // only need the MediaStreamInterface. |
+ talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> remote_stream( |
+ mock_dependency_factory->CreateLocalMediaStream(remote_stream_label)); |
+ talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> remote_video_track( |
+ mock_dependency_factory->CreateLocalVideoTrack(remote_video_track_label, |
+ NULL)); |
+ remote_video_track->set_enabled(true); |
+ remote_stream->AddTrack(remote_video_track); |
+ mock_peer_connection->AddRemoteStream(remote_stream); |
+ pc_handler->OnAddStream(remote_stream); |
+ EXPECT_EQ(remote_stream_label, mock_client->stream_label()); |
+ |
+ // Set renderer. |
+ talk_base::scoped_refptr<webrtc::MockVideoRendererWrapper> renderer( |
+ new talk_base::RefCountedObject<webrtc::MockVideoRendererWrapper>()); |
+ pc_handler->SetVideoRenderer(remote_stream_label, renderer); |
+ EXPECT_EQ(renderer, static_cast<webrtc::MockLocalVideoTrack*>( |
+ remote_video_track.get())->renderer()); |
+ |
+ // Remove stream. |
+ WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( |
+ static_cast<size_t>(0)); |
+ pc_handler->removeStream(local_stream); |
+ EXPECT_EQ("", mock_peer_connection->stream_label()); |
+ mock_peer_connection->ClearStreamChangesCommitted(); |
+ EXPECT_TRUE(!mock_peer_connection->stream_changes_committed()); |
+ |
+ // On remove stream. |
+ pc_handler->OnRemoveStream(remote_stream); |
+ EXPECT_TRUE(mock_client->stream_label().empty()); |
+ |
+ // Add stream again. |
+ pc_handler->addStream(local_stream); |
+ EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
+ EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
+ |
+ // On state change. |
+ mock_peer_connection->SetReadyState(webrtc::PeerConnectionInterface::kActive); |
+ webrtc::PeerConnectionObserver::StateType state = |
+ webrtc::PeerConnectionObserver::kReadyState; |
+ pc_handler->OnStateChange(state); |
+ EXPECT_EQ(WebKit::WebPeerConnection00HandlerClient::ReadyStateActive, |
+ mock_client->ready_state()); |
+ |
+ // On ICE candidate. |
+ std::string candidate_label = "test label"; |
+ std::string candidate_sdp = "test sdp"; |
+ webrtc::IceCandidateInterface* native_candidate = |
+ mock_dependency_factory->CreateIceCandidate(candidate_label, |
+ candidate_sdp); |
+ pc_handler->OnIceCandidate(native_candidate); |
+ EXPECT_EQ(candidate_label, mock_client->candidate_label()); |
+ EXPECT_EQ(candidate_sdp, mock_client->candidate_sdp()); |
+ EXPECT_TRUE(mock_client->more_to_follow()); |
+ |
+ // On ICE complete. |
+ pc_handler->OnIceComplete(); |
+ EXPECT_TRUE(mock_client->candidate_label().empty()); |
+ EXPECT_TRUE(mock_client->candidate_sdp().empty()); |
+ EXPECT_FALSE(mock_client->more_to_follow()); |
+ |
+ // Stop. |
+ pc_handler->stop(); |
+ EXPECT_FALSE(pc_handler->native_peer_connection_.get()); |
+ |
+ // PC handler is expected to be deleted when stop calls |
+ // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of |
+ // in the mock. |
+ pc_handler.reset(); |
+} |