Home | History | Annotate | Download | only in net
      1 /*
      2  * Copyright (C) 2010 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 package libcore.java.net;
     18 
     19 import junit.framework.TestCase;
     20 import java.net.URI;
     21 import java.net.URISyntaxException;
     22 import libcore.util.SerializationTester;
     23 
     24 public final class URITest extends TestCase {
     25 
     26     public void testUriParts() throws Exception {
     27         URI uri = new URI("http://username:password@host:8080/directory/file?query#ref");
     28         assertEquals("http", uri.getScheme());
     29         assertEquals("username:password@host:8080", uri.getAuthority());
     30         assertEquals("username:password@host:8080", uri.getRawAuthority());
     31         assertEquals("username:password", uri.getUserInfo());
     32         assertEquals("username:password", uri.getRawUserInfo());
     33         assertEquals("host", uri.getHost());
     34         assertEquals(8080, uri.getPort());
     35         assertEquals("/directory/file", uri.getPath());
     36         assertEquals("/directory/file", uri.getRawPath());
     37         assertEquals("query", uri.getQuery());
     38         assertEquals("query", uri.getRawQuery());
     39         assertEquals("ref", uri.getFragment());
     40         assertEquals("ref", uri.getRawFragment());
     41         assertEquals("//username:password@host:8080/directory/file?query",
     42                 uri.getSchemeSpecificPart());
     43         assertEquals("//username:password@host:8080/directory/file?query",
     44                 uri.getRawSchemeSpecificPart());
     45     }
     46 
     47     public void testEqualsCaseMapping() throws Exception {
     48         assertEquals(new URI("HTTP://localhost/foo?bar=baz#quux"),
     49                 new URI("HTTP://localhost/foo?bar=baz#quux"));
     50         assertEquals(new URI("http://localhost/foo?bar=baz#quux"),
     51                 new URI("http://LOCALHOST/foo?bar=baz#quux"));
     52         assertFalse(new URI("http://localhost/foo?bar=baz#quux")
     53                 .equals(new URI("http://localhost/FOO?bar=baz#quux")));
     54         assertFalse(new URI("http://localhost/foo?bar=baz#quux")
     55                 .equals(new URI("http://localhost/foo?BAR=BAZ#quux")));
     56         assertFalse(new URI("http://localhost/foo?bar=baz#quux")
     57                 .equals(new URI("http://localhost/foo?bar=baz#QUUX")));
     58     }
     59 
     60     public void testEqualsEscaping() throws Exception {
     61         // Case insensitive when comparing escaped values, but not when
     62         // comparing unescaped values.
     63         assertEquals(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar"),
     64                 new URI("http://localhost/foo?bar=fooobar%E0%AE%a8%e0bar"));
     65         assertFalse(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar").equals(
     66                 new URI("http://localhost/foo?bar=FoooBar%E0%AE%a8%e0bar")));
     67         assertFalse(new URI("http://localhost/foo?bar=fooobar%E0%AE%A8%E0bar").equals(
     68                 new URI("http://localhost/foo?bar=fooobar%E0%AE%a8%e0BaR")));
     69 
     70         // Last byte replaced by an unescaped value.
     71         assertFalse(new URI("http://localhost/foo?bar=%E0%AE%A8%E0").equals(
     72                 new URI("http://localhost/foo?bar=%E0%AE%a8xxx")));
     73         // Missing byte.
     74         assertFalse(new URI("http://localhost/foo?bar=%E0%AE%A8%E0").equals(
     75                 new URI("http://localhost/foo?bar=%E0%AE%a8")));
     76     }
     77 
     78     public void testFileEqualsWithEmptyHost() throws Exception {
     79         assertEquals(new URI("file", "", "/a/", null), new URI("file:/a/"));
     80         assertEquals(new URI("file", null, "/a/", null), new URI("file:/a/"));
     81     }
     82 
     83     public void testUriSerialization() throws Exception {
     84         String s = "aced00057372000c6a6176612e6e65742e555249ac01782e439e49ab0300014c0006737472696e6"
     85                 + "77400124c6a6176612f6c616e672f537472696e673b787074002a687474703a2f2f757365723a706"
     86                 + "1737340686f73742f706174682f66696c653f7175657279236861736878";
     87         URI uri = new URI("http://user:pass@host/path/file?query#hash");
     88         new SerializationTester<URI>(uri, s).test();
     89     }
     90 
     91     public void testEmptyHost() throws Exception {
     92         URI uri = new URI("http:///path");
     93         assertEquals(null, uri.getHost());
     94         assertEquals("/path", uri.getPath());
     95     }
     96 
     97     public void testNoHost() throws Exception {
     98         URI uri = new URI("http:/path");
     99         assertEquals(null, uri.getHost());
    100         assertEquals("/path", uri.getPath());
    101     }
    102 
    103     public void testNoPath() throws Exception {
    104         URI uri = new URI("http://host");
    105         assertEquals("host", uri.getHost());
    106         assertEquals("", uri.getPath());
    107     }
    108 
    109     public void testEmptyHostAndNoPath() throws Exception {
    110         try {
    111             new URI("http://");
    112             fail();
    113         } catch (URISyntaxException expected) {
    114         }
    115     }
    116 
    117     // http://b/26632332
    118     public void testSingleLetterHost() throws Exception {
    119         URI uri = new URI("http://a");
    120         assertEquals("a", uri.getHost());
    121         assertEquals("", uri.getPath());
    122     }
    123 
    124     public void testNoHostAndNoPath() throws Exception {
    125         try {
    126             new URI("http:");
    127             fail();
    128         } catch (URISyntaxException expected) {
    129         }
    130     }
    131 
    132     public void testAtSignInUserInfo() throws Exception {
    133         URI uri = new URI("http://user@userhost.com:password@host");
    134         assertEquals("user (at) userhost.com:password@host", uri.getAuthority());
    135         assertEquals(null, uri.getUserInfo());
    136         assertEquals(null, uri.getHost());
    137     }
    138 
    139     public void testUserNoPassword() throws Exception {
    140         URI uri = new URI("http://user@host");
    141         assertEquals("user@host", uri.getAuthority());
    142         assertEquals("user", uri.getUserInfo());
    143         assertEquals("host", uri.getHost());
    144     }
    145 
    146     // http://b/26632332
    147     public void testUserNoHost() throws Exception {
    148         URI uri = new URI("http://user@");
    149         assertEquals("user@", uri.getAuthority());
    150         // from RI. this is curious
    151         assertEquals(null, uri.getUserInfo());
    152         assertEquals(null, uri.getHost());
    153     }
    154 
    155     public void testUserNoPasswordExplicitPort() throws Exception {
    156         URI uri = new URI("http://user@host:8080");
    157         assertEquals("user@host:8080", uri.getAuthority());
    158         assertEquals("user", uri.getUserInfo());
    159         assertEquals("host", uri.getHost());
    160         assertEquals(8080, uri.getPort());
    161     }
    162 
    163     public void testUserPasswordHostPort() throws Exception {
    164         URI uri = new URI("http://user:password@host:8080");
    165         assertEquals("user:password@host:8080", uri.getAuthority());
    166         assertEquals("user:password", uri.getUserInfo());
    167         assertEquals("host", uri.getHost());
    168         assertEquals(8080, uri.getPort());
    169     }
    170 
    171     public void testUserPasswordEmptyHostPort() throws Exception {
    172         URI uri = new URI("http://user:password@:8080");
    173         assertEquals("user:password@:8080", uri.getAuthority());
    174         // from RI. this is curious
    175         assertEquals(null, uri.getUserInfo());
    176         assertEquals(null, uri.getHost());
    177         assertEquals(-1, uri.getPort());
    178     }
    179 
    180     public void testUserPasswordEmptyHostEmptyPort() throws Exception {
    181         URI uri = new URI("http://user:password@:");
    182         assertEquals("user:password@:", uri.getAuthority());
    183         // from RI. this is curious
    184         assertEquals(null, uri.getUserInfo());
    185         assertEquals(null, uri.getHost());
    186         assertEquals(-1, uri.getPort());
    187     }
    188 
    189     public void testPathOnly() throws Exception {
    190         URI uri = new URI("http://host/path");
    191         assertEquals("host", uri.getHost());
    192         assertEquals("/path", uri.getPath());
    193     }
    194 
    195     public void testQueryOnly() throws Exception {
    196         URI uri = new URI("http://host?query");
    197         assertEquals("host", uri.getHost());
    198         assertEquals("", uri.getPath());
    199         assertEquals("query", uri.getQuery());
    200     }
    201 
    202     public void testFragmentOnly() throws Exception {
    203         URI uri = new URI("http://host#fragment");
    204         assertEquals("host", uri.getHost());
    205         assertEquals("", uri.getPath());
    206         assertEquals(null, uri.getQuery());
    207         assertEquals("fragment", uri.getFragment());
    208     }
    209 
    210     public void testAtSignInPath() throws Exception {
    211         URI uri = new URI("http://host/file@foo");
    212         assertEquals("/file@foo", uri.getPath());
    213         assertEquals(null, uri.getUserInfo());
    214     }
    215 
    216 
    217     public void testColonInPath() throws Exception {
    218         URI uri = new URI("http://host/file:colon");
    219         assertEquals("/file:colon", uri.getPath());
    220     }
    221 
    222     public void testSlashInQuery() throws Exception {
    223         URI uri = new URI("http://host/file?query/path");
    224         assertEquals("/file", uri.getPath());
    225         assertEquals("query/path", uri.getQuery());
    226     }
    227 
    228     public void testQuestionMarkInQuery() throws Exception {
    229         URI uri = new URI("http://host/file?query?another");
    230         assertEquals("/file", uri.getPath());
    231         assertEquals("query?another", uri.getQuery());
    232     }
    233 
    234     public void testAtSignInQuery() throws Exception {
    235         URI uri = new URI("http://host/file?query@at");
    236         assertEquals("/file", uri.getPath());
    237         assertEquals("query@at", uri.getQuery());
    238     }
    239 
    240     public void testColonInQuery() throws Exception {
    241         URI uri = new URI("http://host/file?query:colon");
    242         assertEquals("/file", uri.getPath());
    243         assertEquals("query:colon", uri.getQuery());
    244     }
    245 
    246     public void testQuestionMarkInFragment() throws Exception {
    247         URI uri = new URI("http://host/file#fragment?query");
    248         assertEquals("/file", uri.getPath());
    249         assertEquals(null, uri.getQuery());
    250         assertEquals("fragment?query", uri.getFragment());
    251     }
    252 
    253     public void testColonInFragment() throws Exception {
    254         URI uri = new URI("http://host/file#fragment:80");
    255         assertEquals("/file", uri.getPath());
    256         assertEquals(-1, uri.getPort());
    257         assertEquals("fragment:80", uri.getFragment());
    258     }
    259 
    260     public void testSlashInFragment() throws Exception {
    261         URI uri = new URI("http://host/file#fragment/path");
    262         assertEquals("/file", uri.getPath());
    263         assertEquals("fragment/path", uri.getFragment());
    264     }
    265 
    266     public void testHashInFragment() throws Exception {
    267         try {
    268             // This is not consistent with java.net.URL
    269             new URI("http://host/file#fragment#another");
    270             fail();
    271         } catch (URISyntaxException expected) {
    272         }
    273     }
    274 
    275     public void testEmptyPort() throws Exception {
    276         URI uri = new URI("http://host:/");
    277         assertEquals(-1, uri.getPort());
    278     }
    279 
    280     public void testNonNumericPort() throws Exception {
    281         URI uri = new URI("http://host:x/");
    282         // From the RI. This is curious
    283         assertEquals(null, uri.getHost());
    284         assertEquals(-1, uri.getPort());
    285     }
    286 
    287     public void testNegativePort() throws Exception {
    288         URI uri = new URI("http://host:-2/");
    289         // From the RI. This is curious
    290         assertEquals(null, uri.getHost());
    291         assertEquals(-1, uri.getPort());
    292     }
    293 
    294     public void testNegativePortEqualsPlaceholder() throws Exception {
    295         URI uri = new URI("http://host:-1/");
    296         // From the RI. This is curious
    297         assertEquals(null, uri.getHost());
    298         assertEquals(-1, uri.getPort());
    299     }
    300 
    301     public void testRelativePathOnQuery() throws Exception {
    302         URI base = new URI("http://host/file?query/x");
    303         URI uri = base.resolve("another");
    304         assertEquals("http://host/another", uri.toString());
    305         assertEquals("/another", uri.getPath());
    306         assertEquals(null, uri.getQuery());
    307         assertEquals(null, uri.getFragment());
    308     }
    309 
    310     public void testRelativeFragmentOnQuery() throws Exception {
    311         URI base = new URI("http://host/file?query/x#fragment");
    312         URI uri = base.resolve("#another");
    313         assertEquals("http://host/file?query/x#another", uri.toString());
    314         assertEquals("/file", uri.getPath());
    315         assertEquals("query/x", uri.getQuery());
    316         assertEquals("another", uri.getFragment());
    317     }
    318 
    319     public void testPathContainsRelativeParts() throws Exception {
    320         URI uri = new URI("http://host/a/b/../c");
    321 //        assertEquals("http://host/a/c", uri.toString()); // RI doesn't canonicalize
    322     }
    323 
    324     public void testRelativePathAndFragment() throws Exception {
    325         URI base = new URI("http://host/file");
    326         assertEquals("http://host/another#fragment", base.resolve("another#fragment").toString());
    327     }
    328 
    329     public void testRelativeParentDirectory() throws Exception {
    330         URI base = new URI("http://host/a/b/c");
    331         assertEquals("http://host/a/d", base.resolve("../d").toString());
    332     }
    333 
    334     public void testRelativeChildDirectory() throws Exception {
    335         URI base = new URI("http://host/a/b/c");
    336         assertEquals("http://host/a/b/d/e", base.resolve("d/e").toString());
    337     }
    338 
    339     public void testRelativeRootDirectory() throws Exception {
    340         URI base = new URI("http://host/a/b/c");
    341         assertEquals("http://host/d", base.resolve("/d").toString());
    342     }
    343 
    344     public void testRelativeFullUrl() throws Exception {
    345         URI base = new URI("http://host/a/b/c");
    346         assertEquals("http://host2/d/e", base.resolve("http://host2/d/e").toString());
    347         assertEquals("https://host2/d/e", base.resolve("https://host2/d/e").toString());
    348     }
    349 
    350     public void testRelativeDifferentScheme() throws Exception {
    351         URI base = new URI("http://host/a/b/c");
    352         assertEquals("https://host2/d/e", base.resolve("https://host2/d/e").toString());
    353     }
    354 
    355     public void testRelativeDifferentAuthority() throws Exception {
    356         URI base = new URI("http://host/a/b/c");
    357         assertEquals("http://another/d/e", base.resolve("//another/d/e").toString());
    358     }
    359 
    360     public void testRelativeWithScheme() throws Exception {
    361         URI base = new URI("http://host/a/b/c");
    362         try {
    363             base.resolve("http:");
    364             fail();
    365         } catch (IllegalArgumentException expected) {
    366         }
    367         assertEquals("http:/", base.resolve("http:/").toString());
    368     }
    369 
    370     public void testMalformedUrlsRefusedByFirefoxAndChrome() throws Exception {
    371         URI base = new URI("http://host/a/b/c");
    372         try {
    373             base.resolve("http://");
    374             fail();
    375         } catch (IllegalArgumentException expected) {
    376         }
    377         try {
    378             base.resolve("//");
    379             fail();
    380         } catch (IllegalArgumentException expected) {
    381         }
    382         try {
    383             base.resolve("https:");
    384             fail();
    385         } catch (IllegalArgumentException expected) {
    386         }
    387         assertEquals("https:/", base.resolve("https:/").toString());
    388         try {
    389             base.resolve("https://");
    390             fail();
    391         } catch (IllegalArgumentException expected) {
    392         }
    393     }
    394 
    395     public void testRfc1808NormalExamples() throws Exception {
    396         URI base = new URI("http://a/b/c/d;p?q");
    397         assertEquals("https:h", base.resolve("https:h").toString());
    398         assertEquals("http://a/b/c/g", base.resolve("g").toString());
    399         assertEquals("http://a/b/c/g", base.resolve("./g").toString());
    400         assertEquals("http://a/b/c/g/", base.resolve("g/").toString());
    401         assertEquals("http://a/g", base.resolve("/g").toString());
    402         assertEquals("http://g", base.resolve("//g").toString());
    403         assertEquals("http://a/b/c/d;p?y", base.resolve("?y").toString()); // RI fails; loses file
    404         assertEquals("http://a/b/c/g?y", base.resolve("g?y").toString());
    405         assertEquals("http://a/b/c/d;p?q#s", base.resolve("#s").toString());
    406         assertEquals("http://a/b/c/g#s", base.resolve("g#s").toString());
    407         assertEquals("http://a/b/c/g?y#s", base.resolve("g?y#s").toString());
    408         assertEquals("http://a/b/c/;x", base.resolve(";x").toString());
    409         assertEquals("http://a/b/c/g;x", base.resolve("g;x").toString());
    410         assertEquals("http://a/b/c/g;x?y#s", base.resolve("g;x?y#s").toString());
    411         assertEquals("http://a/b/c/d;p?q", base.resolve("").toString()); // RI returns http://a/b/c/
    412         assertEquals("http://a/b/c/", base.resolve(".").toString());
    413         assertEquals("http://a/b/c/", base.resolve("./").toString());
    414         assertEquals("http://a/b/", base.resolve("..").toString());
    415         assertEquals("http://a/b/", base.resolve("../").toString());
    416         assertEquals("http://a/b/g", base.resolve("../g").toString());
    417         assertEquals("http://a/", base.resolve("../..").toString());
    418         assertEquals("http://a/", base.resolve("../../").toString());
    419         assertEquals("http://a/g", base.resolve("../../g").toString());
    420     }
    421 
    422     public void testRfc1808AbnormalExampleTooManyDotDotSequences() throws Exception {
    423         URI base = new URI("http://a/b/c/d;p?q");
    424         assertEquals("http://a/g", base.resolve("../../../g").toString()); // RI doesn't normalize
    425         assertEquals("http://a/g", base.resolve("../../../../g").toString()); // fails on RI
    426     }
    427 
    428     public void testRfc1808AbnormalExampleRemoveDotSegments() throws Exception {
    429         URI base = new URI("http://a/b/c/d;p?q");
    430         assertEquals("http://a/g", base.resolve("/./g").toString()); // RI doesn't normalize
    431         assertEquals("http://a/g", base.resolve("/../g").toString()); // fails on RI
    432         assertEquals("http://a/b/c/g.", base.resolve("g.").toString());
    433         assertEquals("http://a/b/c/.g", base.resolve(".g").toString());
    434         assertEquals("http://a/b/c/g..", base.resolve("g..").toString());
    435         assertEquals("http://a/b/c/..g", base.resolve("..g").toString());
    436     }
    437 
    438     public void testRfc1808AbnormalExampleNonsensicalDots() throws Exception {
    439         URI base = new URI("http://a/b/c/d;p?q");
    440         assertEquals("http://a/b/g", base.resolve("./../g").toString());
    441         assertEquals("http://a/b/c/g/", base.resolve("./g/.").toString());
    442         assertEquals("http://a/b/c/g/h", base.resolve("g/./h").toString());
    443         assertEquals("http://a/b/c/h", base.resolve("g/../h").toString());
    444         assertEquals("http://a/b/c/g;x=1/y", base.resolve("g;x=1/./y").toString());
    445         assertEquals("http://a/b/c/y", base.resolve("g;x=1/../y").toString());
    446     }
    447 
    448     public void testRfc1808AbnormalExampleRelativeScheme() throws Exception {
    449         URI base = new URI("http://a/b/c/d;p?q");
    450         URI uri = base.resolve("http:g");
    451         assertEquals("http:g", uri.toString()); // this is an opaque URI
    452         assertEquals(true, uri.isOpaque());
    453         assertEquals(true, uri.isAbsolute());
    454     }
    455 
    456     public void testRfc1808AbnormalExampleQueryOrFragmentDots() throws Exception {
    457         URI base = new URI("http://a/b/c/d;p?q");
    458         assertEquals("http://a/b/c/g?y/./x", base.resolve("g?y/./x").toString());
    459         assertEquals("http://a/b/c/g?y/../x", base.resolve("g?y/../x").toString());
    460         assertEquals("http://a/b/c/g#s/./x", base.resolve("g#s/./x").toString());
    461         assertEquals("http://a/b/c/g#s/../x", base.resolve("g#s/../x").toString());
    462     }
    463 
    464     public void testSquareBracketsInUserInfo() throws Exception {
    465         try {
    466             new URI("http://user:[::1]@host");
    467             fail();
    468         } catch (URISyntaxException expected) {
    469         }
    470     }
    471 
    472     public void testFileUriExtraLeadingSlashes() throws Exception {
    473         URI uri = new URI("file:////foo");
    474         assertEquals(null, uri.getAuthority());
    475         assertEquals("//foo", uri.getPath());
    476         assertEquals("file:////foo", uri.toString());
    477     }
    478 
    479     public void testFileUrlWithAuthority() throws Exception {
    480         URI uri = new URI("file://x/foo");
    481         assertEquals("x", uri.getAuthority());
    482         assertEquals("/foo", uri.getPath());
    483         assertEquals("file://x/foo", uri.toString());
    484     }
    485 
    486     public void testEmptyAuthority() throws Exception {
    487         URI uri = new URI("http:///foo");
    488         assertEquals(null, uri.getAuthority());
    489         assertEquals("/foo", uri.getPath());
    490         assertEquals("http:///foo", uri.toString());
    491     }
    492 
    493     public void testHttpUrlExtraLeadingSlashes() throws Exception {
    494         URI uri = new URI("http:////foo");
    495         assertEquals(null, uri.getAuthority());
    496         assertEquals("//foo", uri.getPath());
    497         assertEquals("http:////foo", uri.toString());
    498     }
    499 
    500     public void testFileUrlRelativePath() throws Exception {
    501         URI base = new URI("file:/a/b/c");
    502         assertEquals("file:/a/b/d", base.resolve("d").toString());
    503     }
    504 
    505     public void testFileUrlDottedPath() throws Exception {
    506         URI url = new URI("file:../a/b");
    507         assertTrue(url.isOpaque());
    508         assertNull(url.getPath());
    509     }
    510 
    511     /**
    512      * Regression test for http://b/issue?id=2604061
    513      */
    514     public void testParsingDotAsHostname() throws Exception {
    515         assertEquals(null, new URI("http://./").getHost());
    516     }
    517 
    518     public void testSquareBracketsWithIPv4() throws Exception {
    519         try {
    520             new URI("http://[192.168.0.1]/");
    521             fail();
    522         } catch (URISyntaxException e) {
    523         }
    524     }
    525 
    526     public void testSquareBracketsWithHostname() throws Exception {
    527         try {
    528             new URI("http://[google.com]/");
    529             fail();
    530         } catch (URISyntaxException e) {
    531         }
    532     }
    533 
    534     public void testIPv6WithoutSquareBrackets() throws Exception {
    535         assertEquals(null, new URI("http://fe80::1234/").getHost());
    536     }
    537 
    538     public void testEqualityWithNoPath() throws Exception {
    539         assertFalse(new URI("http://android.com").equals(new URI("http://android.com/")));
    540     }
    541 
    542     public void testRelativize() throws Exception {
    543         URI a = new URI("http://host/a/b");
    544         URI b = new URI("http://host/a/b/c");
    545         assertEquals("b/c", a.relativize(b).toString()); // RI assumes a directory
    546     }
    547 
    548     public void testParseServerAuthorityInvalidPortMinus() throws Exception {
    549         URI uri = new URI("http://host:-2/");
    550         assertEquals("host:-2", uri.getAuthority());
    551         assertNull(uri.getHost());
    552         assertEquals(-1, uri.getPort());
    553         try {
    554             uri.parseServerAuthority();
    555             fail();
    556         } catch (URISyntaxException expected) {
    557         }
    558     }
    559 
    560     public void testParseServerAuthorityInvalidPortPlus() throws Exception {
    561         URI uri = new URI("http://host:+2/");
    562         assertEquals("host:+2", uri.getAuthority());
    563         assertNull(uri.getHost());
    564         assertEquals(-1, uri.getPort());
    565         try {
    566             uri.parseServerAuthority();
    567             fail();
    568         } catch (URISyntaxException expected) {
    569         }
    570     }
    571 
    572     public void testParseServerAuthorityInvalidPortNonASCII() throws Exception {
    573         URI uri = new URI("http://host:/"); // 123 in arabic
    574         assertEquals("host:", uri.getAuthority());
    575         assertNull(uri.getHost());
    576         assertEquals(-1, uri.getPort());
    577         try {
    578             uri.parseServerAuthority();
    579             fail();
    580         } catch (URISyntaxException expected) {
    581         }
    582     }
    583 
    584     public void testParseServerAuthorityOmittedAuthority() throws Exception {
    585         URI uri = new URI("http:file");
    586         uri.parseServerAuthority(); // does nothing!
    587         assertNull(uri.getAuthority());
    588         assertNull(uri.getHost());
    589         assertEquals(-1, uri.getPort());
    590     }
    591 
    592     public void testEncodingParts() throws Exception {
    593         URI uri = new URI("http", "user:pa55w?rd", "host", 80, "/doc|search",
    594                 "q=green robots", "over 6\"");
    595         assertEquals("http", uri.getScheme());
    596         assertEquals("user:pa55w?rd@host:80", uri.getAuthority());
    597         assertEquals("user:pa55w%3Frd@host:80", uri.getRawAuthority());
    598         assertEquals("user:pa55w?rd", uri.getUserInfo());
    599         assertEquals("user:pa55w%3Frd", uri.getRawUserInfo());
    600         assertEquals("/doc|search", uri.getPath());
    601         assertEquals("/doc%7Csearch", uri.getRawPath());
    602         assertEquals("q=green robots", uri.getQuery());
    603         assertEquals("q=green%20robots", uri.getRawQuery());
    604         assertEquals("over 6\"", uri.getFragment());
    605         assertEquals("over%206%22", uri.getRawFragment());
    606         assertEquals("//user:pa55w?rd@host:80/doc|search?q=green robots",
    607                 uri.getSchemeSpecificPart());
    608         assertEquals("//user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots",
    609                 uri.getRawSchemeSpecificPart());
    610         assertEquals("http://user:pa55w%3Frd@host:80/doc%7Csearch?q=green%20robots#over%206%22",
    611                 uri.toString());
    612     }
    613 
    614     public void testSchemeCaseIsNotCanonicalized() throws Exception {
    615         URI uri = new URI("HTTP://host/path");
    616         assertEquals("HTTP", uri.getScheme());
    617     }
    618 
    619     public void testEmptyAuthorityWithPath() throws Exception {
    620         URI uri = new URI("http:///path");
    621         assertEquals(null, uri.getAuthority());
    622         assertEquals("/path", uri.getPath());
    623     }
    624 
    625     public void testEmptyAuthorityWithQuery() throws Exception {
    626         URI uri = new URI("http://?query");
    627         assertEquals(null, uri.getAuthority());
    628         assertEquals("", uri.getPath());
    629         assertEquals("query", uri.getQuery());
    630     }
    631 
    632     public void testEmptyAuthorityWithFragment() throws Exception {
    633         URI uri = new URI("http://#fragment");
    634         assertEquals(null, uri.getAuthority());
    635         assertEquals("", uri.getPath());
    636         assertEquals("fragment", uri.getFragment());
    637     }
    638 
    639     public void testEncodingConstructorsRefuseRelativePath() throws Exception {
    640         try {
    641             new URI("http", "host", "relative", null);
    642             fail();
    643         } catch (URISyntaxException expected) {
    644         }
    645         try {
    646             new URI("http", "host", "relative", null, null);
    647             fail();
    648         } catch (URISyntaxException expected) {
    649         }
    650         try {
    651             new URI("http", null, "host", -1, "relative", null, null);
    652             fail();
    653         } catch (URISyntaxException expected) {
    654         }
    655     }
    656 
    657     public void testEncodingConstructorsAcceptEmptyPath() throws Exception {
    658         assertEquals("", new URI("http", "host", "", null).getPath());
    659         assertEquals("", new URI("http", "host", "", null, null).getPath());
    660         assertEquals("", new URI("http", null, "host", -1, "", null, null).getPath());
    661     }
    662 
    663     public void testResolveRelativeAndAbsolute() throws Exception {
    664         URI absolute = new URI("http://android.com/");
    665         URI relative = new URI("robots.txt");
    666         assertEquals(absolute, absolute.resolve(absolute));
    667         assertEquals(new URI("http://android.com/robots.txt"), absolute.resolve(relative));
    668         assertEquals(absolute, relative.resolve(absolute));
    669         assertEquals(relative, relative.resolve(relative));
    670     }
    671 
    672     public void testRelativizeRelativeAndAbsolute() throws Exception {
    673         URI absolute = new URI("http://android.com/");
    674         URI relative = new URI("robots.txt");
    675         assertEquals(relative, absolute.relativize(new URI("http://android.com/robots.txt")));
    676         assertEquals(new URI(""), absolute.relativize(absolute));
    677         assertEquals(relative, absolute.relativize(relative));
    678         assertEquals(absolute, relative.relativize(absolute));
    679         assertEquals(new URI(""), relative.relativize(relative));
    680     }
    681 
    682     public void testPartContainsSpace() throws Exception {
    683         try {
    684             new URI("ht tp://host/");
    685             fail();
    686         } catch (URISyntaxException expected) {
    687         }
    688         try {
    689             new URI("http://user name@host/");
    690             fail();
    691         } catch (URISyntaxException expected) {
    692         }
    693         try {
    694             new URI("http://ho st/");
    695             fail();
    696         } catch (URISyntaxException expected) {
    697         }
    698         try {
    699             new URI("http://host:80 80/");
    700             fail();
    701         } catch (URISyntaxException expected) {
    702         }
    703         try {
    704             new URI("http://host/fi le");
    705             fail();
    706         } catch (URISyntaxException expected) {
    707         }
    708         try {
    709             new URI("http://host/file?que ry");
    710             fail();
    711         } catch (URISyntaxException expected) {
    712         }
    713         try {
    714             new URI("http://host/file?query#re f");
    715             fail();
    716         } catch (URISyntaxException expected) {
    717         }
    718     }
    719 
    720     // http://code.google.com/p/android/issues/detail?id=37577
    721     // http://b/18023709
    722     // http://b/17579865
    723     // http://b/18016625
    724     public void testUnderscore() throws Exception {
    725         URI uri = new URI("http://a_b.c.d.net/");
    726         assertEquals("a_b.c.d.net", uri.getAuthority());
    727         // The RFC's don't permit underscores in hostnames, but URI has to because
    728         // a certain large website doesn't seem to care about standards and specs.
    729         assertEquals("a_b.c.d.net", uri.getHost());
    730     }
    731 
    732     // RFC1034#section-3.5 doesn't permit empty labels in hostnames. This was accepted prior to N,
    733     // but returns null in later releases.
    734     // http://b/25991669
    735     // http://b/29560247
    736     public void testHostWithEmptyLabel() throws Exception {
    737         assertNull(new URI("http://.example.com/").getHost());
    738         assertNull(new URI("http://example..com/").getHost());
    739     }
    740 
    741     public void test_JDK7171415() {
    742         URI lower, mixed;
    743         lower = URI.create("http://www.example.com/%2b");
    744         mixed = URI.create("http://wWw.ExAmPlE.com/%2B");
    745         assertTrue(lower.equals(mixed));
    746         assertEquals(lower.hashCode(), mixed.hashCode());
    747 
    748         lower = URI.create("http://www.example.com/%2bbb");
    749         mixed = URI.create("http://wWw.ExAmPlE.com/%2BbB");
    750         assertFalse(lower.equals(mixed));
    751         assertFalse(lower.hashCode() == mixed.hashCode());
    752     }
    753 
    754     // Adding a new test? Consider adding an equivalent test to URLTest.java
    755 }
    756