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..3f2de70b63119a7d58c5ae056b2e17799470caf6 |
--- /dev/null |
+++ b/third_party/WebKit/LayoutTests/http/tests/streams/readable-streams/bad-underlying-sources.js |
@@ -0,0 +1,379 @@ |
+'use strict'; |
+ |
+if (self.importScripts) { |
+ self.importScripts('/resources/testharness.js'); |
+} |
+ |
+test(function() { |
+ var theError = new Error('a unique string'); |
+ |
+ assert_throws(theError, function() { |
+ new ReadableStream({ |
+ get start() { |
+ throw theError; |
+ } |
+ }); |
+ }, 'constructing the stream should re-throw the error'); |
+}, 'Underlying source start: throwing getter'); |
+ |
+test(function() { |
+ var theError = new Error('a unique string'); |
+ |
+ assert_throws(theError, function() { |
+ new ReadableStream({ |
+ start: function() { |
+ throw theError; |
+ } |
+ }); |
+ }, 'constructing the stream should re-throw the error'); |
+}, 'Underlying source start: throwing method'); |
+ |
+var test1 = async_test('Underlying source: throwing pull getter (initial pull)'); |
+test1.step(function() { |
+ var theError = new Error('a unique string'); |
+ var rs = new ReadableStream({ |
+ get pull() { |
+ throw theError; |
+ } |
+ }); |
+ |
+ rs.getReader().closed.then( |
+ test1.step_func(function() { assert_unreached('closed should not fulfill'); }), |
+ test1.step_func(function(r) { |
+ assert_equals(r, theError, 'closed should reject with the thrown error'); |
+ test1.done(); |
+ })); |
+}); |
+ |
+var test2 = async_test('Underlying source: throwing pull method (initial pull)'); |
+test2.step(function() { |
+ var theError = new Error('a unique string'); |
+ var rs = new ReadableStream({ |
+ pull: function() { |
+ throw theError; |
+ } |
+ }); |
+ |
+ rs.getReader().closed.then( |
+ test2.step_func(function() { assert_unreached('closed should not fulfill'); }), |
+ test2.step_func(function(r) { |
+ assert_equals(r, theError, 'closed should reject with the thrown error'); |
+ test2.done(); |
+ })); |
+}); |
+ |
+var test3 = async_test('Underlying source: throwing pull getter (second pull)'); |
+test3.step(function() { |
+ var theError = new Error('a unique string'); |
+ var counter = 0; |
+ var rs = new ReadableStream({ |
+ get pull() { |
+ ++counter; |
+ if (counter === 1) { |
+ return test3.step_func(function(c) { c.enqueue('a'); }) |
+ } |
+ |
+ throw theError; |
+ } |
+ }); |
+ var reader = rs.getReader(); |
+ |
+ reader.read().then(test3.step_func(function(r) { |
+ assert_object_equals(r, { value: 'a', done: false }, 'the chunk read should be correct'); |
+ })); |
+ |
+ reader.closed.then( |
+ test3.step_func(function() { assert_unreached('closed should not fulfill'); }), |
+ test3.step_func(function(r) { |
+ assert_equals(r, theError, 'closed should reject with the thrown error'); |
+ test3.done(); |
+ })); |
+}); |
+ |
+var test4 = async_test('Underlying source: throwing pull method (second pull)'); |
+test4.step(function() { |
+ var theError = new Error('a unique string'); |
+ var counter = 0; |
+ var rs = new ReadableStream({ |
+ pull: function(c) { |
+ ++counter; |
+ if (counter === 1) { |
+ c.enqueue('a'); |
+ } else { |
+ throw theError; |
+ } |
+ } |
+ }); |
+ var reader = rs.getReader(); |
+ |
+ reader.read().then(test4.step_func(function(r) { assert_object_equals(r, { value: 'a', done: false }, 'the chunk read should be correct'); })); |
+ |
+ reader.closed.then( |
+ test4.step_func(function() { assert_unreached('closed should not fulfill'); }), |
+ test4.step_func(function(r) { |
+ assert_equals(r, theError, 'closed should reject with the thrown error'); |
+ test4.done(); |
+ })); |
+}); |
+ |
+var test5 = async_test('Underlying source: throwing cancel getter'); |
+test5.step(function() { |
+ var theError = new Error('a unique string'); |
+ var rs = new ReadableStream({ |
+ get cancel() { |
+ throw theError; |
+ } |
+ }); |
+ |
+ rs.cancel().then( |
+ test5.step_func(function() { assert_unreached('cancel should not fulfill'); }), |
+ test5.step_func(function(r) { |
+ assert_equals(r, theError, 'cancel should reject with the thrown error'); |
+ test5.done(); |
+ })); |
+}); |
+ |
+var test6 = async_test('Underlying source: throwing cancel method'); |
+test6.step(function() { |
+ var theError = new Error('a unique string'); |
+ var rs = new ReadableStream({ |
+ cancel: function() { |
+ throw theError; |
+ } |
+ }); |
+ |
+ rs.cancel().then( |
+ test6.step_func(function() { assert_unreached('cancel should not fulfill'); }), |
+ test6.step_func(function(r) { |
+ assert_equals(r, theError, 'cancel should reject with the thrown error'); |
+ test6.done(); |
+ })); |
+}); |
+ |
+var test7 = async_test('Underlying source: calling enqueue on an empty canceled stream should not throw'); |
+test7.step(function() { |
+ var controller; |
+ var rs = new ReadableStream({ |
+ start: function(c) { |
+ controller = c; |
+ } |
+ }); |
+ |
+ rs.cancel(); |
+ controller.enqueue('a') // Calling enqueue after canceling should not throw anything. |
+ |
+ rs.getReader().closed.then(test7.step_func(function() { |
+ test7.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test8 = async_test('Underlying source: calling enqueue on a non-empty canceled stream should not throw'); |
+test8.step(function() { |
+ var controller; |
+ var rs = new ReadableStream({ |
+ start: function(c) { |
+ c.enqueue('a'); |
+ c.enqueue('b'); |
+ controller = c; |
+ } |
+ }); |
+ |
+ rs.cancel(); |
+ controller.enqueue('c') // Calling enqueue after canceling should not throw anything. |
+ |
+ rs.getReader().closed.then(test8.step_func(function() { |
+ test8.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test9 = async_test('Underlying source: calling enqueue on a closed stream should throw'); |
+test9.step(function() { |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.close(); |
+ assert_throws(new TypeError(), function() { c.enqueue('a') }, 'call to enqueue should throw a TypeError'); |
+ } |
+ }).getReader().closed.then(test9.step_func(function() { |
+ test9.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test10 = async_test('Underlying source: calling enqueue on an errored stream should throw'); |
+test10.step(function() { |
+ var theError = new Error('boo'); |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.error(theError); |
+ assert_throws(theError, function() { c.enqueue('a') }, 'call to enqueue should throw the error'); |
+ } |
+ }).getReader().closed.catch(test10.step_func(function(e) { |
+ assert_equals(e, theError, 'closed should reject with the error'); |
+ test10.done(); |
+ })); |
+}); |
+ |
+var test11 = async_test('Underlying source: calling close twice on an empty stream should throw the second time'); |
+test11.step(function() { |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.close(); |
+ assert_throws(new TypeError(), c.close, 'second call to close should throw a TypeError'); |
+ } |
+ }).getReader().closed.then(test11.step_func(function() { test11.done('closed should fulfill'); })); |
+}); |
+ |
+var test12 = async_test('Underlying source: calling close twice on a non-empty stream should throw the second time'); |
+test12.step(function() { |
+ var startCalled = false; |
+ var readCalled = false; |
+ var reader = new ReadableStream({ |
+ start: function(c) { |
+ c.enqueue('a'); |
+ c.close(); |
+ assert_throws(new TypeError(), c.close, 'second call to close should throw a TypeError'); |
+ startCalled = true; |
+ } |
+ }).getReader(); |
+ |
+ reader.read().then(test12.step_func(function(r) { |
+ assert_object_equals(r, { value: 'a', done: false }, 'read() should read the enqueued chunk'); |
+ readCalled = true; |
+ })); |
+ reader.closed.then(test12.step_func(function() { |
+ assert_true(startCalled); |
+ assert_true(readCalled); |
+ test12.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test13 = async_test('Underlying source: calling close on an empty canceled stream should not throw'); |
+test13.step(function() { |
+ var controller; |
+ var startCalled = false; |
+ var rs = new ReadableStream({ |
+ start: function(c) { |
+ controller = c; |
+ startCalled = true; |
+ } |
+ }); |
+ |
+ rs.cancel(); |
+ controller.close(); // Calling close after canceling should not throw anything. |
+ |
+ rs.getReader().closed.then(test13.step_func(function() { |
+ assert_true(startCalled); |
+ test13.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test14 = async_test('Underlying source: calling close on a non-empty canceled stream should not throw'); |
+test14.step(function() { |
+ var controller; |
+ var startCalled = false; |
+ var rs = new ReadableStream({ |
+ start: function(c) { |
+ controller = c; |
+ c.enqueue('a'); |
+ startCalled = true; |
+ } |
+ }); |
+ |
+ rs.cancel(); |
+ controller.close(); // Calling close after canceling should not throw anything. |
+ |
+ rs.getReader().closed.then(test14.step_func(function() { |
+ assert_true(startCalled); |
+ test14.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test15 = async_test('Underlying source: calling close after error should throw'); |
+test15.step(function() { |
+ var theError = new Error('boo'); |
+ var startCalled = false; |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.error(theError); |
+ assert_throws(new TypeError(), c.close, 'call to close should throw a TypeError'); |
+ startCalled = true; |
+ } |
+ }).getReader().closed.catch(test15.step_func(function(e) { |
+ assert_true(startCalled); |
+ assert_equals(e, theError, 'closed should reject with the error') |
+ test15.done(); |
+ })); |
+}); |
+ |
+var test16 = async_test('Underlying source: calling error twice should throw the second time'); |
+test16.step(function() { |
+ var theError = new Error('boo'); |
+ var startCalled = false; |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.error(theError); |
+ assert_throws(new TypeError(), c.error, 'second call to error should throw a TypeError'); |
+ startCalled = true; |
+ } |
+ }).getReader().closed.catch(test16.step_func(function(e) { |
+ assert_true(startCalled); |
+ assert_equals(e, theError, 'closed should reject with the error'); |
+ test16.done(); |
+ })); |
+}); |
+ |
+var test17 = async_test('Underlying source: calling error after close should throw'); |
+test17.step(function() { |
+ var startCalled = false; |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.close(); |
+ assert_throws(new TypeError(), c.error, 'call to error should throw a TypeError'); |
+ startCalled = true; |
+ } |
+ }).getReader().closed.then(test17.step_func(function() { |
+ assert_true(startCalled); |
+ test17.done('closed should fulfill'); |
+ })); |
+}); |
+ |
+var test18 = async_test('Underlying source: calling error and returning a rejected promise from start should cause the stream to error with the first error'); |
+test18.step(function() { |
+ var startCalled = false; |
+ var firstError = new Error('1'); |
+ var secondError = new Error('2'); |
+ new ReadableStream({ |
+ start: function(c) { |
+ c.error(firstError); |
+ |
+ startCalled = true; |
+ |
+ return Promise.reject(secondError); |
+ } |
+ }).getReader().closed.catch(test18.step_func(function(e) { |
+ assert_true(startCalled); |
+ assert_equals(e, firstError, 'stream should error with the first error'); |
+ test18.done(); |
+ })); |
+}); |
+ |
+var test19 = async_test('Underlying source: calling error and returning a rejected promise from pull should cause the stream to error with the first error'); |
+test19.step(function() { |
+ var startCalled = false; |
+ var firstError = new Error('1'); |
+ var secondError = new Error('2'); |
+ new ReadableStream({ |
+ pull: function(c) { |
+ c.error(firstError); |
+ |
+ startCalled = true; |
+ |
+ return Promise.reject(secondError); |
+ } |
+ }).getReader().closed.catch(test19.step_func(function(e) { |
+ assert_true(startCalled); |
+ assert_equals(e, firstError, 'stream should error with the first error'); |
+ test19.done(); |
+ })); |
+}); |
+ |
+done(); |