-
Notifications
You must be signed in to change notification settings - Fork 3.8k
Streams: tests for Transformer.cancel
#40453
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 3 commits
ff3c698
4156716
1f2f6c8
1fbae6a
9fa9a0c
ab3f840
a169eb4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,116 @@ | ||
| // META: global=window,worker | ||
| // META: script=../resources/test-utils.js | ||
| 'use strict'; | ||
|
|
||
| const thrownError = new Error('bad things are happening!'); | ||
| thrownError.name = 'error1'; | ||
|
|
||
| const originalReason = new Error('original reason'); | ||
| originalReason.name = 'error2'; | ||
|
|
||
| promise_test(async t => { | ||
| let cancelled = undefined; | ||
| const ts = new TransformStream({ | ||
| cancel(reason) { | ||
| cancelled = reason; | ||
| } | ||
| }); | ||
| const res = await ts.readable.cancel(thrownError) | ||
| assert_equals(res, undefined, 'readable.cancel() should return undefined'); | ||
| assert_equals(cancelled, thrownError, 'transformer.cancel() should be called with the passed reason'); | ||
| }, 'cancelling the readable side should call transformer.cancel()'); | ||
|
|
||
| promise_test(async t => { | ||
| const ts = new TransformStream({ | ||
| cancel(reason) { | ||
| assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); | ||
| throw thrownError; | ||
| } | ||
| }); | ||
| const writer = ts.writable.getWriter(); | ||
| const cancelPromise = ts.readable.cancel(originalReason) | ||
| await promise_rejects_exactly(t, thrownError, cancelPromise, 'readable.cancel() should reject with thrownError'); | ||
| await promise_rejects_exactly(t, thrownError, writer.closed, 'writer.closed should reject with thrownError'); | ||
| }, 'cancelling the readable side should reject if transformer.cancel() throws'); | ||
|
|
||
| promise_test(async t => { | ||
| let aborted = undefined; | ||
| const ts = new TransformStream({ | ||
| cancel(reason) { | ||
| aborted = reason; | ||
| }, | ||
| flush: t.unreached_func('flush should not be called') | ||
| }); | ||
| const res = await ts.writable.abort(thrownError) | ||
| assert_equals(res, undefined, 'writable.abort() should return undefined'); | ||
| assert_equals(aborted, thrownError, 'transformer.abort() should be called with the passed reason'); | ||
| }, 'aborting the writable side should call transformer.abort()'); | ||
|
|
||
| promise_test(async t => { | ||
| const ts = new TransformStream({ | ||
| cancel(reason) { | ||
| assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); | ||
| throw thrownError; | ||
| }, | ||
| flush: t.unreached_func('flush should not be called') | ||
| }); | ||
| const reader = ts.readable.getReader(); | ||
| const abortPromise = ts.writable.abort(originalReason) | ||
| await promise_rejects_exactly(t, thrownError, abortPromise, 'writable.abort() should reject with thrownError'); | ||
| await promise_rejects_exactly(t, thrownError, reader.closed, 'reader.closed should reject with thrownError'); | ||
| }, 'aborting the writable side should reject if transformer.cancel() throws'); | ||
|
|
||
| promise_test(async t => { | ||
| const ts = new TransformStream({ | ||
| async cancel(reason) { | ||
| assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); | ||
| throw thrownError; | ||
| }, | ||
| flush: t.unreached_func('flush should not be called') | ||
| }); | ||
| const cancelPromise = ts.readable.cancel(originalReason); | ||
| const closePromise = ts.writable.close(); | ||
| await Promise.all([ | ||
| promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'), | ||
| promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'), | ||
| ]); | ||
| }, 'closing the writable side should reject if a parallel transformer.cancel() throws'); | ||
|
|
||
| promise_test(async t => { | ||
| let controller; | ||
| const ts = new TransformStream({ | ||
| start(c) { | ||
| controller = c; | ||
| }, | ||
| async cancel(reason) { | ||
| assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); | ||
| controller.error(thrownError); | ||
| }, | ||
| flush: t.unreached_func('flush should not be called') | ||
| }); | ||
| const cancelPromise = ts.readable.cancel(originalReason); | ||
| const closePromise = ts.writable.close(); | ||
| await Promise.all([ | ||
| promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'), | ||
| promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'), | ||
| ]); | ||
| }, 'readable.cancel() and a parallel writable.close() should reject if a transformer.cancel() calls controller.error()'); | ||
|
|
||
| promise_test(async t => { | ||
| let controller; | ||
| const ts = new TransformStream({ | ||
| start(c) { | ||
| controller = c; | ||
| }, | ||
| async cancel(reason) { | ||
| assert_equals(reason, originalReason, 'transformer.cancel() should be called with the passed reason'); | ||
| controller.error(thrownError); | ||
| }, | ||
| flush: t.unreached_func('flush should not be called') | ||
| }); | ||
| const cancelPromise = ts.writable.abort(originalReason); | ||
| await promise_rejects_exactly(t, thrownError, cancelPromise, 'cancelPromise should reject with thrownError'); | ||
| const closePromise = ts.readable.cancel(1); | ||
| await promise_rejects_exactly(t, thrownError, closePromise, 'closePromise should reject with thrownError'); | ||
| }, 'writable.abort() and readable.cancel() should reject if a transformer.cancel() calls controller.error()'); | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -388,9 +388,24 @@ promise_test(t => { | |
| controller.terminate(); | ||
| return Promise.all([ | ||
| cancelPromise, | ||
| promise_rejects_exactly(t, cancelReason, ts.writable.getWriter().closed, 'closed should reject with cancelReason') | ||
| promise_rejects_js(t, TypeError, ts.writable.getWriter().closed, 'closed should reject with TypeError') | ||
|
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Hmm, I see. Since I suppose that's fine.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. hello @MattiasBuelens i am trying to implement this for node this test presently fails my knowledge of WPTs is little limited hence asking here so is
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test will fail if you have not implanted the changes from the streams spec PR (yet).
Member
Author
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This test passes against the reference implementation, so if it fails it may be a bug in your implementation.
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Could be a bug no doubt i just wnated to know this test is basically equalt to the following script right: import { TransformStream } from 'stream/web';
let controller;
const ts = new TransformStream({
start(c) {
controller = c;
}
});
const cancelReason = { name: 'cancelReason' };
const cancelPromise = ts.readable.cancel(cancelReason);
controller.terminate();
try {
await Promise.all([cancelPromise, ts.writable.getWriter().closed]);
} catch (err) {
console.log(err); // TypeError!
}
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. @debadree25 Yes, that looks script right. Ideally, you want to assert that the import assert from 'node:assert/strict';
await Promise.all([
cancelPromise,
assert.rejects(ts.writable.getWriter().closed, TypeError)
]);
No, The only change is that
Contributor
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Thank you so much @MattiasBuelens for the detail response i guess i have found the issue with my implementation! |
||
| ]); | ||
| }, 'terminate() should do nothing after readable.cancel()'); | ||
| }, 'terminate() should abort writable immediately after readable.cancel()'); | ||
|
|
||
| promise_test(t => { | ||
| let controller; | ||
| const ts = new TransformStream({ | ||
| start(c) { | ||
| controller = c; | ||
| } | ||
| }); | ||
| const cancelReason = { name: 'cancelReason' }; | ||
| return ts.readable.cancel(cancelReason).then(() => { | ||
| controller.terminate(); | ||
| return promise_rejects_exactly(t, cancelReason, ts.writable.getWriter().closed, 'closed should reject with TypeError'); | ||
| }) | ||
| }, 'terminate() should do nothing after readable.cancel() resolves'); | ||
|
|
||
|
|
||
| promise_test(() => { | ||
| let calls = 0; | ||
|
|
||
Uh oh!
There was an error while loading. Please reload this page.