OLD | NEW |
1 <!DOCTYPE html> | 1 <!DOCTYPE html> |
2 <html> | 2 <html> |
3 <head> | 3 <head> |
4 <title>RTCPeerConnection.getSenders</title> | 4 <title>RTCPeerConnection.getSenders</title> |
5 <script src="../../resources/testharness.js"></script> | 5 <script src="../../resources/testharness.js"></script> |
6 <script src="../../resources/testharnessreport.js"></script> | 6 <script src="../../resources/testharnessreport.js"></script> |
7 </head> | 7 </head> |
8 <body> | 8 <body> |
9 <script> | 9 <script> |
10 promise_test(function() { | 10 promise_test(function() { |
11 let pc = new RTCPeerConnection(); | 11 let pc = new RTCPeerConnection(); |
12 return createStreams({audio:true}, 1) | 12 return createStreams({audio:true}, 1) |
13 .then(function(streams) { | 13 .then(function(streams) { |
14 for (let i = 0; i < streams.length; ++i) { | 14 for (let i = 0; i < streams.length; ++i) { |
15 pc.addStream(streams[i]); | 15 pc.addStream(streams[i]); |
16 } | 16 } |
17 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, false); | 17 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, false); |
18 verifyLocalTracksHaveSenders(pc); | 18 verifyLocalStreamTracksHaveSenders(pc); |
19 // Make sure object identities are preserved between calls. | 19 // Make sure object identities are preserved between calls. |
20 assert_array_equals(pc.getSenders(), pc.getSenders()); | 20 assert_array_equals(pc.getSenders(), pc.getSenders()); |
21 }); | 21 }); |
22 }, 'getSenders() for a single audio track.'); | 22 }, 'getSenders() for a stream with a single audio track.'); |
23 | 23 |
24 promise_test(function() { | 24 promise_test(function() { |
25 let pc = new RTCPeerConnection(); | 25 let pc = new RTCPeerConnection(); |
26 return createStreams({video:true}, 1) | 26 return createStreams({video:true}, 1) |
27 .then(function(streams) { | 27 .then(function(streams) { |
28 for (let i = 0; i < streams.length; ++i) { | 28 for (let i = 0; i < streams.length; ++i) { |
29 pc.addStream(streams[i]); | 29 pc.addStream(streams[i]); |
30 } | 30 } |
31 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, false, true); | 31 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, false, true); |
32 verifyLocalTracksHaveSenders(pc); | 32 verifyLocalStreamTracksHaveSenders(pc); |
33 // Make sure object identities are preserved between calls. | 33 // Make sure object identities are preserved between calls. |
34 assert_array_equals(pc.getSenders(), pc.getSenders()); | 34 assert_array_equals(pc.getSenders(), pc.getSenders()); |
35 }); | 35 }); |
36 }, 'getSenders() for a single video track.'); | 36 }, 'getSenders() for a stream with a single video track.'); |
37 | 37 |
38 promise_test(function() { | 38 promise_test(function() { |
39 let pc = new RTCPeerConnection(); | 39 let pc = new RTCPeerConnection(); |
40 return createStreams({audio:true, video:true}, 1) | 40 return createStreams({audio:true, video:true}, 1) |
41 .then(function(streams) { | 41 .then(function(streams) { |
42 for (let i = 0; i < streams.length; ++i) { | 42 for (let i = 0; i < streams.length; ++i) { |
43 pc.addStream(streams[i]); | 43 pc.addStream(streams[i]); |
44 } | 44 } |
45 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true); | 45 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true); |
46 verifyLocalTracksHaveSenders(pc); | 46 verifyLocalStreamTracksHaveSenders(pc); |
47 // Make sure object identities are preserved between calls. | 47 // Make sure object identities are preserved between calls. |
48 assert_array_equals(pc.getSenders(), pc.getSenders()); | 48 assert_array_equals(pc.getSenders(), pc.getSenders()); |
49 }); | 49 }); |
50 }, 'getSenders() for a single stream with an audio and video track.'); | 50 }, 'getSenders() for a stream with an audio and video track.'); |
51 | 51 |
52 promise_test(function() { | 52 promise_test(function() { |
53 let pc = new RTCPeerConnection(); | 53 let pc = new RTCPeerConnection(); |
54 return createStreams({audio:true, video:true}, 2) | 54 return createStreams({audio:true, video:true}, 2) |
55 .then(function(streams) { | 55 .then(function(streams) { |
56 for (let i = 0; i < streams.length; ++i) { | 56 for (let i = 0; i < streams.length; ++i) { |
57 pc.addStream(streams[i]); | 57 pc.addStream(streams[i]); |
58 } | 58 } |
59 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); | 59 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); |
60 verifyLocalTracksHaveSenders(pc); | 60 verifyLocalStreamTracksHaveSenders(pc); |
61 // Make sure object identities are preserved between calls. | 61 // Make sure object identities are preserved between calls. |
62 assert_array_equals(pc.getSenders(), pc.getSenders()); | 62 assert_array_equals(pc.getSenders(), pc.getSenders()); |
63 }); | 63 }); |
64 }, 'getSenders() for a multiple audio-video streams.'); | 64 }, 'getSenders() for a multiple audio-video streams.'); |
65 | 65 |
66 promise_test(function() { | 66 promise_test(function() { |
67 let pc = new RTCPeerConnection(); | 67 let pc = new RTCPeerConnection(); |
68 let senders = new Set(); | 68 let senders = new Set(); |
69 return createStreams({audio:true, video:true}, 2) | 69 return createStreams({audio:true, video:true}, 2) |
70 .then(function(streams) { | 70 .then(function(streams) { |
71 for (let i = 0; i < streams.length; ++i) { | 71 for (let i = 0; i < streams.length; ++i) { |
72 pc.addStream(streams[i]); | 72 pc.addStream(streams[i]); |
73 } | 73 } |
74 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); | 74 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); |
75 verifyLocalTracksHaveSenders(pc); | 75 verifyLocalStreamTracksHaveSenders(pc); |
76 // Make sure object identities are preserved between calls. | 76 // Make sure object identities are preserved between calls. |
77 assert_array_equals(pc.getSenders(), pc.getSenders()); | 77 assert_array_equals(pc.getSenders(), pc.getSenders()); |
78 | 78 |
79 for (let i = 0; i < pc.getSenders().length; ++i) | 79 for (let i = 0; i < pc.getSenders().length; ++i) |
80 senders.add(pc.getSenders()[i]); | 80 senders.add(pc.getSenders()[i]); |
81 // 2 senders per stream, one for audio and one for video | 81 // 2 senders per stream, one for audio and one for video |
82 assert_equals(senders.size, 4); | 82 assert_equals(senders.size, 4); |
83 | 83 |
84 pc.removeStream(pc.getLocalStreams()[0]); | 84 pc.removeStream(pc.getLocalStreams()[0]); |
85 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true); | 85 verifyStreamAndTrackCounts(pc.getLocalStreams(), 1, true, true); |
86 verifyLocalTracksHaveSenders(pc); | 86 verifyLocalStreamTracksHaveSenders(pc); |
87 // Make sure object identities are preserved between calls. | 87 // Make sure object identities are preserved between calls. |
88 assert_array_equals(pc.getSenders(), pc.getSenders()); | 88 assert_array_equals(pc.getSenders(), pc.getSenders()); |
89 | 89 |
90 for (let i = 0; i < pc.getSenders().length; ++i) | 90 for (let i = 0; i < pc.getSenders().length; ++i) |
91 assert_true(senders.has(pc.getSenders()[i])); | 91 assert_true(senders.has(pc.getSenders()[i])); |
92 | 92 |
93 return createStreams({audio:true, video:true}, 1); | 93 return createStreams({audio:true, video:true}, 1); |
94 }) | 94 }) |
95 .then(function(streams) { | 95 .then(function(streams) { |
96 for (let i = 0; i < streams.length; ++i) { | 96 for (let i = 0; i < streams.length; ++i) { |
97 pc.addStream(streams[i]); | 97 pc.addStream(streams[i]); |
98 } | 98 } |
99 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); | 99 verifyStreamAndTrackCounts(pc.getLocalStreams(), 2, true, true); |
100 verifyLocalTracksHaveSenders(pc); | 100 verifyLocalStreamTracksHaveSenders(pc); |
101 // Make sure object identities are preserved between calls. | 101 // Make sure object identities are preserved between calls. |
102 assert_array_equals(pc.getSenders(), pc.getSenders()); | 102 assert_array_equals(pc.getSenders(), pc.getSenders()); |
103 | 103 |
104 // |senders| contains all senders so far (4), including the ones for | 104 // |senders| contains all senders so far (4), including the ones for |
105 // the removed streams. The set does not contain duplicates, so adding all | 105 // the removed streams. The set does not contain duplicates, so adding all |
106 // senders here should only increase the size for the new stream (2 new | 106 // senders here should only increase the size for the new stream (2 new |
107 // senders). | 107 // senders). |
108 for (let i = 0; i < pc.getSenders().length; ++i) | 108 for (let i = 0; i < pc.getSenders().length; ++i) |
109 senders.add(pc.getSenders()[i]); | 109 senders.add(pc.getSenders()[i]); |
110 assert_equals(senders.size, 6); | 110 assert_equals(senders.size, 6); |
111 | 111 |
112 while (pc.getLocalStreams().length > 0) { | 112 while (pc.getLocalStreams().length > 0) { |
113 pc.removeStream(pc.getLocalStreams()[0]); | 113 pc.removeStream(pc.getLocalStreams()[0]); |
114 } | 114 } |
115 assert_equals(pc.getLocalStreams().length, 0); | 115 assert_equals(pc.getLocalStreams().length, 0); |
116 assert_equals(pc.getSenders().length, 0); | 116 assert_equals(pc.getSenders().length, 0); |
117 }); | 117 }); |
118 }, 'getSenders() for streams being added and removed.'); | 118 }, 'getSenders() for streams being added and removed.'); |
119 | 119 |
| 120 promise_test(function() { |
| 121 let pc = new RTCPeerConnection(); |
| 122 return createStreams({audio:true, video:false}, 1) |
| 123 .then(function(streams) { |
| 124 let track = streams[0].getAudioTracks()[0]; |
| 125 let sender = pc.addTrack(track); |
| 126 verifyTracksHaveSenders(pc, new Set([ track ])); |
| 127 assert_equals(pc.getSenders()[0], sender); |
| 128 pc.removeTrack(sender); |
| 129 assert_equals(pc.getSenders().length, 0); |
| 130 }); |
| 131 }, 'getSenders() for addTrack() and removeTrack().'); |
| 132 |
120 /** | 133 /** |
121 * Helper functions to tests. | 134 * Helper functions to tests. |
122 */ | 135 */ |
123 | 136 |
124 function createStreams(constraints, numStreams, streamsSoFar = []) { | 137 function createStreams(constraints, numStreams, streamsSoFar = []) { |
125 if (numStreams == 0) { | 138 if (numStreams == 0) { |
126 return Promise.resolve(streamsSoFar);; | 139 return Promise.resolve(streamsSoFar);; |
127 } | 140 } |
128 return navigator.mediaDevices.getUserMedia(constraints) | 141 return navigator.mediaDevices.getUserMedia(constraints) |
129 .then(function(stream) { | 142 .then(function(stream) { |
130 return createStreams(constraints, | 143 return createStreams(constraints, |
131 numStreams - 1, | 144 numStreams - 1, |
132 streamsSoFar.concat([stream])); | 145 streamsSoFar.concat([stream])); |
133 }); | 146 }); |
134 } | 147 } |
135 | 148 |
136 function verifyStreamAndTrackCounts(streams, streamCount, audio, video) { | 149 function verifyStreamAndTrackCounts(streams, streamCount, audio, video) { |
137 assert_equals(streams.length, streamCount); | 150 assert_equals(streams.length, streamCount); |
138 for (let i = 0; i < streams.length; ++i) { | 151 for (let i = 0; i < streams.length; ++i) { |
139 assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0); | 152 assert_equals(streams[i].getAudioTracks().length, audio ? 1 : 0); |
140 assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0); | 153 assert_equals(streams[i].getVideoTracks().length, video ? 1 : 0); |
141 } | 154 } |
142 } | 155 } |
143 | 156 |
144 function verifyLocalTracksHaveSenders(pc) { | 157 function verifyLocalStreamTracksHaveSenders(pc) { |
145 let localTracks = new Set(); | 158 let localTracks = new Set(); |
146 let localStreams = pc.getLocalStreams(); | 159 let localStreams = pc.getLocalStreams(); |
147 for (let i = 0; i < localStreams.length; ++i) { | 160 for (let i = 0; i < localStreams.length; ++i) { |
148 let localStreamTracks = localStreams[i].getTracks(); | 161 let localStreamTracks = localStreams[i].getTracks(); |
149 for (let j = 0; j < localStreamTracks.length; ++j) { | 162 for (let j = 0; j < localStreamTracks.length; ++j) { |
150 localTracks.add(localStreamTracks[j]); | 163 localTracks.add(localStreamTracks[j]); |
151 } | 164 } |
152 } | 165 } |
| 166 return verifyTracksHaveSenders(pc, localTracks); |
| 167 } |
153 | 168 |
| 169 function verifyTracksHaveSenders(pc, tracks) { |
154 let senderTracks = new Set(); | 170 let senderTracks = new Set(); |
155 let senders = pc.getSenders(); | 171 let senders = pc.getSenders(); |
156 for (let i = 0; i < senders.length; ++i) { | 172 for (let i = 0; i < senders.length; ++i) { |
157 assert_true(senders[i] != null); | 173 assert_true(senders[i] != null); |
158 assert_true(senders[i].track != null); | 174 assert_true(senders[i].track != null); |
159 assert_true(localTracks.has(senders[i].track)); | 175 assert_true(tracks.has(senders[i].track)); |
160 assert_false(senderTracks.has(senders[i].track)); | 176 assert_false(senderTracks.has(senders[i].track)); |
161 senderTracks.add(senders[i].track); | 177 senderTracks.add(senders[i].track); |
162 } | 178 } |
163 assert_equals(senderTracks.size, localTracks.size); | 179 assert_equals(senderTracks.size, tracks.size); |
164 } | 180 } |
165 </script> | 181 </script> |
166 </body> | 182 </body> |
167 </html> | 183 </html> |
OLD | NEW |