blob: 6284fb94eff38229c9a9a71b51679fd2805f12a0 [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.sling.api.uri;
import static java.util.Arrays.asList;
import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.net.URI;
import java.util.List;
import java.util.function.Consumer;
import org.apache.commons.lang3.StringUtils;
import org.apache.sling.api.resource.Resource;
import org.apache.sling.api.resource.ResourceResolver;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
@RunWith(MockitoJUnitRunner.class)
public class SlingUriTest {
@Mock
ResourceResolver resolver;
@Test
public void testFullSlingUri() {
String testUriStr = "http://host.com/test/to/path.html";
testUri(testUriStr, false, false, false, true, false, slingUri -> {
assertEquals("http", slingUri.getScheme());
assertEquals("//host.com/test/to/path.html", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getUserInfo());
assertEquals("host.com", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertArrayEquals(new String[] {}, slingUri.getSelectors());
assertEquals("html", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testFullSlingUriComplex() {
String testUriStr = "https://test:pw@host.com:888/test/to/path.sel1.json/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, false, false, false, true, false, slingUri -> {
assertEquals("https", slingUri.getScheme());
assertEquals("//test:pw@host.com:888/test/to/path.sel1.json/suffix/path?p1=2&p2=3", slingUri.getSchemeSpecificPart());
assertEquals("test:pw", slingUri.getUserInfo());
assertEquals("host.com", slingUri.getHost());
assertEquals(888, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertArrayEquals(new String[] { "sel1" }, slingUri.getSelectors());
assertEquals("json", slingUri.getExtension());
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSlingUriDomainIPv4() {
String testUriStr = "https://88.39.107.39:888/test/to/path.sel1.json/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, false, false, false, true, false, slingUri -> {
assertEquals("https", slingUri.getScheme());
assertEquals("//88.39.107.39:888/test/to/path.sel1.json/suffix/path?p1=2&p2=3", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getUserInfo());
assertEquals("88.39.107.39", slingUri.getHost());
assertEquals(888, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertArrayEquals(new String[] { "sel1" }, slingUri.getSelectors());
assertEquals("json", slingUri.getExtension());
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSlingUriDomainIPv6() {
String testUriStr = "https://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.sel1.json/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, false, false, false, true, false, slingUri -> {
assertEquals("https", slingUri.getScheme());
assertEquals("//[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.sel1.json/suffix/path?p1=2&p2=3",
slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getUserInfo());
assertEquals("[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]", slingUri.getHost());
assertEquals(8080, slingUri.getPort());
assertEquals("/index", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertArrayEquals(new String[] { "sel1" }, slingUri.getSelectors());
assertEquals("json", slingUri.getExtension());
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testFullUriWithoutSchemeSimple() {
String testUriStr = "//cdn.example.com/test/js_file.js";
testUri(testUriStr, false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals("//cdn.example.com/test/js_file.js", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getUserInfo());
assertEquals("cdn.example.com", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/js_file", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("js", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
}, asList(resolver, null));
}
@Test
public void testFullUriWithoutSchemeComplex() {
String testUriStr = "//user:pw@cdn.example.com:3000/test/js_file.txt.js?par1=val1&par2=val2";
testUri(testUriStr, false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals("//user:pw@cdn.example.com:3000/test/js_file.txt.js?par1=val1&par2=val2", slingUri.getSchemeSpecificPart());
assertEquals("user:pw", slingUri.getUserInfo());
assertEquals("cdn.example.com", slingUri.getHost());
assertEquals(3000, slingUri.getPort());
assertEquals("/test/js_file", slingUri.getResourcePath());
assertEquals("txt", slingUri.getSelectorString());
assertEquals("js", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("par1=val1&par2=val2", slingUri.getQuery());
}, asList(resolver, null));
}
@Test
public void testAbsolutePathSlingUri() {
String testUriStr = "/test/to/path.sel1.json/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertEquals("json", slingUri.getExtension());
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSlingUriSuffixWithDots() {
String testUriStr = "/test/to/path.min.js/suffix/app.nodesbrowser.js";
testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("min", slingUri.getSelectorString());
assertEquals("js", slingUri.getExtension());
assertEquals("/suffix/app.nodesbrowser.js", slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSlingUriMultipleDots() {
String testUriStr = "/test/to/path.sel1.sel2..sel4.js";
testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals(4, slingUri.getSelectors().length);
assertEquals("sel1.sel2..sel4", slingUri.getSelectorString());
assertArrayEquals(new String[] { "sel1", "sel2", "", "sel4" }, slingUri.getSelectors());
assertEquals("js", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
String testUriStr2 = "/test/to/path.sel1.sel2../sel4.js";
testUri(testUriStr2, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals(1, slingUri.getSelectors().length);
assertEquals("sel1", slingUri.getSelectorString());
assertEquals("sel2", slingUri.getExtension());
assertEquals("/sel4.js", slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, null, true);
}
@Test
public void testRelativePathSlingUri() {
String testUriStr = "../path.html#frag1";
testUri(testUriStr, true, false, true, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("../path", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("html", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals("frag1", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testRelativePathSlingUriComplex() {
String testUriStr = "../path/./deep/path/../path.sel1.sel2.html?test=1#frag1";
testUri(testUriStr, true, false, true, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("../path/./deep/path/../path", slingUri.getResourcePath());
assertEquals("sel1.sel2", slingUri.getSelectorString());
assertArrayEquals(new String[] { "sel1", "sel2" }, slingUri.getSelectors());
assertEquals("html", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("test=1", slingUri.getQuery());
assertEquals("frag1", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testAbsolutePathWithPathParameter() {
String testUriStr = "/test/to/path;v='1.0'.sel1.html/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertEquals("html", slingUri.getExtension());
assertEquals(1, slingUri.getPathParameters().size());
assertEquals("1.0", slingUri.getPathParameters().get("v"));
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
String testUriStr2 = "/test/to/file;foo='bar'.sel1.sel2.json/suffix/path";
testUri(testUriStr2, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/file", slingUri.getResourcePath());
assertEquals("sel1.sel2", slingUri.getSelectorString());
assertEquals("json", slingUri.getExtension());
assertEquals(1, slingUri.getPathParameters().size());
assertEquals("bar", slingUri.getPathParameters().get("foo"));
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testAbsolutePathWithPathParameterMultiple() {
String testUriStr = "/test/to/path;v='1.0';antotherParam='test/nested';antotherParam2='7'.sel1.html/suffix/path?p1=2&p2=3#frag3939";
testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertEquals("html", slingUri.getExtension());
assertEquals(3, slingUri.getPathParameters().size());
assertEquals("1.0", slingUri.getPathParameters().get("v"));
assertEquals("test/nested", slingUri.getPathParameters().get("antotherParam"));
assertEquals("7", slingUri.getPathParameters().get("antotherParam2"));
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testAbsolutePathWithPathParameterAfterExtension() {
String testUriStr = "/test/to/path.sel1.html;v='1.0'/suffix/path?p1=2&p2=3#frag3939";
SlingUri testUri = testUri(testUriStr, true, true, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/test/to/path", slingUri.getResourcePath());
assertEquals("sel1", slingUri.getSelectorString());
assertEquals("html", slingUri.getExtension());
assertEquals(1, slingUri.getPathParameters().size());
assertEquals("1.0", slingUri.getPathParameters().get("v"));
assertEquals("/suffix/path", slingUri.getSuffix());
assertEquals("p1=2&p2=3", slingUri.getQuery());
assertEquals("frag3939", slingUri.getFragment());
}, null, true /* URL is restructured (parameter moved to end), assertion below */);
assertEquals("/test/to/path;v='1.0'.sel1.html/suffix/path?p1=2&p2=3#frag3939", testUri.toString());
}
@Test
public void testJavascriptUri() {
testUri("javascript:void(0)", false, false, false, true, true, slingUri -> {
assertEquals("javascript", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("void(0)", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testJavascriptUriLong() {
testUri("javascript:console.log('long js'); return true;", false, false, false, true, true, slingUri -> {
assertEquals("javascript", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("console.log('long js'); return true;", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, null, true);
}
@Test
public void testMailtotUri() {
String testUriStr = "mailto:jon.doe@example.com";
testUri(testUriStr, false, false, false, true, true, slingUri -> {
assertEquals("mailto", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("jon.doe@example.com", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testFileUriLocal() {
testUri("file:///path/to/test/file.txt", false, false, false, true, false, slingUri -> {
assertEquals("file", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/path/to/test/file", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("txt", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("///path/to/test/file.txt", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testFileUriWithHost() {
testUri("file://example.com:80/path/to/test/file.txt", false, false, false, true, false, slingUri -> {
assertEquals("file", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("example.com", slingUri.getHost());
assertEquals(80, slingUri.getPort());
assertEquals("/path/to/test/file", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("txt", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("//example.com:80/path/to/test/file.txt", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSpecialFileUris() {
testUri("file:/path/to/test/file.txt", false, false, false, true, false, slingUri -> {
assertEquals("file", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/path/to/test/file", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("txt", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("///path/to/test/file.txt", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
assertEquals("file:///path/to/test/file.txt", slingUri.toString());
}, null, true /* single slash is expanded to correct three slashes */);
testUri("file:///c:/WINDOWS/clock.avi", false, false, false, true, false, slingUri -> {
assertEquals("file", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/c:/WINDOWS/clock", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("avi", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("///c:/WINDOWS/clock.avi", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testCalltoUri() {
testUri("callto:screenname", false, false, false, true, true, slingUri -> {
assertEquals("callto", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("screenname", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testSmsUri() {
testUri("sms:+15105550101,+15105550102?body=hello%20there", false, false, false, true, true, slingUri -> {
assertEquals("sms", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("+15105550101,+15105550102?body=hello%20there", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testRsyncUri() {
testUri("rsync://testhost:333/path", false, false, false, true, false, slingUri -> {
assertEquals("rsync", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("testhost", slingUri.getHost());
assertEquals(333, slingUri.getPort());
assertEquals("/path", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("//testhost:333/path", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testViewSourceUri() {
testUri("view-source:http://en.wikipedia.org/wiki/URI_scheme", false, false, false, true, true, slingUri -> {
assertEquals("view-source", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("http://en.wikipedia.org/wiki/URI_scheme", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testGitUrl() {
testUri("git://github.com/user/project-name.git", false, false, false, true, false, slingUri -> {
assertEquals("git", slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals("github.com", slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals("/user/project-name", slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals("git", slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("//github.com/user/project-name.git", slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testHashOnlyUri() {
testUri("#", false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals("", slingUri.getFragment());
}, asList(resolver, null));
testUri("#fragment", false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals(null, slingUri.getQuery());
assertEquals("fragment", slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testQueryOnlyUri() {
testUri("?", false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("", slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
testUri("?test=test", false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getScheme());
assertEquals(null, slingUri.getUserInfo());
assertEquals(null, slingUri.getHost());
assertEquals(-1, slingUri.getPort());
assertEquals(null, slingUri.getResourcePath());
assertEquals(null, slingUri.getSelectorString());
assertEquals(null, slingUri.getExtension());
assertEquals(null, slingUri.getSuffix());
assertEquals("test=test", slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testUnusualQueryFragmentCombinations() {
testUri("?#", false, false, false, false, false, slingUri -> {
assertEquals("", slingUri.getQuery());
assertEquals("", slingUri.getFragment());
}, asList(resolver, null));
testUri("?t=2#", false, false, false, false, false, slingUri -> {
assertEquals("t=2", slingUri.getQuery());
assertEquals("", slingUri.getFragment());
}, asList(resolver, null));
testUri("?#t=3", false, false, false, false, false, slingUri -> {
assertEquals("", slingUri.getQuery());
assertEquals("t=3", slingUri.getFragment());
}, asList(resolver, null));
testUri("", false, false, false, false, false, slingUri -> {
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testDataUrl() {
// data url according to https://tools.ietf.org/html/rfc2397
String dataUrl = "data:image/gif;base64,R0lGODdhMAAwAPAAAAAAAP///ywAAAAAMAAw" +
"AAAC8IyPqcvt3wCcDkiLc7C0qwyGHhSWpjQu5yqmCYsapyuvUUlvONmOZtfzgFz" +
"ByTB10QgxOR0TqBQejhRNzOfkVJ+5YiUqrXF5Y5lKh/DeuNcP5yLWGsEbtLiOSp" +
"a/TPg7JpJHxyendzWTBfX0cxOnKPjgBzi4diinWGdkF8kjdfnycQZXZeYGejmJl" +
"ZeGl9i2icVqaNVailT6F5iJ90m6mvuTS4OK05M0vDk0Q4XUtwvKOzrcd3iq9uis" +
"F81M1OIcR7lEewwcLp7tuNNkM3uNna3F2JQFo97Vriy/Xl4/f1cf5VWzXyym7PH" +
"hhx4dbgYKAAA7";
testUri(dataUrl, false, false, false, true, true, slingUri -> {
assertEquals("data", slingUri.getScheme());
assertEquals(StringUtils.substringAfter(dataUrl, ":"), slingUri.getSchemeSpecificPart());
assertEquals(null, slingUri.getQuery());
assertEquals(null, slingUri.getFragment());
}, asList(resolver, null));
}
@Test
public void testGetSuffixResource() {
Resource expectedSuffixResource = mock(Resource.class);
when(resolver.getResource("/suffix/path")).thenReturn(expectedSuffixResource);
SlingUri slingUri = SlingUriBuilder.parse("/test/to/path.sel1.json/suffix/path?p1=2&p2=3#frag3939", resolver).build();
Resource suffixResource = slingUri.getSuffixResource();
assertTrue("Suffix resource equal to mock", expectedSuffixResource == suffixResource);
SlingUri slingUriDifferentSuffix = slingUri.adjust(b -> b.setSuffix("/suffix/path/non-existing"));
assertNull("Suffix resource is null if resource does not exist", slingUriDifferentSuffix.getSuffixResource());
SlingUri slingUriNoSuffix = slingUri.adjust(b -> b.setSuffix(null));
assertNull("Suffix resource is null if suffix is null", slingUriNoSuffix.getSuffixResource());
}
// -- helper methods
public static void testUri(String testUri, boolean isPath, boolean isAbsolutePath, boolean isRelativePath, boolean isAbsolute,
boolean isOpaque, Consumer<SlingUri> additionalAssertions, List<ResourceResolver> resourceResolvers) {
for (ResourceResolver rr : resourceResolvers) {
testUri(testUri, isPath, isAbsolutePath, isRelativePath, isAbsolute, isOpaque, additionalAssertions, rr);
}
}
public static SlingUri testUri(String testUri, boolean isPath, boolean isAbsolutePath, boolean isRelativePath, boolean isAbsolute,
boolean isOpaque, Consumer<SlingUri> additionalAssertions, ResourceResolver resourceResolver) {
return testUri(testUri, isPath, isAbsolutePath, isRelativePath, isAbsolute, isOpaque, additionalAssertions, resourceResolver,
false);
}
public static SlingUri testUri(String testUri, boolean isPath, boolean isAbsolutePath, boolean isRelativePath, boolean isAbsolute,
boolean isOpaque, Consumer<SlingUri> additionalAssertions, ResourceResolver resourceResolver, boolean urlIsRestructured) {
SlingUri slingUri = SlingUriBuilder.parse(testUri, resourceResolver).build();
if (!urlIsRestructured) {
URI javaUri = slingUri.toUri();
assertEquals("Uri toString() same as input", testUri, slingUri.toString());
assertEquals("Uri toUri().toString() same as input", testUri, javaUri.toString());
assertEquals("isOpaque() matches to java URI impl", javaUri.isOpaque(), slingUri.isOpaque());
assertEquals("getSchemeSpecificPart() matches to java URI impl", javaUri.getRawSchemeSpecificPart(),
slingUri.getSchemeSpecificPart());
assertEquals("getFragment() matches to java URI impl", javaUri.getRawFragment(), slingUri.getFragment());
assertEquals("getQuery() matches to java URI impl", javaUri.getRawQuery(), slingUri.getQuery());
assertEquals("isAbsolute() matches to java URI impl", javaUri.isAbsolute(), slingUri.isAbsolute());
}
assertEquals("isPath()", isPath, slingUri.isPath());
assertEquals("isAbsolutePath()", isAbsolutePath, slingUri.isAbsolutePath());
assertEquals("isRelativePath()", isRelativePath, slingUri.isRelativePath());
assertEquals("isAbsolute()", isAbsolute, slingUri.isAbsolute());
assertEquals("isOpaque()", isOpaque, slingUri.isOpaque());
additionalAssertions.accept(slingUri);
SlingUri slingUriParsedFromSameInput = SlingUriBuilder.parse(testUri, resourceResolver).build();
assertEquals("uris parsed from same input are expected to be equal", slingUriParsedFromSameInput, slingUri);
assertNotEquals("not equal to different URI", SlingUriBuilder.parse("special://host:393/path.txt/suffix", resourceResolver).build(),
slingUri);
assertNotEquals("not equal to null", slingUri, null);
assertEquals("uris parsed from same input are expected to have the same hash code", slingUriParsedFromSameInput.hashCode(),
slingUri.hashCode());
return slingUri;
}
}