Implemented new API for RTCStatsReport object.
[WebKit-https.git] / Tools / DumpRenderTree / chromium / TestRunner / src / 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
33 #if ENABLE_WEBRTC
34 #include "MockWebRTCPeerConnectionHandler.h"
35
36 #include "MockConstraints.h"
37 #include "MockWebRTCDTMFSenderHandler.h"
38 #include "MockWebRTCDataChannelHandler.h"
39 #include "TestInterfaces.h"
40 #include "WebTestDelegate.h"
41 #include <public/WebMediaConstraints.h>
42 #include <public/WebMediaStream.h>
43 #include <public/WebMediaStreamTrack.h>
44 #include <public/WebRTCPeerConnectionHandlerClient.h>
45 #include <public/WebRTCSessionDescription.h>
46 #include <public/WebRTCSessionDescriptionRequest.h>
47 #include <public/WebRTCStatsRequest.h>
48 #include <public/WebRTCStatsResponse.h>
49 #include <public/WebRTCVoidRequest.h>
50 #include <public/WebString.h>
51 #include <public/WebVector.h>
52
53 using namespace WebKit;
54
55 namespace WebTestRunner {
56
57 class RTCSessionDescriptionRequestSuccededTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
58 public:
59     RTCSessionDescriptionRequestSuccededTask(MockWebRTCPeerConnectionHandler* object, const WebRTCSessionDescriptionRequest& request, const WebRTCSessionDescription& result)
60         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
61         , m_request(request)
62         , m_result(result)
63     {
64     }
65
66     virtual void runIfValid() OVERRIDE
67     {
68         m_request.requestSucceeded(m_result);
69     }
70
71 private:
72     WebRTCSessionDescriptionRequest m_request;
73     WebRTCSessionDescription m_result;
74 };
75
76 class RTCSessionDescriptionRequestFailedTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
77 public:
78     RTCSessionDescriptionRequestFailedTask(MockWebRTCPeerConnectionHandler* object, const WebRTCSessionDescriptionRequest& request)
79         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
80         , m_request(request)
81     {
82     }
83
84     virtual void runIfValid() OVERRIDE
85     {
86         m_request.requestFailed("TEST_ERROR");
87     }
88
89 private:
90     WebRTCSessionDescriptionRequest m_request;
91 };
92
93 class RTCStatsRequestSucceededTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
94 public:
95     RTCStatsRequestSucceededTask(MockWebRTCPeerConnectionHandler* object, const WebKit::WebRTCStatsRequest& request, const WebKit::WebRTCStatsResponse& response)
96         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
97         , m_request(request)
98         , m_response(response)
99     {
100     }
101
102     virtual void runIfValid() OVERRIDE
103     {
104         m_request.requestSucceeded(m_response);
105     }
106
107 private:
108     WebKit::WebRTCStatsRequest m_request;
109     WebKit::WebRTCStatsResponse m_response;
110 };
111
112 class RTCVoidRequestTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
113 public:
114     RTCVoidRequestTask(MockWebRTCPeerConnectionHandler* object, const WebRTCVoidRequest& request, bool succeeded)
115         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
116         , m_request(request)
117         , m_succeeded(succeeded)
118     {
119     }
120
121     virtual void runIfValid() OVERRIDE
122     {
123         if (m_succeeded)
124             m_request.requestSucceeded();
125         else
126             m_request.requestFailed("TEST_ERROR");
127     }
128
129 private:
130     WebRTCVoidRequest m_request;
131     bool m_succeeded;
132 };
133
134 class RTCPeerConnectionStateTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
135 public:
136     RTCPeerConnectionStateTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebRTCPeerConnectionHandlerClient::ICEConnectionState connectionState, WebRTCPeerConnectionHandlerClient::ICEGatheringState gatheringState)
137         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
138         , m_client(client)
139         , m_connectionState(connectionState)
140         , m_gatheringState(gatheringState)
141     {
142     }
143
144     virtual void runIfValid() OVERRIDE
145     {
146         m_client->didChangeICEGatheringState(m_gatheringState);
147         m_client->didChangeICEConnectionState(m_connectionState);
148     }
149
150 private:
151     WebRTCPeerConnectionHandlerClient* m_client;
152     WebRTCPeerConnectionHandlerClient::ICEConnectionState m_connectionState;
153     WebRTCPeerConnectionHandlerClient::ICEGatheringState m_gatheringState;
154 };
155
156 class RemoteDataChannelTask : public WebMethodTask<MockWebRTCPeerConnectionHandler> {
157 public:
158     RemoteDataChannelTask(MockWebRTCPeerConnectionHandler* object, WebRTCPeerConnectionHandlerClient* client, WebTestDelegate* delegate)
159         : WebMethodTask<MockWebRTCPeerConnectionHandler>(object)
160         , m_client(client)
161         , m_delegate(delegate)
162     {
163     }
164
165     virtual void runIfValid() OVERRIDE
166     {
167         WebRTCDataChannelHandler* remoteDataChannel = new MockWebRTCDataChannelHandler("MockRemoteDataChannel", true, m_delegate);
168         m_client->didAddRemoteDataChannel(remoteDataChannel);
169     }
170
171 private:
172     WebRTCPeerConnectionHandlerClient* m_client;
173     WebTestDelegate* m_delegate;
174 };
175
176 /////////////////////
177
178 MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(WebRTCPeerConnectionHandlerClient* client, TestInterfaces* interfaces)
179     : m_client(client)
180     , m_stopped(false)
181     , m_streamCount(0)
182     , m_interfaces(interfaces)
183 {
184 }
185
186 bool MockWebRTCPeerConnectionHandler::initialize(const WebRTCConfiguration&, const WebMediaConstraints& constraints)
187 {
188     if (MockConstraints::verifyConstraints(constraints)) {
189         m_interfaces->delegate()->postTask(new RTCPeerConnectionStateTask(this, m_client, WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted, WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete));
190         return true;
191     }
192
193     return false;
194 }
195
196 void MockWebRTCPeerConnectionHandler::createOffer(const WebRTCSessionDescriptionRequest& request, const WebMediaConstraints& constraints)
197 {
198     WebString shouldSucceed;
199     if (constraints.getMandatoryConstraintValue("succeed", shouldSucceed) && shouldSucceed == "true") {
200         WebRTCSessionDescription sessionDescription;
201         sessionDescription.initialize("offer", "local");
202         m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
203     } else
204         m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
205 }
206
207 void MockWebRTCPeerConnectionHandler::createAnswer(const WebRTCSessionDescriptionRequest& request, const WebMediaConstraints&)
208 {
209     if (!m_remoteDescription.isNull()) {
210         WebRTCSessionDescription sessionDescription;
211         sessionDescription.initialize("answer", "local");
212         m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestSuccededTask(this, request, sessionDescription));
213     } else
214         m_interfaces->delegate()->postTask(new RTCSessionDescriptionRequestFailedTask(this, request));
215 }
216
217 void MockWebRTCPeerConnectionHandler::setLocalDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& localDescription)
218 {
219     if (!localDescription.isNull() && localDescription.sdp() == "local") {
220         m_localDescription = localDescription;
221         m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, true));
222     } else
223         m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, false));
224 }
225
226 void MockWebRTCPeerConnectionHandler::setRemoteDescription(const WebRTCVoidRequest& request, const WebRTCSessionDescription& remoteDescription)
227 {
228     if (!remoteDescription.isNull() && remoteDescription.sdp() == "remote") {
229         m_remoteDescription = remoteDescription;
230         m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, true));
231     } else
232         m_interfaces->delegate()->postTask(new RTCVoidRequestTask(this, request, false));
233 }
234
235 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::localDescription()
236 {
237     return m_localDescription;
238 }
239
240 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::remoteDescription()
241 {
242     return m_remoteDescription;
243 }
244
245 bool MockWebRTCPeerConnectionHandler::updateICE(const WebRTCConfiguration&, const WebMediaConstraints&)
246 {
247     return true;
248 }
249
250 bool MockWebRTCPeerConnectionHandler::addICECandidate(const WebRTCICECandidate& iceCandidate)
251 {
252     m_client->didGenerateICECandidate(iceCandidate);
253     return true;
254 }
255
256 bool MockWebRTCPeerConnectionHandler::addStream(const WebMediaStream& stream, const WebMediaConstraints&)
257 {
258     ++m_streamCount;
259     m_client->negotiationNeeded();
260     return true;
261 }
262
263 void MockWebRTCPeerConnectionHandler::removeStream(const WebMediaStream& stream)
264 {
265     --m_streamCount;
266     m_client->negotiationNeeded();
267 }
268
269 void MockWebRTCPeerConnectionHandler::getStats(const WebRTCStatsRequest& request)
270 {
271     WebRTCStatsResponse response = request.createResponse();
272     double currentDate = m_interfaces->delegate()->getCurrentTimeInMillisecond();
273     if (request.hasSelector()) {
274         WebMediaStream stream = request.stream();
275         // FIXME: There is no check that the fetched values are valid.
276         size_t reportIndex = response.addReport("Mock video", "ssrc", currentDate);
277         response.addStatistic(reportIndex, "type", "video");
278     } else {
279         for (int i = 0; i < m_streamCount; ++i) {
280             size_t reportIndex = response.addReport("Mock audio", "ssrc", currentDate);
281             response.addStatistic(reportIndex, "type", "audio");
282             reportIndex = response.addReport("Mock video", "ssrc", currentDate);
283             response.addStatistic(reportIndex, "type", "video");
284         }
285     }
286     m_interfaces->delegate()->postTask(new RTCStatsRequestSucceededTask(this, request, response));
287 }
288
289 WebRTCDataChannelHandler* MockWebRTCPeerConnectionHandler::createDataChannel(const WebString& label, bool reliable)
290 {
291     m_interfaces->delegate()->postTask(new RemoteDataChannelTask(this, m_client, m_interfaces->delegate()));
292
293     return new MockWebRTCDataChannelHandler(label, reliable, m_interfaces->delegate());
294 }
295
296 WebRTCDTMFSenderHandler* MockWebRTCPeerConnectionHandler::createDTMFSender(const WebMediaStreamTrack& track)
297 {
298     return new MockWebRTCDTMFSenderHandler(track, m_interfaces->delegate());
299 }
300
301 void MockWebRTCPeerConnectionHandler::stop()
302 {
303     m_stopped = true;
304 }
305
306 }
307
308 #endif // ENABLE_WEBRTC