Browse Source

Fix tests not finding project base directory 'org.aspectj'

Several LTW tests using class TestServer failed on my machine because
there was a hard-coded project base directory name 'org.aspectj' in the
class. This class has several other problems, but my quick fix for now -
I did not want to rename my project base directory - was to match on a
regex '(?i)(org[.])?aspectj' now. That also works for my root directory
'AspectJ'.

I also moved the code determining the project dir into a protected
(hence testable) method and added a sanity test case checking if the
directory can be determined. If not, the test will fail with a rather
lengthy warning to developers about the need to have a matching project
root folder.

Signed-off-by: Alexander Kriegisch <Alexander@Kriegisch.name>
tags/java16-add-opens
Alexander Kriegisch 3 years ago
parent
commit
2a2f4e20b4

+ 26
- 14
testing-client/src/main/java/org/aspectj/testing/server/TestServer.java View File

public class TestServer implements Runnable { public class TestServer implements Runnable {


private static final boolean debug = Boolean.getBoolean("org.aspectj.testing.server.debug"); private static final boolean debug = Boolean.getBoolean("org.aspectj.testing.server.debug");
// AspectJ project root folder nameing pattern, case-insensitive (i.e. org.aspectj, AspectJ)
protected static final String REGEX_PROJECT_ROOT_FOLDER = "(?i)(org[.])?aspectj";


private boolean exitOnError = true; private boolean exitOnError = true;
private File workingDirectory; private File workingDirectory;
List<URL> urlList = new ArrayList<>(); List<URL> urlList = new ArrayList<>();


// Sandbox // Sandbox
URL url = workingDirectory.getCanonicalFile().toURI().toURL();
urlList.add(url);

// Find the AspectJ root folder (i.e. org.aspectj)
File aspectjBase = new File(".").getCanonicalFile();
while (aspectjBase!= null && !aspectjBase.getName().equals("org.aspectj")) {
aspectjBase = aspectjBase.getParentFile();
}
if (aspectjBase == null) {
error("Unable to locate 'org.aspectj' in "+new File(".").getCanonicalPath());
}
urlList.add(new File(aspectjBase,"runtime/target/classes").toURI().toURL());
// urlList.add(new File(aspectjBase,"aspectjrt/target/classes").toURI().toURL());
// urlList.add(new File(aspectjBase,"aspectj5rt/target/classes").toURI().toURL());
urlList.add(workingDirectory.getCanonicalFile().toURI().toURL());
File projectRootFolder = findProjectRootFolder();
urlList.add(new File(projectRootFolder,"runtime/target/classes").toURI().toURL());
// urlList.add(new File(projectRootFolder,"aspectjrt/target/classes").toURI().toURL());
// urlList.add(new File(projectRootFolder,"aspectj5rt/target/classes").toURI().toURL());


URL[] urls = new URL[urlList.size()]; URL[] urls = new URL[urlList.size()];
urlList.toArray(urls); urlList.toArray(urls);
if (debug) System.err.println("? TestServer.createRootLoader() loader=" + rootLoader + ", urlList=" + urlList + ", parent=" + parent); if (debug) System.err.println("? TestServer.createRootLoader() loader=" + rootLoader + ", urlList=" + urlList + ", parent=" + parent);
} }


// Make protected in order to at least make this part of the code testable -> TestServerTest
protected File findProjectRootFolder() throws IOException {
// Find the AspectJ project root folder
File currentFolder = new File(".").getCanonicalFile();
while (currentFolder != null && !currentFolder.getName().matches(REGEX_PROJECT_ROOT_FOLDER)) {
currentFolder = currentFolder.getParentFile();
}
if (currentFolder == null) {
error(
"Unable to locate project root folder matching regex '" + REGEX_PROJECT_ROOT_FOLDER +
"' in " + new File(".").getCanonicalPath()
);
}
return currentFolder;
}

public void setExitOntError (boolean b) { public void setExitOntError (boolean b) {
exitOnError = b; exitOnError = b;
} }


private void error (String message) { private void error (String message) {
System.out.println(message); System.out.println(message);
// FIXME:
// This is horrible: Why not just throw an exception? And if we exit, why with exit code 0?
// It basically makes the tests useless because they might log errors without checking any conditions.
if (exitOnError) System.exit(0); if (exitOnError) System.exit(0);
} }
} }

+ 13
- 0
testing-client/src/test/java/org/aspectj/testing/server/TestServerTest.java View File



import junit.framework.TestCase; import junit.framework.TestCase;


import static org.aspectj.testing.server.TestServer.REGEX_PROJECT_ROOT_FOLDER;

public class TestServerTest extends TestCase { public class TestServerTest extends TestCase {


private TestServer server; private TestServer server;
} }
} }


public void testFindProjectRootDirectory() throws IOException {
// Give developers some advice in the build log about why their LTW tests fail
assertNotNull(
"Cannot find AspectJ project root folder. " +
"This will lead to subsequent failures in all tests using class TestServer. " +
"Please make sure to name your project root folder 'org.aspectj', 'AspectJ' or " +
"something else matching regex '"+ REGEX_PROJECT_ROOT_FOLDER+"'.",
server.findProjectRootFolder()
);
}

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

Loading…
Cancel
Save