package test.utils.lang; import com.firefly.utils.lang.URIUtils; import org.junit.Test; import java.net.URI; import java.nio.charset.StandardCharsets; import static org.hamcrest.Matchers.is; import static org.junit.Assert.*; /** * Util meta Tests. */ public class URIUtilsTest { /* ------------------------------------------------------------ */ @Test public void testEncodePath() { // test basic encode/decode StringBuilder buf = new StringBuilder(); buf.setLength(0); URIUtils.encodePath(buf, "/foo%23+;,:=/b a r/?info "); assertEquals("/foo%2523+%3B,:=/b%20a%20r/%3Finfo%20", buf.toString()); assertEquals("/foo%2523+%3B,:=/b%20a%20r/%3Finfo%20", URIUtils.encodePath("/foo%23+;,:=/b a r/?info ")); buf.setLength(0); URIUtils.encodeString(buf, "foo%23;,:=b a r", ";,= "); assertEquals("foo%2523%3b%2c:%3db%20a%20r", buf.toString()); buf.setLength(0); URIUtils.encodePath(buf, "/context/'list'/\"me\"/;<script>window.alert('xss');</script>"); assertEquals("/context/%27list%27/%22me%22/%3B%3Cscript%3Ewindow.alert(%27xss%27)%3B%3C/script%3E", buf.toString()); buf.setLength(0); URIUtils.encodePath(buf, "test\u00f6?\u00f6:\u00df"); assertEquals("test%C3%B6%3F%C3%B6:%C3%9F", buf.toString()); buf.setLength(0); URIUtils.encodePath(buf, "test?\u00f6?\u00f6:\u00df"); assertEquals("test%3F%C3%B6%3F%C3%B6:%C3%9F", buf.toString()); } /* ------------------------------------------------------------ */ @Test public void testDecodePath() { assertEquals("/foo/bar", URIUtils.decodePath("xx/foo/barxx", 2, 8)); assertEquals("/foo/bar", URIUtils.decodePath("/foo/bar")); assertEquals("/f o/b r", URIUtils.decodePath("/f%20o/b%20r")); assertEquals("/foo/bar", URIUtils.decodePath("/foo;ignore/bar;ignore")); assertEquals("/fää/bar", URIUtils.decodePath("/f\u00e4\u00e4;ignore/bar;ignore")); assertEquals("/f\u0629\u0629%23/bar", URIUtils.decodePath("/f%d8%a9%d8%a9%2523;ignore/bar;ignore")); assertEquals("foo%23;,:=b a r", URIUtils.decodePath("foo%2523%3b%2c:%3db%20a%20r;rubbish")); assertEquals("/foo/bar%23;,:=b a r=", URIUtils.decodePath("xxx/foo/bar%2523%3b%2c:%3db%20a%20r%3Dxxx;rubbish", 3, 35)); assertEquals("f\u00e4\u00e4%23;,:=b a r=", URIUtils.decodePath("fää%2523%3b%2c:%3db%20a%20r%3D")); assertEquals("f\u0629\u0629%23;,:=b a r", URIUtils.decodePath("f%d8%a9%d8%a9%2523%3b%2c:%3db%20a%20r")); // Test for null character (real world ugly test case) byte oddBytes[] = {'/', 0x00, '/'}; String odd = new String(oddBytes, StandardCharsets.ISO_8859_1); assertEquals(odd, URIUtils.decodePath("/%00/")); } /* ------------------------------------------------------------ */ @Test public void testAddEncodedPaths() { assertEquals("null+null", URIUtils.addEncodedPaths(null, null), null); assertEquals("null+", URIUtils.addEncodedPaths(null, ""), ""); assertEquals("null+bbb", URIUtils.addEncodedPaths(null, "bbb"), "bbb"); assertEquals("null+/", URIUtils.addEncodedPaths(null, "/"), "/"); assertEquals("null+/bbb", URIUtils.addEncodedPaths(null, "/bbb"), "/bbb"); assertEquals("+null", URIUtils.addEncodedPaths("", null), ""); assertEquals("+", URIUtils.addEncodedPaths("", ""), ""); assertEquals("+bbb", URIUtils.addEncodedPaths("", "bbb"), "bbb"); assertEquals("+/", URIUtils.addEncodedPaths("", "/"), "/"); assertEquals("+/bbb", URIUtils.addEncodedPaths("", "/bbb"), "/bbb"); assertEquals("aaa+null", URIUtils.addEncodedPaths("aaa", null), "aaa"); assertEquals("aaa+", URIUtils.addEncodedPaths("aaa", ""), "aaa"); assertEquals("aaa+bbb", URIUtils.addEncodedPaths("aaa", "bbb"), "aaa/bbb"); assertEquals("aaa+/", URIUtils.addEncodedPaths("aaa", "/"), "aaa/"); assertEquals("aaa+/bbb", URIUtils.addEncodedPaths("aaa", "/bbb"), "aaa/bbb"); assertEquals("/+null", URIUtils.addEncodedPaths("/", null), "/"); assertEquals("/+", URIUtils.addEncodedPaths("/", ""), "/"); assertEquals("/+bbb", URIUtils.addEncodedPaths("/", "bbb"), "/bbb"); assertEquals("/+/", URIUtils.addEncodedPaths("/", "/"), "/"); assertEquals("/+/bbb", URIUtils.addEncodedPaths("/", "/bbb"), "/bbb"); assertEquals("aaa/+null", URIUtils.addEncodedPaths("aaa/", null), "aaa/"); assertEquals("aaa/+", URIUtils.addEncodedPaths("aaa/", ""), "aaa/"); assertEquals("aaa/+bbb", URIUtils.addEncodedPaths("aaa/", "bbb"), "aaa/bbb"); assertEquals("aaa/+/", URIUtils.addEncodedPaths("aaa/", "/"), "aaa/"); assertEquals("aaa/+/bbb", URIUtils.addEncodedPaths("aaa/", "/bbb"), "aaa/bbb"); assertEquals(";JS+null", URIUtils.addEncodedPaths(";JS", null), ";JS"); assertEquals(";JS+", URIUtils.addEncodedPaths(";JS", ""), ";JS"); assertEquals(";JS+bbb", URIUtils.addEncodedPaths(";JS", "bbb"), "bbb;JS"); assertEquals(";JS+/", URIUtils.addEncodedPaths(";JS", "/"), "/;JS"); assertEquals(";JS+/bbb", URIUtils.addEncodedPaths(";JS", "/bbb"), "/bbb;JS"); assertEquals("aaa;JS+null", URIUtils.addEncodedPaths("aaa;JS", null), "aaa;JS"); assertEquals("aaa;JS+", URIUtils.addEncodedPaths("aaa;JS", ""), "aaa;JS"); assertEquals("aaa;JS+bbb", URIUtils.addEncodedPaths("aaa;JS", "bbb"), "aaa/bbb;JS"); assertEquals("aaa;JS+/", URIUtils.addEncodedPaths("aaa;JS", "/"), "aaa/;JS"); assertEquals("aaa;JS+/bbb", URIUtils.addEncodedPaths("aaa;JS", "/bbb"), "aaa/bbb;JS"); assertEquals("aaa;JS+null", URIUtils.addEncodedPaths("aaa/;JS", null), "aaa/;JS"); assertEquals("aaa;JS+", URIUtils.addEncodedPaths("aaa/;JS", ""), "aaa/;JS"); assertEquals("aaa;JS+bbb", URIUtils.addEncodedPaths("aaa/;JS", "bbb"), "aaa/bbb;JS"); assertEquals("aaa;JS+/", URIUtils.addEncodedPaths("aaa/;JS", "/"), "aaa/;JS"); assertEquals("aaa;JS+/bbb", URIUtils.addEncodedPaths("aaa/;JS", "/bbb"), "aaa/bbb;JS"); assertEquals("?A=1+null", URIUtils.addEncodedPaths("?A=1", null), "?A=1"); assertEquals("?A=1+", URIUtils.addEncodedPaths("?A=1", ""), "?A=1"); assertEquals("?A=1+bbb", URIUtils.addEncodedPaths("?A=1", "bbb"), "bbb?A=1"); assertEquals("?A=1+/", URIUtils.addEncodedPaths("?A=1", "/"), "/?A=1"); assertEquals("?A=1+/bbb", URIUtils.addEncodedPaths("?A=1", "/bbb"), "/bbb?A=1"); assertEquals("aaa?A=1+null", URIUtils.addEncodedPaths("aaa?A=1", null), "aaa?A=1"); assertEquals("aaa?A=1+", URIUtils.addEncodedPaths("aaa?A=1", ""), "aaa?A=1"); assertEquals("aaa?A=1+bbb", URIUtils.addEncodedPaths("aaa?A=1", "bbb"), "aaa/bbb?A=1"); assertEquals("aaa?A=1+/", URIUtils.addEncodedPaths("aaa?A=1", "/"), "aaa/?A=1"); assertEquals("aaa?A=1+/bbb", URIUtils.addEncodedPaths("aaa?A=1", "/bbb"), "aaa/bbb?A=1"); assertEquals("aaa?A=1+null", URIUtils.addEncodedPaths("aaa/?A=1", null), "aaa/?A=1"); assertEquals("aaa?A=1+", URIUtils.addEncodedPaths("aaa/?A=1", ""), "aaa/?A=1"); assertEquals("aaa?A=1+bbb", URIUtils.addEncodedPaths("aaa/?A=1", "bbb"), "aaa/bbb?A=1"); assertEquals("aaa?A=1+/", URIUtils.addEncodedPaths("aaa/?A=1", "/"), "aaa/?A=1"); assertEquals("aaa?A=1+/bbb", URIUtils.addEncodedPaths("aaa/?A=1", "/bbb"), "aaa/bbb?A=1"); assertEquals(";JS?A=1+null", URIUtils.addEncodedPaths(";JS?A=1", null), ";JS?A=1"); assertEquals(";JS?A=1+", URIUtils.addEncodedPaths(";JS?A=1", ""), ";JS?A=1"); assertEquals(";JS?A=1+bbb", URIUtils.addEncodedPaths(";JS?A=1", "bbb"), "bbb;JS?A=1"); assertEquals(";JS?A=1+/", URIUtils.addEncodedPaths(";JS?A=1", "/"), "/;JS?A=1"); assertEquals(";JS?A=1+/bbb", URIUtils.addEncodedPaths(";JS?A=1", "/bbb"), "/bbb;JS?A=1"); assertEquals("aaa;JS?A=1+null", URIUtils.addEncodedPaths("aaa;JS?A=1", null), "aaa;JS?A=1"); assertEquals("aaa;JS?A=1+", URIUtils.addEncodedPaths("aaa;JS?A=1", ""), "aaa;JS?A=1"); assertEquals("aaa;JS?A=1+bbb", URIUtils.addEncodedPaths("aaa;JS?A=1", "bbb"), "aaa/bbb;JS?A=1"); assertEquals("aaa;JS?A=1+/", URIUtils.addEncodedPaths("aaa;JS?A=1", "/"), "aaa/;JS?A=1"); assertEquals("aaa;JS?A=1+/bbb", URIUtils.addEncodedPaths("aaa;JS?A=1", "/bbb"), "aaa/bbb;JS?A=1"); assertEquals("aaa;JS?A=1+null", URIUtils.addEncodedPaths("aaa/;JS?A=1", null), "aaa/;JS?A=1"); assertEquals("aaa;JS?A=1+", URIUtils.addEncodedPaths("aaa/;JS?A=1", ""), "aaa/;JS?A=1"); assertEquals("aaa;JS?A=1+bbb", URIUtils.addEncodedPaths("aaa/;JS?A=1", "bbb"), "aaa/bbb;JS?A=1"); assertEquals("aaa;JS?A=1+/", URIUtils.addEncodedPaths("aaa/;JS?A=1", "/"), "aaa/;JS?A=1"); assertEquals("aaa;JS?A=1+/bbb", URIUtils.addEncodedPaths("aaa/;JS?A=1", "/bbb"), "aaa/bbb;JS?A=1"); } /* ------------------------------------------------------------ */ @Test public void testAddDecodedPaths() { assertEquals("null+null", URIUtils.addPaths(null, null), null); assertEquals("null+", URIUtils.addPaths(null, ""), ""); assertEquals("null+bbb", URIUtils.addPaths(null, "bbb"), "bbb"); assertEquals("null+/", URIUtils.addPaths(null, "/"), "/"); assertEquals("null+/bbb", URIUtils.addPaths(null, "/bbb"), "/bbb"); assertEquals("+null", URIUtils.addPaths("", null), ""); assertEquals("+", URIUtils.addPaths("", ""), ""); assertEquals("+bbb", URIUtils.addPaths("", "bbb"), "bbb"); assertEquals("+/", URIUtils.addPaths("", "/"), "/"); assertEquals("+/bbb", URIUtils.addPaths("", "/bbb"), "/bbb"); assertEquals("aaa+null", URIUtils.addPaths("aaa", null), "aaa"); assertEquals("aaa+", URIUtils.addPaths("aaa", ""), "aaa"); assertEquals("aaa+bbb", URIUtils.addPaths("aaa", "bbb"), "aaa/bbb"); assertEquals("aaa+/", URIUtils.addPaths("aaa", "/"), "aaa/"); assertEquals("aaa+/bbb", URIUtils.addPaths("aaa", "/bbb"), "aaa/bbb"); assertEquals("/+null", URIUtils.addPaths("/", null), "/"); assertEquals("/+", URIUtils.addPaths("/", ""), "/"); assertEquals("/+bbb", URIUtils.addPaths("/", "bbb"), "/bbb"); assertEquals("/+/", URIUtils.addPaths("/", "/"), "/"); assertEquals("/+/bbb", URIUtils.addPaths("/", "/bbb"), "/bbb"); assertEquals("aaa/+null", URIUtils.addPaths("aaa/", null), "aaa/"); assertEquals("aaa/+", URIUtils.addPaths("aaa/", ""), "aaa/"); assertEquals("aaa/+bbb", URIUtils.addPaths("aaa/", "bbb"), "aaa/bbb"); assertEquals("aaa/+/", URIUtils.addPaths("aaa/", "/"), "aaa/"); assertEquals("aaa/+/bbb", URIUtils.addPaths("aaa/", "/bbb"), "aaa/bbb"); assertEquals(";JS+null", URIUtils.addPaths(";JS", null), ";JS"); assertEquals(";JS+", URIUtils.addPaths(";JS", ""), ";JS"); assertEquals(";JS+bbb", URIUtils.addPaths(";JS", "bbb"), ";JS/bbb"); assertEquals(";JS+/", URIUtils.addPaths(";JS", "/"), ";JS/"); assertEquals(";JS+/bbb", URIUtils.addPaths(";JS", "/bbb"), ";JS/bbb"); assertEquals("aaa;JS+null", URIUtils.addPaths("aaa;JS", null), "aaa;JS"); assertEquals("aaa;JS+", URIUtils.addPaths("aaa;JS", ""), "aaa;JS"); assertEquals("aaa;JS+bbb", URIUtils.addPaths("aaa;JS", "bbb"), "aaa;JS/bbb"); assertEquals("aaa;JS+/", URIUtils.addPaths("aaa;JS", "/"), "aaa;JS/"); assertEquals("aaa;JS+/bbb", URIUtils.addPaths("aaa;JS", "/bbb"), "aaa;JS/bbb"); assertEquals("aaa;JS+null", URIUtils.addPaths("aaa/;JS", null), "aaa/;JS"); assertEquals("aaa;JS+", URIUtils.addPaths("aaa/;JS", ""), "aaa/;JS"); assertEquals("aaa;JS+bbb", URIUtils.addPaths("aaa/;JS", "bbb"), "aaa/;JS/bbb"); assertEquals("aaa;JS+/", URIUtils.addPaths("aaa/;JS", "/"), "aaa/;JS/"); assertEquals("aaa;JS+/bbb", URIUtils.addPaths("aaa/;JS", "/bbb"), "aaa/;JS/bbb"); assertEquals("?A=1+null", URIUtils.addPaths("?A=1", null), "?A=1"); assertEquals("?A=1+", URIUtils.addPaths("?A=1", ""), "?A=1"); assertEquals("?A=1+bbb", URIUtils.addPaths("?A=1", "bbb"), "?A=1/bbb"); assertEquals("?A=1+/", URIUtils.addPaths("?A=1", "/"), "?A=1/"); assertEquals("?A=1+/bbb", URIUtils.addPaths("?A=1", "/bbb"), "?A=1/bbb"); assertEquals("aaa?A=1+null", URIUtils.addPaths("aaa?A=1", null), "aaa?A=1"); assertEquals("aaa?A=1+", URIUtils.addPaths("aaa?A=1", ""), "aaa?A=1"); assertEquals("aaa?A=1+bbb", URIUtils.addPaths("aaa?A=1", "bbb"), "aaa?A=1/bbb"); assertEquals("aaa?A=1+/", URIUtils.addPaths("aaa?A=1", "/"), "aaa?A=1/"); assertEquals("aaa?A=1+/bbb", URIUtils.addPaths("aaa?A=1", "/bbb"), "aaa?A=1/bbb"); assertEquals("aaa?A=1+null", URIUtils.addPaths("aaa/?A=1", null), "aaa/?A=1"); assertEquals("aaa?A=1+", URIUtils.addPaths("aaa/?A=1", ""), "aaa/?A=1"); assertEquals("aaa?A=1+bbb", URIUtils.addPaths("aaa/?A=1", "bbb"), "aaa/?A=1/bbb"); assertEquals("aaa?A=1+/", URIUtils.addPaths("aaa/?A=1", "/"), "aaa/?A=1/"); assertEquals("aaa?A=1+/bbb", URIUtils.addPaths("aaa/?A=1", "/bbb"), "aaa/?A=1/bbb"); } /* ------------------------------------------------------------ */ @Test public void testCompactPath() { assertEquals("/foo/bar", URIUtils.compactPath("/foo/bar")); assertEquals("/foo/bar?a=b//c", URIUtils.compactPath("/foo/bar?a=b//c")); assertEquals("/foo/bar", URIUtils.compactPath("//foo//bar")); assertEquals("/foo/bar?a=b//c", URIUtils.compactPath("//foo//bar?a=b//c")); assertEquals("/foo/bar", URIUtils.compactPath("/foo///bar")); assertEquals("/foo/bar?a=b//c", URIUtils.compactPath("/foo///bar?a=b//c")); } /* ------------------------------------------------------------ */ @Test public void testParentPath() { assertEquals("parent /aaa/bbb/", "/aaa/", URIUtils.parentPath("/aaa/bbb/")); assertEquals("parent /aaa/bbb", "/aaa/", URIUtils.parentPath("/aaa/bbb")); assertEquals("parent /aaa/", "/", URIUtils.parentPath("/aaa/")); assertEquals("parent /aaa", "/", URIUtils.parentPath("/aaa")); assertEquals("parent /", null, URIUtils.parentPath("/")); assertEquals("parent null", null, URIUtils.parentPath(null)); } /* ------------------------------------------------------------ */ @Test public void testEqualsIgnoreEncoding() { assertTrue(URIUtils.equalsIgnoreEncodings("http://example.com/foo/bar", "http://example.com/foo/bar")); assertTrue(URIUtils.equalsIgnoreEncodings("/barry's", "/barry%27s")); assertTrue(URIUtils.equalsIgnoreEncodings("/barry%27s", "/barry's")); assertTrue(URIUtils.equalsIgnoreEncodings("/barry%27s", "/barry%27s")); assertTrue(URIUtils.equalsIgnoreEncodings("/b rry's", "/b%20rry%27s")); assertTrue(URIUtils.equalsIgnoreEncodings("/b rry%27s", "/b%20rry's")); assertTrue(URIUtils.equalsIgnoreEncodings("/b rry%27s", "/b%20rry%27s")); assertTrue(URIUtils.equalsIgnoreEncodings("/foo%2fbar", "/foo%2fbar")); assertTrue(URIUtils.equalsIgnoreEncodings("/foo%2fbar", "/foo%2Fbar")); assertFalse(URIUtils.equalsIgnoreEncodings("ABC", "abc")); assertFalse(URIUtils.equalsIgnoreEncodings("/barry's", "/barry%26s")); assertFalse(URIUtils.equalsIgnoreEncodings("/foo/bar", "/foo%2fbar")); assertFalse(URIUtils.equalsIgnoreEncodings("/foo2fbar", "/foo/bar")); } /* ------------------------------------------------------------ */ @Test public void testJarSource() throws Exception { assertThat(URIUtils.getJarSource("file:///tmp/"), is("file:///tmp/")); assertThat(URIUtils.getJarSource("jar:file:///tmp/foo.jar"), is("file:///tmp/foo.jar")); assertThat(URIUtils.getJarSource("jar:file:///tmp/foo.jar!/some/path"), is("file:///tmp/foo.jar")); assertThat(URIUtils.getJarSource(new URI("file:///tmp/")), is(new URI("file:///tmp/"))); assertThat(URIUtils.getJarSource(new URI("jar:file:///tmp/foo.jar")), is(new URI("file:///tmp/foo.jar"))); assertThat(URIUtils.getJarSource(new URI("jar:file:///tmp/foo.jar!/some/path")), is(new URI("file:///tmp/foo.jar"))); } }