diff options
Diffstat (limited to 'testing/web-platform/tests/webrtc')
6 files changed, 268 insertions, 6 deletions
diff --git a/testing/web-platform/tests/webrtc/RTCDataChannel-send-close.html b/testing/web-platform/tests/webrtc/RTCDataChannel-send-close.html new file mode 100644 index 0000000000..1bcc96790d --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCDataChannel-send-close.html @@ -0,0 +1,123 @@ +<!doctype html> +<meta charset=utf-8> +<meta name="timeout" content="long"> +<title>RTCDataChannel.prototype.send</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> +'use strict'; + +const largeString = " ".repeat(64 * 1024); +const largeArrayBuffer = new TextEncoder("utf-8").encode(largeString); +const largeBlob = new Blob([" ".repeat(64 * 1024)]); + +for (const options of [{}, {negotiated: true, id: 0}]) { + const mode = `${options.negotiated? "Negotiated d" : "D"}atachannel`; + + promise_test(async t => { + let [channel1, channel2] = await createDataChannelPair(t, options); + let receivedSize = 0, sentSize = 0; + + channel2.binaryType = 'arraybuffer'; + channel2.onmessage = e => { + if (typeof e.data === 'string') + receivedSize += e.data.length; + else + receivedSize += e.data.byteLength; + } + + let closePromiseResolve; + let closePromise = new Promise((resolve, reject) => { + closePromiseResolve = resolve; + }); + channel2.onclose = e => { + closePromiseResolve(); + } + + try { + while(true) { + channel1.send(largeString); + sentSize += largeString.length; + } + } catch(error) { + assert_true(error instanceof DOMException); + assert_equals(error.name, 'OperationError'); + } + channel1.close(); + + await closePromise; + assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()'); + }, `${mode} should be able to send and receive all string messages on close`); + + promise_test(async t => { + let [channel1, channel2] = await createDataChannelPair(t, options); + let receivedSize = 0, sentSize = 0; + + channel2.binaryType = 'arraybuffer'; + channel2.onmessage = e => { + if (typeof e.data === 'string') + receivedSize += e.data.length; + else + receivedSize += e.data.byteLength; + } + + let closePromiseResolve; + let closePromise = new Promise((resolve, reject) => { + closePromiseResolve = resolve; + }); + channel2.onclose = e => { + closePromiseResolve(); + } + + try { + while(true) { + channel1.send(largeArrayBuffer); + sentSize += largeArrayBuffer.length; + } + } catch(error) { + assert_true(error instanceof DOMException); + assert_equals(error.name, 'OperationError'); + } + channel1.close(); + + await closePromise; + assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()'); + }, `${mode} should be able to send and receive all arraybuffer messages on close`); + + promise_test(async t => { + let [channel1, channel2] = await createDataChannelPair(t, options); + let receivedSize = 0, sentSize = 0; + + channel2.binaryType = 'arraybuffer'; + channel2.onmessage = e => { + if (typeof e.data === 'string') + receivedSize += e.data.length; + else + receivedSize += e.data.byteLength; + } + + let closePromiseResolve; + let closePromise = new Promise((resolve, reject) => { + closePromiseResolve = resolve; + }); + channel2.onclose = e => { + closePromiseResolve(); + } + + try { + while(true) { + channel1.send(largeBlob); + sentSize += largeBlob.size; + } + } catch(error) { + assert_true(error instanceof DOMException); + assert_equals(error.name, 'OperationError'); + } + channel1.close(); + + await closePromise; + assert_equals(receivedSize, sentSize, 'All the pending sent messages are received after calling close()'); + }, `${mode} should be able to send and receive all blob messages on close`); +} +</script> diff --git a/testing/web-platform/tests/webrtc/RTCIceCandidate-constructor.html b/testing/web-platform/tests/webrtc/RTCIceCandidate-constructor.html index 66d6962079..b760c7b05a 100644 --- a/testing/web-platform/tests/webrtc/RTCIceCandidate-constructor.html +++ b/testing/web-platform/tests/webrtc/RTCIceCandidate-constructor.html @@ -57,7 +57,7 @@ }, `new RTCIceCandidate({ candidate: '' })`); test(t => { - // Throws because the candidate field is not nullable + // Throws because both sdpMid and sdpMLineIndex are null by default assert_throws_js(TypeError, () => new RTCIceCandidate({ candidate: null @@ -116,15 +116,15 @@ test(t => { const candidate = new RTCIceCandidate({ - candidate: '', + candidate: null, sdpMLineIndex: 0 }); - assert_equals(candidate.candidate, '', 'candidate'); + assert_equals(candidate.candidate, 'null', 'candidate'); assert_equals(candidate.sdpMid, null, 'sdpMid', 'sdpMid'); assert_equals(candidate.sdpMLineIndex, 0, 'sdpMLineIndex'); assert_equals(candidate.usernameFragment, null, 'usernameFragment'); - }, `new RTCIceCandidate({ candidate: '', sdpMLineIndex: 0 }`); + }, `new RTCIceCandidate({ candidate: null, sdpMLineIndex: 0 }`); test(t => { const candidate = new RTCIceCandidate({ @@ -138,7 +138,7 @@ assert_equals(candidate.usernameFragment, null, 'usernameFragment'); }, 'new RTCIceCandidate({ ... }) with valid candidate string and sdpMid'); - test(t =>{ + test(t => { // candidate string is not validated in RTCIceCandidate const candidate = new RTCIceCandidate({ candidate: arbitraryString, diff --git a/testing/web-platform/tests/webrtc/RTCPeerConnection-GC.https.html b/testing/web-platform/tests/webrtc/RTCPeerConnection-GC.https.html index 156a2e1f09..282c362a2d 100644 --- a/testing/web-platform/tests/webrtc/RTCPeerConnection-GC.https.html +++ b/testing/web-platform/tests/webrtc/RTCPeerConnection-GC.https.html @@ -85,6 +85,36 @@ promise_test(async t => { await onVideoChange(); assert_not_equals(color, getVideoSignal(destVideo)); }, "GC does not collect a peer connection pipe rendering to a video element"); + +promise_test(async t => { + const pc1 = new RTCPeerConnection(); + t.add_cleanup(() => pc1.close()); + const pc2 = new RTCPeerConnection(); + t.add_cleanup(() => pc2.close()); + + const [track, stream] = await createTrackAndStreamWithCleanup(t, "video"); + pc1.addTrack(track, stream); + exchangeIceCandidates(pc1, pc2); + + const metadataToBeLoaded = []; + pc2.ontrack = (e) => { + const stream = e.streams[0]; + const v = document.createElement('video'); + v.autoplay = true; + v.srcObject = stream; + v.id = stream.id + metadataToBeLoaded.push(new Promise((resolve) => { + v.addEventListener('loadedmetadata', () => { + resolve(); + }); + })); + }; + await exchangeOfferAnswer(pc1, pc2); + + garbageCollect(); + + await Promise.all(metadataToBeLoaded); +}, "GC does not collect an HTMLMediaElement playing a video track"); </script> </body> </html> diff --git a/testing/web-platform/tests/webrtc/RTCPeerConnection-addTcpIceCandidate.html b/testing/web-platform/tests/webrtc/RTCPeerConnection-addTcpIceCandidate.html new file mode 100644 index 0000000000..1e7fc3ba95 --- /dev/null +++ b/testing/web-platform/tests/webrtc/RTCPeerConnection-addTcpIceCandidate.html @@ -0,0 +1,95 @@ +<!doctype html> +<title>Test RTCPeerConnection.prototype.addIceCandidate with TCP candidates</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="RTCPeerConnection-helper.js"></script> +<script> +'use strict'; + +const sdp = `v=0 +o=- 166855176514521964 2 IN IP4 127.0.0.1 +s=- +t=0 0 +a=msid-semantic:WMS * +m=audio 9 UDP/TLS/RTP/SAVPF 111 +c=IN IP4 0.0.0.0 +a=rtcp:9 IN IP4 0.0.0.0 +a=ice-ufrag:655Y +a=ice-pwd:somelongpwdwithenoughrandomness +a=fingerprint:sha-256 00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00:00 +a=setup:actpass +a=mid:audio1 +a=sendonly +a=rtcp-mux +a=rtcp-rsize +a=rtpmap:111 opus/48000/2 +a=extmap:1 urn:ietf:params:rtp-hdrext:ssrc-audio-level +a=ssrc:1001 cname:some +`; + +const candidate_8001 = 'a=candidate:2983561038 1 tcp 1518214911 127.0.0.1 8001 typ host tcptype passive generation 0 ufrag 655Y network-id 1 network-cost 10'; + +const candidate_2049 = 'a=candidate:2983561038 1 tcp 1518214911 127.0.0.1 2049 typ host tcptype passive generation 0 ufrag 655Y network-id 1 network-cost 10'; + +const candidate_37 = 'a=candidate:2983561038 1 tcp 1518214911 127.0.0.1 37 typ host tcptype passive generation 0 ufrag 655Y network-id 1 network-cost 10'; + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription({type: 'offer', sdp: sdp + candidate_8001 + '\n'}) + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + await waitForConnectionStateChangeWithTimeout(t, pc, + ['failed', 'disconnected'], 1000); +}, 'TCP candidate aimed at port 8001 accepted'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription({type: 'offer', sdp: sdp + candidate_2049 + '\n'}) + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + pc.onicestatechange = t.unreached_func(); + await new Promise(resolve => t.step_timeout(resolve, 500)); +}, 'TCP candidate aimed at port 2049 ignored'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription({type: 'offer', sdp: sdp + candidate_37 + '\n'}) + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + pc.onicestatechange = t.unreached_func(); + await new Promise(resolve => t.step_timeout(resolve, 500)); +}, 'TCP candidate aimed at port 37 ignored'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription({type: 'offer', sdp: sdp}) + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + await pc.addIceCandidate(new RTCIceCandidate({ + candidate: candidate_8001, + sdpMid: 'audio1' + })); + await waitForConnectionStateChangeWithTimeout( + t, pc, ['failed', 'disconnected'], 1000); +}, 'TCP addIceCandidate aimed at port 8001 accepted'); + +promise_test(async t => { + const pc = new RTCPeerConnection(); + t.add_cleanup(() => pc.close()); + await pc.setRemoteDescription({type: 'offer', sdp: sdp}) + const answer = await pc.createAnswer(); + await pc.setLocalDescription(answer); + await pc.addIceCandidate(new RTCIceCandidate({ + candidate: candidate_2049, + sdpMid: 'audio1' + })); + pc.onicestatechange = t.unreached_func(); + await new Promise(resolve => t.step_timeout(resolve, 500)); +}, 'TCP addIceCandidate aimed at port 2049 ignored'); + + +</script> diff --git a/testing/web-platform/tests/webrtc/RTCPeerConnection-helper.js b/testing/web-platform/tests/webrtc/RTCPeerConnection-helper.js index 6f35fde76c..cd27b033d3 100644 --- a/testing/web-platform/tests/webrtc/RTCPeerConnection-helper.js +++ b/testing/web-platform/tests/webrtc/RTCPeerConnection-helper.js @@ -230,6 +230,20 @@ async function waitForConnectionStateChange(pc, wantedStates) { } } +function waitForConnectionStateChangeWithTimeout(t, pc, wantedStates, timeout) { + return new Promise((resolve, reject) => { + if (wantedStates.includes(pc.connectionState)) { + resolve(); + return; + } + pc.addEventListener('connectionstatechange', () => { + if (wantedStates.includes(pc.connectionState)) + resolve(); + }); + t.step_timeout(reject, timeout); + }); +} + async function waitForIceGatheringState(pc, wantedStates) { while (!wantedStates.includes(pc.iceGatheringState)) { await waitUntilEvent(pc, 'icegatheringstatechange'); diff --git a/testing/web-platform/tests/webrtc/back-forward-cache-with-open-webrtc-connection.https.window.js b/testing/web-platform/tests/webrtc/back-forward-cache-with-open-webrtc-connection.https.window.js index 5cc3b745b3..fe41a9cfd5 100644 --- a/testing/web-platform/tests/webrtc/back-forward-cache-with-open-webrtc-connection.https.window.js +++ b/testing/web-platform/tests/webrtc/back-forward-cache-with-open-webrtc-connection.https.window.js @@ -16,5 +16,5 @@ promise_test(async t => { await openWebRTC(rc1); // The page should not be eligible for BFCache because of open WebRTC connection and live MediaStreamTrack. await assertBFCacheEligibility(rc1, /*shouldRestoreFromBFCache=*/ false); - await assertNotRestoredFromBFCache(rc1, ['webrtc', 'media-stream']); + await assertNotRestoredFromBFCache(rc1, ['rtc', 'mediastream']); }); |