OLD | NEW |
---|---|
(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> | |
OLD | NEW |