[P-unit-devel] SF.net SVN: p-unit: [158] trunk/punit
Status: Beta
Brought to you by:
zhanghuangzhu
|
From: <zha...@us...> - 2007-05-24 22:20:20
|
Revision: 158
http://p-unit.svn.sourceforge.net/p-unit/?rev=158&view=rev
Author: zhanghuangzhu
Date: 2007-05-24 15:20:21 -0700 (Thu, 24 May 2007)
Log Message:
-----------
Andrew Zhang: Now it supports to run test case with executor pool!!!
Modified Paths:
--------------
trunk/punit/src/org/punit/exception/PUnitException.java
trunk/punit/src/org/punit/reporter/stream/console/ConsoleLogger.java
trunk/punit/src/org/punit/runner/PUnitAbstractRunner.java
trunk/punit/src/org/punit/runner/StreamReaderThread.java
trunk/punit.extension/src/org/punit/reporter/chart/AbstractChartReporter.java
trunk/punit.samples/src/samples/RunnerSamples.java
trunk/punit.samples/src/samples/vms/ListVMTest.java
trunk/punit.test/src/tests/api/org/punit/all/AllTests.java
Added Paths:
-----------
trunk/punit/src/org/punit/runner/ExecutorPool.java
trunk/punit.extension/src/org/punit/runner/
trunk/punit.extension/src/org/punit/runner/PUnitExecutorPool.java
trunk/punit.samples/src/samples/MultiThreadRunnerSample.java
trunk/punit.test/src/tests/api/org/punit/runner/PUnitExecutorPoolTest.java
Modified: trunk/punit/src/org/punit/exception/PUnitException.java
===================================================================
--- trunk/punit/src/org/punit/exception/PUnitException.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit/src/org/punit/exception/PUnitException.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -1,3 +1,5 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+
package org.punit.exception;
/**
Modified: trunk/punit/src/org/punit/reporter/stream/console/ConsoleLogger.java
===================================================================
--- trunk/punit/src/org/punit/reporter/stream/console/ConsoleLogger.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit/src/org/punit/reporter/stream/console/ConsoleLogger.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -12,7 +12,8 @@
private void readObject(java.io.ObjectInputStream in) throws IOException,
ClassNotFoundException {
- _outStream = System.err;
+ _outStream = System.out;
+ _errStream = System.err;
}
public ConsoleLogger() {
Added: trunk/punit/src/org/punit/runner/ExecutorPool.java
===================================================================
--- trunk/punit/src/org/punit/runner/ExecutorPool.java (rev 0)
+++ trunk/punit/src/org/punit/runner/ExecutorPool.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -0,0 +1,11 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+
+package org.punit.runner;
+
+import java.io.*;
+
+public interface ExecutorPool extends Serializable {
+ public void execute(Runnable task);
+ public void start();
+ public void join();
+}
Modified: trunk/punit/src/org/punit/runner/PUnitAbstractRunner.java
===================================================================
--- trunk/punit/src/org/punit/runner/PUnitAbstractRunner.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit/src/org/punit/runner/PUnitAbstractRunner.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -1,3 +1,5 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+
package org.punit.runner;
import java.io.*;
@@ -21,13 +23,14 @@
private TestMethodRunner _testMethodRunner;
- private final List _eventListeners = new ArrayList(); // List
+ // List <PUnitEventListener>
+ private final List _eventListeners = new ArrayList();
- // <PUnitEventListener>
-
private ConsoleLogger _consoleLogger = new ConsoleLogger();
private RunnerProperties _properties = new RunnerProperties();
+
+ private ExecutorPool _executorPool;
public PUnitAbstractRunner(TestSuiteBuilder testSuiteBuiler,
TestMethodBuilder testMethodBuilder,
@@ -49,6 +52,7 @@
}
private void runTestClasses(Object[] testClasses) {
+ startExecutorPool();
for (int i = 0; i < testClasses.length; ++i) {
Object testClass = testClasses[i];
if (isTestSuiteLabel(testClass)) {
@@ -57,8 +61,25 @@
runTestClass((Class) testClass);
}
}
+ waitExecutorPoolTermination();
}
+ public void setExecutorPool(ExecutorPool pool) {
+ _executorPool = pool;
+ }
+
+ private void startExecutorPool() {
+ if(_executorPool != null) {
+ _executorPool.start();
+ }
+ }
+
+ private void waitExecutorPoolTermination() {
+ if(_executorPool != null) {
+ _executorPool.join();
+ }
+ }
+
public void run(Class clazz, RunnerProperties properties) {
setRunnerProperties(properties);
run(clazz);
@@ -94,11 +115,11 @@
}
private void readOutputStream(Process p) {
- new StreamReaderThread(p.getInputStream()).start();
+ new StreamReaderThread(p.getInputStream(), false).start();
}
private void readErrorStream(Process p) {
- new StreamReaderThread(p.getErrorStream()).start();
+ new StreamReaderThread(p.getErrorStream(), true).start();
}
private void filterNonParentEventListeners() {
@@ -185,6 +206,27 @@
}
private void runTestClass(final Class clazz) {
+ if(_executorPool == null) {
+ runTestClassImpl(clazz);
+ } else {
+ _executorPool.execute(new RunTestClassTask(clazz));
+ }
+ }
+
+ private class RunTestClassTask implements Runnable {
+ private Class _clazz;
+
+ public RunTestClassTask(Class clazz) {
+ _clazz = clazz;
+ }
+
+ public void run() {
+ runTestClassImpl(_clazz);
+ }
+
+ }
+
+ private void runTestClassImpl(final Class clazz) {
onClassStart(clazz);
Collection testMethods = buildTestMethod(clazz);
TraverserUtil.traverse(testMethods.iterator(), new Traverser() {
@@ -232,16 +274,17 @@
Parameterizable pInstance = (Parameterizable) testInstance;
Parameter[] params = pInstance.parameters();
for (int i = 0; i < params.length; ++i) {
- runTestMethod(testInstance, method, new Object[] { params[i] });
+ runTestMethod(testInstance, method, new Object[] { params[i] });
}
} else {
runTestMethod(testInstance, method, new Object[] {});
}
}
- private void runTestMethod(Object testInstance, Method method, Object[] params) {
+ private void runTestMethod(Object testInstance, Method method,
+ Object[] params) {
_testMethodRunner.run(testInstance, method, params);
- }
+ }
private Collection buildTestMethod(Class testClass) {
return _testMethodBuilder.buildTestMethods(testClass);
Modified: trunk/punit/src/org/punit/runner/StreamReaderThread.java
===================================================================
--- trunk/punit/src/org/punit/runner/StreamReaderThread.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit/src/org/punit/runner/StreamReaderThread.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -4,9 +4,11 @@
class StreamReaderThread extends Thread {
private InputStream _is;
+ private PrintStream _ps;
- public StreamReaderThread(InputStream is) {
+ public StreamReaderThread(InputStream is, boolean errStream) {
_is = is;
+ _ps = errStream ? System.err : System.out;
}
public void run() {
@@ -19,7 +21,7 @@
if(string == null) {
break;
}
- System.err.println(string);
+ _ps.println(string);
}
} catch (IOException e) {
}
Modified: trunk/punit.extension/src/org/punit/reporter/chart/AbstractChartReporter.java
===================================================================
--- trunk/punit.extension/src/org/punit/reporter/chart/AbstractChartReporter.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit.extension/src/org/punit/reporter/chart/AbstractChartReporter.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -195,6 +195,24 @@
return (PUnitTestSuite) _currentSuiteStack.getLast();
}
+ public void onMethodEnd(final Method method, final Object testInstance,
+ final Object[] params, final Throwable t, List watchers) {
+ TraverserUtil.traverse(watchers.iterator(), new Traverser() {
+ public void traverse(Object obj) {
+ Watcher watcher = (Watcher) obj;
+ DatasetKey key = getKey(watcher);
+ DefaultCategoryDataset dataset = getDatasetOrNew(key);
+ if (isParentRunner()) {
+ return;
+ }
+ double value = watcher.value();
+ String yname = testInstance.getClass().getSimpleName();
+ String xname = ReporterUtil.simpleMethodName(method, params);
+ dataset.addValue(value, yname, xname); // value, y, x
+ }
+ });
+ }
+
public void onWatcherStart(Watcher watcher) {
// nothing needs to do
}
@@ -216,22 +234,4 @@
// nothing needs to do
}
- public void onMethodEnd(final Method method, final Object testInstance,
- final Object[] params, final Throwable t, List watchers) {
- TraverserUtil.traverse(watchers.iterator(), new Traverser() {
- public void traverse(Object obj) {
- Watcher watcher = (Watcher) obj;
- DatasetKey key = getKey(watcher);
- DefaultCategoryDataset dataset = getDatasetOrNew(key);
- if (isParentRunner()) {
- return;
- }
- double value = watcher.value();
- String yname = testInstance.getClass().getSimpleName();
- String xname = ReporterUtil.simpleMethodName(method, params);
- dataset.addValue(value, yname, xname); // value, y, x
- }
- });
- }
-
}
Added: trunk/punit.extension/src/org/punit/runner/PUnitExecutorPool.java
===================================================================
--- trunk/punit.extension/src/org/punit/runner/PUnitExecutorPool.java (rev 0)
+++ trunk/punit.extension/src/org/punit/runner/PUnitExecutorPool.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -0,0 +1,40 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+
+package org.punit.runner;
+
+import java.util.concurrent.*;
+import org.punit.exception.*;
+
+public class PUnitExecutorPool implements ExecutorPool {
+
+ private static final long serialVersionUID = 642472113631919417L;
+
+ private int _threadCount;
+
+ private transient ExecutorService _pool;
+
+ public PUnitExecutorPool(int count) {
+ if (count < 1) {
+ throw new IllegalArgumentException();
+ }
+ _threadCount = count;
+ }
+
+ public void execute(Runnable task) {
+ _pool.execute(task);
+ }
+
+ public void join() {
+ try {
+ _pool.shutdown();
+ _pool.awaitTermination(Integer.MAX_VALUE, TimeUnit.SECONDS);
+ } catch (InterruptedException e) {
+ throw new PUnitIOException(e);
+ }
+ }
+
+ public void start() {
+ _pool = Executors.newFixedThreadPool(_threadCount);
+ }
+
+}
Added: trunk/punit.samples/src/samples/MultiThreadRunnerSample.java
===================================================================
--- trunk/punit.samples/src/samples/MultiThreadRunnerSample.java (rev 0)
+++ trunk/punit.samples/src/samples/MultiThreadRunnerSample.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -0,0 +1,21 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+package samples;
+
+import org.punit.runner.*;
+
+public class MultiThreadRunnerSample {
+ public static void main(String[] args) {
+ /*
+ * Users can use either PUnitSoloRunner or PUnitConcurrentRunner to run
+ * any test classes and test suites. The reporters can be configured by
+ * runner.addPUnitEventListener, including
+ * Console(default)/File/Image/PDF.
+ *
+ * The result can be found in ./result/ folder.
+ */
+ PUnitSoloRunner runner = new PUnitSoloRunner();
+ // runner = new PUnitConcurrentRunner();
+ runner.setExecutorPool(new PUnitExecutorPool(10));
+ runner.run(AllTestSuite.class);
+ }
+}
Modified: trunk/punit.samples/src/samples/RunnerSamples.java
===================================================================
--- trunk/punit.samples/src/samples/RunnerSamples.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit.samples/src/samples/RunnerSamples.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -17,8 +17,9 @@
*
* The result can be found in ./result/ folder.
*/
- Runner runner = new PUnitSoloRunner();
+ PUnitSoloRunner runner = new PUnitSoloRunner();
// runner = new PUnitConcurrentRunner();
+ runner.setExecutorPool(new PUnitExecutorPool(5));
runner.addPUnitEventListener(new FileLogger());
runner.addPUnitEventListener(new OverviewReporter(new ImageRender()));
runner.addPUnitEventListener(new OverviewReporter(new PDFRender()));
Modified: trunk/punit.samples/src/samples/vms/ListVMTest.java
===================================================================
--- trunk/punit.samples/src/samples/vms/ListVMTest.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit.samples/src/samples/vms/ListVMTest.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -4,6 +4,7 @@
import org.punit.reporter.chart.*;
import org.punit.reporter.chart.image.*;
+import org.punit.reporter.stream.file.*;
import org.punit.runner.*;
import org.punit.type.*;
@@ -15,6 +16,8 @@
*/
public static void main(String[] args) {
PUnitSoloRunner runner = new PUnitSoloRunner();
+// runner.setExecutorPool(new PUnitExecutorPool(5));
+ runner.addPUnitEventListener(new FileLogger());
runner.addPUnitEventListener(new OverviewReporter(new ImageRender()));
runner.runVMs(ListTestClass.class, new VM[] { VMConfig.IBMVME, VMConfig.SUNVM });
}
Modified: trunk/punit.test/src/tests/api/org/punit/all/AllTests.java
===================================================================
--- trunk/punit.test/src/tests/api/org/punit/all/AllTests.java 2007-05-24 19:59:58 UTC (rev 157)
+++ trunk/punit.test/src/tests/api/org/punit/all/AllTests.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -33,7 +33,8 @@
PUnitAbstractTestMethodBuilderTest.class,
PUnitConcurrentRunnerTest.class,
PUnitStreamListenerTest.class,
- extension.tests.api.org.punit.runner.PUnitSoloRunnerTest.class,
+ PUnitExecutorPoolTest.class,
+ extension.tests.api.org.punit.runner.PUnitSoloRunnerTest.class,
PUnitSoloRunnerTest.class,
PUnitTestMethodBuilderTest.class,
PUnitTestSuiteBuilderTest.class,
Added: trunk/punit.test/src/tests/api/org/punit/runner/PUnitExecutorPoolTest.java
===================================================================
--- trunk/punit.test/src/tests/api/org/punit/runner/PUnitExecutorPoolTest.java (rev 0)
+++ trunk/punit.test/src/tests/api/org/punit/runner/PUnitExecutorPoolTest.java 2007-05-24 22:20:21 UTC (rev 158)
@@ -0,0 +1,50 @@
+/* (C) Copyright 2007, by Andrew Zhang */
+
+package tests.api.org.punit.runner;
+
+import org.punit.runner.*;
+
+import tests.util.*;
+
+import junit.framework.*;
+
+public class PUnitExecutorPoolTest extends TestCase {
+
+ private PUnitExecutorPool _pool = new PUnitExecutorPool(5);
+
+ public void testCtor() {
+ AssertUtil.assertException(IllegalArgumentException.class,
+ new CodeRunner() {
+ public void run() throws Throwable {
+ new PUnitExecutorPool(0);
+ }
+ });
+ }
+
+ public void testStartJoin() {
+ _pool.start();
+ _pool.join();
+ }
+
+ public void testExecute() {
+ _pool.start();
+ RunnableTask task = new RunnableTask();
+ _pool.execute(task);
+ _pool.join();
+ task.assertExecuted();
+ }
+
+ static class RunnableTask implements Runnable {
+
+ private boolean _executed;
+
+ public void run() {
+ _executed = true;
+ }
+
+ public void assertExecuted() {
+ assertTrue(_executed);
+ }
+
+ }
+}
This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site.
|