Home | History | Annotate | Download | only in experimental
      1 package org.junit.experimental;
      2 
      3 import java.util.ArrayList;
      4 import java.util.List;
      5 import java.util.concurrent.Callable;
      6 import java.util.concurrent.ExecutorService;
      7 import java.util.concurrent.Executors;
      8 import java.util.concurrent.Future;
      9 
     10 import org.junit.runner.Computer;
     11 import org.junit.runner.Runner;
     12 import org.junit.runners.ParentRunner;
     13 import org.junit.runners.model.InitializationError;
     14 import org.junit.runners.model.RunnerBuilder;
     15 import org.junit.runners.model.RunnerScheduler;
     16 
     17 public class ParallelComputer extends Computer {
     18 	private final boolean fClasses;
     19 
     20 	private final boolean fMethods;
     21 
     22 	public ParallelComputer(boolean classes, boolean methods) {
     23 		fClasses= classes;
     24 		fMethods= methods;
     25 	}
     26 
     27 	public static Computer classes() {
     28 		return new ParallelComputer(true, false);
     29 	}
     30 
     31 	public static Computer methods() {
     32 		return new ParallelComputer(false, true);
     33 	}
     34 
     35 	private static <T> Runner parallelize(Runner runner) {
     36 		if (runner instanceof ParentRunner<?>) {
     37 			((ParentRunner<?>) runner).setScheduler(new RunnerScheduler() {
     38 				private final List<Future<Object>> fResults= new ArrayList<Future<Object>>();
     39 
     40 				private final ExecutorService fService= Executors
     41 						.newCachedThreadPool();
     42 
     43 				public void schedule(final Runnable childStatement) {
     44 					fResults.add(fService.submit(new Callable<Object>() {
     45 						public Object call() throws Exception {
     46 							childStatement.run();
     47 							return null;
     48 						}
     49 					}));
     50 				}
     51 
     52 				public void finished() {
     53 					for (Future<Object> each : fResults)
     54 						try {
     55 							each.get();
     56 						} catch (Exception e) {
     57 							e.printStackTrace();
     58 						}
     59 				}
     60 			});
     61 		}
     62 		return runner;
     63 	}
     64 
     65 	@Override
     66 	public Runner getSuite(RunnerBuilder builder, java.lang.Class<?>[] classes)
     67 			throws InitializationError {
     68 		Runner suite= super.getSuite(builder, classes);
     69 		return fClasses ? parallelize(suite) : suite;
     70 	}
     71 
     72 	@Override
     73 	protected Runner getRunner(RunnerBuilder builder, Class<?> testClass)
     74 			throws Throwable {
     75 		Runner runner= super.getRunner(builder, testClass);
     76 		return fMethods ? parallelize(runner) : runner;
     77 	}
     78 }
     79