Index: editor/tools/plugins/com.google.dart.tools.tests.buildbot_test/src/com/google/dart/tools/tests/buildbot/BuildbotTestsJob.java |
=================================================================== |
--- editor/tools/plugins/com.google.dart.tools.tests.buildbot_test/src/com/google/dart/tools/tests/buildbot/BuildbotTestsJob.java (revision 0) |
+++ editor/tools/plugins/com.google.dart.tools.tests.buildbot_test/src/com/google/dart/tools/tests/buildbot/BuildbotTestsJob.java (revision 0) |
@@ -0,0 +1,199 @@ |
+/* |
+ * Copyright (c) 2013, the Dart project authors. |
+ * |
+ * Licensed under the Eclipse Public License v1.0 (the "License"); you may not use this file except |
+ * in compliance with the License. You may obtain a copy of the License at |
+ * |
+ * http://www.eclipse.org/legal/epl-v10.html |
+ * |
+ * Unless required by applicable law or agreed to in writing, software distributed under the License |
+ * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
+ * or implied. See the License for the specific language governing permissions and limitations under |
+ * the License. |
+ */ |
+ |
+package com.google.dart.tools.tests.buildbot; |
+ |
+import com.google.dart.tools.tests.buildbot.runner.AbstractTestRunner; |
+ |
+import junit.framework.Test; |
+import junit.framework.TestCase; |
+import junit.framework.TestFailure; |
+import junit.framework.TestResult; |
+ |
+import org.eclipse.core.runtime.IProgressMonitor; |
+import org.eclipse.core.runtime.IStatus; |
+import org.eclipse.core.runtime.Status; |
+import org.eclipse.core.runtime.jobs.Job; |
+import org.eclipse.swt.widgets.Display; |
+import org.eclipse.ui.PlatformUI; |
+ |
+import java.text.DecimalFormat; |
+import java.text.NumberFormat; |
+import java.util.Arrays; |
+import java.util.Collections; |
+import java.util.List; |
+ |
+/** |
+ * Run the given TestSuite, and optionally exit Eclipse when finished. |
+ */ |
+class BuildbotTestsJob extends Job { |
+ |
+ private class JobTestRunner extends AbstractTestRunner { |
+ private IProgressMonitor monitor; |
+ |
+ public JobTestRunner(IProgressMonitor monitor, Test test) { |
+ super(test); |
+ |
+ this.monitor = monitor; |
+ } |
+ |
+ @Override |
+ protected boolean filterTest(TestCase test) { |
+ final List<String> proscribed = Arrays.asList( |
+ // This takes a long time to run, and should only be run during the build. |
+ "com.google.dart.tools.core.artifact.TestGenerateArtifacts.test_generate_SDK_index"); |
+ |
+ String testId = getTestId(test); |
+ |
+ if (proscribed.contains(testId)) { |
+ return true; |
+ } |
+ |
+ if (testId.indexOf(".fail_") != -1) { |
+ return true; |
+ } |
+ |
+ return super.filterTest(test); |
+ } |
+ |
+ @Override |
+ protected void testFailed(TestCase test, TestResult result) { |
+ System.out.println(getTestId(test) + ": fail"); |
+ } |
+ |
+ @Override |
+ protected void testPassed(TestCase test) { |
+ System.out.println(getTestId(test) + ": pass"); |
+ } |
+ |
+ @Override |
+ protected void testsFinished(List<TestCase> allTests, List<TestResult> failures, |
+ List<TestTime> slowTests, long totalTime) { |
+ // shame the slow tests |
+ printHeader("slow tests"); |
+ |
+ if (slowTests.size() > 0) { |
+ Collections.sort(slowTests); |
+ |
+ for (TestTime testTime : slowTests) { |
+ System.out.println(testTime.toString()); |
+ } |
+ } else { |
+ System.out.println("No slow tests!"); |
+ } |
+ |
+ // print any test failures w/ details |
+ printHeader("test summary"); |
+ |
+ if (failures.size() > 0) { |
+ for (TestResult result : failures) { |
+ if (result.failureCount() > 0) { |
+ printFailure(result.failures().nextElement()); |
+ } else { |
+ printFailure(result.errors().nextElement()); |
+ } |
+ } |
+ } |
+ |
+ System.out.println(formatInt(allTests.size()) + " tests run; " + formatInt(failures.size()) |
+ + " failures [" + formatDouble(totalTime / 1000.0) + " secs]."); |
+ |
+ monitor.done(); |
+ } |
+ |
+ @Override |
+ protected void testsStarted(List<TestCase> tests) { |
+ //monitor.beginTask(getName(), tests.size()); |
+ } |
+ |
+ @Override |
+ protected void testStarted(TestCase test) { |
+ monitor.subTask(getTestId(test)); |
+ monitor.worked(1); |
+ } |
+ } |
+ |
+ private static String formatDouble(double d) { |
+ NumberFormat nf = new DecimalFormat(); |
+ nf.setMaximumFractionDigits(2); |
+ nf.setMinimumFractionDigits(2); |
+ return nf.format(d); |
+ } |
+ |
+ private static String formatInt(int i) { |
+ return NumberFormat.getIntegerInstance().format(i); |
+ } |
+ |
+ private boolean exitWhenFinished; |
+ private Test mainTest; |
+ |
+ public BuildbotTestsJob(boolean exitWhenFinished) { |
+ this(exitWhenFinished, TestAll.suite()); |
+ } |
+ |
+ public BuildbotTestsJob(boolean exitWhenFinished, Test mainTest) { |
+ super("Running tests..."); |
+ |
+ this.exitWhenFinished = exitWhenFinished; |
+ this.mainTest = mainTest; |
+ } |
+ |
+ @Override |
+ protected IStatus run(final IProgressMonitor monitor) { |
+ JobTestRunner testRunner = new JobTestRunner(monitor, mainTest); |
+ |
+ testRunner.runTests(); |
+ |
+ if (exitWhenFinished) { |
+ exitWorkbench(); |
+ } |
+ |
+ return Status.OK_STATUS; |
+ } |
+ |
+ private void exitWorkbench() { |
+ Display.getDefault().asyncExec(new Runnable() { |
+ @Override |
+ public void run() { |
+ PlatformUI.getWorkbench().close(); |
+ } |
+ }); |
+ } |
+ |
+ private void printFailure(TestFailure failure) { |
+ TestCase test = (TestCase) failure.failedTest(); |
+ |
+ System.out.println(AbstractTestRunner.getTestId(test)); |
+ printStackTrace(failure.trace().split("\n")); |
+ System.out.println(); |
+ } |
+ |
+ private void printHeader(String title) { |
+ System.out.println("\n--- " + title + " ---"); |
+ } |
+ |
+ private void printStackTrace(String[] lines) { |
+ for (String line : lines) { |
+ if (line.startsWith("\tat sun.reflect.NativeMethod") |
+ || line.startsWith("\tat java.lang.reflect.Method") |
+ || line.startsWith("\tat junit.framework.TestCase.runTest") |
+ || line.startsWith("\tat junit.framework.TestCase.runBare")) { |
+ return; |
+ } |
+ |
+ System.out.println(line); |
+ } |
+ } |
+ |
+} |