Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(188)

Side by Side Diff: components/test_runner/mock_webrtc_peer_connection_handler.cc

Issue 2707183003: Move //components/test_runner back into //content/shell (Closed)
Patch Set: Trim DEPS Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 // Copyright 2014 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 "components/test_runner/mock_webrtc_peer_connection_handler.h"
6
7 #include <stddef.h>
8
9 #include <string>
10 #include <utility>
11 #include <vector>
12
13 #include "base/bind.h"
14 #include "base/bind_helpers.h"
15 #include "components/test_runner/mock_webrtc_data_channel_handler.h"
16 #include "components/test_runner/mock_webrtc_dtmf_sender_handler.h"
17 #include "components/test_runner/test_interfaces.h"
18 #include "components/test_runner/web_test_delegate.h"
19 #include "third_party/WebKit/public/platform/WebMediaStream.h"
20 #include "third_party/WebKit/public/platform/WebMediaStreamSource.h"
21 #include "third_party/WebKit/public/platform/WebMediaStreamTrack.h"
22 #include "third_party/WebKit/public/platform/WebRTCAnswerOptions.h"
23 #include "third_party/WebKit/public/platform/WebRTCDataChannelInit.h"
24 #include "third_party/WebKit/public/platform/WebRTCOfferOptions.h"
25 #include "third_party/WebKit/public/platform/WebRTCPeerConnectionHandlerClient.h "
26 #include "third_party/WebKit/public/platform/WebRTCStatsResponse.h"
27 #include "third_party/WebKit/public/platform/WebRTCVoidRequest.h"
28 #include "third_party/WebKit/public/platform/WebString.h"
29 #include "third_party/WebKit/public/platform/WebVector.h"
30
31 using namespace blink;
32
33 namespace test_runner {
34
35 namespace {
36
37 class MockWebRTCLegacyStats : public blink::WebRTCLegacyStats {
38 public:
39 class MemberIterator : public blink::WebRTCLegacyStatsMemberIterator {
40 public:
41 MemberIterator(
42 const std::vector<std::pair<std::string, std::string>>* values)
43 : values_(values) {}
44
45 // blink::WebRTCLegacyStatsMemberIterator
46 bool isEnd() const override { return i >= values_->size(); }
47 void next() override { ++i; }
48 blink::WebString name() const override {
49 return blink::WebString::fromUTF8((*values_)[i].first);
50 }
51 blink::WebRTCLegacyStatsMemberType type() const override {
52 return blink::WebRTCLegacyStatsMemberTypeString;
53 }
54 int valueInt() const override {
55 NOTREACHED();
56 return 0;
57 }
58 int64_t valueInt64() const override {
59 NOTREACHED();
60 return 0;
61 }
62 float valueFloat() const override {
63 NOTREACHED();
64 return 0.0f;
65 }
66 blink::WebString valueString() const override {
67 return blink::WebString::fromUTF8((*values_)[i].second);
68 }
69 bool valueBool() const override {
70 NOTREACHED();
71 return false;
72 }
73 blink::WebString valueToString() const override {
74 return valueString();
75 }
76
77 private:
78 size_t i = 0;
79 const std::vector<std::pair<std::string, std::string>>* values_;
80 };
81
82 MockWebRTCLegacyStats(const char* id, const char* type_name, double timestamp)
83 : id_(id), type_name_(type_name), timestamp_(timestamp) {}
84
85 // blink::WebRTCLegacyStats
86 blink::WebString id() const override {
87 return blink::WebString::fromUTF8(id_);
88 }
89 blink::WebString type() const override {
90 return blink::WebString::fromUTF8(type_name_);
91 }
92 double timestamp() const override {
93 return timestamp_;
94 }
95 blink::WebRTCLegacyStatsMemberIterator* iterator() const override {
96 return new MemberIterator(&values_);
97 }
98
99 void addStatistic(const std::string& name, const std::string& value) {
100 values_.push_back(std::make_pair(name, value));
101 }
102
103 private:
104 const std::string id_;
105 const std::string type_name_;
106 const double timestamp_;
107 // (name, value) pairs.
108 std::vector<std::pair<std::string, std::string>> values_;
109 };
110
111 template<typename T>
112 WebVector<T> sequenceWithValue(T value) {
113 return WebVector<T>(&value, 1);
114 }
115
116 class MockWebRTCStatsMember : public blink::WebRTCStatsMember {
117 public:
118 MockWebRTCStatsMember(
119 const std::string& name, blink::WebRTCStatsMemberType type)
120 : name_(name), type_(type) {}
121
122 // blink::WebRTCStatsMember overrides.
123 blink::WebString name() const override {
124 return blink::WebString::fromUTF8(name_);
125 }
126 blink::WebRTCStatsMemberType type() const override {
127 return type_;
128 }
129 bool isDefined() const override { return true; }
130 bool valueBool() const override { return true; }
131 int32_t valueInt32() const override { return 42; }
132 uint32_t valueUint32() const override { return 42; }
133 int64_t valueInt64() const override { return 42; }
134 uint64_t valueUint64() const override { return 42; }
135 double valueDouble() const override { return 42.0; }
136 blink::WebString valueString() const override {
137 return blink::WebString::fromUTF8("42");
138 }
139 WebVector<int> valueSequenceBool() const override {
140 return sequenceWithValue<int>(1);
141 }
142 WebVector<int32_t> valueSequenceInt32() const override {
143 return sequenceWithValue<int32_t>(42);
144 }
145 WebVector<uint32_t> valueSequenceUint32() const override {
146 return sequenceWithValue<uint32_t>(42);
147 }
148 WebVector<int64_t> valueSequenceInt64() const override {
149 return sequenceWithValue<int64_t>(42);
150 }
151 WebVector<uint64_t> valueSequenceUint64() const override {
152 return sequenceWithValue<uint64_t>(42);
153 }
154 WebVector<double> valueSequenceDouble() const override {
155 return sequenceWithValue<double>(42.0);
156 }
157 blink::WebVector<blink::WebString> valueSequenceString() const override {
158 return sequenceWithValue<blink::WebString>(
159 blink::WebString::fromUTF8("42"));
160 }
161
162 private:
163 std::string name_;
164 blink::WebRTCStatsMemberType type_;
165 };
166
167 class MockWebRTCStats : public blink::WebRTCStats {
168 public:
169 MockWebRTCStats(
170 const std::string& id, const std::string& type, double timestamp)
171 : id_(id), type_(type), timestamp_(timestamp) {
172 }
173
174 void addMember(const std::string& name, blink::WebRTCStatsMemberType type) {
175 members_.push_back(std::make_pair(name, type));
176 }
177
178 // blink::WebRTCStats overrides.
179 blink::WebString id() const override {
180 return blink::WebString::fromUTF8(id_);
181 }
182 blink::WebString type() const override {
183 return blink::WebString::fromUTF8(type_);
184 }
185 double timestamp() const override {
186 return timestamp_;
187 }
188 size_t membersCount() const override {
189 return members_.size();
190 }
191 std::unique_ptr<WebRTCStatsMember> getMember(size_t i) const override {
192 return std::unique_ptr<WebRTCStatsMember>(new MockWebRTCStatsMember(
193 members_[i].first, members_[i].second));
194 }
195
196 private:
197 std::string id_;
198 std::string type_;
199 double timestamp_;
200 std::vector<std::pair<std::string, blink::WebRTCStatsMemberType>> members_;
201 };
202
203 class MockWebRTCStatsReport : public blink::WebRTCStatsReport {
204 public:
205 MockWebRTCStatsReport() : i_(0) {}
206 MockWebRTCStatsReport(const MockWebRTCStatsReport& other)
207 : stats_(other.stats_), i_(0) {}
208
209 void AddStats(const MockWebRTCStats& stats) {
210 stats_.push_back(stats);
211 }
212
213 // blink::WebRTCStatsReport overrides.
214 std::unique_ptr<blink::WebRTCStatsReport> copyHandle() const override {
215 // Because this is just a mock, we copy the underlying stats instead of
216 // referencing the same stats as the original report.
217 return std::unique_ptr<blink::WebRTCStatsReport>(
218 new MockWebRTCStatsReport(*this));
219 }
220 std::unique_ptr<WebRTCStats> getStats(WebString id) const override {
221 for (const MockWebRTCStats& stats : stats_) {
222 if (stats.id() == id)
223 return std::unique_ptr<blink::WebRTCStats>(new MockWebRTCStats(stats));
224 }
225 return nullptr;
226 }
227 std::unique_ptr<blink::WebRTCStats> next() override {
228 if (i_ >= stats_.size())
229 return nullptr;
230 return std::unique_ptr<blink::WebRTCStats>(
231 new MockWebRTCStats(stats_[i_++]));
232 }
233
234 private:
235 std::vector<MockWebRTCStats> stats_;
236 size_t i_;
237 };
238
239 } // namespace
240
241 MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler()
242 : weak_factory_(this) {}
243
244 MockWebRTCPeerConnectionHandler::~MockWebRTCPeerConnectionHandler() {
245 }
246
247 MockWebRTCPeerConnectionHandler::MockWebRTCPeerConnectionHandler(
248 WebRTCPeerConnectionHandlerClient* client,
249 TestInterfaces* interfaces)
250 : client_(client),
251 stopped_(false),
252 stream_count_(0),
253 interfaces_(interfaces),
254 weak_factory_(this) {}
255
256 void MockWebRTCPeerConnectionHandler::ReportInitializeCompleted() {
257 client_->didChangeICEGatheringState(
258 WebRTCPeerConnectionHandlerClient::ICEGatheringStateComplete);
259 client_->didChangeICEConnectionState(
260 WebRTCPeerConnectionHandlerClient::ICEConnectionStateCompleted);
261 }
262
263 bool MockWebRTCPeerConnectionHandler::initialize(
264 const WebRTCConfiguration& configuration,
265 const WebMediaConstraints& constraints) {
266 interfaces_->GetDelegate()->PostTask(
267 base::Bind(&MockWebRTCPeerConnectionHandler::ReportInitializeCompleted,
268 weak_factory_.GetWeakPtr()));
269 return true;
270 }
271
272 void MockWebRTCPeerConnectionHandler::createOffer(
273 const WebRTCSessionDescriptionRequest& request,
274 const WebMediaConstraints& constraints) {
275 PostRequestFailure(request);
276 }
277
278 void MockWebRTCPeerConnectionHandler::PostRequestResult(
279 const WebRTCSessionDescriptionRequest& request,
280 const WebRTCSessionDescription& session_description) {
281 interfaces_->GetDelegate()->PostTask(
282 base::Bind(&WebRTCSessionDescriptionRequest::requestSucceeded,
283 base::Owned(new WebRTCSessionDescriptionRequest(request)),
284 session_description));
285 }
286
287 void MockWebRTCPeerConnectionHandler::PostRequestFailure(
288 const WebRTCSessionDescriptionRequest& request) {
289 interfaces_->GetDelegate()->PostTask(
290 base::Bind(&WebRTCSessionDescriptionRequest::requestFailed,
291 base::Owned(new WebRTCSessionDescriptionRequest(request)),
292 WebString("TEST_ERROR")));
293 }
294
295 void MockWebRTCPeerConnectionHandler::PostRequestResult(
296 const WebRTCVoidRequest& request) {
297 interfaces_->GetDelegate()->PostTask(
298 base::Bind(&WebRTCVoidRequest::requestSucceeded,
299 base::Owned(new WebRTCVoidRequest(request))));
300 }
301
302 void MockWebRTCPeerConnectionHandler::PostRequestFailure(
303 const WebRTCVoidRequest& request) {
304 interfaces_->GetDelegate()->PostTask(base::Bind(
305 &WebRTCVoidRequest::requestFailed,
306 base::Owned(new WebRTCVoidRequest(request)), WebString("TEST_ERROR")));
307 }
308
309 void MockWebRTCPeerConnectionHandler::createOffer(
310 const WebRTCSessionDescriptionRequest& request,
311 const blink::WebRTCOfferOptions& options) {
312 if (options.iceRestart() && options.voiceActivityDetection() &&
313 options.offerToReceiveAudio() > 0 && options.offerToReceiveVideo() > 0) {
314 WebRTCSessionDescription session_description;
315 session_description.initialize("offer", "local");
316 PostRequestResult(request, session_description);
317 } else {
318 PostRequestFailure(request);
319 }
320 }
321
322 void MockWebRTCPeerConnectionHandler::createAnswer(
323 const WebRTCSessionDescriptionRequest& request,
324 const WebMediaConstraints& constraints) {
325 if (!remote_description_.isNull()) {
326 WebRTCSessionDescription session_description;
327 session_description.initialize("answer", "local");
328 PostRequestResult(request, session_description);
329 } else {
330 PostRequestFailure(request);
331 }
332 }
333
334 void MockWebRTCPeerConnectionHandler::createAnswer(
335 const WebRTCSessionDescriptionRequest& request,
336 const blink::WebRTCAnswerOptions& options) {
337 if (options.voiceActivityDetection()) {
338 WebRTCSessionDescription session_description;
339 session_description.initialize("answer", "local");
340 PostRequestResult(request, session_description);
341 } else {
342 PostRequestFailure(request);
343 }
344 }
345
346 void MockWebRTCPeerConnectionHandler::setLocalDescription(
347 const WebRTCVoidRequest& request,
348 const WebRTCSessionDescription& local_description) {
349 if (!local_description.isNull() && local_description.sdp() == "local") {
350 local_description_ = local_description;
351 PostRequestResult(request);
352 } else {
353 PostRequestFailure(request);
354 }
355 }
356
357 void MockWebRTCPeerConnectionHandler::setRemoteDescription(
358 const WebRTCVoidRequest& request,
359 const WebRTCSessionDescription& remote_description) {
360
361 if (!remote_description.isNull() && remote_description.sdp() == "remote") {
362 UpdateRemoteStreams();
363 remote_description_ = remote_description;
364 PostRequestResult(request);
365 } else
366 PostRequestFailure(request);
367 }
368
369 void MockWebRTCPeerConnectionHandler::UpdateRemoteStreams() {
370 // Find all removed streams.
371 // Set the readyState of the remote tracks to ended, remove them from the
372 // stream and notify the client.
373 StreamMap::iterator removed_it = remote_streams_.begin();
374 while (removed_it != remote_streams_.end()) {
375 if (local_streams_.find(removed_it->first) != local_streams_.end()) {
376 removed_it++;
377 continue;
378 }
379
380 // The stream have been removed. Loop through all tracks and set the
381 // source as ended and remove them from the stream.
382 blink::WebMediaStream stream = removed_it->second;
383 blink::WebVector<blink::WebMediaStreamTrack> audio_tracks;
384 stream.audioTracks(audio_tracks);
385 for (size_t i = 0; i < audio_tracks.size(); ++i) {
386 audio_tracks[i].source().setReadyState(
387 blink::WebMediaStreamSource::ReadyStateEnded);
388 stream.removeTrack(audio_tracks[i]);
389 }
390
391 blink::WebVector<blink::WebMediaStreamTrack> video_tracks;
392 stream.videoTracks(video_tracks);
393 for (size_t i = 0; i < video_tracks.size(); ++i) {
394 video_tracks[i].source().setReadyState(
395 blink::WebMediaStreamSource::ReadyStateEnded);
396 stream.removeTrack(video_tracks[i]);
397 }
398 client_->didRemoveRemoteStream(stream);
399 remote_streams_.erase(removed_it++);
400 }
401
402 // Find all new streams;
403 // Create new sources and tracks and notify the client about the new stream.
404 StreamMap::iterator added_it = local_streams_.begin();
405 while (added_it != local_streams_.end()) {
406 if (remote_streams_.find(added_it->first) != remote_streams_.end()) {
407 added_it++;
408 continue;
409 }
410
411 const blink::WebMediaStream& stream = added_it->second;
412
413 blink::WebVector<blink::WebMediaStreamTrack> local_audio_tracks;
414 stream.audioTracks(local_audio_tracks);
415 blink::WebVector<blink::WebMediaStreamTrack>
416 remote_audio_tracks(local_audio_tracks.size());
417
418 for (size_t i = 0; i < local_audio_tracks.size(); ++i) {
419 blink::WebMediaStreamSource webkit_source;
420 webkit_source.initialize(local_audio_tracks[i].id(),
421 blink::WebMediaStreamSource::TypeAudio,
422 local_audio_tracks[i].id(),
423 true /* remote */);
424 remote_audio_tracks[i].initialize(webkit_source);
425 }
426
427 blink::WebVector<blink::WebMediaStreamTrack> local_video_tracks;
428 stream.videoTracks(local_video_tracks);
429 blink::WebVector<blink::WebMediaStreamTrack>
430 remote_video_tracks(local_video_tracks.size());
431 for (size_t i = 0; i < local_video_tracks.size(); ++i) {
432 blink::WebMediaStreamSource webkit_source;
433 webkit_source.initialize(local_video_tracks[i].id(),
434 blink::WebMediaStreamSource::TypeVideo,
435 local_video_tracks[i].id(),
436 true /* remote */);
437 remote_video_tracks[i].initialize(webkit_source);
438 }
439
440 blink::WebMediaStream new_remote_stream;
441 new_remote_stream.initialize(remote_audio_tracks,
442 remote_video_tracks);
443 remote_streams_[added_it->first] = new_remote_stream;
444 client_->didAddRemoteStream(new_remote_stream);
445 ++added_it;
446 }
447 }
448
449 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::localDescription() {
450 return local_description_;
451 }
452
453 WebRTCSessionDescription MockWebRTCPeerConnectionHandler::remoteDescription() {
454 return remote_description_;
455 }
456
457 WebRTCErrorType MockWebRTCPeerConnectionHandler::setConfiguration(
458 const WebRTCConfiguration& configuration) {
459 return WebRTCErrorType::kNone;
460 }
461
462 bool MockWebRTCPeerConnectionHandler::addICECandidate(
463 const WebRTCICECandidate& ice_candidate) {
464 client_->didGenerateICECandidate(ice_candidate);
465 return true;
466 }
467
468 bool MockWebRTCPeerConnectionHandler::addICECandidate(
469 const WebRTCVoidRequest& request,
470 const WebRTCICECandidate& ice_candidate) {
471 PostRequestResult(request);
472 return true;
473 }
474
475 bool MockWebRTCPeerConnectionHandler::addStream(
476 const WebMediaStream& stream,
477 const WebMediaConstraints& constraints) {
478 if (local_streams_.find(stream.id().utf8()) != local_streams_.end())
479 return false;
480 ++stream_count_;
481 client_->negotiationNeeded();
482 local_streams_[stream.id().utf8()] = stream;
483 return true;
484 }
485
486 void MockWebRTCPeerConnectionHandler::removeStream(
487 const WebMediaStream& stream) {
488 --stream_count_;
489 local_streams_.erase(stream.id().utf8());
490 client_->negotiationNeeded();
491 }
492
493 void MockWebRTCPeerConnectionHandler::getStats(
494 const WebRTCStatsRequest& request) {
495 WebRTCStatsResponse response = request.createResponse();
496 double current_date =
497 interfaces_->GetDelegate()->GetCurrentTimeInMillisecond();
498 if (request.hasSelector()) {
499 // FIXME: There is no check that the fetched values are valid.
500 MockWebRTCLegacyStats stats("Mock video", "ssrc", current_date);
501 stats.addStatistic("type", "video");
502 response.addStats(stats);
503 } else {
504 for (int i = 0; i < stream_count_; ++i) {
505 MockWebRTCLegacyStats audio_stats("Mock audio", "ssrc", current_date);
506 audio_stats.addStatistic("type", "audio");
507 response.addStats(audio_stats);
508
509 MockWebRTCLegacyStats video_stats("Mock video", "ssrc", current_date);
510 video_stats.addStatistic("type", "video");
511 response.addStats(video_stats);
512 }
513 }
514 interfaces_->GetDelegate()->PostTask(
515 base::Bind(&blink::WebRTCStatsRequest::requestSucceeded,
516 base::Owned(new WebRTCStatsRequest(request)), response));
517 }
518
519 void MockWebRTCPeerConnectionHandler::getStats(
520 std::unique_ptr<blink::WebRTCStatsReportCallback> callback) {
521 std::unique_ptr<MockWebRTCStatsReport> report(new MockWebRTCStatsReport());
522 MockWebRTCStats stats("mock-stats-01", "mock-stats", 1234.0);
523 stats.addMember("bool", blink::WebRTCStatsMemberTypeBool);
524 stats.addMember("int32", blink::WebRTCStatsMemberTypeInt32);
525 stats.addMember("uint32", blink::WebRTCStatsMemberTypeUint32);
526 stats.addMember("int64", blink::WebRTCStatsMemberTypeInt64);
527 stats.addMember("uint64", blink::WebRTCStatsMemberTypeUint64);
528 stats.addMember("double", blink::WebRTCStatsMemberTypeDouble);
529 stats.addMember("string", blink::WebRTCStatsMemberTypeString);
530 stats.addMember("sequenceBool", blink::WebRTCStatsMemberTypeSequenceBool);
531 stats.addMember("sequenceInt32", blink::WebRTCStatsMemberTypeSequenceInt32);
532 stats.addMember("sequenceUint32", blink::WebRTCStatsMemberTypeSequenceUint32);
533 stats.addMember("sequenceInt64", blink::WebRTCStatsMemberTypeSequenceInt64);
534 stats.addMember("sequenceUint64", blink::WebRTCStatsMemberTypeSequenceUint64);
535 stats.addMember("sequenceDouble", blink::WebRTCStatsMemberTypeSequenceDouble);
536 stats.addMember("sequenceString", blink::WebRTCStatsMemberTypeSequenceString);
537 report->AddStats(stats);
538 callback->OnStatsDelivered(std::unique_ptr<blink::WebRTCStatsReport>(
539 report.release()));
540 }
541
542 void MockWebRTCPeerConnectionHandler::ReportCreationOfDataChannel() {
543 WebRTCDataChannelInit init;
544 WebRTCDataChannelHandler* remote_data_channel =
545 new MockWebRTCDataChannelHandler("MockRemoteDataChannel", init,
546 interfaces_->GetDelegate());
547 client_->didAddRemoteDataChannel(remote_data_channel);
548 }
549
550 WebRTCDataChannelHandler* MockWebRTCPeerConnectionHandler::createDataChannel(
551 const WebString& label,
552 const blink::WebRTCDataChannelInit& init) {
553 interfaces_->GetDelegate()->PostTask(
554 base::Bind(&MockWebRTCPeerConnectionHandler::ReportCreationOfDataChannel,
555 weak_factory_.GetWeakPtr()));
556
557 // TODO(lukasza): Unclear if it is okay to return a different object than the
558 // one created in ReportCreationOfDataChannel.
559 return new MockWebRTCDataChannelHandler(
560 label, init, interfaces_->GetDelegate());
561 }
562
563 WebRTCDTMFSenderHandler* MockWebRTCPeerConnectionHandler::createDTMFSender(
564 const WebMediaStreamTrack& track) {
565 return new MockWebRTCDTMFSenderHandler(track, interfaces_->GetDelegate());
566 }
567
568 void MockWebRTCPeerConnectionHandler::stop() {
569 stopped_ = true;
570 weak_factory_.InvalidateWeakPtrs();
571 }
572
573 } // namespace test_runner
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698