[jboss-cvs] JBossAS SVN: r64747 - projects/aop/branches/leaks/aop/src/test/org/jboss/test/aop/memoryleaks.
jboss-cvs-commits at lists.jboss.org
jboss-cvs-commits at lists.jboss.org
Tue Aug 21 14:00:08 EDT 2007
Author: kabir.khan at jboss.com
Date: 2007-08-21 14:00:07 -0400 (Tue, 21 Aug 2007)
New Revision: 64747
Modified:
projects/aop/branches/leaks/aop/src/test/org/jboss/test/aop/memoryleaks/MemoryLeakTestCase.java
Log:
Fix URL for undeploy so it works on linux
Modified: projects/aop/branches/leaks/aop/src/test/org/jboss/test/aop/memoryleaks/MemoryLeakTestCase.java
===================================================================
--- projects/aop/branches/leaks/aop/src/test/org/jboss/test/aop/memoryleaks/MemoryLeakTestCase.java 2007-08-21 17:24:32 UTC (rev 64746)
+++ projects/aop/branches/leaks/aop/src/test/org/jboss/test/aop/memoryleaks/MemoryLeakTestCase.java 2007-08-21 18:00:07 UTC (rev 64747)
@@ -18,7 +18,7 @@
* License along with this software; if not, write to the Free
* Software Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
* 02110-1301 USA, or see the FSF site: http://www.fsf.org.
-*/
+*/
package org.jboss.test.aop.memoryleaks;
import java.io.File;
@@ -45,7 +45,7 @@
import org.jboss.test.aop.AOPTestWithSetup;
/**
- *
+ *
* @author <a href="clebert.suconic at jboss.com">Clebert Suconic</a>
* @author <a href="kabir.khan at jboss.com">Kabir Khan</a>
*/
@@ -56,7 +56,7 @@
Method aspectXmkLoaderUndeployXmlMethod;
Method aspectManagerInstanceMethod;
Method aspectManagerUnregisterClassLoader;
-
+
/**
* Constructor for UndeployTester.
* @param arg0
@@ -65,7 +65,7 @@
{
super(name);
}
-
+
public MemoryLeakTestCase()
{
super();
@@ -76,7 +76,7 @@
MemoryLeakTestCase test = new MemoryLeakTestCase();
test.testWithClassLoader();
}
-
+
@Override
protected void setUp() throws Exception
{
@@ -88,7 +88,7 @@
public void testWithClassLoader() throws Exception
{
-
+
LogManager.getLogManager(); // this is just to avoid a thread to be created using this ContextClassLoader inside LogManager
WeakReference weakReferenceOnLoader = null;
Class xmlLoader = null; // we need to keep that reference, so only the customer's classLoader will go away.
@@ -101,50 +101,50 @@
final ClassLoader oldloader = Thread.currentThread().getContextClassLoader();
ClassLoader loader = newClassLoader(oldloader);
weakReferenceOnLoader = new WeakReference(loader);
-
+
Thread.currentThread().setContextClassLoader(loader);
System.out.println("OLD Loader " + oldloader);
System.out.println("NEW Loader " + loader);
-
+
ClassLoader parent = loader.getParent();
while (parent != null)
{
System.out.println("Parent " + parent);
parent = parent.getParent();
}
-
-
+
+
Class testClass = getTestCaseClass(loader);
className = testClass.getName();
-
+
Class aspectManagerClass = loader.loadClass("org.jboss.aop.AspectManager");
assertNotSame(aspectManagerClass.getClassLoader(), this.getClass().getClassLoader());
-
+
System.out.println("oldLoader");
-
+
xmlLoader = loader.loadClass("org.jboss.aop.AspectXmlLoader");
initMethods(aspectManagerClass, xmlLoader);
-
+
assertNotSame(xmlLoader.getClassLoader(),loader);
-
+
ArrayList methods = getTestMethods(testClass);
Object testInstance = getTestInstance(testClass);
-
+
boolean passed = runTests(testInstance, methods);
assertTrue(passed);
-
+
undeploy(xmlLoader);
-
+
passed = runTests(testInstance, methods, true);
System.out.println("============ Ran tests after undeploy with errors: " + passed);
-
+
unregisterClassLoader(aspectManagerClass, loader);
-
+
loader=null;
testClass=null;
testInstance = null;
methods.clear();
- //xmlLoader = null;
+ //xmlLoader = null;
AccessController.doPrivileged(new PrivilegedAction()
{
public Object run()
@@ -156,7 +156,7 @@
}
assertEquals(1, countInstances("org.jboss.aop.AspectManager", true));
-
+
if (extraClasses != null)
{
StringTokenizer tok = new StringTokenizer(extraClasses, ":;,");
@@ -172,9 +172,9 @@
}
}
}
-
+
checkUnload( weakReferenceOnLoader, className);
-
+
// I'm pretty sure nobody would clear that reference. I'm keeping this assertion here just to make it clear why we can't clear xmlLoader
assertNotNull("The masterClassLoader needs to keep a reference, only the customer's classLoader needs to go away",xmlLoader);
}
@@ -183,22 +183,22 @@
e.printStackTrace();
throw e;
}
-
+
System.out.println("Done!");
}
private Object getTestInstance(Class testClass) throws Exception
{
-
+
Constructor[] constructors = testClass.getConstructors();
Constructor defaultConstructor = null;
Constructor nameConstructor = null;
-
+
for (int i = 0 ; i < constructors.length ; i++)
{
System.out.println("found ctor " + constructors[i]);
Class[] params = constructors[i].getParameterTypes();
-
+
if (params.length == 0)
{
defaultConstructor = constructors[i];
@@ -208,10 +208,10 @@
nameConstructor = constructors[i];
}
}
-
+
if (nameConstructor != null)
{
- return nameConstructor.newInstance(new Object[] {testClass.getName()});
+ return nameConstructor.newInstance(new Object[] {testClass.getName()});
}
if (defaultConstructor != null)
{
@@ -233,12 +233,12 @@
}
return testMethods;
}
-
+
private boolean runTests(Object testInstance, ArrayList methods)
{
return runTests(testInstance, methods, false);
}
-
+
private boolean runTests(Object testInstance, ArrayList methods, boolean breakOnError)
{
Method setup = null;
@@ -260,7 +260,7 @@
catch (Exception e)
{
}
-
+
boolean passed = true;
for (Iterator it = methods.iterator() ; it.hasNext() ; )
{
@@ -268,12 +268,12 @@
try
{
System.out.println("============ Running test " + testInstance.getClass().getName() + "." + test.getName());
-
- if (setup != null)
+
+ if (setup != null)
{
setup.invoke(testInstance, new Object[0]);
}
-
+
test.invoke(testInstance, new Object[0]);
if (!breakOnError)
{
@@ -295,7 +295,7 @@
}
finally
{
- if (tearDown != null)
+ if (tearDown != null)
{
try
{
@@ -308,15 +308,15 @@
}
}
-
+
return passed;
}
-
+
private Class getTestCaseClass(ClassLoader loader) throws Exception
{
String className = System.getProperty("test.to.run");
assertNotNull("Test to be run must be passed in test.to.run system property", className);
-
+
Class testClass = loader.loadClass(className);
assertSame("Fix your classpath, this test is not valid", loader, testClass.getClassLoader());
assertNotSame(testClass.getClassLoader(), this.getClass().getClassLoader());
@@ -328,7 +328,7 @@
JVMTIInterface jvmti = new JVMTIInterface();
if (jvmti.isActive())
{
-
+
//clearEverySingleFieldOnInstances("org.jboss.aop.AspectManager"); // This part is not intended to be commited. It could be used during debug, and you could use to release references on purpose, just to evaluate behavior
jvmti.forceReleaseOnSoftReferences();
@@ -338,9 +338,9 @@
{
jvmti.heapSnapshot("snapshot", "mem");
clazz=null;
-
+
String report =jvmti.exploreClassReferences(className, 15, true, false, false, false, true);
-
+
//System.out.println(report);
String reportDir = System.getProperty("leak.report.dir");
assertNotNull("You must pass in the directory for the reports as leak.report.dir", reportDir);
@@ -349,12 +349,12 @@
PrintStream realoutput = new PrintStream(outfile);
realoutput.println(report);
realoutput.close();
-
-
+
+
jvmti.forceGC();
-
+
clazz = jvmti.getClassByName(className);
-
+
clearEverySingleFieldOnInstances("org.jboss.aop.AspectManager"); // This part is not intended to be commited. It could be used during debug, and you could use to release references on purpose, just to evaluate behavior
clazz = jvmti.getClassByName(className);
@@ -362,18 +362,18 @@
{
System.out.println("Attention: After clearing every field on AspectManager, GC could release the classLoader");
}
-
+
fail ("Class " + className + " still referenced. Look at report for more details");
}
}
}
-
+
private void reportInstanceReferences(WeakReference weakReferenceOnLoader, String className) throws Exception
{
JVMTIInterface jvmti = new JVMTIInterface();
if (jvmti.isActive())
{
-
+
jvmti.forceReleaseOnSoftReferences();
jvmti.forceGC();
Class clazz = jvmti.getClassByName(className);
@@ -383,12 +383,12 @@
clazz=null;
Object[] objects = jvmti.getAllObjects(className);
System.out.println("============> Instances of " + className + " " + objects.length);
-
+
//String report =jvmti.exploreClassReferences(className, 15, true, false, false, false, true);
String report = jvmti.exploreObjectReferences(className, 15, false);
-
-
-
+
+
+
System.out.println("================= " + className + " ================");
System.out.println(report);
String reportDir = System.getProperty("leak.report.dir");
@@ -397,11 +397,11 @@
FileOutputStream outfile = new FileOutputStream(outputfile);
PrintStream realoutput = new PrintStream(outfile);
realoutput.println(report);
- realoutput.close();
+ realoutput.close();
}
}
}
-
+
public Field[] getDeclaredFields(Class clazz)
{
ArrayList list = new ArrayList();
@@ -413,20 +413,20 @@
fields[i].setAccessible(true);
list.add(fields[i]);
}
-
+
}
-
+
return (Field[]) list.toArray(new Field[list.size()]);
}
-
-
+
+
private void clearEverySingleFieldOnInstances(String className)
{
System.out.println("Clearing " + className);
JVMTIInterface jvmti = new JVMTIInterface();
Class classes[] = jvmti.getLoadedClasses();
Object objects[] = null;
-
+
for (int i=0;i<classes.length;i++)
{
if (classes[i].getName().equals(className))
@@ -477,7 +477,7 @@
subClasses++;
}
}
-
+
return objects.length - subClasses;
}
@@ -485,7 +485,7 @@
{
System.out.println("============ Unregistering ClassLoader");
Object aspectManager = aspectManagerInstanceMethod.invoke(null, new Object[0]);
-
+
aspectManagerUnregisterClassLoader.invoke(aspectManager, new Object[] {loader});
}
@@ -493,7 +493,7 @@
{
Properties props = System.getProperties();
Enumeration iter = props.keys();
-
+
System.out.println("properties:");
while (iter.hasMoreElements())
{
@@ -517,8 +517,8 @@
{
System.out.println("pathIgnore=" + pathIgnore);
}
-
-
+
+
ArrayList urls = new ArrayList();
while (tokenString.hasMoreElements())
{
@@ -533,14 +533,14 @@
System.out.println("Skipping " + classLocation);
}
}
-
+
URL[] urlArray= (URL[])urls.toArray(new URL[urls.size()]);
-
+
ClassLoader masterClassLoader = URLClassLoader.newInstance(urlArray,null);
-
-
+
+
ClassLoader appClassLoader = URLClassLoader.newInstance(new URL[] {classLocation},masterClassLoader);
-
+
return appClassLoader;
}
@@ -556,13 +556,13 @@
String strurl = jbossAopPath;
assertNotNull("Property jboss.aop.path should be defined",strurl);
strurl = strurl.replace('\\','/');
- URL url = new URL("file:/" + strurl);
-
+ URL url = new URL("file://" + strurl);
+
aspectXmkLoaderUndeployXmlMethod.invoke(null, new Object[] {url});
-
+
System.out.println("\n====================================================================");
System.out.println("!!!! Undeployed " + url);
System.out.println("=====================================================================\n");
}
-
+
}
More information about the jboss-cvs-commits
mailing list