<!DOCTYPE html>
<script src='../resources/testharness.js'></script>
<script src='../resources/testharnessreport.js'></script>
<script>
// This is updated till https://github.com/whatwg/streams/commit/4ba861e6f60c248060811830e11271c84b439cc3

var test1 = async_test('Erroring a ReadableStream after checking closed should reject ReadableStreamDefaultReader closed promise');
test1.step(function() {
    var controller;
    var rs = new ReadableStream({
        start: function(c) {
            controller = c;
        }
    });

   rs.getReader().closed.then(test1.step_func(function() {
        assert_unreached("closed promise should not be resolved when stream is errored");
    }), test1.step_func(function(err) {
        assert_equals(rsError, err);
        test1.done();
    }));

    var rsError = "my error";
    controller.error(rsError);
});

var test2 = async_test('Erroring a ReadableStream before checking closed should reject ReadableStreamDefaultReader closed promise');
test2.step(function() {
    var controller;
    var rs = new ReadableStream({
        start: function(c) {
            controller = c;
        }
    });

    var rsError = "my error";
    controller.error(rsError);

    // Let's call getReader twice to ensure that stream is not locked to a reader.
    rs.getReader().releaseLock();
    rs.getReader().closed.then(test2.step_func(function() {
        assert_unreached("closed promise should not be resolved when stream is errored");
    }), test2.step_func(function(err) {
        assert_equals(rsError, err);
        test2.done();
    }));
});
</script>
