Skip to content

Commit

Permalink
data: URL processing and generalized forgiving-base64 decode tests
Browse files Browse the repository at this point in the history
Tests for whatwg/fetch#579.
  • Loading branch information
annevk committed Jan 31, 2018
1 parent d17d539 commit 7eec2bf
Show file tree
Hide file tree
Showing 6 changed files with 359 additions and 167 deletions.
11 changes: 11 additions & 0 deletions fetch/data-urls/README.md
@@ -0,0 +1,11 @@
== data: URLs ==

`resources/data-urls.json` contains `data:` URL tests. The tests are encoded as a JSON array. Each value in the array is an array of two or three values. The first value describes the input, the second value describes the expected MIME type, null if the input is expected to fail somehow, or the empty string if the expected value is `text/plain;charset=US-ASCII`. The third value, if present, describes the expected body as an array of integers representing bytes.

These tests are used for `data:` URLs in this directory (see `processing.any.js`).

== Forgiving-base64 decode ==

`resources/base64.json` contains [forgiving-base64 decode](https://infra.spec.whatwg.org/#forgiving-base64-decode) tests. The tests are encoded as a JSON array. Each value in the array is an array of two values. The first value describes the input, the second value describes the output as an array of integers representing bytes or null if the input cannot be decoded.

These tests are used for `data:` URLs in this directory (see `base64.any.js`) and `window.atob()` in `../../html/webappapis/atob/base64.html`.
16 changes: 16 additions & 0 deletions fetch/data-urls/base64.any.js
@@ -0,0 +1,16 @@
promise_test(() => fetch("resources/base64.json").then(res => res.json()).then(runBase64Tests), "Setup.");
function runBase64Tests(tests) {
for(let i = 0; i < tests.length; i++) {
const input = tests[i][0],
output = tests[i][1],
dataURL = "data:;base64," + input;
promise_test(t => {
if(output === null) {
return promise_rejects(t, new TypeError(), fetch(dataURL));
}
return fetch(dataURL).then(res => res.arrayBuffer()).then(body => {
assert_array_equals(new Uint8Array(body), output);
});
}, "data: URL base64 handling: " + format_value(input));
}
}
20 changes: 20 additions & 0 deletions fetch/data-urls/processing.any.js
@@ -0,0 +1,20 @@
promise_test(() => fetch("resources/data-urls.json").then(res => res.json()).then(runDataURLTests), "Setup.");
function runDataURLTests(tests) {
for(let i = 0; i < tests.length; i++) {
const input = tests[i][0],
expectedMimeType = tests[i][1],
expectedBody = expectedMimeType !== null ? tests[i][2] : null;
promise_test(t => {
if(expectedMimeType === null) {
return promise_rejects(t, new TypeError(), fetch(input));
} else {
return fetch(input).then(res => {
return res.arrayBuffer().then(body => {
assert_array_equals(new Uint8Array(body), expectedBody);
assert_equals(res.headers.get("content-type"), expectedMimeType); // We could assert this earlier, but this fails often
});
});
}
}, format_value(input));
}
}
79 changes: 79 additions & 0 deletions fetch/data-urls/resources/base64.json
@@ -0,0 +1,79 @@
[
["", []],
["abcd", [105, 183, 29]],
[" abcd", [105, 183, 29]],
["abcd ", [105, 183, 29]],
[" abcd===", null],
["abcd=== ", null],
["abcd ===", null],
["a", null],
["ab", [105]],
["abc", [105, 183]],
["abcde", null],
["𐀀", null],
["=", null],
["==", null],
["===", null],
["====", null],
["=====", null],
["a=", null],
["a==", null],
["a===", null],
["a====", null],
["a=====", null],
["ab=", null],
["ab==", [105]],
["ab===", null],
["ab====", null],
["ab=====", null],
["abc=", [105, 183]],
["abc==", null],
["abc===", null],
["abc====", null],
["abc=====", null],
["abcd=", null],
["abcd==", null],
["abcd===", null],
["abcd====", null],
["abcd=====", null],
["abcde=", null],
["abcde==", null],
["abcde===", null],
["abcde====", null],
["abcde=====", null],
["=a", null],
["=a=", null],
["a=b", null],
["a=b=", null],
["ab=c", null],
["ab=c=", null],
["abc=d", null],
["abc=d=", null],
["ab\tcd", [105, 183, 29]],
["ab\ncd", [105, 183, 29]],
["ab\fcd", [105, 183, 29]],
["ab\rcd", [105, 183, 29]],
["ab cd", [105, 183, 29]],
["ab\u00a0cd", null],
["ab\t\n\f\r cd", [105, 183, 29]],
[" \t\n\f\r ab\t\n\f\r cd\t\n\f\r ", [105, 183, 29]],
["ab\t\n\f\r =\t\n\f\r =\t\n\f\r ", [105]],
["A", null],
["/A", [252]],
["//A", [255, 240]],
["///A", [255, 255, 192]],
["////A", null],
["/", null],
["A/", [3]],
["AA/", [0, 15]],
["AAAA/", null],
["AAA/", [0, 0, 63]],
["\u0000nonsense", null],
["abcd\u0000nonsense", null],
["YQ", [97]],
["YR", [97]],
["~~", null],
["..", null],
["--", null],
["__", null]
]
199 changes: 199 additions & 0 deletions fetch/data-urls/resources/data-urls.json
@@ -0,0 +1,199 @@
[
["data://test/,X",
"text/plain;charset=US-ASCII",
[88]],
["data://test:test/,X",
null],

This comment has been minimized.

Copy link
@SimonSapin

SimonSapin Feb 2, 2018

Contributor

(Moved to the PR discussion: #6890 (comment))

["data:,X",
"text/plain;charset=US-ASCII",
[88]],
["data:",
null],
["data:text/html",
null],
["data:text/html ;charset=x ",
null],
["data:,",
"text/plain;charset=US-ASCII",
[]],
["data:,X#X",
"text/plain;charset=US-ASCII",
[88]],
["data:,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:text/plain,X",
"text/plain",
[88]],
["data:text/plain ,X",
"text/plain",
[88]],
["data:text/plain%20,X",
"text/plain%20",
[88]],
["data:text/plain\f,X",
"text/plain%0c",
[88]],
["data:text/plain%0C,X",
"text/plain%0c",
[88]],
["data:text/plain;,X",
"text/plain",
[88]],
["data:;x=x;charset=x,X",
"text/plain;x=x;charset=x",
[88]],
["data:;x=x,X",
"text/plain;x=x",
[88]],
["data:text/plain;charset=windows-1252,%C2%B1",
"text/plain;charset=windows-1252",
[194, 177]],
["data:text/plain;Charset=UTF-8,%C2%B1",
"text/plain;charset=UTF-8",
[194, 177]],
["data:image/gif,%C2%B1",
"image/gif",
[194, 177]],
["data:IMAGE/gif,%C2%B1",
"image/gif",
[194, 177]],
["data:IMAGE/gif;hi=x,%C2%B1",
"image/gif;hi=x",
[194, 177]],
["data:IMAGE/gif;CHARSET=x,%C2%B1",
"image/gif;charset=x",
[194, 177]],
["data: ,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:%20,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:\f,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:%1F,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:\u0000,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:%00,%FF",
"text/plain;charset=US-ASCII",
[255]],
["data:text/html ,X",
"text/html",
[88]],
["data:text / html,X",
"text/plain;charset=US-ASCII",
[88]],
["data:†,X",
"text/plain;charset=US-ASCII",
[88]],
["data:†/†,X",
"%e2%80%a0/%e2%80%a0",
[88]],
["data:X,X",
"text/plain;charset=US-ASCII",
[88]],
["data:image/png,X X",
"image/png",
[88, 32, 88]],
["data:application/xml,X X",
"application/xml",
[88, 32, 88]],
["data:unknown/unknown,X X",
"unknown/unknown",
[88, 32, 88]],
["data:text/plain;a=\",\",X",
"text/plain",
[34, 44, 88]],
["data:text/plain;a=%2C,X",
"text/plain;a=%2C",
[88]],
["data:;base64;base64,WA",
"text/plain",
[88]],
["data:x/x;base64;base64,WA",
"x/x",
[88]],
["data:x/x;base64;charset=x,WA",
"x/x;charset=x",
[87, 65]],
["data:x/x;base64;charset=x;base64,WA",
"x/x;charset=x",
[88]],
["data:x/x;base64;base64x,WA",
"x/x",
[87, 65]],
["data:;base64,W%20A",
"text/plain;charset=US-ASCII",
[88]],
["data:;base64,W%0CA",
"text/plain;charset=US-ASCII",
[88]],
["data:x;base64x,WA",
"text/plain;charset=US-ASCII",
[87, 65]],
["data:x;base64;x,WA",
"text/plain;charset=US-ASCII",
[87, 65]],
["data:x;base64=x,WA",
"text/plain;charset=US-ASCII",
[87, 65]],
["data:; base64,WA",
"text/plain;charset=US-ASCII",
[88]],
["data:; base64,WA",
"text/plain;charset=US-ASCII",
[88]],
["data: ;charset=x ; base64,WA",
"text/plain;charset=x",
[88]],
["data:;base64;,WA",
"text/plain",
[87, 65]],
["data:;base64 ,WA",
"text/plain;charset=US-ASCII",
[88]],
["data:;base64 ,WA",
"text/plain;charset=US-ASCII",
[88]],
["data:;base 64,WA",
"text/plain",
[87, 65]],
["data:;BASe64,WA",
"text/plain;charset=US-ASCII",
[88]],
["data:;%62ase64,WA",
"text/plain",
[87, 65]],
["data:%3Bbase64,WA",
"text/plain;charset=US-ASCII",
[87, 65]],
["data:;charset=x,X",
"text/plain;charset=x",
[88]],
["data:; charset=x,X",
"text/plain;charset=x",
[88]],
["data:;charset =x,X",
"text/plain",
[88]],
["data:;charset= x,X",
"text/plain;charset=\" x\"",
[88]],
["data:;charset=,X",
"text/plain",
[88]],
["data:;charset,X",
"text/plain",
[88]],
["data:;charset=\"x\",X",
"text/plain;charset=x",
[88]],
["data:;CHARSET=\"X\",X",
"text/plain;charset=X",
[88]]
]

0 comments on commit 7eec2bf

Please sign in to comment.