blob: 5bab320f68ccb1149174e392d1e2a07ceef0a3b6 [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.
*/
/* $Id$ */
package org.apache.fop.apps.io;
import java.io.IOException;
import java.io.InputStream;
import java.io.StringWriter;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNull;
import static org.junit.Assert.fail;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import org.apache.commons.io.IOUtils;
import org.apache.xmlgraphics.io.ResourceResolver;
import org.apache.xmlgraphics.util.WriterOutputStream;
import org.apache.xmlgraphics.util.io.Base64EncodeStream;
public class URIResolverWrapperTestCase {
private static final List<String> BASE_URIS = Collections.unmodifiableList(Arrays.asList(
".",
"../",
"some/path",
"file:///absolute/file/path"));
private URI base;
@Before
public void setup() throws URISyntaxException {
setBase(".");
}
private void setBase(String baseStr) throws URISyntaxException {
base = new URI(baseStr);
}
@Test
public void testResolveIn() throws Exception {
String[] uris = new String[]{".", "resource", "path/to/resource",
"datafoo:application/octet-stream;interpreter=fop;base64,AAECAwQF"};
for (String base : BASE_URIS) {
setBase(base);
for (String uriStr : uris) {
URI uri = new URI(uriStr);
URI expected = resolveFromBase(uri);
test(uriStr, uri, expected);
}
}
}
@Test
public void testGetResourceForURIStartingWithData() throws Exception {
String uriStr = "data:application/octet-stream;interpreter=fop;base64,AAECAwQF";
ResourceResolver resolver = mock(ResourceResolver.class);
InternalResourceResolver sut = new InternalResourceResolver(base, resolver);
URI uri = new URI(uriStr);
InputStream actual = sut.getResource(uri);
StringWriter stringWriter = new StringWriter();
Base64EncodeStream out = new Base64EncodeStream(
new WriterOutputStream(stringWriter, "US-ASCII"), false);
IOUtils.copy(actual, out);
assertEquals("AAECAwQF", stringWriter.toString());
}
@Test
public void testResolveInBadUri() throws Exception {
String[] uris = new String[] {"path\\to\\resource", "bad resource name"};
for (String base : BASE_URIS) {
setBase(base);
for (String uriStr : uris) {
assertBadSyntax(uriStr);
URI uri = cleanURI(uriStr);
URI expected = resolveFromBase(uri);
test(uriStr, uri, expected);
}
}
}
@Test
public void getBaseURI() throws URISyntaxException {
assertEquals(InternalResourceResolver.getBaseURI("x/y/z/"), new URI("x/y/z/"));
assertEquals(InternalResourceResolver.getBaseURI("x/y/z"), new URI("x/y/z/"));
}
@Test
public void cleanURI() throws URISyntaxException {
String[] uris = new String[] {".", "path/to/resource", "path\\to\\resource",
"bad resource name"};
for (String uri : uris) {
assertEquals(InternalResourceResolver.cleanURI(uri), cleanURI(uri));
}
assertNull(InternalResourceResolver.cleanURI(null));
}
private void test(String uriStr, URI uri, URI expected) throws IOException, URISyntaxException {
ResourceResolver resolver = mock(ResourceResolver.class);
InternalResourceResolver sut = new InternalResourceResolver(base, resolver);
sut.getResource(uriStr);
verify(resolver).getResource(eq(expected));
resolver = mock(ResourceResolver.class);
sut = new InternalResourceResolver(base, resolver);
sut.getResource(uri);
verify(resolver).getResource(eq(expected));
}
private URI resolveFromBase(URI uri) {
return base.resolve(uri);
}
private URI cleanURI(String raw) throws URISyntaxException {
String fixedUri = raw.replace('\\', '/');
fixedUri = fixedUri.replace(" ", "%20");
return new URI(fixedUri);
}
private void assertBadSyntax(String badUri) {
try {
new URI(badUri);
fail(badUri + " is correctly formed.");
} catch (URISyntaxException e) {
// PASS
}
}
@Test
public void testJarUri() {
URI uri = new InternalResourceResolver(URI.create("jar:file:/home/my.jar!/fop.xconf"), null)
.resolveFromBase(URI.create("x"));
assertEquals(uri.toString(), "jar:file:/home/my.jar!/x");
}
}