Chromium Code Reviews| Index: third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html |
| diff --git a/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html |
| new file mode 100644 |
| index 0000000000000000000000000000000000000000..b6d2ab9b4879b5422534bdbcb836008f2f2f64f4 |
| --- /dev/null |
| +++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html |
| @@ -0,0 +1,203 @@ |
| +<!DOCTYPE html> |
| +<html> |
| +<head> |
| +<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!
|
| +<script src="../../resources/testharness.js"></script> |
| +<script src="../../resources/testharnessreport.js"></script> |
| +</head> |
| +<body> |
| +<script> |
| +promise_test(function() { |
| + let pc = new RTCPeerConnection(); |
| + return createStreams({audio:true}, 1) |
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, false); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + }); |
| +}, 'getReceivers() for a single audio track.'); |
| + |
| +promise_test(function() { |
| + let pc = new RTCPeerConnection(); |
| + return createStreams({video:true}, 1) |
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, false, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + }); |
| +}, 'getReceivers() for a single video track.'); |
| + |
| +promise_test(function() { |
| + let pc = new RTCPeerConnection(); |
| + return createStreams({audio:true, video:true}, 1) |
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + }); |
| +}, 'getReceivers() for a single stream with an audio and video track.'); |
| + |
| +promise_test(function() { |
| + let pc = new RTCPeerConnection(); |
| + 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.
|
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 5, true, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + }); |
| +}, 'getReceivers() for multiple audio-video streams.'); |
| + |
| +promise_test(function() { |
| + let pc = new RTCPeerConnection(); |
| + let receivers = new Set(); |
| + return createStreams({audio:true, video:true}, 5) |
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 5, true, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + |
| + for (let i = 0; i < pc.getReceivers().length; ++i) |
| + receivers.add(pc.getReceivers()[i]); |
| + // 2 receivers per stream, one for audio and one for video |
| + assert_equals(receivers.size, 10); |
| + |
| + // Remove first, middle and last streams. |
| + 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.
|
| + pc.getLocalStreams()[2], |
| + pc.getLocalStreams()[4] ]); |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + |
| + for (let i = 0; i < pc.getReceivers().length; ++i) |
| + assert_true(receivers.has(pc.getReceivers()[i])); |
| + |
| + return createStreams({audio:true, video:true}, 2); |
| + }) |
| + .then(function(streams) { |
| + return addRemoteStreamsFromLocalStreams(pc, streams); |
| + }) |
| + .then(function() { |
| + verifyStreamAndTrackCounts(pc.getRemoteStreams(), 4, true, true); |
| + verifyRemoteTracksHaveReceivers(pc); |
| + |
| + // |receivers| contains all receivers so far (10), including the ones for |
| + // the removed streams. The set does not contain duplicates, so adding all |
| + // receivers here should only increase the size for the 2 new streams (4 |
| + // new receivers). |
| + for (let i = 0; i < pc.getReceivers().length; ++i) |
| + receivers.add(pc.getReceivers()[i]); |
| + assert_equals(receivers.size, 14); |
| + }); |
| +}, 'getReceivers() for streams being added and removed.'); |
| + |
| +/** |
| + * Helper functions to tests. |
| + */ |
| + |
| +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.
|
| + assert_equals(a.length, b.length); |
| + for (let i = 0; i < a.length; ++i) { |
| + assert_equals(a[i], b[i]); |
| + } |
| +} |
| + |
| +function createStreams(constraints, numStreams, streamsSoFar = []) { |
| + if (numStreams == 0) { |
| + 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.
|
| + resolve(streamsSoFar); |
| + }); |
| + } |
| + return navigator.mediaDevices.getUserMedia(constraints) |
| + .then(function(stream) { |
| + return createStreams(constraints, |
| + numStreams - 1, |
| + streamsSoFar.concat([stream])); |
| + }); |
| +} |
| + |
| +/** |
| + * Adds |localStreams| to the peer connection and |
| + * |makeRemoteStreamsMatchLocalStreams|. |
| + * |
| + * Returns a promise. |
| + */ |
| +function addRemoteStreamsFromLocalStreams(pc, localStreams) { |
| + for (let i = 0; i < localStreams.length; ++i) |
| + 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
|
| + return makeRemoteStreamsMatchLocalStreams(pc); |
| +} |
| + |
| +/** |
| + * Removes |localStreams| from the peer connection and |
| + * |makeRemoteStreamsMatchLocalStreams|. |
| + * |
| + * Returns a promise. |
| + */ |
| +function removeRemoteStreamsFromLocalStreams(pc, localStreams) { |
| + for (let i = 0; i < localStreams.length; ++i) |
| + pc.removeStream(localStreams[i]); |
| + return makeRemoteStreamsMatchLocalStreams(pc); |
| +} |
| + |
| +/** |
| + * Makes the peer connection's remote streams match its local streams. New local |
| + * streams result in cloning, removed local streams result in removing the |
| + * corresponding remote stream. |
| + * |
| + * Returns a promise. |
| + */ |
| +function makeRemoteStreamsMatchLocalStreams(pc) { |
| + // In LayoutTests a |MockWebRTCPeerConnectionHandler| is used and as such we |
| + // 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
|
| + // streams match the local streams on |setRemoteDescription|. |
| + return pc.setRemoteDescription( |
| + new RTCSessionDescription({type:'answer', sdp:'remote'})); |
| +} |
| + |
| +function verifyStreamAndTrackCounts(streams, streamCount, audio, video) { |
| + assert_equals(streams.length, streamCount); |
| + for (let i = 0; i < streams.length; ++i) { |
| + assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0); |
| + assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0); |
| + } |
| +} |
| + |
| +function verifyRemoteTracksHaveReceivers(pc) { |
| + let remoteTracks = new Set(); |
| + let remoteStreams = pc.getRemoteStreams(); |
| + for (let i = 0; i < remoteStreams.length; ++i) { |
| + 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.
|
| + for (let j = 0; j < remoteAudioTracks.length; ++j) |
| + remoteTracks.add(remoteAudioTracks[j]); |
| + let remoteVideoTracks = remoteStreams[i].getVideoTracks(); |
| + for (let j = 0; j < remoteVideoTracks.length; ++j) |
| + remoteTracks.add(remoteVideoTracks[j]); |
| + } |
| + |
| + // 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.
|
| + assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
| + |
| + let receiverTracks = new Set(); |
| + let receivers = pc.getReceivers(); |
| + for (let i = 0; i < receivers.length; ++i) { |
| + assert_true(receivers[i] != null); |
| + assert_true(receivers[i].track != null); |
| + assert_true(remoteTracks.has(receivers[i].track)); |
| + assert_false(receiverTracks.has(receivers[i].track)); |
| + receiverTracks.add(receivers[i].track); |
| + } |
| + assert_equals(receiverTracks.size, remoteTracks.size); |
| +} |
| +</script> |
| +</body> |
| +</html> |