8f962bdff6
This is a reland of commit 1a614b1d86
Bug: b/348315159
This CL removes the native assets fallback from the VM.
TEST=pkg/dartdev/test/native_assets/build_test.dart
TEST=tests/ffi/native_assets/asset_relative_test.dart
Closes: https://github.com/dart-lang/sdk/issues/55523
Closes: https://github.com/dart-lang/sdk/issues/55925
Change-Id: Ib40d3a8c7d4b7c6226b6e4db4b3016cc32591239
Cq-Include-Trybots: dart/try:vm-aot-linux-debug-x64-try,vm-aot-linux-debug-x64c-try,vm-aot-mac-release-arm64-try,vm-aot-mac-release-x64-try,vm-aot-obfuscate-linux-release-x64-try,vm-aot-optimization-level-linux-release-x64-try,vm-aot-win-debug-arm64-try,vm-aot-win-debug-x64-try,vm-aot-win-debug-x64c-try,pkg-linux-debug-try,pkg-linux-release-arm64-try,pkg-mac-release-try,pkg-mac-release-arm64-try,pkg-win-release-try,pkg-win-release-arm64-try,vm-aot-asan-linux-release-x64-try,vm-asan-linux-release-x64-try,vm-aot-msan-linux-release-x64-try,vm-msan-linux-release-x64-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/372500
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
610 lines
22 KiB
C++
610 lines
22 KiB
C++
// Copyright (c) 2024, 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.
|
|
|
|
#include "vm/unit_test.h"
|
|
|
|
#include "bin/uri.h"
|
|
#include "platform/utils.h"
|
|
|
|
namespace dart {
|
|
|
|
#define EXPECT_USTREQ(expected, actual) EXPECT_STREQ(expected, actual.get())
|
|
|
|
TEST_CASE(ParseUri_WithScheme_NoQueryNoUser) {
|
|
auto uri = ParseUri("foo://example.com:8042/over/there");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_WithQuery) {
|
|
auto uri = ParseUri("foo://example.com:8042/over/there?name=ferret");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT_USTREQ("name=ferret", uri->query);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_WithFragment) {
|
|
auto uri = ParseUri("foo://example.com:8042/over/there#fragment");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT_USTREQ("fragment", uri->fragment);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_WithQueryWithFragment) {
|
|
auto uri = ParseUri("foo://example.com:8042/over/there?name=ferret#fragment");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT_USTREQ("name=ferret", uri->query);
|
|
EXPECT_USTREQ("fragment", uri->fragment);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_WithUser) {
|
|
auto uri = ParseUri("foo://user@example.com:8042/over/there");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT_USTREQ("user", uri->userinfo);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_ShortPath) {
|
|
auto uri = ParseUri("foo://example.com:8042/");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_EmptyPath) {
|
|
auto uri = ParseUri("foo://example.com:8042");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_Rootless1) {
|
|
auto uri = ParseUri("foo:here");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("here", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_WithScheme_Rootless2) {
|
|
auto uri = ParseUri("foo:or/here");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("foo", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("or/here", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_AbsPath_WithAuthority) {
|
|
auto uri = ParseUri("//example.com:8042/over/there");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("example.com", uri->host);
|
|
EXPECT_USTREQ("8042", uri->port);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_AbsPath_NoAuthority) {
|
|
auto uri = ParseUri("/over/there");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/over/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
// Colons are permitted in path segments, in many cases.
|
|
TEST_CASE(ParseUri_NoScheme_AbsPath_StrayColon) {
|
|
auto uri = ParseUri("/ov:er/there");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/ov:er/there", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_Rootless1) {
|
|
auto uri = ParseUri("here");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("here", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_Rootless2) {
|
|
auto uri = ParseUri("or/here");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("or/here", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_Empty) {
|
|
auto uri = ParseUri("");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_QueryOnly) {
|
|
auto uri = ParseUri("?name=ferret");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("", uri->path);
|
|
EXPECT_USTREQ("name=ferret", uri->query);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NoScheme_FragmentOnly) {
|
|
auto uri = ParseUri("#fragment");
|
|
EXPECT(uri);
|
|
EXPECT(uri->scheme == nullptr);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT_USTREQ("fragment", uri->fragment);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_LowerCaseScheme) {
|
|
auto uri = ParseUri("ScHeMe:path");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("path", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NormalizeEscapes_PathQueryFragment) {
|
|
auto uri =
|
|
ParseUri("scheme:/This%09Is A P%61th?This%09Is A Qu%65ry#A Fr%61gment");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/This%09Is%20A%20Path", uri->path);
|
|
EXPECT_USTREQ("This%09Is%20A%20Query", uri->query);
|
|
EXPECT_USTREQ("A%20Fragment", uri->fragment);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapesPreferred) {
|
|
auto uri = ParseUri("scheme:/%1b%1B");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/%1B%1B", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NormalizeEscapes_Authority) {
|
|
auto uri = ParseUri("scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT_USTREQ("UsEr%20NaMe", uri->userinfo); // Normalized, case preserved.
|
|
EXPECT_USTREQ("host.com", uri->host); // Normalized, lower-cased.
|
|
EXPECT_USTREQ("80", uri->port);
|
|
EXPECT_USTREQ("/", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapeInHost) {
|
|
auto uri = ParseUri("scheme://tEst%1b/");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT_USTREQ("test%1B", uri->host); // Notice that %1B is upper-cased.
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/", uri->path);
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ParseUri_BrokenEscapeSequence) {
|
|
auto uri = ParseUri("scheme:/%1g");
|
|
EXPECT(uri);
|
|
EXPECT_USTREQ("scheme", uri->scheme);
|
|
EXPECT(uri->userinfo == nullptr);
|
|
EXPECT(uri->host == nullptr);
|
|
EXPECT(uri->port == nullptr);
|
|
EXPECT_USTREQ("/%1g", uri->path); // Broken sequence is unchanged.
|
|
EXPECT(uri->query == nullptr);
|
|
EXPECT(uri->fragment == nullptr);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_WithScheme_NoAuthorityNoQuery) {
|
|
auto target_uri = ResolveUri("rscheme:/ref/path",
|
|
"bscheme://buser@bhost:11/base/path?baseQuery");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("rscheme:/ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_WithScheme_WithAuthorityWithQuery) {
|
|
auto target_uri = ResolveUri("rscheme://ruser@rhost:22/ref/path?refQuery",
|
|
"bscheme://buser@bhost:11/base/path?baseQuery");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("rscheme://ruser@rhost:22/ref/path?refQuery", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoScheme_WithAuthority) {
|
|
auto target_uri = ResolveUri("//ruser@rhost:22/ref/path",
|
|
"bscheme://buser@bhost:11/base/path?baseQuery");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://ruser@rhost:22/ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_AbsolutePath) {
|
|
auto target_uri =
|
|
ResolveUri("/ref/path", "bscheme://buser@bhost:11/base/path?baseQuery");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePath) {
|
|
auto target_uri =
|
|
ResolveUri("ref/path", "bscheme://buser@bhost:11/base/path?baseQuery");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/base/ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathEmptyBasePath) {
|
|
auto target_uri = ResolveUri("ref/path", "bscheme://buser@bhost:11");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathWeirdBasePath) {
|
|
auto target_uri = ResolveUri("ref/path", "bscheme:base");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme:ref/path", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPath) {
|
|
auto target_uri =
|
|
ResolveUri("", "bscheme://buser@bhost:11/base/path?baseQuery#bfragment");
|
|
EXPECT(target_uri);
|
|
// Note that we drop the base fragment from the resolved uri->
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/base/path?baseQuery", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithQuery) {
|
|
auto target_uri = ResolveUri(
|
|
"?refQuery", "bscheme://buser@bhost:11/base/path?baseQuery#bfragment");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/base/path?refQuery", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithFragment) {
|
|
auto target_uri = ResolveUri(
|
|
"#rfragment", "bscheme://buser@bhost:11/base/path?baseQuery#bfragment");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("bscheme://buser@bhost:11/base/path?baseQuery#rfragment",
|
|
target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotSegment) {
|
|
auto target_uri = ResolveUri("./refpath", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/a/b/c/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotSegments) {
|
|
auto target_uri = ResolveUri("././refpath", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/a/b/c/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotDotSegment) {
|
|
auto target_uri = ResolveUri("../refpath", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/a/b/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotDotSegments) {
|
|
auto target_uri = ResolveUri("../../refpath", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/a/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveTooManyDotDotSegments) {
|
|
auto target_uri =
|
|
ResolveUri("../../../../../../../../../refpath", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft1) {
|
|
auto target_uri = ResolveUri("../../../../..", "scheme://auth/a/b/c/d");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft2) {
|
|
auto target_uri = ResolveUri(".", "scheme://auth/");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsInitialPrefix) {
|
|
auto target_uri = ResolveUri("../../../../refpath", "scheme://auth");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/refpath", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsMixed) {
|
|
auto target_uri = ResolveUri("../../1/./2/../3/4/../5/././6/../7",
|
|
"scheme://auth/a/b/c/d/e");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme://auth/a/b/1/3/5/7", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NormalizeEscapes_PathQueryFragment) {
|
|
auto target_uri = ResolveUri(
|
|
"#A Fr%61gment", "scheme:/This%09Is A P%61th?This%09Is A Qu%65ry");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ(
|
|
"scheme:/This%09Is%20A%20Path?This%09Is%20A%20Query#A%20Fragment",
|
|
target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NormalizeEscapes_UppercaseHexPreferred) {
|
|
auto target_uri = ResolveUri("", "scheme:/%1b%1B");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ("scheme:/%1B%1B", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NormalizeEscapes_Authority) {
|
|
auto target_uri = ResolveUri("", "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/");
|
|
EXPECT(target_uri);
|
|
// userinfo is normalized and case is preserved. host is normalized
|
|
// and lower-cased.
|
|
EXPECT_USTREQ("scheme://UsEr%20NaMe@host.com:80/", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_NormalizeEscapes_BrokenEscapeSequence) {
|
|
auto target_uri = ResolveUri("", "scheme:/%1g");
|
|
EXPECT(target_uri);
|
|
// We don't change broken escape sequences.
|
|
EXPECT_USTREQ("scheme:/%1g", target_uri);
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_DataUri) {
|
|
const char* data_uri =
|
|
"data:application/"
|
|
"dart;charset=utf-8,%20%20%20%20%20%20%20%20import%20%22dart:isolate%22;%"
|
|
"0A%0A%20%20%20%20%20%20%20%20import%20%22package:stream_channel/"
|
|
"stream_channel.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%"
|
|
"22package:test/src/runner/plugin/"
|
|
"remote_platform_helpers.dart%22;%0A%20%20%20%20%20%20%20%20import%20%"
|
|
"22package:test/src/runner/vm/"
|
|
"catch_isolate_errors.dart%22;%0A%0A%20%20%20%20%20%20%20%20import%20%"
|
|
"22file:///home/sra/xxxx/dev_compiler/test/"
|
|
"all_tests.dart%22%20as%20test;%0A%0A%20%20%20%20%20%20%20%20void%20main("
|
|
"_,%20SendPort%20message)%20%7B%0A%20%20%20%20%20%20%20%20%20%20var%"
|
|
"20channel%20=%20serializeSuite(()%20%7B%0A%20%20%20%20%20%20%20%20%20%"
|
|
"20%20%20catchIsolateErrors();%0A%20%20%20%20%20%20%20%20%20%20%20%"
|
|
"20return%20test.main;%0A%20%20%20%20%20%20%20%20%20%20%7D);%0A%20%20%20%"
|
|
"20%20%20%20%20%20%20new%20IsolateChannel.connectSend(message).pipe("
|
|
"channel);%0A%20%20%20%20%20%20%20%20%7D%0A%20%20%20%20%20%20";
|
|
|
|
auto target_uri = ResolveUri(
|
|
data_uri, "bscheme://buser@bhost:11/base/path?baseQuery#bfragment");
|
|
EXPECT(target_uri);
|
|
EXPECT_USTREQ(data_uri, target_uri);
|
|
}
|
|
|
|
// dart:core Uri allows for the base url to be relative (no scheme, no
|
|
// authority, relative path) but this behavior is not in RFC 3986. We
|
|
// do not implement this.
|
|
TEST_CASE(ResolveUri_RelativeBase_NotImplemented) {
|
|
EXPECT(!ResolveUri("../r1", "b1/b2").get());
|
|
|
|
EXPECT(!ResolveUri("..", "b1/b2").get());
|
|
|
|
EXPECT(!ResolveUri("../..", "b1/b2").get());
|
|
|
|
EXPECT(!ResolveUri("../../..", "b1/b2").get());
|
|
|
|
EXPECT(!ResolveUri("../../../r1", "b1/b2").get());
|
|
|
|
EXPECT(!ResolveUri("../r1", "../../b1/b2/b3").get());
|
|
|
|
EXPECT(!ResolveUri("../../../r1", "../../b1/b2/b3").get());
|
|
}
|
|
|
|
CStringUniquePtr TestResolve(const char* base_uri, const char* uri) {
|
|
auto target_uri = ResolveUri(uri, base_uri);
|
|
EXPECT(target_uri);
|
|
return target_uri;
|
|
}
|
|
|
|
// This test is ported from sdk/tests/corelib/uri_test.dart (testUriPerRFCs).
|
|
TEST_CASE(ResolveUri_TestUriPerRFCs) {
|
|
const char* base = "http://a/b/c/d;p?q";
|
|
|
|
// From RFC 3986
|
|
EXPECT_USTREQ("g:h", TestResolve(base, "g:h"));
|
|
EXPECT_USTREQ("http://a/b/c/g", TestResolve(base, "g"));
|
|
EXPECT_USTREQ("http://a/b/c/g", TestResolve(base, "./g"));
|
|
EXPECT_USTREQ("http://a/b/c/g/", TestResolve(base, "g/"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "/g"));
|
|
EXPECT_USTREQ("http://g", TestResolve(base, "//g"));
|
|
EXPECT_USTREQ("http://a/b/c/d;p?y", TestResolve(base, "?y"));
|
|
EXPECT_USTREQ("http://a/b/c/g?y", TestResolve(base, "g?y"));
|
|
EXPECT_USTREQ("http://a/b/c/d;p?q#s", TestResolve(base, "#s"));
|
|
EXPECT_USTREQ("http://a/b/c/g#s", TestResolve(base, "g#s"));
|
|
EXPECT_USTREQ("http://a/b/c/g?y#s", TestResolve(base, "g?y#s"));
|
|
EXPECT_USTREQ("http://a/b/c/;x", TestResolve(base, ";x"));
|
|
EXPECT_USTREQ("http://a/b/c/g;x", TestResolve(base, "g;x"));
|
|
EXPECT_USTREQ("http://a/b/c/g;x?y#s", TestResolve(base, "g;x?y#s"));
|
|
EXPECT_USTREQ("http://a/b/c/d;p?q", TestResolve(base, ""));
|
|
EXPECT_USTREQ("http://a/b/c/", TestResolve(base, "."));
|
|
EXPECT_USTREQ("http://a/b/c/", TestResolve(base, "./"));
|
|
EXPECT_USTREQ("http://a/b/", TestResolve(base, ".."));
|
|
EXPECT_USTREQ("http://a/b/", TestResolve(base, "../"));
|
|
EXPECT_USTREQ("http://a/b/g", TestResolve(base, "../g"));
|
|
EXPECT_USTREQ("http://a/", TestResolve(base, "../.."));
|
|
EXPECT_USTREQ("http://a/", TestResolve(base, "../../"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "../../g"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "../../../g"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "../../../../g"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "/./g"));
|
|
EXPECT_USTREQ("http://a/g", TestResolve(base, "/../g"));
|
|
EXPECT_USTREQ("http://a/b/c/g.", TestResolve(base, "g."));
|
|
EXPECT_USTREQ("http://a/b/c/.g", TestResolve(base, ".g"));
|
|
EXPECT_USTREQ("http://a/b/c/g..", TestResolve(base, "g.."));
|
|
EXPECT_USTREQ("http://a/b/c/..g", TestResolve(base, "..g"));
|
|
EXPECT_USTREQ("http://a/b/g", TestResolve(base, "./../g"));
|
|
EXPECT_USTREQ("http://a/b/c/g/", TestResolve(base, "./g/."));
|
|
EXPECT_USTREQ("http://a/b/c/g/h", TestResolve(base, "g/./h"));
|
|
EXPECT_USTREQ("http://a/b/c/h", TestResolve(base, "g/../h"));
|
|
EXPECT_USTREQ("http://a/b/c/g;x=1/y", TestResolve(base, "g;x=1/./y"));
|
|
EXPECT_USTREQ("http://a/b/c/y", TestResolve(base, "g;x=1/../y"));
|
|
EXPECT_USTREQ("http://a/b/c/g?y/./x", TestResolve(base, "g?y/./x"));
|
|
EXPECT_USTREQ("http://a/b/c/g?y/../x", TestResolve(base, "g?y/../x"));
|
|
EXPECT_USTREQ("http://a/b/c/g#s/./x", TestResolve(base, "g#s/./x"));
|
|
EXPECT_USTREQ("http://a/b/c/g#s/../x", TestResolve(base, "g#s/../x"));
|
|
EXPECT_USTREQ("http:g", TestResolve(base, "http:g"));
|
|
|
|
// Additional tests (not from RFC 3986).
|
|
EXPECT_USTREQ("http://a/b/g;p/h;s", TestResolve(base, "../g;p/h;s"));
|
|
|
|
base = "s:a/b";
|
|
EXPECT_USTREQ("s:/c", TestResolve(base, "../c"));
|
|
}
|
|
|
|
// This test is ported from sdk/tests/corelib/uri_test.dart (testResolvePath).
|
|
TEST_CASE(ResolveUri_MoreDotSegmentTests) {
|
|
const char* base = "/";
|
|
EXPECT_USTREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
|
|
EXPECT_USTREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
|
|
EXPECT_USTREQ("/mid/6", TestResolve(base, "mid/content=5/../6"));
|
|
EXPECT_USTREQ("/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
|
|
EXPECT_USTREQ("/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
|
|
EXPECT_USTREQ("/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
|
|
EXPECT_USTREQ("/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
|
|
EXPECT_USTREQ("/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
|
|
EXPECT_USTREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
|
|
EXPECT_USTREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
|
|
EXPECT_USTREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
|
|
|
|
#define LH "http://localhost"
|
|
base = LH;
|
|
EXPECT_USTREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
|
|
EXPECT_USTREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
|
|
EXPECT_USTREQ(LH "/mid/6", TestResolve(base, "mid/content=5/../6"));
|
|
EXPECT_USTREQ(LH "/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
|
|
EXPECT_USTREQ(LH "/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
|
|
EXPECT_USTREQ(LH "/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
|
|
EXPECT_USTREQ(LH "/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
|
|
EXPECT_USTREQ(LH "/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
|
|
EXPECT_USTREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
|
|
EXPECT_USTREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
|
|
EXPECT_USTREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
|
|
#undef LH
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_WindowsPaths_Forwardslash_NoScheme) {
|
|
EXPECT_USTREQ(
|
|
"c:/Users/USERNA~1/AppData/Local/Temp/a/b.dll",
|
|
TestResolve("C:/Users/USERNA~1/AppData/Local/Temp/a/out.dill", "b.dll"));
|
|
}
|
|
|
|
// > Here are some examples which may be accepted by some applications on
|
|
// > Windows systems
|
|
// https://en.wikipedia.org/wiki/File_URI_scheme
|
|
// "file:///C:/"
|
|
TEST_CASE(ResolveUri_WindowsPaths_Forwardslash_FileScheme) {
|
|
EXPECT_USTREQ(
|
|
"file:///"
|
|
"C:/Users/USERNA~1/AppData/Local/Temp/a/b.dll",
|
|
TestResolve("file:///C:/Users/USERNA~1/AppData/Local/Temp/a/out.dill",
|
|
"b.dll"));
|
|
}
|
|
|
|
TEST_CASE(ResolveUri_WindowsPaths_Backslash) {
|
|
EXPECT_USTREQ(
|
|
"file:///b.dll",
|
|
TestResolve(
|
|
"file:///C:\\Users\\USERNA~1\\AppData\\Local\\Temp\\a\\out.dill",
|
|
"b.dll"));
|
|
}
|
|
|
|
} // namespace dart
|