OLD | NEW |
| (Empty) |
1 <html> | |
2 <head> | |
3 <script type="text/javascript" src="webrtc_test_utilities.js"></script> | |
4 <script type="text/javascript" src="webrtc_test_common.js"></script> | |
5 <script type="text/javascript"> | |
6 $ = function(id) { | |
7 return document.getElementById(id); | |
8 }; | |
9 | |
10 window.onerror = function(errorMsg, url, lineNumber, column, errorObj) { | |
11 failTest('Error: ' + errorMsg + '\nScript: ' + url + | |
12 '\nLine: ' + lineNumber + '\nColumn: ' + column + | |
13 '\nStackTrace: ' + errorObj); | |
14 } | |
15 | |
16 var gPeerConnection = null; | |
17 var gCertificate = null; | |
18 | |
19 // This test creates and sets three offers, calling setConfiguration in | |
20 // between each offer, expecting an ICE restart to be triggered by the next | |
21 // offer. | |
22 function testSetConfiguration() { | |
23 gPeerConnection = new RTCPeerConnection( | |
24 {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', | |
25 rtcpMuxPolicy:'require', certificates:[], iceCandidatePoolSize:0}); | |
26 // Change ICE candidate pool size, which will succeed before | |
27 // setLocalDescription is called. | |
28 gPeerConnection.setConfiguration( | |
29 {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', | |
30 rtcpMuxPolicy:'require', certificates:[], iceCandidatePoolSize:1}); | |
31 // Now test successful cases of setConfiguration. Changes should trigger an | |
32 // ICE restart in the next offer. To do this, first we need to trigger an | |
33 // initial ICE gathering phase and wait until it completes. | |
34 // TODO(deadbeef): Once onicegatheringstatechange is implemented, use that | |
35 // instead of a "null" candidate. | |
36 gPeerConnection.onicecandidate = iceCandidateCallback1; | |
37 createOfferAndSetLocalDescription(); | |
38 } | |
39 | |
40 function iceCandidateCallback1(candidate) { | |
41 if (gPeerConnection.iceGatheringState === 'complete') { | |
42 gPeerConnection.onicecandidate = iceCandidateCallback2; | |
43 // Policy changed. | |
44 gPeerConnection.setConfiguration( | |
45 {iceServers:[], iceTransportPolicy:'relay', bundlePolicy:'balanced', | |
46 rtcpMuxPolicy:'require', certificates:[], iceCandidatePoolSize:1}); | |
47 createOfferAndSetLocalDescription(); | |
48 } | |
49 } | |
50 | |
51 function iceCandidateCallback2(candidate) { | |
52 if (gPeerConnection.iceGatheringState === 'complete') { | |
53 gPeerConnection.onicecandidate = iceCandidateCallback3; | |
54 // Servers changed. | |
55 gPeerConnection.setConfiguration( | |
56 {iceServers:[{urls:'stun:foo.invalid'}], iceTransportPolicy:'all', | |
57 bundlePolicy:'balanced', rtcpMuxPolicy:'require', certificates:[], | |
58 iceCandidatePoolSize:1}); | |
59 createOfferAndSetLocalDescription(); | |
60 } | |
61 } | |
62 | |
63 function iceCandidateCallback3(candidate) { | |
64 // Only wait for 'gathering', since it will take a while for the requests to | |
65 // 'foo.invalid' to time out. | |
66 if (gPeerConnection.iceGatheringState === 'gathering') { | |
67 reportTestSuccess(); | |
68 } | |
69 } | |
70 | |
71 function testSetConfigurationErrors() { | |
72 // Generate certificate so we can test the InvalidModificationError from | |
73 // attempting to change certificates. | |
74 RTCPeerConnection.generateCertificate({ name:'ECDSA', namedCurve:'P-256' }) | |
75 .then(function(certificate) { | |
76 gCertificate = certificate; | |
77 continueTestSetConfigurationErrors(); | |
78 }, | |
79 function() { | |
80 failTest('Failed to generate certificate.'); | |
81 } | |
82 ); | |
83 } | |
84 | |
85 // Continued after certificate generated. | |
86 function continueTestSetConfigurationErrors() { | |
87 gPeerConnection = new RTCPeerConnection( | |
88 {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', | |
89 rtcpMuxPolicy:'require', certificates:[], iceCandidatePoolSize:1}); | |
90 // If bundlePolicy, rtcpMuxPolicy or certificates are changed, an | |
91 // InvalidModificationError should be thrown. | |
92 assertThrows(gPeerConnection.setConfiguration, | |
93 {iceServers:[], iceTransportPolicy:'all', | |
94 bundlePolicy:'max-bundle', rtcpMuxPolicy:'require', | |
95 certificates:[], iceCandidatePoolSize:1}); | |
96 assertThrows(gPeerConnection.setConfiguration, | |
97 {iceServers:[], iceTransportPolicy:'all', | |
98 bundlePolicy:'balanced', rtcpMuxPolicy:'negotiate', | |
99 certificates:[]}); | |
100 assertThrows(gPeerConnection.setConfiguration, | |
101 {iceServers:[], iceTransportPolicy:'all', | |
102 bundlePolicy:'balanced', rtcpMuxPolicy:'require', | |
103 certificates:[gCertificate], iceCandidatePoolSize:1}); | |
104 // Failure to parse URL should result in SyntaxError. | |
105 assertThrows(gPeerConnection.setConfiguration, | |
106 {iceServers:[{url:'stunnnn:foo.invalid'}], | |
107 iceTransportPolicy:'all', bundlePolicy:'max-bundle', | |
108 rtcpMuxPolicy:'require', certificates:[], | |
109 iceCandidatePoolSize:1}); | |
110 // TURN server with missing username should result in InvalidAccessError. | |
111 assertThrows(gPeerConnection.setConfiguration, | |
112 {iceServers:[{url:'turn:foo.invalid'}], | |
113 iceTransportPolicy:'all', bundlePolicy:'max-bundle', | |
114 rtcpMuxPolicy:'require', certificates:[], | |
115 iceCandidatePoolSize:1}); | |
116 // Sanity check that a configuration can be successfully set, and thus | |
117 // there's not something unexpected causing the above exceptions. | |
118 gPeerConnection.setConfiguration( | |
119 {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', | |
120 rtcpMuxPolicy:'require', certificates:[], iceCandidatePoolSize:1}); | |
121 // Lastly: only after applying a local description, changing the candidate | |
122 // pool size is not allowed. | |
123 gPeerConnection.createOffer({offerToReceiveAudio:1}) | |
124 .then(function(offer) { | |
125 console.log("Setting offer:\n" + offer.sdp); | |
126 gPeerConnection.setLocalDescription(offer).then( | |
127 function() { | |
128 // Pool size absent, which means it should default to 0, which is | |
129 // different than its current value of 1. | |
130 assertThrows(gPeerConnection.setConfiguration, | |
131 {iceServers:[], iceTransportPolicy:'all', | |
132 bundlePolicy:'balanced', rtcpMuxPolicy:'require', | |
133 certificates:[]}); | |
134 reportTestSuccess(); | |
135 }, | |
136 function() { failTest('Failed to set local description.') } | |
137 ); | |
138 }, | |
139 function() { | |
140 failTest('Failed to generate offer.') | |
141 } | |
142 ); | |
143 } | |
144 | |
145 function assertThrows(func) { | |
146 try { | |
147 func.apply(arguments.slice(start=1)); | |
148 failTest('Expected exception to be thrown by: ' + code); | |
149 } catch (e) { | |
150 } | |
151 } | |
152 | |
153 // Helper function to create and apply offer. | |
154 function createOfferAndSetLocalDescription() { | |
155 gPeerConnection.createOffer({offerToReceiveAudio:1}) | |
156 .then(function(offer) { | |
157 console.log("Setting offer:\n" + offer.sdp); | |
158 gPeerConnection.setLocalDescription(offer).then( | |
159 function() {}, | |
160 function() { failTest('Failed to set local description.') } | |
161 ); | |
162 }, | |
163 function() { | |
164 failTest('Failed to generate offer.') | |
165 } | |
166 ); | |
167 } | |
168 | |
169 </script> | |
170 </head> | |
171 <body> | |
172 </body> | |
173 </html> | |
OLD | NEW |