/* * Licensed to the Apache Software Foundation (ASF) under one or more contributor license * agreements. See the NOTICE file distributed with this work for additional information regarding * copyright ownership. The ASF licenses this file to You 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.apache.geode.test.junit.rules; import java.io.File; import java.io.IOException; import java.util.HashSet; import java.util.Objects; import java.util.Set; import org.junit.rules.ExternalResource; /** * A {@link org.junit.rules.TestRule} to create temporary files in a given directory that should be * deleted when the test method finishes. This is useful in place of * {@link org.junit.rules.TemporaryFolder} when a test needs to create files in a particular * directory, for example user.home or user.dir. * * <p> * Example of usage: * * <pre> * public static class HasTemporaryFile { * @Rule * public TemporaryFileRule temporaryFileRule = TemporaryFileRule.inUserHome(); * * @Test * public void testUsingTempFolder() throws IOException { * File createdFile = temporaryFileRule.newFile("myfile.txt"); * File createdFile = temporaryFileRule.newFile("myfile2.txt"); * // ... * } * } * </pre> */ public class TemporaryFileRule extends ExternalResource { private final String directory; private Set<File> files; private TemporaryFileRule(String parentDirectory) { this.directory = parentDirectory; } public static TemporaryFileRule inUserHome() { return new TemporaryFileRule(System.getProperty("user.home")); } public static TemporaryFileRule inCurrentDir() { return new TemporaryFileRule(System.getProperty("user.dir")); } public static TemporaryFileRule inDirectory(String directory) { return new TemporaryFileRule(directory); } @Override public void before() { files = new HashSet<>(); } @Override public void after() { files.stream().filter(Objects::nonNull).filter(File::exists).forEach(File::delete); } /** * Creates a new file with the given name in the specified {@link #directory}. * * @param fileName the name of the file to create. * * @return the file that was created. * * @throws IllegalStateException if the file already exists. * @throws IllegalStateException if there is an {@link IOException} while creating the file. */ public File newFile(String fileName) { return createFile(directory, fileName); } private File createFile(String directory, String fileName) { File file = new File(directory, fileName); try { if (!file.createNewFile()) { throw new IllegalStateException( "The specified file " + file.getAbsolutePath() + " already exists."); } } catch (IOException e) { throw new IllegalStateException( "IOException attempting to create file " + file.getAbsolutePath() + ".", e); } file.deleteOnExit(); files.add(file); return file; } }