Browse Source

Bug 153907 "Facilitate LTW testing in a custom ClassLoader hierarchy" (TestServer, TestServerTest and LTWServerTests)

tags/post_pr_153572
mwebster 17 years ago
parent
commit
3b517caf40

+ 185
- 0
testing-client/src/org/aspectj/testing/server/TestServer.java View File

@@ -0,0 +1,185 @@
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Webster - initial implementation
*******************************************************************************/
package org.aspectj.testing.server;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.net.URL;
import java.net.URLClassLoader;
import java.util.ArrayList;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import java.util.StringTokenizer;

public class TestServer implements Runnable {

private static final boolean debug = false;

private boolean exitOnError = true;
private File workingDirectory;
private ClassLoader rootLoader;
private Map loaders = new HashMap();

private String mainClass = "UnknowClass";
private String mainLoader = "UnknowLoader";
public void initialize () throws IOException {
createRootLoader();
loadConfiguration();
}
private void loadConfiguration () throws IOException {
File file = new File(workingDirectory,"server.properties");
Properties props = new Properties();
FileInputStream in = new FileInputStream(file);
props.load(in);
in.close();
Enumeration enu = props.propertyNames();
while (enu.hasMoreElements()) {
String key = (String)enu.nextElement();
if (key.startsWith("loader.")) {
createLoader(props.getProperty(key));
}
else if (key.equals("main")) {
StringTokenizer st = new StringTokenizer(props.getProperty(key),",");
mainClass = st.nextToken();
mainLoader = st.nextToken();
}
}
}
private void createLoader (String property) throws IOException {
ClassLoader parent = rootLoader;

StringTokenizer st = new StringTokenizer(property,",");
String name = st.nextToken();
String classpath = st.nextToken();
if (st.hasMoreTokens()) {
String parentName = st.nextToken();
parent = (ClassLoader)loaders.get(parentName);
if (parent == null) error("No such loader: " + parentName);
}

List urlList = new ArrayList();
st = new StringTokenizer(classpath,";");
while (st.hasMoreTokens()) {
String fileName = st.nextToken();
File file = new File(workingDirectory,fileName).getCanonicalFile();
if (!file.exists()) error("Missing or invalid file: " + file.getPath());
URL url = file.toURL();
urlList.add(url);
}
URL[] urls = new URL[urlList.size()];
urlList.toArray(urls);
ClassLoader loader = new URLClassLoader(urls, parent);

loaders.put(name,loader);
}
private void createRootLoader () throws IOException {
List urlList = new ArrayList();
/* Sandbox */
URL url = workingDirectory.getCanonicalFile().toURL();
urlList.add(url);

/* AspectJ runtime */
URL[] urls = ((URLClassLoader)getClass().getClassLoader()).getURLs();
for (int i = 0; i < urls.length; i++) {
url = urls[i];
if (debug) System.err.println("? TestServer.initialize() " + url);
String file = url.getFile();
if (file.indexOf("runtime") != -1 || file.indexOf("aspectj5rt") != -1) {
urlList.add(url);
}
}
if (debug) System.err.println("? TestServer.initialize() urlList=" + urlList);
urls = new URL[urlList.size()];
urlList.toArray(urls);
ClassLoader parent = getClass().getClassLoader().getParent();
rootLoader = new URLClassLoader(urls,parent);
}
public void setExitOntError (boolean b) {
exitOnError = b;
}
public void setWorkingDirectory (String name) {
workingDirectory = new File(name);
if (!workingDirectory.exists()) error("Missing or invalid working directory: " + workingDirectory.getPath());
}
public static void main(String[] args) throws Exception {
System.out.println("Starting ...");
TestServer server = new TestServer();
server.setWorkingDirectory(args[0]);
server.initialize();
Thread thread = new Thread(server,"application");
thread.start();
thread.join();
System.out.println("Stopping ...");
}

public void run() {
System.out.println("Running " + mainClass);
runClass(mainClass,(ClassLoader)loaders.get(mainLoader));
}

private void runClass (String className, ClassLoader classLoader) {
try {
Class clazz = Class.forName(className,false,classLoader);
invokeMain(clazz,new String[] {});
}
catch (ClassNotFoundException ex) {
ex.printStackTrace();
error(ex.toString());
}
}
public void invokeMain (Class clazz, String[] args)
{
Class[] paramTypes = new Class[1];
paramTypes[0] = args.getClass();
try {
Method method = clazz.getDeclaredMethod("main",paramTypes);
Object[] params = new Object[1];
params[0] = args;
method.invoke(null,params);
}
catch (InvocationTargetException ex) {
Throwable th = ex.getTargetException();
th.printStackTrace();
error(th.toString());
}
catch (Throwable th) {
th.printStackTrace();
error(th.toString());
}
}
private void error (String message) {
System.out.println(message);
if (exitOnError) System.exit(0);
}
}

+ 0
- 0
testing-client/testdata/server.properties View File


+ 3
- 0
testing-client/testsrc/org/aspectj/testing/TestingTests.java View File

@@ -14,6 +14,8 @@

package org.aspectj.testing;

import org.aspectj.testing.server.TestServerTest;

import junit.framework.*;

public class TestingTests extends TestCase {
@@ -23,6 +25,7 @@ public class TestingTests extends TestCase {
// for now, do not include SuiteTest because it would take 15 minutes
//$JUnit-BEGIN$
suite.addTestSuite(TesterTest.class);
suite.addTestSuite(TestServerTest.class);
//$JUnit-END$
return suite;
}

+ 40
- 0
testing-client/testsrc/org/aspectj/testing/server/TestServerTest.java View File

@@ -0,0 +1,40 @@
/*******************************************************************************
* Copyright (c) 2006 IBM Corporation and others.
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Matthew Webster - initial implementation
*******************************************************************************/
package org.aspectj.testing.server;

import java.io.IOException;

import junit.framework.TestCase;

public class TestServerTest extends TestCase {

private TestServer server;
protected void setUp() throws Exception {
super.setUp();
server = new TestServer();
server.setExitOntError(false);
}

public void testInitialize() {
try {
server.setWorkingDirectory("./testdata");
server.initialize();
}
catch (IOException ex) {
fail(ex.toString());
}
}

public void testSetWorkingDirectory() {
server.setWorkingDirectory("./testdata");
}
}

+ 9
- 0
tests/ltw/Child.java View File

@@ -0,0 +1,9 @@
public class Child extends Parent {
public Child () {
System.out.println("Child");
}
public static void main (String[] args) {
new Child();
}
}

+ 5
- 0
tests/ltw/Parent.java View File

@@ -0,0 +1,5 @@
public class Parent {
public Parent () {
System.out.println("Parent");
}
}

+ 33
- 0
tests/ltw/ant-server.xml View File

@@ -0,0 +1,33 @@
<!-- ajc-ant script, not to be used from Ant commant line - see AntSpec -->
<project name="ltw">

<!-- using this we can debug the forked VM -->
<property
name="jdwp"
value="-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=5005"/>

<target name="TestServer with HelloWorld">
<copy file="${aj.root}/tests/ltw/server-helloworld.properties"
tofile="${aj.sandbox}/server.properties"/>
<java fork="yes" classname="org.aspectj.testing.server.TestServer" failonerror="yes">
<classpath refid="aj.path"/>
<jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/>
<jvmarg value="-Daj.weaving.verbose=true"/>
<jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/>
<arg path="${aj.sandbox}"/>
</java>
</target>

<target name="TestServer with Parent and Child">
<copy file="${aj.root}/tests/ltw/server-parentandchild.properties"
tofile="${aj.sandbox}/server.properties"/>
<java fork="yes" classname="org.aspectj.testing.server.TestServer" failonerror="yes">
<classpath refid="aj.path"/>
<jvmarg value="-javaagent:${aj.root}/lib/test/loadtime5.jar"/>
<jvmarg value="-Daj.weaving.verbose=true"/>
<jvmarg value="-Dorg.aspectj.weaver.showWeaveInfo=true"/>
<arg path="${aj.sandbox}"/>
</java>
</target>

</project>

+ 5
- 0
tests/ltw/server-helloworld.properties View File

@@ -0,0 +1,5 @@
# loader.XXX=Name,Classpath[,Parent]
loader.application=Application,hello.jar;handler.jar

# main=Class,Loader
main=HelloWorld,Application

+ 6
- 0
tests/ltw/server-parentandchild.properties View File

@@ -0,0 +1,6 @@
# loader.XXX=Name,Classpath[,Parent]
loader.parent=Parent,parent.jar
loader.child=Child,child.jar,Parent

# main=Class,Loader
main=Child,Child

+ 2
- 0
tests/src/org/aspectj/systemtest/ajc150/AllTestsAspectJ150.java View File

@@ -13,6 +13,7 @@ package org.aspectj.systemtest.ajc150;
import org.aspectj.systemtest.ajc150.ataspectj.AtAjSyntaxTests;
import org.aspectj.systemtest.ajc150.ataspectj.AtAjMisuseTests;
import org.aspectj.systemtest.ajc150.ataspectj.AtAjLTWTests;
import org.aspectj.systemtest.ajc150.ltw.LTWServerTests;
import org.aspectj.systemtest.ajc150.ltw.LTWTests;

import junit.framework.Test;
@@ -55,6 +56,7 @@ public class AllTestsAspectJ150 {
suite.addTest(HasMember.suite());

suite.addTestSuite(LTWTests.class);
suite.addTestSuite(LTWServerTests.class);
//$JUnit-END$
return suite;
}

+ 27
- 0
tests/src/org/aspectj/systemtest/ajc150/ltw/LTWServerTests.java View File

@@ -0,0 +1,27 @@
package org.aspectj.systemtest.ajc150.ltw;

import java.io.File;

import junit.framework.Test;

import org.aspectj.testing.XMLBasedAjcTestCase;

public class LTWServerTests extends XMLBasedAjcTestCase {

public static Test suite() {
return loadSuite(LTWServerTests.class);
}

protected File getSpecFile() {
return new File("../tests/src/org/aspectj/systemtest/ajc150/ltw/ltw.xml");
}
public void testServerWithHelloWorld () {
runTest("TestServer with HelloWorld");
}
public void testServerWithParentAndChild () {
runTest("TestServer with Parent and Child");
}

}

+ 27
- 0
tests/src/org/aspectj/systemtest/ajc150/ltw/ltw-tests.xml View File

@@ -558,4 +558,31 @@
</ant>
</ajc-test>
<ajc-test dir="ltw" title="TestServer with HelloWorld" keywords="ltw,server">
<compile files="HelloWorld.java" options="-outjar hello.jar"/>
<compile files="ExceptionHandler.aj" options="-outxml -outjar handler.jar"/>
<ant file="ant-server.xml" target="TestServer with HelloWorld" verbose="true">
<stdout>
<line text="Starting ..."/>
<line text="Running HelloWorld"/>
<line text="Hello World!"/>
<line text="Stopping ..."/>
</stdout>
</ant>
</ajc-test>
<ajc-test dir="ltw" title="TestServer with Parent and Child" keywords="ltw,server">
<compile files="Parent.java" options="-outjar parent.jar"/>
<compile files="Child.java" options="-classpath parent.jar -outjar child.jar"/>
<ant file="ant-server.xml" target="TestServer with Parent and Child" verbose="true">
<stdout>
<line text="Starting ..."/>
<line text="Running Child"/>
<line text="Parent"/>
<line text="Child"/>
<line text="Stopping ..."/>
</stdout>
</ant>
</ajc-test>

Loading…
Cancel
Save