/**
* BSD-style license; for more info see http://pmd.sourceforge.net/license.html
*/
package net.sourceforge.pmd.typeresolution;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.fail;
import java.util.Map;
import org.junit.Before;
import org.junit.Ignore;
import org.junit.Test;
import net.sourceforge.pmd.lang.java.typeresolution.PMDASMClassLoader;
public class PMDASMClassLoaderTest {
private PMDASMClassLoader cl;
@Before
public void setUp() throws Exception {
cl = PMDASMClassLoader.getInstance(getClass().getClassLoader());
}
@Test
public void testLoadClassWithImportOnDemand() throws Exception {
String className = "net.sourceforge.pmd.typeresolution.ClassWithImportOnDemand";
Class<?> clazz = cl.loadClass(className);
assertNotNull(clazz);
Map<String, String> imports = cl.getImportedClasses(className);
assertNotNull(imports);
assertEquals("java.util.List", imports.get("List"));
assertEquals("java.util.ArrayList", imports.get("ArrayList"));
assertEquals("java.lang.Object", imports.get("Object"));
assertEquals("net.sourceforge.pmd.typeresolution.ClassWithImportOnDemand",
imports.get("ClassWithImportOnDemand"));
}
@Test
public void testClassWithImportInnerOnDemand() throws Exception {
String className = "net.sourceforge.pmd.typeresolution.ClassWithImportInnerOnDemand";
Class<?> clazz = cl.loadClass(className);
assertNotNull(clazz);
Map<String, String> imports = cl.getImportedClasses(className);
assertNotNull(imports);
assertEquals("java.util.Iterator", imports.get("Iterator"));
assertEquals("java.util.Map", imports.get("Map"));
assertEquals("java.util.Set", imports.get("Set"));
assertEquals("java.util.Map$Entry", imports.get("Entry"));
assertEquals("java.util.Map$Entry", imports.get("Map$Entry"));
assertEquals("java.lang.Object", imports.get("Object"));
assertEquals("java.util.StringTokenizer", imports.get("StringTokenizer"));
assertEquals("net.sourceforge.pmd.typeresolution.ClassWithImportInnerOnDemand",
imports.get("ClassWithImportInnerOnDemand"));
}
/**
* Unit test for bug 3546093.
*
* @throws Exception
* any error
*/
@Test
public void testCachingOfNotFoundClasses() throws Exception {
MockedClassLoader mockedClassloader = new MockedClassLoader();
PMDASMClassLoader cl = PMDASMClassLoader.getInstance(mockedClassloader);
String notExistingClassname = "that.clazz.doesnot.Exist";
try {
cl.loadClass(notExistingClassname);
fail();
} catch (ClassNotFoundException e) {
// expected
}
try {
cl.loadClass(notExistingClassname);
fail();
} catch (ClassNotFoundException e) {
// expected
}
assertEquals(1, mockedClassloader.findClassCalls);
}
private static class MockedClassLoader extends ClassLoader {
int findClassCalls = 0;
@Override
protected Class<?> findClass(String name) throws ClassNotFoundException {
findClassCalls++;
return super.findClass(name);
}
}
/**
* With this test you can verify, how much memory could be consumed by the
* dontBother cache.
*
* @throws Exception
* any error
*/
@Ignore
@Test
public void testCachingMemoryConsumption() throws Exception {
MockedClassLoader mockedClassLoader = new MockedClassLoader();
PMDASMClassLoader cl = PMDASMClassLoader.getInstance(mockedClassLoader);
Runtime runtime = Runtime.getRuntime();
System.gc();
long usedBytesBefore = runtime.totalMemory() - runtime.freeMemory();
for (long i = 0; i < 3000; i++) {
try {
cl.loadClass("com.very.long.package.name.and.structure.MyClass" + i);
} catch (ClassNotFoundException e) {
// expected
}
}
long usedBytesAfter = runtime.totalMemory() - runtime.freeMemory();
System.out.println((usedBytesAfter - usedBytesBefore) / (1024.0 * 1024.0) + " mb needed");
}
}