forked from nodejs/undici
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
feat: add
response
WPTs (nodejs#1684)
- Loading branch information
1 parent
0e6a52d
commit cb6853a
Showing
27 changed files
with
1,086 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
top |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,14 @@ | ||
// See also /xhr/json.any.js | ||
|
||
promise_test(async t => { | ||
const response = await fetch(`data:,\uFEFF{ "b": 1, "a": 2, "b": 3 }`); | ||
const json = await response.json(); | ||
assert_array_equals(Object.keys(json), ["b", "a"]); | ||
assert_equals(json.a, 2); | ||
assert_equals(json.b, 3); | ||
}, "Ensure the correct JSON parser is used"); | ||
|
||
promise_test(async t => { | ||
const response = await fetch("/xhr/resources/utf16-bom.json"); | ||
return promise_rejects_js(t, SyntaxError, response.json()); | ||
}, "Ensure UTF-16 results in an error"); |
57 changes: 57 additions & 0 deletions
57
test/wpt/tests/fetch/api/response/response-cancel-stream.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,57 @@ | ||
// META: global=window,worker | ||
// META: title=Response consume blob and http bodies | ||
// META: script=../resources/utils.js | ||
|
||
promise_test(function(test) { | ||
return new Response(new Blob([], { "type" : "text/plain" })).body.cancel(); | ||
}, "Cancelling a starting blob Response stream"); | ||
|
||
promise_test(function(test) { | ||
var response = new Response(new Blob(["This is data"], { "type" : "text/plain" })); | ||
var reader = response.body.getReader(); | ||
reader.read(); | ||
return reader.cancel(); | ||
}, "Cancelling a loading blob Response stream"); | ||
|
||
promise_test(function(test) { | ||
var response = new Response(new Blob(["T"], { "type" : "text/plain" })); | ||
var reader = response.body.getReader(); | ||
|
||
var closedPromise = reader.closed.then(function() { | ||
return reader.cancel(); | ||
}); | ||
reader.read().then(function readMore({done, value}) { | ||
if (!done) return reader.read().then(readMore); | ||
}); | ||
return closedPromise; | ||
}, "Cancelling a closed blob Response stream"); | ||
|
||
promise_test(function(test) { | ||
return fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(response) { | ||
return response.body.cancel(); | ||
}); | ||
}, "Cancelling a starting Response stream"); | ||
|
||
promise_test(function() { | ||
return fetch(RESOURCES_DIR + "trickle.py?ms=30&count=100").then(function(response) { | ||
var reader = response.body.getReader(); | ||
return reader.read().then(function() { | ||
return reader.cancel(); | ||
}); | ||
}); | ||
}, "Cancelling a loading Response stream"); | ||
|
||
promise_test(function() { | ||
async function readAll(reader) { | ||
while (true) { | ||
const {value, done} = await reader.read(); | ||
if (done) | ||
return; | ||
} | ||
} | ||
|
||
return fetch(RESOURCES_DIR + "top.txt").then(function(response) { | ||
var reader = response.body.getReader(); | ||
return readAll(reader).then(() => reader.cancel()); | ||
}); | ||
}, "Cancelling a closed Response stream"); |
99 changes: 99 additions & 0 deletions
99
test/wpt/tests/fetch/api/response/response-consume-empty.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,99 @@ | ||
// META: global=window,worker | ||
// META: title=Response consume empty bodies | ||
|
||
function checkBodyText(test, response) { | ||
return response.text().then(function(bodyAsText) { | ||
assert_equals(bodyAsText, "", "Resolved value should be empty"); | ||
assert_false(response.bodyUsed); | ||
}); | ||
} | ||
|
||
function checkBodyBlob(test, response) { | ||
return response.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(response.bodyUsed); | ||
}); | ||
}); | ||
} | ||
|
||
function checkBodyArrayBuffer(test, response) { | ||
return response.arrayBuffer().then(function(bodyAsArrayBuffer) { | ||
assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty"); | ||
assert_false(response.bodyUsed); | ||
}); | ||
} | ||
|
||
function checkBodyJSON(test, response) { | ||
return response.json().then( | ||
function(bodyAsJSON) { | ||
assert_unreached("JSON parsing should fail"); | ||
}, | ||
function() { | ||
assert_false(response.bodyUsed); | ||
}); | ||
} | ||
|
||
function checkBodyFormData(test, response) { | ||
return response.formData().then(function(bodyAsFormData) { | ||
assert_true(bodyAsFormData instanceof FormData, "Should receive a FormData"); | ||
assert_false(response.bodyUsed); | ||
}); | ||
} | ||
|
||
function checkBodyFormDataError(test, response) { | ||
return promise_rejects_js(test, TypeError, response.formData()).then(function() { | ||
assert_false(response.bodyUsed); | ||
}); | ||
} | ||
|
||
function checkResponseWithNoBody(bodyType, checkFunction, headers = []) { | ||
promise_test(function(test) { | ||
var response = new Response(undefined, { "headers": headers }); | ||
assert_false(response.bodyUsed); | ||
return checkFunction(test, response); | ||
}, "Consume response's body as " + bodyType); | ||
} | ||
|
||
checkResponseWithNoBody("text", checkBodyText); | ||
checkResponseWithNoBody("blob", checkBodyBlob); | ||
checkResponseWithNoBody("arrayBuffer", checkBodyArrayBuffer); | ||
checkResponseWithNoBody("json (error case)", checkBodyJSON); | ||
checkResponseWithNoBody("formData with correct multipart type (error case)", checkBodyFormDataError, [["Content-Type", 'multipart/form-data; boundary="boundary"']]); | ||
checkResponseWithNoBody("formData with correct urlencoded type", checkBodyFormData, [["Content-Type", "application/x-www-form-urlencoded;charset=UTF-8"]]); | ||
checkResponseWithNoBody("formData without correct type (error case)", checkBodyFormDataError); | ||
|
||
function checkResponseWithEmptyBody(bodyType, body, asText) { | ||
promise_test(function(test) { | ||
var response = new Response(body); | ||
assert_false(response.bodyUsed, "bodyUsed is false at init"); | ||
if (asText) { | ||
return response.text().then(function(bodyAsString) { | ||
assert_equals(bodyAsString.length, 0, "Resolved value should be empty"); | ||
assert_true(response.bodyUsed, "bodyUsed is true after being consumed"); | ||
}); | ||
} | ||
return response.arrayBuffer().then(function(bodyAsArrayBuffer) { | ||
assert_equals(bodyAsArrayBuffer.byteLength, 0, "Resolved value should be empty"); | ||
assert_true(response.bodyUsed, "bodyUsed is true after being consumed"); | ||
}); | ||
}, "Consume empty " + bodyType + " response body as " + (asText ? "text" : "arrayBuffer")); | ||
} | ||
|
||
checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), false); | ||
checkResponseWithEmptyBody("text", "", false); | ||
checkResponseWithEmptyBody("blob", new Blob([], { "type" : "text/plain" }), true); | ||
checkResponseWithEmptyBody("text", "", true); | ||
checkResponseWithEmptyBody("URLSearchParams", new URLSearchParams(""), true); | ||
checkResponseWithEmptyBody("FormData", new FormData(), true); | ||
checkResponseWithEmptyBody("ArrayBuffer", new ArrayBuffer(), true); |
59 changes: 59 additions & 0 deletions
59
test/wpt/tests/fetch/api/response/response-consume-stream.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// META: global=window,worker | ||
// META: title=Response consume | ||
// META: script=../resources/utils.js | ||
|
||
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 formData = new FormData(); | ||
formData.append("name", "value"); | ||
var textData = JSON.stringify("This is response's body"); | ||
var blob = new Blob([textData], { "type" : "text/plain" }); | ||
var urlSearchParamsData = "name=value"; | ||
var urlSearchParams = new URLSearchParams(urlSearchParamsData); | ||
|
||
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 response = new Response(urlSearchParams); | ||
return validateStreamFromString(response.body.getReader(), urlSearchParamsData); | ||
}, "Read URLSearchParams response's body as readableStream"); | ||
|
||
promise_test(function(test) { | ||
var arrayBuffer = new ArrayBuffer(textData.length); | ||
var int8Array = new Int8Array(arrayBuffer); | ||
for (var cptr = 0; cptr < textData.length; cptr++) | ||
int8Array[cptr] = textData.charCodeAt(cptr); | ||
|
||
return validateStreamFromString(new Response(arrayBuffer).body.getReader(), textData); | ||
}, "Read array buffer response's body as readableStream"); | ||
|
||
promise_test(function(test) { | ||
var response = new Response(formData); | ||
return validateStreamFromPartialString(response.body.getReader(), | ||
"Content-Disposition: form-data; name=\"name\"\r\n\r\nvalue"); | ||
}, "Read form data response's body as readableStream"); | ||
|
||
test(function() { | ||
assert_equals(Response.error().body, null); | ||
}, "Getting an error Response stream"); | ||
|
||
test(function() { | ||
assert_equals(Response.redirect("/").body, null); | ||
}, "Getting a redirect Response stream"); |
59 changes: 59 additions & 0 deletions
59
test/wpt/tests/fetch/api/response/response-error-from-stream.any.js
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,59 @@ | ||
// META: global=window,worker | ||
// META: title=Response Receives Propagated Error from ReadableStream | ||
|
||
function newStreamWithStartError() { | ||
var err = new Error("Start error"); | ||
return [new ReadableStream({ | ||
start(controller) { | ||
controller.error(err); | ||
} | ||
}), | ||
err] | ||
} | ||
|
||
function newStreamWithPullError() { | ||
var err = new Error("Pull error"); | ||
return [new ReadableStream({ | ||
pull(controller) { | ||
controller.error(err); | ||
} | ||
}), | ||
err] | ||
} | ||
|
||
function runRequestPromiseTest([stream, err], responseReaderMethod, testDescription) { | ||
promise_test(test => { | ||
return promise_rejects_exactly( | ||
test, | ||
err, | ||
new Response(stream)[responseReaderMethod](), | ||
'CustomTestError should propagate' | ||
) | ||
}, testDescription) | ||
} | ||
|
||
|
||
promise_test(test => { | ||
var [stream, err] = newStreamWithStartError(); | ||
return promise_rejects_exactly(test, err, stream.getReader().read(), 'CustomTestError should propagate') | ||
}, "ReadableStreamDefaultReader Promise receives ReadableStream start() Error") | ||
|
||
promise_test(test => { | ||
var [stream, err] = newStreamWithPullError(); | ||
return promise_rejects_exactly(test, err, stream.getReader().read(), 'CustomTestError should propagate') | ||
}, "ReadableStreamDefaultReader Promise receives ReadableStream pull() Error") | ||
|
||
|
||
// test start() errors for all Body reader methods | ||
runRequestPromiseTest(newStreamWithStartError(), 'arrayBuffer', 'ReadableStream start() Error propagates to Response.arrayBuffer() Promise'); | ||
runRequestPromiseTest(newStreamWithStartError(), 'blob', 'ReadableStream start() Error propagates to Response.blob() Promise'); | ||
runRequestPromiseTest(newStreamWithStartError(), 'formData', 'ReadableStream start() Error propagates to Response.formData() Promise'); | ||
runRequestPromiseTest(newStreamWithStartError(), 'json', 'ReadableStream start() Error propagates to Response.json() Promise'); | ||
runRequestPromiseTest(newStreamWithStartError(), 'text', 'ReadableStream start() Error propagates to Response.text() Promise'); | ||
|
||
// test pull() errors for all Body reader methods | ||
runRequestPromiseTest(newStreamWithPullError(), 'arrayBuffer', 'ReadableStream pull() Error propagates to Response.arrayBuffer() Promise'); | ||
runRequestPromiseTest(newStreamWithPullError(), 'blob', 'ReadableStream pull() Error propagates to Response.blob() Promise'); | ||
runRequestPromiseTest(newStreamWithPullError(), 'formData', 'ReadableStream pull() Error propagates to Response.formData() Promise'); | ||
runRequestPromiseTest(newStreamWithPullError(), 'json', 'ReadableStream pull() Error propagates to Response.json() Promise'); | ||
runRequestPromiseTest(newStreamWithPullError(), 'text', 'ReadableStream pull() Error propagates to Response.text() Promise'); |
Oops, something went wrong.