package com.alibaba.druid.bvt.log; import java.io.IOException; import java.io.InputStream; import java.net.URL; import java.security.PrivilegedAction; import java.sql.Connection; import java.util.Enumeration; import java.util.HashSet; import java.util.Set; import junit.framework.TestCase; import com.alibaba.druid.pool.DruidDataSource; import com.alibaba.druid.proxy.DruidDriver; import com.alibaba.druid.util.Utils; import com.alibaba.druid.util.JdbcUtils; public class LoggerTest extends TestCase { private static java.security.ProtectionDomain DOMAIN; private ClassLoader contextClassLoader; private DruidDataSource dataSource; static { DOMAIN = (java.security.ProtectionDomain) java.security.AccessController.doPrivileged(new PrivilegedAction<Object>() { public Object run() { return TestLoader.class.getProtectionDomain(); } }); } public static class TestLoader extends ClassLoader { private ClassLoader loader; private Set<String> definedSet = new HashSet<String>(); public TestLoader(){ super(null); loader = DruidDriver.class.getClassLoader(); } public URL getResource(String name) { return loader.getResource(name); } public Enumeration<URL> getResources(String name) throws IOException { return loader.getResources(name); } public Class<?> loadClass(String name) throws ClassNotFoundException { if (name.startsWith("java")) { return loader.loadClass(name); } if (definedSet.contains(name)) { return super.loadClass(name); } String resourceName = name.replace('.', '/') + ".class"; InputStream is = loader.getResourceAsStream(resourceName); if (is == null) { throw new ClassNotFoundException(); } try { byte[] bytes = Utils.readByteArray(is); this.defineClass(name, bytes, 0, bytes.length, DOMAIN); definedSet.add(name); } catch (IOException e) { throw new ClassNotFoundException(e.getMessage(), e); } try { is.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } Class<?> clazz = super.loadClass(name); return clazz; } } public void test_log() throws Exception { TestLoader classLoader = new TestLoader(); Thread.currentThread().setContextClassLoader(classLoader); dataSource = new DruidDataSource(); dataSource.setFilters("log"); dataSource.setUrl("jdbc:mock:xx"); Connection conn = dataSource.getConnection(); conn.close(); } @Override protected void setUp() throws Exception { contextClassLoader = Thread.currentThread().getContextClassLoader(); } @Override protected void tearDown() throws Exception { Thread.currentThread().setContextClassLoader(contextClassLoader); JdbcUtils.close(dataSource); } }