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

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

Issue 2759953003: Interface RTCRtpReceiver and RTCPeerConnection.getReceivers() added. (Closed)
Patch Set: DISALLOW_COPY_AND_ASSIGN 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..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>

Powered by Google App Engine
This is Rietveld 408576698