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> |