Java tutorial
/* * Copyright 2010 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.gradle.util; import org.apache.commons.lang.StringUtils; import org.junit.rules.MethodRule; import org.junit.runners.model.FrameworkMethod; import org.junit.runners.model.Statement; import java.io.File; /** * A JUnit rule which provides a unique temporary folder for the test. */ public class TemporaryFolder implements MethodRule, TestFileContext { private TestFile dir; private String prefix; private static TestFile root; static { root = new TestFile(new File("build/tmp/tests")); } public TestFile getDir() { if (dir == null) { if (prefix == null) { // This can happen if this is used in a constructor or a @Before method. It also happens when using // @RunWith(SomeRunner) when the runner does not support rules. prefix = determinePrefix(); } for (int counter = 1; true; counter++) { dir = root.file(counter == 1 ? prefix : String.format("%s%d", prefix, counter)); if (dir.mkdirs()) { break; } } } return dir; } private String determinePrefix() { StackTraceElement[] stackTrace = new RuntimeException().getStackTrace(); for (StackTraceElement element : stackTrace) { if (element.getClassName().endsWith("Test")) { return StringUtils.substringAfterLast(element.getClassName(), ".") + "/unknown-test"; } } return "unknown-test-class"; } public Statement apply(final Statement base, final FrameworkMethod method, final Object target) { init(method, target); return new Statement() { @Override public void evaluate() throws Throwable { base.evaluate(); getDir().maybeDeleteDir(); // Don't delete on failure } }; } private void init(FrameworkMethod method, Object target) { if (prefix == null) { prefix = String.format("%s/%s", target.getClass().getSimpleName(), method.getName()); } } public static TemporaryFolder newInstance() { return new TemporaryFolder(); } public static TemporaryFolder newInstance(FrameworkMethod method, Object target) { TemporaryFolder temporaryFolder = new TemporaryFolder(); temporaryFolder.init(method, target); return temporaryFolder; } public TestFile getTestDir() { return getDir(); } public TestFile file(Object... path) { return getDir().file((Object[]) path); } public TestFile createFile(Object... path) { return file((Object[]) path).createFile(); } public TestFile createDir(Object... path) { return file((Object[]) path).createDir(); } }