From 9675c822a93f1cdb505ba15a3922646c214cc2fd Mon Sep 17 00:00:00 2001 From: parrt Date: Wed, 16 Nov 2016 15:42:45 -0800 Subject: [PATCH] update doc, add lock so antlr used atomically in unit tests so we can run in parallel. --- doc/building-antlr.md | 142 ++++++++++++++---- .../v4/test/runtime/BaseRuntimeTest.java | 10 +- .../v4/test/runtime/RuntimeTestAssert.java | 3 + .../org/antlr/v4/test/runtime/TestRunner.java | 18 --- .../v4/test/runtime/cpp/BaseCppTest.java | 46 +++--- .../test/runtime/csharp/BaseCSharpTest.java | 19 ++- .../antlr/v4/test/runtime/go/BaseGoTest.java | 18 ++- .../v4/test/runtime/java/BaseJavaTest.java | 64 +++----- .../javascript/browser/BaseBrowserTest.java | 13 +- .../runtime/javascript/node/BaseNodeTest.java | 15 +- .../test/runtime/python/BasePythonTest.java | 14 +- tool-testsuite/pom.xml | 4 + 12 files changed, 224 insertions(+), 142 deletions(-) delete mode 100644 runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java diff --git a/doc/building-antlr.md b/doc/building-antlr.md index d46609621..effd39821 100644 --- a/doc/building-antlr.md +++ b/doc/building-antlr.md @@ -38,17 +38,24 @@ Checking connectivity... done. $ cd antlr4 $ mvn compile .. +[INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] -[INFO] ANTLR 4 ............................................ SUCCESS [ 0.447 s] -[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.113 s] -[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 14.408 s] -[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.276 s] -[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [ 0.773 s] -[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 6.920 s] +[INFO] ANTLR 4 ............................................ SUCCESS [ 0.432 s] +[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 4.334 s] +[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.686 s] +[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.654 s] +[INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.096 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] 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 @@ -81,38 +88,119 @@ antlr reports warnings from [-visitor, -Dlanguage=CSharp, -o, /var/folders/s1/h3 [INFO] ------------------------------------------------------------------------ [INFO] Reactor Summary: [INFO] -[INFO] ANTLR 4 ............................................ SUCCESS [ 0.462 s] -[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 9.163 s] -[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 3.683 s] -[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.897 s] -[INFO] ANTLR 4 Runtime Test Generator ..................... SUCCESS [07:11 min] -[INFO] ANTLR 4 Tool Tests ................................. SUCCESS [ 16.694 s] +[INFO] ANTLR 4 ............................................ SUCCESS [ 0.445 s] +[INFO] ANTLR 4 Runtime .................................... SUCCESS [ 3.392 s] +[INFO] ANTLR 4 Tool ....................................... SUCCESS [ 1.373 s] +[INFO] ANTLR 4 Maven plugin ............................... SUCCESS [ 1.519 s] +[INFO] ANTLR 4 Runtime Test Annotations ................... SUCCESS [ 0.086 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] BUILD SUCCESS [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 /Users/parrt/.m2/repository/org/antlr $ find antlr4* -name '*.jar' -antlr4/4.5/antlr4-4.5.jar -antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT-tests.jar -antlr4/4.5.2-SNAPSHOT/antlr4-4.5.2-SNAPSHOT.jar -antlr4-maven-plugin/4.5/antlr4-maven-plugin-4.5.jar -antlr4-maven-plugin/4.5.2-SNAPSHOT/antlr4-maven-plugin-4.5.2-SNAPSHOT.jar -antlr4-runtime/4.5/antlr4-runtime-4.5.jar -antlr4-runtime/4.5.2-SNAPSHOT/antlr4-runtime-4.5.2-SNAPSHOT.jar -antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT-tests.jar -antlr4-runtime-testsuite/4.5.2-SNAPSHOT/antlr4-runtime-testsuite-4.5.2-SNAPSHOT.jar -antlr4-tool-testsuite/4.5.2-SNAPSHOT/antlr4-tool-testsuite-4.5.2-SNAPSHOT.jar +antlr4-maven-plugin/4.6-SNAPSHOT/antlr4-maven-plugin-4.6-SNAPSHOT.jar +antlr4-runtime-test-annotation-processors/4.6-SNAPSHOT/antlr4-runtime-test-annotation-processors-4.6-SNAPSHOT.jar +antlr4-runtime-test-annotations/4.6-SNAPSHOT/antlr4-runtime-test-annotations-4.6-SNAPSHOT.jar +antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT-tests.jar +antlr4-runtime-testsuite/4.6-SNAPSHOT/antlr4-runtime-testsuite-4.6-SNAPSHOT.jar +antlr4-runtime/4.6-SNAPSHOT/antlr4-runtime-4.6-SNAPSHOT.jar +antlr4-tool-testsuite/4.6-SNAPSHOT/antlr4-tool-testsuite-4.6-SNAPSHOT.jar +antlr4/4.6-SNAPSHOT/antlr4-4.6-SNAPSHOT-tests.jar +antlr4/4.6-SNAPSHOT/antlr4-4.6-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 + To build without running the tests (saves a lot of time), do this: ```bash diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java index aa7394f70..acc894fdd 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/BaseRuntimeTest.java @@ -125,10 +125,11 @@ public abstract class BaseRuntimeTest { descriptor.getInput(), descriptor.showDiagnosticErrors() ); - if(delegate instanceof RuntimeTestAssert) { + if ( delegate instanceof RuntimeTestAssert ) { ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getOutput(), found); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); - } else { + } + else { assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getErrors(), delegate.getParseErrors()); } @@ -165,11 +166,12 @@ public abstract class BaseRuntimeTest { grammar = grammarST.render(); 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.getANTLRToolErrors(), delegate.getANTLRToolErrors()); ((RuntimeTestAssert)delegate).assertEqualStrings(descriptor.getErrors(), delegate.getParseErrors()); - } else { + } + else { assertEquals(descriptor.getOutput(), found); assertEquals(descriptor.getANTLRToolErrors(), delegate.getANTLRToolErrors()); assertEquals(descriptor.getErrors(), delegate.getParseErrors()); diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java index 5ae2d0533..5b87f7318 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/RuntimeTestAssert.java @@ -1,5 +1,8 @@ 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 { void assertEqualStrings(String expected, String actual); } diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java deleted file mode 100644 index 59a1e24ea..000000000 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/TestRunner.java +++ /dev/null @@ -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()); - } -} diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java index d909e6f7b..017a96c56 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/cpp/BaseCppTest.java @@ -93,6 +93,7 @@ import java.util.Map; import java.util.Set; 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.assertEquals; import static org.junit.Assert.assertFalse; @@ -124,10 +125,13 @@ public class BaseCppTest implements RuntimeTestSupport { // new output dir for each test String propName = getPropertyPrefix() + "-test-dir"; String prop = System.getProperty(propName); - if(prop!=null && prop.length()>0) + if(prop!=null && prop.length()>0) { 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(); } @@ -363,7 +367,9 @@ public class BaseCppTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { @@ -645,7 +651,7 @@ public class BaseCppTest implements RuntimeTestSupport { return true; } - static boolean runtimeBuiltOnce = false; + static Boolean runtimeBuiltOnce = false; public String execModule(String fileName) { String runtimePath = locateRuntime(); @@ -654,22 +660,24 @@ public class BaseCppTest implements RuntimeTestSupport { String inputPath = new File(new File(tmpdir), "input").getAbsolutePath(); // Build runtime using cmake once. - if (!runtimeBuiltOnce) { - try { - String command[] = { "clang++", "--version" }; - 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"); - } + synchronized (runtimeBuiltOnce) { + if ( !runtimeBuiltOnce ) { + try { + String command[] = {"clang++", "--version"}; + 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"); + } - runtimeBuiltOnce = true; - if (!buildRuntime()) { - System.out.println("C++ runtime build failed\n"); - return null; + runtimeBuiltOnce = true; + if ( !buildRuntime() ) { + System.out.println("C++ runtime build failed\n"); + 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. diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java index 9ddfadd68..8a5c39447 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/csharp/BaseCSharpTest.java @@ -57,7 +57,6 @@ import javax.xml.transform.stream.StreamResult; import javax.xml.xpath.XPathConstants; import javax.xml.xpath.XPathExpression; import javax.xml.xpath.XPathFactory; - import java.io.BufferedReader; import java.io.File; import java.io.FileOutputStream; @@ -75,6 +74,7 @@ import java.util.List; import java.util.Map; 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.assertNotNull; import static org.junit.Assert.assertTrue; @@ -162,7 +162,7 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { public void testSetUp() throws Exception { if (CREATE_PER_TEST_DIRECTORIES) { // 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(); } else { @@ -265,7 +265,9 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { 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) { assertEquals(a, b); } - + protected static void assertEquals(String a, String b) { a = absorbExpectedDifferences(a); b = absorbActualDifferences(b); @@ -928,19 +930,20 @@ public class BaseCSharpTest implements RuntimeTestSupport, RuntimeTestAssert { a = a.replaceAll("\\^", ""); // work around the algo difference for full context a = stripOutUnwantedLinesWith(a, "reportAttemptingFullContext","reportContextSensitivity", "reportAmbiguity"); - if(a.isEmpty()) + if(a.isEmpty()) { a = null; + } return a; } private static String absorbActualDifferences(String a) { - if(a==null) - return a; + if(a==null) return a; // work around the algo difference for full context // work around the algo difference for semantic predicates a = stripOutUnwantedLinesWith(a, "reportContextSensitivity","eval=false"); - if(a.isEmpty()) + if(a.isEmpty()) { a = null; + } return a; } diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java index 39722f62f..e3d487542 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/go/BaseGoTest.java @@ -95,13 +95,10 @@ import static junit.framework.TestCase.assertEquals; import static junit.framework.TestCase.assertFalse; import static junit.framework.TestCase.assertNotNull; import static junit.framework.TestCase.assertTrue; +import static org.antlr.v4.test.runtime.java.BaseJavaTest.antlrLock; import static org.junit.Assert.assertArrayEquals; 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 tmpdir = null; // this is where the parser package is stored, typically inside the tmpdir private static File tmpGopath = null; @@ -209,11 +206,14 @@ public class BaseGoTest implements RuntimeTestSupport { public void testSetUp() throws Exception { // new output dir for each test 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); - else + } + else { + String threadName = Thread.currentThread().getName(); overall_tmpdir = new File(System.getProperty("java.io.tmpdir"), - getClass().getSimpleName() + "-" + System.currentTimeMillis()); + getClass().getSimpleName()+"-"+threadName+"-"+System.currentTimeMillis()); + } if ( overall_tmpdir.exists()) this.eraseDirectory(overall_tmpdir); @@ -348,7 +348,9 @@ public class BaseGoTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java index bf3cce751..12479ac87 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/java/BaseJavaTest.java @@ -88,7 +88,6 @@ import java.io.StringReader; import java.lang.reflect.Constructor; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; -import java.net.MalformedURLException; import java.net.URL; import java.net.URLClassLoader; import java.util.ArrayList; @@ -100,8 +99,6 @@ import java.util.List; import java.util.Map; import java.util.Set; 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.assertFalse; @@ -110,9 +107,6 @@ import static junit.framework.TestCase.assertTrue; import static org.junit.Assert.assertArrayEquals; 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 pathSep = System.getProperty("path.separator"); @@ -143,7 +137,7 @@ public class BaseJavaTest implements RuntimeTestSupport { * directories for all tests which completed successfully, and preserving * the directories for tests which failed.

*/ - 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 @@ -204,9 +198,12 @@ public class BaseJavaTest implements RuntimeTestSupport { @Override public void testSetUp() throws Exception { +// STGroup.verbose = true; +// System.err.println("testSetUp "+Thread.currentThread().getName()); if ( CREATE_PER_TEST_DIRECTORIES ) { // 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(); } else { @@ -250,11 +247,6 @@ public class BaseJavaTest implements RuntimeTestSupport { 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) { if ( g.atn==null ) { semanticProcess(g); @@ -507,7 +499,9 @@ public class BaseJavaTest implements RuntimeTestSupport { if ( defaultListener ) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i pl = getParserAndLexer(input, parserName, lexerName); Parser parser = pl.a; return execStartRule(startRuleName, parser); @@ -635,6 +630,9 @@ public class BaseJavaTest implements RuntimeTestSupport { 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, String grammarStr, String parserName, @@ -647,10 +645,10 @@ public class BaseJavaTest implements RuntimeTestSupport { boolean profile) { boolean success = rawGenerateAndBuildRecognizer(grammarFileName, - grammarStr, - parserName, - lexerName, - "-visitor"); + grammarStr, + parserName, + lexerName, + "-visitor"); assertTrue(success); writeFile(tmpdir, "input", input); return rawExecRecognizer(parserName, @@ -771,32 +769,8 @@ public class BaseJavaTest implements RuntimeTestSupport { this.stderrDuringParse = stderrVacuum.toString(); } return output; - } catch (MalformedURLException ex) { - LOGGER.log(Level.SEVERE, null, 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); + } + catch (Exception ex) { throw new RuntimeException(ex); } } diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/browser/BaseBrowserTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/browser/BaseBrowserTest.java index 71efe955d..4eaf85dce 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/browser/BaseBrowserTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/browser/BaseBrowserTest.java @@ -97,6 +97,7 @@ import java.util.Map; import java.util.Set; 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.assertEquals; import static org.junit.Assert.assertFalse; @@ -137,10 +138,12 @@ public abstract class BaseBrowserTest implements RuntimeTestSupport { public void testSetUp() throws Exception { // new output dir for each test String prop = System.getProperty("antlr-javascript-test-dir"); - if(prop!=null && prop.length()>0) + if(prop!=null && prop.length()>0) { 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); if(dir.exists()) this.eraseFiles(dir); @@ -291,7 +294,9 @@ public abstract class BaseBrowserTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/node/BaseNodeTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/node/BaseNodeTest.java index fa66c0dcb..c9a89f860 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/node/BaseNodeTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/javascript/node/BaseNodeTest.java @@ -89,6 +89,7 @@ import java.util.Map; import java.util.Set; 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.assertEquals; import static org.junit.Assert.assertFalse; @@ -118,12 +119,14 @@ public class BaseNodeTest implements RuntimeTestSupport { public void testSetUp() throws Exception { // new output dir for each test String prop = System.getProperty("antlr-javascript-test-dir"); - if (prop != null && prop.length() > 0) + if (prop != null && prop.length() > 0) { tmpdir = prop; - else + } + else { tmpdir = new File(System.getProperty("java.io.tmpdir"), getClass() - .getSimpleName() + "-" + System.currentTimeMillis()) - .getAbsolutePath(); + .getSimpleName()+"-"+Thread.currentThread().getName()+"-"+System.currentTimeMillis()) + .getAbsolutePath(); + } File dir = new File(tmpdir); if (dir.exists()) this.eraseFiles(dir); @@ -281,7 +284,9 @@ public class BaseNodeTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { diff --git a/runtime-testsuite/test/org/antlr/v4/test/runtime/python/BasePythonTest.java b/runtime-testsuite/test/org/antlr/v4/test/runtime/python/BasePythonTest.java index dab22ca3c..28179f06b 100644 --- a/runtime-testsuite/test/org/antlr/v4/test/runtime/python/BasePythonTest.java +++ b/runtime-testsuite/test/org/antlr/v4/test/runtime/python/BasePythonTest.java @@ -95,6 +95,7 @@ import java.util.Map; import java.util.Set; 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.assertEquals; import static org.junit.Assert.assertFalse; @@ -138,10 +139,13 @@ public abstract class BasePythonTest implements RuntimeTestSupport { // new output dir for each test String propName = getPropertyPrefix() + "-test-dir"; String prop = System.getProperty(propName); - if(prop!=null && prop.length()>0) + if(prop!=null && prop.length()>0) { 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(); } @@ -375,7 +379,9 @@ public abstract class BasePythonTest implements RuntimeTestSupport { if (defaultListener) { antlr.addListener(new DefaultToolListener(antlr)); } - antlr.processGrammarsOnCommandLine(); + synchronized (antlrLock) { + antlr.processGrammarsOnCommandLine(); + } if ( !defaultListener && !equeue.errors.isEmpty() ) { for (int i = 0; i < equeue.errors.size(); i++) { diff --git a/tool-testsuite/pom.xml b/tool-testsuite/pom.xml index 51343bc9a..95ef44e48 100644 --- a/tool-testsuite/pom.xml +++ b/tool-testsuite/pom.xml @@ -54,6 +54,7 @@ src + test com.googlecode.maven-download-plugin @@ -73,6 +74,9 @@ maven-surefire-plugin 2.12.4 + + **/Test*.java + ../../antlr4-python2/src ../../antlr4-python3/src