Files
tubestation/testing/web-platform/tests/webrtc/RTCDataChannel-send-close.html
Florent Castelli c7b489b566 Bug 1888067 [wpt PR 45357] - peerconnection: Fire data channel events synchronously, a=testonly
Automatic update from web-platform-tests
peerconnection: Fire data channel events synchronously

When message events are dispatched asynchronously, it is possible to
receive some of those after the state change events are dispatched.
This causes some messages to disappear when a data channel is closing.

Tests are added to verify that all messages sent are received properly
by the remote side as mandated by the specification.

Bug: chromium:40072842
Change-Id: I196cd5b6cae4ea443369b2d9bc98dad474162b23
Reviewed-on: https://chromium-review.googlesource.com/c/chromium/src/+/5397720
Commit-Queue: Guido Urdaneta <guidou@chromium.org>
Auto-Submit: Florent Castelli <orphis@chromium.org>
Reviewed-by: Guido Urdaneta <guidou@chromium.org>
Cr-Commit-Position: refs/heads/main@{#1279016}

--

wpt-commits: 4c286eb7e69b65dbc3757e282d3d89bf611959e7
wpt-pr: 45357
2024-03-28 14:10:40 +00:00

124 lines
3.6 KiB
HTML

<!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>