<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Consuming Request body with non BufferSource ReadableStream chunks</title>
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
function createRequestWithEmptyReadableStream()
{
    var stream = new ReadableStream({start: controller => {
        controller.close();
    }});
    return new Request("", {body: stream, method: "POST"});
}

function createRequestWithEmptyChunkReadableStream()
{
    var stream = new ReadableStream({start: controller => {
        controller.enqueue(new Uint8Array(0));
        controller.close();
    }});
    return new Request("", {body: stream, method: "POST"});
}

promise_test(test => {
    return createRequestWithEmptyReadableStream().text().then(text => {
        assert_equals(text, "");
    });
}, "Empty stream body as text");

promise_test(test => {
    return createRequestWithEmptyReadableStream().arrayBuffer().then(buffer => {
        assert_equals(buffer.byteLength, 0, "Resolved value should be empty");
    });
}, "Empty stream body as arrayBuffer");

promise_test(test => {
    return promise_rejects(test, "SyntaxError", createRequestWithEmptyReadableStream().json());
}, "Empty stream body as JSON");

promise_test(test => {
    return createRequestWithEmptyReadableStream().blob().then(function(bodyAsBlob) {
        var promise = new Promise(function(resolve, reject) {
            var reader = new FileReader();
            reader.onload = () => { resolve(reader.result) };
            reader.onerror = () => { reject("Blob's reader failed"); };
            reader.readAsText(bodyAsBlob);
        });
        return promise.then(function(body) {
            assert_equals(body, "", "Resolved value should be empty");
        });
  });
}, "Empty stream body as blob");

promise_test(test => {
    return createRequestWithEmptyChunkReadableStream().text().then(text => {
        assert_equals(text, "");
    });
}, "Empty chunk stream body as text");

promise_test(test => {
    return createRequestWithEmptyChunkReadableStream().arrayBuffer().then(buffer => {
        assert_equals(buffer.byteLength, 0, "Resolved value should be empty");
    });
}, "Empty chunk stream body as arrayBuffer");

promise_test(test => {
    return promise_rejects(test, "SyntaxError", createRequestWithEmptyReadableStream().json());
}, "Empty chunk stream body as JSON");

promise_test(test => {
    return createRequestWithEmptyChunkReadableStream().blob().then(function(bodyAsBlob) {
        var promise = new Promise(function(resolve, reject) {
            var reader = new FileReader();
            reader.onload = () => { resolve(reader.result) };
            reader.onerror = () => { reject("Blob's reader failed"); };
            reader.readAsText(bodyAsBlob);
        });
        return promise.then(function(body) {
            assert_equals(body, "", "Resolved value should be empty");
        });
  });
}, "Empty chunk stream body as blob");
    </script>
  </body>
</html>
