carbidecpp20devenv/plugins/org.eclipse.test.source_3.3.0.v20080507/src/org.junit4_4.3.1/junitsrc/org/junit/internal/runners/TestMethodRunner.java
author cawthron
Wed, 18 Mar 2009 17:21:00 -0500
changeset 1 82d1d1de1a01
permissions -rw-r--r--
import Carbide.c++
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     1
package org.junit.internal.runners;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     2
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     3
import java.lang.reflect.InvocationTargetException;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     4
import java.lang.reflect.Method;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     5
import java.util.concurrent.Callable;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     6
import java.util.concurrent.ExecutorService;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     7
import java.util.concurrent.Executors;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     8
import java.util.concurrent.Future;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
     9
import java.util.concurrent.TimeUnit;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    10
import java.util.concurrent.TimeoutException;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    11
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    12
import org.junit.After;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    13
import org.junit.Before;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    14
import org.junit.runner.Description;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    15
import org.junit.runner.notification.Failure;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    16
import org.junit.runner.notification.RunNotifier;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    17
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    18
public class TestMethodRunner extends BeforeAndAfterRunner {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    19
	private final Object fTest;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    20
	private final Method fMethod;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    21
	private final RunNotifier fNotifier;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    22
	private final TestIntrospector fTestIntrospector;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    23
	private final Description fDescription;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    24
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    25
	public TestMethodRunner(Object test, Method method, RunNotifier notifier, Description description) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    26
		super(test.getClass(), Before.class, After.class, test);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    27
		fTest= test;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    28
		fMethod= method;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    29
		fNotifier= notifier;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    30
		fTestIntrospector= new TestIntrospector(test.getClass());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    31
		fDescription= description;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    32
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    33
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    34
	public void run() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    35
		if (fTestIntrospector.isIgnored(fMethod)) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    36
			fNotifier.fireTestIgnored(fDescription);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    37
			return;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    38
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    39
		fNotifier.fireTestStarted(fDescription);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    40
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    41
			long timeout= fTestIntrospector.getTimeout(fMethod);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    42
			if (timeout > 0)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    43
				runWithTimeout(timeout);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    44
			else
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    45
				runMethod();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    46
		} finally {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    47
			fNotifier.fireTestFinished(fDescription);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    48
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    49
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    50
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    51
	private void runWithTimeout(long timeout) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    52
		ExecutorService service= Executors.newSingleThreadExecutor();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    53
		Callable<Object> callable= new Callable<Object>() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    54
			public Object call() throws Exception {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    55
				runMethod();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    56
				return null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    57
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    58
		};
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    59
		Future<Object> result= service.submit(callable);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    60
		service.shutdown();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    61
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    62
			boolean terminated= service.awaitTermination(timeout,
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    63
					TimeUnit.MILLISECONDS);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    64
			if (!terminated)
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    65
				service.shutdownNow();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    66
			result.get(0, TimeUnit.MILLISECONDS); // throws the exception if one occurred during the invocation
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    67
		} catch (TimeoutException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    68
			addFailure(new Exception(String.format("test timed out after %d milliseconds", timeout)));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    69
		} catch (Exception e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    70
			addFailure(e);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    71
		}		
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    72
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    73
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    74
	private void runMethod() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    75
		runProtected();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    76
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    77
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    78
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    79
	protected void runUnprotected() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    80
		try {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    81
			executeMethodBody();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    82
			if (expectsException())
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    83
				addFailure(new AssertionError("Expected exception: " + expectedException().getName()));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    84
		} catch (InvocationTargetException e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    85
			Throwable actual= e.getTargetException();
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    86
			if (!expectsException())
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    87
				addFailure(actual);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    88
			else if (isUnexpected(actual)) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    89
				String message= "Unexpected exception, expected<" + expectedException().getName() + "> but was<"
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    90
					+ actual.getClass().getName() + ">";
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    91
				addFailure(new Exception(message, actual));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    92
			}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    93
		} catch (Throwable e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    94
			addFailure(e);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    95
		}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    96
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    97
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    98
	protected void executeMethodBody() throws IllegalAccessException, InvocationTargetException {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
    99
		fMethod.invoke(fTest);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   100
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   101
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   102
	@Override
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   103
	protected void addFailure(Throwable e) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   104
		fNotifier.fireTestFailure(new Failure(fDescription, e));
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   105
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   106
	
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   107
	private boolean expectsException() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   108
		return expectedException() != null;
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   109
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   110
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   111
	private Class<? extends Throwable> expectedException() {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   112
		return fTestIntrospector.expectedException(fMethod);
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   113
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   114
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   115
	private boolean isUnexpected(Throwable exception) {
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   116
		return ! expectedException().isAssignableFrom(exception.getClass());
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   117
	}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   118
}
82d1d1de1a01 import Carbide.c++
cawthron
parents:
diff changeset
   119