blob: 735c4506c5974b9d467200efa9bccc5ee0f03bdc [file] [log] [blame]
<!DOCTYPE html>
<script src='../../resources/testharness.js'></script>
<script src='../../resources/testharnessreport.js'></script>
<script src='resources/streams-utils.js'></script>
<script>
// This is updated till https://github.com/whatwg/streams/commit/4ba861e6f60c248060811830e11271c84b439cc3
var test1 = async_test('Piping with no options and a destination error');
test1.step(function() {
var cancelCalled = false;
var theError = new Error('destination error');
var rs = new ReadableStream({
start: function(c) {
c.enqueue('a');
setTimeout(test1.step_func(function() { c.enqueue('b'); }), 200);
setTimeout(test1.step_func(function() {
assert_throws(new TypeError(), function() { c.enqueue('c'); }); // Enqueue after cancel should throw.
assert_true(cancelCalled);
test1.done();
}), 500);
},
cancel: function(r) {
assert_equals(r, theError, 'reason passed to cancel equals the source error');
cancelCalled = true;
}
});
var ws = new WritableStream({
write: function(chunk) {
if (chunk === 'b') {
throw theError;
}
}
});
rs.pipeTo(ws);
});
var test2 = async_test('Piping with { preventCancel: false } and a destination error');
test2.step(function() {
var cancelCalled = false;
var theError = new Error('destination error');
var rs = new ReadableStream({
start: function(c) {
c.enqueue('a');
setTimeout(test2.step_func(function() { c.enqueue('b'); }), 200);
setTimeout(test2.step_func(function() {
assert_throws(new TypeError(), function() { c.enqueue('c'); }); // Enqueue after cancel should throw.
assert_true(cancelCalled);
test2.done();
}), 500);
},
cancel: function(r) {
assert_equals(r, theError, 'reason passed to cancel equals the source error');
cancelCalled = true;
}
});
var ws = new WritableStream({
write: function(chunk) {
if (chunk === 'b') {
throw theError;
}
}
});
rs.pipeTo(ws, { preventCancel: false });
});
var test3 = async_test('Piping with { preventCancel: true } and a destination error');
test3.step(function() {
var theError = new Error('destination error');
var rs = new ReadableStream({
start: function(c) {
c.enqueue('a');
setTimeout(test3.step_func(function() { c.enqueue('b'); }), 200);
setTimeout(test3.step_func(function() { c.enqueue('c'); }), 400);
setTimeout(test3.step_func(function() { c.enqueue('d'); }), 600);
},
cancel: function(r) {
assert_unreached('unexpected call to cancel');
}
});
var ws = new WritableStream({
write: function(chunk) {
if (chunk === 'b') {
throw theError;
}
}
});
rs.pipeTo(ws, { preventCancel: true }).catch(test3.step_func(function(e) {
assert_equals(e, theError, 'rejection reason of pipeTo promise is the sink error');
var reader;
reader = rs.getReader(); // Should be able to get a stream reader after pipeTo completes.
// { value: 'c', done: false } gets consumed before we know that ws has errored, and so is lost.
return reader.read().then(test3.step_func(function(result) {
assert_object_equals(result, { value: 'd', done: false }, 'should be able to read the remaining chunk from the reader');
test3.done();
}));
})).catch(test3.step_func(function(e) { assert_unreached(e); }));
});
</script>