blob: 6c2bdd0a063c8a031644d55cec1a671db72fef32 [file] [log] [blame]
// 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
// authory, 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
}
} // namespace dart