diff options
Diffstat (limited to '')
-rw-r--r-- | testing/web-platform/tests/webrtc/RTCConfiguration-iceServers.html | 330 |
1 files changed, 330 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCConfiguration-iceServers.html b/testing/web-platform/tests/webrtc/RTCConfiguration-iceServers.html new file mode 100644 index 0000000000..1893ba02f3 --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCConfiguration-iceServers.html @@ -0,0 +1,330 @@ +<!doctype html> +<meta charset=utf-8> +<title>RTCConfiguration iceServers</title> +<script src='/resources/testharness.js'></script> +<script src='/resources/testharnessreport.js'></script> +<script src='RTCConfiguration-helper.js'></script> +<script> + 'use strict'; + + // Test is based on the following editor's draft: + // https://w3c.github.io/webrtc-pc/archives/20170605/webrtc.html + + // The following helper function is called from + // RTCConfiguration-helper.js: + // config_test + + /* + 4.3.2. Interface Definition + [Constructor(optional RTCConfiguration configuration)] + interface RTCPeerConnection : EventTarget { + ... + }; + + 4.2.1. RTCConfiguration Dictionary + dictionary RTCConfiguration { + sequence<RTCIceServer> iceServers = []; + ... + }; + + 4.2.4. RTCIceServer Dictionary + dictionary RTCIceServer { + required (DOMString or sequence<DOMString>) urls; + DOMString username; + DOMString credential; + }; + */ + + test(() => { + const pc = new RTCPeerConnection(); + assert_array_equals(pc.getConfiguration().iceServers, []); + }, 'new RTCPeerConnection() should have default configuration.iceServers of undefined'); + + config_test(makePc => { + makePc({}); + }, '{} should succeed'); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceServers: null })); + }, '{ iceServers: null } should throw TypeError'); + + config_test(makePc => { + const pc = makePc({ iceServers: undefined }); + assert_array_equals(pc.getConfiguration().iceServers, []); + }, '{ iceServers: undefined } should succeed'); + + config_test(makePc => { + const pc = makePc({ iceServers: [] }); + assert_array_equals(pc.getConfiguration().iceServers, []); + }, '{ iceServers: [] } should succeed'); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceServers: [null] })); + }, '{ iceServers: [null] } should throw TypeError'); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceServers: [undefined] })); + }, '{ iceServers: [undefined] } should throw TypeError'); + + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceServers: [{}] })); + }, '{ iceServers: [{}] } should throw TypeError'); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: 'stun:stun1.example.net' + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['stun:stun1.example.net']); + + }, `with stun server should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: ['stun:stun1.example.net'] + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['stun:stun1.example.net']); + + }, `with stun server array should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: ['stun:stun1.example.net', 'stun:stun2.example.net'] + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['stun:stun1.example.net', 'stun:stun2.example.net']); + + }, `with 2 stun servers should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: 'turn:turn.example.org', + username: 'user', + credential: 'cred' + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['turn:turn.example.org']); + assert_equals(server.username, 'user'); + assert_equals(server.credential, 'cred'); + + }, `with turn server, username, credential should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + username: '', + credential: '' + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['turns:turn.example.org']); + assert_equals(server.username, ''); + assert_equals(server.credential, ''); + + }, `with turns server and empty string username, credential should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: 'turn:turn.example.org', + username: '', + credential: '' + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['turn:turn.example.org']); + assert_equals(server.username, ''); + assert_equals(server.credential, ''); + + }, `with turn server and empty string username, credential should succeed`); + + config_test(makePc => { + const pc = makePc({ iceServers: [{ + urls: ['turns:turn.example.org', 'turn:turn.example.net'], + username: 'user', + credential: 'cred' + }] }); + + const { iceServers } = pc.getConfiguration(); + assert_equals(iceServers.length, 1); + + const server = iceServers[0]; + assert_array_equals(server.urls, ['turns:turn.example.org', 'turn:turn.example.net']); + assert_equals(server.username, 'user'); + assert_equals(server.credential, 'cred'); + + }, `with one turns server, one turn server, username, credential should succeed`); + + /* + 4.3.2. To set a configuration + 11.4. If scheme name is turn or turns, and either of server.username or + server.credential are omitted, then throw an InvalidAccessError. + */ + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turn:turn.example.net' + }] })); + }, 'with turn server and no credentials should throw InvalidAccessError'); + + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turn:turn.example.net', + username: 'user' + }] })); + }, 'with turn server and only username should throw InvalidAccessError'); + + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turn:turn.example.net', + credential: 'cred' + }] })); + }, 'with turn server and only credential should throw InvalidAccessError'); + + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turns:turn.example.net' + }] })); + }, 'with turns server and no credentials should throw InvalidAccessError'); + + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turns:turn.example.net', + username: 'user' + }] })); + }, 'with turns server and only username should throw InvalidAccessError'); + + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turns:turn.example.net', + credential: 'cred' + }] })); + }, 'with turns server and only credential should throw InvalidAccessError'); + + /* + 4.3.2. To set a configuration + 11.3. For each url in server.urls parse url and obtain scheme name. + - If the scheme name is not implemented by the browser, throw a SyntaxError. + - or if parsing based on the syntax defined in [ RFC7064] and [RFC7065] fails, + throw a SyntaxError. + + [RFC7064] URI Scheme for the Session Traversal Utilities for NAT (STUN) Protocol + 3.1. URI Scheme Syntax + stunURI = scheme ":" host [ ":" port ] + scheme = "stun" / "stuns" + + [RFC7065] Traversal Using Relays around NAT (TURN) Uniform Resource Identifiers + 3.1. URI Scheme Syntax + turnURI = scheme ":" host [ ":" port ] + [ "?transport=" transport ] + scheme = "turn" / "turns" + transport = "udp" / "tcp" / transport-ext + transport-ext = 1*unreserved + */ + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: '' + }] })); + }, 'with "" url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: ['stun:stun1.example.net', ''] + }] })); + }, 'with ["stun:stun1.example.net", ""] url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: 'relative-url' + }] })); + }, 'with relative url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: 'http://example.com' + }] })); + }, 'with http url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: 'turn://example.org/foo?x=y' + }] })); + }, 'with invalid turn url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: 'stun://example.org/foo?x=y' + }] })); + }, 'with invalid stun url should throw SyntaxError'); + + config_test(makePc => { + assert_throws_dom("SyntaxError", () => + makePc({ iceServers: [{ + urls: [] + }] })); + }, `with empty urls should throw SyntaxError`); + + // Blink and Gecko fall back to url, but it's not in the spec. + config_test(makePc => { + assert_throws_js(TypeError, () => + makePc({ iceServers: [{ + url: 'stun:stun1.example.net' + }] })); + }, 'with url field should throw TypeError'); + + /* + 4.3.2. To set a configuration + 11.5. If scheme name is turn or turns, + and server.credential is not a DOMString, then throw an InvalidAccessError + and abort these steps. + */ + config_test(makePc => { + assert_throws_dom('InvalidAccessError', () => + makePc({ iceServers: [{ + urls: 'turns:turn.example.org', + username: 'user', + credential: { + macKey: '', + accessToken: '' + } + }] })); + }, 'with turns server, and object credential should throw InvalidAccessError'); + +</script> |