/* Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You 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 java.io.BufferedReader; import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.lang.reflect.Field; import java.net.MalformedURLException; import java.net.Proxy; import java.net.ProxySelector; import java.net.SocketAddress; import java.net.URI; import java.net.URISyntaxException; import java.net.URL; import java.net.URLConnection; import java.net.URLStreamHandler; import java.net.URLStreamHandlerFactory; import java.security.Permission; import java.util.ArrayList; import java.util.Arrays; import java.util.List; import junit.framework.TestCase; public class OldURLTest extends TestCase { private static final String helloWorldString = "Hello World"; @Override protected void setUp() throws Exception { super.setUp(); } @Override protected void tearDown() throws Exception { super.tearDown(); } public void test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_String() throws MalformedURLException { // Regression for HARMONY-83 new URL("http", "apache.org", 123456789, "file"); try { new URL("http", "apache.org", -123, "file"); fail("Assert 0: Negative port should throw exception"); } catch (MalformedURLException e) { // expected } } public void test_ConstructorLjava_lang_StringLjava_lang_StringLjava_lang_String() throws MalformedURLException { // Strange behavior in reference, the hostname contains a ':' so it gets wrapped in '[', ']' URL testURL = new URL("http", "www.apache.org:8082", "test.html#anch"); assertEquals("Assert 0: wrong protocol", "http", testURL.getProtocol()); assertEquals("Assert 1: wrong host", "[www.apache.org:8082]", testURL.getHost()); assertEquals("Assert 2: wrong port", -1, testURL.getPort()); assertEquals("Assert 3: wrong file", "/test.html", testURL.getFile()); assertEquals("Assert 4: wrong anchor", "anch", testURL.getRef()); try { new URL("hftp", "apache.org:8082", "test.html#anch"); fail("Assert 0: Invalid protocol"); } catch (MalformedURLException e) { // expected } } public void test_java_protocol_handler_pkgs_prop() throws MalformedURLException { // Regression test for Harmony-3094 final String HANDLER_PKGS = "java.protocol.handler.pkgs"; System.setProperty(HANDLER_PKGS, "fake|org.apache.harmony.luni.tests.java.net"); try { new URL("test_protocol", "", "fake.jar"); } catch (MalformedURLException e) { // expected } } public void testHashCode() throws MalformedURLException { URL testURL1 = new URL("http", "www.apache.org:8080", "test.html#anch"); URL testURL2 = new URL("http", "www.apache.org:8080", "test.html#anch"); URL changedURL = new URL("http", "www.apache.org:8082", "test.html#anch"); assertEquals("Assert 0: error in hashCode: not same", testURL1.hashCode(), testURL2.hashCode()); assertFalse("Assert 0: error in hashCode: should be same", testURL1 .hashCode() == changedURL.hashCode()); } public void testSetURLStreamHandlerFactory() throws MalformedURLException, IOException, IllegalArgumentException, IllegalAccessException { URLStreamHandlerFactory factory = new MyURLStreamHandlerFactory(); Field streamHandlerFactoryField = null; int counter = 0; File sampleFile = createTempHelloWorldFile(); URL fileURL = sampleFile.toURL(); Field[] fields = URL.class.getDeclaredFields(); for (Field f : fields) { if (URLStreamHandlerFactory.class.equals(f.getType())) { counter++; streamHandlerFactoryField = f; } } if (counter != 1) { fail("Error in test setup: not Factory found"); } streamHandlerFactoryField.setAccessible(true); URLStreamHandlerFactory old = (URLStreamHandlerFactory) streamHandlerFactoryField.get(null); try { streamHandlerFactoryField.set(null, factory); BufferedReader buf = new BufferedReader(new InputStreamReader( fileURL.openStream()), helloWorldString.getBytes().length); String nextline; while ((nextline = buf.readLine()) != null) { assertEquals(helloWorldString, nextline); } buf.close(); } finally { streamHandlerFactoryField.set(null, old); } } public void testURLString() throws MalformedURLException { URL testURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals("Assert 0: wrong protocol", "ftp", testURL.getProtocol()); assertEquals("Assert 1: wrong host", "host.dom", testURL.getHost()); assertEquals("Assert 2: wrong port", -1, testURL.getPort()); assertEquals("Assert 3: wrong userInfo", "myname", testURL .getUserInfo()); assertEquals("Assert 4: wrong path", "/etc/motd", testURL.getPath()); try { new URL("ftpmyname@host.dom/etc/motd"); fail("Assert 0: malformed URL should throw exception"); } catch (MalformedURLException e) { // expected } } public void testURLURLString() throws MalformedURLException { URL gamelan = new URL("http://www.gamelan.com/pages/"); URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html"); URL gamelanNetworkBottom = new URL(gamelanNetwork, "#BOTTOM"); assertEquals("Assert 0: wrong anchor", "BOTTOM", gamelanNetworkBottom .getRef()); assertEquals("Assert 1: wrong protocol", "http", gamelanNetworkBottom .getProtocol()); // same protocol URL gamelanNetworBottom2 = new URL(gamelanNetwork, "http://www.gamelan.com/pages/Gamelan.net.html#BOTTOM"); assertEquals(gamelanNetwork.getProtocol(), gamelanNetworBottom2.getProtocol()); // changed protocol URL gamelanNetworkBottom3 = new URL(gamelanNetwork, "ftp://www.gamelan2.com/pages/Gamelan.net.html#BOTTOM"); URL absoluteNew = new URL( "ftp://www.gamelan2.com/pages/Gamelan.net.html#BOTTOM"); assertEquals("Host of context URL instead of new URL", "ftp", gamelanNetworkBottom3.getProtocol()); assertTrue("URL is context URL instead of new URL", gamelanNetworkBottom3.sameFile(absoluteNew)); // exception testing try { u = null; u1 = new URL(u, "somefile.java"); fail("didn't throw the expected MalFormedURLException"); } catch (MalformedURLException e) { // ok } // Non existing protocol // exception testing try { u = new URL(gamelanNetwork, "someFancyNewProt://www.gamelan2.com/pages/Gamelan.net.html#BOTTOM"); assertTrue("someFancyNewProt".equalsIgnoreCase(u.getProtocol())); } catch (MalformedURLException e) { // ok } } public void testEqualsObject() throws MalformedURLException { URL testURL1 = new URL("http", "www.apache.org", 8080, "test.html"); URL wrongProto = new URL("ftp", "www.apache.org", 8080, "test.html"); URL wrongPort = new URL("http", "www.apache.org", 8082, "test.html"); URL wrongHost = new URL("http", "www.apache2.org", 8080, "test.html"); URL wrongRef = new URL("http", "www.apache.org", 8080, "test2.html#BOTTOM"); URL testURL2 = new URL("http://www.apache.org:8080/test.html"); assertFalse("Assert 0: error in equals: not same", testURL1.equals(wrongProto)); assertFalse("Assert 1: error in equals: not same", testURL1.equals(wrongPort)); assertFalse("Assert 2: error in equals: not same", testURL1.equals(wrongHost)); assertFalse("Assert 3: error in equals: not same", testURL1.equals(wrongRef)); assertEquals(testURL1, testURL2); URL testURL3 = new URL("http", "www.apache.org", "/test.html"); URL testURL4 = new URL("http://www.apache.org/test.html"); assertTrue("Assert 4: error in equals: same", testURL3.equals(testURL4)); } public void testSameFile() throws MalformedURLException { URL gamelan = new URL("file:///pages/index.html"); URL gamelanFalse = new URL("file:///pages/out/index.html"); URL gamelanNetwork = new URL(gamelan, "#BOTTOM"); assertTrue(gamelanNetwork.sameFile(gamelan)); assertFalse(gamelanNetwork.sameFile(gamelanFalse)); // non trivial test URL url = new URL("http://web2.javasoft.com/some+file.html"); URL url1 = new URL("http://web2.javasoft.com/some%20file.html"); assertFalse(url.sameFile(url1)); } public void testGetContent() throws MalformedURLException { File sampleFile = createTempHelloWorldFile(); // read content from file URL fileURL = sampleFile.toURL(); try { InputStream output = (InputStream) fileURL.getContent(); assertTrue(output.available() > 0); // ok } catch (Exception e) { fail("Did not get output type from File URL"); } //Exception test URL invalidFile = new URL("file:///nonexistenttestdir/tstfile"); try { invalidFile.getContent(); fail("Access to invalid file worked"); } catch (IOException e) { //ok } } public void testOpenStream() throws MalformedURLException, IOException { File sampleFile = createTempHelloWorldFile(); // read content from file URL fileURL = sampleFile.toURL(); BufferedReader dis = null; String inputLine; StringBuffer buf = new StringBuffer(32); try { dis = new BufferedReader( new InputStreamReader(fileURL.openStream()), 32); while ((inputLine = dis.readLine()) != null) { buf.append(inputLine); } dis.close(); } catch (IOException e) { fail("Unexpected error in test setup: " + e.getMessage()); } assertTrue("Assert 0: Nothing was read from file ", buf.length() > 0); assertEquals("Assert 1: Wrong stream content", "Hello World", buf .toString()); // exception test URL invalidFile = new URL("file:///nonexistenttestdir/tstfile"); try { dis = new BufferedReader( new InputStreamReader(invalidFile.openStream()), 32); while ((inputLine = dis.readLine()) != null) { buf.append(inputLine); } fail("Access to invalid file worked"); } catch (Exception e) { //ok } finally { dis.close(); } } public void testOpenConnection() throws MalformedURLException, IOException { File sampleFile = createTempHelloWorldFile(); byte[] ba; InputStream is; String s; u = sampleFile.toURL(); u.openConnection(); is = (InputStream) u.getContent(new Class[] { Object.class }); is.read(ba = new byte[4096]); s = new String(ba); assertTrue("Incorrect content " + u + " does not contain: \"Hello World\"", s.indexOf("Hello World") >= 0); try { URL u = new URL("https://a.xy.com/index.html"); URLConnection conn = u.openConnection(); conn.connect(); fail("Should not be able to read from this site."); } catch (IOException e) { //ok } } public void testToURI() throws MalformedURLException, URISyntaxException { String testHTTPURLString = "http://www.gamelan.com/pages/"; String testFTPURLString = "ftp://myname@host.dom/etc/motd"; URL testHTTPURL = new URL(testHTTPURLString); URL testFTPURL = new URL(testFTPURLString); URI testHTTPURI = testHTTPURL.toURI(); URI testFTPURI = testFTPURL.toURI(); assertEquals(testHTTPURI.toString(),testHTTPURLString); assertEquals(testFTPURI.toString(),testFTPURLString); //Exception test String[] constructorTestsInvalid = new String[] { "http:///a path#frag", // space char in path, not in escaped // octet form, with no host "http://host/a[path#frag", // an illegal char, not in escaped // octet form, should throw an // exception "http://host/a%path#frag", // invalid escape sequence in path "http://host/a%#frag", // incomplete escape sequence in path "http://host#a frag", // space char in fragment, not in // escaped octet form, no path "http://host/a#fr#ag", // illegal char in fragment "http:///path#fr%ag", // invalid escape sequence in fragment, // with no host "http://host/path#frag%", // incomplete escape sequence in // fragment "http://host/path?a query#frag", // space char in query, not // in escaped octet form "http://host?query%ag", // invalid escape sequence in query, no // path "http:///path?query%", // incomplete escape sequence in query, // with no host "mailto:user^name@fklkf.com" // invalid char in scheme }; for (String malformedURI : Arrays.asList(constructorTestsInvalid)) { try { URL urlQuery = new URL("http://host/a%path#frag"); urlQuery.toURI(); fail("Exception expected"); } catch (URISyntaxException e) { // ok } } } public void testToString() throws MalformedURLException { URL testHTTPURL = new URL("http://www.gamelan.com/pages/"); URL testFTPURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals(testHTTPURL.toString(),testHTTPURL.toExternalForm()); assertEquals(testFTPURL.toString(),testFTPURL.toExternalForm()); assertEquals("http://www.gamelan.com/pages/", testHTTPURL.toString()); } public void testToExternalForm() throws MalformedURLException { URL testHTTPURL = new URL("http://www.gamelan.com/pages/"); URL testFTPURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals(testHTTPURL.toString(),testHTTPURL.toExternalForm()); assertEquals(testFTPURL.toString(),testFTPURL.toExternalForm()); assertEquals("http://www.gamelan.com/pages/", testHTTPURL.toExternalForm()); } public void testGetFile() throws MalformedURLException { File sampleFile = createTempHelloWorldFile(); // read content from file URL fileURL = sampleFile.toURL(); assertNotNull(fileURL); assertEquals(sampleFile.getPath(),fileURL.getFile()); } public void testGetPort() throws MalformedURLException { URL testHTTPURL = new URL("http://www.gamelan.com/pages/"); URL testFTPURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals(-1,testFTPURL.getPort()); assertEquals(-1,testHTTPURL.getPort()); URL testHTTPURL8082 = new URL("http://www.gamelan.com:8082/pages/"); assertEquals(8082, testHTTPURL8082.getPort()); } public void testGetProtocol() throws MalformedURLException { URL testHTTPURL = new URL("http://www.gamelan.com/pages/"); URL testHTTPSURL = new URL("https://www.gamelan.com/pages/"); URL testFTPURL = new URL("ftp://myname@host.dom/etc/motd"); URL testFile = new URL("file:///pages/index.html"); URL testJarURL = new URL("jar:file:///bar.jar!/foo.jar!/Bugs/HelloWorld.class"); assertTrue("http".equalsIgnoreCase(testHTTPURL.getProtocol())); assertTrue("https".equalsIgnoreCase(testHTTPSURL.getProtocol())); assertTrue("ftp".equalsIgnoreCase(testFTPURL.getProtocol())); assertTrue("file".equalsIgnoreCase(testFile.getProtocol())); assertTrue("jar".equalsIgnoreCase(testJarURL.getProtocol())); } public void testGetRef() throws MalformedURLException { URL gamelan = new URL("http://www.gamelan.com/pages/"); String output = gamelan.getRef(); assertTrue(output == null || output.equals("")); URL gamelanNetwork = new URL(gamelan, "Gamelan.net.html#BOTTOM"); assertEquals("BOTTOM", gamelanNetwork.getRef()); URL gamelanNetwork2 = new URL("http", "www.gamelan.com", "Gamelan.network.html#BOTTOM"); assertEquals("BOTTOM", gamelanNetwork2.getRef()); } public void testGetQuery() throws MalformedURLException { URL urlQuery = new URL( "http://www.example.com/index.html?attrib1=value1&attrib2=value&attrib3#anchor"); URL urlNoQuery = new URL( "http://www.example.com/index.html#anchor"); assertEquals("attrib1=value1&attrib2=value&attrib3", urlQuery.getQuery()); String output = urlNoQuery.getQuery(); assertTrue(output == null || "".equals(output)); } public void testGetPath() throws MalformedURLException { URL url = new URL("http://www.example.com"); String output = url.getPath(); assertTrue("".equals(output) || output == null); URL url2 = new URL(url,"/foo/index.html"); assertEquals("/foo/index.html",url2.getPath()); } public void testGetUserInfo() throws MalformedURLException { URL urlNoUserInfo = new URL("http://www.java2s.com:8080"); URL url = new URL("ftp://myUser:password@host.dom/etc/motd"); assertEquals("Assert 0: Wrong user","myUser:password",url.getUserInfo()); String userInfo = urlNoUserInfo.getUserInfo(); assertTrue("".equals(userInfo) || null == userInfo); } public void testGetAuthority() throws MalformedURLException, URISyntaxException { // legal authority information userInfo (user,password),domain,port URL url = new URL("http://www.java2s.com:8080"); assertEquals("Assert 0: Wrong authority ", "www.java2s.com:8080", url .getAuthority()); URL ftpURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals("Assert 1: Wrong authority ", "myname@host.dom", ftpURL .getAuthority()); URI testURI = new URI("/relative/URI/with/absolute/path/to/resource.txt"); String output = testURI.getAuthority(); assertTrue("".equals(output) || null == output); } public void testGetDefaultPort() throws MalformedURLException { URL testHTTPURL = new URL("http://www.gamelan.com/pages/"); URL testFTPURL = new URL("ftp://myname@host.dom/etc/motd"); assertEquals(21,testFTPURL.getDefaultPort()); assertEquals(80,testHTTPURL.getDefaultPort()); } private File createTempHelloWorldFile() { // create content to read File tmpDir = new File(System.getProperty("java.io.tmpdir")); File sampleFile = null; try { if (tmpDir.isDirectory()) { sampleFile = File.createTempFile("openStreamTest", ".txt", tmpDir); sampleFile.deleteOnExit(); } else { fail("Error in test setup java.io.tmpdir does not exist"); } FileWriter fstream = new FileWriter(sampleFile); BufferedWriter out = new BufferedWriter(fstream, 32); out.write(helloWorldString); // Close the output stream out.close(); } catch (Exception e) {// Catch exception if any fail("Error: in test setup" + e.getMessage()); } return sampleFile; } // start HARMONY branch public static class MyHandler extends URLStreamHandler { protected URLConnection openConnection(URL u) throws IOException { return null; } } URL u; URL u1; URL u2; boolean caught = false; static boolean isSelectCalled; static class MockProxySelector extends ProxySelector { public void connectFailed(URI uri, SocketAddress sa, IOException ioe) { System.out.println("connection failed"); } public List<Proxy> select(URI uri) { isSelectCalled = true; ArrayList<Proxy> proxyList = new ArrayList<Proxy>(1); proxyList.add(Proxy.NO_PROXY); return proxyList; } } static class MockSecurityManager extends SecurityManager { public void checkConnect(String host, int port) { if ("127.0.0.1".equals(host)) { throw new SecurityException("permission is not allowed"); } } public void checkPermission(Permission permission) { if ("setSecurityManager".equals(permission.getName())) { return; } super.checkPermission(permission); } } static class MyURLStreamHandler extends URLStreamHandler { @Override protected URLConnection openConnection(URL arg0) throws IOException { try { URLConnection con = arg0.openConnection(); con.setDoInput(true); con.connect(); return con; } catch (Throwable e) { return null; } } public void parse(URL url, String spec, int start, int end) { parseURL(url, spec, start, end); } } static class MyURLStreamHandlerFactory implements URLStreamHandlerFactory { public static MyURLStreamHandler handler = new MyURLStreamHandler(); public URLStreamHandler createURLStreamHandler(String arg0) { handler = new MyURLStreamHandler(); return handler; } } /** * URLStreamHandler implementation class necessary for tests. */ private class TestURLStreamHandler extends URLStreamHandler { public URLConnection openConnection(URL arg0) throws IOException { try { URLConnection con = arg0.openConnection(); con.setDoInput(true); con.connect(); return con; } catch (Throwable e) { return null; } } public URLConnection openConnection(URL arg0, Proxy proxy) throws IOException { return super.openConnection(u, proxy); } } public void test_ConstructorLjava_lang_StringLjava_lang_StringILjava_lang_StringLjava_net_URLStreamHandler() throws Exception { u = new URL("http", "www.yahoo.com", 8080, "test.html#foo", null); assertEquals("SSISH1 returns a wrong protocol", "http", u.getProtocol()); assertEquals("SSISH1 returns a wrong host", "www.yahoo.com", u .getHost()); assertEquals("SSISH1 returns a wrong port", 8080, u.getPort()); assertEquals("SSISH1 returns a wrong file", "/test.html", u.getFile()); assertTrue("SSISH1 returns a wrong anchor: " + u.getRef(), u.getRef() .equals("foo")); u = new URL("http", "www.yahoo.com", 8080, "test.html#foo", new MyHandler()); assertEquals("SSISH2 returns a wrong protocol", "http", u.getProtocol()); assertEquals("SSISH2 returns a wrong host", "www.yahoo.com", u .getHost()); assertEquals("SSISH2 returns a wrong port", 8080, u.getPort()); assertEquals("SSISH2 returns a wrong file", "/test.html", u.getFile()); assertTrue("SSISH2 returns a wrong anchor: " + u.getRef(), u.getRef() .equals("foo")); TestURLStreamHandler lh = new TestURLStreamHandler(); u = new URL("http", "www.yahoo.com", 8080, "test.html#foo", lh); try { new URL(null, "1", 0, "file", lh); fail("Exception expected, but nothing was thrown!"); } catch (MalformedURLException e) { // ok } catch (NullPointerException e) { // Expected NullPointerException } } public void test_getContent_LJavaLangClass() throws Exception { File sampleFile = createTempHelloWorldFile(); byte[] ba; String s; InputStream is = null; try { u = new URL("file:///data/tmp/hyts_htmltest.html"); is = (InputStream) u.getContent(new Class[] {InputStream.class}); is.read(ba = new byte[4096]); fail("No error occurred reading from nonexisting file"); } catch (IOException e) { // ok } try { u = new URL("file:///data/tmp/hyts_htmltest.html"); is = (InputStream) u.getContent(new Class[] { String.class, InputStream.class}); is.read(ba = new byte[4096]); fail("No error occurred reading from nonexisting file"); } catch (IOException e) { // ok } // Check for null u = sampleFile.toURL(); u.openConnection(); assertNotNull(u); s = (String) u.getContent(new Class[] {String.class}); assertNull(s); } public void testURLURLStringURLStreamHandler() throws MalformedURLException { u = new URL("http://www.yahoo.com"); // basic ones u1 = new URL(u, "file.java", new MyHandler()); assertEquals("1 returns a wrong protocol", "http", u1.getProtocol()); assertEquals("1 returns a wrong host", "www.yahoo.com", u1.getHost()); assertEquals("1 returns a wrong port", -1, u1.getPort()); assertEquals("1 returns a wrong file", "/file.java", u1.getFile()); assertNull("1 returns a wrong anchor", u1.getRef()); u1 = new URL(u, "systemresource:/+/FILE0/test.java", new MyHandler()); assertEquals("2 returns a wrong protocol", "systemresource", u1 .getProtocol()); assertTrue("2 returns a wrong host", u1.getHost().equals("")); assertEquals("2 returns a wrong port", -1, u1.getPort()); assertEquals("2 returns a wrong file", "/+/FILE0/test.java", u1 .getFile()); assertNull("2 returns a wrong anchor", u1.getRef()); u1 = new URL(u, "dir1/dir2/../file.java", null); assertEquals("3 returns a wrong protocol", "http", u1.getProtocol()); assertEquals("3 returns a wrong host", "www.yahoo.com", u1.getHost()); assertEquals("3 returns a wrong port", -1, u1.getPort()); assertEquals("3 returns a wrong file", "/dir1/file.java", u1.getFile()); assertNull("3 returns a wrong anchor", u1.getRef()); // test for question mark processing u = new URL("http://www.foo.com/d0/d1/d2/cgi-bin?foo=bar/baz"); // test for relative file and out of bound "/../" processing u1 = new URL(u, "../dir1/dir2/../file.java", new MyHandler()); assertTrue("A) returns a wrong file: " + u1.getFile(), u1.getFile() .equals("/d0/d1/dir1/file.java")); // test for absolute and relative file processing u1 = new URL(u, "/../dir1/dir2/../file.java", null); assertEquals("B) returns a wrong file", "/dir1/file.java", u1.getFile()); URL one; try { one = new URL("http://www.ibm.com"); } catch (MalformedURLException ex) { // Should not happen. throw new RuntimeException(ex.getMessage()); } try { new URL(one, (String) null, null); fail("Specifying null spec on URL constructor should throw MalformedURLException"); } catch (MalformedURLException e) { // expected } } public void test_toExternalForm_Relative() throws MalformedURLException { String strURL = "http://a/b/c/d;p?q"; String ref = "?y"; URL url = new URL(new URL(strURL), ref); assertEquals("http://a/b/c/d;p?y", url.toExternalForm()); } public void test_toExternalForm_Absolute() throws MalformedURLException { String strURL = "http://localhost?name=value"; URL url = new URL(strURL); assertEquals(strURL, url.toExternalForm()); strURL = "http://localhost?name=value/age=12"; url = new URL(strURL); assertEquals(strURL, url.toExternalForm()); } }