Index: content/test/data/media/peerconnection-setConfiguration.html |
diff --git a/content/test/data/media/peerconnection-setConfiguration.html b/content/test/data/media/peerconnection-setConfiguration.html |
new file mode 100644 |
index 0000000000000000000000000000000000000000..9bf30de1e0555fc5129f80b3643eee7bbaf0c37a |
--- /dev/null |
+++ b/content/test/data/media/peerconnection-setConfiguration.html |
@@ -0,0 +1,144 @@ |
+<html> |
+<head> |
+ <script type="text/javascript" src="webrtc_test_utilities.js"></script> |
+ <script type="text/javascript" src="webrtc_test_common.js"></script> |
+ <script type="text/javascript"> |
+ $ = function(id) { |
+ return document.getElementById(id); |
+ }; |
+ |
+ window.onerror = function(errorMsg, url, lineNumber, column, errorObj) { |
+ failTest('Error: ' + errorMsg + '\nScript: ' + url + |
+ '\nLine: ' + lineNumber + '\nColumn: ' + column + |
+ '\nStackTrace: ' + errorObj); |
+ } |
+ |
+ var gPeerConnection = null; |
+ var gCertificate = null; |
+ |
+ // This test creates and sets three offers, calling setConfiguration in |
+ // between each offer, expecting an ICE restart to be triggered by the next |
+ // offer. |
+ function testSetConfiguration() { |
+ gPeerConnection = new RTCPeerConnection( |
+ {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ // Now test successful cases of setConfiguration. Changes should trigger an |
+ // ICE restart in the next offer. To do this, first we need to trigger an |
+ // initial ICE gathering phase and wait until it completes. |
+ // TODO(deadbeef): Once onicegatheringstatechange is implemented, use that |
+ // instead of a "null" candidate. |
+ gPeerConnection.onicecandidate = iceCandidateCallback1; |
+ createOfferAndSetLocalDescription(); |
+ } |
+ |
+ function iceCandidateCallback1(candidate) { |
+ if (gPeerConnection.iceGatheringState === 'complete') { |
+ gPeerConnection.onicecandidate = iceCandidateCallback2; |
+ // Policy changed. |
+ gPeerConnection.setConfiguration( |
+ {iceServers:[], iceTransportPolicy:'relay', bundlePolicy:'balanced', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ createOfferAndSetLocalDescription(); |
+ } |
+ } |
+ |
+ function iceCandidateCallback2(candidate) { |
+ if (gPeerConnection.iceGatheringState === 'complete') { |
+ gPeerConnection.onicecandidate = iceCandidateCallback3; |
+ // Servers changed. |
+ gPeerConnection.setConfiguration( |
+ {iceServers:[{urls:'stun:foo.invalid'}], iceTransportPolicy:'all', |
+ bundlePolicy:'balanced', rtcpMuxPolicy:'require', certificates:[]}); |
+ createOfferAndSetLocalDescription(); |
+ } |
+ } |
+ |
+ function iceCandidateCallback3(candidate) { |
+ // Only wait for 'gathering', since it will take a while for the requests to |
+ // 'foo.invalid' to time out. |
+ if (gPeerConnection.iceGatheringState === 'gathering') { |
+ reportTestSuccess(); |
+ } |
+ } |
+ |
+ function testSetConfigurationErrors() { |
+ // Generate certificate so we can test the InvalidModificationError from |
+ // attempting to change certificates. |
+ RTCPeerConnection.generateCertificate({ name:'ECDSA', namedCurve:'P-256' }) |
+ .then(function(certificate) { |
+ gCertificate = certificate; |
+ continueTestSetConfigurationErrors(); |
+ }, |
+ function() { |
+ failTest('Failed to generate certificate.'); |
+ } |
+ ); |
+ } |
+ |
+ // Continued after certificate generated. |
+ function continueTestSetConfigurationErrors() { |
+ gPeerConnection = new RTCPeerConnection( |
+ {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ // If bundlePolicy, rtcpMuxPolicy or certificates are changed, an |
+ // InvalidModificationError should be thrown. |
+ assertThrows(gPeerConnection.setConfiguration, |
+ {iceServers:[], iceTransportPolicy:'all', |
+ bundlePolicy:'max-bundle', rtcpMuxPolicy:'require', |
+ certificates:[]}); |
+ assertThrows(gPeerConnection.setConfiguration, |
+ {iceServers:[], iceTransportPolicy:'all', |
+ bundlePolicy:'balanced', rtcpMuxPolicy:'negotiate', |
+ certificates:[]}); |
+ assertThrows(gPeerConnection.setConfiguration, |
+ {iceServers:[], iceTransportPolicy:'all', |
+ bundlePolicy:'balanced', rtcpMuxPolicy:'require', |
+ certificates:[gCertificate]}); |
+ // Failure to parse URL should result in SyntaxError. |
+ assertThrows(gPeerConnection.setConfiguration, |
+ {iceServers:[{url:'stunnnn:foo.invalid'}], |
+ iceTransportPolicy:'all', bundlePolicy:'max-bundle', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ // TURN server with missing username should result in InvalidAccessError. |
+ assertThrows(gPeerConnection.setConfiguration, |
+ {iceServers:[{url:'turn:foo.invalid'}], |
+ iceTransportPolicy:'all', bundlePolicy:'max-bundle', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ // Sanity check that a configuration can be successfully set, and thus |
+ // there's not something unexpected causing the above exceptions. |
+ gPeerConnection.setConfiguration( |
+ {iceServers:[], iceTransportPolicy:'all', bundlePolicy:'balanced', |
+ rtcpMuxPolicy:'require', certificates:[]}); |
+ reportTestSuccess(); |
+ } |
+ |
+ function assertThrows(func) { |
+ try { |
+ func.apply(arguments.slice(start=1)); |
+ failTest('Expected exception to be thrown by: ' + code); |
+ } catch (e) { |
+ } |
+ } |
+ |
+ // Helper function to create and apply offer. |
+ function createOfferAndSetLocalDescription() { |
+ gPeerConnection.createOffer({offerToReceiveAudio:1}) |
+ .then(function(offer) { |
+ console.log("Setting offer:\n" + offer.sdp); |
+ gPeerConnection.setLocalDescription(offer).then( |
+ function() {}, |
+ function() { failTest('Failed to set local description.') } |
+ ); |
+ }, |
+ function() { |
+ failTest('Failed to generate offer.') |
+ } |
+ ); |
+ } |
+ |
+ </script> |
+</head> |
+<body> |
+</body> |
+</html> |