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/mock_media_stream_dependency_factory.h" | 10 #include "content/renderer/media/mock_media_stream_dependency_factory.h" |
11 #include "content/renderer/media/mock_media_stream_impl.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/webrtcv1/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 { |
| 23 |
| 24 class MockVideoRendererWrapper : public VideoRendererWrapperInterface { |
| 25 public: |
| 26 virtual cricket::VideoRenderer* renderer() OVERRIDE { return NULL; } |
| 27 |
| 28 protected: |
| 29 virtual ~MockVideoRendererWrapper() {} |
| 30 }; |
| 31 |
| 32 } // namespace webrtc |
| 33 |
22 TEST(PeerConnectionHandlerTest, Basic) { | 34 TEST(PeerConnectionHandlerTest, Basic) { |
23 MessageLoop loop; | 35 MessageLoop loop; |
24 | 36 |
25 scoped_ptr<WebKit::MockWebPeerConnectionHandlerClient> mock_client( | 37 scoped_ptr<WebKit::MockWebPeerConnectionHandlerClient> mock_client( |
26 new WebKit::MockWebPeerConnectionHandlerClient()); | 38 new WebKit::MockWebPeerConnectionHandlerClient()); |
27 scoped_refptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl()); | 39 scoped_refptr<MockMediaStreamImpl> mock_ms_impl(new MockMediaStreamImpl()); |
28 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory( | 40 scoped_ptr<MockMediaStreamDependencyFactory> mock_dependency_factory( |
29 new MockMediaStreamDependencyFactory()); | 41 new MockMediaStreamDependencyFactory()); |
30 mock_dependency_factory->CreatePeerConnectionFactory(NULL, NULL); | 42 mock_dependency_factory->CreatePeerConnectionFactory(NULL, |
| 43 NULL, |
| 44 NULL, |
| 45 NULL, |
| 46 NULL); |
31 scoped_ptr<PeerConnectionHandler> pc_handler( | 47 scoped_ptr<PeerConnectionHandler> pc_handler( |
32 new PeerConnectionHandler(mock_client.get(), | 48 new PeerConnectionHandler(mock_client.get(), |
33 mock_ms_impl.get(), | 49 mock_ms_impl.get(), |
34 mock_dependency_factory.get(), | 50 mock_dependency_factory.get())); |
35 NULL, | |
36 NULL, | |
37 NULL, | |
38 NULL)); | |
39 | 51 |
40 WebKit::WebString server_config( | 52 WebKit::WebString server_config( |
41 WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); | 53 WebKit::WebString::fromUTF8("STUN stun.l.google.com:19302")); |
42 WebKit::WebSecurityOrigin security_origin; | 54 WebKit::WebSecurityOrigin security_origin; |
43 pc_handler->initialize(server_config, security_origin); | 55 pc_handler->initialize(server_config, security_origin); |
44 EXPECT_TRUE(pc_handler->native_peer_connection_.get()); | 56 EXPECT_TRUE(pc_handler->native_peer_connection_.get()); |
45 webrtc::MockPeerConnectionImpl* mock_peer_connection = | 57 webrtc::MockPeerConnectionImpl* mock_peer_connection = |
46 static_cast<webrtc::MockPeerConnectionImpl*>( | 58 static_cast<webrtc::MockPeerConnectionImpl*>( |
47 pc_handler->native_peer_connection_.get()); | 59 pc_handler->native_peer_connection_.get()); |
48 EXPECT_EQ(static_cast<webrtc::PeerConnectionObserver*>(pc_handler.get()), | |
49 mock_peer_connection->observer()); | |
50 | 60 |
51 std::string label("label"); | 61 // TODO(grunell): Add an audio track as well. |
| 62 std::string stream_label("stream-label"); |
| 63 std::string video_track_label("video-label"); |
| 64 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> local_video_track( |
| 65 mock_dependency_factory->CreateLocalVideoTrack(video_track_label, NULL)); |
| 66 mock_ms_impl->AddTrack(video_track_label, local_video_track); |
52 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector( | 67 WebKit::WebVector<WebKit::WebMediaStreamSource> source_vector( |
53 static_cast<size_t>(1)); | 68 static_cast<size_t>(1)); |
54 source_vector[0].initialize(WebKit::WebString::fromUTF8(label), | 69 source_vector[0].initialize(WebKit::WebString::fromUTF8(video_track_label), |
55 WebKit::WebMediaStreamSource::TypeVideo, | 70 WebKit::WebMediaStreamSource::TypeVideo, |
56 WebKit::WebString::fromUTF8("RemoteVideo")); | 71 WebKit::WebString::fromUTF8("RemoteVideo")); |
57 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> pendingAddStreams( | 72 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> local_streams( |
58 static_cast<size_t>(1)); | 73 static_cast<size_t>(1)); |
59 pendingAddStreams[0].initialize(UTF8ToUTF16(label), source_vector); | 74 local_streams[0].initialize(UTF8ToUTF16(stream_label), source_vector); |
60 pc_handler->produceInitialOffer(pendingAddStreams); | 75 pc_handler->produceInitialOffer(local_streams); |
61 EXPECT_EQ(label, mock_ms_impl->video_label()); | 76 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
62 EXPECT_EQ(label, mock_peer_connection->stream_id()); | 77 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
63 EXPECT_TRUE(mock_peer_connection->video_stream()); | |
64 EXPECT_TRUE(mock_peer_connection->connected()); | |
65 EXPECT_TRUE(mock_peer_connection->video_capture_set()); | |
66 | 78 |
67 std::string message("message1"); | 79 std::string message("message1"); |
68 pc_handler->handleInitialOffer(WebKit::WebString::fromUTF8(message)); | 80 pc_handler->handleInitialOffer(WebKit::WebString::fromUTF8(message)); |
69 EXPECT_EQ(message, mock_peer_connection->signaling_message()); | 81 EXPECT_EQ(message, mock_peer_connection->signaling_message()); |
70 | 82 |
71 message = "message2"; | 83 message = "message2"; |
72 pc_handler->processSDP(WebKit::WebString::fromUTF8(message)); | 84 pc_handler->processSDP(WebKit::WebString::fromUTF8(message)); |
73 EXPECT_EQ(message, mock_peer_connection->signaling_message()); | 85 EXPECT_EQ(message, mock_peer_connection->signaling_message()); |
74 | 86 |
75 message = "message3"; | 87 message = "message3"; |
76 pc_handler->OnSignalingMessage(message); | 88 pc_handler->OnSignalingMessage(message); |
77 EXPECT_EQ(message, mock_client->sdp()); | 89 EXPECT_EQ(message, mock_client->sdp()); |
78 | 90 |
79 std::string remote_label(label); | 91 std::string remote_stream_label(stream_label); |
80 remote_label.append("-remote"); | 92 remote_stream_label += "-remote"; |
81 pc_handler->OnAddStream(remote_label, true); | 93 std::string remote_video_track_label(video_track_label); |
82 EXPECT_EQ(remote_label, mock_client->stream_label()); | 94 remote_video_track_label += "-remote"; |
| 95 // We use a local stream as a remote since for testing purposes we really |
| 96 // only need the MediaStreamInterface. |
| 97 talk_base::scoped_refptr<webrtc::LocalMediaStreamInterface> remote_stream( |
| 98 mock_dependency_factory->CreateLocalMediaStream(remote_stream_label)); |
| 99 talk_base::scoped_refptr<webrtc::LocalVideoTrackInterface> remote_video_track( |
| 100 mock_dependency_factory->CreateLocalVideoTrack(remote_video_track_label, |
| 101 NULL)); |
| 102 remote_video_track->set_enabled(true); |
| 103 remote_stream->AddTrack(remote_video_track); |
| 104 mock_peer_connection->AddRemoteStream(remote_stream); |
| 105 pc_handler->OnAddStream(remote_stream); |
| 106 EXPECT_EQ(remote_stream_label, mock_client->stream_label()); |
83 | 107 |
84 scoped_refptr<RTCVideoDecoder> rtc_video_decoder( | 108 talk_base::scoped_refptr<webrtc::MockVideoRendererWrapper> renderer( |
85 new RTCVideoDecoder(&loop, "")); | 109 new talk_base::RefCountedObject<webrtc::MockVideoRendererWrapper>()); |
86 pc_handler->SetVideoRenderer(label, rtc_video_decoder.get()); | 110 pc_handler->SetVideoRenderer(remote_stream_label, renderer); |
87 EXPECT_EQ(label, mock_peer_connection->video_renderer_stream_id()); | 111 EXPECT_EQ(renderer, static_cast<webrtc::MockLocalVideoTrack*>( |
| 112 remote_video_track.get())->renderer()); |
88 | 113 |
89 pc_handler->OnRemoveStream(remote_label, true); | 114 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> empty_streams( |
| 115 static_cast<size_t>(0)); |
| 116 pc_handler->processPendingStreams(empty_streams, local_streams); |
| 117 EXPECT_EQ("", mock_peer_connection->stream_label()); |
| 118 mock_peer_connection->ClearStreamChangesCommitted(); |
| 119 EXPECT_TRUE(!mock_peer_connection->stream_changes_committed()); |
| 120 |
| 121 pc_handler->OnRemoveStream(remote_stream); |
90 EXPECT_TRUE(mock_client->stream_label().empty()); | 122 EXPECT_TRUE(mock_client->stream_label().empty()); |
91 | 123 |
| 124 pc_handler->processPendingStreams(local_streams, empty_streams); |
| 125 EXPECT_EQ(stream_label, mock_peer_connection->stream_label()); |
| 126 EXPECT_TRUE(mock_peer_connection->stream_changes_committed()); |
| 127 |
92 pc_handler->stop(); | 128 pc_handler->stop(); |
93 EXPECT_FALSE(pc_handler->native_peer_connection_.get()); | 129 EXPECT_FALSE(pc_handler->native_peer_connection_.get()); |
94 // PC handler is expected to be deleted when stop calls | 130 // PC handler is expected to be deleted when stop calls |
95 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of | 131 // MediaStreamImpl::ClosePeerConnection. We own and delete it here instead of |
96 // in the mock. | 132 // in the mock. |
97 pc_handler.reset(); | 133 pc_handler.reset(); |
98 | |
99 // processPendingStreams must be tested on a new PC handler since removing | |
100 // streams is currently not supported. | |
101 pc_handler.reset(new PeerConnectionHandler(mock_client.get(), | |
102 mock_ms_impl.get(), | |
103 mock_dependency_factory.get(), | |
104 NULL, | |
105 NULL, | |
106 NULL, | |
107 NULL)); | |
108 pc_handler->initialize(server_config, security_origin); | |
109 EXPECT_TRUE(pc_handler->native_peer_connection_.get()); | |
110 mock_peer_connection = static_cast<webrtc::MockPeerConnectionImpl*>( | |
111 pc_handler->native_peer_connection_.get()); | |
112 | |
113 WebKit::WebVector<WebKit::WebMediaStreamDescriptor> pendingRemoveStreams( | |
114 static_cast<size_t>(0)); | |
115 pc_handler->processPendingStreams(pendingAddStreams, pendingRemoveStreams); | |
116 EXPECT_EQ(label, mock_ms_impl->video_label()); | |
117 EXPECT_EQ(label, mock_peer_connection->stream_id()); | |
118 EXPECT_TRUE(mock_peer_connection->video_stream()); | |
119 EXPECT_TRUE(mock_peer_connection->connected()); | |
120 EXPECT_TRUE(mock_peer_connection->video_capture_set()); | |
121 | |
122 pc_handler->stop(); | |
123 pc_handler.reset(); | |
124 } | 134 } |
OLD | NEW |