mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 15:01:30 +00:00
b101a7d002
Change-Id: Ib33169c3e0ffc870915c189404074a1dea472546 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/196548 Reviewed-by: Bob Nystrom <rnystrom@google.com> Commit-Queue: Leaf Petersen <leafp@google.com>
295 lines
11 KiB
Dart
295 lines
11 KiB
Dart
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
|
|
// for details. All rights reserved. Use of this source code is governed by a
|
|
// BSD-style license that can be found in the LICENSE file.
|
|
|
|
// @dart = 2.9
|
|
|
|
import "package:expect/expect.dart";
|
|
|
|
testFileUri() {
|
|
final unsupported = new UnsupportedError("");
|
|
|
|
var tests = [
|
|
["", "", ""],
|
|
["relative", "relative", "relative"],
|
|
["relative/", "relative/", "relative\\"],
|
|
["a%20b", "a b", "a b"],
|
|
["a%20b/", "a b/", "a b\\"],
|
|
["a/b", "a/b", "a\\b"],
|
|
["a/b/", "a/b/", "a\\b\\"],
|
|
["a%20b/c%20d", "a b/c d", "a b\\c d"],
|
|
["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
|
|
["file:///absolute", "/absolute", "\\absolute"],
|
|
["file:///absolute", "/absolute", "\\absolute"],
|
|
["file:///a/b", "/a/b", "\\a\\b"],
|
|
["file:///a/b", "/a/b", "\\a\\b"],
|
|
["file://server/a/b", unsupported, "\\\\server\\a\\b"],
|
|
["file://server/a/b/", unsupported, "\\\\server\\a\\b\\"],
|
|
["file:///C:/", "/C:/", "C:\\"],
|
|
["file:///C:/a/b", "/C:/a/b", "C:\\a\\b"],
|
|
["file:///C:/a/b/", "/C:/a/b/", "C:\\a\\b\\"],
|
|
["http:/a/b", unsupported, unsupported],
|
|
["https:/a/b", unsupported, unsupported],
|
|
["urn:a:b", unsupported, unsupported],
|
|
];
|
|
|
|
void check(String s, filePath, bool windows) {
|
|
Uri uri = Uri.parse(s);
|
|
if (filePath is Error) {
|
|
if (filePath is UnsupportedError) {
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: windows));
|
|
} else {
|
|
Expect.throws(() => uri.toFilePath(windows: windows));
|
|
}
|
|
} else {
|
|
Expect.equals(filePath, uri.toFilePath(windows: windows));
|
|
Expect.equals(s, new Uri.file(filePath, windows: windows).toString());
|
|
}
|
|
}
|
|
|
|
for (var test in tests) {
|
|
check(test[0], test[1], false);
|
|
check(test[0], test[2], true);
|
|
}
|
|
|
|
Uri uri;
|
|
uri = Uri.parse("file:a");
|
|
Expect.equals("/a", uri.toFilePath(windows: false));
|
|
Expect.equals("\\a", uri.toFilePath(windows: true));
|
|
uri = Uri.parse("file:a/");
|
|
Expect.equals("/a/", uri.toFilePath(windows: false));
|
|
Expect.equals("\\a\\", uri.toFilePath(windows: true));
|
|
}
|
|
|
|
testFileUriWindowsSlash() {
|
|
var tests = [
|
|
["", "", ""],
|
|
["relative", "relative", "relative"],
|
|
["relative/", "relative/", "relative\\"],
|
|
["a%20b", "a b", "a b"],
|
|
["a%20b/", "a b/", "a b\\"],
|
|
["a/b", "a/b", "a\\b"],
|
|
["a/b/", "a/b/", "a\\b\\"],
|
|
["a%20b/c%20d", "a b/c d", "a b\\c d"],
|
|
["a%20b/c%20d/", "a b/c d/", "a b\\c d\\"],
|
|
["file:///absolute", "/absolute", "\\absolute"],
|
|
["file:///absolute", "/absolute", "\\absolute"],
|
|
["file:///a/b", "/a/b", "\\a\\b"],
|
|
["file:///a/b", "/a/b", "\\a\\b"],
|
|
["file://server/a/b", "//server/a/b", "\\\\server\\a\\b"],
|
|
["file://server/a/b/", "//server/a/b/", "\\\\server\\a\\b\\"],
|
|
["file:///C:/", "C:/", "C:\\"],
|
|
["file:///C:/a/b", "C:/a/b", "C:\\a\\b"],
|
|
["file:///C:/a/b/", "C:/a/b/", "C:\\a\\b\\"],
|
|
];
|
|
|
|
for (var test in tests) {
|
|
Uri uri = new Uri.file(test[1], windows: true);
|
|
Expect.equals(test[0], uri.toString());
|
|
Expect.equals(test[2], uri.toFilePath(windows: true));
|
|
bool couldBeDir = uri.path.isEmpty || uri.path.endsWith('\\');
|
|
Uri dirUri = new Uri.directory(test[1], windows: true);
|
|
Expect.isTrue(dirUri.path.isEmpty || dirUri.path.endsWith('/'));
|
|
if (couldBeDir) {
|
|
Expect.equals(uri, dirUri);
|
|
}
|
|
}
|
|
}
|
|
|
|
testFileUriWindowsWin32Namespace() {
|
|
var tests = [
|
|
["\\\\?\\C:\\", "file:///C:/", "C:\\"],
|
|
["\\\\?\\C:\\", "file:///C:/", "C:\\"],
|
|
[
|
|
"\\\\?\\UNC\\server\\share\\file",
|
|
"file://server/share/file",
|
|
"\\\\server\\share\\file"
|
|
],
|
|
];
|
|
|
|
for (var test in tests) {
|
|
Uri uri = new Uri.file(test[0], windows: true);
|
|
Expect.equals(test[1], uri.toString());
|
|
Expect.equals(test[2], uri.toFilePath(windows: true));
|
|
}
|
|
|
|
Expect.throwsArgumentError(() => new Uri.file("\\\\?\\file", windows: true));
|
|
Expect.throwsArgumentError(
|
|
() => new Uri.file("\\\\?\\UNX\\server\\share\\file", windows: true));
|
|
Expect.throwsArgumentError(
|
|
() => new Uri.directory("\\\\?\\file", windows: true));
|
|
Expect.throwsArgumentError(() =>
|
|
new Uri.directory("\\\\?\\UNX\\server\\share\\file", windows: true));
|
|
}
|
|
|
|
testFileUriDriveLetter() {
|
|
check(String s, String nonWindows, String windows) {
|
|
Uri uri;
|
|
uri = Uri.parse(s);
|
|
Expect.equals(nonWindows, uri.toFilePath(windows: false));
|
|
if (windows != null) {
|
|
Expect.equals(windows, uri.toFilePath(windows: true));
|
|
} else {
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
}
|
|
}
|
|
|
|
check("file:///C:", "/C:", "C:\\");
|
|
check("file:///C:/", "/C:/", "C:\\");
|
|
check("file:///C:a", "/C:a", null);
|
|
check("file:///C:a/", "/C:a/", null);
|
|
|
|
Expect.throwsArgumentError(() => new Uri.file("C:", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.file("C:a", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.file("C:a\b", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory("C:", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory("C:a", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory("C:a\b", windows: true));
|
|
}
|
|
|
|
testFileUriResolve() {
|
|
var tests = [
|
|
["file:///a", "/a", "", "\\a", ""],
|
|
["file:///a/", "/a/", "", "\\a\\", ""],
|
|
["file:///b", "/a", "b", "\\a", "b"],
|
|
["file:///b/", "/a", "b/", "\\a", "b\\"],
|
|
["file:///a/b", "/a/", "b", "\\a\\", "b"],
|
|
["file:///a/b/", "/a/", "b/", "\\a\\", "b\\"],
|
|
["file:///a/c/d", "/a/b", "c/d", "\\a\\b", "c\\d"],
|
|
["file:///a/c/d/", "/a/b", "c/d/", "\\a\\b", "c\\d\\"],
|
|
["file:///a/b/c/d", "/a/b/", "c/d", "\\a\\b\\", "c\\d"],
|
|
["file:///a/b/c/d/", "/a/b/", "c/d/", "\\a\\b\\", "c\\d\\"],
|
|
];
|
|
|
|
check(String s, String absolute, String relative, bool windows) {
|
|
Uri absoluteUri = new Uri.file(absolute, windows: windows);
|
|
Uri relativeUri = new Uri.file(relative, windows: windows);
|
|
String relativeString = windows ? relative.replaceAll("\\", "/") : relative;
|
|
Expect.equals(s, absoluteUri.resolve(relativeString).toString());
|
|
Expect.equals(s, absoluteUri.resolveUri(relativeUri).toString());
|
|
}
|
|
|
|
for (var test in tests) {
|
|
check(test[0], test[1], test[2], false);
|
|
check(test[0], test[1], test[2], true);
|
|
check(test[0], test[1], test[4], true);
|
|
check(test[0], test[3], test[2], true);
|
|
check(test[0], test[3], test[4], true);
|
|
}
|
|
}
|
|
|
|
testFileUriIllegalCharacters() {
|
|
// Slash is an invalid character in file names on both non-Windows
|
|
// and Windows.
|
|
Uri uri = Uri.parse("file:///a%2Fb");
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: false));
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
|
|
// Illegal characters in windows file names.
|
|
var illegalWindowsPaths = [
|
|
"a<b",
|
|
"a>b",
|
|
"a:b",
|
|
"a\"b",
|
|
"a|b",
|
|
"a?b",
|
|
"a*b",
|
|
"\\\\?\\c:\\a/b"
|
|
];
|
|
|
|
for (var test in illegalWindowsPaths) {
|
|
Expect.throwsArgumentError(() => new Uri.file(test, windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.file("\\$test", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory(test, windows: true));
|
|
Expect
|
|
.throwsArgumentError(() => new Uri.directory("\\$test", windows: true));
|
|
|
|
// It is possible to create non-Windows URIs, but not Windows URIs.
|
|
Uri uri = new Uri.file(test, windows: false);
|
|
Uri absoluteUri = new Uri.file("/$test", windows: false);
|
|
Uri dirUri = new Uri.directory(test, windows: false);
|
|
Uri dirAbsoluteUri = new Uri.directory("/$test", windows: false);
|
|
Expect.throwsArgumentError(() => new Uri.file(test, windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.file("\\$test", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory(test, windows: true));
|
|
Expect
|
|
.throwsArgumentError(() => new Uri.directory("\\$test", windows: true));
|
|
|
|
// It is possible to extract non-Windows file path, but not
|
|
// Windows file path.
|
|
Expect.equals(test, uri.toFilePath(windows: false));
|
|
Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
|
|
Expect.equals("$test/", dirUri.toFilePath(windows: false));
|
|
Expect.equals("/$test/", dirAbsoluteUri.toFilePath(windows: false));
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
Expect.throwsUnsupportedError(() => absoluteUri.toFilePath(windows: true));
|
|
Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
|
|
Expect
|
|
.throwsUnsupportedError(() => dirAbsoluteUri.toFilePath(windows: true));
|
|
}
|
|
|
|
// Backslash
|
|
illegalWindowsPaths = ["a\\b", "a\\b\\"];
|
|
for (var test in illegalWindowsPaths) {
|
|
// It is possible to create both non-Windows URIs, and Windows URIs.
|
|
Uri uri = new Uri.file(test, windows: false);
|
|
Uri absoluteUri = new Uri.file("/$test", windows: false);
|
|
Uri dirUri = new Uri.directory(test, windows: false);
|
|
Uri dirAbsoluteUri = new Uri.directory("/$test", windows: false);
|
|
new Uri.file(test, windows: true);
|
|
new Uri.file("\\$test", windows: true);
|
|
|
|
// It is possible to extract non-Windows file path, but not
|
|
// Windows file path from the non-Windows URI (it has a backslash
|
|
// in a path segment).
|
|
Expect.equals(test, uri.toFilePath(windows: false));
|
|
Expect.equals("/$test", absoluteUri.toFilePath(windows: false));
|
|
Expect.equals("$test/", dirUri.toFilePath(windows: false));
|
|
Expect.equals("/$test/", dirAbsoluteUri.toFilePath(windows: false));
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
Expect.throwsUnsupportedError(() => absoluteUri.toFilePath(windows: true));
|
|
Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
|
|
Expect
|
|
.throwsUnsupportedError(() => dirAbsoluteUri.toFilePath(windows: true));
|
|
}
|
|
}
|
|
|
|
testFileUriIllegalDriveLetter() {
|
|
Expect.throwsArgumentError(() => new Uri.file("1:\\", windows: true));
|
|
Expect.throwsArgumentError(() => new Uri.directory("1:\\", windows: true));
|
|
Uri uri = new Uri.file("1:\\", windows: false);
|
|
Uri dirUri = new Uri.directory("1:\\", windows: false);
|
|
Expect.equals("1:\\", uri.toFilePath(windows: false));
|
|
Expect.equals("1:\\/", dirUri.toFilePath(windows: false));
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
Expect.throwsUnsupportedError(() => dirUri.toFilePath(windows: true));
|
|
}
|
|
|
|
testAdditionalComponents() {
|
|
check(String s, {bool windowsOk: false}) {
|
|
Uri uri = Uri.parse(s);
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: false));
|
|
if (windowsOk) {
|
|
Expect.isTrue(uri.toFilePath(windows: true) is String);
|
|
} else {
|
|
Expect.throwsUnsupportedError(() => uri.toFilePath(windows: true));
|
|
}
|
|
}
|
|
|
|
check("file:///path?query");
|
|
check("file:///path#fragment");
|
|
check("file:///path?query#fragment");
|
|
check("file://host/path", windowsOk: true);
|
|
check("file://user:password@host/path", windowsOk: true);
|
|
}
|
|
|
|
main() {
|
|
testFileUri();
|
|
testFileUriWindowsSlash();
|
|
testFileUriDriveLetter();
|
|
testFileUriWindowsWin32Namespace();
|
|
testFileUriResolve();
|
|
testFileUriIllegalCharacters();
|
|
testFileUriIllegalDriveLetter();
|
|
testAdditionalComponents();
|
|
}
|