diff options
Diffstat (limited to 'dom/media/tests/mochitest/test_peerConnection_bug825703.html')
-rw-r--r-- | dom/media/tests/mochitest/test_peerConnection_bug825703.html | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/dom/media/tests/mochitest/test_peerConnection_bug825703.html b/dom/media/tests/mochitest/test_peerConnection_bug825703.html new file mode 100644 index 000000000..c25079753 --- /dev/null +++ b/dom/media/tests/mochitest/test_peerConnection_bug825703.html @@ -0,0 +1,162 @@ +<!DOCTYPE HTML> +<html> +<head> + <script type="application/javascript" src="pc.js"></script> +</head> +<body> +<pre id="test"> +<script type="application/javascript"> + createHTML({ + bug: "825703", + title: "RTCConfiguration valid/invalid permutations" + }); + +// ^^^ Don't insert data above this line without adjusting line number below! +var lineNumberAndFunction = { +// <--- 16 is the line this must be. + line: 17, func: () => new RTCPeerConnection().onaddstream = () => {} +}; + +var makePC = (config, expected_error) => { + var exception; + try { + new RTCPeerConnection(config).close(); + } catch (e) { + exception = e; + } + is((exception? exception.name : "success"), expected_error || "success", + "RTCPeerConnection(" + JSON.stringify(config) + ")"); +}; + +// The order of properties in objects is not guaranteed in JavaScript, so this +// transform produces json-comparable dictionaries. The resulting copy is only +// meant to be used in comparisons (e.g. array-ness is not preserved). + +var toComparable = o => + (typeof o != 'object' || !o)? o : Object.keys(o).sort().reduce((co, key) => { + co[key] = toComparable(o[key]); + return co; +}, {}); + +// This is a test of the iceServers parsing code + readable errors +runNetworkTest(() => { + var exception = null; + + try { + new RTCPeerConnection().close(); + } catch (e) { + exception = e; + } + ok(!exception, "RTCPeerConnection() succeeds"); + exception = null; + + makePC(); + + makePC(1, "TypeError"); + + makePC({}); + + makePC({ iceServers: [] }); + + makePC({ iceServers: [{ urls:"" }] }, "SyntaxError"); + + makePC({ iceServers: [ + { urls:"stun:127.0.0.1" }, + { urls:"stun:localhost", foo:"" }, + { urls: ["stun:127.0.0.1", "stun:localhost"] }, + { urls:"stuns:localhost", foo:"" }, + { urls:"turn:[::1]:3478", username:"p", credential:"p" }, + { urls:"turn:[::1]:3478", username:"", credential:"" }, + { urls:"turns:[::1]:3478", username:"", credential:"" }, + { urls:"turn:localhost:3478?transport=udp", username:"p", credential:"p" }, + { urls: ["turn:[::1]:3478", "turn:localhost"], username:"p", credential:"p" }, + { urls:"turns:localhost:3478?transport=udp", username:"p", credential:"p" }, + { url:"stun:localhost", foo:"" }, + { url:"turn:localhost", username:"p", credential:"p" } + ]}); + + makePC({ iceServers: [{ urls: ["stun:127.0.0.1", ""] }] }, "SyntaxError"); + + makePC({ iceServers: [{ urls:"turns:localhost:3478", username:"p" }] }, "InvalidAccessError"); + + makePC({ iceServers: [{ url:"turns:localhost:3478", credential:"p" }] }, "InvalidAccessError"); + + makePC({ iceServers: [{ urls:"http:0.0.0.0" }] }, "SyntaxError"); + + try { + new RTCPeerConnection({ iceServers: [{ url:"http:0.0.0.0" }] }).close(); + } catch (e) { + ok(e.message.indexOf("http") > 0, + "RTCPeerConnection() constructor has readable exceptions"); + } + + // Test getConfiguration + var config = { + bundlePolicy: "max-bundle", + iceTransportPolicy: "relay", + peerIdentity: null, + iceServers: [ + { urls: ["stun:127.0.0.1", "stun:localhost"], credentialType:"password" }, + { urls: ["turn:[::1]:3478"], username:"p", credential:"p", credentialType:"token" }, + ], + }; + var pc = new RTCPeerConnection(config); + is(JSON.stringify(toComparable(pc.getConfiguration())), + JSON.stringify(toComparable(config)), "getConfiguration"); + pc.close(); + + var push = prefs => new Promise(resolve => + SpecialPowers.pushPrefEnv(prefs, resolve)); + + Promise.resolve() + // This set of tests are setting the about:config User preferences for default + // ice servers and checking the outputs when RTCPeerConnection() is + // invoked. See Bug 1167922 for more information. + .then(() => push({ set: [['media.peerconnection.default_iceservers', ""]] }) + .then(() => makePC()) + .then(() => push({ set: [['media.peerconnection.default_iceservers', "k"]] })) + .then(() => makePC()) + .then(() => push({ set: [['media.peerconnection.default_iceservers', "[{\"urls\": [\"stun:stun.services.mozilla.com\"]}]"]] })) + .then(() => makePC())) + // This set of tests check that warnings work. See Bug 1254839 for more. + .then(() => { + var consoleService = SpecialPowers.Cc["@mozilla.org/consoleservice;1"] + .getService(SpecialPowers.Ci.nsIConsoleService); + var warning = ""; + var listener = SpecialPowers.wrapCallbackObject({ + QueryInterface(iid) { + if (![SpecialPowers.Ci.nsIConsoleListener, + SpecialPowers.Ci.nsISupports].some(i => iid.equals(i))) { + throw SpecialPowers.Cr.NS_NOINTERFACE; + } + return this; + }, + + observe(msg) { + if (msg.message.includes("JavaScript Warning")) { + warning = msg.message; + } + } + }); + consoleService.registerListener(listener); + lineNumberAndFunction.func(); + // Console output is asynchronous, so we must queue a task. + return wait(0).then(() => { + is(warning.split('"')[1], + "onaddstream is deprecated! Use peerConnection.ontrack instead.", + "warning logged"); + var remainder = warning.split('"').slice(2).join('"'); + info(remainder); + ok(remainder.includes('file: "' + window.location + '"'), + "warning has this file"); + ok(remainder.includes('line: ' + lineNumberAndFunction.line), + "warning has correct line number"); + consoleService.unregisterListener(listener); + }); + }) + .then(networkTestFinished); +}); +</script> +</pre> +</body> +</html> |