OLD | NEW |
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 Loading... |
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 } |
OLD | NEW |