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/media_stream_extra_data.h" | |
11 #include "content/renderer/media/mock_media_stream_dependency_factory.h" | |
12 #include "content/renderer/media/mock_web_peer_connection_handler_client.h" | |
13 #include "content/renderer/media/mock_peer_connection_impl.h" | |
14 #include "content/renderer/media/peer_connection_handler.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/peerconnectioninterface.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" | |
21 | |
22 class PeerConnectionHandlerUnderTest : public PeerConnectionHandler { | |
23 public: | |
24 PeerConnectionHandlerUnderTest( | |
25 WebKit::MockWebPeerConnectionHandlerClient* client, | |
26 MediaStreamDependencyFactory* dependency_factory) | |
27 : PeerConnectionHandler(client, dependency_factory) { | |
28 } | |
29 | |
30 webrtc::MockPeerConnectionImpl* native_peer_connection() { | |
31 return static_cast<webrtc::MockPeerConnectionImpl*>( | |
32 native_peer_connection_.get()); | |
33 } | |
34 }; | |
35 | |
36 class PeerConnectionHandlerTest : public ::testing::Test { | |
37 public: | |
38 PeerConnectionHandlerTest() : mock_peer_connection_(NULL) { | |
39 } | |
40 | |
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) { | |
132 std::string stream_label("stream-label"); | |
133 std::string video_track_id("video-label"); | |
134 const size_t kSizeOne = 1; | |
135 | |
136 WebKit::WebMediaStreamSource source; | |
137 source.initialize(WebKit::WebString::fromUTF8(video_track_id), | |
138 WebKit::WebMediaStreamSource::TypeVideo, | |
139 WebKit::WebString::fromUTF8("RemoteVideo")); | |
140 | |
141 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector(kSizeOne); | |
142 source_vector[0] = source; | |
143 | |
144 WebKit::WebMediaStreamDescriptor local_stream; | |
145 local_stream.initialize(UTF8ToUTF16(stream_label), source_vector); | |
146 | |
147 WebKit::WebMediaStreamDescriptor copy_1(local_stream); | |
148 { | |
149 WebKit::WebMediaStreamDescriptor copy_2(copy_1); | |
150 } | |
151 } | |
152 | |
153 TEST_F(PeerConnectionHandlerTest, Basic) { | |
154 std::string stream_label("stream-label"); | |
155 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> local_streams( | |
156 static_cast<size_t>(1)); | |
157 local_streams[0] = CreateLocalMediaStream(stream_label); | |
158 pc_handler_->produceInitialOffer(local_streams); | |
159 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); | |
160 EXPECT_TRUE(mock_peer_connection_->stream_changes_committed()); | |
161 | |
162 std::string message("message1"); | |
163 pc_handler_->handleInitialOffer(WebKit::WebString::fromUTF8(message)); | |
164 EXPECT_EQ(message, mock_peer_connection_->signaling_message()); | |
165 | |
166 message = "message2"; | |
167 pc_handler_->processSDP(WebKit::WebString::fromUTF8(message)); | |
168 EXPECT_EQ(message, mock_peer_connection_->signaling_message()); | |
169 | |
170 message = "message3"; | |
171 pc_handler_->OnSignalingMessage(message); | |
172 EXPECT_EQ(message, mock_client_->sdp()); | |
173 | |
174 std::string remote_stream_label("remote_stream"); | |
175 talk_base::scoped_refptr<webrtc::MediaStreamInterface> remote_stream( | |
176 AddRemoteMockMediaStream(remote_stream_label, "video_track", | |
177 "audio_track")); | |
178 pc_handler_->OnAddStream(remote_stream); | |
179 EXPECT_EQ(remote_stream_label, mock_client_->stream_label()); | |
180 | |
181 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( | |
182 static_cast<size_t>(0)); | |
183 pc_handler_->processPendingStreams(empty_streams, local_streams); | |
184 EXPECT_EQ("", mock_peer_connection_->stream_label()); | |
185 mock_peer_connection_->ClearStreamChangesCommitted(); | |
186 EXPECT_TRUE(!mock_peer_connection_->stream_changes_committed()); | |
187 | |
188 pc_handler_->OnRemoveStream(remote_stream); | |
189 EXPECT_TRUE(mock_client_->stream_label().empty()); | |
190 | |
191 pc_handler_->processPendingStreams(local_streams, empty_streams); | |
192 EXPECT_EQ(stream_label, mock_peer_connection_->stream_label()); | |
193 EXPECT_TRUE(mock_peer_connection_->stream_changes_committed()); | |
194 | |
195 pc_handler_->stop(); | |
196 EXPECT_FALSE(pc_handler_->native_peer_connection()); | |
197 // PC handler is expected to be deleted when stop calls | |
198 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of | |
199 // in the mock. | |
200 pc_handler_.reset(); | |
201 } | |
OLD | NEW |