blob: 2c4a06a9d4b12abe9c28ff59bf9d84c12df098ca [file] [log] [blame]
/*
* Copyright (C) 2010 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package libcore.java.net;
import junit.framework.TestCase;
import java.net.URI;
import java.net.URISyntaxException;
import libcore.util.SerializationTester;
public final class URITest extends TestCase {
public void testUriParts() throws Exception {
URI uri = new URI("http://username:password@host:8080/directory/file?query#ref");
assertEquals("http", uri.getScheme());
assertEquals("username:password@host:8080", uri.getAuthority());
assertEquals("username:password@host:8080", uri.getRawAuthority());
assertEquals("username:password", uri.getUserInfo());
assertEquals("username:password", uri.getRawUserInfo());
assertEquals("host", uri.getHost());
assertEquals(8080, uri.getPort());
assertEquals("/directory/file", uri.getPath());
assertEquals("/directory/file", uri.getRawPath());
assertEquals("query", uri.getQuery());
assertEquals("query", uri.getRawQuery());
assertEquals("ref", uri.getFragment());
assertEquals("ref", uri.getRawFragment());
assertEquals("//username:password@host:8080/directory/file?query",
uri.getSchemeSpecificPart());
assertEquals("//username:password@host:8080/directory/file?query",
uri.getRawSchemeSpecificPart());
}
public void testEqualsCaseMapping() throws Exception {
assertEquals(new URI("HTTP://localhost/foo?bar=baz#quux"),
new URI("HTTP://localhost/foo?bar=baz#quux"));
assertEquals(new URI("http://localhost/foo?bar=baz#quux"),
new URI("http://LOCALHOST/foo?bar=baz#quux"));
assertFalse(new URI("http://localhost/foo?bar=baz#quux")
.equals(new URI("http://localhost/FOO?bar=baz#quux")));
assertFalse(new URI("http://localhost/foo?bar=baz#quux")
.equals(new URI("http://localhost/foo?BAR=BAZ#quux")));
assertFalse(new URI("http://localhost/foo?bar=baz#quux")
.equals(new URI("http://localhost/foo?bar=baz#QUUX")));
}
public void testEqualsEscaping() throws Exception {
// Case insensitive when comparing escaped values, but not when
// comparing unescaped values.
assertEquals(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar"),
new URI("http://localhost/foo?bar=fooobar%E0%AE%a8%e0bar"));
assertFalse(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar").equals(
new URI("http://localhost/foo?bar=FoooBar%E0%AE%a8%e0bar")));
assertFalse(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar").equals(
new URI("http://localhost/foo?bar=fooobar%E0%AE%a8%e0BaR")));
// Last byte replaced by an unescaped value.
assertFalse(new URI("http://localhost/foo?bar=%E0%AE%A8%E0").equals(
new URI("http://localhost/foo?bar=%E0%AE%a8xxx")));
// Missing byte.
assertFalse(new URI("http://localhost/foo?bar=%E0%AE%A8%E0").equals(
new URI("http://localhost/foo?bar=%E0%AE%a8")));
}
public void testFileEqualsWithEmptyHost() throws Exception {
assertEquals(new URI("file", "", "/a/", null), new URI("file:/a/"));
assertEquals(new URI("file", null, "/a/", null), new URI("file:/a/"));
}
public void testUriSerialization() throws Exception {
String s = "aced00057372000c6a6176612e6e65742e555249ac01782e439e49ab0300014c0006737472696e6"
+ "77400124c6a6176612f6c616e672f537472696e673b787074002a687474703a2f2f757365723a706"
+ "1737340686f73742f706174682f66696c653f7175657279236861736878";
URI uri = new URI("http://user:pass@host/path/file?query#hash");
new SerializationTester<URI>(uri, s).test();
}
public void testEmptyHost() throws Exception {
URI uri = new URI("http:///path");
assertEquals(null, uri.getHost());
assertEquals("/path", uri.getPath());
}
public void testNoHost() throws Exception {
URI uri = new URI("http:/path");
assertEquals(null, uri.getHost());
assertEquals("/path", uri.getPath());
}
public void testNoPath() throws Exception {
URI uri = new URI("http://host");
assertEquals("host", uri.getHost());
assertEquals("", uri.getPath());
}
public void testEmptyHostAndNoPath() throws Exception {
try {
new URI("http://");
fail();
} catch (URISyntaxException expected) {
}
}
// http://b/26632332
public void testSingleLetterHost() throws Exception {
URI uri = new URI("http://a");
assertEquals("a", uri.getHost());
assertEquals("", uri.getPath());
}
public void testNoHostAndNoPath() throws Exception {
try {
new URI("http:");
fail();
} catch (URISyntaxException expected) {
}
}
public void testAtSignInUserInfo() throws Exception {
URI uri = new URI("http://user@userhost.com:password@host");
assertEquals("user@userhost.com:password@host", uri.getAuthority());
assertEquals(null, uri.getUserInfo());
assertEquals(null, uri.getHost());
}
public void testUserNoPassword() throws Exception {
URI uri = new URI("http://user@host");
assertEquals("user@host", uri.getAuthority());
assertEquals("user", uri.getUserInfo());
assertEquals("host", uri.getHost());
}
// http://b/26632332
public void testUserNoHost() throws Exception {
URI uri = new URI("http://user@");
assertEquals("user@", uri.getAuthority());
// from RI. this is curious
assertEquals(null, uri.getUserInfo());
assertEquals(null, uri.getHost());
}
public void testUserNoPasswordExplicitPort() throws Exception {
URI uri = new URI("http://user@host:8080");
assertEquals("user@host:8080", uri.getAuthority());
assertEquals("user", uri.getUserInfo());
assertEquals("host", uri.getHost());
assertEquals(8080, uri.getPort());
}
public void testUserPasswordHostPort() throws Exception {
URI uri = new URI("http://user:password@host:8080");
assertEquals("user:password@host:8080", uri.getAuthority());
assertEquals("user:password", uri.getUserInfo());
assertEquals("host", uri.getHost());
assertEquals(8080, uri.getPort());
}
public void testUserPasswordEmptyHostPort() throws Exception {
URI uri = new URI("http://user:password@:8080");
assertEquals("user:password@:8080", uri.getAuthority());
// from RI. this is curious
assertEquals(null, uri.getUserInfo());
assertEquals(null, uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testUserPasswordEmptyHostEmptyPort() throws Exception {
URI uri = new URI("http://user:password@:");
assertEquals("user:password@:", uri.getAuthority());
// from RI. this is curious
assertEquals(null, uri.getUserInfo());
assertEquals(null, uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testPathOnly() throws Exception {
URI uri = new URI("http://host/path");
assertEquals("host", uri.getHost());
assertEquals("/path", uri.getPath());
}
public void testQueryOnly() throws Exception {
URI uri = new URI("http://host?query");
assertEquals("host", uri.getHost());
assertEquals("", uri.getPath());
assertEquals("query", uri.getQuery());
}
public void testFragmentOnly() throws Exception {
URI uri = new URI("http://host#fragment");
assertEquals("host", uri.getHost());
assertEquals("", uri.getPath());
assertEquals(null, uri.getQuery());
assertEquals("fragment", uri.getFragment());
}
public void testAtSignInPath() throws Exception {
URI uri = new URI("http://host/file@foo");
assertEquals("/file@foo", uri.getPath());
assertEquals(null, uri.getUserInfo());
}
public void testColonInPath() throws Exception {
URI uri = new URI("http://host/file:colon");
assertEquals("/file:colon", uri.getPath());
}
public void testSlashInQuery() throws Exception {
URI uri = new URI("http://host/file?query/path");
assertEquals("/file", uri.getPath());
assertEquals("query/path", uri.getQuery());
}
public void testQuestionMarkInQuery() throws Exception {
URI uri = new URI("http://host/file?query?another");
assertEquals("/file", uri.getPath());
assertEquals("query?another", uri.getQuery());
}
public void testAtSignInQuery() throws Exception {
URI uri = new URI("http://host/file?query@at");
assertEquals("/file", uri.getPath());
assertEquals("query@at", uri.getQuery());
}
public void testColonInQuery() throws Exception {
URI uri = new URI("http://host/file?query:colon");
assertEquals("/file", uri.getPath());
assertEquals("query:colon", uri.getQuery());
}
public void testQuestionMarkInFragment() throws Exception {
URI uri = new URI("http://host/file#fragment?query");
assertEquals("/file", uri.getPath());
assertEquals(null, uri.getQuery());
assertEquals("fragment?query", uri.getFragment());
}
public void testColonInFragment() throws Exception {
URI uri = new URI("http://host/file#fragment:80");
assertEquals("/file", uri.getPath());
assertEquals(-1, uri.getPort());
assertEquals("fragment:80", uri.getFragment());
}
public void testSlashInFragment() throws Exception {
URI uri = new URI("http://host/file#fragment/path");
assertEquals("/file", uri.getPath());
assertEquals("fragment/path", uri.getFragment());
}
public void testHashInFragment() throws Exception {
try {
// This is not consistent with java.net.URL
new URI("http://host/file#fragment#another");
fail();
} catch (URISyntaxException expected) {
}
}
public void testEmptyPort() throws Exception {
URI uri = new URI("http://host:/");
assertEquals(-1, uri.getPort());
}
public void testNonNumericPort() throws Exception {
URI uri = new URI("http://host:x/");
// From the RI. This is curious
assertEquals(null, uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testNegativePort() throws Exception {
URI uri = new URI("http://host:-2/");
// From the RI. This is curious
assertEquals(null, uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testNegativePortEqualsPlaceholder() throws Exception {
URI uri = new URI("http://host:-1/");
// From the RI. This is curious
assertEquals(null, uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testRelativePathOnQuery() throws Exception {
URI base = new URI("http://host/file?query/x");
URI uri = base.resolve("another");
assertEquals("http://host/another", uri.toString());
assertEquals("/another", uri.getPath());
assertEquals(null, uri.getQuery());
assertEquals(null, uri.getFragment());
}
public void testRelativeFragmentOnQuery() throws Exception {
URI base = new URI("http://host/file?query/x#fragment");
URI uri = base.resolve("#another");
assertEquals("http://host/file?query/x#another", uri.toString());
assertEquals("/file", uri.getPath());
assertEquals("query/x", uri.getQuery());
assertEquals("another", uri.getFragment());
}
public void testPathContainsRelativeParts() throws Exception {
URI uri = new URI("http://host/a/b/../c");
// assertEquals("http://host/a/c", uri.toString()); // RI doesn't canonicalize
}
public void testRelativePathAndFragment() throws Exception {
URI base = new URI("http://host/file");
assertEquals("http://host/another#fragment", base.resolve("another#fragment").toString());
}
public void testRelativeParentDirectory() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("http://host/a/d", base.resolve("../d").toString());
}
public void testRelativeChildDirectory() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("http://host/a/b/d/e", base.resolve("d/e").toString());
}
public void testRelativeRootDirectory() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("http://host/d", base.resolve("/d").toString());
}
public void testRelativeFullUrl() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("http://host2/d/e", base.resolve("http://host2/d/e").toString());
assertEquals("https://host2/d/e", base.resolve("https://host2/d/e").toString());
}
public void testRelativeDifferentScheme() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("https://host2/d/e", base.resolve("https://host2/d/e").toString());
}
public void testRelativeDifferentAuthority() throws Exception {
URI base = new URI("http://host/a/b/c");
assertEquals("http://another/d/e", base.resolve("//another/d/e").toString());
}
public void testRelativeWithScheme() throws Exception {
URI base = new URI("http://host/a/b/c");
try {
base.resolve("http:");
fail();
} catch (IllegalArgumentException expected) {
}
assertEquals("http:/", base.resolve("http:/").toString());
}
public void testMalformedUrlsRefusedByFirefoxAndChrome() throws Exception {
URI base = new URI("http://host/a/b/c");
try {
base.resolve("http://");
fail();
} catch (IllegalArgumentException expected) {
}
try {
base.resolve("//");
fail();
} catch (IllegalArgumentException expected) {
}
try {
base.resolve("https:");
fail();
} catch (IllegalArgumentException expected) {
}
assertEquals("https:/", base.resolve("https:/").toString());
try {
base.resolve("https://");
fail();
} catch (IllegalArgumentException expected) {
}
}
public void testRfc1808NormalExamples() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
assertEquals("https:h", base.resolve("https:h").toString());
assertEquals("http://a/b/c/g", base.resolve("g").toString());
assertEquals("http://a/b/c/g", base.resolve("./g").toString());
assertEquals("http://a/b/c/g/", base.resolve("g/").toString());
assertEquals("http://a/g", base.resolve("/g").toString());
assertEquals("http://g", base.resolve("//g").toString());
assertEquals("http://a/b/c/d;p?y", base.resolve("?y").toString()); // RI fails; loses file
assertEquals("http://a/b/c/g?y", base.resolve("g?y").toString());
assertEquals("http://a/b/c/d;p?q#s", base.resolve("#s").toString());
assertEquals("http://a/b/c/g#s", base.resolve("g#s").toString());
assertEquals("http://a/b/c/g?y#s", base.resolve("g?y#s").toString());
assertEquals("http://a/b/c/;x", base.resolve(";x").toString());
assertEquals("http://a/b/c/g;x", base.resolve("g;x").toString());
assertEquals("http://a/b/c/g;x?y#s", base.resolve("g;x?y#s").toString());
assertEquals("http://a/b/c/d;p?q", base.resolve("").toString()); // RI returns http://a/b/c/
assertEquals("http://a/b/c/", base.resolve(".").toString());
assertEquals("http://a/b/c/", base.resolve("./").toString());
assertEquals("http://a/b/", base.resolve("..").toString());
assertEquals("http://a/b/", base.resolve("../").toString());
assertEquals("http://a/b/g", base.resolve("../g").toString());
assertEquals("http://a/", base.resolve("../..").toString());
assertEquals("http://a/", base.resolve("../../").toString());
assertEquals("http://a/g", base.resolve("../../g").toString());
}
public void testRfc1808AbnormalExampleTooManyDotDotSequences() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
assertEquals("http://a/g", base.resolve("../../../g").toString()); // RI doesn't normalize
assertEquals("http://a/g", base.resolve("../../../../g").toString()); // fails on RI
}
public void testRfc1808AbnormalExampleRemoveDotSegments() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
assertEquals("http://a/g", base.resolve("/./g").toString()); // RI doesn't normalize
assertEquals("http://a/g", base.resolve("/../g").toString()); // fails on RI
assertEquals("http://a/b/c/g.", base.resolve("g.").toString());
assertEquals("http://a/b/c/.g", base.resolve(".g").toString());
assertEquals("http://a/b/c/g..", base.resolve("g..").toString());
assertEquals("http://a/b/c/..g", base.resolve("..g").toString());
}
public void testRfc1808AbnormalExampleNonsensicalDots() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
assertEquals("http://a/b/g", base.resolve("./../g").toString());
assertEquals("http://a/b/c/g/", base.resolve("./g/.").toString());
assertEquals("http://a/b/c/g/h", base.resolve("g/./h").toString());
assertEquals("http://a/b/c/h", base.resolve("g/../h").toString());
assertEquals("http://a/b/c/g;x=1/y", base.resolve("g;x=1/./y").toString());
assertEquals("http://a/b/c/y", base.resolve("g;x=1/../y").toString());
}
public void testRfc1808AbnormalExampleRelativeScheme() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
URI uri = base.resolve("http:g");
assertEquals("http:g", uri.toString()); // this is an opaque URI
assertEquals(true, uri.isOpaque());
assertEquals(true, uri.isAbsolute());
}
public void testRfc1808AbnormalExampleQueryOrFragmentDots() throws Exception {
URI base = new URI("http://a/b/c/d;p?q");
assertEquals("http://a/b/c/g?y/./x", base.resolve("g?y/./x").toString());
assertEquals("http://a/b/c/g?y/../x", base.resolve("g?y/../x").toString());
assertEquals("http://a/b/c/g#s/./x", base.resolve("g#s/./x").toString());
assertEquals("http://a/b/c/g#s/../x", base.resolve("g#s/../x").toString());
}
public void testSquareBracketsInUserInfo() throws Exception {
try {
new URI("http://user:[::1]@host");
fail();
} catch (URISyntaxException expected) {
}
}
public void testFileUriExtraLeadingSlashes() throws Exception {
URI uri = new URI("file:////foo");
assertEquals(null, uri.getAuthority());
assertEquals("//foo", uri.getPath());
assertEquals("file:////foo", uri.toString());
}
public void testFileUrlWithAuthority() throws Exception {
URI uri = new URI("file://x/foo");
assertEquals("x", uri.getAuthority());
assertEquals("/foo", uri.getPath());
assertEquals("file://x/foo", uri.toString());
}
public void testEmptyAuthority() throws Exception {
URI uri = new URI("http:///foo");
assertEquals(null, uri.getAuthority());
assertEquals("/foo", uri.getPath());
assertEquals("http:///foo", uri.toString());
}
public void testHttpUrlExtraLeadingSlashes() throws Exception {
URI uri = new URI("http:////foo");
assertEquals(null, uri.getAuthority());
assertEquals("//foo", uri.getPath());
assertEquals("http:////foo", uri.toString());
}
public void testFileUrlRelativePath() throws Exception {
URI base = new URI("file:/a/b/c");
assertEquals("file:/a/b/d", base.resolve("d").toString());
}
public void testFileUrlDottedPath() throws Exception {
URI url = new URI("file:../a/b");
assertTrue(url.isOpaque());
assertNull(url.getPath());
}
/**
* Regression test for http://b/issue?id=2604061
*/
public void testParsingDotAsHostname() throws Exception {
assertEquals(null, new URI("http://./").getHost());
}
public void testSquareBracketsWithIPv4() throws Exception {
try {
new URI("http://[192.168.0.1]/");
fail();
} catch (URISyntaxException e) {
}
}
public void testSquareBracketsWithHostname() throws Exception {
try {
new URI("http://[google.com]/");
fail();
} catch (URISyntaxException e) {
}
}
public void testIPv6WithoutSquareBrackets() throws Exception {
assertEquals(null, new URI("http://fe80::1234/").getHost());
}
public void testEqualityWithNoPath() throws Exception {
assertFalse(new URI("http://android.com").equals(new URI("http://android.com/")));
}
public void testRelativize() throws Exception {
URI a = new URI("http://host/a/b");
URI b = new URI("http://host/a/b/c");
assertEquals("b/c", a.relativize(b).toString()); // RI assumes a directory
}
public void testParseServerAuthorityInvalidPortMinus() throws Exception {
URI uri = new URI("http://host:-2/");
assertEquals("host:-2", uri.getAuthority());
assertNull(uri.getHost());
assertEquals(-1, uri.getPort());
try {
uri.parseServerAuthority();
fail();
} catch (URISyntaxException expected) {
}
}
public void testParseServerAuthorityInvalidPortPlus() throws Exception {
URI uri = new URI("http://host:+2/");
assertEquals("host:+2", uri.getAuthority());
assertNull(uri.getHost());
assertEquals(-1, uri.getPort());
try {
uri.parseServerAuthority();
fail();
} catch (URISyntaxException expected) {
}
}
public void testParseServerAuthorityInvalidPortNonASCII() throws Exception {
URI uri = new URI("http://host:١٢٣/"); // 123 in arabic
assertEquals("host:١٢٣", uri.getAuthority());
assertNull(uri.getHost());
assertEquals(-1, uri.getPort());
try {
uri.parseServerAuthority();
fail();
} catch (URISyntaxException expected) {
}
}
public void testParseServerAuthorityOmittedAuthority() throws Exception {
URI uri = new URI("http:file");
uri.parseServerAuthority(); // does nothing!
assertNull(uri.getAuthority());
assertNull(uri.getHost());
assertEquals(-1, uri.getPort());
}
public void testEncodingParts() throws Exception {
URI uri = new URI("http", "user:pa55w?rd", "host", 80, "/doc|search",
"q=green robots", "over 6\"");
assertEquals("http", uri.getScheme());
assertEquals("user:pa55w?rd@host:80", uri.getAuthority());
assertEquals("user:pa55w%3Frd@host:80", uri.getRawAuthority());
assertEquals("user:pa55w?rd", uri.getUserInfo());
assertEquals("user:pa55w%3Frd", uri.getRawUserInfo());
assertEquals("/doc|search", uri.getPath());
assertEquals("/doc%7Csearch", uri.getRawPath());
assertEquals("q=green robots", uri.getQuery());
assertEquals("q=green%20robots", uri.getRawQuery());
assertEquals("over 6\"", uri.getFragment());
assertEquals("over%206%22", uri.getRawFragment());
assertEquals("//user:pa55w?rd@host:80/doc|search?q=green robots",
uri.getSchemeSpecificPart());
assertEquals("//user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots",
uri.getRawSchemeSpecificPart());
assertEquals("http://user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots#over%206%22",
uri.toString());
}
public void testSchemeCaseIsNotCanonicalized() throws Exception {
URI uri = new URI("HTTP://host/path");
assertEquals("HTTP", uri.getScheme());
}
public void testEmptyAuthorityWithPath() throws Exception {
URI uri = new URI("http:///path");
assertEquals(null, uri.getAuthority());
assertEquals("/path", uri.getPath());
}
public void testEmptyAuthorityWithQuery() throws Exception {
URI uri = new URI("http://?query");
assertEquals(null, uri.getAuthority());
assertEquals("", uri.getPath());
assertEquals("query", uri.getQuery());
}
public void testEmptyAuthorityWithFragment() throws Exception {
URI uri = new URI("http://#fragment");
assertEquals(null, uri.getAuthority());
assertEquals("", uri.getPath());
assertEquals("fragment", uri.getFragment());
}
public void testEncodingConstructorsRefuseRelativePath() throws Exception {
try {
new URI("http", "host", "relative", null);
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http", "host", "relative", null, null);
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http", null, "host", -1, "relative", null, null);
fail();
} catch (URISyntaxException expected) {
}
}
public void testEncodingConstructorsAcceptEmptyPath() throws Exception {
assertEquals("", new URI("http", "host", "", null).getPath());
assertEquals("", new URI("http", "host", "", null, null).getPath());
assertEquals("", new URI("http", null, "host", -1, "", null, null).getPath());
}
public void testResolveRelativeAndAbsolute() throws Exception {
URI absolute = new URI("http://android.com/");
URI relative = new URI("robots.txt");
assertEquals(absolute, absolute.resolve(absolute));
assertEquals(new URI("http://android.com/robots.txt"), absolute.resolve(relative));
assertEquals(absolute, relative.resolve(absolute));
assertEquals(relative, relative.resolve(relative));
}
public void testRelativizeRelativeAndAbsolute() throws Exception {
URI absolute = new URI("http://android.com/");
URI relative = new URI("robots.txt");
assertEquals(relative, absolute.relativize(new URI("http://android.com/robots.txt")));
assertEquals(new URI(""), absolute.relativize(absolute));
assertEquals(relative, absolute.relativize(relative));
assertEquals(absolute, relative.relativize(absolute));
assertEquals(new URI(""), relative.relativize(relative));
}
public void testPartContainsSpace() throws Exception {
try {
new URI("ht tp://host/");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://user name@host/");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://ho st/");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://host:80 80/");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://host/fi le");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://host/file?que ry");
fail();
} catch (URISyntaxException expected) {
}
try {
new URI("http://host/file?query#re f");
fail();
} catch (URISyntaxException expected) {
}
}
// http://code.google.com/p/android/issues/detail?id=37577
// http://b/18023709
// http://b/17579865
// http://b/18016625
public void testUnderscore() throws Exception {
URI uri = new URI("http://a_b.c.d.net/");
assertEquals("a_b.c.d.net", uri.getAuthority());
// The RFC's don't permit underscores in hostnames, but URI has to because
// a certain large website doesn't seem to care about standards and specs.
assertEquals("a_b.c.d.net", uri.getHost());
}
// RFC1034#section-3.5 doesn't permit empty labels in hostnames, but we
// accepted this prior to N and the behavior is used by some apps. We need
// to keep the behavior for now for compatibility.
// http://b/25991669
public void testHostWithEmptyLabel() throws Exception {
assertEquals(".example.com", new URI("http://.example.com/").getHost());
assertEquals("example..com", new URI("http://example..com/").getHost());
}
// Adding a new test? Consider adding an equivalent test to URLTest.java
}