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

Side by Side 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, 8 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 unified diff | Download patch
OLDNEW
(Empty)
1 <!DOCTYPE html>
2 <html>
3 <head>
4 <title>RTCPeerConnection.getReceivers</title>
5 <script src="../../resources/testharness.js"></script>
6 <script src="../../resources/testharnessreport.js"></script>
7 </head>
8 <body>
9 <script>
10 promise_test(function() {
11 let pc = new RTCPeerConnection();
12 return createStreams({audio:true}, 1)
13 .then(function(streams) {
14 return addRemoteStreamsFromLocalStreams(pc, streams);
15 })
16 .then(function() {
17 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, false);
18 verifyRemoteTracksHaveReceivers(pc);
19 // Make sure object identities are preserved between calls.
20 assert_array_equals(pc.getReceivers(), pc.getReceivers());
21 });
22 }, 'getReceivers() for a single audio track.');
23
24 promise_test(function() {
25 let pc = new RTCPeerConnection();
26 return createStreams({video:true}, 1)
27 .then(function(streams) {
28 return addRemoteStreamsFromLocalStreams(pc, streams);
29 })
30 .then(function() {
31 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, false, true);
32 verifyRemoteTracksHaveReceivers(pc);
33 // Make sure object identities are preserved between calls.
34 assert_array_equals(pc.getReceivers(), pc.getReceivers());
35 });
36 }, 'getReceivers() for a single video track.');
37
38 promise_test(function() {
39 let pc = new RTCPeerConnection();
40 return createStreams({audio:true, video:true}, 1)
41 .then(function(streams) {
42 return addRemoteStreamsFromLocalStreams(pc, streams);
43 })
44 .then(function() {
45 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true);
46 verifyRemoteTracksHaveReceivers(pc);
47 // Make sure object identities are preserved between calls.
48 assert_array_equals(pc.getReceivers(), pc.getReceivers());
49 });
50 }, 'getReceivers() for a single stream with an audio and video track.');
51
52 promise_test(function() {
53 let pc = new RTCPeerConnection();
54 return createStreams({audio:true, video:true}, 2)
55 .then(function(streams) {
56 return addRemoteStreamsFromLocalStreams(pc, streams);
57 })
58 .then(function() {
59 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true);
60 verifyRemoteTracksHaveReceivers(pc);
61 // Make sure object identities are preserved between calls.
62 assert_array_equals(pc.getReceivers(), pc.getReceivers());
63 });
64 }, 'getReceivers() for multiple audio-video streams.');
65
66 promise_test(function() {
67 let pc = new RTCPeerConnection();
68 let receivers = new Set();
69 return createStreams({audio:true, video:true}, 2)
70 .then(function(streams) {
71 return addRemoteStreamsFromLocalStreams(pc, streams);
72 })
73 .then(function() {
74 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true);
75 verifyRemoteTracksHaveReceivers(pc);
76 // Make sure object identities are preserved between calls.
77 assert_array_equals(pc.getReceivers(), pc.getReceivers());
78
79 for (let i = 0; i < pc.getReceivers().length; ++i)
80 receivers.add(pc.getReceivers()[i]);
81 // 2 receivers per stream, one for audio and one for video
82 assert_equals(receivers.size, 4);
83
84 removeRemoteStreamsFromLocalStreams(pc, [ pc.getLocalStreams()[0] ]);
85 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 1, true, true);
86 verifyRemoteTracksHaveReceivers(pc);
87 // Make sure object identities are preserved between calls.
88 assert_array_equals(pc.getReceivers(), pc.getReceivers());
89
90 for (let i = 0; i < pc.getReceivers().length; ++i)
91 assert_true(receivers.has(pc.getReceivers()[i]));
92
93 return createStreams({audio:true, video:true}, 1);
94 })
95 .then(function(streams) {
96 return addRemoteStreamsFromLocalStreams(pc, streams);
97 })
98 .then(function() {
99 verifyStreamAndTrackCounts(pc.getRemoteStreams(), 2, true, true);
100 verifyRemoteTracksHaveReceivers(pc);
101 // Make sure object identities are preserved between calls.
102 assert_array_equals(pc.getReceivers(), pc.getReceivers());
103
104 // |receivers| contains all receivers so far (4), including the ones for
105 // the removed streams. The set does not contain duplicates, so adding all
106 // receivers here should only increase the size for the new stream (2 new
107 // receivers).
108 for (let i = 0; i < pc.getReceivers().length; ++i)
109 receivers.add(pc.getReceivers()[i]);
110 assert_equals(receivers.size, 6);
111
112 removeRemoteStreamsFromLocalStreams(pc, pc.getLocalStreams());
113 assert_equals(pc.getRemoteStreams().length, 0);
114 assert_equals(pc.getReceivers().length, 0);
115 });
116 }, 'getReceivers() for streams being added and removed.');
117
118 /**
119 * Helper functions to tests.
120 */
121
122 function createStreams(constraints, numStreams, streamsSoFar = []) {
123 if (numStreams == 0) {
124 return Promise.resolve(streamsSoFar);;
125 }
126 return navigator.mediaDevices.getUserMedia(constraints)
127 .then(function(stream) {
128 return createStreams(constraints,
129 numStreams - 1,
130 streamsSoFar.concat([stream]));
131 });
132 }
133
134 /**
135 * Adds |localStreams| to the peer connection and
136 * |makeRemoteStreamsMatchLocalStreams|.
137 *
138 * Returns a promise.
139 */
140 function addRemoteStreamsFromLocalStreams(pc, localStreams) {
141 for (let i = 0; i < localStreams.length; ++i)
142 pc.addStream(localStreams[i]);
143 return makeRemoteStreamsMatchLocalStreams(pc);
144 }
145
146 /**
147 * Removes |localStreams| from the peer connection and
148 * |makeRemoteStreamsMatchLocalStreams|.
149 *
150 * Returns a promise.
151 */
152 function removeRemoteStreamsFromLocalStreams(pc, localStreams) {
153 for (let i = 0; i < localStreams.length; ++i)
154 pc.removeStream(localStreams[i]);
155 return makeRemoteStreamsMatchLocalStreams(pc);
156 }
157
158 /**
159 * Makes the peer connection's remote streams match its local streams. New local
160 * streams result in cloning, removed local streams result in removing the
161 * corresponding remote stream.
162 *
163 * Returns a promise.
164 */
165 function makeRemoteStreamsMatchLocalStreams(pc) {
166 // In LayoutTests a |MockWebRTCPeerConnectionHandler| is used and as such we
167 // cannot establish a real call. Instead we rely on the mock making remote
168 // streams match the local streams on |setRemoteDescription|.
169 return pc.setRemoteDescription(
170 new RTCSessionDescription({type:'answer', sdp:'remote'}))
171 .then(function() {
172 let localStreams = pc.getLocalStreams();
173 let remoteStreams = pc.getRemoteStreams();
174 assert_equals(localStreams.length, remoteStreams.length);
175 for (let i = 0; i < localStreams.length; i++) {
176 assert_equals(localStreams[i].getAudioTracks().length,
177 remoteStreams[i].getAudioTracks().length);
178 assert_equals(localStreams[i].getVideoTracks().length,
179 remoteStreams[i].getVideoTracks().length);
180 }
181 return Promise.resolve();
182 });
183 }
184
185 function verifyStreamAndTrackCounts(streams, streamCount, audio, video) {
186 assert_equals(streams.length, streamCount);
187 for (let i = 0; i < streams.length; ++i) {
188 assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0);
189 assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0);
190 }
191 }
192
193 function verifyRemoteTracksHaveReceivers(pc) {
194 let remoteTracks = new Set();
195 let remoteStreams = pc.getRemoteStreams();
196 for (let i = 0; i < remoteStreams.length; ++i) {
197 let remoteStreamTracks = remoteStreams[i].getTracks();
198 for (let j = 0; j < remoteStreamTracks.length; ++j) {
199 remoteTracks.add(remoteStreamTracks[j]);
200 }
201 }
202
203 let receiverTracks = new Set();
204 let receivers = pc.getReceivers();
205 for (let i = 0; i < receivers.length; ++i) {
206 assert_true(receivers[i] != null);
207 assert_true(receivers[i].track != null);
208 assert_true(remoteTracks.has(receivers[i].track));
209 assert_false(receiverTracks.has(receivers[i].track));
210 receiverTracks.add(receivers[i].track);
211 }
212 assert_equals(receiverTracks.size, remoteTracks.size);
213 }
214 </script>
215 </body>
216 </html>
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698