blob: 40a59b7fa4449b33658ab4a3a86562bb4706f410 [file] [log] [blame]
// META: global=window,worker
// META: script=/common/get-host-info.sub.js
// META: script=/common/utils.js
// META: script=resources/webtransport-test-helpers.sub.js
// Note: There is no aioquic event for STOP_SENDING yet, so the server does
// not support checking this yet. Hence, tests checking from the STOP_SENDING
// signal cannot be tested yet.
promise_test(async t => {
const id = token();
let wt = new WebTransport(webtransport_url(`client-close.py?token=${id}`));
await wt.ready;
const bidi_stream = await wt.createBidirectionalStream();
const writable = bidi_stream.writable;
const WT_CODE = 139;
const HTTP_CODE = webtransport_code_to_http_code(WT_CODE);
await writable.abort(
new WebTransportError({streamErrorCode: WT_CODE}));
await wait(10);
wt = new WebTransport(webtransport_url(`query.py?token=${id}`));
await wt.ready;
const streams = await wt.incomingUnidirectionalStreams;
const streams_reader = streams.getReader();
const { value: readable } = await streams_reader.read();
streams_reader.releaseLock();
const data = await read_stream_as_json(readable);
// Check that stream is aborted with RESET_STREAM with the code and reason
assert_own_property(data, 'stream-close-info');
const info = data['stream-close-info'];
assert_equals(info.source, 'reset', 'reset stream');
assert_equals(info.code, HTTP_CODE, 'code');
}, 'Abort client-created bidirectional stream');
promise_test(async t => {
const id = token();
let wt = new WebTransport(webtransport_url(`client-close.py?token=${id}`));
await wt.ready;
const stream_reader = wt.incomingBidirectionalStreams.getReader();
const { value: bidi_stream } = await stream_reader.read();
stream_reader.releaseLock();
const writer = bidi_stream.writable.getWriter();
const WT_CODE = 52;
const HTTP_CODE = webtransport_code_to_http_code(WT_CODE);
await writer.abort(
new WebTransportError({streamErrorCode: WT_CODE}));
await wait(10);
wt = new WebTransport(webtransport_url(`query.py?token=${id}`));
await wt.ready;
const streams = await wt.incomingUnidirectionalStreams;
const streams_reader = streams.getReader();
const { value: readable } = await streams_reader.read();
streams_reader.releaseLock();
const data = await read_stream_as_json(readable);
// Check that stream is aborted with RESET_STREAM with the code and reason
assert_own_property(data, 'stream-close-info');
const info = data['stream-close-info'];
assert_equals(info.source, 'reset', 'reset_stream');
assert_equals(info.code, HTTP_CODE, 'code');
}, 'Abort server-initiated bidirectional stream');
promise_test(async t => {
const WT_CODE = 240;
const HTTP_CODE = webtransport_code_to_http_code(WT_CODE);
const wt = new WebTransport(
webtransport_url(`abort-stream-from-server.py?code=${HTTP_CODE}`));
add_completion_callback(() => wt.close());
await wt.ready;
const writable = await wt.createUnidirectionalStream();
const writer = writable.getWriter();
// Write something, to make the stream visible to the server side.
await writer.write(new Uint8Array([64]));
// Sadly we cannot use promise_rejects_dom as the error constructor is
// WebTransportError rather than DOMException. Ditto below.
// We get a possible error, and then make sure wt.closed is rejected with it.
const e = await writer.closed.catch(e => e);
await promise_rejects_exactly(
t, e, writer.closed, 'closed promise should be rejected');
assert_true(e instanceof WebTransportError);
assert_equals(e.source, 'stream', 'source');
assert_equals(e.streamErrorCode, WT_CODE, 'streamErrorCode');
}, 'STOP_SENDING coming from server');
promise_test(async t => {
const WT_CODE = 127;
const HTTP_CODE = webtransport_code_to_http_code(WT_CODE);
const wt = new WebTransport(
webtransport_url(`abort-stream-from-server.py?code=${HTTP_CODE}`));
add_completion_callback(() => wt.close());
await wt.ready;
const bidi = await wt.createBidirectionalStream();
const writer = bidi.writable.getWriter();
// Write something, to make the stream visible to the server side.
await writer.write(new Uint8Array([64]));
const reader = bidi.readable.getReader();
const e = await reader.closed.catch(e => e);
await promise_rejects_exactly(
t, e, reader.closed, 'closed promise should be rejected');
assert_true(e instanceof WebTransportError);
assert_equals(e.source, 'stream', 'source');
assert_equals(e.streamErrorCode, WT_CODE, 'streamErrorCode');
}, 'RESET_STREAM coming from server');