1 /*
2  *  Licensed to the Apache Software Foundation (ASF) under one or more
3  *  contributor license agreements.  See the NOTICE file distributed with
4  *  this work for additional information regarding copyright ownership.
5  *  The ASF licenses this file to You under the Apache License, Version 2.0
6  *  (the "License"); you may not use this file except in compliance with
7  *  the License.  You may obtain a copy of the License at
8  *
9  *     http://www.apache.org/licenses/LICENSE-2.0
10  *
11  *  Unless required by applicable law or agreed to in writing, software
12  *  distributed under the License is distributed on an "AS IS" BASIS,
13  *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  *  See the License for the specific language governing permissions and
15  *  limitations under the License.
16  */
17 
18 package org.apache.harmony.tests.java.net;
19 
20 import junit.framework.TestCase;
21 import tests.support.resource.Support_Resources;
22 import java.io.File;
23 import java.io.IOException;
24 import java.io.InputStream;
25 import java.net.MalformedURLException;
26 import java.net.Proxy;
27 import java.net.ProxySelector;
28 import java.net.SocketAddress;
29 import java.net.URI;
30 import java.net.URL;
31 import java.net.URLConnection;
32 import java.net.URLStreamHandler;
33 import java.util.ArrayList;
34 import java.util.List;
35 
36 public class URLTest extends TestCase {
37 
38     public static class MyHandler extends URLStreamHandler {
openConnection(URL u)39         protected URLConnection openConnection(URL u)
40                 throws IOException {
41             return null;
42         }
43     }
44 
45     URL u;
46 
47     URL u1;
48 
49     URL u2;
50 
51     URL u3;
52 
53     URL u4;
54 
55     URL u5;
56 
57     URL u6;
58 
59     boolean caught = false;
60 
61     static boolean isSelectCalled;
62 
63     /**
64      * java.net.URL#URL(java.lang.String)
65      */
test_ConstructorLjava_lang_String()66     public void test_ConstructorLjava_lang_String() throws IOException {
67         // Tests for multiple URL instantiation basic parsing test
68         u = new URL(
69                 "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1");
70         assertEquals("u returns a wrong protocol", "http", u.getProtocol());
71         assertEquals("u returns a wrong host", "www.yahoo1.com", u.getHost());
72         assertEquals("u returns a wrong port", 8080, u.getPort());
73         assertEquals("u returns a wrong file",
74                 "/dir1/dir2/test.cgi?point1.html", u.getFile());
75         assertEquals("u returns a wrong anchor", "anchor1", u.getRef());
76 
77         // test for no file
78         u1 = new URL("http://www.yahoo2.com:9999");
79         assertEquals("u1 returns a wrong protocol", "http", u1.getProtocol());
80         assertEquals("u1 returns a wrong host", "www.yahoo2.com", u1.getHost());
81         assertEquals("u1 returns a wrong port", 9999, u1.getPort());
82         assertTrue("u1 returns a wrong file", u1.getFile().equals(""));
83         assertNull("u1 returns a wrong anchor", u1.getRef());
84 
85         // test for no port
86         u2 = new URL(
87                 "http://www.yahoo3.com/dir1/dir2/test.cgi?point1.html#anchor1");
88         assertEquals("u2 returns a wrong protocol", "http", u2.getProtocol());
89         assertEquals("u2 returns a wrong host", "www.yahoo3.com", u2.getHost());
90         assertEquals("u2 returns a wrong port", -1, u2.getPort());
91         assertEquals("u2 returns a wrong file",
92                 "/dir1/dir2/test.cgi?point1.html", u2.getFile());
93         assertEquals("u2 returns a wrong anchor", "anchor1", u2.getRef());
94 
95         // test for no port
96         URL u2a = new URL("file://www.yahoo3.com/dir1/dir2/test.cgi#anchor1");
97         assertEquals("u2a returns a wrong protocol", "file", u2a.getProtocol());
98         assertEquals("u2a returns a wrong host", "www.yahoo3.com", u2a
99                 .getHost());
100         assertEquals("u2a returns a wrong port", -1, u2a.getPort());
101         assertEquals("u2a returns a wrong file", "/dir1/dir2/test.cgi", u2a
102                 .getFile());
103         assertEquals("u2a returns a wrong anchor", "anchor1", u2a.getRef());
104 
105         // test for no file, no port
106         u3 = new URL("http://www.yahoo4.com/");
107         assertEquals("u3 returns a wrong protocol", "http", u3.getProtocol());
108         assertEquals("u3 returns a wrong host", "www.yahoo4.com", u3.getHost());
109         assertEquals("u3 returns a wrong port", -1, u3.getPort());
110         assertEquals("u3 returns a wrong file", "/", u3.getFile());
111         assertNull("u3 returns a wrong anchor", u3.getRef());
112 
113         // test for no file, no port
114         URL u3a = new URL("file://www.yahoo4.com/");
115         assertEquals("u3a returns a wrong protocol", "file", u3a.getProtocol());
116         assertEquals("u3a returns a wrong host", "www.yahoo4.com", u3a
117                 .getHost());
118         assertEquals("u3a returns a wrong port", -1, u3a.getPort());
119         assertEquals("u3a returns a wrong file", "/", u3a.getFile());
120         assertNull("u3a returns a wrong anchor", u3a.getRef());
121 
122         // test for no file, no port
123         URL u3b = new URL("file://www.yahoo4.com");
124         assertEquals("u3b returns a wrong protocol", "file", u3b.getProtocol());
125         assertEquals("u3b returns a wrong host", "www.yahoo4.com", u3b
126                 .getHost());
127         assertEquals("u3b returns a wrong port", -1, u3b.getPort());
128         assertTrue("u3b returns a wrong file", u3b.getFile().equals(""));
129         assertNull("u3b returns a wrong anchor", u3b.getRef());
130 
131         // test for non-port ":" and wierd characters occurrences
132         u4 = new URL(
133                 "http://www.yahoo5.com/di!@$%^&*()_+r1/di:::r2/test.cgi?point1.html#anchor1");
134         assertEquals("u4 returns a wrong protocol", "http", u4.getProtocol());
135         assertEquals("u4 returns a wrong host", "www.yahoo5.com", u4.getHost());
136         assertEquals("u4 returns a wrong port", -1, u4.getPort());
137         assertEquals("u4 returns a wrong file",
138                 "/di!@$%^&*()_+r1/di:::r2/test.cgi?point1.html", u4.getFile());
139         assertEquals("u4 returns a wrong anchor", "anchor1", u4.getRef());
140 
141         u5 = new URL("file:/testing.tst");
142         assertEquals("u5 returns a wrong protocol", "file", u5.getProtocol());
143         assertTrue("u5 returns a wrong host", u5.getHost().equals(""));
144         assertEquals("u5 returns a wrong port", -1, u5.getPort());
145         assertEquals("u5 returns a wrong file", "/testing.tst", u5.getFile());
146         assertNull("u5 returns a wrong anchor", u5.getRef());
147 
148         URL u5a = new URL("file:testing.tst");
149         assertEquals("u5a returns a wrong protocol", "file", u5a.getProtocol());
150         assertTrue("u5a returns a wrong host", u5a.getHost().equals(""));
151         assertEquals("u5a returns a wrong port", -1, u5a.getPort());
152         assertEquals("u5a returns a wrong file", "testing.tst", u5a.getFile());
153         assertNull("u5a returns a wrong anchor", u5a.getRef());
154 
155         URL u6 = new URL("http://host:/file");
156         assertEquals("u6 return a wrong port", -1, u6.getPort());
157 
158         URL u7 = new URL("file:../../file.txt");
159         assertTrue("u7 returns a wrong file: " + u7.getFile(), u7.getFile()
160                 .equals("../../file.txt"));
161 
162         URL u8 = new URL("http://[fec0::1:20d:60ff:fe24:7410]:35/file.txt");
163         assertTrue("u8 returns a wrong protocol " + u8.getProtocol(), u8
164                 .getProtocol().equals("http"));
165         assertTrue("u8 returns a wrong host " + u8.getHost(), u8.getHost()
166                 .equals("[fec0::1:20d:60ff:fe24:7410]"));
167         assertTrue("u8 returns a wrong port " + u8.getPort(),
168                 u8.getPort() == 35);
169         assertTrue("u8 returns a wrong file " + u8.getFile(), u8.getFile()
170                 .equals("/file.txt"));
171         assertNull("u8 returns a wrong anchor " + u8.getRef(), u8.getRef());
172 
173         URL u9 = new URL("file://[fec0::1:20d:60ff:fe24:7410]/file.txt#sogood");
174         assertTrue("u9 returns a wrong protocol " + u9.getProtocol(), u9
175                 .getProtocol().equals("file"));
176         assertTrue("u9 returns a wrong host " + u9.getHost(), u9.getHost()
177                 .equals("[fec0::1:20d:60ff:fe24:7410]"));
178         assertTrue("u9 returns a wrong port " + u9.getPort(),
179                 u9.getPort() == -1);
180         assertTrue("u9 returns a wrong file " + u9.getFile(), u9.getFile()
181                 .equals("/file.txt"));
182         assertTrue("u9 returns a wrong anchor " + u9.getRef(), u9.getRef()
183                 .equals("sogood"));
184 
185         URL u10 = new URL("file://[fec0::1:20d:60ff:fe24:7410]");
186         assertTrue("u10 returns a wrong protocol " + u10.getProtocol(), u10
187                 .getProtocol().equals("file"));
188         assertTrue("u10 returns a wrong host " + u10.getHost(), u10.getHost()
189                 .equals("[fec0::1:20d:60ff:fe24:7410]"));
190         assertTrue("u10 returns a wrong port " + u10.getPort(),
191                 u10.getPort() == -1);
192 
193         URL u11 = new URL("file:////file.txt");
194         // Harmony returned null here
195         assertEquals("u11 returns a wrong authority", "", u11.getAuthority());
196         assertEquals("u11 returns a wrong file " + u11.getFile(), "//file.txt",
197                 u11.getFile());
198 
199         URL u12 = new URL("file:///file.txt");
200         assertTrue("u12 returns a wrong authority", u12.getAuthority().equals(
201                 ""));
202         assertTrue("u12 returns a wrong file " + u12.getFile(), u12.getFile()
203                 .equals("/file.txt"));
204 
205 
206         // test for error catching
207 
208         // Bad HTTP format - no "//"
209         u = new URL(
210                 "http:www.yahoo5.com::22/dir1/di:::r2/test.cgi?point1.html#anchor1");
211 
212         caught = false;
213         try {
214             u = new URL(
215                     "http://www.yahoo5.com::22/dir1/di:::r2/test.cgi?point1.html#anchor1");
216         } catch (MalformedURLException e) {
217             caught = true;
218         }
219         assertTrue("Should have throw MalformedURLException", caught);
220 
221         // unknown protocol
222         try {
223             u = new URL("myProtocol://www.yahoo.com:22");
224         } catch (MalformedURLException e) {
225             caught = true;
226         }
227         assertTrue("3 Failed to throw MalformedURLException", caught);
228 
229         caught = false;
230         // no protocol
231         try {
232             u = new URL("www.yahoo.com");
233         } catch (MalformedURLException e) {
234             caught = true;
235         }
236         assertTrue("4 Failed to throw MalformedURLException", caught);
237 
238         caught = false;
239 
240         URL u1 = null;
241         try {
242             // No leading or trailing spaces.
243             u1 = new URL("file:/some/path");
244             assertEquals("5 got wrong file length1", 10, u1.getFile().length());
245 
246             // Leading spaces.
247             u1 = new URL("  file:/some/path");
248             assertEquals("5 got wrong file length2", 10, u1.getFile().length());
249 
250             // Trailing spaces.
251             u1 = new URL("file:/some/path  ");
252             assertEquals("5 got wrong file length3", 10, u1.getFile().length());
253 
254             // Leading and trailing.
255             u1 = new URL("  file:/some/path ");
256             assertEquals("5 got wrong file length4", 10, u1.getFile().length());
257 
258             // in-place spaces.
259             u1 = new URL("  file:  /some/path ");
260             assertEquals("5 got wrong file length5", 12, u1.getFile().length());
261 
262         } catch (MalformedURLException e) {
263             fail("5 Did not expect the exception " + e);
264         }
265 
266         // testing jar protocol with relative path
267         // to make sure it's not canonicalized
268         try {
269             String file = "file:/a!/b/../d";
270 
271             u = new URL("jar:" + file);
272             assertEquals("Wrong file (jar protocol, relative path)", file, u
273                     .getFile());
274         } catch (MalformedURLException e) {
275             fail("Unexpected exception (jar protocol, relative path)" + e);
276         }
277     }
278 
279     /**
280      * java.net.URL#URL(java.net.URL, java.lang.String)
281      */
test_ConstructorLjava_net_URLLjava_lang_String()282     public void test_ConstructorLjava_net_URLLjava_lang_String()
283             throws Exception {
284         // Test for method java.net.URL(java.net.URL, java.lang.String)
285         u = new URL("http://www.yahoo.com");
286         URL uf = new URL("file://www.yahoo.com");
287         // basic ones
288         u1 = new URL(u, "file.java");
289         assertEquals("1 returns a wrong protocol", "http", u1.getProtocol());
290         assertEquals("1 returns a wrong host", "www.yahoo.com", u1.getHost());
291         assertEquals("1 returns a wrong port", -1, u1.getPort());
292         assertEquals("1 returns a wrong file", "/file.java", u1.getFile());
293         assertNull("1 returns a wrong anchor", u1.getRef());
294 
295         URL u1f = new URL(uf, "file.java");
296         assertEquals("1f returns a wrong protocol", "file", u1f.getProtocol());
297         assertEquals("1f returns a wrong host", "www.yahoo.com", u1f.getHost());
298         assertEquals("1f returns a wrong port", -1, u1f.getPort());
299         assertEquals("1f returns a wrong file", "/file.java", u1f.getFile());
300         assertNull("1f returns a wrong anchor", u1f.getRef());
301 
302         u1 = new URL(u, "dir1/dir2/../file.java");
303         assertEquals("3 returns a wrong protocol", "http", u1.getProtocol());
304         assertTrue("3 returns a wrong host: " + u1.getHost(), u1.getHost()
305                 .equals("www.yahoo.com"));
306         assertEquals("3 returns a wrong port", -1, u1.getPort());
307         assertEquals("3 returns a wrong file", "/dir1/file.java", u1
308                 .getFile());
309         assertNull("3 returns a wrong anchor", u1.getRef());
310 
311         u1 = new URL(u, "http:dir1/dir2/../file.java");
312         assertEquals("3a returns a wrong protocol", "http", u1.getProtocol());
313         assertEquals("3a returns a wrong host: " + u1.getHost(), "www.yahoo.com", u1.getHost());
314         assertEquals("3a returns a wrong port", -1, u1.getPort());
315         assertEquals("3a returns a wrong file", "/dir1/file.java", u1
316                 .getFile());
317         assertNull("3a returns a wrong anchor", u1.getRef());
318 
319         u = new URL("http://www.apache.org/testing/");
320         u1 = new URL(u, "file.java");
321         assertEquals("4 returns a wrong protocol", "http", u1.getProtocol());
322         assertEquals("4 returns a wrong host", "www.apache.org", u1.getHost());
323         assertEquals("4 returns a wrong port", -1, u1.getPort());
324         assertEquals("4 returns a wrong file", "/testing/file.java", u1
325                 .getFile());
326         assertNull("4 returns a wrong anchor", u1.getRef());
327 
328         uf = new URL("file://www.apache.org/testing/");
329         u1f = new URL(uf, "file.java");
330         assertEquals("4f returns a wrong protocol", "file", u1f.getProtocol());
331         assertEquals("4f returns a wrong host", "www.apache.org", u1f.getHost());
332         assertEquals("4f returns a wrong port", -1, u1f.getPort());
333         assertEquals("4f returns a wrong file", "/testing/file.java", u1f
334                 .getFile());
335         assertNull("4f returns a wrong anchor", u1f.getRef());
336 
337         uf = new URL("file:/testing/");
338         u1f = new URL(uf, "file.java");
339         assertEquals("4fa returns a wrong protocol", "file", u1f.getProtocol());
340         assertTrue("4fa returns a wrong host", u1f.getHost().equals(""));
341         assertEquals("4fa returns a wrong port", -1, u1f.getPort());
342         assertEquals("4fa returns a wrong file", "/testing/file.java", u1f
343                 .getFile());
344         assertNull("4fa returns a wrong anchor", u1f.getRef());
345 
346         uf = new URL("file:testing/");
347         u1f = new URL(uf, "file.java");
348         assertEquals("4fb returns a wrong protocol", "file", u1f.getProtocol());
349         assertTrue("4fb returns a wrong host", u1f.getHost().equals(""));
350         assertEquals("4fb returns a wrong port", -1, u1f.getPort());
351         assertEquals("4fb returns a wrong file", "testing/file.java", u1f
352                 .getFile());
353         assertNull("4fb returns a wrong anchor", u1f.getRef());
354 
355         u1f = new URL(uf, "file:file.java");
356         assertEquals("4fc returns a wrong protocol", "file", u1f.getProtocol());
357         assertTrue("4fc returns a wrong host", u1f.getHost().equals(""));
358         assertEquals("4fc returns a wrong port", -1, u1f.getPort());
359         assertEquals("4fc returns a wrong file", "testing/file.java", u1f.getFile());
360         assertNull("4fc returns a wrong anchor", u1f.getRef());
361 
362         u1f = new URL(uf, "file:");
363         assertEquals("4fd returns a wrong protocol", "file", u1f.getProtocol());
364         assertTrue("4fd returns a wrong host", u1f.getHost().equals(""));
365         assertEquals("4fd returns a wrong port", -1, u1f.getPort());
366         assertEquals("4fd returns a wrong file", "testing/", u1f.getFile());
367         assertNull("4fd returns a wrong anchor", u1f.getRef());
368 
369         u = new URL("http://www.apache.org/testing");
370         u1 = new URL(u, "file.java");
371         assertEquals("5 returns a wrong protocol", "http", u1.getProtocol());
372         assertEquals("5 returns a wrong host", "www.apache.org", u1.getHost());
373         assertEquals("5 returns a wrong port", -1, u1.getPort());
374         assertEquals("5 returns a wrong file", "/file.java", u1.getFile());
375         assertNull("5 returns a wrong anchor", u1.getRef());
376 
377         uf = new URL("file://www.apache.org/testing");
378         u1f = new URL(uf, "file.java");
379         assertEquals("5f returns a wrong protocol", "file", u1f.getProtocol());
380         assertEquals("5f returns a wrong host", "www.apache.org", u1f.getHost());
381         assertEquals("5f returns a wrong port", -1, u1f.getPort());
382         assertEquals("5f returns a wrong file", "/file.java", u1f.getFile());
383         assertNull("5f returns a wrong anchor", u1f.getRef());
384 
385         uf = new URL("file:/testing");
386         u1f = new URL(uf, "file.java");
387         assertEquals("5fa returns a wrong protocol", "file", u1f.getProtocol());
388         assertTrue("5fa returns a wrong host", u1f.getHost().equals(""));
389         assertEquals("5fa returns a wrong port", -1, u1f.getPort());
390         assertEquals("5fa returns a wrong file", "/file.java", u1f.getFile());
391         assertNull("5fa returns a wrong anchor", u1f.getRef());
392 
393         uf = new URL("file:testing");
394         u1f = new URL(uf, "file.java");
395         assertEquals("5fb returns a wrong protocol", "file", u1f.getProtocol());
396         assertTrue("5fb returns a wrong host", u1f.getHost().equals(""));
397         assertEquals("5fb returns a wrong port", -1, u1f.getPort());
398         assertEquals("5fb returns a wrong file", "file.java", u1f.getFile());
399         assertNull("5fb returns a wrong anchor", u1f.getRef());
400 
401         u = new URL("http://www.apache.org/testing/foobaz");
402         u1 = new URL(u, "/file.java");
403         assertEquals("6 returns a wrong protocol", "http", u1.getProtocol());
404         assertEquals("6 returns a wrong host", "www.apache.org", u1.getHost());
405         assertEquals("6 returns a wrong port", -1, u1.getPort());
406         assertEquals("6 returns a wrong file", "/file.java", u1.getFile());
407         assertNull("6 returns a wrong anchor", u1.getRef());
408 
409         uf = new URL("file://www.apache.org/testing/foobaz");
410         u1f = new URL(uf, "/file.java");
411         assertEquals("6f returns a wrong protocol", "file", u1f.getProtocol());
412         assertEquals("6f returns a wrong host", "www.apache.org", u1f.getHost());
413         assertEquals("6f returns a wrong port", -1, u1f.getPort());
414         assertEquals("6f returns a wrong file", "/file.java", u1f.getFile());
415         assertNull("6f returns a wrong anchor", u1f.getRef());
416 
417         u = new URL("http://www.apache.org:8000/testing/foobaz");
418         u1 = new URL(u, "/file.java");
419         assertEquals("7 returns a wrong protocol", "http", u1.getProtocol());
420         assertEquals("7 returns a wrong host", "www.apache.org", u1.getHost());
421         assertEquals("7 returns a wrong port", 8000, u1.getPort());
422         assertEquals("7 returns a wrong file", "/file.java", u1.getFile());
423         assertNull("7 returns a wrong anchor", u1.getRef());
424 
425         u = new URL("http://www.apache.org/index.html");
426         u1 = new URL(u, "#bar");
427         assertEquals("8 returns a wrong host", "www.apache.org", u1.getHost());
428         assertEquals("8 returns a wrong file", "/index.html", u1.getFile());
429         assertEquals("8 returns a wrong anchor", "bar", u1.getRef());
430 
431         u = new URL("http://www.apache.org/index.html#foo");
432         u1 = new URL(u, "http:#bar");
433         assertEquals("9 returns a wrong host", "www.apache.org", u1.getHost());
434         assertEquals("9 returns a wrong file", "/index.html", u1.getFile());
435         assertEquals("9 returns a wrong anchor", "bar", u1.getRef());
436 
437         u = new URL("http://www.apache.org/index.html");
438         u1 = new URL(u, "");
439         assertEquals("10 returns a wrong host", "www.apache.org", u1.getHost());
440         assertEquals("10 returns a wrong file", "/index.html", u1.getFile());
441         assertNull("10 returns a wrong anchor", u1.getRef());
442 
443         uf = new URL("file://www.apache.org/index.html");
444         u1f = new URL(uf, "");
445         assertEquals("10f returns a wrong host", "www.apache.org", u1.getHost());
446         assertEquals("10f returns a wrong file", "/index.html", u1.getFile());
447         assertNull("10f returns a wrong anchor", u1.getRef());
448 
449         u = new URL("http://www.apache.org/index.html");
450         u1 = new URL(u, "http://www.apache.org");
451         assertEquals("11 returns a wrong host", "www.apache.org", u1.getHost());
452         assertTrue("11 returns a wrong file", u1.getFile().equals(""));
453         assertNull("11 returns a wrong anchor", u1.getRef());
454 
455         // test for question mark processing
456         u = new URL("http://www.foo.com/d0/d1/d2/cgi-bin?foo=bar/baz");
457 
458         // test for relative file and out of bound "/../" processing
459         u1 = new URL(u, "../dir1/./dir2/../file.java");
460         assertTrue("A) returns a wrong file: " + u1.getFile(), u1.getFile()
461                 .equals("/d0/d1/dir1/file.java"));
462 
463         // test for absolute and relative file processing
464         u1 = new URL(u, "/../dir1/./dir2/../file.java");
465         assertEquals("B) returns a wrong file", "/dir1/file.java",
466                 u1.getFile());
467 
468         try {
469             // u should raise a MalFormedURLException because u, the context is
470             // null
471             u = null;
472             u1 = new URL(u, "file.java");
473             fail("didn't throw the expected MalFormedURLException");
474         } catch (MalformedURLException e) {
475             // valid
476         }
477 
478         // Regression test for HARMONY-3258
479         // testing jar context url with relative file
480         try {
481             // check that relative path with null context is not canonicalized
482             String spec = "jar:file:/a!/b/../d";
483             URL ctx = null;
484             u = new URL(ctx, spec);
485             assertEquals("1 Wrong file (jar protocol, relative path)", spec, u
486                     .toString());
487 
488             spec = "../d";
489             ctx = new URL("jar:file:/a!/b");
490             u = new URL(ctx, spec);
491             assertEquals("2 Wrong file (jar protocol, relative path)",
492                     "file:/a!/d", u.getFile());
493 
494             spec = "../d";
495             ctx = new URL("jar:file:/a!/b/c");
496             u = new URL(ctx, spec);
497             assertEquals("3 Wrong file (jar protocol, relative path)",
498                     "file:/a!/d", u.getFile());
499 
500             spec = "../d";
501             ctx = new URL("jar:file:/a!/b/c/d");
502             u = new URL(ctx, spec);
503             assertEquals("4 Wrong file (jar protocol, relative path)",
504                     "file:/a!/b/d", u.getFile());
505 
506             // added the real example
507             spec = "../pdf/PDF.settings";
508             ctx = new URL(
509                     "jar:file:/C:/Program%20Files/Netbeans-5.5/ide7/modules/org-netbeans-modules-utilities.jar!/org/netbeans/modules/utilities/Layer.xml");
510             u = new URL(ctx, spec);
511             assertEquals(
512                     "5 Wrong file (jar protocol, relative path)",
513                     "file:/C:/Program%20Files/Netbeans-5.5/ide7/modules/org-netbeans-modules-utilities.jar!/org/netbeans/modules/pdf/PDF.settings",
514                     u.getFile());
515         } catch (MalformedURLException e) {
516             fail("Testing jar protocol, relative path failed: " + e);
517         }
518     }
519 
520     /**
521      * java.net.URL#URL(java.net.URL, java.lang.String,
522      *java.net.URLStreamHandler)
523      */
test_ConstructorLjava_net_URLLjava_lang_StringLjava_net_URLStreamHandler()524     public void test_ConstructorLjava_net_URLLjava_lang_StringLjava_net_URLStreamHandler()
525             throws Exception {
526         // Test for method java.net.URL(java.net.URL, java.lang.String,
527         // java.net.URLStreamHandler)
528         u = new URL("http://www.yahoo.com");
529         // basic ones
530         u1 = new URL(u, "file.java", new MyHandler());
531         assertEquals("1 returns a wrong protocol", "http", u1.getProtocol());
532         assertEquals("1 returns a wrong host", "www.yahoo.com", u1.getHost());
533         assertEquals("1 returns a wrong port", -1, u1.getPort());
534         assertEquals("1 returns a wrong file", "/file.java", u1.getFile());
535         assertNull("1 returns a wrong anchor", u1.getRef());
536 
537         u1 = new URL(u, "systemresource:/+/FILE0/test.java", new MyHandler());
538         assertEquals("2 returns a wrong protocol", "systemresource", u1
539                 .getProtocol());
540         assertTrue("2 returns a wrong host", u1.getHost().equals(""));
541         assertEquals("2 returns a wrong port", -1, u1.getPort());
542         assertEquals("2 returns a wrong file", "/+/FILE0/test.java", u1
543                 .getFile());
544         assertNull("2 returns a wrong anchor", u1.getRef());
545 
546         u1 = new URL(u, "dir1/dir2/../file.java", null);
547         assertEquals("3 returns a wrong protocol", "http", u1.getProtocol());
548         assertEquals("3 returns a wrong host", "www.yahoo.com", u1.getHost());
549         assertEquals("3 returns a wrong port", -1, u1.getPort());
550         assertEquals("3 returns a wrong file", "/dir1/file.java", u1
551                 .getFile());
552         assertNull("3 returns a wrong anchor", u1.getRef());
553 
554         // test for question mark processing
555         u = new URL("http://www.foo.com/d0/d1/d2/cgi-bin?foo=bar/baz");
556 
557         // test for relative file and out of bound "/../" processing
558         u1 = new URL(u, "../dir1/dir2/../file.java", new MyHandler());
559         assertTrue("A) returns a wrong file: " + u1.getFile(), u1.getFile()
560                 .equals("/d0/d1/dir1/file.java"));
561 
562         // test for absolute and relative file processing
563         u1 = new URL(u, "/../dir1/dir2/../file.java", null);
564         assertEquals("B) returns a wrong file", "/dir1/file.java",
565                 u1.getFile());
566 
567         URL one;
568         try {
569             one = new URL("http://www.ibm.com");
570         } catch (MalformedURLException ex) {
571             // Should not happen.
572             throw new RuntimeException(ex.getMessage());
573         }
574         try {
575             new URL(one, (String) null);
576             fail("Specifying null spec on URL constructor should throw MalformedURLException");
577         } catch (MalformedURLException e) {
578             // expected
579         }
580 
581         try {
582             // u should raise a MalFormedURLException because u, the context is
583             // null
584             u = null;
585             u1 = new URL(u, "file.java", new MyHandler());
586         } catch (MalformedURLException e) {
587             return;
588         }
589         fail("didn't throw expected MalFormedURLException");
590     }
591 
592     /**
593      * java.net.URL#URL(java.lang.String, java.lang.String,
594      *java.lang.String)
595      */
test_ConstructorLjava_lang_StringLjava_lang_StringLjava_lang_String()596     public void test_ConstructorLjava_lang_StringLjava_lang_StringLjava_lang_String()
597             throws MalformedURLException {
598 
599         u = new URL("http", "www.yahoo.com", "test.html#foo");
600         assertEquals("http", u.getProtocol());
601         assertEquals("www.yahoo.com", u.getHost());
602         assertEquals(-1, u.getPort());
603         assertEquals("/test.html", u.getFile());
604         assertEquals("foo", u.getRef());
605 
606         // Strange behavior in reference, the hostname contains a ':' so it gets
607         // wrapped in '[', ']'
608         URL testURL = new URL("http", "www.apache.org:8080", "test.html#anch");
609         assertEquals("wrong protocol", "http", testURL.getProtocol());
610         assertEquals("wrong host", "[www.apache.org:8080]", testURL.getHost());
611         assertEquals("wrong port", -1, testURL.getPort());
612         assertEquals("wrong file", "/test.html", testURL.getFile());
613         assertEquals("wrong anchor", "anch", testURL.getRef());
614     }
615 
616     /**
617      * java.net.URL#URL(java.lang.String, java.lang.String, int,
618      *java.lang.String)
619      */
test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_String()620     public void test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_String()
621             throws MalformedURLException {
622         u = new URL("http", "www.yahoo.com", 8080, "test.html#foo");
623         assertEquals("SSIS returns a wrong protocol", "http", u.getProtocol());
624         assertEquals("SSIS returns a wrong host", "www.yahoo.com", u.getHost());
625         assertEquals("SSIS returns a wrong port", 8080, u.getPort());
626         // Libcore adds a leading "/"
627         assertEquals("SSIS returns a wrong file", "/test.html", u.getFile());
628         assertTrue("SSIS returns a wrong anchor: " + u.getRef(), u.getRef()
629                 .equals("foo"));
630 
631         // Regression for HARMONY-83
632         new URL("http", "apache.org", 123456789, "file");
633         try {
634             new URL("http", "apache.org", -123, "file");
635             fail("Assert 0: Negative port should throw exception");
636         } catch (MalformedURLException e) {
637             // expected
638         }
639 
640     }
641 
642     /**
643      * java.net.URL#URL(java.lang.String, java.lang.String, int,
644      *java.lang.String, java.net.URLStreamHandler)
645      */
test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_StringLjava_net_URLStreamHandler()646     public void test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_StringLjava_net_URLStreamHandler()
647             throws Exception {
648         // Test for method java.net.URL(java.lang.String, java.lang.String, int,
649         // java.lang.String, java.net.URLStreamHandler)
650         u = new URL("http", "www.yahoo.com", 8080, "test.html#foo", null);
651         assertEquals("SSISH1 returns a wrong protocol", "http", u.getProtocol());
652         assertEquals("SSISH1 returns a wrong host", "www.yahoo.com", u
653                 .getHost());
654         assertEquals("SSISH1 returns a wrong port", 8080, u.getPort());
655         assertEquals("SSISH1 returns a wrong file", "/test.html", u.getFile());
656         assertTrue("SSISH1 returns a wrong anchor: " + u.getRef(), u.getRef()
657                 .equals("foo"));
658 
659         u = new URL("http", "www.yahoo.com", 8080, "test.html#foo",
660                 new MyHandler());
661         assertEquals("SSISH2 returns a wrong protocol", "http", u.getProtocol());
662         assertEquals("SSISH2 returns a wrong host", "www.yahoo.com", u
663                 .getHost());
664         assertEquals("SSISH2 returns a wrong port", 8080, u.getPort());
665         assertEquals("SSISH2 returns a wrong file", "/test.html", u.getFile());
666         assertTrue("SSISH2 returns a wrong anchor: " + u.getRef(), u.getRef()
667                 .equals("foo"));
668     }
669 
670     /**
671      * java.net.URL#equals(java.lang.Object)
672      */
test_equalsLjava_lang_Object()673     public void test_equalsLjava_lang_Object() throws MalformedURLException {
674         u = new URL("http://www.apache.org:8080/dir::23??????????test.html");
675         u1 = new URL("http://www.apache.org:8080/dir::23??????????test.html");
676         assertTrue("A) equals returns false for two identical URLs", u
677                 .equals(u1));
678         assertTrue("return true for null comparison", !u1.equals(null));
679         u = new URL("ftp://www.apache.org:8080/dir::23??????????test.html");
680         assertTrue("Returned true for non-equal URLs", !u.equals(u1));
681 
682         // Regression for HARMONY-6556
683         u = new URL("file", null, 0, "/test.txt");
684         u1 = new URL("file", null, 0, "/test.txt");
685         assertEquals(u, u1);
686 
687         u = new URL("file", "first.invalid", 0, "/test.txt");
688         u1 = new URL("file", "second.invalid", 0, "/test.txt");
689         assertFalse(u.equals(u1));
690 
691         u = new URL("file", "harmony.apache.org", 0, "/test.txt");
692         u1 = new URL("file", "www.apache.org", 0, "/test.txt");
693         assertFalse(u.equals(u1));
694     }
695 
696     /**
697      * java.net.URL#sameFile(java.net.URL)
698      */
test_sameFileLjava_net_URL()699     public void test_sameFileLjava_net_URL() throws Exception {
700         // Test for method boolean java.net.URL.sameFile(java.net.URL)
701         u = new URL("http://www.yahoo.com");
702         u1 = new URL("http", "www.yahoo.com", "");
703         assertTrue("Should be the same1", u.sameFile(u1));
704         u = new URL("http://www.yahoo.com/dir1/dir2/test.html#anchor1");
705         u1 = new URL("http://www.yahoo.com/dir1/dir2/test.html#anchor2");
706         assertTrue("Should be the same ", u.sameFile(u1));
707 
708         // regression test for Harmony-1040
709         u = new URL("file", null, -1, "/d:/somedir/");
710         u1 = new URL("file:/d:/somedir/");
711         assertFalse(u.sameFile(u1));
712 
713         // regression test for Harmony-2136
714         URL url1 = new URL("file:///anyfile");
715         URL url2 = new URL("file://localhost/anyfile");
716         assertTrue(url1.sameFile(url2));
717 
718         url1 = new URL("http:///anyfile");
719         url2 = new URL("http://localhost/anyfile");
720         assertFalse(url1.sameFile(url2));
721 
722         url1 = new URL("ftp:///anyfile");
723         url2 = new URL("ftp://localhost/anyfile");
724         assertFalse(url1.sameFile(url2));
725 
726         url1 = new URL("jar:file:///anyfile.jar!/");
727         url2 = new URL("jar:file://localhost/anyfile.jar!/");
728         assertFalse(url1.sameFile(url2));
729     }
730 
731     /**
732      * java.net.URL#getContent()
733      */
test_getContent()734     public void test_getContent() {
735         // Test for method java.lang.Object java.net.URL.getContent()
736         byte[] ba;
737         InputStream is;
738         String s;
739         File resources = Support_Resources.createTempFolder();
740         try {
741             Support_Resources.copyFile(resources, null, "hyts_htmltest.html");
742             u = new URL("file", "", resources.getAbsolutePath()
743                     + "/hyts_htmltest.html");
744             u.openConnection();
745             is = (InputStream) u.getContent();
746             is.read(ba = new byte[4096]);
747             s = new String(ba);
748             assertTrue(
749                     "Incorrect content "
750                             + u
751                             + " does not contain: \" A Seemingly Non Important String \"",
752                     s.indexOf("A Seemingly Non Important String") >= 0);
753         } catch (IOException e) {
754             fail("IOException thrown : " + e.getMessage());
755         } finally {
756             // Support_Resources.deleteTempFolder(resources);
757         }
758     }
759 
760     /**
761      * java.net.URL#getContent(class[])
762      */
test_getContent_LJavaLangClass()763     public void test_getContent_LJavaLangClass() throws Exception {
764         byte[] ba;
765         InputStream is;
766         String s;
767 
768         File resources = Support_Resources.createTempFolder();
769 
770         Support_Resources.copyFile(resources, null, "hyts_htmltest.html");
771         u = new URL("file", "", resources.getAbsolutePath()
772                 + "/hyts_htmltest.html");
773         u.openConnection();
774 
775         is = (InputStream) u.getContent(new Class[] { Object.class });
776         is.read(ba = new byte[4096]);
777         s = new String(ba);
778         assertTrue("Incorrect content " + u
779                 + " does not contain: \" A Seemingly Non Important String \"",
780                 s.indexOf("A Seemingly Non Important String") >= 0);
781 
782     }
783 
784     /**
785      * java.net.URL#openConnection()
786      */
test_openConnection()787     public void test_openConnection() {
788         // Test for method java.net.URLConnection java.net.URL.openConnection()
789         try {
790             u = new URL("systemresource:/FILE4/+/types.properties");
791             URLConnection uConn = u.openConnection();
792             assertNotNull("u.openConnection() returns null", uConn);
793         } catch (Exception e) {
794         }
795     }
796 
797     /**
798      * java.net.URL#toString()
799      */
test_toString()800     public void test_toString() {
801         // Test for method java.lang.String java.net.URL.toString()
802         try {
803             u1 = new URL("http://www.yahoo2.com:9999");
804             u = new URL(
805                     "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1");
806             assertEquals(
807                     "a) Does not return the right url string",
808 
809                     "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1",
810                     u.toString());
811             assertEquals("b) Does not return the right url string",
812                     "http://www.yahoo2.com:9999", u1.toString());
813             assertTrue("c) Does not return the right url string", u
814                     .equals(new URL(u.toString())));
815         } catch (Exception e) {
816         }
817     }
818 
819     /**
820      * java.net.URL#toExternalForm()
821      */
test_toExternalForm()822     public void test_toExternalForm() {
823         // Test for method java.lang.String java.net.URL.toExternalForm()
824         try {
825             u1 = new URL("http://www.yahoo2.com:9999");
826             u = new URL(
827                     "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1");
828             assertEquals(
829                     "a) Does not return the right url string",
830 
831                     "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1",
832                     u.toString());
833             assertEquals("b) Does not return the right url string",
834                     "http://www.yahoo2.com:9999", u1.toString());
835             assertTrue("c) Does not return the right url string", u
836                     .equals(new URL(u.toString())));
837 
838             u = new URL("http:index");
839             assertEquals("2 wrong external form", "http:index", u
840                     .toExternalForm());
841 
842             u = new URL("http", null, "index");
843             assertEquals("2 wrong external form", "http:index", u
844                     .toExternalForm());
845         } catch (Exception e) {
846         }
847     }
848 
849     /**
850      * java.net.URL#getFile()
851      */
test_getFile()852     public void test_getFile() throws Exception {
853         // Test for method java.lang.String java.net.URL.getFile()
854         u = new URL("http", "www.yahoo.com:8080", 1233,
855                 "test/!@$%^&*/test.html#foo");
856         assertEquals("returns a wrong file", "/test/!@$%^&*/test.html", u
857                 .getFile());
858         u = new URL("http", "www.yahoo.com:8080", 1233, "");
859         assertTrue("returns a wrong file", u.getFile().equals(""));
860     }
861 
862     /**
863      * java.net.URL#getHost()
864      */
test_getHost()865     public void test_getHost() throws MalformedURLException {
866         // Regression for HARMONY-60
867         String ipv6Host = "FEDC:BA98:7654:3210:FEDC:BA98:7654:3210";
868         URL url = new URL("http", ipv6Host, -1, "myfile");
869         assertEquals(("[" + ipv6Host + "]"), url.getHost());
870     }
871 
872     /**
873      * java.net.URL#getPort()
874      */
test_getPort()875     public void test_getPort() throws Exception {
876         // Test for method int java.net.URL.getPort()
877         u = new URL("http://member12.c++.com:9999");
878         assertTrue("return wrong port number " + u.getPort(),
879                 u.getPort() == 9999);
880         u = new URL("http://member12.c++.com:9999/");
881         assertEquals("return wrong port number", 9999, u.getPort());
882     }
883 
884     /**
885      * @throws MalformedURLException
886      * java.net.URL#getDefaultPort()
887      */
test_getDefaultPort()888     public void test_getDefaultPort() throws MalformedURLException {
889         u = new URL("http://member12.c++.com:9999");
890         assertEquals(80, u.getDefaultPort());
891         u = new URL("ftp://member12.c++.com:9999/");
892         assertEquals(21, u.getDefaultPort());
893     }
894 
895     /**
896      * java.net.URL#getProtocol()
897      */
test_getProtocol()898     public void test_getProtocol() throws Exception {
899         // Test for method java.lang.String java.net.URL.getProtocol()
900         u = new URL("http://www.yahoo2.com:9999");
901         assertTrue("u returns a wrong protocol: " + u.getProtocol(), u
902                 .getProtocol().equals("http"));
903     }
904 
905     /**
906      * java.net.URL#getRef()
907      */
test_getRef()908     public void test_getRef() {
909         // Test for method java.lang.String java.net.URL.getRef()
910         try {
911             u1 = new URL("http://www.yahoo2.com:9999");
912             u = new URL(
913                     "http://www.yahoo1.com:8080/dir1/dir2/test.cgi?point1.html#anchor1");
914             assertEquals("returns a wrong anchor1", "anchor1", u.getRef());
915             assertNull("returns a wrong anchor2", u1.getRef());
916             u1 = new URL("http://www.yahoo2.com#ref");
917             assertEquals("returns a wrong anchor3", "ref", u1.getRef());
918             u1 = new URL("http://www.yahoo2.com/file#ref1#ref2");
919             assertEquals("returns a wrong anchor4", "ref1#ref2", u1.getRef());
920         } catch (MalformedURLException e) {
921             fail("Incorrect URL format : " + e.getMessage());
922         }
923     }
924 
925     /**
926      * java.net.URL#getAuthority()
927      */
test_getAuthority()928     public void test_getAuthority() throws MalformedURLException {
929         URL testURL = new URL("http", "hostname", 80, "/java?q1#ref");
930         assertEquals("hostname:80", testURL.getAuthority());
931         assertEquals("hostname", testURL.getHost());
932         assertNull(testURL.getUserInfo());
933         assertEquals("/java?q1", testURL.getFile());
934         assertEquals("/java", testURL.getPath());
935         assertEquals("q1", testURL.getQuery());
936         assertEquals("ref", testURL.getRef());
937 
938         testURL = new URL("http", "u:p@home", 80, "/java?q1#ref");
939         assertEquals("[u:p@home]:80", testURL.getAuthority());
940         assertEquals("[u:p@home]", testURL.getHost());
941         assertNull(testURL.getUserInfo());
942         assertEquals("/java?q1", testURL.getFile());
943         assertEquals("/java", testURL.getPath());
944         assertEquals("q1", testURL.getQuery());
945         assertEquals("ref", testURL.getRef());
946 
947         testURL = new URL("http", "home", -1, "/java");
948         assertEquals("wrong authority2", "home", testURL.getAuthority());
949         assertNull("wrong userInfo2", testURL.getUserInfo());
950         assertEquals("wrong host2", "home", testURL.getHost());
951         assertEquals("wrong file2", "/java", testURL.getFile());
952         assertEquals("wrong path2", "/java", testURL.getPath());
953         assertNull("wrong query2", testURL.getQuery());
954         assertNull("wrong ref2", testURL.getRef());
955     }
956 
957     /**
958      * java.net.URL#toURL()
959      */
test_toURI()960     public void test_toURI() throws Exception {
961         u = new URL("http://www.apache.org");
962         URI uri = u.toURI();
963         assertTrue(u.equals(uri.toURL()));
964     }
965 
966     /**
967      * java.net.URL#openConnection()
968      */
test_openConnection_FileProtocol()969     public void test_openConnection_FileProtocol() throws Exception {
970         // Regression test for Harmony-5779
971         String basedir = new File("temp.java").getAbsolutePath();
972         String fileUrlString = "file://localhost/" + basedir;
973         URLConnection conn = new URL(fileUrlString).openConnection();
974         assertEquals("file", conn.getURL().getProtocol());
975         assertEquals(new File(basedir), new File(conn.getURL().getFile()));
976 
977         String nonLocalUrlString = "file://anything/" + basedir;
978         conn = new URL(nonLocalUrlString).openConnection();
979         assertEquals("ftp", conn.getURL().getProtocol());
980         assertEquals(new File(basedir), new File(conn.getURL().getFile()));
981     }
982 
983     /**
984      * URLStreamHandler implementation class necessary for tests.
985      */
986     private class TestURLStreamHandler extends URLStreamHandler {
openConnection(URL arg0)987         public URLConnection openConnection(URL arg0) throws IOException {
988             try {
989                 return arg0.openConnection();
990             } catch (Throwable e) {
991                 return null;
992             }
993         }
994 
openConnection(URL arg0, Proxy proxy)995         public URLConnection openConnection(URL arg0, Proxy proxy)
996                 throws IOException {
997             return super.openConnection(u, proxy);
998         }
999     }
1000 
1001     /**
1002      * Check NPE throwing in constructor when protocol argument is null and
1003      * URLStreamHandler argument is initialized.
1004      */
test_ConstructorLnullLjava_lang_StringILjava_lang_StringLjava_net_URLStreamHandler()1005     public void test_ConstructorLnullLjava_lang_StringILjava_lang_StringLjava_net_URLStreamHandler()
1006             throws Exception {
1007         // Regression for HARMONY-1131
1008         TestURLStreamHandler lh = new TestURLStreamHandler();
1009 
1010         try {
1011             new URL(null, "1", 0, "file", lh);
1012             fail("NullPointerException expected, but nothing was thrown!");
1013         } catch (NullPointerException e) {
1014             // Expected NullPointerException
1015         }
1016 
1017     }
1018 
1019     /**
1020      * Check NPE throwing in constructor when protocol argument is null and
1021      * URLStreamHandler argument is null.
1022      */
test_ConstructorLnullLjava_lang_StringILjava_lang_StringLnull()1023     public void test_ConstructorLnullLjava_lang_StringILjava_lang_StringLnull()
1024             throws Exception {
1025         // Regression for HARMONY-1131
1026         try {
1027             new URL(null, "1", 0, "file", null);
1028             fail("NullPointerException expected, but nothing was thrown!");
1029         } catch (NullPointerException e) {
1030             // Expected NullPointerException
1031         }
1032     }
1033 
1034     /**
1035      * Check NPE throwing in constructor with 4 params when protocol argument is
1036      * null.
1037      */
test_ConstructorLnullLjava_lang_StringILjava_lang_String()1038     public void test_ConstructorLnullLjava_lang_StringILjava_lang_String()
1039             throws Exception {
1040         // Regression for HARMONY-1131
1041         try {
1042             new URL(null, "1", 0, "file");
1043             fail("NullPointerException expected, but nothing was thrown!");
1044         } catch (NullPointerException e) {
1045             // Expected NullPointerException
1046         }
1047     }
1048 
1049     /**
1050      * Check NPE throwing in constructor with 3 params when protocol argument is
1051      * null.
1052      */
test_ConstructorLnullLjava_lang_StringLjava_lang_String()1053     public void test_ConstructorLnullLjava_lang_StringLjava_lang_String()
1054             throws Exception {
1055         // Regression for HARMONY-1131
1056         try {
1057             new URL(null, "1", "file");
1058             fail("NullPointerException expected, but nothing was thrown!");
1059         } catch (NullPointerException e) {
1060             // Expected NullPointerException
1061         }
1062     }
1063 
test_toExternalForm_Absolute()1064     public void test_toExternalForm_Absolute() throws MalformedURLException {
1065         String strURL = "http://localhost?name=value";
1066         URL url = new URL(strURL);
1067         assertEquals(strURL, url.toExternalForm());
1068 
1069         strURL = "http://localhost?name=value/age=12";
1070         url = new URL(strURL);
1071         assertEquals(strURL, url.toExternalForm());
1072     }
1073 
test_toExternalForm_Relative()1074     public void test_toExternalForm_Relative() throws MalformedURLException {
1075         String strURL = "http://a/b/c/d;p?q";
1076         String ref = "?y";
1077         URL url = new URL(new URL(strURL), ref);
1078         assertEquals("http://a/b/c/d;p?y", url.toExternalForm());
1079     }
1080 
1081     // Regression test for HARMONY-6254
1082 
1083     // Bogus handler forces file part of URL to be null
1084     static class MyHandler2 extends URLStreamHandler {
1085 
1086         @Override
openConnection(URL arg0)1087         protected URLConnection openConnection(URL arg0) throws IOException {
1088             return null;
1089         }
1090 
1091         @Override
setURL(URL u, String protocol, String host, int port, String authority, String userInfo, String file, String query, String ref)1092         protected void setURL(URL u, String protocol, String host, int port,
1093                 String authority, String userInfo, String file, String query,
1094                 String ref) {
1095             super.setURL(u, protocol, host, port, authority, userInfo,
1096                     (String) null, query, ref);
1097         }
1098     }
1099 
1100     // Test special case of external form with null file part (HARMONY-6254)
test_toExternalForm_Null()1101     public void test_toExternalForm_Null() throws IOException {
1102         URLStreamHandler myHandler = new MyHandler2();
1103         URL url = new URL(null, "foobar://example.com/foobar", myHandler);
1104         String s = url.toExternalForm();
1105         assertEquals("Got wrong URL external form", "foobar://example.com", s);
1106     }
1107 
1108     static class MockProxySelector extends ProxySelector {
1109 
connectFailed(URI uri, SocketAddress sa, IOException ioe)1110         public void connectFailed(URI uri, SocketAddress sa, IOException ioe) {
1111             System.out.println("connection failed");
1112         }
1113 
select(URI uri)1114         public List<Proxy> select(URI uri) {
1115             isSelectCalled = true;
1116             ArrayList<Proxy> proxyList = new ArrayList<Proxy>(1);
1117             proxyList.add(Proxy.NO_PROXY);
1118             return proxyList;
1119         }
1120     }
1121 
1122     static class MyURLStreamHandler extends URLStreamHandler {
1123 
1124         @Override
openConnection(URL arg0)1125         protected URLConnection openConnection(URL arg0) throws IOException {
1126             return null;
1127         }
1128 
parse(URL url, String spec, int start, int end)1129         public void parse(URL url, String spec, int start, int end) {
1130             parseURL(url, spec, start, end);
1131         }
1132     }
1133 
1134     /**
1135      * java.net.URL#URL(String, String, String)
1136      */
test_java_protocol_handler_pkgs_prop()1137     public void test_java_protocol_handler_pkgs_prop()
1138             throws MalformedURLException {
1139         // Regression test for Harmony-3094
1140         final String HANDLER_PKGS = "java.protocol.handler.pkgs";
1141         String pkgs = System.getProperty(HANDLER_PKGS);
1142         System.setProperty(HANDLER_PKGS,
1143                 "fake|org.apache.harmony.luni.tests.java.net");
1144 
1145         try {
1146             new URL("test_protocol", "", "fake.jar");
1147         } finally {
1148             if (pkgs == null) {
1149                 System.clearProperty(HANDLER_PKGS);
1150             } else {
1151                 System.setProperty(HANDLER_PKGS, pkgs);
1152             }
1153         }
1154     }
1155 }
1156