dart-sdk/runtime/vm/uri_test.cc
Daco Harkes 17f4198cfe [vm/ffi] Native assets Windows fixes
Some artifacts are .exe instead of .bat.

Library uris with file schemes use the Uri.path (using forward slashes
on Windows), so the tests emitting native asset mappings should use
Uri.path as well. (Not Uri.toFilePath() which uses backwards slashes.)
The paths of the dynamic libraries in the assets should use the
toFilePath(), as these are passed to the system API which expects
correct paths.

The Platform.script Uri has a path with file:///C: and back slashes.
The uri RFC does not support back slashes, and our ResolveUri does
neither. So for Windows we replace backslashes with forward slashes.

TEST=tests/ffi/native_assets/

Bug: https://github.com/dart-lang/sdk/issues/51066
Bug: https://github.com/dart-lang/sdk/issues/51067
Change-Id: I2e168e0549fe80d9a5366d636c6f1ef971942130
Cq-Include-Trybots: luci.dart.try:vm-kernel-precomp-nnbd-win-release-x64-try,vm-kernel-nnbd-win-debug-x64-try,vm-kernel-nnbd-win-release-x64-try,vm-kernel-nnbd-win-release-ia32-try,vm-kernel-msvc-windows-try,dart-sdk-win-try
Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/279356
Reviewed-by: Martin Kustermann <kustermann@google.com>
Commit-Queue: Daco Harkes <dacoharkes@google.com>
2023-01-20 18:20:17 +00:00

624 lines
22 KiB
C++

// Copyright (c) 2016, 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/uri.h"
#include "vm/unit_test.h"
namespace dart {
TEST_CASE(ParseUri_WithScheme_NoQueryNoUser) {
ParsedUri uri;
EXPECT(ParseUri("foo://example.com:8042/over/there", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_WithQuery) {
ParsedUri uri;
EXPECT(ParseUri("foo://example.com:8042/over/there?name=ferret", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT_STREQ("name=ferret", uri.query);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_WithFragment) {
ParsedUri uri;
EXPECT(ParseUri("foo://example.com:8042/over/there#fragment", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT(uri.query == NULL);
EXPECT_STREQ("fragment", uri.fragment);
}
TEST_CASE(ParseUri_WithScheme_WithQueryWithFragment) {
ParsedUri uri;
EXPECT(
ParseUri("foo://example.com:8042/over/there?name=ferret#fragment", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT_STREQ("name=ferret", uri.query);
EXPECT_STREQ("fragment", uri.fragment);
}
TEST_CASE(ParseUri_WithScheme_WithUser) {
ParsedUri uri;
EXPECT(ParseUri("foo://user@example.com:8042/over/there", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT_STREQ("user", uri.userinfo);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_ShortPath) {
ParsedUri uri;
EXPECT(ParseUri("foo://example.com:8042/", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_EmptyPath) {
ParsedUri uri;
EXPECT(ParseUri("foo://example.com:8042", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_Rootless1) {
ParsedUri uri;
EXPECT(ParseUri("foo:here", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("here", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_WithScheme_Rootless2) {
ParsedUri uri;
EXPECT(ParseUri("foo:or/here", &uri));
EXPECT_STREQ("foo", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("or/here", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_AbsPath_WithAuthority) {
ParsedUri uri;
EXPECT(ParseUri("//example.com:8042/over/there", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("example.com", uri.host);
EXPECT_STREQ("8042", uri.port);
EXPECT_STREQ("/over/there", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_AbsPath_NoAuthority) {
ParsedUri uri;
EXPECT(ParseUri("/over/there", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("/over/there", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
// Colons are permitted in path segments, in many cases.
TEST_CASE(ParseUri_NoScheme_AbsPath_StrayColon) {
ParsedUri uri;
EXPECT(ParseUri("/ov:er/there", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("/ov:er/there", uri.path);
EXPECT(uri.query == NULL);
}
TEST_CASE(ParseUri_NoScheme_Rootless1) {
ParsedUri uri;
EXPECT(ParseUri("here", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("here", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_Rootless2) {
ParsedUri uri;
EXPECT(ParseUri("or/here", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("or/here", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_Empty) {
ParsedUri uri;
EXPECT(ParseUri("", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_QueryOnly) {
ParsedUri uri;
EXPECT(ParseUri("?name=ferret", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("", uri.path);
EXPECT_STREQ("name=ferret", uri.query);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NoScheme_FragmentOnly) {
ParsedUri uri;
EXPECT(ParseUri("#fragment", &uri));
EXPECT(uri.scheme == NULL);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("", uri.path);
EXPECT(uri.query == NULL);
EXPECT_STREQ("fragment", uri.fragment);
}
TEST_CASE(ParseUri_LowerCaseScheme) {
ParsedUri uri;
EXPECT(ParseUri("ScHeMe:path", &uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("path", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NormalizeEscapes_PathQueryFragment) {
ParsedUri uri;
EXPECT(ParseUri("scheme:/This%09Is A P%61th?This%09Is A Qu%65ry#A Fr%61gment",
&uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("/This%09Is%20A%20Path", uri.path);
EXPECT_STREQ("This%09Is%20A%20Query", uri.query);
EXPECT_STREQ("A%20Fragment", uri.fragment);
}
TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapesPreferred) {
ParsedUri uri;
EXPECT(ParseUri("scheme:/%1b%1B", &uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("/%1B%1B", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NormalizeEscapes_Authority) {
ParsedUri uri;
EXPECT(ParseUri("scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT_STREQ("UsEr%20NaMe", uri.userinfo); // Normalized, case preserved.
EXPECT_STREQ("host.com", uri.host); // Normalized, lower-cased.
EXPECT_STREQ("80", uri.port);
EXPECT_STREQ("/", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_NormalizeEscapes_UppercaseEscapeInHost) {
ParsedUri uri;
EXPECT(ParseUri("scheme://tEst%1b/", &uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT_STREQ("test%1B", uri.host); // Notice that %1B is upper-cased.
EXPECT(uri.port == NULL);
EXPECT_STREQ("/", uri.path);
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ParseUri_BrokenEscapeSequence) {
ParsedUri uri;
EXPECT(ParseUri("scheme:/%1g", &uri));
EXPECT_STREQ("scheme", uri.scheme);
EXPECT(uri.userinfo == NULL);
EXPECT(uri.host == NULL);
EXPECT(uri.port == NULL);
EXPECT_STREQ("/%1g", uri.path); // Broken sequence is unchanged.
EXPECT(uri.query == NULL);
EXPECT(uri.fragment == NULL);
}
TEST_CASE(ResolveUri_WithScheme_NoAuthorityNoQuery) {
const char* target_uri;
EXPECT(ResolveUri("rscheme:/ref/path",
"bscheme://buser@bhost:11/base/path?baseQuery",
&target_uri));
EXPECT_STREQ("rscheme:/ref/path", target_uri);
}
TEST_CASE(ResolveUri_WithScheme_WithAuthorityWithQuery) {
const char* target_uri;
EXPECT(ResolveUri("rscheme://ruser@rhost:22/ref/path?refQuery",
"bscheme://buser@bhost:11/base/path?baseQuery",
&target_uri));
EXPECT_STREQ("rscheme://ruser@rhost:22/ref/path?refQuery", target_uri);
}
TEST_CASE(ResolveUri_NoScheme_WithAuthority) {
const char* target_uri;
EXPECT(ResolveUri("//ruser@rhost:22/ref/path",
"bscheme://buser@bhost:11/base/path?baseQuery",
&target_uri));
EXPECT_STREQ("bscheme://ruser@rhost:22/ref/path", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_AbsolutePath) {
const char* target_uri;
EXPECT(ResolveUri("/ref/path", "bscheme://buser@bhost:11/base/path?baseQuery",
&target_uri));
EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePath) {
const char* target_uri;
EXPECT(ResolveUri("ref/path", "bscheme://buser@bhost:11/base/path?baseQuery",
&target_uri));
EXPECT_STREQ("bscheme://buser@bhost:11/base/ref/path", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathEmptyBasePath) {
const char* target_uri;
EXPECT(ResolveUri("ref/path", "bscheme://buser@bhost:11", &target_uri));
EXPECT_STREQ("bscheme://buser@bhost:11/ref/path", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_RelativePathWeirdBasePath) {
const char* target_uri;
EXPECT(ResolveUri("ref/path", "bscheme:base", &target_uri));
EXPECT_STREQ("bscheme:ref/path", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPath) {
const char* target_uri;
EXPECT(ResolveUri("",
"bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
&target_uri));
// Note that we drop the base fragment from the resolved uri.
EXPECT_STREQ("bscheme://buser@bhost:11/base/path?baseQuery", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithQuery) {
const char* target_uri;
EXPECT(ResolveUri("?refQuery",
"bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
&target_uri));
EXPECT_STREQ("bscheme://buser@bhost:11/base/path?refQuery", target_uri);
}
TEST_CASE(ResolveUri_NoSchemeNoAuthority_EmptyPathWithFragment) {
const char* target_uri;
EXPECT(ResolveUri("#rfragment",
"bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
&target_uri));
EXPECT_STREQ("bscheme://buser@bhost:11/base/path?baseQuery#rfragment",
target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotSegment) {
const char* target_uri;
EXPECT(ResolveUri("./refpath", "scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotSegments) {
const char* target_uri;
EXPECT(ResolveUri("././refpath", "scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/a/b/c/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveOneDotDotSegment) {
const char* target_uri;
EXPECT(ResolveUri("../refpath", "scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/a/b/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveTwoDotDotSegments) {
const char* target_uri;
EXPECT(ResolveUri("../../refpath", "scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/a/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveTooManyDotDotSegments) {
const char* target_uri;
EXPECT(ResolveUri("../../../../../../../../../refpath",
"scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft1) {
const char* target_uri;
EXPECT(ResolveUri("../../../../..", "scheme://auth/a/b/c/d", &target_uri));
EXPECT_STREQ("scheme://auth/", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsNothingLeft2) {
const char* target_uri;
EXPECT(ResolveUri(".", "scheme://auth/", &target_uri));
EXPECT_STREQ("scheme://auth/", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsInitialPrefix) {
const char* target_uri;
EXPECT(ResolveUri("../../../../refpath", "scheme://auth", &target_uri));
EXPECT_STREQ("scheme://auth/refpath", target_uri);
}
TEST_CASE(ResolveUri_RemoveDots_RemoveDotSegmentsMixed) {
const char* target_uri;
EXPECT(ResolveUri("../../1/./2/../3/4/../5/././6/../7",
"scheme://auth/a/b/c/d/e", &target_uri));
EXPECT_STREQ("scheme://auth/a/b/1/3/5/7", target_uri);
}
TEST_CASE(ResolveUri_NormalizeEscapes_PathQueryFragment) {
const char* target_uri;
EXPECT(ResolveUri("#A Fr%61gment",
"scheme:/This%09Is A P%61th?This%09Is A Qu%65ry",
&target_uri));
EXPECT_STREQ(
"scheme:/This%09Is%20A%20Path?This%09Is%20A%20Query#A%20Fragment",
target_uri);
}
TEST_CASE(ResolveUri_NormalizeEscapes_UppercaseHexPreferred) {
const char* target_uri;
EXPECT(ResolveUri("", "scheme:/%1b%1B", &target_uri));
EXPECT_STREQ("scheme:/%1B%1B", target_uri);
}
TEST_CASE(ResolveUri_NormalizeEscapes_Authority) {
const char* target_uri;
EXPECT(
ResolveUri("", "scheme://UsEr N%61%4de@h%4FsT.c%6fm:80/", &target_uri));
// userinfo is normalized and case is preserved. host is normalized
// and lower-cased.
EXPECT_STREQ("scheme://UsEr%20NaMe@host.com:80/", target_uri);
}
TEST_CASE(ResolveUri_NormalizeEscapes_BrokenEscapeSequence) {
const char* target_uri;
EXPECT(ResolveUri("", "scheme:/%1g", &target_uri));
// We don't change broken escape sequences.
EXPECT_STREQ("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";
const char* target_uri;
EXPECT(ResolveUri(data_uri,
"bscheme://buser@bhost:11/base/path?baseQuery#bfragment",
&target_uri));
EXPECT_STREQ(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) {
const char* target_uri;
EXPECT(!ResolveUri("../r1", "b1/b2", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("..", "b1/b2", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("../..", "b1/b2", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("../../..", "b1/b2", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("../../../r1", "b1/b2", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("../r1", "../../b1/b2/b3", &target_uri));
EXPECT(target_uri == NULL);
EXPECT(!ResolveUri("../../../r1", "../../b1/b2/b3", &target_uri));
EXPECT(target_uri == NULL);
}
static const char* TestResolve(const char* base_uri, const char* uri) {
const char* target_uri;
EXPECT(ResolveUri(uri, base_uri, &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_STREQ("g:h", TestResolve(base, "g:h"));
EXPECT_STREQ("http://a/b/c/g", TestResolve(base, "g"));
EXPECT_STREQ("http://a/b/c/g", TestResolve(base, "./g"));
EXPECT_STREQ("http://a/b/c/g/", TestResolve(base, "g/"));
EXPECT_STREQ("http://a/g", TestResolve(base, "/g"));
EXPECT_STREQ("http://g", TestResolve(base, "//g"));
EXPECT_STREQ("http://a/b/c/d;p?y", TestResolve(base, "?y"));
EXPECT_STREQ("http://a/b/c/g?y", TestResolve(base, "g?y"));
EXPECT_STREQ("http://a/b/c/d;p?q#s", TestResolve(base, "#s"));
EXPECT_STREQ("http://a/b/c/g#s", TestResolve(base, "g#s"));
EXPECT_STREQ("http://a/b/c/g?y#s", TestResolve(base, "g?y#s"));
EXPECT_STREQ("http://a/b/c/;x", TestResolve(base, ";x"));
EXPECT_STREQ("http://a/b/c/g;x", TestResolve(base, "g;x"));
EXPECT_STREQ("http://a/b/c/g;x?y#s", TestResolve(base, "g;x?y#s"));
EXPECT_STREQ("http://a/b/c/d;p?q", TestResolve(base, ""));
EXPECT_STREQ("http://a/b/c/", TestResolve(base, "."));
EXPECT_STREQ("http://a/b/c/", TestResolve(base, "./"));
EXPECT_STREQ("http://a/b/", TestResolve(base, ".."));
EXPECT_STREQ("http://a/b/", TestResolve(base, "../"));
EXPECT_STREQ("http://a/b/g", TestResolve(base, "../g"));
EXPECT_STREQ("http://a/", TestResolve(base, "../.."));
EXPECT_STREQ("http://a/", TestResolve(base, "../../"));
EXPECT_STREQ("http://a/g", TestResolve(base, "../../g"));
EXPECT_STREQ("http://a/g", TestResolve(base, "../../../g"));
EXPECT_STREQ("http://a/g", TestResolve(base, "../../../../g"));
EXPECT_STREQ("http://a/g", TestResolve(base, "/./g"));
EXPECT_STREQ("http://a/g", TestResolve(base, "/../g"));
EXPECT_STREQ("http://a/b/c/g.", TestResolve(base, "g."));
EXPECT_STREQ("http://a/b/c/.g", TestResolve(base, ".g"));
EXPECT_STREQ("http://a/b/c/g..", TestResolve(base, "g.."));
EXPECT_STREQ("http://a/b/c/..g", TestResolve(base, "..g"));
EXPECT_STREQ("http://a/b/g", TestResolve(base, "./../g"));
EXPECT_STREQ("http://a/b/c/g/", TestResolve(base, "./g/."));
EXPECT_STREQ("http://a/b/c/g/h", TestResolve(base, "g/./h"));
EXPECT_STREQ("http://a/b/c/h", TestResolve(base, "g/../h"));
EXPECT_STREQ("http://a/b/c/g;x=1/y", TestResolve(base, "g;x=1/./y"));
EXPECT_STREQ("http://a/b/c/y", TestResolve(base, "g;x=1/../y"));
EXPECT_STREQ("http://a/b/c/g?y/./x", TestResolve(base, "g?y/./x"));
EXPECT_STREQ("http://a/b/c/g?y/../x", TestResolve(base, "g?y/../x"));
EXPECT_STREQ("http://a/b/c/g#s/./x", TestResolve(base, "g#s/./x"));
EXPECT_STREQ("http://a/b/c/g#s/../x", TestResolve(base, "g#s/../x"));
EXPECT_STREQ("http:g", TestResolve(base, "http:g"));
// Additional tests (not from RFC 3986).
EXPECT_STREQ("http://a/b/g;p/h;s", TestResolve(base, "../g;p/h;s"));
base = "s:a/b";
EXPECT_STREQ("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_STREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
EXPECT_STREQ("/a/g", TestResolve(base, "/a/b/c/./../../g"));
EXPECT_STREQ("/mid/6", TestResolve(base, "mid/content=5/../6"));
EXPECT_STREQ("/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
EXPECT_STREQ("/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
EXPECT_STREQ("/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
EXPECT_STREQ("/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
EXPECT_STREQ("/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
EXPECT_STREQ("/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
#define LH "http://localhost"
base = LH;
EXPECT_STREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
EXPECT_STREQ(LH "/a/g", TestResolve(base, "/a/b/c/./../../g"));
EXPECT_STREQ(LH "/mid/6", TestResolve(base, "mid/content=5/../6"));
EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "a/b/c/d/../../e"));
EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "../a/b/c/d/../../e"));
EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "./a/b/c/d/../../e"));
EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "../a/b/./c/d/../../e"));
EXPECT_STREQ(LH "/a/b/e", TestResolve(base, "./a/b/./c/d/../../e"));
EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/."));
EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/./."));
EXPECT_STREQ(LH "/a/b/e/", TestResolve(base, "./a/b/./c/d/../../e/././."));
#undef LH
}
TEST_CASE(ResolveUri_WindowsPaths_Forwardslash_NoScheme) {
EXPECT_STREQ(
"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_STREQ(
"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_STREQ(
"file:///b.dll",
TestResolve(
"file:///C:\\Users\\USERNA~1\\AppData\\Local\\Temp\\a\\out.dill",
"b.dll"));
}
} // namespace dart