// Copyright (c) 2003-present, Jodd Team (http://jodd.org) // All rights reserved. // // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are met: // // 1. Redistributions of source code must retain the above copyright notice, // this list of conditions and the following disclaimer. // // 2. Redistributions in binary form must reproduce the above copyright // notice, this list of conditions and the following disclaimer in the // documentation and/or other materials provided with the distribution. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE // POSSIBILITY OF SUCH DAMAGE. package jodd.util; import org.junit.Test; import java.io.UnsupportedEncodingException; import static jodd.util.URLCoder.encodeFragment; import static jodd.util.URLCoder.encodeHost; import static jodd.util.URLCoder.encodeHttpUrl; import static jodd.util.URLCoder.encodePath; import static jodd.util.URLCoder.encodePathSegment; import static jodd.util.URLCoder.encodePort; import static jodd.util.URLCoder.encodeQuery; import static jodd.util.URLCoder.encodeQueryParam; import static jodd.util.URLCoder.encodeScheme; import static jodd.util.URLCoder.encodeUri; import static jodd.util.URLCoder.encodeUserInfo; import static jodd.util.URLDecoder.decode; import static jodd.util.URLDecoder.decodeQuery; import static org.junit.Assert.assertEquals; public class URLCoderTest { @Test public void testEncodeScheme() { assertEquals("foobar+-.", encodeScheme("foobar+-.")); assertEquals("foo%20bar", encodeScheme("foo bar")); } @Test public void testEncodeUserInfo() { assertEquals("foobar:", encodeUserInfo("foobar:")); assertEquals("foo%20bar", encodeUserInfo("foo bar")); } @Test public void testEncodeHost() { assertEquals("foobar", encodeHost("foobar")); assertEquals("foo%20bar", encodeHost("foo bar")); } @Test public void testEncodePort() { assertEquals("80", encodePort("80")); } @Test public void testEncodePath() { assertEquals("/foo/bar", encodePath("/foo/bar")); assertEquals("/foo%20bar", encodePath("/foo bar")); assertEquals("/Z%C3%BCrich", encodePath("/Z\u00fcrich")); } @Test public void testEncodePathSegment() { assertEquals("foobar", encodePathSegment("foobar")); assertEquals("%2Ffoo%2Fbar", encodePathSegment("/foo/bar")); } @Test public void testEncodeQuery() { assertEquals("foobar", encodeQuery("foobar")); assertEquals("foo%20bar", encodeQuery("foo bar")); assertEquals("foobar/+", encodeQuery("foobar/+")); assertEquals("T%C5%8Dky%C5%8D", encodeQuery("T\u014dky\u014d")); assertEquals("foo&bar", encodeQuery("foo&bar")); assertEquals("foo=one&bar=two", encodeQuery("foo=one&bar=two")); } @Test public void testEncodeQueryParam() { assertEquals("foobar", encodeQueryParam("foobar")); assertEquals("foo%20bar", encodeQueryParam("foo bar")); assertEquals("foobar/+", encodeQuery("foobar/+")); assertEquals("foo%26bar", encodeQueryParam("foo&bar")); assertEquals("foo%3Dbar", encodeQueryParam("foo=bar")); assertEquals("foo@bar", encodeQueryParam("foo@bar")); assertEquals("foo%3Done%26bar%3Dtwo", encodeQueryParam("foo=one&bar=two")); } @Test public void testEncodeFragment() { assertEquals("foobar", encodeFragment("foobar")); assertEquals("foo%20bar", encodeFragment("foo bar")); assertEquals("foobar/", encodeFragment("foobar/")); } @Test public void testDecode() { assertEquals("", decode("")); assertEquals("foobar", decode("foobar")); assertEquals("foo bar", decode("foo%20bar")); assertEquals("foo+bar", decode("foo%2bbar")); assertEquals("T\u014dky\u014d", decode("T%C5%8Dky%C5%8D")); assertEquals("/Z\u00fcrich", decode("/Z%C3%BCrich")); assertEquals("T\u014dky\u014d", decode("T\u014dky\u014d")); assertEquals("foo+bar", decode("foo+bar")); assertEquals("foo bar", decodeQuery("foo+bar")); } @Test public void testEncodeUri() { assertEquals("http://www.ietf.org/rfc/rfc3986.txt", encodeUri("http://www.ietf.org/rfc/rfc3986.txt")); assertEquals("https://www.ietf.org/rfc/rfc3986.txt", encodeUri("https://www.ietf.org/rfc/rfc3986.txt")); assertEquals("http://www.google.com/?q=Z%C3%BCrich", encodeUri("http://www.google.com/?q=Z\u00fcrich")); assertEquals("Invalid encoded URI", "http://arjen:foobar@java.sun.com:80/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)", encodeUri("http://arjen:foobar@java.sun.com:80/javase/6/docs/api/java/util/BitSet.html?foo=bar#and(java.util.BitSet)")); assertEquals("http://java.sun.com/j2se/1.3/", encodeUri("http://java.sun.com/j2se/1.3/")); assertEquals("docs/guide/collections/designfaq.html#28", encodeUri("docs/guide/collections/designfaq.html#28")); assertEquals("../../../demo/jfc/SwingSet2/src/SwingSet2.java", encodeUri("../../../demo/jfc/SwingSet2/src/SwingSet2.java")); assertEquals("file:///~/calendar", encodeUri("file:///~/calendar")); assertEquals("http://example.com/query=foo@bar", encodeUri("http://example.com/query=foo@bar")); assertEquals("http://example.org?format=json&url=http://another.com?foo=bar", encodeUri("http://example.org?format=json&url=http://another.com?foo=bar")); } @Test public void testEncodeHttpUrl() { assertEquals("Invalid encoded HTTP URL", "http://www.ietf.org/rfc/rfc3986.txt", encodeHttpUrl("http://www.ietf.org/rfc/rfc3986.txt")); assertEquals("https://www.ietf.org/rfc/rfc3986.txt", encodeHttpUrl("https://www.ietf.org/rfc/rfc3986.txt")); assertEquals("Invalid encoded HTTP URL", "http://www.google.com/?q=Z%C3%BCrich", encodeHttpUrl("http://www.google.com/?q=Z\u00fcrich")); assertEquals("Invalid encoded HTTP URL", "http://ws.geonames.org/searchJSON?q=T%C5%8Dky%C5%8D&style=FULL&maxRows=300", encodeHttpUrl("http://ws.geonames.org/searchJSON?q=T\u014dky\u014d&style=FULL&maxRows=300")); assertEquals("Invalid encoded HTTP URL", "http://arjen:foobar@java.sun.com:80/javase/6/docs/api/java/util/BitSet.html?foo=bar", encodeHttpUrl( "http://arjen:foobar@java.sun.com:80/javase/6/docs/api/java/util/BitSet.html?foo=bar")); assertEquals("Invalid encoded HTTP URL", "http://search.twitter.com/search.atom?q=%23avatar", encodeHttpUrl("http://search.twitter.com/search.atom?q=#avatar")); assertEquals("Invalid encoded HTTP URL", "http://java.sun.com/j2se/1.3/", encodeHttpUrl("http://java.sun.com/j2se/1.3/")); assertEquals("Invalid encoded HTTP URL", "http://example.com/query=foo@bar", encodeHttpUrl("http://example.com/query=foo@bar")); } @Test(expected = IllegalArgumentException.class) public void encodeHttpUrlMail() { encodeHttpUrl("mailto:java-net@java.sun.com"); } @Test public void testEncodeUrl() { assertEquals("/aaa", URLCoder.encodeUri("/aaa")); assertEquals("/aaa?", URLCoder.encodeUri("/aaa?")); assertEquals("/aaa?b", URLCoder.encodeUri("/aaa?b")); assertEquals("/aaa?b=", URLCoder.encodeUri("/aaa?b=")); assertEquals("/aaa?b=c", URLCoder.encodeUri("/aaa?b=c")); assertEquals("/aaa?b=%20c", URLCoder.encodeUri("/aaa?b= c")); assertEquals("/aaa?b=%20c&", URLCoder.encodeUri("/aaa?b= c&")); assertEquals("/aaa?b=%20c&dd", URLCoder.encodeUri("/aaa?b= c&dd")); assertEquals("/aaa?b=%20c&dd=", URLCoder.encodeUri("/aaa?b= c&dd=")); assertEquals("/aaa?b=%20%20c&dd==", URLCoder.encodeUri("/aaa?b= c&dd==")); assertEquals("?data=The%20string%20%C3%BC@foo-bar", URLCoder.encodeUri("?data=The string ü@foo-bar")); } @Test public void testQuerySimple() throws UnsupportedEncodingException { assertEquals("%C5%BD%C4%8C%C4%86", encodeQueryParam("ŽČĆ")); // utf8 assertEquals("@-._~%2B%20", encodeQueryParam("@-._~+ ")); assertEquals("http://jodd.org/download?param=I%20love%20Jodd+Java", URLCoder.encodeHttpUrl("http://jodd.org/download?param=I love Jodd+Java")); assertEquals("http://jodd.org?param=java&jodd", URLCoder.encodeHttpUrl("http://jodd.org?param=java&jodd")); // this is ambiguous } @Test public void testUrlBuilder() { assertEquals("http://jodd.org", URLCoder.build("http://jodd.org").toString()); assertEquals("http://jodd.org?param=jodd%26java", URLCoder.build("http://jodd.org").queryParam("param", "jodd&java").toString()); assertEquals("http://jodd.org?pa%20ram=jodd%2Bjava", URLCoder.build("http://jodd.org").queryParam("pa ram", "jodd+java").toString()); assertEquals("/foo?foo=one&bar=two", URLCoder.build("/foo").queryParam("foo", "one").queryParam("bar", "two").toString()); } }