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

Side by Side Diff: tests/corelib/uri_test.dart

Issue 2374253004: Fix bug in _SimpleUri.resolve. (Closed)
Patch Set: Address comments. Created 4 years, 2 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 unified diff | Download patch
« no previous file with comments | « sdk/lib/core/uri.dart ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 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. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library uriTest; 5 library uriTest;
6 6
7 import "package:expect/expect.dart"; 7 import "package:expect/expect.dart";
8 import 'dart:convert'; 8 import 'dart:convert';
9 9
10 testUri(String uriText, bool isAbsolute) { 10 testUri(String uriText, bool isAbsolute) {
(...skipping 67 matching lines...) Expand 10 before | Expand all | Expand 10 after
78 Expect.stringEquals(encodedAscii, e); 78 Expect.stringEquals(encodedAscii, e);
79 d = Uri.decodeQueryComponent(encodedAscii, encoding: ASCII); 79 d = Uri.decodeQueryComponent(encodedAscii, encoding: ASCII);
80 Expect.stringEquals(orig, d); 80 Expect.stringEquals(orig, d);
81 } else { 81 } else {
82 Expect.throws(() => Uri.encodeQueryComponent(orig, encoding: ASCII), 82 Expect.throws(() => Uri.encodeQueryComponent(orig, encoding: ASCII),
83 (e) => e is ArgumentError); 83 (e) => e is ArgumentError);
84 } 84 }
85 } 85 }
86 86
87 testUriPerRFCs() { 87 testUriPerRFCs() {
88 final urisSample = "http://a/b/c/d;p?q"; 88 // Convert a Uri to a guaranteed "non simple" URI with the same content.
89 Uri base = Uri.parse(urisSample); 89 toComplex(Uri uri) {
90 Uri complex = new Uri(
91 scheme: uri.scheme,
92 userInfo: uri.hasAuthority ? uri.userInfo : null,
93 host: uri.hasAuthority ? uri.host : null,
94 port: uri.hasAuthority ? uri.port : null,
95 path: uri.path,
96 query: uri.hasQuery ? uri.query : null,
97 fragment: uri.hasFragment ? uri.fragment : null,
98 );
99 assert(complex.toString() == uri.toString());
100 return complex;
101 }
102
103 Uri base;
104 Uri complexBase;
105 // Sets the [base] and [complexBase] to the parse of the URI and a
106 // guaranteed non-simple version of the same URI.
107 setBase(String uri) {
108 base = Uri.parse(uri);
109 complexBase = toComplex(base);
110 }
111
90 testResolve(expect, relative) { 112 testResolve(expect, relative) {
91 String name = "$base << $relative"; 113 String name = "$base << $relative";
92 Expect.stringEquals(expect, base.resolve(relative).toString(), name); 114 Expect.stringEquals(expect, base.resolve(relative).toString(), name);
115
116 Expect.stringEquals(expect, complexBase.resolve(relative).toString(),
117 name + " (complex base)");
93 } 118 }
94 119
95 // From RFC 3986. 120 // From RFC 3986.
121 final urisSample = "http://a/b/c/d;p?q";
122 setBase(urisSample);
123
96 testResolve("g:h", "g:h"); 124 testResolve("g:h", "g:h");
97 testResolve("http://a/b/c/g", "g"); 125 testResolve("http://a/b/c/g", "g");
98 testResolve("http://a/b/c/g", "./g"); 126 testResolve("http://a/b/c/g", "./g");
99 testResolve("http://a/b/c/g/", "g/"); 127 testResolve("http://a/b/c/g/", "g/");
100 testResolve("http://a/g", "/g"); 128 testResolve("http://a/g", "/g");
101 testResolve("http://g", "//g"); 129 testResolve("http://g", "//g");
102 testResolve("http://a/b/c/d;p?y", "?y"); 130 testResolve("http://a/b/c/d;p?y", "?y");
103 testResolve("http://a/b/c/g?y", "g?y"); 131 testResolve("http://a/b/c/g?y", "g?y");
104 testResolve("http://a/b/c/d;p?q#s", "#s"); 132 testResolve("http://a/b/c/d;p?q#s", "#s");
105 testResolve("http://a/b/c/g#s", "g#s"); 133 testResolve("http://a/b/c/g#s", "g#s");
(...skipping 26 matching lines...) Expand all
132 testResolve("http://a/b/c/y", "g;x=1/../y"); 160 testResolve("http://a/b/c/y", "g;x=1/../y");
133 testResolve("http://a/b/c/g?y/./x", "g?y/./x"); 161 testResolve("http://a/b/c/g?y/./x", "g?y/./x");
134 testResolve("http://a/b/c/g?y/../x", "g?y/../x"); 162 testResolve("http://a/b/c/g?y/../x", "g?y/../x");
135 testResolve("http://a/b/c/g#s/./x", "g#s/./x"); 163 testResolve("http://a/b/c/g#s/./x", "g#s/./x");
136 testResolve("http://a/b/c/g#s/../x", "g#s/../x"); 164 testResolve("http://a/b/c/g#s/../x", "g#s/../x");
137 testResolve("http:g", "http:g"); 165 testResolve("http:g", "http:g");
138 166
139 // Additional tests (not from RFC 3986). 167 // Additional tests (not from RFC 3986).
140 testResolve("http://a/b/g;p/h;s", "../g;p/h;s"); 168 testResolve("http://a/b/g;p/h;s", "../g;p/h;s");
141 169
142 base = Uri.parse("s:a/b"); 170 setBase("s:a/b");
143 testResolve("s:a/c", "c"); 171 testResolve("s:a/c", "c");
144 testResolve("s:/c", "../c"); 172 testResolve("s:/c", "../c");
145 173
146 base = Uri.parse("S:a/b"); 174 setBase("S:a/b");
147 testResolve("s:a/c", "c"); 175 testResolve("s:a/c", "c");
148 testResolve("s:/c", "../c"); 176 testResolve("s:/c", "../c");
149 177
150 base = Uri.parse("s:foo"); 178 setBase("s:foo");
151 testResolve("s:bar", "bar"); 179 testResolve("s:bar", "bar");
152 testResolve("s:bar", "../bar"); 180 testResolve("s:bar", "../bar");
153 181
154 base = Uri.parse("S:foo"); 182 setBase("S:foo");
155 testResolve("s:bar", "bar"); 183 testResolve("s:bar", "bar");
156 testResolve("s:bar", "../bar"); 184 testResolve("s:bar", "../bar");
157 185
158 // Special-case (deliberate non-RFC behavior). 186 // Special-case (deliberate non-RFC behavior).
159 base = Uri.parse("foo/bar"); 187 setBase("foo/bar");
160 testResolve("foo/baz", "baz"); 188 testResolve("foo/baz", "baz");
161 testResolve("baz", "../baz"); 189 testResolve("baz", "../baz");
162 190
163 base = Uri.parse("s:/foo"); 191 setBase("s:/foo");
164 testResolve("s:/bar", "bar"); 192 testResolve("s:/bar", "bar");
165 testResolve("s:/bar", "../bar"); 193 testResolve("s:/bar", "../bar");
166 194
167 base = Uri.parse("S:/foo"); 195 setBase("S:/foo");
168 testResolve("s:/bar", "bar"); 196 testResolve("s:/bar", "bar");
169 testResolve("s:/bar", "../bar"); 197 testResolve("s:/bar", "../bar");
170 198
171 // Test non-URI base (no scheme, no authority, relative path). 199 // Test non-URI base (no scheme, no authority, relative path).
172 base = Uri.parse("a/b/c?_#_"); 200 setBase("a/b/c?_#_");
173 testResolve("a/b/g?q#f", "g?q#f"); 201 testResolve("a/b/g?q#f", "g?q#f");
174 testResolve("./", "../.."); 202 testResolve("./", "../..");
175 testResolve("../", "../../.."); 203 testResolve("../", "../../..");
176 testResolve("a/b/", "."); 204 testResolve("a/b/", ".");
177 testResolve("c", "../../c"); // Deliberate non-RFC behavior. 205 testResolve("c", "../../c"); // Deliberate non-RFC behavior.
178 base = Uri.parse("../../a/b/c?_#_"); // Initial ".." in base url. 206 setBase("../../a/b/c?_#_"); // Initial ".." in base url.
179 testResolve("../../a/d", "../d"); 207 testResolve("../../a/d", "../d");
208 testResolve("../../d", "../../d");
180 testResolve("../../../d", "../../../d"); 209 testResolve("../../../d", "../../../d");
210 setBase("../../a/b");
211 testResolve("../../a/d", "d");
212 testResolve("../../d", "../d");
213 testResolve("../../../d", "../../d");
214 setBase("../../a");
215 testResolve("../../d", "d");
216 testResolve("../../../d", "../d");
217 testResolve("../../../../d", "../../d");
181 218
182 base = Uri.parse("s://h/p?q#f"); // A simple base. 219 // Absoluyte path, not scheme or authority.
220 setBase("/a");
221 testResolve("/b", "b");
222 testResolve("/b", "../b");
223 testResolve("/b", "../../b");
224 setBase("/a/b");
225 testResolve("/a/c", "c");
226 testResolve("/c", "../c");
227 testResolve("/c", "../../c");
228
229 setBase("s://h/p?q#f"); // A simple base.
183 // Simple references: 230 // Simple references:
184 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F"); 231 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
185 testResolve("s://h2/P?Q#F", "//h2/P?Q#F"); 232 testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
186 testResolve("s://h/P?Q#F", "/P?Q#F"); 233 testResolve("s://h/P?Q#F", "/P?Q#F");
187 testResolve("s://h/p?Q#F", "?Q#F"); 234 testResolve("s://h/p?Q#F", "?Q#F");
188 testResolve("s://h/p?q#F", "#F"); 235 testResolve("s://h/p?q#F", "#F");
189 testResolve("s://h/p?q", ""); 236 testResolve("s://h/p?q", "");
190 // Non-simple references: 237 // Non-simple references:
191 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20"); 238 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
192 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20"); 239 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
193 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20"); 240 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
194 testResolve("s://h/P?Q#F%20", "/P?Q#F%20"); 241 testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
195 testResolve("s://h/p?Q#F%20", "?Q#F%20"); 242 testResolve("s://h/p?Q#F%20", "?Q#F%20");
196 testResolve("s://h/p?q#F%20", "#F%20"); 243 testResolve("s://h/p?q#F%20", "#F%20");
197 244
198 base = Uri.parse("s://h/p1/p2/p3"); // A simple base with a path. 245 setBase("s://h/p1/p2/p3"); // A simple base with a path.
199 testResolve("s://h/p1/p2/", "."); 246 testResolve("s://h/p1/p2/", ".");
200 testResolve("s://h/p1/p2/", "./"); 247 testResolve("s://h/p1/p2/", "./");
201 testResolve("s://h/p1/", ".."); 248 testResolve("s://h/p1/", "..");
202 testResolve("s://h/p1/", "../"); 249 testResolve("s://h/p1/", "../");
203 testResolve("s://h/", "../.."); 250 testResolve("s://h/", "../..");
204 testResolve("s://h/", "../../"); 251 testResolve("s://h/", "../../");
205 testResolve("s://h/p1/%20", "../%20"); 252 testResolve("s://h/p1/%20", "../%20");
206 testResolve("s://h/", "../../../.."); 253 testResolve("s://h/", "../../../..");
207 testResolve("s://h/", "../../../../"); 254 testResolve("s://h/", "../../../../");
208 255
209 base = Uri.parse("s://h/p?q#f%20"); // A non-simpe base. 256 setBase("s://h/p?q#f%20"); // A non-simpe base.
210 // Simple references: 257 // Simple references:
211 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F"); 258 testResolve("s2://h2/P?Q#F", "s2://h2/P?Q#F");
212 testResolve("s://h2/P?Q#F", "//h2/P?Q#F"); 259 testResolve("s://h2/P?Q#F", "//h2/P?Q#F");
213 testResolve("s://h/P?Q#F", "/P?Q#F"); 260 testResolve("s://h/P?Q#F", "/P?Q#F");
214 testResolve("s://h/p?Q#F", "?Q#F"); 261 testResolve("s://h/p?Q#F", "?Q#F");
215 testResolve("s://h/p?q#F", "#F"); 262 testResolve("s://h/p?q#F", "#F");
216 testResolve("s://h/p?q", ""); 263 testResolve("s://h/p?q", "");
217 // Non-simple references: 264 // Non-simple references:
218 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20"); 265 testResolve("s2://I@h2/P?Q#F%20", "s2://I@h2/P?Q#F%20");
219 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20"); 266 testResolve("s://I@h2/P?Q#F%20", "//I@h2/P?Q#F%20");
220 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20"); 267 testResolve("s://h2/P?Q#F%20", "//h2/P?Q#F%20");
221 testResolve("s://h/P?Q#F%20", "/P?Q#F%20"); 268 testResolve("s://h/P?Q#F%20", "/P?Q#F%20");
222 testResolve("s://h/p?Q#F%20", "?Q#F%20"); 269 testResolve("s://h/p?Q#F%20", "?Q#F%20");
223 testResolve("s://h/p?q#F%20", "#F%20"); 270 testResolve("s://h/p?q#F%20", "#F%20");
224 271
225 base = Uri.parse("S://h/p1/p2/p3"); // A non-simple base with a path. 272 setBase("S://h/p1/p2/p3"); // A non-simple base with a path.
226 testResolve("s://h/p1/p2/", "."); 273 testResolve("s://h/p1/p2/", ".");
227 testResolve("s://h/p1/p2/", "./"); 274 testResolve("s://h/p1/p2/", "./");
228 testResolve("s://h/p1/", ".."); 275 testResolve("s://h/p1/", "..");
229 testResolve("s://h/p1/", "../"); 276 testResolve("s://h/p1/", "../");
230 testResolve("s://h/", "../.."); 277 testResolve("s://h/", "../..");
231 testResolve("s://h/", "../../"); 278 testResolve("s://h/", "../../");
232 testResolve("s://h/p1/%20", "../%20"); 279 testResolve("s://h/p1/%20", "../%20");
233 testResolve("s://h/", "../../../.."); 280 testResolve("s://h/", "../../../..");
234 testResolve("s://h/", "../../../../"); 281 testResolve("s://h/", "../../../../");
235 282
236 base = Uri.parse("../../../"); // A simple relative path. 283 setBase("../../../"); // A simple relative path.
237 testResolve("../../../a", "a"); 284 testResolve("../../../a", "a");
238 testResolve("../../../../a", "../a"); 285 testResolve("../../../../a", "../a");
239 testResolve("../../../a%20", "a%20"); 286 testResolve("../../../a%20", "a%20");
240 testResolve("../../../../a%20", "../a%20"); 287 testResolve("../../../../a%20", "../a%20");
241 288
242 // Tests covering the branches of the merge algorithm in RFC 3986 289 // Tests covering the branches of the merge algorithm in RFC 3986
243 // with both simple and complex base URIs. 290 // with both simple and complex base URIs.
244 for (var b in ["s://a/pa/pb?q#f", "s://a/pa/pb?q#f%20"]) { 291 for (var b in ["s://a/pa/pb?q#f", "s://a/pa/pb?q#f%20"]) {
245 var origBase = Uri.parse(b); 292 setBase(b);
246 base = origBase;
247 293
248 // if defined(R.scheme) then ... 294 // if defined(R.scheme) then ...
249 testResolve("s2://a2/p2?q2#f2", "s2://a2/p2?q2#f2"); 295 testResolve("s2://a2/p2?q2#f2", "s2://a2/p2?q2#f2");
250 // else, if defined(R.authority) then ... 296 // else, if defined(R.authority) then ...
251 testResolve("s://a2/p2?q2#f2", "//a2/p2?q2#f2"); 297 testResolve("s://a2/p2?q2#f2", "//a2/p2?q2#f2");
252 testResolve("s://a2/?q2#f2", "//a2/../?q2#f2"); 298 testResolve("s://a2/?q2#f2", "//a2/../?q2#f2");
253 testResolve("s://a2?q2#f2", "//a2?q2#f2"); 299 testResolve("s://a2?q2#f2", "//a2?q2#f2");
254 testResolve("s://a2#f2", "//a2#f2"); 300 testResolve("s://a2#f2", "//a2#f2");
255 testResolve("s://a2", "//a2"); 301 testResolve("s://a2", "//a2");
256 // else, if (R.path == "") then ... 302 // else, if (R.path == "") then ...
257 // if defined(R.query) then 303 // if defined(R.query) then
258 testResolve("s://a/pa/pb?q2#f2", "?q2#f2"); 304 testResolve("s://a/pa/pb?q2#f2", "?q2#f2");
259 testResolve("s://a/pa/pb?q2", "?q2"); 305 testResolve("s://a/pa/pb?q2", "?q2");
260 // else 306 // else
261 testResolve("s://a/pa/pb?q#f2", "#f2"); 307 testResolve("s://a/pa/pb?q#f2", "#f2");
262 testResolve("s://a/pa/pb?q", ""); 308 testResolve("s://a/pa/pb?q", "");
263 // else, if (R.path starts-with "/") then ... 309 // else, if (R.path starts-with "/") then ...
264 testResolve("s://a/p2?q2#f2", "/p2?q2#f2"); 310 testResolve("s://a/p2?q2#f2", "/p2?q2#f2");
265 testResolve("s://a/?q2#f2", "/?q2#f2"); 311 testResolve("s://a/?q2#f2", "/?q2#f2");
266 testResolve("s://a/#f2", "/#f2"); 312 testResolve("s://a/#f2", "/#f2");
267 testResolve("s://a/", "/"); 313 testResolve("s://a/", "/");
268 testResolve("s://a/", "/../"); 314 testResolve("s://a/", "/../");
269 // else ... T.path = merge(Base.path, R.path) 315 // else ... T.path = merge(Base.path, R.path)
270 // ... remove-dot-fragments(T.path) ... 316 // ... remove-dot-fragments(T.path) ...
271 // (Cover the merge function and the remove-dot-fragments functions too). 317 // (Cover the merge function and the remove-dot-fragments functions too).
272 318
273 // If base has authority and empty path ... 319 // If base has authority and empty path ...
274 var emptyPathBase = Uri.parse(b.replaceFirst("/pa/pb", "")); 320 var emptyPathBase = b.replaceFirst("/pa/pb", "");
275 base = emptyPathBase; 321 setBase(emptyPathBase);
276 testResolve("s://a/p2?q2#f2", "p2?q2#f2"); 322 testResolve("s://a/p2?q2#f2", "p2?q2#f2");
277 testResolve("s://a/p2#f2", "p2#f2"); 323 testResolve("s://a/p2#f2", "p2#f2");
278 testResolve("s://a/p2", "p2"); 324 testResolve("s://a/p2", "p2");
279 325
280 base = origBase; 326 setBase(b);
281 // otherwise 327 // otherwise
282 // (Cover both no authority and non-empty path and both). 328 // (Cover both no authority and non-empty path and both).
283 var noAuthEmptyPathBase = Uri.parse(b.replaceFirst("//a/pa/pb", "")); 329 var noAuthEmptyPathBase = b.replaceFirst("//a/pa/pb", "");
284 var noAuthAbsPathBase = Uri.parse(b.replaceFirst("//a", "")); 330 var noAuthAbsPathBase = b.replaceFirst("//a", "");
285 var noAuthRelPathBase = Uri.parse(b.replaceFirst("//a/", "")); 331 var noAuthRelPathBase = b.replaceFirst("//a/", "");
286 var noAuthRelSinglePathBase = Uri.parse(b.replaceFirst("//a/pa/", "")); 332 var noAuthRelSinglePathBase = b.replaceFirst("//a/pa/", "");
287 333
288 testResolve("s://a/pa/p2?q2#f2", "p2?q2#f2"); 334 testResolve("s://a/pa/p2?q2#f2", "p2?q2#f2");
289 testResolve("s://a/pa/p2#f2", "p2#f2"); 335 testResolve("s://a/pa/p2#f2", "p2#f2");
290 testResolve("s://a/pa/p2", "p2"); 336 testResolve("s://a/pa/p2", "p2");
291 337
292 base = noAuthEmptyPathBase; 338 setBase(noAuthEmptyPathBase);
293 testResolve("s:p2?q2#f2", "p2?q2#f2"); 339 testResolve("s:p2?q2#f2", "p2?q2#f2");
294 testResolve("s:p2#f2", "p2#f2"); 340 testResolve("s:p2#f2", "p2#f2");
295 testResolve("s:p2", "p2"); 341 testResolve("s:p2", "p2");
296 342
297 base = noAuthAbsPathBase; 343 setBase(noAuthAbsPathBase);
298 testResolve("s:/pa/p2?q2#f2", "p2?q2#f2"); 344 testResolve("s:/pa/p2?q2#f2", "p2?q2#f2");
299 testResolve("s:/pa/p2#f2", "p2#f2"); 345 testResolve("s:/pa/p2#f2", "p2#f2");
300 testResolve("s:/pa/p2", "p2"); 346 testResolve("s:/pa/p2", "p2");
301 347
302 base = noAuthRelPathBase; 348 setBase(noAuthRelPathBase);
303 testResolve("s:pa/p2?q2#f2", "p2?q2#f2"); 349 testResolve("s:pa/p2?q2#f2", "p2?q2#f2");
304 testResolve("s:pa/p2#f2", "p2#f2"); 350 testResolve("s:pa/p2#f2", "p2#f2");
305 testResolve("s:pa/p2", "p2"); 351 testResolve("s:pa/p2", "p2");
306 352
307 base = noAuthRelSinglePathBase; 353 setBase(noAuthRelSinglePathBase);
308 testResolve("s:p2?q2#f2", "p2?q2#f2"); 354 testResolve("s:p2?q2#f2", "p2?q2#f2");
309 testResolve("s:p2#f2", "p2#f2"); 355 testResolve("s:p2#f2", "p2#f2");
310 testResolve("s:p2", "p2"); 356 testResolve("s:p2", "p2");
311 357
312 // Then remove dot segments. 358 // Then remove dot segments.
313 359
314 // A. if input buffer starts with "../" or "./". 360 // A. if input buffer starts with "../" or "./".
315 // This only happens if base has only a single (may be empty) segment and 361 // This only happens if base has only a single (may be empty) segment and
316 // no slash. 362 // no slash.
317 base = emptyPathBase; 363 setBase(emptyPathBase);
318 testResolve("s://a/p2", "../p2"); 364 testResolve("s://a/p2", "../p2");
319 testResolve("s://a/", "../"); 365 testResolve("s://a/", "../");
320 testResolve("s://a/", ".."); 366 testResolve("s://a/", "..");
321 testResolve("s://a/p2", "./p2"); 367 testResolve("s://a/p2", "./p2");
322 testResolve("s://a/", "./"); 368 testResolve("s://a/", "./");
323 testResolve("s://a/", "."); 369 testResolve("s://a/", ".");
324 testResolve("s://a/p2", "../../p2"); 370 testResolve("s://a/p2", "../../p2");
325 testResolve("s://a/p2", "../../././p2"); 371 testResolve("s://a/p2", "../../././p2");
326 372
327 base = noAuthRelSinglePathBase; 373 setBase(noAuthRelSinglePathBase);
328 testResolve("s:p2", "../p2"); 374 testResolve("s:p2", "../p2");
329 testResolve("s:", "../"); 375 testResolve("s:", "../");
330 testResolve("s:", ".."); 376 testResolve("s:", "..");
331 testResolve("s:p2", "./p2"); 377 testResolve("s:p2", "./p2");
332 testResolve("s:", "./"); 378 testResolve("s:", "./");
333 testResolve("s:", "."); 379 testResolve("s:", ".");
334 testResolve("s:p2", "../../p2"); 380 testResolve("s:p2", "../../p2");
335 testResolve("s:p2", "../../././p2"); 381 testResolve("s:p2", "../../././p2");
336 382
337 // B. if input buffer starts with "/./" or is "/.". replace with "/". 383 // B. if input buffer starts with "/./" or is "/.". replace with "/".
338 // (The URI implementation removes the "." path segments when parsing, 384 // (The URI implementation removes the "." path segments when parsing,
339 // so this case isn't handled by merge). 385 // so this case isn't handled by merge).
340 base = origBase; 386 setBase(b);
341 testResolve("s://a/pa/p2", "./p2"); 387 testResolve("s://a/pa/p2", "./p2");
342 388
343 // C. if input buffer starts with "/../" or is "/..", replace with "/" 389 // C. if input buffer starts with "/../" or is "/..", replace with "/"
344 // and remove preceeding segment. 390 // and remove preceeding segment.
345 testResolve("s://a/p2", "../p2"); 391 testResolve("s://a/p2", "../p2");
346 var longPathBase = Uri.parse(b.replaceFirst("/pb", "/pb/pc/pd")); 392 var longPathBase = b.replaceFirst("/pb", "/pb/pc/pd");
347 base = longPathBase; 393 setBase(longPathBase);
348 testResolve("s://a/pa/pb/p2", "../p2"); 394 testResolve("s://a/pa/pb/p2", "../p2");
349 testResolve("s://a/pa/p2", "../../p2"); 395 testResolve("s://a/pa/p2", "../../p2");
350 testResolve("s://a/p2", "../../../p2"); 396 testResolve("s://a/p2", "../../../p2");
351 testResolve("s://a/p2", "../../../../p2"); 397 testResolve("s://a/p2", "../../../../p2");
352 var noAuthRelLongPathBase = 398 var noAuthRelLongPathBase = b.replaceFirst("//a/pa/pb", "pa/pb/pc/pd");
353 Uri.parse(b.replaceFirst("//a/pa/pb", "pa/pb/pc/pd")); 399 setBase(noAuthRelLongPathBase);
354 base = noAuthRelLongPathBase;
355 testResolve("s:pa/pb/p2", "../p2"); 400 testResolve("s:pa/pb/p2", "../p2");
356 testResolve("s:pa/p2", "../../p2"); 401 testResolve("s:pa/p2", "../../p2");
357 testResolve("s:/p2", "../../../p2"); 402 testResolve("s:/p2", "../../../p2");
358 testResolve("s:/p2", "../../../../p2"); 403 testResolve("s:/p2", "../../../../p2");
359 404
360 // D. if the input buffer contains only ".." or ".", remove it. 405 // D. if the input buffer contains only ".." or ".", remove it.
361 base = noAuthEmptyPathBase; 406 setBase(noAuthEmptyPathBase);
362 testResolve("s:", ".."); 407 testResolve("s:", "..");
363 testResolve("s:", "."); 408 testResolve("s:", ".");
364 base = noAuthRelSinglePathBase; 409 setBase(noAuthRelSinglePathBase);
365 testResolve("s:", ".."); 410 testResolve("s:", "..");
366 testResolve("s:", "."); 411 testResolve("s:", ".");
367 } 412 }
368 } 413 }
369 414
370 void testResolvePath(String expected, String path) { 415 void testResolvePath(String expected, String path) {
371 Expect.equals(expected, 416 Expect.equals(expected,
372 new Uri(path: '/').resolveUri(new Uri(path: path)).path); 417 new Uri(path: '/').resolveUri(new Uri(path: path)).path);
373 Expect.equals( 418 Expect.equals(
374 "http://localhost$expected", 419 "http://localhost$expected",
(...skipping 506 matching lines...) Expand 10 before | Expand all | Expand 10 after
881 String dump(Uri uri) { 926 String dump(Uri uri) {
882 return "URI: $uri\n" 927 return "URI: $uri\n"
883 " Scheme: ${uri.scheme} #${uri.scheme.length}\n" 928 " Scheme: ${uri.scheme} #${uri.scheme.length}\n"
884 " User-info: ${uri.userInfo} #${uri.userInfo.length}\n" 929 " User-info: ${uri.userInfo} #${uri.userInfo.length}\n"
885 " Host: ${uri.host} #${uri.host.length}\n" 930 " Host: ${uri.host} #${uri.host.length}\n"
886 " Port: ${uri.port}\n" 931 " Port: ${uri.port}\n"
887 " Path: ${uri.path} #${uri.path.length}\n" 932 " Path: ${uri.path} #${uri.path.length}\n"
888 " Query: ${uri.query} #${uri.query.length}\n" 933 " Query: ${uri.query} #${uri.query.length}\n"
889 " Fragment: ${uri.fragment} #${uri.fragment.length}\n"; 934 " Fragment: ${uri.fragment} #${uri.fragment.length}\n";
890 } 935 }
OLDNEW
« no previous file with comments | « sdk/lib/core/uri.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698