Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(588)

Unified Diff: tests/corelib/data_uri_test.dart

Issue 2694373003: Normalize UriData.parse result. (Closed)
Patch Set: Address comments. Fix bug. Created 3 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « sdk/lib/internal/internal.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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.
« no previous file with comments | « sdk/lib/internal/internal.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698