<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Response consume</title>
    <meta name="help" href="https://fetch.spec.whatwg.org/#response">
    <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>
    <script src="../resources/utils.js"></script>
  </head>
  <body>
    <script>

promise_test(function(test) {
    var body = "";
    var response = new Response("");
    return validateStreamFromString(response.body.getReader(), "");
}, "Read empty text response's body as readableStream");

promise_test(function(test) {
    var response = new Response(new Blob([], { "type" : "text/plain" }));
    return validateStreamFromString(response.body.getReader(), "");
}, "Read empty blob response's body as readableStream");

var textData = JSON.stringify("This is response's body");
var blob = new Blob([stringToArray(textData).buffer], { "type" : "text/plain" });

promise_test(function(test) {
    var response = new Response(blob);
    return validateStreamFromString(response.body.getReader(), textData);
}, "Read blob response's body as readableStream");

promise_test(function(test) {
    var response = new Response(textData);
    return validateStreamFromString(response.body.getReader(), textData);
}, "Read text response's body as readableStream");

promise_test(function(test) {
    var arrayBuffer = new ArrayBuffer(textData.length);
    var uint8Array = new Uint8Array(arrayBuffer);
    for (var cptr = 0; cptr < textData.length; cptr++)
        uint8Array[cptr] = textData.charCodeAt(cptr);

    return validateStreamFromString(new Response(arrayBuffer).body.getReader(), textData);
}, "Read array buffer response's body as readableStream");

test(function() {
    assert_equals(Response.error().body, null);
}, "Getting an error Response stream");

promise_test(function(test) {
    assert_equals(Response.redirect("", 301).body, null);
}, "Getting a redirect Response stream");

    </script>
  </body>
</html>
