blob: 9817b8a6fadfdd09c1b3386391cf58f33c94fe64 [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('TransformStream errors thrown in transform put the writable and readable in an errored state');
test1.step(function() {
var promiseCalls = 0;
var thrownError = new Error('bad things are happening!');
var ts = new TransformStream({
transform: function() {
throw thrownError;
}
});
assert_equals(ts.writable.state, 'writable', 'writable starts in writable');
var reader = ts.readable.getReader();
reader.read().then(
test1.step_func(function() { assert_unreached('readable\'s read() should reject'); }),
test1.step_func(function(r) {
assert_equals(r, thrownError, 'readable\'s read should reject with the thrown error');
assert_equals(++promiseCalls, 2);
})
);
reader.closed.then(
test1.step_func(function() { assert_unreached('readable\'s closed should not be fulfilled'); }),
test1.step_func(function(e) {
assert_equals(e, thrownError, 'readable\'s closed should be rejected with the thrown error');
assert_equals(++promiseCalls, 3);
test1.done();
})
);
ts.writable.closed.then(
test1.step_func(function() { assert_unreached('writable\'s closed should not be fulfilled'); }),
test1.step_func(function(e) {
assert_equals(e, thrownError, 'writable\'s closed should be rejected with the thrown error');
assert_equals(++promiseCalls, 1);
})
);
ts.writable.write('a');
assert_equals(ts.writable.state, 'waiting', 'writable becomes waiting immediately after throw');
});
var test2 = async_test('TransformStream errors thrown in flush put the writable and readable in an errored state');
test2.step(function() {
var promiseCalls = 0;
var thrownError = new Error('bad things are happening!');
var ts = new TransformStream({
transform: function(chunk, enqueue, done) {
done();
},
flush: function() {
throw thrownError;
}
});
var reader = ts.readable.getReader();
reader.read().then(
test2.step_func(function() { assert_unreached('readable\'s read() should reject'); }),
test2.step_func(function(r) {
assert_equals(r, thrownError, 'readable\'s read should reject with the thrown error');
assert_equals(++promiseCalls, 2);
})
);
reader.closed.then(
test2.step_func(function() { assert_unreached('readable\'s closed should not be fulfilled'); }),
test2.step_func(function(e) {
assert_equals(e, thrownError, 'readable\'s closed should be rejected with the thrown error');
assert_equals(++promiseCalls, 3);
test2.done();
})
);
ts.writable.closed.then(
test2.step_func(function() { assert_unreached('writable\'s closed should not be fulfilled'); }),
test2.step_func(function(e) {
assert_equals(e, thrownError, 'writable\'s closed should be rejected with the thrown error');
assert_equals(++promiseCalls, 1);
})
);
assert_equals(ts.writable.state, 'writable', 'writable starts in writable');
ts.writable.write('a');
assert_equals(ts.writable.state, 'waiting', 'writable becomes waiting after a write');
ts.writable.close();
assert_equals(ts.writable.state, 'closing', 'writable becomes closing after the close call');
});
</script>