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

Side by Side Diff: chrome/test/data/webrtc/peerconnection_rtp.js

Issue 2951713002: RTCPeerConnection.addTrack and removeTrack added (behind flag) (Closed)
Patch Set: Addressed deadbeef's comments Created 3 years, 5 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
1 /** 1 /**
2 * Copyright 2017 The Chromium Authors. All rights reserved. 2 * Copyright 2017 The Chromium Authors. All rights reserved.
3 * Use of this source code is governed by a BSD-style license that can be 3 * Use of this source code is governed by a BSD-style license that can be
4 * found in the LICENSE file. 4 * found in the LICENSE file.
5 */ 5 */
6 6
7 // Public interface to tests. These are expected to be called with 7 // Public interface to tests. These are expected to be called with
8 // ExecuteJavascript invocations from the browser tests and will return answers 8 // ExecuteJavascript invocations from the browser tests and will return answers
9 // through the DOM automation controller. 9 // through the DOM automation controller.
10 10
(...skipping 27 matching lines...) Expand all
38 function verifyRtpSenders(expectedNumTracks = null) { 38 function verifyRtpSenders(expectedNumTracks = null) {
39 if (expectedNumTracks != null && 39 if (expectedNumTracks != null &&
40 peerConnection_().getSenders().length != expectedNumTracks) { 40 peerConnection_().getSenders().length != expectedNumTracks) {
41 throw failTest('getSenders().length != expectedNumTracks'); 41 throw failTest('getSenders().length != expectedNumTracks');
42 } 42 }
43 if (!arrayEquals_(peerConnection_().getSenders(), 43 if (!arrayEquals_(peerConnection_().getSenders(),
44 peerConnection_().getSenders())) { 44 peerConnection_().getSenders())) {
45 throw failTest('One getSenders() call is not equal to the next.'); 45 throw failTest('One getSenders() call is not equal to the next.');
46 } 46 }
47 47
48 let localTracks = new Set();
49 peerConnection_().getLocalStreams().forEach(function(stream) {
50 stream.getTracks().forEach(function(track) {
51 localTracks.add(track);
52 });
53 });
54 if (peerConnection_().getSenders().length != localTracks.size)
55 throw failTest('The number of senders and tracks are not the same.');
56
57 let senders = new Set(); 48 let senders = new Set();
58 let senderTracks = new Set(); 49 let senderTracks = new Set();
59 peerConnection_().getSenders().forEach(function(sender) { 50 peerConnection_().getSenders().forEach(function(sender) {
60 if (sender == null) 51 if (sender == null)
61 throw failTest('sender is null or undefined.'); 52 throw failTest('sender is null or undefined.');
62 if (sender.track == null) 53 if (sender.track == null)
63 throw failTest('sender.track is null or undefined.'); 54 throw failTest('sender.track is null or undefined.');
64 senders.add(sender); 55 senders.add(sender);
65 senderTracks.add(sender.track); 56 senderTracks.add(sender.track);
66 }); 57 });
67 if (senderTracks.size != senders.size) 58 if (senderTracks.size != senders.size)
68 throw failTest('senderTracks.size != senders.size'); 59 throw failTest('senderTracks.size != senders.size');
69 60
70 if (!setEquals_(senderTracks, localTracks)) {
71 throw failTest('The set of sender tracks is not equal to the set of ' +
72 'stream tracks.');
73 }
74 returnToTest('ok-senders-verified'); 61 returnToTest('ok-senders-verified');
75 } 62 }
76 63
77 /** 64 /**
78 * Verifies that the peer connection's getReceivers() returns one receiver per 65 * Verifies that the peer connection's getReceivers() returns one receiver per
79 * remote track, that there are no duplicates and that object identity is 66 * remote track, that there are no duplicates and that object identity is
80 * preserved. 67 * preserved.
81 * 68 *
82 * Returns "ok-receivers-verified" on success. 69 * Returns "ok-receivers-verified" on success.
83 */ 70 */
84 function verifyRtpReceivers(expectedNumTracks = null) { 71 function verifyRtpReceivers(expectedNumTracks = null) {
85 if (peerConnection_().getReceivers() == null) 72 if (peerConnection_().getReceivers() == null)
86 throw failTest('getReceivers() returns null or undefined.'); 73 throw failTest('getReceivers() returns null or undefined.');
87 if (expectedNumTracks != null && 74 if (expectedNumTracks != null &&
88 peerConnection_().getReceivers().length != expectedNumTracks) { 75 peerConnection_().getReceivers().length != expectedNumTracks) {
89 throw failTest('getReceivers().length != expectedNumTracks'); 76 throw failTest('getReceivers().length != expectedNumTracks');
90 } 77 }
91 if (!arrayEquals_(peerConnection_().getReceivers(), 78 if (!arrayEquals_(peerConnection_().getReceivers(),
92 peerConnection_().getReceivers())) { 79 peerConnection_().getReceivers())) {
93 throw failTest('One getReceivers() call is not equal to the next.'); 80 throw failTest('One getReceivers() call is not equal to the next.');
94 } 81 }
95 82
96 let remoteTracks = new Set();
97 peerConnection_().getRemoteStreams().forEach(function(stream) {
98 stream.getTracks().forEach(function(track) {
99 remoteTracks.add(track);
100 });
101 });
102 if (peerConnection_().getReceivers().length != remoteTracks.size)
103 throw failTest('The number of receivers and tracks are not the same.');
104
105 let receivers = new Set(); 83 let receivers = new Set();
106 let receiverTracks = new Set(); 84 let receiverTracks = new Set();
107 peerConnection_().getReceivers().forEach(function(receiver) { 85 peerConnection_().getReceivers().forEach(function(receiver) {
108 if (receiver == null) 86 if (receiver == null)
109 throw failTest('receiver is null or undefined.'); 87 throw failTest('receiver is null or undefined.');
110 if (receiver.track == null) 88 if (receiver.track == null)
111 throw failTest('receiver.track is null or undefined.'); 89 throw failTest('receiver.track is null or undefined.');
112 if (receiver.getContributingSources().length != 0) 90 if (receiver.getContributingSources().length != 0)
113 throw failTest('receiver.getContributingSources() is not empty.'); 91 throw failTest('receiver.getContributingSources() is not empty.');
114 receivers.add(receiver); 92 receivers.add(receiver);
115 receiverTracks.add(receiver.track); 93 receiverTracks.add(receiver.track);
116 }); 94 });
117 if (receiverTracks.size != receivers.size) 95 if (receiverTracks.size != receivers.size)
118 throw failTest('receiverTracks.size != receivers.size'); 96 throw failTest('receiverTracks.size != receivers.size');
119 97
120 if (!setEquals_(receiverTracks, remoteTracks)) { 98 returnToTest('ok-receivers-verified');
121 throw failTest('The set of receiver tracks is not equal to the set of ' + 99 }
122 'stream tracks.'); 100
101 /**
102 * Creates an audio and video track and adds them to the peer connection using
103 * |addTrack|. They are added with or without a stream in accordance with
104 * |streamArgumentType|.
105 *
106 * Returns
107 * "ok-<audio stream id> <audio track id> <video stream id> <video track id>" on
108 * success. If no stream is backing up the track, <stream id> is "null".
109 *
110 * @param {string} streamArgumentType Must be one of the following values:
111 * 'no-stream' - The tracks are added without an associated stream.
112 * 'shared-stream' - The tracks are added with the same associated stream.
113 * 'individual-streams' - A stream is created for each track.
114 */
115 function createAndAddAudioAndVideoTrack(streamArgumentType) {
116 if (streamArgumentType !== 'no-stream' &&
117 streamArgumentType !== 'shared-stream' &&
118 streamArgumentType !== 'individual-streams')
119 throw failTest('Unsupported streamArgumentType.');
120 getUserMedia({ audio: true, video: true },
121 function(stream) {
122 let audioStream = undefined;
123 if (streamArgumentType !== 'no-stream')
124 audioStream = new MediaStream();
125
126 let audioTrack = stream.getAudioTracks()[0];
127 let audioSender =
128 audioStream ? peerConnection_().addTrack(audioTrack, audioStream)
129 : peerConnection_().addTrack(audioTrack);
130 if (!audioSender || audioSender.track != audioTrack)
131 throw failTest('addTrack did not return a sender with the track.');
132
133 let videoStream = undefined;
134 if (streamArgumentType === 'shared-stream') {
135 videoStream = audioStream;
136 } else if (streamArgumentType === 'individual-streams') {
137 videoStream = new MediaStream();
138 }
139
140 let videoTrack = stream.getVideoTracks()[0];
141 let videoSender =
142 videoStream ? peerConnection_().addTrack(videoTrack, videoStream)
143 : peerConnection_().addTrack(videoTrack);
144 if (!videoSender || videoSender.track != videoTrack)
145 throw failTest('addTrack did not return a sender with the track.');
146
147 let audioStreamId = audioStream ? audioStream.id : 'null';
148 let videoStreamId = videoStream ? videoStream.id : 'null';
149 returnToTest('ok-' + audioStreamId + ' ' + audioTrack.id
150 + ' ' + videoStreamId + ' ' + videoTrack.id);
151 },
152 function(error) {
153 throw failTest('getUserMedia failed: ' + error);
154 });
155 }
156
157 /**
158 * Calls |removeTrack| with the first sender that has the track with |trackId|
159 * and verifies the SDP is updated accordingly.
160 *
161 * Returns "ok-sender-removed" on success.
162 */
163 function removeTrack(trackId) {
164 let sender = null;
165 let otherSenderHasTrack = false;
166 peerConnection_().getSenders().forEach(function(s) {
167 if (s.track && s.track.id == trackId) {
168 if (!sender)
169 sender = s;
170 else
171 otherSenderHasTrack = true;
172 }
173 });
174 if (!sender)
175 throw failTest('There is no sender for track ' + trackId);
176 peerConnection_().removeTrack(sender);
177 if (sender.track)
178 throw failTest('sender.track was not nulled by removeTrack.');
179 returnToTest('ok-sender-removed');
180 }
181
182 /**
183 * Returns "ok-stream-with-track-found" or "ok-stream-with-track-not-found".
184 * If |streamId| is null then any stream having a track with |trackId| will do.
185 */
186 function hasLocalStreamWithTrack(streamId, trackId) {
187 if (hasStreamWithTrack(
188 peerConnection_().getLocalStreams(), streamId, trackId)) {
189 returnToTest('ok-stream-with-track-found');
190 return;
123 } 191 }
124 returnToTest('ok-receivers-verified'); 192 returnToTest('ok-stream-with-track-not-found');
193 }
194
195 /**
196 * Returns "ok-stream-with-track-found" or "ok-stream-with-track-not-found".
197 * If |streamId| is null then any stream having a track with |trackId| will do.
198 */
199 function hasRemoteStreamWithTrack(streamId, trackId) {
200 if (hasStreamWithTrack(
201 peerConnection_().getRemoteStreams(), streamId, trackId)) {
202 returnToTest('ok-stream-with-track-found');
203 return;
204 }
205 returnToTest('ok-stream-with-track-not-found');
206 }
207
208 /**
209 * Returns "ok-sender-with-track-found" or "ok-sender-with-track-not-found".
210 */
211 function hasSenderWithTrack(trackId) {
212 if (hasSenderOrReceiverWithTrack(peerConnection_().getSenders(), trackId)) {
213 returnToTest('ok-sender-with-track-found');
214 return;
215 }
216 returnToTest('ok-sender-with-track-not-found');
217 }
218
219 /**
220 * Returns "ok-receiver-with-track-found" or "ok-receiver-with-track-not-found".
221 */
222 function hasReceiverWithTrack(trackId) {
223 if (hasSenderOrReceiverWithTrack(peerConnection_().getReceivers(), trackId)) {
224 returnToTest('ok-receiver-with-track-found');
225 return;
226 }
227 returnToTest('ok-receiver-with-track-not-found');
125 } 228 }
126 229
127 // Internals. 230 // Internals.
128 231
129 /** @private */ 232 /** @private */
233 function hasStreamWithTrack(streams, streamId, trackId) {
234 for (let i = 0; i < streams.length; ++i) {
235 let stream = streams[i];
236 if (streamId && stream.id !== streamId)
237 continue;
238 let tracks = stream.getTracks();
239 for (let j = 0; j < tracks.length; ++j) {
240 let track = tracks[j];
241 if (track.id == trackId) {
242 return true;
243 }
244 }
245 }
246 return false;
247 }
248
249 /** @private */
250 function hasSenderOrReceiverWithTrack(sendersOrReceivers, trackId) {
251 for (let i = 0; i < sendersOrReceivers.length; ++i) {
252 if (sendersOrReceivers[i].track &&
253 sendersOrReceivers[i].track.id === trackId) {
254 return true;
255 }
256 }
257 return false;
258 }
259
260 /** @private */
130 function arrayEquals_(a, b) { 261 function arrayEquals_(a, b) {
131 if (a == null) 262 if (a == null)
132 return b == null; 263 return b == null;
133 if (a.length != b.length) 264 if (a.length != b.length)
134 return false; 265 return false;
135 for (let i = 0; i < a.length; ++i) { 266 for (let i = 0; i < a.length; ++i) {
136 if (a[i] !== b[i]) 267 if (a[i] !== b[i])
137 return false; 268 return false;
138 } 269 }
139 return true; 270 return true;
140 } 271 }
141 272
142 /** @private */ 273 /** @private */
143 function setEquals_(a, b) { 274 function setEquals_(a, b) {
144 if (a == null) 275 if (a == null)
145 return b == null; 276 return b == null;
146 if (a.size != b.size) 277 if (a.size != b.size)
147 return false; 278 return false;
148 a.forEach(function(value) { 279 a.forEach(function(value) {
149 if (!b.has(value)) 280 if (!b.has(value))
150 return false; 281 return false;
151 }); 282 });
152 return true; 283 return true;
153 } 284 }
OLDNEW
« no previous file with comments | « chrome/test/data/webrtc/peerconnection.js ('k') | content/renderer/media/rtc_peer_connection_handler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698