package com.github.atdi.gboot.loader; import java.io.File; import java.net.URL; import java.net.URLClassLoader; import java.util.concurrent.Callable; import com.github.atdi.gboot.loader.archive.Archive; import org.junit.Before; import org.junit.Test; import org.mockito.Mock; import org.mockito.MockitoAnnotations; import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertTrue; import static org.mockito.BDDMockito.given; public class ExecutableArchiveLauncherTest { @Mock private JavaAgentDetector javaAgentDetector; private ExecutableArchiveLauncher launcher; @Before public void setupMocks() { MockitoAnnotations.initMocks(this); this.launcher = new UnitTestExecutableArchiveLauncher(this.javaAgentDetector); } @Test public void createdClassLoaderContainsUrlsFromThreadContextClassLoader() throws Exception { final URL[] urls = new URL[] { new URL("file:one"), new URL("file:two") }; doWithTccl(new URLClassLoader(urls), new Callable<Void>() { @Override public Void call() throws Exception { ClassLoader classLoader = ExecutableArchiveLauncherTest.this.launcher .createClassLoader(new URL[0]); assertClassLoaderUrls(classLoader, urls); return null; } }); } @Test public void javaAgentJarsAreExcludedFromClasspath() throws Exception { URL javaAgent = new File("my-agent.jar").getCanonicalFile().toURI().toURL(); final URL one = new URL("file:one"); given(this.javaAgentDetector.isJavaAgentJar(javaAgent.toURI())).willReturn(true); doWithTccl(new URLClassLoader(new URL[] { javaAgent, one }), new Callable<Void>() { @Override public Void call() throws Exception { ClassLoader classLoader = ExecutableArchiveLauncherTest.this.launcher .createClassLoader(new URL[0]); assertClassLoaderUrls(classLoader, new URL[] { one }); return null; } }); } private void assertClassLoaderUrls(ClassLoader classLoader, URL[] urls) { assertTrue(classLoader instanceof URLClassLoader); assertArrayEquals(urls, ((URLClassLoader) classLoader).getURLs()); } private static final class UnitTestExecutableArchiveLauncher extends ExecutableArchiveLauncher { public UnitTestExecutableArchiveLauncher(JavaAgentDetector javaAgentDetector) { super(javaAgentDetector); } @Override protected boolean isNestedArchive(Archive.Entry entry) { return false; } } private void doWithTccl(ClassLoader classLoader, Callable<?> action) throws Exception { ClassLoader old = Thread.currentThread().getContextClassLoader(); try { Thread.currentThread().setContextClassLoader(classLoader); action.call(); } finally { Thread.currentThread().setContextClassLoader(old); } } }