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

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 /** @private */
8 var gOnNegotiationNeededCount = undefined;
9
7 // Public interface to tests. These are expected to be called with 10 // Public interface to tests. These are expected to be called with
8 // ExecuteJavascript invocations from the browser tests and will return answers 11 // ExecuteJavascript invocations from the browser tests and will return answers
9 // through the DOM automation controller. 12 // through the DOM automation controller.
10 13
11 /** 14 /**
12 * Adds |count| streams to the peer connection, with one audio and one video 15 * Adds |count| streams to the peer connection, with one audio and one video
13 * track per stream. 16 * track per stream.
14 * 17 *
15 * Returns "ok-streams-created-and-added" on success. 18 * Returns "ok-streams-created-and-added" on success.
16 */ 19 */
(...skipping 21 matching lines...) Expand all
38 function verifyRtpSenders(expectedNumTracks = null) { 41 function verifyRtpSenders(expectedNumTracks = null) {
39 if (expectedNumTracks != null && 42 if (expectedNumTracks != null &&
40 peerConnection_().getSenders().length != expectedNumTracks) { 43 peerConnection_().getSenders().length != expectedNumTracks) {
41 throw failTest('getSenders().length != expectedNumTracks'); 44 throw failTest('getSenders().length != expectedNumTracks');
42 } 45 }
43 if (!arrayEquals_(peerConnection_().getSenders(), 46 if (!arrayEquals_(peerConnection_().getSenders(),
44 peerConnection_().getSenders())) { 47 peerConnection_().getSenders())) {
45 throw failTest('One getSenders() call is not equal to the next.'); 48 throw failTest('One getSenders() call is not equal to the next.');
46 } 49 }
47 50
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(); 51 let senders = new Set();
58 let senderTracks = new Set(); 52 let senderTracks = new Set();
59 peerConnection_().getSenders().forEach(function(sender) { 53 peerConnection_().getSenders().forEach(function(sender) {
60 if (sender == null) 54 if (sender == null)
61 throw failTest('sender is null or undefined.'); 55 throw failTest('sender is null or undefined.');
62 if (sender.track == null) 56 if (sender.track == null)
63 throw failTest('sender.track is null or undefined.'); 57 throw failTest('sender.track is null or undefined.');
64 senders.add(sender); 58 senders.add(sender);
65 senderTracks.add(sender.track); 59 senderTracks.add(sender.track);
66 }); 60 });
67 if (senderTracks.size != senders.size) 61 if (senderTracks.size != senders.size)
68 throw failTest('senderTracks.size != senders.size'); 62 throw failTest('senderTracks.size != senders.size');
69 63
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'); 64 returnToTest('ok-senders-verified');
75 } 65 }
76 66
77 /** 67 /**
78 * Verifies that the peer connection's getReceivers() returns one receiver per 68 * Verifies that the peer connection's getReceivers() returns one receiver per
79 * remote track, that there are no duplicates and that object identity is 69 * remote track, that there are no duplicates and that object identity is
80 * preserved. 70 * preserved.
81 * 71 *
82 * Returns "ok-receivers-verified" on success. 72 * Returns "ok-receivers-verified" on success.
83 */ 73 */
84 function verifyRtpReceivers(expectedNumTracks = null) { 74 function verifyRtpReceivers(expectedNumTracks = null) {
85 if (peerConnection_().getReceivers() == null) 75 if (peerConnection_().getReceivers() == null)
86 throw failTest('getReceivers() returns null or undefined.'); 76 throw failTest('getReceivers() returns null or undefined.');
87 if (expectedNumTracks != null && 77 if (expectedNumTracks != null &&
88 peerConnection_().getReceivers().length != expectedNumTracks) { 78 peerConnection_().getReceivers().length != expectedNumTracks) {
89 throw failTest('getReceivers().length != expectedNumTracks'); 79 throw failTest('getReceivers().length != expectedNumTracks');
90 } 80 }
91 if (!arrayEquals_(peerConnection_().getReceivers(), 81 if (!arrayEquals_(peerConnection_().getReceivers(),
92 peerConnection_().getReceivers())) { 82 peerConnection_().getReceivers())) {
93 throw failTest('One getReceivers() call is not equal to the next.'); 83 throw failTest('One getReceivers() call is not equal to the next.');
94 } 84 }
95 85
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(); 86 let receivers = new Set();
106 let receiverTracks = new Set(); 87 let receiverTracks = new Set();
107 peerConnection_().getReceivers().forEach(function(receiver) { 88 peerConnection_().getReceivers().forEach(function(receiver) {
108 if (receiver == null) 89 if (receiver == null)
109 throw failTest('receiver is null or undefined.'); 90 throw failTest('receiver is null or undefined.');
110 if (receiver.track == null) 91 if (receiver.track == null)
111 throw failTest('receiver.track is null or undefined.'); 92 throw failTest('receiver.track is null or undefined.');
112 if (receiver.getContributingSources().length != 0) 93 if (receiver.getContributingSources().length != 0)
113 throw failTest('receiver.getContributingSources() is not empty.'); 94 throw failTest('receiver.getContributingSources() is not empty.');
114 receivers.add(receiver); 95 receivers.add(receiver);
115 receiverTracks.add(receiver.track); 96 receiverTracks.add(receiver.track);
116 }); 97 });
117 if (receiverTracks.size != receivers.size) 98 if (receiverTracks.size != receivers.size)
118 throw failTest('receiverTracks.size != receivers.size'); 99 throw failTest('receiverTracks.size != receivers.size');
119 100
120 if (!setEquals_(receiverTracks, remoteTracks)) { 101 returnToTest('ok-receivers-verified');
121 throw failTest('The set of receiver tracks is not equal to the set of ' + 102 }
122 'stream tracks.'); 103
104 /**
105 * Creates an audio and video track and adds them to the peer connection using
106 * |addTrack|. They are added with or without a stream in accordance with
107 * |streamArgumentType|.
108 *
109 * Returns
110 * "ok-<audio stream id> <audio track id> <video stream id> <video track id>" on
111 * success. If no stream is backing up the track, <stream id> is "null".
112 *
113 * @param {string} streamArgumentType Must be one of the following values:
114 * 'no-stream' - The tracks are added without an associated stream.
115 * 'shared-stream' - The tracks are added with the same associated stream.
116 * 'individual-streams' - A stream is created for each track.
117 */
118 function createAndAddAudioAndVideoTrack(streamArgumentType) {
119 if (streamArgumentType !== 'no-stream' &&
120 streamArgumentType !== 'shared-stream' &&
121 streamArgumentType !== 'individual-streams')
122 throw failTest('Unsupported streamArgumentType.');
123 getUserMedia({ audio: true, video: true },
124 function(stream) {
125 let audioStream = undefined;
126 if (streamArgumentType !== 'no-stream')
127 audioStream = new MediaStream();
128
129 let audioTrack = stream.getAudioTracks()[0];
130 let audioSender =
131 audioStream ? peerConnection_().addTrack(audioTrack, audioStream)
132 : peerConnection_().addTrack(audioTrack);
133 if (!audioSender || audioSender.track != audioTrack)
134 throw failTest('addTrack did not return a sender with the track.');
135
136 let videoStream = undefined;
137 if (streamArgumentType === 'shared-stream') {
138 videoStream = audioStream;
139 } else if (streamArgumentType === 'individual-streams') {
140 videoStream = new MediaStream();
141 }
142
143 let videoTrack = stream.getVideoTracks()[0];
144 let videoSender =
145 videoStream ? peerConnection_().addTrack(videoTrack, videoStream)
146 : peerConnection_().addTrack(videoTrack);
147 if (!videoSender || videoSender.track != videoTrack)
148 throw failTest('addTrack did not return a sender with the track.');
149
150 let audioStreamId = audioStream ? audioStream.id : 'null';
151 let videoStreamId = videoStream ? videoStream.id : 'null';
152 returnToTest('ok-' + audioStreamId + ' ' + audioTrack.id
153 + ' ' + videoStreamId + ' ' + videoTrack.id);
154 },
155 function(error) {
156 throw failTest('getUserMedia failed: ' + error);
157 });
158 }
159
160 /**
161 * Calls |removeTrack| with the first sender that has the track with |trackId|
162 * and verifies the SDP is updated accordingly.
163 *
164 * Returns "ok-sender-removed" on success.
165 */
166 function removeTrack(trackId) {
167 let sender = null;
168 let otherSenderHasTrack = false;
169 peerConnection_().getSenders().forEach(function(s) {
170 if (s.track && s.track.id == trackId) {
171 if (!sender)
172 sender = s;
173 else
174 otherSenderHasTrack = true;
175 }
176 });
177 if (!sender)
178 throw failTest('There is no sender for track ' + trackId);
179 peerConnection_().removeTrack(sender);
180 if (sender.track)
181 throw failTest('sender.track was not nulled by removeTrack.');
182 returnToTest('ok-sender-removed');
183 }
184
185 /**
186 */
187 function hasLocalStreamWithTrack(streamId, trackId) {
188 if (hasStreamWithTrack(
189 peerConnection_().getLocalStreams(), streamId, trackId)) {
190 returnToTest('ok-stream-with-track-found');
191 return;
123 } 192 }
124 returnToTest('ok-receivers-verified'); 193 returnToTest('ok-stream-with-track-not-found');
194 }
195
196 /**
197 */
198 function hasRemoteStreamWithTrack(streamId, trackId) {
199 if (hasStreamWithTrack(
200 peerConnection_().getRemoteStreams(), streamId, trackId)) {
201 returnToTest('ok-stream-with-track-found');
202 return;
203 }
204 returnToTest('ok-stream-with-track-not-found');
205 }
206
207 /**
208 */
209 function hasSenderWithTrack(trackId) {
210 if (hasSenderOrReceiverWithTrack(peerConnection_().getSenders(), trackId)) {
211 returnToTest('ok-sender-with-track-found');
212 return;
213 }
214 returnToTest('ok-sender-with-track-not-found');
215 }
216
217 /**
218 */
219 function hasReceiverWithTrack(trackId) {
220 if (hasSenderOrReceiverWithTrack(peerConnection_().getReceivers(), trackId)) {
221 returnToTest('ok-receiver-with-track-found');
222 return;
223 }
224 returnToTest('ok-receiver-with-track-not-found');
225 }
226
227 /**
228 */
229 function startCountingOnNegotiationNeeded() {
Taylor_Brandstetter 2017/07/07 19:44:14 I don't think you really need a "start counting" m
hbos_chromium 2017/07/10 12:32:59 I moved this to peerconnection.js where it always
230 gOnNegotiationNeededCount = 0;
231 peerConnection_().onnegotiationneeded = function() {
232 ++gOnNegotiationNeededCount;
233 }
234 returnToTest('ok-onnegotiationneeded-wired');
235 }
236
237 /**
238 */
239 function waitUntilOnNegotiationCountIs(count) {
240 if (gOnNegotiationNeededCount === undefined)
241 throw failTest('Must call startCountingOnNegotiationNeeded() first.');
242 let checkCount = function() {
243 if (gOnNegotiationNeededCount === count) {
244 returnToTest('ok-expected-count');
245 return;
246 }
247 window.setTimeout(checkCount, 10);
Taylor_Brandstetter 2017/07/07 19:44:13 Does this really need a timeout, even if it's only
hbos_chromium 2017/07/10 12:32:59 Done, changed to a getter instead of a "wait" and
248 };
249 checkCount();
125 } 250 }
126 251
127 // Internals. 252 // Internals.
128 253
129 /** @private */ 254 /** @private */
255 function hasStreamWithTrack(streams, streamId, trackId) {
256 for (let i = 0; i < streams.length; ++i) {
257 let stream = streams[i];
258 if (streamId && stream.id !== streamId)
259 continue;
260 let tracks = stream.getTracks();
261 for (let j = 0; j < tracks.length; ++j) {
262 let track = tracks[j];
263 if (track.id == trackId) {
264 return true;
265 }
266 }
267 }
268 return false;
269 }
270
271 /** @private */
272 function hasSenderOrReceiverWithTrack(sendersOrReceivers, trackId) {
273 for (let i = 0; i < sendersOrReceivers.length; ++i) {
274 if (sendersOrReceivers[i].track &&
275 sendersOrReceivers[i].track.id === trackId) {
276 return true;
277 }
278 }
279 return false;
280 }
281
282 /** @private */
130 function arrayEquals_(a, b) { 283 function arrayEquals_(a, b) {
131 if (a == null) 284 if (a == null)
132 return b == null; 285 return b == null;
133 if (a.length != b.length) 286 if (a.length != b.length)
134 return false; 287 return false;
135 for (let i = 0; i < a.length; ++i) { 288 for (let i = 0; i < a.length; ++i) {
136 if (a[i] !== b[i]) 289 if (a[i] !== b[i])
137 return false; 290 return false;
138 } 291 }
139 return true; 292 return true;
140 } 293 }
141 294
142 /** @private */ 295 /** @private */
143 function setEquals_(a, b) { 296 function setEquals_(a, b) {
144 if (a == null) 297 if (a == null)
145 return b == null; 298 return b == null;
146 if (a.size != b.size) 299 if (a.size != b.size)
147 return false; 300 return false;
148 a.forEach(function(value) { 301 a.forEach(function(value) {
149 if (!b.has(value)) 302 if (!b.has(value))
150 return false; 303 return false;
151 }); 304 });
152 return true; 305 return true;
153 } 306 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698