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 library package_config.parse_test; |
| 6 |
| 7 import "package:package_config/packages.dart"; |
| 8 import "package:package_config/packages_file.dart" show parse; |
| 9 import "package:package_config/src/packages_impl.dart"; |
| 10 import "package:test/test.dart"; |
| 11 |
| 12 main() { |
| 13 var base = Uri.parse("file:///one/two/three/packages.map"); |
| 14 test("empty", () { |
| 15 var packages = doParse(emptySample, base); |
| 16 expect(packages.asMap(), isEmpty); |
| 17 }); |
| 18 test("comment only", () { |
| 19 var packages = doParse(commentOnlySample, base); |
| 20 expect(packages.asMap(), isEmpty); |
| 21 }); |
| 22 test("empty lines only", () { |
| 23 var packages = doParse(emptyLinesSample, base); |
| 24 expect(packages.asMap(), isEmpty); |
| 25 }); |
| 26 |
| 27 test("empty lines only", () { |
| 28 var packages = doParse(emptyLinesSample, base); |
| 29 expect(packages.asMap(), isEmpty); |
| 30 }); |
| 31 |
| 32 test("single", () { |
| 33 var packages = doParse(singleRelativeSample, base); |
| 34 expect(packages.packages.toList(), equals(["foo"])); |
| 35 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 36 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 37 }); |
| 38 |
| 39 test("single no slash", () { |
| 40 var packages = doParse(singleRelativeSampleNoSlash, base); |
| 41 expect(packages.packages.toList(), equals(["foo"])); |
| 42 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 43 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 44 }); |
| 45 |
| 46 test("single no newline", () { |
| 47 var packages = doParse(singleRelativeSampleNoNewline, base); |
| 48 expect(packages.packages.toList(), equals(["foo"])); |
| 49 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 50 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 51 }); |
| 52 |
| 53 test("single absolute authority", () { |
| 54 var packages = doParse(singleAbsoluteSample, base); |
| 55 expect(packages.packages.toList(), equals(["foo"])); |
| 56 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 57 equals(Uri.parse("http://example.com/some/where/bar/baz.dart"))); |
| 58 }); |
| 59 |
| 60 test("single empty path", () { |
| 61 var packages = doParse(singleEmptyPathSample, base); |
| 62 expect(packages.packages.toList(), equals(["foo"])); |
| 63 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 64 equals(base.replace(path: "${base.path}/bar/baz.dart"))); |
| 65 }); |
| 66 |
| 67 test("single absolute path", () { |
| 68 var packages = doParse(singleAbsolutePathSample, base); |
| 69 expect(packages.packages.toList(), equals(["foo"])); |
| 70 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 71 equals(base.replace(path: "/test/bar/baz.dart"))); |
| 72 }); |
| 73 |
| 74 test("multiple", () { |
| 75 var packages = doParse(multiRelativeSample, base); |
| 76 expect( |
| 77 packages.packages.toList()..sort(), equals(["bar", "foo"])); |
| 78 expect(packages.resolve(Uri.parse("package:foo/bar/baz.dart")), |
| 79 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 80 expect(packages.resolve(Uri.parse("package:bar/foo/baz.dart")), |
| 81 equals(base.resolve("../test2/").resolve("foo/baz.dart"))); |
| 82 }); |
| 83 |
| 84 test("dot-dot 1", () { |
| 85 var packages = doParse(singleRelativeSample, base); |
| 86 expect(packages.packages.toList(), equals(["foo"])); |
| 87 expect(packages.resolve(Uri.parse("package:foo/qux/../bar/baz.dart")), |
| 88 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 89 }); |
| 90 |
| 91 test("all valid chars can be used in URI segment", () { |
| 92 var packages = doParse(allValidCharsSample, base); |
| 93 expect(packages.packages.toList(), equals([allValidChars])); |
| 94 expect(packages.resolve(Uri.parse("package:$allValidChars/bar/baz.dart")), |
| 95 equals(base.resolve("../test/").resolve("bar/baz.dart"))); |
| 96 }); |
| 97 |
| 98 test("no invalid chars accepted", () { |
| 99 var map = {}; |
| 100 for (int i = 0; i < allValidChars.length; i++) { |
| 101 map[allValidChars.codeUnitAt(i)] = true; |
| 102 } |
| 103 for (int i = 0; i <= 255; i++) { |
| 104 if (map[i] == true) continue; |
| 105 var char = new String.fromCharCode(i); |
| 106 expect(() => doParse("x${char}x:x", null), throws); |
| 107 } |
| 108 }); |
| 109 |
| 110 test("no escapes", () { |
| 111 expect(() => doParse("x%41x:x", base), throws); |
| 112 }); |
| 113 |
| 114 test("same name twice", () { |
| 115 expect(() => doParse(singleRelativeSample * 2, base), throws); |
| 116 }); |
| 117 |
| 118 for (String invalidSample in invalid) { |
| 119 test("invalid '$invalidSample'", () { |
| 120 var result; |
| 121 try { |
| 122 result = doParse(invalidSample, base); |
| 123 } on FormatException { |
| 124 // expected |
| 125 return; |
| 126 } |
| 127 fail("Resolved to $result"); |
| 128 }); |
| 129 } |
| 130 } |
| 131 |
| 132 Packages doParse(String sample, Uri baseUri) { |
| 133 Map<String, Uri> map = parse(sample.codeUnits, baseUri); |
| 134 return new MapPackages(map); |
| 135 } |
| 136 |
| 137 // Valid samples. |
| 138 var emptySample = ""; |
| 139 var commentOnlySample = "# comment only\n"; |
| 140 var emptyLinesSample = "\n\n\r\n"; |
| 141 var singleRelativeSample = "foo:../test/\n"; |
| 142 var singleRelativeSampleNoSlash = "foo:../test\n"; |
| 143 var singleRelativeSampleNoNewline = "foo:../test/"; |
| 144 var singleAbsoluteSample = "foo:http://example.com/some/where/\n"; |
| 145 var singleEmptyPathSample = "foo:\n"; |
| 146 var singleAbsolutePathSample = "foo:/test/\n"; |
| 147 var multiRelativeSample = "foo:../test/\nbar:../test2/\n"; |
| 148 // All valid path segment characters in an URI. |
| 149 var allValidChars = |
| 150 r"!$&'()*+,-.0123456789;=" |
| 151 r"@ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz~"; |
| 152 |
| 153 var allValidCharsSample = "${allValidChars}:../test/\n"; |
| 154 |
| 155 // Invalid samples. |
| 156 var invalid = [ |
| 157 ":baz.dart", // empty. |
| 158 "foobar=baz.dart", // no colon (but an equals, which is not the same) |
| 159 ".:../test/", // dot segment |
| 160 "..:../test/", // dot-dot segment |
| 161 "...:../test/", // dot-dot-dot segment |
| 162 "foo/bar:../test/", // slash in name |
| 163 "/foo:../test/", // slash at start of name |
| 164 "?:../test/", // invalid characters. |
| 165 "[:../test/", // invalid characters. |
| 166 "x#:../test/", // invalid characters. |
| 167 ]; |
OLD | NEW |