/* * Copyright 2009 Google Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not * use this file except in compliance with the License. You may obtain a copy of * the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, WITHOUT * WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the * License for the specific language governing permissions and limitations under * the License. */ package com.google.gwt.http.client; import com.google.gwt.junit.client.GWTTestCase; import java.util.ArrayList; import java.util.List; /** * Test Case for {@link UrlBuilder}. */ public class UrlBuilderTest extends GWTTestCase { @Override public String getModuleName() { return "com.google.gwt.http.HttpSuite"; } /** * Test that the URL is encoded correctly. */ public void testBuildStringEncode() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); builder.setPath("path to file"); builder.setParameter("the key", "the value"); assertEquals("http://google.com/path%20to%20file?the+key=the+value", builder.buildString()); builder = new UrlBuilder(); builder.setHost("google.com"); builder.setPath("path"); builder.setHash("hash"); builder.setParameter("a_b", "a+b"); assertEquals("http://google.com/path?a_b=a%2Bb#hash", builder.buildString()); builder.setParameter("a_b", "a&b"); assertEquals("http://google.com/path?a_b=a%26b#hash", builder.buildString()); builder.setParameter("a_b", "a%b"); assertEquals("http://google.com/path?a_b=a%25b#hash", builder.buildString()); } public void testBuildStringEntireUrl() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Host only. assertEquals("http://google.com", builder.buildString()); // Host:Port builder.setPort(100); assertEquals("http://google.com:100", builder.buildString()); // Host:Port/Path builder.setPath("path/to/file"); assertEquals("http://google.com:100/path/to/file", builder.buildString()); // Host:Port/Path?Param builder.setParameter("key", "value"); assertEquals("http://google.com:100/path/to/file?key=value", builder.buildString()); // Host:Port/Path?Param#Hash builder.setHash("token"); assertEquals("http://google.com:100/path/to/file?key=value#token", builder.buildString()); } public void testBuildStringEntireUrlWithReturns() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com").setPort(100).setPath("path/to/file").setParameter( "key", "value").setHash("token"); assertEquals("http://google.com:100/path/to/file?key=value#token", builder.buildString()); } public void testBuildStringParts() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Host only. assertEquals("http://google.com", builder.buildString()); // Host:Port builder.setPort(100); assertEquals("http://google.com:100", builder.buildString()); builder.setPort(UrlBuilder.PORT_UNSPECIFIED); // Host/Path builder.setPath("path/to/file"); assertEquals("http://google.com/path/to/file", builder.buildString()); builder.setPath(null); // Host?Param builder.setParameter("key", "value"); assertEquals("http://google.com?key=value", builder.buildString()); builder.removeParameter("key"); // Host#Hash builder.setHash("token"); assertEquals("http://google.com#token", builder.buildString()); builder.setHash(null); } public void testSetHash() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Hash not specified assertEquals("http://google.com", builder.buildString()); // # added if not present builder.setHash("myHash"); assertEquals("http://google.com#myHash", builder.buildString()); // Null hash builder.setHash(null); assertEquals("http://google.com", builder.buildString()); // # not added if present builder.setHash("#myHash2"); assertEquals("http://google.com#myHash2", builder.buildString()); } public void testSetHost() { UrlBuilder builder = new UrlBuilder(); // Host not specified. assertEquals("http://", builder.buildString()); // Null host. builder.setHost(null); assertEquals("http://", builder.buildString()); // Empty host. builder.setHost(""); assertEquals("http://", builder.buildString()); // google.com builder.setHost("google.com"); assertEquals("http://google.com", builder.buildString()); // google.com:80 builder.setHost("google.com:80"); assertEquals("http://google.com:80", builder.buildString()); // google.com:80 with overridden port. builder.setHost("google.com:80"); builder.setPort(1000); assertEquals("http://google.com:1000", builder.buildString()); // google.com:80 with overridden port in host. builder.setPort(1000); builder.setHost("google.com:80"); assertEquals("http://google.com:80", builder.buildString()); // Specify to many ports. // google.com:80:90 try { builder.setHost("google.com:80:90"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } // Specify invalid port. // google.com:test try { builder.setHost("google.com:test"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } } public void testSetParameter() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Parameters not specified. assertEquals("http://google.com", builder.buildString()); // Simple parameter. builder.setParameter("key", "value"); assertEquals("http://google.com?key=value", builder.buildString()); // Remove simple parameter. builder.removeParameter("key"); assertEquals("http://google.com", builder.buildString()); // List parameter. List<String> values = new ArrayList<String>(); builder.setParameter("key", "value0", "value1", "value2"); assertEquals("http://google.com?key=value0&key=value1&key=value2", builder.buildString()); // Remove list parameter. builder.removeParameter("key"); assertEquals("http://google.com", builder.buildString()); // Multiple parameters. builder.setParameter("key0", "value0", "value1", "value2"); builder.setParameter("key1", "simpleValue"); // The order of query params is not defined, so either URL is acceptable. String url = builder.buildString(); assertTrue(url.equals("http://google.com?key0=value0&key0=value1&key0=value2&key1=simpleValue") || url.equals("http://google.com?key1=simpleValue&key0=value0&key0=value1&key0=value2")); // Empty list of multiple parameters. builder.setParameter("key0", "value0", "value1", "value2"); builder.setParameter("key1", "simpleValue"); assertTrue(url.equals("http://google.com?key0=value0&key0=value1&key0=value2&key1=simpleValue") || url.equals("http://google.com?key1=simpleValue&key0=value0&key0=value1&key0=value2")); } public void testSetParameterToNull() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); try { builder.setParameter(null, "value"); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } try { builder.setParameter(null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } try { builder.setParameter("key", new String[0]); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } try { builder.setParameter("key", (String[]) null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } // Null values are okay. builder.setParameter("key", (String) null); assertEquals("http://google.com?key=", builder.buildString()); } public void testSetPath() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Path not specified. assertEquals("http://google.com", builder.buildString()); // Null path. builder.setPath(null); assertEquals("http://google.com", builder.buildString()); // Empty path. builder.setPath(""); assertEquals("http://google.com", builder.buildString()); // path/to/file.html builder.setPath("path/to/file.html"); assertEquals("http://google.com/path/to/file.html", builder.buildString()); // /path/to/file.html builder.setPath("/path/to/file.html"); assertEquals("http://google.com/path/to/file.html", builder.buildString()); } public void testSetPort() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Port not specified. assertEquals("http://google.com", builder.buildString()); // Port 1000. builder.setPort(1000); assertEquals("http://google.com:1000", builder.buildString()); // PORT_UNSPECIFIED. builder.setPort(UrlBuilder.PORT_UNSPECIFIED); assertEquals("http://google.com", builder.buildString()); } public void testSetProtocol() { UrlBuilder builder = new UrlBuilder(); builder.setHost("google.com"); // Protocol not specified. assertEquals("http://google.com", builder.buildString()); // Null host. try { builder.setProtocol(null); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } // Empty host. try { builder.setProtocol(""); fail("Expected IllegalArgumentException"); } catch (IllegalArgumentException e) { // Expected. } // ftp builder.setProtocol("ftp"); assertEquals("ftp://google.com", builder.buildString()); // tcp: builder.setProtocol("tcp:"); assertEquals("tcp://google.com", builder.buildString()); // http:/ builder.setProtocol("http:/"); assertEquals("http://google.com", builder.buildString()); // http:// builder.setProtocol("http://"); assertEquals("http://google.com", builder.buildString()); } }