<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Request consume empty bodies</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#request">
    <meta name="help" href="https://fetch.spec.whatwg.org/#body-mixin">
    <meta name="author" title="Canon Research France" href="https://www.crf.canon.fr">
    <script src="/resources/testharness.js"></script>
    <script src="/resources/testharnessreport.js"></script>
  </head>
  <body>
    <script>
    function checkBodyText(test, request) {
      return request.text().then(function(bodyAsText) {
        assert_equals(bodyAsText, "", "Resolved value should be empty");
        assert_false(request.bodyUsed);
      });
    }

    function checkBodyBlob(test, request) {
      return request.blob().then(function(bodyAsBlob) {
        var promise = new Promise(function(resolve, reject) {
          var reader = new FileReader();
          reader.onload = function(evt) {
            resolve(reader.result)
          };
          reader.onerror = function() {
            reject("Blob's reader failed");
          };
          reader.readAsText(bodyAsBlob);
        });
        return promise.then(function(body) {
          assert_equals(body, "", "Resolved value should be empty");
          assert_false(request.bodyUsed);
        });
      });
    }

    function checkBodyArrayBuffer(test, request) {
      return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
        assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
        assert_false(request.bodyUsed);
      });
    }

    function checkBodyJSON(test, request) {
      return request.json().then(
        function(bodyAsJSON) {
          assert_unreached("JSON parsing should fail");
        },
        function() {
          assert_false(request.bodyUsed);
        });
    }

    function checkBodyFormData(test, request) {
      return request.formData().then(function(bodyAsFormData) {
        assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData");
        assert_false(request.bodyUsed);
     });
    }

    function checkBodyFormDataError(test, request) {
      return promise_rejects(test, new TypeError(), request.formData()).then(function() {
        assert_false(request.bodyUsed);
      });
    }

    function checkRequestWithNoBody(bodyType, checkFunction, headers = []) {
      promise_test(function(test) {
        var request = new Request("", {"method": "POST", "headers": headers});
        assert_false(request.bodyUsed);
        return checkFunction(test, request);
      }, "Consume request's body as " + bodyType);
    }

    checkRequestWithNoBody("text", checkBodyText);
    checkRequestWithNoBody("blob", checkBodyBlob);
    checkRequestWithNoBody("arrayBuffer", checkBodyArrayBuffer);
    checkRequestWithNoBody("json (error case)", checkBodyJSON);
    checkRequestWithNoBody("formData with correct multipart type (error case)", checkBodyFormDataError, [["Content-Type", 'multipart/form-data; boundary="boundary"']]);
    checkRequestWithNoBody("formData with correct urlencoded type", checkBodyFormData, [["Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"]]);
    checkRequestWithNoBody("formData without correct type (error case)", checkBodyFormDataError);

    function checkRequestWithEmptyBody(bodyType, body, asText) {
      promise_test(function(test) {
        var request = new Request("", {"method": "POST", "body": body});
        assert_false(request.bodyUsed, "bodyUsed is false at init");
        if (asText) {
          return request.text().then(function(bodyAsString) {
            assert_equals(bodyAsString.length, 0, "Resolved value should be empty");
            assert_true(request.bodyUsed, "bodyUsed is true after being consumed");
          });
        }
        return request.arrayBuffer().then(function(bodyAsArrayBuffer) {
          assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty");
          assert_true(request.bodyUsed, "bodyUsed is true after being consumed");
        });
      }, "Consume empty " + bodyType + " request body as " + (asText ? "text" : "arrayBuffer"));
    }

    // FIXME: Add BufferSource, FormData and URLSearchParams.
    checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), false);
    checkRequestWithEmptyBody("text", "", false);
    checkRequestWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true);
    checkRequestWithEmptyBody("text", "", true);
    checkRequestWithEmptyBody("URLSearchParams", new URLSearchParams(""), true);
    // FIXME: This test assumes that the empty string be returned but it is not clear whether that is right. See https://github.com/web-platform-tests/wpt/pull/3950.
    checkRequestWithEmptyBody("FormData", new FormData(), true);
    checkRequestWithEmptyBody("ArrayBuffer", new ArrayBuffer(), true);
    </script>
  </body>
</html>
