1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.rules;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.internal.runners.statements.FailOnTimeout;
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Description;
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement;
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * The Timeout Rule applies the same timeout to all test methods in a class:
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <pre>
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public static class HasGlobalTimeout {
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public static String log;
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Rule
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public MethodRule globalTimeout= new Timeout(20);
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void testInfiniteLoop1() {
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		log+= &quot;ran1&quot;;
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		for (;;) {
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void testInfiniteLoop2() {
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		log+= &quot;ran2&quot;;
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		for (;;) {
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		}
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * </pre>
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic class Timeout implements TestRule {
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private final int fMillis;
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @param millis the millisecond timeout
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Timeout(int millis) {
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		fMillis= millis;
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Statement apply(Statement base, Description description) {
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return new FailOnTimeout(base, fMillis);
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}