- From: Domenic Denicola <notifications@github.com>
- Date: Thu, 20 Oct 2016 14:30:13 -0700
- To: whatwg/streams <streams@noreply.github.com>
- Message-ID: <whatwg/streams/pull/540/review/5161439@github.com>
domenic requested changes on this pull request.
> @@ -1,14 +1,16 @@
'use strict';
+/* global delay, recordingWritableStream */
If you rebase this will not be necessary
>
if (self.importScripts) {
+ self.importScripts('../resources/test-utils.js');
Move this after testharness.js
> + return promise_rejects(t, new TypeError(), writer.abort(), 'abort() should reject with a TypeError');
+}, 'abort() on a released writer rejects');
+
+promise_test(() => {
+ const ws = recordingWritableStream();
+
+ return delay(0)
+ .then(() => {
+ const writer = ws.getWriter();
+
+ writer.abort();
+ writer.write(1);
+ writer.write(2);
+ })
+ .then(() => {
+ assert_equals(ws.events.length, 2, 'the stream should have received 2 events');
You should use assert_array_equals here like the other recording stream tests. Same below.
The events[1] entry is the argument passed to abort, by the way, and is not related to writes.
> + return abortPromise.then(value => {
+ assert_equals(value, undefined, 'fulfillment value must be undefined');
+ });
+}, 'Fulfillment value of ws.abort() call must be undefined even if the underlying sink returns a non-undefined value');
+
+promise_test(t => {
+ const errorInSinkAbort = new Error('Sorry, it just wasn\'t meant to be.');
+ const ws = new WritableStream({
+ abort() {
+ throw errorInSinkAbort;
+ }
+ });
+
+ const writer = ws.getWriter();
+
+ return promise_rejects(t, errorInSinkAbort, writer.abort(undefined),
Can you use the `error1` pattern used elsewhere? With a single `error1` at the top of the file? Here and below.
Also everywhere that creates a separate `passedReason` can use that `error1`.
> +}, 'WritableStream if sink\'s abort throws, the promise returned by ws.abort() rejects');
+
+test(() => {
+ let recordedReason;
+ const ws = new WritableStream({
+ abort(reason) {
+ recordedReason = reason;
+ }
+ });
+
+ const writer = ws.getWriter();
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+
+ assert_equals(recordedReason, passedReason);
This test can use recordingWritableStream instead, with assert_array_equals on the contents.
> +}, 'Aborting a WritableStream passes through the given reason');
+
+promise_test(t => {
+ const ws = new WritableStream();
+ const writer = ws.getWriter();
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+
+ return Promise.all([
+ promise_rejects(t, new TypeError(), writer.write(), 'writing should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.close(), 'closing should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.abort(), 'aborting should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.closed, 'closed should reject with the given reason'),
+ ]);
+}, 'Aborting a WritableStream puts it in an errored state, with stored error equal to the abort reason');
This test description is outdated; change it to "with a TypeError as the stored error"
> +promise_test(t => {
+ const ws = new WritableStream();
+ const writer = ws.getWriter();
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+
+ return Promise.all([
+ promise_rejects(t, new TypeError(), writer.write(), 'writing should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.close(), 'closing should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.abort(), 'aborting should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.closed, 'closed should reject with the given reason'),
+ ]);
+}, 'Aborting a WritableStream puts it in an errored state, with stored error equal to the abort reason');
+
+// TODO return promise
Just store the promise with `const writePromise = promise_rejects(...)` and then return it as the last line
> + promise_rejects(t, new TypeError(), writer.close(), 'closing should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.abort(), 'aborting should reject with the given reason'),
+ promise_rejects(t, new TypeError(), writer.closed, 'closed should reject with the given reason'),
+ ]);
+}, 'Aborting a WritableStream puts it in an errored state, with stored error equal to the abort reason');
+
+// TODO return promise
+promise_test(t => {
+ const ws = new WritableStream();
+ const writer = ws.getWriter();
+
+ promise_rejects(t, new TypeError(), writer.write('a'), 'writing should reject with a TypeError');
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+}, 'Aborting a WritableStream causes any outstanding write() promises to be rejected with the abort reason');
Test description is again outdated; "with a TypeError"
> + promise_rejects(t, new TypeError(), writer.write('a'), 'writing should reject with a TypeError');
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+}, 'Aborting a WritableStream causes any outstanding write() promises to be rejected with the abort reason');
+
+promise_test(t => {
+ const ws = new WritableStream();
+ const writer = ws.getWriter();
+
+ writer.close();
+
+ const passedReason = new Error('Sorry, it just wasn\'t meant to be.');
+ writer.abort(passedReason);
+
+ return promise_rejects(t, new TypeError('Aborted'), writer.closed, 'the stream should be errored with a TypeError');
Don't include `'Aborted'` here; the test framework doesn't look at messages. (Yeah, it's kind of wonky.)
> + }, 20);
+
+ return promise_rejects(t, new TypeError(), writer.closed, 'the stream should be errored with a TypeError');
+}, 'Closing a WritableStream and aborting it while it closes causes the stream to error');
+
+promise_test(() => {
+ const ws = new WritableStream();
+ const writer = ws.getWriter();
+
+ writer.close();
+
+ return delay(0)
+ .then(() => writer.abort())
+ .then(
+ v => assert_equals(v, undefined, 'abort promise should fulfill with undefined'),
+ () => { throw new Error(); }
This `() => { throw new Error(); }` is not necessary. In fact the second `.then()` can be removed entirely since we already test the undefinedness earlier.
> + .then(
+ v => assert_equals(v, undefined, 'abort promise should fulfill with undefined'),
+ () => { throw new Error(); }
+ );
+}, 'Aborting a WritableStream after it is closed is a no-op');
+
+test(() => {
+ const ws = new WritableStream({
+ close(...args) {
+ assert_equals(args.length, 0, 'close() was called (with no arguments)');
+ }
+ });
+
+ const writer = ws.getWriter();
+
+ writer.abort();
Again best to use recordingWritableStream. As-is, this test will pass even if close is never called.
It might be good to add something to recordingWritableStream's close() that asserts that `arguments.length === 0`.
--
You are receiving this because you are subscribed to this thread.
Reply to this email directly or view it on GitHub:
https://github.com/whatwg/streams/pull/540#pullrequestreview-5161439
Received on Thursday, 20 October 2016 21:30:46 UTC