Index: third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/readable-stream-reader.js |
diff --git a/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/readable-stream-reader.js b/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/readable-stream-reader.js |
deleted file mode 100644 |
index 1d5bc13004f8a357fc5e82522f3bd309f1311b9a..0000000000000000000000000000000000000000 |
--- a/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/readable-stream-reader.js |
+++ /dev/null |
@@ -1,485 +0,0 @@ |
-'use strict'; |
- |
-if (self.importScripts) { |
- self.importScripts('../resources/rs-utils.js'); |
- self.importScripts('/resources/testharness.js'); |
-} |
- |
-let ReadableStreamReader; |
- |
-test(() => { |
- |
- // It's not exposed globally, but we test a few of its properties here. |
- ReadableStreamReader = (new ReadableStream()).getReader().constructor; |
- |
-}, 'Can get the ReadableStreamReader constructor indirectly'); |
- |
-test(() => { |
- |
- assert_throws(new TypeError(), () => new ReadableStreamReader('potato')); |
- assert_throws(new TypeError(), () => new ReadableStreamReader({})); |
- assert_throws(new TypeError(), () => new ReadableStreamReader()); |
- |
-}, 'ReadableStreamReader constructor should get a ReadableStream object as argument'); |
- |
-test(() => { |
- |
- const methods = ['cancel', 'constructor', 'read', 'releaseLock']; |
- const properties = methods.concat(['closed']).sort(); |
- |
- const rsReader = new ReadableStreamReader(new ReadableStream()); |
- const proto = Object.getPrototypeOf(rsReader); |
- |
- assert_array_equals(Object.getOwnPropertyNames(proto).sort(), properties); |
- |
- for (const m of methods) { |
- const propDesc = Object.getOwnPropertyDescriptor(proto, m); |
- assert_equals(propDesc.enumerable, false, 'method should be non-enumerable'); |
- assert_equals(propDesc.configurable, true, 'method should be configurable'); |
- assert_equals(propDesc.writable, true, 'method should be writable'); |
- assert_equals(typeof rsReader[m], 'function', 'should have be a method'); |
- } |
- |
- const closedPropDesc = Object.getOwnPropertyDescriptor(proto, 'closed'); |
- assert_equals(closedPropDesc.enumerable, false, 'closed should be non-enumerable'); |
- assert_equals(closedPropDesc.configurable, true, 'closed should be configurable'); |
- assert_not_equals(closedPropDesc.get, undefined, 'closed should have a getter'); |
- assert_equals(closedPropDesc.set, undefined, 'closed should not have a setter'); |
- |
- assert_equals(rsReader.cancel.length, 1, 'cancel has 1 parameter'); |
- assert_not_equals(rsReader.closed, undefined, 'has a non-undefined closed property'); |
- assert_equals(typeof rsReader.closed.then, 'function', 'closed property is thenable'); |
- assert_equals(typeof rsReader.constructor, 'function', 'has a constructor method'); |
- assert_equals(rsReader.constructor.length, 1, 'constructor has 1 parameter'); |
- assert_equals(typeof rsReader.read, 'function', 'has a getReader method'); |
- assert_equals(rsReader.read.length, 0, 'read has no parameters'); |
- assert_equals(typeof rsReader.releaseLock, 'function', 'has a releaseLock method'); |
- assert_equals(rsReader.releaseLock.length, 0, 'releaseLock has no parameters'); |
- |
-}, 'ReadableStreamReader instances should have the correct list of properties'); |
- |
-test(() => { |
- |
- const rsReader = new ReadableStreamReader(new ReadableStream()); |
- assert_equals(rsReader.closed, rsReader.closed, 'closed should return the same promise'); |
- |
-}, 'ReadableStreamReader closed should always return the same promise object'); |
- |
-test(() => { |
- |
- const rs = new ReadableStream(); |
- new ReadableStreamReader(rs); // Constructing directly the first time should be fine. |
- assert_throws(new TypeError(), () => new ReadableStreamReader(rs), |
- 'constructing directly the second time should fail'); |
- |
-}, 'Constructing a ReadableStreamReader directly should fail if the stream is already locked (via direct ' + |
- 'construction)'); |
- |
-test(() => { |
- |
- const rs = new ReadableStream(); |
- new ReadableStreamReader(rs); // Constructing directly should be fine. |
- assert_throws(new TypeError(), () => rs.getReader(), 'getReader() should fail'); |
- |
-}, 'Getting a ReadableStreamReader via getReader should fail if the stream is already locked (via direct ' + |
- 'construction)'); |
- |
-test(() => { |
- |
- const rs = new ReadableStream(); |
- rs.getReader(); // getReader() should be fine. |
- assert_throws(new TypeError(), () => new ReadableStreamReader(rs), 'constructing directly should fail'); |
- |
-}, 'Constructing a ReadableStreamReader directly should fail if the stream is already locked (via getReader)'); |
- |
-test(() => { |
- |
- const rs = new ReadableStream(); |
- rs.getReader(); // getReader() should be fine. |
- assert_throws(new TypeError(), () => rs.getReader(), 'getReader() should fail'); |
- |
-}, 'Getting a ReadableStreamReader via getReader should fail if the stream is already locked (via getReader)'); |
- |
-test(() => { |
- |
- const rs = new ReadableStream({ |
- start(c) { |
- c.close(); |
- } |
- }); |
- |
- new ReadableStreamReader(rs); // Constructing directly should not throw. |
- |
-}, 'Constructing a ReadableStreamReader directly should be OK if the stream is closed'); |
- |
-test(() => { |
- |
- const theError = new Error('don\'t say i didn\'t warn ya'); |
- const rs = new ReadableStream({ |
- start(c) { |
- c.error(theError); |
- } |
- }); |
- |
- new ReadableStreamReader(rs); // Constructing directly should not throw. |
- |
-}, 'Constructing a ReadableStreamReader directly should be OK if the stream is errored'); |
- |
-promise_test(() => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- const reader = rs.getReader(); |
- |
- const promise = reader.read().then(result => { |
- assert_object_equals(result, { value: 'a', done: false }, 'read() should fulfill with the enqueued chunk'); |
- }); |
- |
- controller.enqueue('a'); |
- return promise; |
- |
-}, 'Reading from a reader for an empty stream will wait until a chunk is available'); |
- |
-promise_test(() => { |
- |
- let cancelCalled = false; |
- const passedReason = new Error('it wasn\'t the right time, sorry'); |
- const rs = new ReadableStream({ |
- cancel(reason) { |
- assert_true(rs.locked, 'the stream should still be locked'); |
- assert_throws(new TypeError(), () => rs.getReader(), 'should not be able to get another reader'); |
- assert_equals(reason, passedReason, 'the cancellation reason is passed through to the underlying source'); |
- cancelCalled = true; |
- } |
- }); |
- |
- const reader = rs.getReader(); |
- return reader.cancel(passedReason).then(() => assert_true(cancelCalled)); |
- |
-}, 'cancel() on a reader does not release the reader'); |
- |
-promise_test(() => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const reader = rs.getReader(); |
- const promise = reader.closed; |
- |
- controller.close(); |
- return promise; |
- |
-}, 'closed should be fulfilled after stream is closed (.closed access before acquiring)'); |
- |
-promise_test(t => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const reader1 = rs.getReader(); |
- |
- reader1.releaseLock(); |
- |
- const reader2 = rs.getReader(); |
- controller.close(); |
- |
- return Promise.all([ |
- promise_rejects(t, new TypeError(), reader1.closed), |
- reader2.closed |
- ]); |
- |
-}, 'closed should be rejected after reader releases its lock (multiple stream locks)'); |
- |
-promise_test(() => { |
- |
- const rs = new ReadableStream({ |
- start(c) { |
- c.enqueue('a'); |
- c.enqueue('b'); |
- c.close(); |
- } |
- }); |
- |
- const reader1 = rs.getReader(); |
- const promise1 = reader1.read().then(r => { |
- assert_object_equals(r, { value: 'a', done: false }, 'reading the first chunk from reader1 works'); |
- }); |
- reader1.releaseLock(); |
- |
- const reader2 = rs.getReader(); |
- const promise2 = reader2.read().then(r => { |
- assert_object_equals(r, { value: 'b', done: false }, 'reading the second chunk from reader2 works'); |
- }); |
- reader2.releaseLock(); |
- |
- return Promise.all([promise1, promise2]); |
- |
-}, 'Multiple readers can access the stream in sequence'); |
- |
-promise_test(() => { |
- const rs = new ReadableStream({ |
- start(c) { |
- c.enqueue('a'); |
- } |
- }); |
- |
- const reader1 = rs.getReader(); |
- reader1.releaseLock(); |
- |
- const reader2 = rs.getReader(); |
- |
- // Should be a no-op |
- reader1.releaseLock(); |
- |
- return reader2.read().then(result => { |
- assert_object_equals(result, { value: 'a', done: false }, |
- 'read() should still work on reader2 even after reader1 is released'); |
- }); |
- |
-}, 'Cannot use an already-released reader to unlock a stream again'); |
- |
-promise_test(t => { |
- |
- const rs = new ReadableStream({ |
- start(c) { |
- c.enqueue('a'); |
- }, |
- cancel() { |
- assert_unreached('underlying source cancel should not be called'); |
- } |
- }); |
- |
- const reader = rs.getReader(); |
- reader.releaseLock(); |
- const cancelPromise = reader.cancel(); |
- |
- const reader2 = rs.getReader(); |
- const readPromise = reader2.read().then(r => { |
- assert_object_equals(r, { value: 'a', done: false }, 'a new reader should be able to read a chunk'); |
- }); |
- |
- return Promise.all([ |
- promise_rejects(t, new TypeError(), cancelPromise), |
- readPromise |
- ]); |
- |
-}, 'cancel() on a released reader is a no-op and does not pass through'); |
- |
-promise_test(t => { |
- |
- const promiseAsserts = []; |
- |
- let controller; |
- const theError = { name: 'unique error' }; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const reader1 = rs.getReader(); |
- |
- promiseAsserts.push( |
- promise_rejects(t, theError, reader1.closed), |
- promise_rejects(t, theError, reader1.read()) |
- ); |
- |
- assert_throws(new TypeError(), () => rs.getReader(), 'trying to get another reader before erroring should throw'); |
- |
- controller.error(theError); |
- |
- reader1.releaseLock(); |
- |
- const reader2 = rs.getReader(); |
- |
- promiseAsserts.push( |
- promise_rejects(t, theError, reader2.closed), |
- promise_rejects(t, theError, reader2.read()) |
- ); |
- |
- return Promise.all(promiseAsserts); |
- |
-}, 'Getting a second reader after erroring the stream and releasing the reader should succeed'); |
- |
-promise_test(t => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const promise = rs.getReader().closed.then( |
- t.unreached_func('closed promise should not be fulfilled when stream is errored'), |
- err => { |
- assert_equals(err, undefined, 'passed error should be undefined as it was'); |
- } |
- ); |
- |
- controller.error(); |
- return promise; |
- |
-}, 'ReadableStreamReader closed promise should be rejected with undefined if that is the error'); |
- |
- |
-promise_test(t => { |
- |
- const rs = new ReadableStream({ |
- start() { |
- return Promise.reject(); |
- } |
- }); |
- |
- return rs.getReader().read().then( |
- t.unreached_func('read promise should not be fulfilled when stream is errored'), |
- err => { |
- assert_equals(err, undefined, 'passed error should be undefined as it was'); |
- } |
- ); |
- |
-}, 'ReadableStreamReader: if start rejects with no parameter, it should error the stream with an undefined error'); |
- |
-promise_test(t => { |
- |
- const theError = { name: 'unique string' }; |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const promise = promise_rejects(t, theError, rs.getReader().closed); |
- |
- controller.error(theError); |
- return promise; |
- |
-}, 'Erroring a ReadableStream after checking closed should reject ReadableStreamReader closed promise'); |
- |
-promise_test(t => { |
- |
- const theError = { name: 'unique string' }; |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- controller.error(theError); |
- |
- // Let's call getReader twice for extra test coverage of this code path. |
- rs.getReader().releaseLock(); |
- |
- return promise_rejects(t, theError, rs.getReader().closed); |
- |
-}, 'Erroring a ReadableStream before checking closed should reject ReadableStreamReader closed promise'); |
- |
-promise_test(() => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- const reader = rs.getReader(); |
- |
- const promise = Promise.all([ |
- reader.read().then(result => { |
- assert_object_equals(result, { value: undefined, done: true }, 'read() should fulfill with close (1)'); |
- }), |
- reader.read().then(result => { |
- assert_object_equals(result, { value: undefined, done: true }, 'read() should fulfill with close (2)'); |
- }), |
- reader.closed |
- ]); |
- |
- controller.close(); |
- return promise; |
- |
-}, 'Reading twice on a stream that gets closed'); |
- |
-promise_test(() => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- controller.close(); |
- const reader = rs.getReader(); |
- |
- return Promise.all([ |
- reader.read().then(result => { |
- assert_object_equals(result, { value: undefined, done: true }, 'read() should fulfill with close (1)'); |
- }), |
- reader.read().then(result => { |
- assert_object_equals(result, { value: undefined, done: true }, 'read() should fulfill with close (2)'); |
- }), |
- reader.closed |
- ]); |
- |
-}, 'Reading twice on a closed stream'); |
- |
-promise_test(t => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const myError = { name: 'mashed potatoes' }; |
- controller.error(myError); |
- |
- const reader = rs.getReader(); |
- |
- return Promise.all([ |
- promise_rejects(t, myError, reader.read()), |
- promise_rejects(t, myError, reader.read()), |
- promise_rejects(t, myError, reader.closed) |
- ]); |
- |
-}, 'Reading twice on an errored stream'); |
- |
-promise_test(t => { |
- |
- let controller; |
- const rs = new ReadableStream({ |
- start(c) { |
- controller = c; |
- } |
- }); |
- |
- const myError = { name: 'mashed potatoes' }; |
- const reader = rs.getReader(); |
- |
- const promise = Promise.all([ |
- promise_rejects(t, myError, reader.read()), |
- promise_rejects(t, myError, reader.read()), |
- promise_rejects(t, myError, reader.closed) |
- ]); |
- |
- controller.error(myError); |
- return promise; |
- |
-}, 'Reading twice on a stream that gets errored'); |
- |
-done(); |