Index: tests/corelib/data_uri_test.dart |
diff --git a/tests/corelib/data_uri_test.dart b/tests/corelib/data_uri_test.dart |
index 41f229085d143e2f86ab26cc165053e5b0aa516d..58b120132e77a85e98cc13875892128b6ef80f23 100644 |
--- a/tests/corelib/data_uri_test.dart |
+++ b/tests/corelib/data_uri_test.dart |
@@ -18,16 +18,18 @@ main() { |
testRoundTrip("blåbærgrød", UTF8); |
testRoundTrip("blåbærgrød", LATIN1); |
- testUriEquals("data:,abc?d#e"); |
- testUriEquals("DATA:,ABC?D#E"); |
- testUriEquals("data:,a%20bc?d#e"); |
- testUriEquals("DATA:,A%20BC?D#E"); |
- testUriEquals("data:,a%62c?d#e"); |
- testUriEquals("DATA:,A%42C?D#E"); |
+ testUriEquals("data:,abc?d"); |
+ testUriEquals("DATA:,ABC?D"); |
+ testUriEquals("data:,a%20bc?d"); |
+ testUriEquals("DATA:,A%20BC?D"); |
+ testUriEquals("data:,abc?d%23e"); // # must and will be is escaped. |
+ |
+ // Test that UriData.uri normalizes path and query. |
testUtf8Encoding("\u1000\uffff"); |
testBytes(); |
testInvalidCharacters(); |
+ testNormalization(); |
testErrors(); |
} |
@@ -158,6 +160,37 @@ void testBytes() { |
testLists(new List.unmodifiable(bytes)); |
} |
+void testNormalization() { |
+ // Base-64 normalization. |
+ |
+ // Normalized URI-alphabet characters. |
+ Expect.equals("data:;base64,AA/+", |
+ UriData.parse("data:;base64,AA_-").toString()); |
+ // Normalized escapes. |
+ Expect.equals("data:;base64,AB==", |
+ UriData.parse("data:;base64,A%42=%3D").toString()); |
+ Expect.equals("data:;base64,/+/+", |
+ UriData.parse("data:;base64,%5F%2D%2F%2B").toString()); |
+ // Normalized padded data. |
+ Expect.equals("data:;base64,AA==", |
+ UriData.parse("data:;base64,AA%3D%3D").toString()); |
+ Expect.equals("data:;base64,AAA=", |
+ UriData.parse("data:;base64,AAA%3D").toString()); |
+ // Normalized unpadded data. |
+ Expect.equals("data:;base64,AA==", |
+ UriData.parse("data:;base64,AA").toString()); |
+ Expect.equals("data:;base64,AAA=", |
+ UriData.parse("data:;base64,AAA").toString()); |
+ |
+ // "URI normalization" of non-base64 content. |
+ var uri = UriData.parse("data:,\x20\xa0"); |
+ Expect.equals("data:,%20%C2%A0", uri.toString()); |
+ uri = UriData.parse("data:,x://x@y:[z]:42/p/./?q=x&y=z#?#\u1234\u{12345}"); |
+ Expect.equals( |
+ "data:,x://x@y:%5Bz%5D:42/p/./?q=x&y=z%23?%23%E1%88%B4%F0%92%8D%85", |
+ uri.toString()); |
+} |
+ |
bool badArgument(e) => e is ArgumentError; |
bool badFormat(e) => e is FormatException; |
@@ -218,29 +251,45 @@ void testErrors() { |
Expect.throws(() { UriData.parse("data:type/sub;k=v;base64");}, |
badFormat); |
- // Invalid base64 format (only detected when decodeing). |
+ void formatError(String input) { |
+ Expect.throws(() => UriData.parse("data:;base64,$input"), badFormat, input); |
+ } |
+ |
+ // Invalid base64 format (detected when parsed). |
for (var a = 0; a <= 4; a++) { |
for (var p = 0; p <= 4; p++) { |
// Base-64 encoding must have length divisible by four and no more |
// than two padding characters at the end. |
if (p < 3 && (a + p) % 4 == 0) continue; |
- uri = UriData.parse("data:;base64," + "A" * a + "=" * p); |
- Expect.throws(uri.contentAsBytes, badFormat); |
+ if (p == 0 && a > 1) continue; |
+ formatError("A" * a + "=" * p); |
+ formatError("A" * a + "%3D" * p); |
} |
} |
// Invalid base64 encoding: padding not at end. |
- uri = UriData.parse("data:;base64,AA=A"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
- uri = UriData.parse("data:;base64,A=AA"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
- uri = UriData.parse("data:;base64,=AAA"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
- uri = UriData.parse("data:;base64,A==A"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
- uri = UriData.parse("data:;base64,==AA"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
- uri = UriData.parse("data:;base64,===A"); |
- Expect.throws(uri.contentAsBytes, badFormat); |
+ formatError("AA=A"); |
+ formatError("A=AA"); |
+ formatError("=AAA"); |
+ formatError("A==A"); |
+ formatError("==AA"); |
+ formatError("===A"); |
+ formatError("AAA%3D="); |
+ formatError("A%3D=="); |
+ |
+ // Invalid unpadded data. |
+ formatError("A"); |
+ formatError("AAAAA"); |
+ |
+ // Invalid characters. |
+ formatError("AAA*"); |
+ formatError("AAA\x00"); |
+ formatError("AAA\\"); |
+ formatError("AAA,"); |
+ |
+ // Invalid escapes. |
+ formatError("AAA%25"); |
+ formatError("AAA%7F"); |
+ formatError("AAA%7F"); |
} |
/// Checks that two [Uri]s are exactly the same. |