04cbeec052ebfe46b0887903c4aad89f10bbcb44
[WebKit-https.git] / Tools / DumpRenderTree / chromium / MockWebRTCPeerConnectionHandler.cpp
1 /*
2  * Copyright (C) 2012 Google Inc. All rights reserved.
3  *
4  * Redistribution and use in source and binary forms, with or without
5  * modification, are permitted provided that the following conditions are
6  * met:
7  *
8  *     * Redistributions of source code must retain the above copyright
9  * notice, this list of conditions and the following disclaimer.
10  *     * Redistributions in binary form must reproduce the above
11  * copyright notice, this list of conditions and the following disclaimer
12  * in the documentation and/or other materials provided with the
13  * distribution.
14  *     * Neither the name of Google Inc. nor the names of its
15  * contributors may be used to endorse or promote products derived from
16  * this software without specific prior written permission.
17  *
18  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29  */
30
31 #include "config.h"
32 #if ENABLE(MEDIA_STREAM)
33
34 #include "MockWebRTCPeerConnectionHandler.h"
35
36 #include "MockConstraints.h"
37 #include "MockWebRTCDTMFSenderHandler.h"
38 #include "MockWebRTCDataChannelHandler.h"
39 #include "Task.h"
40 #include <public/WebMediaConstraints.h>
41 #include <public/WebMediaStream.h>
42 #include <public/WebMediaStreamTrack.h>
43 #include <public/WebRTCPeerConnectionHandlerClient.h>
44 #include <public/WebRTCSessionDescription.h>
45 #include <public/WebRTCSessionDescriptionRequest.h>
46 #include <public/WebRTCStatsRequest.h>
47 #include <public/WebRTCStatsResponse.h>
48 #include <public/WebRTCVoidRequest.h>
49 #include <public/WebString.h>
50 #include <public/WebVector.h>
51 #include <wtf/DateMath.h>
52
53 using namespace WebKit;
54 using namespace WebTestRunner;
55
56 class RTCSessionDescriptionRequestSuccededTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
57 public:
58     RTCSessionDescriptionRequestSuccededTask(MockWebRTCPeerConnectionHandler* object, const WebRTCSessionDescriptionRequest& request, const WebRTCSessionDescription& result)
59         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
60         , m_request(request)
61         , m_result(result)
62     {
63     }
64
65     virtual void runIfValid() OVERRIDE
66     {
67         m_request.requestSucceeded(m_result);
68     }
69
70 private:
71     WebRTCSessionDescriptionRequest m_request;
72     WebRTCSessionDescription m_result;
73 };
74
75 class RTCSessionDescriptionRequestFailedTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
76 public:
77     RTCSessionDescriptionRequestFailedTask(MockWebRTCPeerConnectionHandler* object, const WebRTCSessionDescriptionRequest& request)
78         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
79         , m_request(request)
80     {
81     }
82
83     virtual void runIfValid() OVERRIDE
84     {
85         m_request.requestFailed("TEST_ERROR");
86     }
87
88 private:
89     WebRTCSessionDescriptionRequest m_request;
90 };
91
92 class RTCStatsRequestSucceededTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
93 public:
94     RTCStatsRequestSucceededTask(MockWebRTCPeerConnectionHandler* object, const WebKit::WebRTCStatsRequest& request, const WebKit::WebRTCStatsResponse& response)
95         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
96         , m_request(request)
97         , m_response(response)
98     {
99     }
100
101     virtual void runIfValid() OVERRIDE
102     {
103         m_request.requestSucceeded(m_response);
104     }
105
106 private:
107     WebKit::WebRTCStatsRequest m_request;
108     WebKit::WebRTCStatsResponse m_response;
109 };
110
111 class RTCVoidRequestTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
112 public:
113     RTCVoidRequestTask(MockWebRTCPeerConnectionHandler* object, const WebRTCVoidRequest& request, bool succeeded)
114         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
115         , m_request(request)
116         , m_succeeded(succeeded)
117     {
118     }
119
120     virtual void runIfValid() OVERRIDE
121     {
122         if (m_succeeded)
123             m_request.requestSucceeded();
124         else
125             m_request.requestFailed("TEST_ERROR");
126     }
127
128 private:
129     WebRTCVoidRequest m_request;
130     bool m_succeeded;
131 };
132
133 class RTCPeerConnectionStateTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
134 public:
135     RTCPeerConnectionStateTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebRTCPeerConnectionHandlerClient::ICEConnectionState connectionState, WebRTCPeerConnectionHandlerClient::ICEGatheringState gatheringState)
136         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
137         , m_client(client)
138         , m_connectionState(connectionState)
139         , m_gatheringState(gatheringState)
140     {
141     }
142
143     virtual void runIfValid() OVERRIDE
144     {
145         m_client->didChangeICEGatheringState(m_gatheringState);
146         m_client->didChangeICEConnectionState(m_connectionState);
147     }
148
149 private:
150     WebRTCPeerConnectionHandlerClient* m_client;
151     WebRTCPeerConnectionHandlerClient::ICEConnectionState m_connectionState;
152     WebRTCPeerConnectionHandlerClient::ICEGatheringState m_gatheringState;
153 };
154
155 class RemoteDataChannelTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
156 public:
157     RemoteDataChannelTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client)
158         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
159         , m_client(client)
160     {
161     }
162
163     virtual void runIfValid() OVERRIDE
164     {
165         WebRTCDataChannelHandler* remoteDataChannel = new MockWebRTCDataChannelHandler("MockRemoteDataChannel", true);
166         m_client->didAddRemoteDataChannel(remoteDataChannel);
167     }
168
169 private:
170     WebRTCPeerConnectionHandlerClient* m_client;
171 };
172
173 /////////////////////
174
175 MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client)
176     : m_client(client)
177     , m_stopped(false)
178     , m_streamCount(0)
179 {
180 }
181
182 bool MockWebRTCPeerConnectionHandler::initialize(const WebRTCConfiguration&, const WebMediaConstraints& constraints)
183 {
184     if (MockConstraints::verifyConstraints(constraints)) {
185         postTask(new RTCPeerConnectionStateTask(this, m_client, WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted, WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
186         return true;
187     }
188
189     return false;
190 }
191
192 void MockWebRTCPeerConnectionHandler::createOffer(const WebRTCSessionDescriptionRequest& request, const WebMediaConstraints& constraints)
193 {
194     WebString shouldSucceed;
195     if (constraints.getMandatoryConstraintValue("succeed", shouldSucceed) && shouldSucceed == "true") {
196         WebRTCSessionDescription sessionDescription;
197         sessionDescription.initialize("offer", "local");
198         postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
199     } else
200         postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
201 }
202
203 void MockWebRTCPeerConnectionHandler::createAnswer(const WebRTCSessionDescriptionRequest& request, const WebMediaConstraints&)
204 {
205     if (!m_remoteDescription.isNull()) {
206         WebRTCSessionDescription sessionDescription;
207         sessionDescription.initialize("answer", "local");
208         postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
209     } else
210         postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
211 }
212
213 void MockWebRTCPeerConnectionHandler::setLocalDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& localDescription)
214 {
215     if (!localDescription.isNull() && localDescription.sdp() == "local") {
216         m_localDescription = localDescription;
217         postTask(new RTCVoidRequestTask(this, request, true));
218     } else
219         postTask(new RTCVoidRequestTask(this, request, false));
220 }
221
222 void MockWebRTCPeerConnectionHandler::setRemoteDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& remoteDescription)
223 {
224     if (!remoteDescription.isNull() && remoteDescription.sdp() == "remote") {
225         m_remoteDescription = remoteDescription;
226         postTask(new RTCVoidRequestTask(this, request, true));
227     } else
228         postTask(new RTCVoidRequestTask(this, request, false));
229 }
230
231 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::localDescription()
232 {
233     return m_localDescription;
234 }
235
236 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::remoteDescription()
237 {
238     return m_remoteDescription;
239 }
240
241 bool MockWebRTCPeerConnectionHandler::updateICE(const WebRTCConfiguration&, const WebMediaConstraints&)
242 {
243     return true;
244 }
245
246 bool MockWebRTCPeerConnectionHandler::addICECandidate(const WebRTCICECandidate& iceCandidate)
247 {
248     m_client->didGenerateICECandidate(iceCandidate);
249     return true;
250 }
251
252 bool MockWebRTCPeerConnectionHandler::addStream(const WebMediaStream& stream, const WebMediaConstraints&)
253 {
254     m_streamCount += 1;
255     m_client->didAddRemoteStream(stream);
256     m_client->negotiationNeeded();
257     return true;
258 }
259
260 void MockWebRTCPeerConnectionHandler::removeStream(const WebMediaStream& stream)
261 {
262     m_streamCount -= 1;
263     m_client->didRemoveRemoteStream(stream);
264     m_client->negotiationNeeded();
265 }
266
267 void MockWebRTCPeerConnectionHandler::getStats(const WebRTCStatsRequest& request)
268 {
269     WebRTCStatsResponse response = request.createResponse();
270     double currentDate = WTF::jsCurrentTime();
271     if (request.hasSelector()) {
272         WebMediaStream stream = request.stream();
273         // FIXME: There is no check that the fetched values are valid.
274         size_t reportIndex = response.addReport();
275         response.addElement(reportIndex, true, currentDate);
276         response.addStatistic(reportIndex, true, "type", "video");
277     } else {
278         for (int i = 0; i < m_streamCount; ++i) {
279             size_t reportIndex = response.addReport();
280             response.addElement(reportIndex, true, currentDate);
281             response.addStatistic(reportIndex, true, "type", "audio");
282             reportIndex = response.addReport();
283             response.addElement(reportIndex, true, currentDate);
284             response.addStatistic(reportIndex, true, "type", "video");
285         }
286     }
287     postTask(new RTCStatsRequestSucceededTask(this, request, response));
288 }
289
290 WebRTCDataChannelHandler* MockWebRTCPeerConnectionHandler::createDataChannel(const WebString& label, bool reliable)
291 {
292     postTask(new RemoteDataChannelTask(this, m_client));
293
294     return new MockWebRTCDataChannelHandler(label, reliable);
295 }
296
297 WebRTCDTMFSenderHandler* MockWebRTCPeerConnectionHandler::createDTMFSender(const WebMediaStreamTrack& track)
298 {
299     return new MockWebRTCDTMFSenderHandler(track);
300 }
301
302 void MockWebRTCPeerConnectionHandler::stop()
303 {
304     m_stopped = true;
305 }
306
307 #endif // ENABLE(MEDIA_STREAM)