| Index: third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/bad-underlying-sources.js
|
| diff --git a/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/bad-underlying-sources.js b/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/bad-underlying-sources.js
|
| new file mode 100644
|
| index 0000000000000000000000000000000000000000..f2fd0fdc9299d5d5de4f5628dd19d59fd29300da
|
| --- /dev/null
|
| +++ b/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/bad-underlying-sources.js
|
| @@ -0,0 +1,383 @@
|
| +'use strict';
|
| +
|
| +if (self.importScripts) {
|
| + self.importScripts('/resources/testharness.js');
|
| +}
|
| +
|
| +
|
| +test(() => {
|
| +
|
| + const theError = new Error('a unique string');
|
| +
|
| + assert_throws(theError, () => {
|
| + new ReadableStream({
|
| + get start() {
|
| + throw theError;
|
| + }
|
| + });
|
| + }, 'constructing the stream should re-throw the error');
|
| +
|
| +}, 'Underlying source start: throwing getter');
|
| +
|
| +
|
| +test(() => {
|
| +
|
| + const theError = new Error('a unique string');
|
| +
|
| + assert_throws(theError, () => {
|
| + new ReadableStream({
|
| + start() {
|
| + throw theError;
|
| + }
|
| + });
|
| + }, 'constructing the stream should re-throw the error');
|
| +
|
| +}, 'Underlying source start: throwing method');
|
| +
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| + const rs = new ReadableStream({
|
| + get pull() {
|
| + throw theError;
|
| + }
|
| + });
|
| +
|
| + return promise_rejects(t, theError, rs.getReader().closed);
|
| +
|
| +}, 'Underlying source: throwing pull getter (initial pull)');
|
| +
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| + const rs = new ReadableStream({
|
| + pull() {
|
| + throw theError;
|
| + }
|
| + });
|
| +
|
| + return promise_rejects(t, theError, rs.getReader().closed);
|
| +
|
| +}, 'Underlying source: throwing pull method (initial pull)');
|
| +
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| +
|
| + let counter = 0;
|
| + const rs = new ReadableStream({
|
| + get pull() {
|
| + ++counter;
|
| + if (counter === 1) {
|
| + return c => c.enqueue('a');
|
| + }
|
| +
|
| + throw theError;
|
| + }
|
| + });
|
| + const reader = rs.getReader();
|
| +
|
| + return Promise.all([
|
| + reader.read().then(r => {
|
| + assert_object_equals(r, { value: 'a', done: false }, 'the chunk read should be correct');
|
| + }),
|
| + promise_rejects(t, theError, reader.closed)
|
| + ]);
|
| +
|
| +}, 'Underlying source pull: throwing getter (second pull)');
|
| +
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| +
|
| + let counter = 0;
|
| + const rs = new ReadableStream({
|
| + pull(c) {
|
| + ++counter;
|
| + if (counter === 1) {
|
| + c.enqueue('a');
|
| + return;
|
| + }
|
| +
|
| + throw theError;
|
| + }
|
| + });
|
| + const reader = rs.getReader();
|
| +
|
| + return Promise.all([
|
| + reader.read().then(r => {
|
| + assert_object_equals(r, { value: 'a', done: false }, 'the chunk read should be correct');
|
| + }),
|
| + promise_rejects(t, theError, reader.closed)
|
| + ]);
|
| +
|
| +}, 'Underlying source pull: throwing method (second pull)');
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| + const rs = new ReadableStream({
|
| + get cancel() {
|
| + throw theError;
|
| + }
|
| + });
|
| +
|
| + return promise_rejects(t, theError, rs.cancel());
|
| +
|
| +}, 'Underlying source cancel: throwing getter');
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('a unique string');
|
| + const rs = new ReadableStream({
|
| + cancel() {
|
| + throw theError;
|
| + }
|
| + });
|
| +
|
| + return promise_rejects(t, theError, rs.cancel());
|
| +
|
| +}, 'Underlying source cancel: throwing method');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let controller;
|
| + const rs = new ReadableStream({
|
| + start(c) {
|
| + controller = c;
|
| + }
|
| + });
|
| +
|
| + rs.cancel();
|
| + controller.enqueue('a'); // Calling enqueue after canceling should not throw anything.
|
| +
|
| + return rs.getReader().closed;
|
| +
|
| +}, 'Underlying source: calling enqueue on an empty canceled stream should not throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let controller;
|
| + const rs = new ReadableStream({
|
| + start(c) {
|
| + c.enqueue('a');
|
| + c.enqueue('b');
|
| + controller = c;
|
| + }
|
| + });
|
| +
|
| + rs.cancel();
|
| + controller.enqueue('c'); // Calling enqueue after canceling should not throw anything.
|
| +
|
| + return rs.getReader().closed;
|
| +
|
| +}, 'Underlying source: calling enqueue on a non-empty canceled stream should not throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + return new ReadableStream({
|
| + start(c) {
|
| + c.close();
|
| + assert_throws(new TypeError(), () => c.enqueue('a'), 'call to enqueue should throw a TypeError');
|
| + }
|
| + }).getReader().closed;
|
| +
|
| +}, 'Underlying source: calling enqueue on a closed stream should throw');
|
| +
|
| +promise_test(t => {
|
| +
|
| + const theError = new Error('boo');
|
| + const closed = new ReadableStream({
|
| + start(c) {
|
| + c.error(theError);
|
| + assert_throws(theError, () => c.enqueue('a'), 'call to enqueue should throw the error');
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return promise_rejects(t, theError, closed);
|
| +
|
| +}, 'Underlying source: calling enqueue on an errored stream should throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + return new ReadableStream({
|
| + start(c) {
|
| + c.close();
|
| + assert_throws(new TypeError(), () => c.close(), 'second call to close should throw a TypeError');
|
| + }
|
| + }).getReader().closed;
|
| +
|
| +}, 'Underlying source: calling close twice on an empty stream should throw the second time');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let startCalled = false;
|
| + let readCalled = false;
|
| + const reader = new ReadableStream({
|
| + start(c) {
|
| + c.enqueue('a');
|
| + c.close();
|
| + assert_throws(new TypeError(), () => c.close(), 'second call to close should throw a TypeError');
|
| + startCalled = true;
|
| + }
|
| + }).getReader();
|
| +
|
| + return Promise.all([
|
| + reader.read().then(r => {
|
| + assert_object_equals(r, { value: 'a', done: false }, 'read() should read the enqueued chunk');
|
| + readCalled = true;
|
| + }),
|
| + reader.closed.then(() => {
|
| + assert_true(startCalled);
|
| + assert_true(readCalled);
|
| + })
|
| + ]);
|
| +
|
| +}, 'Underlying source: calling close twice on a non-empty stream should throw the second time');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let controller;
|
| + let startCalled = false;
|
| + const rs = new ReadableStream({
|
| + start(c) {
|
| + controller = c;
|
| + startCalled = true;
|
| + }
|
| + });
|
| +
|
| + rs.cancel();
|
| + controller.close(); // Calling close after canceling should not throw anything.
|
| +
|
| + return rs.getReader().closed.then(() => {
|
| + assert_true(startCalled);
|
| + });
|
| +
|
| +}, 'Underlying source: calling close on an empty canceled stream should not throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let controller;
|
| + let startCalled = false;
|
| + const rs = new ReadableStream({
|
| + start(c) {
|
| + controller = c;
|
| + c.enqueue('a');
|
| + startCalled = true;
|
| + }
|
| + });
|
| +
|
| + rs.cancel();
|
| + controller.close(); // Calling close after canceling should not throw anything.
|
| +
|
| + return rs.getReader().closed.then(() => {
|
| + assert_true(startCalled);
|
| + });
|
| +
|
| +}, 'Underlying source: calling close on a non-empty canceled stream should not throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + const theError = new Error('boo');
|
| + let startCalled = false;
|
| +
|
| + const closed = new ReadableStream({
|
| + start(c) {
|
| + c.error(theError);
|
| + assert_throws(new TypeError(), () => c.close(), 'call to close should throw a TypeError');
|
| + startCalled = true;
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return closed.catch(e => {
|
| + assert_true(startCalled);
|
| + assert_equals(e, theError, 'closed should reject with the error');
|
| + });
|
| +
|
| +}, 'Underlying source: calling close after error should throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + const theError = new Error('boo');
|
| + let startCalled = false;
|
| +
|
| + const closed = new ReadableStream({
|
| + start(c) {
|
| + c.error(theError);
|
| + assert_throws(new TypeError(), () => c.error(), 'second call to error should throw a TypeError');
|
| + startCalled = true;
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return closed.catch(e => {
|
| + assert_true(startCalled);
|
| + assert_equals(e, theError, 'closed should reject with the error');
|
| + });
|
| +
|
| +}, 'Underlying source: calling error twice should throw the second time');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let startCalled = false;
|
| +
|
| + const closed = new ReadableStream({
|
| + start(c) {
|
| + c.close();
|
| + assert_throws(new TypeError(), () => c.error(), 'second call to error should throw a TypeError');
|
| + startCalled = true;
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return closed.then(() => assert_true(startCalled));
|
| +
|
| +}, 'Underlying source: calling error after close should throw');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let startCalled = false;
|
| + const firstError = new Error('1');
|
| + const secondError = new Error('2');
|
| +
|
| + const closed = new ReadableStream({
|
| + start(c) {
|
| + c.error(firstError);
|
| + startCalled = true;
|
| + return Promise.reject(secondError);
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return closed.catch(e => {
|
| + assert_true(startCalled);
|
| + assert_equals(e, firstError, 'closed should reject with the first error');
|
| + });
|
| +
|
| +}, 'Underlying source: calling error and returning a rejected promise from start should cause the stream to error ' +
|
| + 'with the first error');
|
| +
|
| +promise_test(() => {
|
| +
|
| + let startCalled = false;
|
| + const firstError = new Error('1');
|
| + const secondError = new Error('2');
|
| +
|
| + const closed = new ReadableStream({
|
| + pull(c) {
|
| + c.error(firstError);
|
| + startCalled = true;
|
| + return Promise.reject(secondError);
|
| + }
|
| + }).getReader().closed;
|
| +
|
| + return closed.catch(e => {
|
| + assert_true(startCalled);
|
| + assert_equals(e, firstError, 'closed should reject with the first error');
|
| + });
|
| +
|
| +}, 'Underlying source: calling error and returning a rejected promise from pull should cause the stream to error ' +
|
| + 'with the first error');
|
| +
|
| +done();
|
|
|