package com.github.atdi.gboot.loader; import java.io.File; import java.net.URL; import com.github.atdi.gboot.loader.jar.GBootJarFile; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TemporaryFolder; import static org.hamcrest.Matchers.equalTo; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertThat; import static org.junit.Assert.assertTrue; public class GBootClassLoaderTest { @Rule public TemporaryFolder temporaryFolder = new TemporaryFolder(); @Test public void resolveResourceFromWindowsFilesystem() throws Exception { // This path is invalid - it should return null even on Windows. // A regular URLClassLoader will deal with it gracefully. assertNull(getClass().getClassLoader().getResource( "c:\\Users\\user\\bar.properties")); GBootClassLoader loader = new GBootClassLoader(new URL[] { new URL( "jar:file:src/test/resources/jars/model.jar!/") }, getClass() .getClassLoader()); // So we should too... assertNull(loader.getResource("c:\\Users\\user\\bar.properties")); } @Test public void resolveResourceFromArchive() throws Exception { GBootClassLoader loader = new GBootClassLoader(new URL[] { new URL( "jar:file:src/test/resources/jars/model.jar!/") }, getClass() .getClassLoader()); assertNotNull(loader.getResource("com/play/Model.class")); loader.loadClass("com.play.Model"); } @Test public void resolveResourcesFromArchive() throws Exception { GBootClassLoader loader = new GBootClassLoader(new URL[] { new URL( "jar:file:src/test/resources/jars/model.jar!/") }, getClass() .getClassLoader()); assertTrue(loader.getResources("com/play/Model.class").hasMoreElements()); loader.loadClass("com.play.Model", true); } @Test public void resolveRootPathFromArchive() throws Exception { GBootClassLoader loader = new GBootClassLoader(new URL[] { new URL( "jar:file:src/test/resources/jars/model.jar!/") }, getClass() .getClassLoader()); assertNotNull(loader.getResource("")); } @Test public void resolveRootResourcesFromArchive() throws Exception { GBootClassLoader loader = new GBootClassLoader(new URL[] { new URL( "jar:file:src/test/resources/jars/model.jar!/") }, getClass() .getClassLoader()); assertTrue(loader.getResources("").hasMoreElements()); } @Test public void resolveFromNested() throws Exception { File file = this.temporaryFolder.newFile(); DummyJarCreator.createTestJar(file); GBootJarFile jarFile = new GBootJarFile(file); URL url = jarFile.getUrl(); GBootClassLoader loader = new GBootClassLoader(new URL[] { url }, null); URL resource = loader.getResource("nested.jar!/3.dat"); assertThat(resource.toString(), equalTo(url + "nested.jar!/3.dat")); assertThat(resource.openConnection().getInputStream().read(), equalTo(3)); } }