OLD | NEW |
(Empty) | |
| 1 <!DOCTYPE html> |
| 2 <html> |
| 3 <head> |
| 4 <title>RTCPeerConnection.getReceivers</title> |
| 5 <script src="../../resources/testharness.js"></script> |
| 6 <script src="../../resources/testharnessreport.js"></script> |
| 7 </head> |
| 8 <body> |
| 9 <script> |
| 10 promise_test(function() { |
| 11 let pc = new RTCPeerConnection(); |
| 12 return createStreams({audio:true}, 1) |
| 13 .then(function(streams) { |
| 14 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 15 }) |
| 16 .then(function() { |
| 17 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, false); |
| 18 verifyRemoteTracksHaveReceivers(pc); |
| 19 // Make sure object identities are preserved between calls. |
| 20 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 21 }); |
| 22 }, 'getReceivers() for a single audio track.'); |
| 23 |
| 24 promise_test(function() { |
| 25 let pc = new RTCPeerConnection(); |
| 26 return createStreams({video:true}, 1) |
| 27 .then(function(streams) { |
| 28 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 29 }) |
| 30 .then(function() { |
| 31 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, false, true); |
| 32 verifyRemoteTracksHaveReceivers(pc); |
| 33 // Make sure object identities are preserved between calls. |
| 34 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 35 }); |
| 36 }, 'getReceivers() for a single video track.'); |
| 37 |
| 38 promise_test(function() { |
| 39 let pc = new RTCPeerConnection(); |
| 40 return createStreams({audio:true, video:true}, 1) |
| 41 .then(function(streams) { |
| 42 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 43 }) |
| 44 .then(function() { |
| 45 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true); |
| 46 verifyRemoteTracksHaveReceivers(pc); |
| 47 // Make sure object identities are preserved between calls. |
| 48 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 49 }); |
| 50 }, 'getReceivers() for a single stream with an audio and video track.'); |
| 51 |
| 52 promise_test(function() { |
| 53 let pc = new RTCPeerConnection(); |
| 54 return createStreams({audio:true, video:true}, 2) |
| 55 .then(function(streams) { |
| 56 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 57 }) |
| 58 .then(function() { |
| 59 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
| 60 verifyRemoteTracksHaveReceivers(pc); |
| 61 // Make sure object identities are preserved between calls. |
| 62 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 63 }); |
| 64 }, 'getReceivers() for multiple audio-video streams.'); |
| 65 |
| 66 promise_test(function() { |
| 67 let pc = new RTCPeerConnection(); |
| 68 let receivers = new Set(); |
| 69 return createStreams({audio:true, video:true}, 2) |
| 70 .then(function(streams) { |
| 71 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 72 }) |
| 73 .then(function() { |
| 74 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
| 75 verifyRemoteTracksHaveReceivers(pc); |
| 76 // Make sure object identities are preserved between calls. |
| 77 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 78 |
| 79 for (let i = 0; i < pc.getReceivers().length; ++i) |
| 80 receivers.add(pc.getReceivers()[i]); |
| 81 // 2 receivers per stream, one for audio and one for video |
| 82 assert_equals(receivers.size, 4); |
| 83 |
| 84 removeRemoteStreamsFromLocalStreams(pc, [ pc.getLocalStreams()[0] ]); |
| 85 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true); |
| 86 verifyRemoteTracksHaveReceivers(pc); |
| 87 // Make sure object identities are preserved between calls. |
| 88 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 89 |
| 90 for (let i = 0; i < pc.getReceivers().length; ++i) |
| 91 assert_true(receivers.has(pc.getReceivers()[i])); |
| 92 |
| 93 return createStreams({audio:true, video:true}, 1); |
| 94 }) |
| 95 .then(function(streams) { |
| 96 return addRemoteStreamsFromLocalStreams(pc, streams); |
| 97 }) |
| 98 .then(function() { |
| 99 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
| 100 verifyRemoteTracksHaveReceivers(pc); |
| 101 // Make sure object identities are preserved between calls. |
| 102 assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| 103 |
| 104 // |receivers| contains all receivers so far (4), including the ones for |
| 105 // the removed streams. The set does not contain duplicates, so adding all |
| 106 // receivers here should only increase the size for the new stream (2 new |
| 107 // receivers). |
| 108 for (let i = 0; i < pc.getReceivers().length; ++i) |
| 109 receivers.add(pc.getReceivers()[i]); |
| 110 assert_equals(receivers.size, 6); |
| 111 |
| 112 removeRemoteStreamsFromLocalStreams(pc, pc.getLocalStreams()); |
| 113 assert_equals(pc.getRemoteStreams().length, 0); |
| 114 assert_equals(pc.getReceivers().length, 0); |
| 115 }); |
| 116 }, 'getReceivers() for streams being added and removed.'); |
| 117 |
| 118 /** |
| 119 * Helper functions to tests. |
| 120 */ |
| 121 |
| 122 function createStreams(constraints, numStreams, streamsSoFar = []) { |
| 123 if (numStreams == 0) { |
| 124 return Promise.resolve(streamsSoFar);; |
| 125 } |
| 126 return navigator.mediaDevices.getUserMedia(constraints) |
| 127 .then(function(stream) { |
| 128 return createStreams(constraints, |
| 129 numStreams - 1, |
| 130 streamsSoFar.concat([stream])); |
| 131 }); |
| 132 } |
| 133 |
| 134 /** |
| 135 * Adds |localStreams| to the peer connection and |
| 136 * |makeRemoteStreamsMatchLocalStreams|. |
| 137 * |
| 138 * Returns a promise. |
| 139 */ |
| 140 function addRemoteStreamsFromLocalStreams(pc, localStreams) { |
| 141 for (let i = 0; i < localStreams.length; ++i) |
| 142 pc.addStream(localStreams[i]); |
| 143 return makeRemoteStreamsMatchLocalStreams(pc); |
| 144 } |
| 145 |
| 146 /** |
| 147 * Removes |localStreams| from the peer connection and |
| 148 * |makeRemoteStreamsMatchLocalStreams|. |
| 149 * |
| 150 * Returns a promise. |
| 151 */ |
| 152 function removeRemoteStreamsFromLocalStreams(pc, localStreams) { |
| 153 for (let i = 0; i < localStreams.length; ++i) |
| 154 pc.removeStream(localStreams[i]); |
| 155 return makeRemoteStreamsMatchLocalStreams(pc); |
| 156 } |
| 157 |
| 158 /** |
| 159 * Makes the peer connection's remote streams match its local streams. New local |
| 160 * streams result in cloning, removed local streams result in removing the |
| 161 * corresponding remote stream. |
| 162 * |
| 163 * Returns a promise. |
| 164 */ |
| 165 function makeRemoteStreamsMatchLocalStreams(pc) { |
| 166 // In LayoutTests a |MockWebRTCPeerConnectionHandler| is used and as such we |
| 167 // cannot establish a real call. Instead we rely on the mock making remote |
| 168 // streams match the local streams on |setRemoteDescription|. |
| 169 return pc.setRemoteDescription( |
| 170 new RTCSessionDescription({type:'answer', sdp:'remote'})) |
| 171 .then(function() { |
| 172 let localStreams = pc.getLocalStreams(); |
| 173 let remoteStreams = pc.getRemoteStreams(); |
| 174 assert_equals(localStreams.length, remoteStreams.length); |
| 175 for (let i = 0; i < localStreams.length; i++) { |
| 176 assert_equals(localStreams[i].getAudioTracks().length, |
| 177 remoteStreams[i].getAudioTracks().length); |
| 178 assert_equals(localStreams[i].getVideoTracks().length, |
| 179 remoteStreams[i].getVideoTracks().length); |
| 180 } |
| 181 return Promise.resolve(); |
| 182 }); |
| 183 } |
| 184 |
| 185 function verifyStreamAndTrackCounts(streams, streamCount, audio, video) { |
| 186 assert_equals(streams.length, streamCount); |
| 187 for (let i = 0; i < streams.length; ++i) { |
| 188 assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0); |
| 189 assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0); |
| 190 } |
| 191 } |
| 192 |
| 193 function verifyRemoteTracksHaveReceivers(pc) { |
| 194 let remoteTracks = new Set(); |
| 195 let remoteStreams = pc.getRemoteStreams(); |
| 196 for (let i = 0; i < remoteStreams.length; ++i) { |
| 197 let remoteStreamTracks = remoteStreams[i].getTracks(); |
| 198 for (let j = 0; j < remoteStreamTracks.length; ++j) { |
| 199 remoteTracks.add(remoteStreamTracks[j]); |
| 200 } |
| 201 } |
| 202 |
| 203 let receiverTracks = new Set(); |
| 204 let receivers = pc.getReceivers(); |
| 205 for (let i = 0; i < receivers.length; ++i) { |
| 206 assert_true(receivers[i] != null); |
| 207 assert_true(receivers[i].track != null); |
| 208 assert_true(remoteTracks.has(receivers[i].track)); |
| 209 assert_false(receiverTracks.has(receivers[i].track)); |
| 210 receiverTracks.add(receivers[i].track); |
| 211 } |
| 212 assert_equals(receiverTracks.size, remoteTracks.size); |
| 213 } |
| 214 </script> |
| 215 </body> |
| 216 </html> |
OLD | NEW |