update doc, add lock so antlr used atomically in unit tests so we can run in parallel.

This commit is contained in:
parrt 2016-11-16 15:42:45 -08:00
parent 30fbe07b2b
commit 9675c822a9
12 changed files with 224 additions and 142 deletions

View File

@ -38,17 +38,24 @@ Checking connectivity... done.
$ cd antlr4 $ cd antlr4
$ mvn compile $ mvn compile
.. ..
[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary: [INFO] Reactor Summary:
[INFO] [INFO]
[INFO] ANTLR 4 ............................................ SUCCESS [ 0.447 s] [INFO] ANTLR 4 ............................................ SUCCESS [ 0.432 s]
[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.113 s] [INFO] ANTLR 4 Runtime .................................... SUCCESS [ 4.334 s]
[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 14.408 s] [INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.686 s]
[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.276 s] [INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.654 s]
[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [ 0.773 s] [INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.096 s]
[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 6.920 s] [INFO] ANTLR 4 Runtime Test Processors .................... SUCCESS [ 0.025 s]
[INFO] ANTLR 4 Runtime Tests (2nd generation) ............. SUCCESS [ 1.932 s]
[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 0.018 s]
[INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS [INFO] BUILD SUCCESS
... [INFO] ------------------------------------------------------------------------
[INFO] Total time: 10.324 s
[INFO] Finished at: 2016-11-16T13:49:38-08:00
[INFO] Final Memory: 42M/488M
[INFO] ------------------------------------------------------------------------
``` ```
# Testing tool and targets # Testing tool and targets
@ -81,38 +88,119 @@ antlr reports warnings from [-visitor, -Dlanguage=CSharp, -o, /var/folders/s1/h3
[INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary: [INFO] Reactor Summary:
[INFO] [INFO]
[INFO] ANTLR 4 ............................................ SUCCESS [ 0.462 s] [INFO] ANTLR 4 ............................................ SUCCESS [ 0.445 s]
[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 9.163 s] [INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.392 s]
[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 3.683 s] [INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.373 s]
[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.897 s] [INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.519 s]
[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [07:11 min] [INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.086 s]
[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 16.694 s] [INFO] ANTLR 4 Runtime Test Processors .................... SUCCESS [ 0.014 s]
[INFO] ANTLR 4 Runtime Tests (2nd generation) ............. SUCCESS [06:39 min]
[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 6.922 s]
[INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS [INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------ [INFO] ------------------------------------------------------------------------
[INFO] Total time: 07:43 min [INFO] Total time: 06:53 min
... [INFO] Finished at: 2016-11-16T15:36:56-08:00
[INFO] Final Memory: 44M/458M
[INFO] ------------------------------------------------------------------------
``` ```
You should see these jars (building 4.5.2-SNAPSHOT): Note: That is actually result of running the much faster:
`mvn -Dparallel=methods -DthreadCount=4 install`
You should see these jars (when building 4.6-SNAPSHOT):
```bash ```bash
/Users/parrt/.m2/repository/org/antlr $ find antlr4* -name '*.jar' /Users/parrt/.m2/repository/org/antlr $ find antlr4* -name '*.jar'
antlr4/4.5/antlr4-4.5.jar antlr4-maven-plugin/4.6-SNAPSHOT/antlr4-maven-plugin-4.6-SNAPSHOT.jar
antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT-tests.jar antlr4-runtime-test-annotation-processors/4.6-SNAPSHOT/antlr4-runtime-test-annotation-processors-4.6-SNAPSHOT.jar
antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT.jar antlr4-runtime-test-annotations/4.6-SNAPSHOT/antlr4-runtime-test-annotations-4.6-SNAPSHOT.jar
antlr4-maven-plugin/4.5/antlr4-maven-plugin-4.5.jar antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT-tests.jar
antlr4-maven-plugin/4.5.2-SNAPSHOT/antlr4-maven-plugin-4.5.2-SNAPSHOT.jar antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT.jar
antlr4-runtime/4.5/antlr4-runtime-4.5.jar antlr4-runtime/4.6-SNAPSHOT/antlr4-runtime-4.6-SNAPSHOT.jar
antlr4-runtime/4.5.2-SNAPSHOT/antlr4-runtime-4.5.2-SNAPSHOT.jar antlr4-tool-testsuite/4.6-SNAPSHOT/antlr4-tool-testsuite-4.6-SNAPSHOT.jar
antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT-tests.jar antlr4/4.6-SNAPSHOT/antlr4-4.6-SNAPSHOT-tests.jar
antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT.jar antlr4/4.6-SNAPSHOT/antlr4-4.6-SNAPSHOT.jar
antlr4-tool-testsuite/4.5.2-SNAPSHOT/antlr4-tool-testsuite-4.5.2-SNAPSHOT.jar
``` ```
Note that ANTLR is written in itself, which is why maven downloads antlr4-4.5.jar for boostrapping 4.5.2-SNAPSHOT purposes. Note that ANTLR is written in itself, which is why maven downloads antlr4-4.5.jar for boostrapping 4.6-SNAPSHOT purposes.
## Running test subsets
### Run one test group across targets
```bash
$ mvn -Dtest=TestParserExec test
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.antlr.v4.test.runtime.cpp.TestParserExec
...
Tests run: 32, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 114.283 sec
Running org.antlr.v4.test.runtime.csharp.TestParserExec
...
```
Or run all lexer related tests:
```
$ mvn -Dtest=Test*Lexer* test
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.antlr.v4.test.runtime.cpp.TestCompositeLexers
...
```
### Run all tests for a single target
```bash
$ mvn -Dtest=java.* test
...
```
Or run all lexer related tests in Java target only:
```bash
$ mvn -Dtest=java.*Lexer* test
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Running org.antlr.v4.test.runtime.java.TestCompositeLexers
Tests run: 2, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.277 sec
Running org.antlr.v4.test.runtime.java.TestLexerErrors
Tests run: 12, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 2.376 sec
Running org.antlr.v4.test.runtime.java.TestLexerExec
Tests run: 38, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 10.07 sec
Running org.antlr.v4.test.runtime.java.TestSemPredEvalLexer
Tests run: 7, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 1.255 sec
Results :
Tests run: 59, Failures: 0, Errors: 0, Skipped: 0
```
## Testing in parallel
Use this to run tests in parallel:
```bash
$ mvn -Dparallel=methods -DthreadCount=4 test
...
-------------------------------------------------------
T E S T S
-------------------------------------------------------
Concurrency config is parallel='methods', perCoreThreadCount=true, threadCount=4, useUnlimitedThreads=false
...
```
This can be combined with other `-D` above.
## Building without testing ## Building without testing
To build without running the tests (saves a lot of time), do this: To build without running the tests (saves a lot of time), do this:
```bash ```bash

View File

@ -125,10 +125,11 @@ public abstract class BaseRuntimeTest {
descriptor.getInput(), descriptor.getInput(),
descriptor.showDiagnosticErrors() descriptor.showDiagnosticErrors()
); );
if(delegate instanceof RuntimeTestAssert) { if ( delegate instanceof RuntimeTestAssert ) {
((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found);
((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors());
} else { }
else {
assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getOutput(), found);
assertEquals(descriptor.getErrors(), delegate.getParseErrors()); assertEquals(descriptor.getErrors(), delegate.getParseErrors());
} }
@ -165,11 +166,12 @@ public abstract class BaseRuntimeTest {
grammar = grammarST.render(); grammar = grammarST.render();
String found = delegate.execLexer(grammarName+".g4", grammar, grammarName, descriptor.getInput(), descriptor.showDFA()); String found = delegate.execLexer(grammarName+".g4", grammar, grammarName, descriptor.getInput(), descriptor.showDFA());
if(delegate instanceof RuntimeTestAssert) { if ( delegate instanceof RuntimeTestAssert ) {
((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found);
((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors()); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors());
((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors());
} else { }
else {
assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getOutput(), found);
assertEquals(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors()); assertEquals(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors());
assertEquals(descriptor.getErrors(), delegate.getParseErrors()); assertEquals(descriptor.getErrors(), delegate.getParseErrors());

View File

@ -1,5 +1,8 @@
package org.antlr.v4.test.runtime; package org.antlr.v4.test.runtime;
/** This interface acts like a tag on a Base*Test class that wants
* to use its own assertEquals() instead of jUnit's.
*/
public interface RuntimeTestAssert { public interface RuntimeTestAssert {
void assertEqualStrings(String expected, String actual); void assertEqualStrings(String expected, String actual);
} }

View File

@ -1,18 +0,0 @@
package org.antlr.v4.test.runtime;
import org.antlr.v4.test.runtime.descriptors.ParserExecDescriptors;
import org.junit.runner.JUnitCore;
import org.junit.runner.Result;
import org.junit.runner.notification.Failure;
public class TestRunner {
public static void main(String[] args) {
Result result = JUnitCore.runClasses(ParserExecDescriptors.class);
for (Failure failure : result.getFailures()) {
System.out.println(failure.toString());
}
System.out.println(result.wasSuccessful());
}
}

View File

@ -93,6 +93,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -124,10 +125,13 @@ public class BaseCppTest implements RuntimeTestSupport {
// new output dir for each test // new output dir for each test
String propName = getPropertyPrefix() + "-test-dir"; String propName = getPropertyPrefix() + "-test-dir";
String prop = System.getProperty(propName); String prop = System.getProperty(propName);
if(prop!=null && prop.length()>0) if(prop!=null && prop.length()>0) {
tmpdir = prop; tmpdir = prop;
else }
tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+"-"+System.currentTimeMillis()).getAbsolutePath(); else {
tmpdir = new File(System.getProperty("java.io.tmpdir"),
getClass().getSimpleName()+"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis()).getAbsolutePath();
}
antlrToolErrors = new StringBuilder(); antlrToolErrors = new StringBuilder();
} }
@ -363,7 +367,9 @@ public class BaseCppTest implements RuntimeTestSupport {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {
@ -645,7 +651,7 @@ public class BaseCppTest implements RuntimeTestSupport {
return true; return true;
} }
static boolean runtimeBuiltOnce = false; static Boolean runtimeBuiltOnce = false;
public String execModule(String fileName) { public String execModule(String fileName) {
String runtimePath = locateRuntime(); String runtimePath = locateRuntime();
@ -654,22 +660,24 @@ public class BaseCppTest implements RuntimeTestSupport {
String inputPath = new File(new File(tmpdir), "input").getAbsolutePath(); String inputPath = new File(new File(tmpdir), "input").getAbsolutePath();
// Build runtime using cmake once. // Build runtime using cmake once.
if (!runtimeBuiltOnce) { synchronized (runtimeBuiltOnce) {
try { if ( !runtimeBuiltOnce ) {
String command[] = { "clang++", "--version" }; try {
String output = runCommand(command, tmpdir, "printing compiler version"); String command[] = {"clang++", "--version"};
System.out.println("Compiler version is: " + output); String output = runCommand(command, tmpdir, "printing compiler version");
} System.out.println("Compiler version is: "+output);
catch (Exception e) { }
System.err.println("Can't get compiler version"); catch (Exception e) {
} System.err.println("Can't get compiler version");
}
runtimeBuiltOnce = true; runtimeBuiltOnce = true;
if (!buildRuntime()) { if ( !buildRuntime() ) {
System.out.println("C++ runtime build failed\n"); System.out.println("C++ runtime build failed\n");
return null; return null;
}
System.out.println("C++ runtime build succeeded\n");
} }
System.out.println("C++ runtime build succeeded\n");
} }
// Create symlink to the runtime. Currently only used on OSX. // Create symlink to the runtime. Currently only used on OSX.

View File

@ -57,7 +57,6 @@ import javax.xml.transform.stream.StreamResult;
import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory; import javax.xml.xpath.XPathFactory;
import java.io.BufferedReader; import java.io.BufferedReader;
import java.io.File; import java.io.File;
import java.io.FileOutputStream; import java.io.FileOutputStream;
@ -75,6 +74,7 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;
@ -162,7 +162,7 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert {
public void testSetUp() throws Exception { public void testSetUp() throws Exception {
if (CREATE_PER_TEST_DIRECTORIES) { if (CREATE_PER_TEST_DIRECTORIES) {
// new output dir for each test // new output dir for each test
String testDirectory = getClass().getSimpleName() + "-" + System.currentTimeMillis(); String testDirectory = getClass().getSimpleName() + "-"+Thread.currentThread().getName()+ "-" + System.currentTimeMillis();
tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath(); tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath();
} }
else { else {
@ -265,7 +265,9 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {
@ -908,7 +910,7 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert {
public void assertEqualStrings(String a, String b) { public void assertEqualStrings(String a, String b) {
assertEquals(a, b); assertEquals(a, b);
} }
protected static void assertEquals(String a, String b) { protected static void assertEquals(String a, String b) {
a = absorbExpectedDifferences(a); a = absorbExpectedDifferences(a);
b = absorbActualDifferences(b); b = absorbActualDifferences(b);
@ -928,19 +930,20 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert {
a = a.replaceAll("\\^", ""); a = a.replaceAll("\\^", "");
// work around the algo difference for full context // work around the algo difference for full context
a = stripOutUnwantedLinesWith(a, "reportAttemptingFullContext","reportContextSensitivity", "reportAmbiguity"); a = stripOutUnwantedLinesWith(a, "reportAttemptingFullContext","reportContextSensitivity", "reportAmbiguity");
if(a.isEmpty()) if(a.isEmpty()) {
a = null; a = null;
}
return a; return a;
} }
private static String absorbActualDifferences(String a) { private static String absorbActualDifferences(String a) {
if(a==null) if(a==null) return a;
return a;
// work around the algo difference for full context // work around the algo difference for full context
// work around the algo difference for semantic predicates // work around the algo difference for semantic predicates
a = stripOutUnwantedLinesWith(a, "reportContextSensitivity","eval=false"); a = stripOutUnwantedLinesWith(a, "reportContextSensitivity","eval=false");
if(a.isEmpty()) if(a.isEmpty()) {
a = null; a = null;
}
return a; return a;
} }

View File

@ -95,13 +95,10 @@ import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertFalse;
import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertNotNull;
import static junit.framework.TestCase.assertTrue; import static junit.framework.TestCase.assertTrue;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
public class BaseGoTest implements RuntimeTestSupport { public class BaseGoTest implements RuntimeTestSupport {
// -J-Dorg.antlr.v4.test.BaseTest.level=FINE
// private static final Logger LOGGER =
// Logger.getLogger(BaseTest.class.getName());
public File overall_tmpdir = null; public File overall_tmpdir = null;
public File tmpdir = null; // this is where the parser package is stored, typically inside the tmpdir public File tmpdir = null; // this is where the parser package is stored, typically inside the tmpdir
private static File tmpGopath = null; private static File tmpGopath = null;
@ -209,11 +206,14 @@ public class BaseGoTest implements RuntimeTestSupport {
public void testSetUp() throws Exception { public void testSetUp() throws Exception {
// new output dir for each test // new output dir for each test
String prop = System.getProperty("antlr-go-test-dir"); String prop = System.getProperty("antlr-go-test-dir");
if (prop != null && prop.length() > 0) if (prop != null && prop.length() > 0) {
overall_tmpdir = new File(prop); overall_tmpdir = new File(prop);
else }
else {
String threadName = Thread.currentThread().getName();
overall_tmpdir = new File(System.getProperty("java.io.tmpdir"), overall_tmpdir = new File(System.getProperty("java.io.tmpdir"),
getClass().getSimpleName() + "-" + System.currentTimeMillis()); getClass().getSimpleName()+"-"+threadName+"-"+System.currentTimeMillis());
}
if ( overall_tmpdir.exists()) if ( overall_tmpdir.exists())
this.eraseDirectory(overall_tmpdir); this.eraseDirectory(overall_tmpdir);
@ -348,7 +348,9 @@ public class BaseGoTest implements RuntimeTestSupport {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {

View File

@ -88,7 +88,6 @@ import java.io.StringReader;
import java.lang.reflect.Constructor; import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException; import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.net.MalformedURLException;
import java.net.URL; import java.net.URL;
import java.net.URLClassLoader; import java.net.URLClassLoader;
import java.util.ArrayList; import java.util.ArrayList;
@ -100,8 +99,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import java.util.logging.Level;
import java.util.logging.Logger;
import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertEquals;
import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertFalse;
@ -110,9 +107,6 @@ import static junit.framework.TestCase.assertTrue;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
public class BaseJavaTest implements RuntimeTestSupport { public class BaseJavaTest implements RuntimeTestSupport {
// -J-Dorg.antlr.v4.test.BaseTest.level=FINE
private static final Logger LOGGER = Logger.getLogger(BaseJavaTest.class.getName());
public static final String newline = System.getProperty("line.separator"); public static final String newline = System.getProperty("line.separator");
public static final String pathSep = System.getProperty("path.separator"); public static final String pathSep = System.getProperty("path.separator");
@ -143,7 +137,7 @@ public class BaseJavaTest implements RuntimeTestSupport {
* directories for all tests which completed successfully, and preserving * directories for all tests which completed successfully, and preserving
* the directories for tests which failed.</p> * the directories for tests which failed.</p>
*/ */
public static final boolean PRESERVE_TEST_DIR = Boolean.parseBoolean(System.getProperty("antlr.preserve-test-dir")); public static final boolean PRESERVE_TEST_DIR = true; //Boolean.parseBoolean(System.getProperty("antlr.preserve-test-dir"));
/** /**
* The base test directory is the directory where generated files get placed * The base test directory is the directory where generated files get placed
@ -204,9 +198,12 @@ public class BaseJavaTest implements RuntimeTestSupport {
@Override @Override
public void testSetUp() throws Exception { public void testSetUp() throws Exception {
// STGroup.verbose = true;
// System.err.println("testSetUp "+Thread.currentThread().getName());
if ( CREATE_PER_TEST_DIRECTORIES ) { if ( CREATE_PER_TEST_DIRECTORIES ) {
// new output dir for each test // new output dir for each test
String testDirectory = getClass().getSimpleName()+"-"+System.currentTimeMillis(); String threadName = Thread.currentThread().getName();
String testDirectory = getClass().getSimpleName()+"-"+threadName+"-"+System.nanoTime();
tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath(); tmpdir = new File(BASE_TEST_DIR, testDirectory).getAbsolutePath();
} }
else { else {
@ -250,11 +247,6 @@ public class BaseJavaTest implements RuntimeTestSupport {
return tool; return tool;
} }
protected Tool newTool() {
org.antlr.v4.Tool tool = new Tool(new String[]{"-o", tmpdir});
return tool;
}
protected ATN createATN(Grammar g, boolean useSerializer) { protected ATN createATN(Grammar g, boolean useSerializer) {
if ( g.atn==null ) { if ( g.atn==null ) {
semanticProcess(g); semanticProcess(g);
@ -507,7 +499,9 @@ public class BaseJavaTest implements RuntimeTestSupport {
if ( defaultListener ) { if ( defaultListener ) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i<equeue.errors.size(); i++) { for (int i = 0; i<equeue.errors.size(); i++) {
@ -563,7 +557,8 @@ public class BaseJavaTest implements RuntimeTestSupport {
public ParseTree execParser(String startRuleName, String input, public ParseTree execParser(String startRuleName, String input,
String parserName, String lexerName) String parserName, String lexerName)
throws Exception { throws Exception
{
Pair<Parser, Lexer> pl = getParserAndLexer(input, parserName, lexerName); Pair<Parser, Lexer> pl = getParserAndLexer(input, parserName, lexerName);
Parser parser = pl.a; Parser parser = pl.a;
return execStartRule(startRuleName, parser); return execStartRule(startRuleName, parser);
@ -635,6 +630,9 @@ public class BaseJavaTest implements RuntimeTestSupport {
listenerName, visitorName, startRuleName, input, showDiagnosticErrors, false); listenerName, visitorName, startRuleName, input, showDiagnosticErrors, false);
} }
/** ANTLR isn't thread-safe to process grammars so we use a global lock for testing */
public static final Object antlrLock = new Object();
public String execParser(String grammarFileName, public String execParser(String grammarFileName,
String grammarStr, String grammarStr,
String parserName, String parserName,
@ -647,10 +645,10 @@ public class BaseJavaTest implements RuntimeTestSupport {
boolean profile) boolean profile)
{ {
boolean success = rawGenerateAndBuildRecognizer(grammarFileName, boolean success = rawGenerateAndBuildRecognizer(grammarFileName,
grammarStr, grammarStr,
parserName, parserName,
lexerName, lexerName,
"-visitor"); "-visitor");
assertTrue(success); assertTrue(success);
writeFile(tmpdir, "input", input); writeFile(tmpdir, "input", input);
return rawExecRecognizer(parserName, return rawExecRecognizer(parserName,
@ -771,32 +769,8 @@ public class BaseJavaTest implements RuntimeTestSupport {
this.stderrDuringParse = stderrVacuum.toString(); this.stderrDuringParse = stderrVacuum.toString();
} }
return output; return output;
} catch (MalformedURLException ex) { }
LOGGER.log(Level.SEVERE, null, ex); catch (Exception ex) {
throw new RuntimeException(ex);
} catch (IOException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (InterruptedException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (IllegalAccessException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (IllegalArgumentException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (InvocationTargetException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (NoSuchMethodException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (SecurityException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex);
} catch (ClassNotFoundException ex) {
LOGGER.log(Level.SEVERE, null, ex);
throw new RuntimeException(ex); throw new RuntimeException(ex);
} }
} }

View File

@ -97,6 +97,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -137,10 +138,12 @@ public abstract class BaseBrowserTest implements RuntimeTestSupport {
public void testSetUp() throws Exception { public void testSetUp() throws Exception {
// new output dir for each test // new output dir for each test
String prop = System.getProperty("antlr-javascript-test-dir"); String prop = System.getProperty("antlr-javascript-test-dir");
if(prop!=null && prop.length()>0) if(prop!=null && prop.length()>0) {
httpdir = prop; httpdir = prop;
else }
httpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+"-"+System.currentTimeMillis()).getAbsolutePath(); else {
httpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis()).getAbsolutePath();
}
File dir = new File(httpdir); File dir = new File(httpdir);
if(dir.exists()) if(dir.exists())
this.eraseFiles(dir); this.eraseFiles(dir);
@ -291,7 +294,9 @@ public abstract class BaseBrowserTest implements RuntimeTestSupport {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {

View File

@ -89,6 +89,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -118,12 +119,14 @@ public class BaseNodeTest implements RuntimeTestSupport {
public void testSetUp() throws Exception { public void testSetUp() throws Exception {
// new output dir for each test // new output dir for each test
String prop = System.getProperty("antlr-javascript-test-dir"); String prop = System.getProperty("antlr-javascript-test-dir");
if (prop != null && prop.length() > 0) if (prop != null && prop.length() > 0) {
tmpdir = prop; tmpdir = prop;
else }
else {
tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass() tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass()
.getSimpleName() + "-" + System.currentTimeMillis()) .getSimpleName()+"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis())
.getAbsolutePath(); .getAbsolutePath();
}
File dir = new File(tmpdir); File dir = new File(tmpdir);
if (dir.exists()) if (dir.exists())
this.eraseFiles(dir); this.eraseFiles(dir);
@ -281,7 +284,9 @@ public class BaseNodeTest implements RuntimeTestSupport {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {

View File

@ -95,6 +95,7 @@ import java.util.Map;
import java.util.Set; import java.util.Set;
import java.util.TreeMap; import java.util.TreeMap;
import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock;
import static org.junit.Assert.assertArrayEquals; import static org.junit.Assert.assertArrayEquals;
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertFalse;
@ -138,10 +139,13 @@ public abstract class BasePythonTest implements RuntimeTestSupport {
// new output dir for each test // new output dir for each test
String propName = getPropertyPrefix() + "-test-dir"; String propName = getPropertyPrefix() + "-test-dir";
String prop = System.getProperty(propName); String prop = System.getProperty(propName);
if(prop!=null && prop.length()>0) if(prop!=null && prop.length()>0) {
tmpdir = prop; tmpdir = prop;
else }
tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+"-"+System.currentTimeMillis()).getAbsolutePath(); else {
tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass().getSimpleName()+
"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis()).getAbsolutePath();
}
antlrToolErrors = new StringBuilder(); antlrToolErrors = new StringBuilder();
} }
@ -375,7 +379,9 @@ public abstract class BasePythonTest implements RuntimeTestSupport {
if (defaultListener) { if (defaultListener) {
antlr.addListener(new DefaultToolListener(antlr)); antlr.addListener(new DefaultToolListener(antlr));
} }
antlr.processGrammarsOnCommandLine(); synchronized (antlrLock) {
antlr.processGrammarsOnCommandLine();
}
if ( !defaultListener && !equeue.errors.isEmpty() ) { if ( !defaultListener && !equeue.errors.isEmpty() ) {
for (int i = 0; i < equeue.errors.size(); i++) { for (int i = 0; i < equeue.errors.size(); i++) {

View File

@ -54,6 +54,7 @@
<build> <build>
<sourceDirectory>src</sourceDirectory> <sourceDirectory>src</sourceDirectory>
<testSourceDirectory>test</testSourceDirectory>
<plugins> <plugins>
<plugin> <plugin>
<groupId>com.googlecode.maven-download-plugin</groupId> <groupId>com.googlecode.maven-download-plugin</groupId>
@ -73,6 +74,9 @@
<artifactId>maven-surefire-plugin</artifactId> <artifactId>maven-surefire-plugin</artifactId>
<version>2.12.4</version> <version>2.12.4</version>
<configuration> <configuration>
<includes>
<include>**/Test*.java</include>
</includes>
<systemPropertyVariables> <systemPropertyVariables>
<antlr-python2-runtime>../../antlr4-python2/src</antlr-python2-runtime> <antlr-python2-runtime>../../antlr4-python2/src</antlr-python2-runtime>
<antlr-python3-runtime>../../antlr4-python3/src</antlr-python3-runtime> <antlr-python3-runtime>../../antlr4-python3/src</antlr-python3-runtime>