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..6bfbd5410d5faa75e9910663dd5d063457099985 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html |
@@ -0,0 +1,216 @@ |
+<!DOCTYPE html> |
+<html> |
+<head> |
+<title>RTCPeerConnection.getReceivers</title> |
+<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); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ }); |
+}, '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); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ }); |
+}, '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); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ }); |
+}, 'getReceivers() for a single stream with an audio and video track.'); |
+ |
+promise_test(function() { |
+ let pc = new RTCPeerConnection(); |
+ return createStreams({audio:true, video:true}, 2) |
+ .then(function(streams) { |
+ return addRemoteStreamsFromLocalStreams(pc, streams); |
+ }) |
+ .then(function() { |
+ verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
+ verifyRemoteTracksHaveReceivers(pc); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ }); |
+}, 'getReceivers() for multiple audio-video streams.'); |
+ |
+promise_test(function() { |
+ let pc = new RTCPeerConnection(); |
+ let receivers = new Set(); |
+ return createStreams({audio:true, video:true}, 2) |
+ .then(function(streams) { |
+ return addRemoteStreamsFromLocalStreams(pc, streams); |
+ }) |
+ .then(function() { |
+ verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
+ verifyRemoteTracksHaveReceivers(pc); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ |
+ 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, 4); |
+ |
+ removeRemoteStreamsFromLocalStreams(pc, [ pc.getLocalStreams()[0] ]); |
+ verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true); |
+ verifyRemoteTracksHaveReceivers(pc); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ |
+ for (let i = 0; i < pc.getReceivers().length; ++i) |
+ assert_true(receivers.has(pc.getReceivers()[i])); |
+ |
+ return createStreams({audio:true, video:true}, 1); |
+ }) |
+ .then(function(streams) { |
+ return addRemoteStreamsFromLocalStreams(pc, streams); |
+ }) |
+ .then(function() { |
+ verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true); |
+ verifyRemoteTracksHaveReceivers(pc); |
+ // Make sure object identities are preserved between calls. |
+ assert_array_equals(pc.getReceivers(), pc.getReceivers()); |
+ |
+ // |receivers| contains all receivers so far (4), 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 new stream (2 new |
+ // receivers). |
+ for (let i = 0; i < pc.getReceivers().length; ++i) |
+ receivers.add(pc.getReceivers()[i]); |
+ assert_equals(receivers.size, 6); |
+ |
+ removeRemoteStreamsFromLocalStreams(pc, pc.getLocalStreams()); |
+ assert_equals(pc.getRemoteStreams().length, 0); |
+ assert_equals(pc.getReceivers().length, 0); |
+ }); |
+}, 'getReceivers() for streams being added and removed.'); |
+ |
+/** |
+ * Helper functions to tests. |
+ */ |
+ |
+function createStreams(constraints, numStreams, streamsSoFar = []) { |
+ if (numStreams == 0) { |
+ return Promise.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]); |
+ 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 |
+ // streams match the local streams on |setRemoteDescription|. |
+ return pc.setRemoteDescription( |
+ new RTCSessionDescription({type:'answer', sdp:'remote'})) |
+ .then(function() { |
+ let localStreams = pc.getLocalStreams(); |
+ let remoteStreams = pc.getRemoteStreams(); |
+ assert_equals(localStreams.length, remoteStreams.length); |
+ for (let i = 0; i < localStreams.length; i++) { |
+ assert_equals(localStreams[i].getAudioTracks().length, |
+ remoteStreams[i].getAudioTracks().length); |
+ assert_equals(localStreams[i].getVideoTracks().length, |
+ remoteStreams[i].getVideoTracks().length); |
+ } |
+ return Promise.resolve(); |
+ }); |
+} |
+ |
+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 remoteStreamTracks = remoteStreams[i].getTracks(); |
+ for (let j = 0; j < remoteStreamTracks.length; ++j) { |
+ remoteTracks.add(remoteStreamTracks[j]); |
+ } |
+ } |
+ |
+ 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> |