Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(74)

Unified Diff: third_party/WebKit/LayoutTests/fast/peerconnection/RTCPeerConnection-getReceivers.html

Issue 2759953003: Interface RTCRtpReceiver and RTCPeerConnection.getReceivers() added. (Closed)
Patch Set: Rebase with master Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
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>

Powered by Google App Engine
This is Rietveld 408576698