summaryrefslogtreecommitdiffstats
path: root/testing/web-platform/tests/webtransport/streams-echo.https.any.js
diff options
context:
space:
mode:
authorDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
committerDaniel Baumann <daniel.baumann@progress-linux.org>2024-04-07 17:32:43 +0000
commit6bf0a5cb5034a7e684dcc3500e841785237ce2dd (patch)
treea68f146d7fa01f0134297619fbe7e33db084e0aa /testing/web-platform/tests/webtransport/streams-echo.https.any.js
parentInitial commit. (diff)
downloadthunderbird-upstream.tar.xz
thunderbird-upstream.zip
Adding upstream version 1:115.7.0.upstream/1%115.7.0upstream
Signed-off-by: Daniel Baumann <daniel.baumann@progress-linux.org>
Diffstat (limited to 'testing/web-platform/tests/webtransport/streams-echo.https.any.js')
-rw-r--r--testing/web-platform/tests/webtransport/streams-echo.https.any.js282
1 files changed, 282 insertions, 0 deletions
diff --git a/testing/web-platform/tests/webtransport/streams-echo.https.any.js b/testing/web-platform/tests/webtransport/streams-echo.https.any.js
new file mode 100644
index 0000000000..703318d0e7
--- /dev/null
+++ b/testing/web-platform/tests/webtransport/streams-echo.https.any.js
@@ -0,0 +1,282 @@
+// META: global=window,worker
+// META: script=/common/get-host-info.sub.js
+// META: script=resources/webtransport-test-helpers.sub.js
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = bidi_stream.writable.getWriter();
+ const encoder = new TextEncoder();
+ await writer.write(encoder.encode('Hello World'));
+ await writer.close();
+
+ // Read the data on the readable end.
+ const reply = await read_stream_as_string(bidi_stream.readable);
+
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(reply, 'Hello World');
+}, 'WebTransport client should be able to create and handle a bidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = bidi_stream.writable.getWriter();
+ const encoder = new TextEncoder();
+ await writer.write(encoder.encode('Hello World'));
+ await writer.close();
+
+ // Read the data on the readable end.
+ const reply = await read_stream_as_string(bidi_stream.readable);
+
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(reply, 'Hello World');
+}, 'WebTransport client should be able to create and handle a bidirectional stream without waiting for ready');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // The echo handler creates a bidirectional stream when a WebTransport session
+ // is established. Accept the bidirectional stream.
+ const stream_reader = wt.incomingBidirectionalStreams.getReader();
+ const { value: bidi_stream } = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Write a message to the writable end, and close it.
+ const encoder = new TextEncoderStream();
+ encoder.readable.pipeTo(bidi_stream.writable);
+ const writer = encoder.writable.getWriter();
+ await writer.write('Hello World');
+ await writer.close();
+
+ // Read the data on the readable end.
+ const reply = await read_stream_as_string(bidi_stream.readable);
+
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(reply, 'Hello World');
+}, 'WebTransport server should be able to accept and handle a bidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a unidirectional stream.
+ const writable = await wt.createUnidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const encoder = new TextEncoderStream();
+ encoder.readable.pipeTo(writable);
+ const writer = encoder.writable.getWriter();
+ await writer.write('Hello World');
+ await writer.close();
+
+ // The echo handler creates a new unidirectional stream to echo back data from
+ // the server to client. Accept the unidirectional stream.
+ const readable = wt.incomingUnidirectionalStreams;
+ const stream_reader = readable.getReader();
+ const { value: recv_stream } = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Read the data on the readable end.
+ const reply = await read_stream_as_string(recv_stream);
+
+ // Make sure the message on the writable and readable ends of the streams
+ // match.
+ assert_equals(reply, 'Hello World');
+}, 'WebTransport client should be able to create, accept, and handle a unidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+
+ // Create a unidirectional stream.
+ const writable = await wt.createUnidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const encoder = new TextEncoderStream();
+ encoder.readable.pipeTo(writable);
+ const writer = encoder.writable.getWriter();
+ await writer.write('Hello World');
+ await writer.close();
+
+ // The echo handler creates a new unidirectional stream to echo back data from
+ // the server to client. Accept the unidirectional stream.
+ const readable = wt.incomingUnidirectionalStreams;
+ const stream_reader = readable.getReader();
+ const { value: recv_stream } = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Read the data on the readable end.
+ const reply = await read_stream_as_string(recv_stream);
+
+ // Make sure the message on the writable and readable ends of the streams
+ // match.
+ assert_equals(reply, 'Hello World');
+}, 'WebTransport client should be able to create, accept, and handle a unidirectional stream without waiting for ready');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // The echo handler creates a bidirectional stream when a WebTransport session
+ // is established. Accept the bidirectional stream.
+ const stream_reader = wt.incomingBidirectionalStreams.getReader();
+ const {value: bidi_stream} = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Write data to the writable end, and close it.
+ const buffer_size = 256;
+ const data = new Uint8Array(buffer_size);
+ for (let i = 0; i < data.byteLength; ++i) {
+ data[i] = i;
+ }
+ const writer = bidi_stream.writable.getWriter();
+ writer.write(data);
+ await writer.close();
+
+ // Read the data on the readable end and check if it matches the writable end.
+ const reader = bidi_stream.readable.getReader({mode: 'byob'});
+ assert_true(reader instanceof ReadableStreamBYOBReader);
+ const half_buffer_size = buffer_size / 2;
+ for (let i = 0; i < 2; i++) {
+ let buffer = new ArrayBuffer(half_buffer_size);
+ buffer = await readInto(reader, buffer);
+ assert_array_equals(
+ new Uint8Array(buffer),
+ data.subarray(half_buffer_size * i, half_buffer_size * (i + 1)))
+ }
+ reader.releaseLock();
+}, 'Can read data from a bidirectional stream with BYOB reader');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a unidirectional stream.
+ const writable = await wt.createUnidirectionalStream();
+
+ // Write data to the writable end, and close it.
+ const buffer_size = 256;
+ const data = new Uint8Array(buffer_size);
+ for (let i = 0; i < data.byteLength; ++i) {
+ data[i] = i;
+ }
+ const writer = writable.getWriter();
+ writer.write(data);
+ await writer.close();
+
+ // The echo handler creates a new unidirectional stream to echo back data from
+ // the server to client. Accept the unidirectional stream.
+ const readable = wt.incomingUnidirectionalStreams;
+ const stream_reader = readable.getReader();
+ const {value: recv_stream} = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Read the data on the readable end and check if it matches the writable end.
+ const reader = recv_stream.getReader({mode: 'byob'});
+ assert_true(reader instanceof ReadableStreamBYOBReader);
+ const half_buffer_size = buffer_size / 2;
+ let buffer = new ArrayBuffer(half_buffer_size);
+ for (let i = 0; i < 2; i++) {
+ buffer = await readInto(reader, buffer);
+ assert_array_equals(
+ new Uint8Array(buffer),
+ data.subarray(half_buffer_size * i, half_buffer_size * (i + 1)))
+ }
+ reader.releaseLock();
+}, 'Can read data from a unidirectional stream with BYOB reader');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = bidi_stream.writable.getWriter();
+ const bytes = new Uint8Array(16384);
+ const [reply] = await Promise.all([
+ read_stream(bidi_stream.readable),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.close()
+ ]);
+ let len = 0;
+ for (chunk of reply) {
+ len += chunk.length;
+ }
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(len, 3*bytes.length);
+}, 'Transfer large chunks of data on a bidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a unidirectional stream.
+ const uni_stream = await wt.createUnidirectionalStream();
+
+ // Write a message to the writable end, and close it.
+ const writer = uni_stream.getWriter();
+ const bytes = new Uint8Array(16384);
+ await Promise.all([
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.write(bytes),
+ writer.close()
+ ]);
+ // XXX Update once chrome fixes https://crbug.com/929585
+ // The echo handler creates a new unidirectional stream to echo back data from
+ // the server to client. Accept the unidirectional stream.
+ const readable = wt.incomingUnidirectionalStreams;
+ const stream_reader = readable.getReader();
+ const { value: recv_stream } = await stream_reader.read();
+ stream_reader.releaseLock();
+
+ // Read the data on the readable end.
+ const reply = await read_stream(recv_stream);
+ let len = 0;
+ for (chunk of reply) {
+ len += chunk.length;
+ }
+ // Check that the message from the readable end matches the writable end.
+ assert_equals(len, 3*bytes.length);
+}, 'Transfer large chunks of data on a unidirectional stream');
+
+promise_test(async t => {
+ // Establish a WebTransport session.
+ const wt = new WebTransport(webtransport_url('echo.py'));
+ await wt.ready;
+
+ // Create a bidirectional stream.
+ const bidi_stream = await wt.createBidirectionalStream();
+
+ // Close the writable end with no data at all.
+ const writer = bidi_stream.writable.getWriter();
+ writer.close();
+
+ // Read the data on the readable end.
+ const chunks = await read_stream(bidi_stream.readable);
+ assert_equals(chunks.length, 0);
+
+ await bidi_stream.readable.closed;
+}, 'Closing the stream with no data still resolves the read request');