Chromium Code Reviews| OLD | NEW |
|---|---|
| (Empty) | |
| 1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | |
| 2 // for details. All rights reserved. Use of this source code is governed by a | |
| 3 // BSD-style license that can be found in the LICENSE file. | |
| 4 | |
| 5 import "package:expect/expect.dart"; | |
| 6 import "dart:convert"; | |
| 7 import "dart:typed_data"; | |
| 8 | |
| 9 main() { | |
| 10 testRoundTrip(""); | |
| 11 testRoundTrip("a"); | |
| 12 testRoundTrip("ab"); | |
| 13 testRoundTrip("abc"); | |
| 14 testRoundTrip("abcd"); | |
| 15 | |
| 16 testUtf8Encoding("\u1000\uffff"); | |
| 17 testBytes(); | |
| 18 testInvalidCharacters(); | |
| 19 testErrors(); | |
| 20 } | |
|
nweiz
2015/10/15 21:09:04
Also test:
* Percent-encoding non-token character
Lasse Reichstein Nielsen
2015/11/03 18:02:52
Good points. Also, I should test the "base64" and
| |
| 21 | |
| 22 void testRoundTrip(String content) { | |
| 23 DataUri dataUri = new DataUri.fromString(content); | |
| 24 Expect.equals(content, dataUri.contentAsString()); | |
| 25 Expect.listEquals(content.codeUnits, dataUri.contentAsBytes()); | |
| 26 | |
| 27 Uri uri = dataUri.toUri(); | |
| 28 Expect.equals(uri.toString(), dataUri.toString()); | |
| 29 Expect.equals(dataUri.toString(), new DataUri.fromUri(uri).toString()); | |
| 30 | |
| 31 dataUri = new DataUri.fromBytes(content.codeUnits); | |
| 32 Expect.listEquals(content.codeUnits, dataUri.contentAsBytes()); | |
| 33 Expect.equals(content, dataUri.contentAsString(encoding: ASCII)); | |
| 34 | |
| 35 uri = dataUri.toUri(); | |
| 36 Expect.equals(uri.toString(), dataUri.toString()); | |
| 37 Expect.equals(dataUri.toString(), new DataUri.fromUri(uri).toString()); | |
| 38 } | |
| 39 | |
| 40 void testUtf8Encoding(String content) { | |
| 41 DataUri uri = new DataUri.fromString(content); | |
| 42 Expect.equals(content, uri.contentAsString(encoding: UTF8)); | |
| 43 Expect.listEquals(UTF8.encode(content), uri.contentAsBytes()); | |
| 44 } | |
| 45 | |
| 46 void testInvalidCharacters() { | |
| 47 // SPACE, CTL and tspecial, plus '%' and '#' (URI gen-delim) | |
| 48 var invalid = | |
| 49 '\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f\x7f' | |
| 50 ' ()<>@,;:"/[]?=%#'; | |
| 51 var invalidNoSlash = invalid.replaceAll('/', ''); | |
| 52 var dataUri = new DataUri.fromString( | |
| 53 invalid, | |
| 54 mimeType: "$invalidNoSlash/$invalidNoSlash", | |
| 55 parameters: DataUriParameter.fromMap({invalid: invalid})); | |
| 56 | |
| 57 Expect.equals(invalid, dataUri.contentAsString()); | |
| 58 Expect.equals("$invalidNoSlash/$invalidNoSlash", dataUri.mimeType); | |
| 59 Expect.equals(invalid, dataUri.parameters.first.key); | |
| 60 Expect.equals(invalid, dataUri.parameters.first.value); | |
| 61 | |
| 62 var uri = dataUri.toUri(); | |
| 63 Expect.equals("$uri", "$dataUri"); | |
| 64 Expect.equals("$dataUri", new DataUri.fromUri(uri).toString()); | |
| 65 } | |
| 66 | |
| 67 void testBytes() { | |
| 68 void testList(List<int> list) { | |
| 69 var dataUri = new DataUri.fromBytes(list); | |
| 70 Expect.equals("application/octet-stream", dataUri.mimeType); | |
| 71 Expect.listEquals(list, dataUri.contentAsBytes()); | |
| 72 } | |
| 73 | |
| 74 void testLists(List<int> list) { | |
| 75 testList(list); | |
| 76 for (int i = 0; i < 27; i++) { | |
| 77 testList(list.sublist(i, i + i)); // All lengths from 0 to 27. | |
| 78 } | |
| 79 } | |
| 80 | |
| 81 var bytes = new Uint8List(512); | |
| 82 for (int i = 0; i < bytes.length; i++) { | |
| 83 bytes[i] = i; | |
|
nweiz
2015/10/15 21:09:04
Won't the latter half of this list be outside the
Lasse Reichstein Nielsen
2015/11/03 18:02:52
Storing into an Uint8List will truncate, so I get
| |
| 84 } | |
| 85 testLists(bytes); | |
| 86 testLists(new List.from(bytes)); | |
| 87 testLists(new List.unmodifiable(bytes)); | |
| 88 } | |
| 89 | |
| 90 bool badArgument(e) => e is ArgumentError; | |
| 91 bool badFormat(e) => e is FormatException; | |
| 92 | |
| 93 void testErrors() { | |
| 94 // Invalid constructor parameters. | |
| 95 Expect.throws(() { new DataUri.fromBytes([], mimeType: "noslash"); }, | |
| 96 badArgument); | |
| 97 Expect.throws(() { new DataUri.fromBytes([257]); }, | |
| 98 badArgument); | |
| 99 Expect.throws(() { new DataUri.fromBytes([-1]); }, | |
| 100 badArgument); | |
| 101 Expect.throws(() { new DataUri.fromBytes([0x100000000]); }, | |
| 102 badArgument); | |
| 103 Expect.throws(() { new DataUri.fromString("", mimeType: "noslash"); }, | |
| 104 badArgument); | |
| 105 | |
| 106 // Empty parameters allowed, not an error. | |
| 107 var uri = new DataUri.fromString("", mimeType: "", parameters: []); | |
| 108 Expect.equals("data:,", uri.text); | |
| 109 | |
| 110 // Parse format. | |
| 111 Expect.throws(() { DataUri.parse("notdata:,");}, badFormat); | |
| 112 Expect.throws(() { DataUri.parse("text/plain,noscheme");}, badFormat); | |
| 113 Expect.throws(() { DataUri.parse("data:noseparator");}, badFormat); | |
| 114 Expect.throws(() { DataUri.parse("data:noslash,text");}, badFormat); | |
| 115 Expect.throws(() { DataUri.parse("data:type/sub;noequals,text");}, badFormat); | |
| 116 Expect.throws(() { DataUri.parse("data:type/sub;knocomma=");}, badFormat); | |
| 117 Expect.throws(() { DataUri.parse("data:type/sub;k=v;nocomma");}, badFormat); | |
| 118 Expect.throws(() { DataUri.parse("data:type/sub;k=nocomma");}, badFormat); | |
| 119 Expect.throws(() { DataUri.parse("data:type/sub;k=v;base64");}, badFormat); | |
| 120 | |
| 121 uri = DataUri.parse("data:,"); // Minimal valid. | |
| 122 Expect.equals("data:,", uri.text); | |
| 123 uri = DataUri.parse("data:;base64,"); // Minimal valid base64. | |
| 124 Expect.equals("data:;base64,", uri.text); | |
|
nweiz
2015/10/15 21:09:04
Why are these in testErrors?
Lasse Reichstein Nielsen
2015/11/03 18:02:52
Mostly as sanity checks.
I'll move them to main a
| |
| 125 | |
| 126 // Invalid base64 format (only detected when decodeing). | |
| 127 uri = DataUri.parse("data:;base64,AAA"); | |
| 128 Expect.throws(uri.contentAsBytes, badFormat); | |
| 129 uri = DataUri.parse("data:;base64,AA="); | |
| 130 Expect.throws(uri.contentAsBytes, badFormat); | |
| 131 | |
| 132 // Accepts encoded '=' in base64. | |
| 133 uri = DataUri.parse("data:;base64,AA=="); | |
| 134 Expect.listEquals([0], uri.contentAsBytes()); | |
| 135 uri = DataUri.parse("data:;base64,AA%3D%3D"); | |
| 136 Expect.listEquals([0], uri.contentAsBytes()); | |
|
nweiz
2015/10/15 21:09:04
Also these?
Lasse Reichstein Nielsen
2015/11/03 18:02:52
That's really base-64 decoding now, so I'll just r
| |
| 137 } | |
| OLD | NEW |