blob: 7557f881628f384f76476fe643d6543076e71d8b [file] [log] [blame]
// Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
package com.google.dart.corelib;
import com.google.common.io.CharStreams;
import com.google.common.io.LineReader;
import junit.extensions.TestSetup;
import junit.framework.Test;
import junit.framework.TestCase;
import junit.framework.TestSuite;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
/**
* JUnit wrapper around test.py. This wrapper allows you to run most test.py tests from inside your
* favorite IDE, to ease debugging.
* <p>
* If you followed the instructions in compiler/eclipse.workspace/README.txt, this test should just
* work inside Eclipse.
* <p>
* If you just want to run a single test, launch this class as a JUnit test and stop it once it has
* listed all the tests. Then right click on the desired test and select Run or Debug.
*/
public class SharedTests extends TestSetup {
private final static String TEST_PY =
System.getProperty("com.google.dart.corelib.SharedTests.test_py", "../tools/test.py");
private static final String[] listTests = {
TEST_PY,
"--compiler=dartc",
"--runtime=none",
"--mode=release",
"--progress=silent",
"--list"};
public SharedTests(Test test) {
super(test);
}
public static TestSuite suite() {
return new SuiteBuilder().buildSuite();
}
protected static class SuiteBuilder {
protected TestSuite buildSuite() {
TestSuite suite = new TestSuite("Shared Dart tests");
File file = new File(listTests[0]);
if (!file.canExecute()) {
return configurationProblem(suite, file.getPath() + " is not executable");
}
ProcessBuilder builder = new ProcessBuilder(listTests);
try {
Process process = builder.start();
InputStream inputStream = process.getInputStream();
StringBuilder sb = new StringBuilder();
try {
InputStreamReader inputStreamReader = new InputStreamReader(inputStream);
LineReader lineReader = new LineReader(inputStreamReader);
String line;
while ((line = lineReader.readLine()) != null) {
if (!line.startsWith("dartc/")) {
suite.addTest(SharedTestCase.getInstance(line, false));
} else if (line.startsWith("dartc/client/")) {
suite.addTest(SharedTestCase.getInstance(line, true));
}
}
} finally {
inputStream.close();
process.getOutputStream().close();
InputStreamReader inputStreamReader = new InputStreamReader(process.getErrorStream());
CharStreams.copy(inputStreamReader, sb);
process.getErrorStream().close();
}
process.waitFor();
if (process.exitValue() != 0) {
sb.insert(0, file.getPath());
sb.insert(0, " returned non-zero exit code.\n");
return configurationProblem(suite, sb.toString());
}
} catch (IOException e) {
throw new AssertionError(e);
} catch (InterruptedException e) {
throw new AssertionError(e);
}
return suite;
}
/**
* Errors reported during suite construction are hard to read. This method creates a test that
* will always fail with an error message that shows up in the Eclipse JUnit UI.
*/
protected TestSuite configurationProblem(TestSuite suite, final String message) {
suite.addTest(new TestCase("Configuration problem") {
@Override
public void runBare() throws Throwable {
fail(message);
}
});
return suite;
}
}
}