OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 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 | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <string> | 5 #include <string> |
6 | 6 |
7 #include "base/memory/scoped_ptr.h" | 7 #include "base/memory/scoped_ptr.h" |
8 #include "base/message_loop.h" | 8 #include "base/message_loop.h" |
9 #include "base/utf_string_conversions.h" | 9 #include "base/utf_string_conversions.h" |
| 10 #include "content/renderer/media/media_stream_extra_data.h" |
10 #include "content/renderer/media/mock_media_stream_dependency_factory.h" | 11 #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_handler_client.h" | 12 #include "content/renderer/media/mock_web_peer_connection_handler_client.h" |
13 #include "content/renderer/media/mock_peer_connection_impl.h" | 13 #include "content/renderer/media/mock_peer_connection_impl.h" |
14 #include "content/renderer/media/peer_connection_handler.h" | 14 #include "content/renderer/media/peer_connection_handler.h" |
15 #include "content/renderer/media/rtc_video_decoder.h" | 15 #include "content/renderer/media/rtc_video_decoder.h" |
16 #include "jingle/glue/thread_wrapper.h" | 16 #include "jingle/glue/thread_wrapper.h" |
17 #include "testing/gtest/include/gtest/gtest.h" | 17 #include "testing/gtest/include/gtest/gtest.h" |
18 #include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h" | 18 #include "third_party/libjingle/source/talk/app/webrtc/peerconnection.h" |
19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amDescriptor.h" | 19 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amDescriptor.h" |
20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amSource.h" | 20 #include "third_party/WebKit/Source/WebKit/chromium/public/platform/WebMediaStre
amSource.h" |
21 | 21 |
22 namespace webrtc { | 22 class PeerConnectionHandlerUnderTest : public PeerConnectionHandler { |
| 23 public: |
| 24 PeerConnectionHandlerUnderTest( |
| 25 WebKit::MockWebPeerConnectionHandlerClient* client, |
| 26 MediaStreamDependencyFactory* dependency_factory) |
| 27 : PeerConnectionHandler(client, dependency_factory) { |
| 28 } |
23 | 29 |
24 class MockVideoRendererWrapper : public VideoRendererWrapperInterface { | 30 webrtc::MockPeerConnectionImpl* native_peer_connection() { |
25 public: | 31 return static_cast<webrtc::MockPeerConnectionImpl*>( |
26 virtual cricket::VideoRenderer* renderer() OVERRIDE { return NULL; } | 32 native_peer_connection_.get()); |
27 | 33 } |
28 protected: | |
29 virtual ~MockVideoRendererWrapper() {} | |
30 }; | 34 }; |
31 | 35 |
32 } // namespace webrtc | 36 class PeerConnectionHandlerTest : public ::testing::Test { |
| 37 public: |
| 38 PeerConnectionHandlerTest() : mock_peer_connection_(NULL) { |
| 39 } |
33 | 40 |
34 TEST(PeerConnectionHandlerTest, WebMediaStreamDescriptorMemoryTest) { | 41 void SetUp() { |
| 42 mock_client_.reset(new WebKit::MockWebPeerConnectionHandlerClient()); |
| 43 mock_dependency_factory_.reset( |
| 44 new MockMediaStreamDependencyFactory(NULL)); |
| 45 mock_dependency_factory_->CreatePeerConnectionFactory(NULL, |
| 46 NULL, |
| 47 NULL, |
| 48 NULL, |
| 49 NULL); |
| 50 pc_handler_.reset( |
| 51 new PeerConnectionHandlerUnderTest(mock_client_.get(), |
| 52 mock_dependency_factory_.get())); |
| 53 |
| 54 WebKit::WebString server_config( |
| 55 WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); |
| 56 WebKit::WebString username; |
| 57 pc_handler_->initialize(server_config, username); |
| 58 |
| 59 mock_peer_connection_ = pc_handler_->native_peer_connection(); |
| 60 ASSERT_TRUE(mock_peer_connection_); |
| 61 } |
| 62 |
| 63 // Creates a WebKit local MediaStream. |
| 64 WebKit::WebMediaStreamDescriptor CreateLocalMediaStream( |
| 65 const std::string& stream_label) { |
| 66 std::string video_track_label("video-label"); |
| 67 std::string audio_track_label("audio-label"); |
| 68 |
| 69 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> native_stream( |
| 70 mock_dependency_factory_->CreateLocalMediaStream(stream_label)); |
| 71 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track( |
| 72 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label, |
| 73 NULL)); |
| 74 native_stream->AddTrack(audio_track); |
| 75 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track( |
| 76 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label, 0)); |
| 77 native_stream->AddTrack(video_track); |
| 78 |
| 79 WebKit::WebVector<WebKit::WebMediaStreamSource> audio_sources( |
| 80 static_cast<size_t>(1)); |
| 81 audio_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label), |
| 82 WebKit::WebMediaStreamSource::TypeAudio, |
| 83 WebKit::WebString::fromUTF8("audio_track")); |
| 84 WebKit::WebVector<WebKit::WebMediaStreamSource> video_sources( |
| 85 static_cast<size_t>(1)); |
| 86 video_sources[0].initialize(WebKit::WebString::fromUTF8(video_track_label), |
| 87 WebKit::WebMediaStreamSource::TypeVideo, |
| 88 WebKit::WebString::fromUTF8("video_track")); |
| 89 WebKit::WebMediaStreamDescriptor local_stream; |
| 90 local_stream.initialize(UTF8ToUTF16(stream_label), audio_sources, |
| 91 video_sources); |
| 92 local_stream.setExtraData(new MediaStreamExtraData(native_stream)); |
| 93 return local_stream; |
| 94 } |
| 95 |
| 96 // Creates a remote MediaStream and adds it to the mocked native |
| 97 // peer connection. |
| 98 talk_base::scoped_refptr<webrtc::MediaStreamInterface> |
| 99 AddRemoteMockMediaStream(const std::string& stream_label, |
| 100 const std::string& video_track_label, |
| 101 const std::string& audio_track_label) { |
| 102 // We use a local stream as a remote since for testing purposes we really |
| 103 // only need the MediaStreamInterface. |
| 104 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> stream( |
| 105 mock_dependency_factory_->CreateLocalMediaStream(stream_label)); |
| 106 if (!video_track_label.empty()) { |
| 107 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> video_track( |
| 108 mock_dependency_factory_->CreateLocalVideoTrack(video_track_label, |
| 109 0)); |
| 110 stream->AddTrack(video_track); |
| 111 } |
| 112 if (!audio_track_label.empty()) { |
| 113 talk_base::scoped_refptr<webrtc::LocalAudioTrackInterface> audio_track( |
| 114 mock_dependency_factory_->CreateLocalAudioTrack(audio_track_label, |
| 115 NULL)); |
| 116 stream->AddTrack(audio_track); |
| 117 } |
| 118 mock_peer_connection_->AddRemoteStream(stream); |
| 119 return stream; |
| 120 } |
| 121 |
| 122 MessageLoop loop_; |
| 123 scoped_ptr<WebKit::MockWebPeerConnectionHandlerClient> mock_client_; |
| 124 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory_; |
| 125 scoped_ptr<PeerConnectionHandlerUnderTest> pc_handler_; |
| 126 |
| 127 // Weak reference to the mocked native peer connection implementation. |
| 128 webrtc::MockPeerConnectionImpl* mock_peer_connection_; |
| 129 }; |
| 130 |
| 131 TEST_F(PeerConnectionHandlerTest, WebMediaStreamDescriptorMemoryTest) { |
35 std::string stream_label("stream-label"); | 132 std::string stream_label("stream-label"); |
36 std::string video_track_id("video-label"); | 133 std::string video_track_id("video-label"); |
37 const size_t kSizeOne = 1; | 134 const size_t kSizeOne = 1; |
38 | 135 |
39 WebKit::WebMediaStreamSource source; | 136 WebKit::WebMediaStreamSource source; |
40 source.initialize(WebKit::WebString::fromUTF8(video_track_id), | 137 source.initialize(WebKit::WebString::fromUTF8(video_track_id), |
41 WebKit::WebMediaStreamSource::TypeVideo, | 138 WebKit::WebMediaStreamSource::TypeVideo, |
42 WebKit::WebString::fromUTF8("RemoteVideo")); | 139 WebKit::WebString::fromUTF8("RemoteVideo")); |
43 | 140 |
44 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector(kSizeOne); | 141 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector(kSizeOne); |
45 source_vector[0] = source; | 142 source_vector[0] = source; |
46 | 143 |
47 WebKit::WebMediaStreamDescriptor local_stream; | 144 WebKit::WebMediaStreamDescriptor local_stream; |
48 local_stream.initialize(UTF8ToUTF16(stream_label), source_vector); | 145 local_stream.initialize(UTF8ToUTF16(stream_label), source_vector); |
49 | 146 |
50 WebKit::WebMediaStreamDescriptor copy_1(local_stream); | 147 WebKit::WebMediaStreamDescriptor copy_1(local_stream); |
51 { | 148 { |
52 WebKit::WebMediaStreamDescriptor copy_2(copy_1); | 149 WebKit::WebMediaStreamDescriptor copy_2(copy_1); |
53 } | 150 } |
54 } | 151 } |
55 | 152 |
56 TEST(PeerConnectionHandlerTest, Basic) { | 153 TEST_F(PeerConnectionHandlerTest, Basic) { |
57 MessageLoop loop; | |
58 | |
59 scoped_ptr<WebKit::MockWebPeerConnectionHandlerClient> mock_client( | |
60 new WebKit::MockWebPeerConnectionHandlerClient()); | |
61 scoped_ptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl()); | |
62 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory( | |
63 new MockMediaStreamDependencyFactory(NULL)); | |
64 mock_dependency_factory->CreatePeerConnectionFactory(NULL, | |
65 NULL, | |
66 NULL, | |
67 NULL, | |
68 NULL); | |
69 scoped_ptr<PeerConnectionHandler> pc_handler( | |
70 new PeerConnectionHandler(mock_client.get(), | |
71 mock_ms_impl.get(), | |
72 mock_dependency_factory.get())); | |
73 | |
74 WebKit::WebString server_config( | |
75 WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); | |
76 WebKit::WebString username; | |
77 pc_handler->initialize(server_config, username); | |
78 EXPECT_TRUE(pc_handler->native_peer_connection_.get()); | |
79 webrtc::MockPeerConnectionImpl* mock_peer_connection = | |
80 static_cast<webrtc::MockPeerConnectionImpl*>( | |
81 pc_handler->native_peer_connection_.get()); | |
82 | |
83 // TODO(grunell): Add an audio track as well. | |
84 std::string stream_label("stream-label"); | 154 std::string stream_label("stream-label"); |
85 std::string video_track_label("video-label"); | |
86 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> local_stream( | |
87 mock_dependency_factory->CreateLocalMediaStream(stream_label)); | |
88 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> local_video_track( | |
89 mock_dependency_factory->CreateLocalVideoTrack(video_track_label, 0)); | |
90 local_stream->AddTrack(local_video_track); | |
91 mock_ms_impl->AddLocalStream(local_stream); | |
92 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector( | |
93 static_cast<size_t>(1)); | |
94 source_vector[0].initialize(WebKit::WebString::fromUTF8(video_track_label), | |
95 WebKit::WebMediaStreamSource::TypeVideo, | |
96 WebKit::WebString::fromUTF8("RemoteVideo")); | |
97 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> local_streams( | 155 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> local_streams( |
98 static_cast<size_t>(1)); | 156 static_cast<size_t>(1)); |
99 local_streams[0].initialize(UTF8ToUTF16(stream_label), source_vector); | 157 local_streams[0] = CreateLocalMediaStream(stream_label); |
100 pc_handler->produceInitialOffer(local_streams); | 158 pc_handler_->produceInitialOffer(local_streams); |
101 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); | 159 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); |
102 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); | 160 EXPECT_TRUE(mock_peer_connection_->stream_changes_committed()); |
103 | 161 |
104 std::string message("message1"); | 162 std::string message("message1"); |
105 pc_handler->handleInitialOffer(WebKit::WebString::fromUTF8(message)); | 163 pc_handler_->handleInitialOffer(WebKit::WebString::fromUTF8(message)); |
106 EXPECT_EQ(message, mock_peer_connection->signaling_message()); | 164 EXPECT_EQ(message, mock_peer_connection_->signaling_message()); |
107 | 165 |
108 message = "message2"; | 166 message = "message2"; |
109 pc_handler->processSDP(WebKit::WebString::fromUTF8(message)); | 167 pc_handler_->processSDP(WebKit::WebString::fromUTF8(message)); |
110 EXPECT_EQ(message, mock_peer_connection->signaling_message()); | 168 EXPECT_EQ(message, mock_peer_connection_->signaling_message()); |
111 | 169 |
112 message = "message3"; | 170 message = "message3"; |
113 pc_handler->OnSignalingMessage(message); | 171 pc_handler_->OnSignalingMessage(message); |
114 EXPECT_EQ(message, mock_client->sdp()); | 172 EXPECT_EQ(message, mock_client_->sdp()); |
115 | 173 |
116 std::string remote_stream_label(stream_label); | 174 std::string remote_stream_label("remote_stream"); |
117 remote_stream_label += "-remote"; | 175 talk_base::scoped_refptr<webrtc::MediaStreamInterface> remote_stream( |
118 std::string remote_video_track_label(video_track_label); | 176 AddRemoteMockMediaStream(remote_stream_label, "video_track", |
119 remote_video_track_label += "-remote"; | 177 "audio_track")); |
120 // We use a local stream as a remote since for testing purposes we really | 178 pc_handler_->OnAddStream(remote_stream); |
121 // only need the MediaStreamInterface. | 179 EXPECT_EQ(remote_stream_label, mock_client_->stream_label()); |
122 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> remote_stream( | |
123 mock_dependency_factory->CreateLocalMediaStream(remote_stream_label)); | |
124 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> remote_video_track( | |
125 mock_dependency_factory->CreateLocalVideoTrack(remote_video_track_label, | |
126 0)); | |
127 remote_video_track->set_enabled(true); | |
128 remote_stream->AddTrack(remote_video_track); | |
129 mock_peer_connection->AddRemoteStream(remote_stream); | |
130 pc_handler->OnAddStream(remote_stream); | |
131 EXPECT_EQ(remote_stream_label, mock_client->stream_label()); | |
132 | |
133 talk_base::scoped_refptr<webrtc::MockVideoRendererWrapper> renderer( | |
134 new talk_base::RefCountedObject<webrtc::MockVideoRendererWrapper>()); | |
135 pc_handler->SetRemoteVideoRenderer(remote_video_track_label, renderer); | |
136 EXPECT_EQ(renderer, remote_video_track->GetRenderer()); | |
137 | 180 |
138 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( | 181 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( |
139 static_cast<size_t>(0)); | 182 static_cast<size_t>(0)); |
140 pc_handler->processPendingStreams(empty_streams, local_streams); | 183 pc_handler_->processPendingStreams(empty_streams, local_streams); |
141 EXPECT_EQ("", mock_peer_connection->stream_label()); | 184 EXPECT_EQ("", mock_peer_connection_->stream_label()); |
142 mock_peer_connection->ClearStreamChangesCommitted(); | 185 mock_peer_connection_->ClearStreamChangesCommitted(); |
143 EXPECT_TRUE(!mock_peer_connection->stream_changes_committed()); | 186 EXPECT_TRUE(!mock_peer_connection_->stream_changes_committed()); |
144 | 187 |
145 pc_handler->OnRemoveStream(remote_stream); | 188 pc_handler_->OnRemoveStream(remote_stream); |
146 EXPECT_TRUE(mock_client->stream_label().empty()); | 189 EXPECT_TRUE(mock_client_->stream_label().empty()); |
147 | 190 |
148 pc_handler->processPendingStreams(local_streams, empty_streams); | 191 pc_handler_->processPendingStreams(local_streams, empty_streams); |
149 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); | 192 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); |
150 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); | 193 EXPECT_TRUE(mock_peer_connection_->stream_changes_committed()); |
151 | 194 |
152 pc_handler->stop(); | 195 pc_handler_->stop(); |
153 EXPECT_FALSE(pc_handler->native_peer_connection_.get()); | 196 EXPECT_FALSE(pc_handler_->native_peer_connection()); |
154 // PC handler is expected to be deleted when stop calls | 197 // PC handler is expected to be deleted when stop calls |
155 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of | 198 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of |
156 // in the mock. | 199 // in the mock. |
157 pc_handler.reset(); | 200 pc_handler_.reset(); |
158 } | 201 } |
OLD | NEW |