blob: 36717c7efe0bc0be507971d27d10b47c5b323f0e [file] [log] [blame]
/*
* 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 org.apache.felix.http.base.internal.util;
import static org.apache.felix.http.base.internal.util.UriUtils.compactPath;
import static org.apache.felix.http.base.internal.util.UriUtils.concat;
import static org.apache.felix.http.base.internal.util.UriUtils.decodePath;
import static org.apache.felix.http.base.internal.util.UriUtils.relativePath;
import static org.apache.felix.http.base.internal.util.UriUtils.removeDotSegments;
import static org.junit.Assert.assertEquals;
import org.junit.Test;
/**
* Test cases for {@link UriUtils}.
*/
public class UriUtilsTest
{
@Test
public void testCompactPath()
{
assertEquals(null, compactPath(null));
assertEquals("", compactPath(""));
assertEquals("/", compactPath("/"));
assertEquals("/", compactPath("//"));
assertEquals("/foo/", compactPath("/foo//"));
assertEquals("/foo/", compactPath("//foo/"));
assertEquals("/foo/bar", compactPath("/foo/bar"));
assertEquals("/foo/bar", compactPath("//foo//bar"));
assertEquals("/foo/bar", compactPath("/foo///bar"));
assertEquals("/foo/bar?qux=quu//baz", compactPath("/foo/bar?qux=quu//baz"));
}
@Test
public void testRelativePath()
{
assertEquals("", relativePath("/foo", null));
assertEquals("", relativePath("/foo", ""));
assertEquals("", relativePath("/foo", "/foo"));
assertEquals("", relativePath("/foo", "/foo/")); // XXX or "/"?
assertEquals("/foo", relativePath("/", "/foo"));
assertEquals("/foo/", relativePath("/", "/foo/"));
assertEquals("/foo/", relativePath(null, "/foo/"));
assertEquals("/bar", relativePath("/foo", "/foo/bar"));
assertEquals("/bar/foo", relativePath("/foo", "/bar/foo"));
assertEquals("/bar", relativePath("/foo/", "/foo/bar"));
assertEquals("/foobar", relativePath("/foo", "/foobar"));
}
@Test
public void testConcatOk()
{
assertEquals(null, concat(null, null));
assertEquals("", concat(null, ""));
assertEquals("/", concat(null, "/"));
assertEquals("foo", concat(null, "foo"));
assertEquals("/foo", concat(null, "/foo"));
assertEquals("", concat("", null));
assertEquals("/", concat("/", null));
assertEquals("foo", concat("foo", null));
assertEquals("/foo", concat("/foo", null));
assertEquals("", concat("", ""));
assertEquals("foo", concat("", "foo"));
assertEquals("/", concat("", "/"));
assertEquals("/foo", concat("", "/foo"));
assertEquals("foo", concat("foo", ""));
assertEquals("/", concat("/", ""));
assertEquals("/foo", concat("/foo", ""));
assertEquals("foo", concat("foo", ""));
assertEquals("foo/bar", concat("foo", "bar"));
assertEquals("foo/", concat("foo", "/"));
assertEquals("foo/bar", concat("foo", "/bar"));
assertEquals("/foo", concat("/", "foo"));
assertEquals("/", concat("/", "/"));
assertEquals("/bar", concat("/", "/bar"));
assertEquals("foo/", concat("foo/", null));
assertEquals("foo/", concat("foo/", ""));
assertEquals("foo/bar", concat("foo/", "bar"));
assertEquals("foo/", concat("foo/", "/"));
assertEquals("foo/bar", concat("foo/", "/bar"));
assertEquals("?quu=1", concat("?quu=1", null));
assertEquals("?quu=1", concat("?quu=1", ""));
assertEquals("foo?quu=1", concat("?quu=1", "foo"));
assertEquals("/?quu=1", concat("?quu=1", "/"));
assertEquals("/foo?quu=1", concat("?quu=1", "/foo"));
assertEquals("foo?quu=1", concat("foo?quu=1", null));
assertEquals("foo?quu=1", concat("foo?quu=1", ""));
assertEquals("foo/bar?quu=1", concat("foo?quu=1", "bar"));
assertEquals("foo/?quu=1", concat("foo?quu=1", "/"));
assertEquals("foo/bar?quu=1", concat("foo?quu=1", "/bar"));
assertEquals("foo/?quu=1", concat("foo/?quu=1", null));
assertEquals("foo/?quu=1", concat("foo/?quu=1", ""));
assertEquals("foo/bar?quu=1", concat("foo/?quu=1", "bar"));
assertEquals("foo/?quu=1", concat("foo/?quu=1", "/"));
assertEquals("foo/bar?quu=1", concat("foo/?quu=1", "/bar"));
}
@Test
public void testDecodePathOk()
{
assertEquals(null, decodePath(null));
assertEquals("foo bar", decodePath("foo%20bar"));
assertEquals("foo%23;,:=b a r", decodePath("foo%2523%3b%2c:%3db%20a%20r"));
assertEquals("f\u00e4\u00e4%23;,:=b a r=", decodePath("f\u00e4\u00e4%2523%3b%2c:%3db%20a%20r%3D"));
assertEquals("f\u0629\u0629%23;,:=b a r", decodePath("f%d8%a9%d8%a9%2523%3b%2c:%3db%20a%20r"));
}
@Test
public void testRemoveDotSegmentsOk()
{
assertEquals(null, removeDotSegments(null));
assertEquals("", removeDotSegments(""));
assertEquals("", removeDotSegments("."));
assertEquals("", removeDotSegments(".."));
assertEquals("/", removeDotSegments("/"));
assertEquals("/", removeDotSegments("/."));
assertEquals("", removeDotSegments("/.."));
assertEquals("foo", removeDotSegments("./foo"));
assertEquals("/bar/", removeDotSegments("./foo/../bar/"));
assertEquals("foo", removeDotSegments("../foo"));
assertEquals("/", removeDotSegments("/foo/.."));
assertEquals("/foo/", removeDotSegments("/foo/."));
assertEquals("/foo/bar", removeDotSegments("/foo/./bar"));
assertEquals("/bar", removeDotSegments("/foo/../bar"));
assertEquals("/bar", removeDotSegments("/foo/./../bar"));
assertEquals("/foo/bar", removeDotSegments("/foo/././bar"));
assertEquals("/qux", removeDotSegments("/foo/bar/../../qux"));
assertEquals("/foo/qux/quu", removeDotSegments("/foo/bar/../qux/././quu"));
assertEquals("/bar//", removeDotSegments("/foo/./../bar//"));
assertEquals("/", removeDotSegments("/foo/../bar/.."));
assertEquals("/foo/quu", removeDotSegments("/foo/bar/qux/./../../quu"));
assertEquals("mid/6", removeDotSegments("mid/content=5/../6"));
assertEquals("//bar/qux/file.ext", removeDotSegments("foo/.././/bar/qux/file.ext"));
// weird cases
assertEquals("..foo", removeDotSegments("..foo"));
assertEquals("foo..", removeDotSegments("foo.."));
assertEquals("foo.", removeDotSegments("foo."));
assertEquals("/.foo", removeDotSegments("/.foo"));
assertEquals("/..foo", removeDotSegments("/..foo"));
// FELIX-4440
assertEquals("foo.bar", removeDotSegments("foo.bar"));
assertEquals("/test.jsp", removeDotSegments("/test.jsp"));
assertEquals("http://foo/bar./qux.quu", removeDotSegments("http://foo/bar./qux.quu"));
assertEquals("http://foo/bar.qux/quu", removeDotSegments("http://foo/bar.qux/quu"));
}
}