blob: ecbc8381bf8c7551cfb9e9fe30d35ccdf4b43166 [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.logging.log4j.plugins.util;
import org.apache.logging.log4j.test.junit.CleanFolders;
import org.apache.logging.log4j.test.junit.URLStreamHandlerFactoryRule;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.RuleChain;
import java.io.IOException;
import java.net.*;
import java.util.Arrays;
import java.util.Collections;
import java.util.Enumeration;
import static org.junit.Assert.assertEquals;
/**
* Tests the ResolverUtil class for custom protocol like bundleresource, vfs, vfszip.
*/
public class ResolverUtilCustomProtocolTest {
@Rule
public URLStreamHandlerFactoryRule rule = new URLStreamHandlerFactoryRule(new NoopURLStreamHandlerFactory());
@Rule
public RuleChain chain = RuleChain.outerRule(new CleanFolders(ResolverUtilTest.WORK_DIR));
static class NoopURLStreamHandlerFactory implements URLStreamHandlerFactory {
@Override
public URLStreamHandler createURLStreamHandler(final String protocol) {
return new URLStreamHandler() {
@Override
protected URLConnection openConnection(final URL url) {
return open(url, null);
}
private URLConnection open(final URL url, final Proxy proxy) {
return new URLConnection(url) {
@Override
public void connect() throws IOException {
// do nothing
}
};
}
@Override
protected URLConnection openConnection(final URL url, final Proxy proxy) {
return open(url, proxy);
}
@Override
protected int getDefaultPort() {
return 1;
}
};
}
}
static class SingleURLClassLoader extends ClassLoader {
private final URL url;
public SingleURLClassLoader(final URL url) {
this.url = url;
}
public SingleURLClassLoader(final URL url, final ClassLoader parent) {
super(parent);
this.url = url;
}
@Override
protected URL findResource(final String name) {
return url;
}
@Override
public URL getResource(final String name) {
return findResource(name);
}
@Override
public Enumeration<URL> getResources(final String name) throws IOException {
return findResources(name);
}
@Override
protected Enumeration<URL> findResources(final String name) throws IOException {
return Collections.enumeration(Arrays.asList(findResource(name)));
}
}
@Test
public void testExtractPathFromVfsEarJarWindowsUrl() throws Exception {
final URL url = new URL(
"vfs:/C:/jboss/jboss-eap-6.4/standalone/deployments/com.xxx.yyy.application-ear.ear/lib/com.xxx.yyy.logging.jar/com/xxx/yyy/logging/config/");
final String expected = "/C:/jboss/jboss-eap-6.4/standalone/deployments/com.xxx.yyy.application-ear.ear/lib/com.xxx.yyy.logging.jar/com/xxx/yyy/logging/config/";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfsWarClassesWindowsUrl() throws Exception {
final URL url = new URL(
"vfs:/C:/jboss/jboss-eap-6.4/standalone/deployments/test-log4j2-web-standalone.war/WEB-INF/classes/org/hypik/test/jboss/eap7/logging/config/");
final String expected = "/C:/jboss/jboss-eap-6.4/standalone/deployments/test-log4j2-web-standalone.war/WEB-INF/classes/org/hypik/test/jboss/eap7/logging/config/";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfsWarClassesLinuxUrl() throws Exception {
final URL url = new URL(
"vfs:/content/mycustomweb.war/WEB-INF/classes/org/hypik/test/jboss/log4j2/logging/pluginweb/");
final String expected = "/content/mycustomweb.war/WEB-INF/classes/org/hypik/test/jboss/log4j2/logging/pluginweb/";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfszipUrl() throws Exception {
final URL url = new URL(
"vfszip:/home2/jboss-5.0.1.CR2/jboss-as/server/ais/ais-deploy/myear.ear/mywar.war/WEB-INF/some.xsd");
final String expected = "/home2/jboss-5.0.1.CR2/jboss-as/server/ais/ais-deploy/myear.ear/mywar.war/WEB-INF/some.xsd";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfsEarJarLinuxUrl() throws Exception {
final URL url = new URL(
"vfs:/content/test-log4k2-ear.ear/lib/test-log4j2-jar-plugins.jar/org/hypik/test/jboss/log4j2/pluginjar/");
final String expected = "/content/test-log4k2-ear.ear/lib/test-log4j2-jar-plugins.jar/org/hypik/test/jboss/log4j2/pluginjar/";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfszipUrlWithPlusCharacters() throws Exception {
final URL url = new URL("vfszip:/path+with+plus/file+name+with+plus.xml");
final String expected = "/path+with+plus/file+name+with+plus.xml";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromVfsUrlWithPlusCharacters() throws Exception {
final URL url = new URL("vfs:/path+with+plus/file+name+with+plus.xml");
final String expected = "/path+with+plus/file+name+with+plus.xml";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromResourceBundleUrl() throws Exception {
final URL url = new URL("bundleresource:/some/path/some/file.properties");
final String expected = "/some/path/some/file.properties";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testExtractPathFromResourceBundleUrlWithPlusCharacters() throws Exception {
final URL url = new URL("bundleresource:/some+path/some+file.properties");
final String expected = "/some+path/some+file.properties";
assertEquals(expected, new ResolverUtil().extractPath(url));
}
@Test
public void testFindInPackageFromVfsDirectoryURL() throws Exception {
try (final URLClassLoader cl = ResolverUtilTest.compileAndCreateClassLoader("3")) {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil
.setClassLoader(new SingleURLClassLoader(new URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil3/customplugin3/"), cl));
resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin3");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
assertEquals("Unexpected class resolved", cl.loadClass("customplugin3.FixedString3"),
resolverUtil.getClasses().iterator().next());
}
}
@Test
public void testFindInPackageFromVfsJarURL() throws Exception {
try (final URLClassLoader cl = ResolverUtilTest.compileJarAndCreateClassLoader("4")) {
final ResolverUtil resolverUtil = new ResolverUtil();
resolverUtil.setClassLoader(new SingleURLClassLoader(
new URL("vfs:/" + ResolverUtilTest.WORK_DIR + "/resolverutil4/customplugin4.jar/customplugin4/"), cl));
resolverUtil.findInPackage(new PluginRegistry.PluginTest(), "customplugin4");
assertEquals("Class not found in packages", 1, resolverUtil.getClasses().size());
assertEquals("Unexpected class resolved", cl.loadClass("customplugin4.FixedString4"),
resolverUtil.getClasses().iterator().next());
}
}
}