1b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpackage org.junit.rules;
2b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
3b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runner.Description;
4b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotimport org.junit.runners.model.Statement;
5b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
6b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot/**
7b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * A base class for Rules (like TemporaryFolder) that set up an external
8b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * resource before a test (a file, socket, server, database connection, etc.),
9b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * and guarantee to tear it down afterward:
10b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
11b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * <pre>
12b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * public static class UsesExternalResource {
13b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	Server myServer= new Server();
14b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
15b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Rule
16b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public ExternalResource resource= new ExternalResource() {
17b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
18b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		protected void before() throws Throwable {
19b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			myServer.connect();
20b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		};
21b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
22b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		&#064;Override
23b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		protected void after() {
24b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 			myServer.disconnect();
25b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		};
26b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	};
27b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot *
28b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	&#064;Test
29b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	public void testFoo() {
30b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 		new Client().run(myServer);
31b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * 	}
32b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * }
33b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot * </pre>
34b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot */
35b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabotpublic abstract class ExternalResource implements TestRule {
36b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	public Statement apply(Statement base, Description description) {
37b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return statement(base);
38b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
39b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
40b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	private Statement statement(final Statement base) {
41b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		return new Statement() {
42b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			@Override
43b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			public void evaluate() throws Throwable {
44b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				before();
45b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				try {
46b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					base.evaluate();
47b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				} finally {
48b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot					after();
49b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot				}
50b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot			}
51b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		};
52b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
53b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
54b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
55b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Override to set up your specific external resource.
56b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * @throws if setup fails (which will disable {@code after}
57b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
58b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected void before() throws Throwable {
59b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		// do nothing
60b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
61b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot
62b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	/**
63b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 * Override to tear down your specific external resource.
64b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	 */
65b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	protected void after() {
66b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot		// do nothing
67b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot	}
68b3823db9f1192d8c81345740b3e65bd6738ba55bBrett Chabot}
69