Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 <!DOCTYPE html> | |
| 2 <html> | |
| 3 <head> | |
| 4 <title>RTCPeerConnection.getReceivers</title> | |
|
foolip
2017/03/29 10:07:58
Ideally a test like this would go directly in Layo
hbos_chromium
2017/03/29 13:50:13
Not only does it rely on addStream/removeStream (w
foolip
2017/03/29 14:17:48
Thanks!
| |
| 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 }); | |
| 20 }, 'getReceivers() for a single audio track.'); | |
| 21 | |
| 22 promise_test(function() { | |
| 23 let pc = new RTCPeerConnection(); | |
| 24 return createStreams({video:true}, 1) | |
| 25 .then(function(streams) { | |
| 26 return addRemoteStreamsFromLocalStreams(pc, streams); | |
| 27 }) | |
| 28 .then(function() { | |
| 29 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, false, true); | |
| 30 verifyRemoteTracksHaveReceivers(pc); | |
| 31 }); | |
| 32 }, 'getReceivers() for a single video track.'); | |
| 33 | |
| 34 promise_test(function() { | |
| 35 let pc = new RTCPeerConnection(); | |
| 36 return createStreams({audio:true, video:true}, 1) | |
| 37 .then(function(streams) { | |
| 38 return addRemoteStreamsFromLocalStreams(pc, streams); | |
| 39 }) | |
| 40 .then(function() { | |
| 41 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true); | |
| 42 verifyRemoteTracksHaveReceivers(pc); | |
| 43 }); | |
| 44 }, 'getReceivers() for a single stream with an audio and video track.'); | |
| 45 | |
| 46 promise_test(function() { | |
| 47 let pc = new RTCPeerConnection(); | |
| 48 return createStreams({audio:true, video:true}, 5) | |
|
foolip
2017/03/29 10:07:58
Are 5 streams needed to exercise the code paths th
hbos_chromium
2017/03/29 13:50:13
Done.
| |
| 49 .then(function(streams) { | |
| 50 return addRemoteStreamsFromLocalStreams(pc, streams); | |
| 51 }) | |
| 52 .then(function() { | |
| 53 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 5, true, true); | |
| 54 verifyRemoteTracksHaveReceivers(pc); | |
| 55 }); | |
| 56 }, 'getReceivers() for multiple audio-video streams.'); | |
| 57 | |
| 58 promise_test(function() { | |
| 59 let pc = new RTCPeerConnection(); | |
| 60 let receivers = new Set(); | |
| 61 return createStreams({audio:true, video:true}, 5) | |
| 62 .then(function(streams) { | |
| 63 return addRemoteStreamsFromLocalStreams(pc, streams); | |
| 64 }) | |
| 65 .then(function() { | |
| 66 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 5, true, true); | |
| 67 verifyRemoteTracksHaveReceivers(pc); | |
| 68 | |
| 69 for (let i = 0; i < pc.getReceivers().length; ++i) | |
| 70 receivers.add(pc.getReceivers()[i]); | |
| 71 // 2 receivers per stream, one for audio and one for video | |
| 72 assert_equals(receivers.size, 10); | |
| 73 | |
| 74 // Remove first, middle and last streams. | |
| 75 removeRemoteStreamsFromLocalStreams(pc, [ pc.getLocalStreams()[0], | |
|
foolip
2017/03/29 10:07:58
It looks like this is the only test involving remo
hbos_chromium
2017/03/29 13:50:12
Done.
| |
| 76 pc.getLocalStreams()[2], | |
| 77 pc.getLocalStreams()[4] ]); | |
| 78 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); | |
| 79 verifyRemoteTracksHaveReceivers(pc); | |
| 80 | |
| 81 for (let i = 0; i < pc.getReceivers().length; ++i) | |
| 82 assert_true(receivers.has(pc.getReceivers()[i])); | |
| 83 | |
| 84 return createStreams({audio:true, video:true}, 2); | |
| 85 }) | |
| 86 .then(function(streams) { | |
| 87 return addRemoteStreamsFromLocalStreams(pc, streams); | |
| 88 }) | |
| 89 .then(function() { | |
| 90 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 4, true, true); | |
| 91 verifyRemoteTracksHaveReceivers(pc); | |
| 92 | |
| 93 // |receivers| contains all receivers so far (10), including the ones for | |
| 94 // the removed streams. The set does not contain duplicates, so adding all | |
| 95 // receivers here should only increase the size for the 2 new streams (4 | |
| 96 // new receivers). | |
| 97 for (let i = 0; i < pc.getReceivers().length; ++i) | |
| 98 receivers.add(pc.getReceivers()[i]); | |
| 99 assert_equals(receivers.size, 14); | |
| 100 }); | |
| 101 }, 'getReceivers() for streams being added and removed.'); | |
| 102 | |
| 103 /** | |
| 104 * Helper functions to tests. | |
| 105 */ | |
| 106 | |
| 107 function assert_array_equals(a, b) { | |
|
foolip
2017/03/29 10:07:58
assert_array_equals already exists in testharness.
hbos_chromium
2017/03/29 13:50:13
Acknowledged.
| |
| 108 assert_equals(a.length, b.length); | |
| 109 for (let i = 0; i < a.length; ++i) { | |
| 110 assert_equals(a[i], b[i]); | |
| 111 } | |
| 112 } | |
| 113 | |
| 114 function createStreams(constraints, numStreams, streamsSoFar = []) { | |
| 115 if (numStreams == 0) { | |
| 116 return new Promise(function(resolve, reject) { | |
|
foolip
2017/03/29 10:07:58
return Promise.resolve(streamsSoFar)
hbos_chromium
2017/03/29 13:50:13
Done.
| |
| 117 resolve(streamsSoFar); | |
| 118 }); | |
| 119 } | |
| 120 return navigator.mediaDevices.getUserMedia(constraints) | |
| 121 .then(function(stream) { | |
| 122 return createStreams(constraints, | |
| 123 numStreams - 1, | |
| 124 streamsSoFar.concat([stream])); | |
| 125 }); | |
| 126 } | |
| 127 | |
| 128 /** | |
| 129 * Adds |localStreams| to the peer connection and | |
| 130 * |makeRemoteStreamsMatchLocalStreams|. | |
| 131 * | |
| 132 * Returns a promise. | |
| 133 */ | |
| 134 function addRemoteStreamsFromLocalStreams(pc, localStreams) { | |
| 135 for (let i = 0; i < localStreams.length; ++i) | |
| 136 pc.addStream(localStreams[i]); | |
|
foolip
2017/03/29 10:07:58
Is it possible to test this without using addStrea
hbos_chromium
2017/03/29 13:50:12
See previous comment. addTrack/removeTrack is not
| |
| 137 return makeRemoteStreamsMatchLocalStreams(pc); | |
| 138 } | |
| 139 | |
| 140 /** | |
| 141 * Removes |localStreams| from the peer connection and | |
| 142 * |makeRemoteStreamsMatchLocalStreams|. | |
| 143 * | |
| 144 * Returns a promise. | |
| 145 */ | |
| 146 function removeRemoteStreamsFromLocalStreams(pc, localStreams) { | |
| 147 for (let i = 0; i < localStreams.length; ++i) | |
| 148 pc.removeStream(localStreams[i]); | |
| 149 return makeRemoteStreamsMatchLocalStreams(pc); | |
| 150 } | |
| 151 | |
| 152 /** | |
| 153 * Makes the peer connection's remote streams match its local streams. New local | |
| 154 * streams result in cloning, removed local streams result in removing the | |
| 155 * corresponding remote stream. | |
| 156 * | |
| 157 * Returns a promise. | |
| 158 */ | |
| 159 function makeRemoteStreamsMatchLocalStreams(pc) { | |
| 160 // In LayoutTests a |MockWebRTCPeerConnectionHandler| is used and as such we | |
| 161 // cannot establish a real call. Instead we rely on the mock making remote | |
|
foolip
2017/03/29 10:07:58
Can you add an assert that shows that it actually
hbos_chromium
2017/03/29 13:50:12
Done. The best I can do is iterate local and remot
| |
| 162 // streams match the local streams on |setRemoteDescription|. | |
| 163 return pc.setRemoteDescription( | |
| 164 new RTCSessionDescription({type:'answer', sdp:'remote'})); | |
| 165 } | |
| 166 | |
| 167 function verifyStreamAndTrackCounts(streams, streamCount, audio, video) { | |
| 168 assert_equals(streams.length, streamCount); | |
| 169 for (let i = 0; i < streams.length; ++i) { | |
| 170 assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0); | |
| 171 assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0); | |
| 172 } | |
| 173 } | |
| 174 | |
| 175 function verifyRemoteTracksHaveReceivers(pc) { | |
| 176 let remoteTracks = new Set(); | |
| 177 let remoteStreams = pc.getRemoteStreams(); | |
| 178 for (let i = 0; i < remoteStreams.length; ++i) { | |
| 179 let remoteAudioTracks = remoteStreams[i].getAudioTracks(); | |
|
foolip
2017/03/29 10:07:58
Just getTracks() instead of getAudioTracks()+getVi
hbos_chromium
2017/03/29 13:50:13
Done.
| |
| 180 for (let j = 0; j < remoteAudioTracks.length; ++j) | |
| 181 remoteTracks.add(remoteAudioTracks[j]); | |
| 182 let remoteVideoTracks = remoteStreams[i].getVideoTracks(); | |
| 183 for (let j = 0; j < remoteVideoTracks.length; ++j) | |
| 184 remoteTracks.add(remoteVideoTracks[j]); | |
| 185 } | |
| 186 | |
| 187 // Make sure object identities are preserved between calls. | |
|
foolip
2017/03/29 10:07:58
Can you make a separate test for this, it doesn't
hbos_chromium
2017/03/29 13:50:13
Done.
| |
| 188 assert_array_equals(pc.getReceivers(), pc.getReceivers()); | |
| 189 | |
| 190 let receiverTracks = new Set(); | |
| 191 let receivers = pc.getReceivers(); | |
| 192 for (let i = 0; i < receivers.length; ++i) { | |
| 193 assert_true(receivers[i] != null); | |
| 194 assert_true(receivers[i].track != null); | |
| 195 assert_true(remoteTracks.has(receivers[i].track)); | |
| 196 assert_false(receiverTracks.has(receivers[i].track)); | |
| 197 receiverTracks.add(receivers[i].track); | |
| 198 } | |
| 199 assert_equals(receiverTracks.size, remoteTracks.size); | |
| 200 } | |
| 201 </script> | |
| 202 </body> | |
| 203 </html> | |
| OLD | NEW |