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

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

Powered by Google App Engine
This is Rietveld 408576698