Use junit TemporaryFolder to cleanup files created by tests

The custom code used earlier sometimes failed to cleanup files created
by tests. Hence replace it by using TemporaryFolder.

Change-Id: I8c1219b01835a4a6d20498ab04555af024e4e624
diff --git a/org.eclipse.jgit.junit/.settings/.api_filters b/org.eclipse.jgit.junit/.settings/.api_filters
new file mode 100644
index 0000000..2781530
--- /dev/null
+++ b/org.eclipse.jgit.junit/.settings/.api_filters
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<component id="org.eclipse.jgit.junit" version="2">
+    <resource path="src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java" type="org.eclipse.jgit.junit.LocalDiskRepositoryTestCase">
+        <filter id="336658481">
+            <message_arguments>
+                <message_argument value="org.eclipse.jgit.junit.LocalDiskRepositoryTestCase"/>
+                <message_argument value="testRoot"/>
+            </message_arguments>
+        </filter>
+    </resource>
+</component>
diff --git a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
index c15fc99..0d20f64 100644
--- a/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
+++ b/org.eclipse.jgit.junit/src/org/eclipse/jgit/junit/LocalDiskRepositoryTestCase.java
@@ -26,14 +26,13 @@
 import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Random;
 import java.util.Set;
 import java.util.TreeSet;
-import java.util.concurrent.ConcurrentHashMap;
 
 import org.eclipse.jgit.dircache.DirCache;
 import org.eclipse.jgit.dircache.DirCacheEntry;
 import org.eclipse.jgit.internal.storage.file.FileRepository;
-import org.eclipse.jgit.internal.util.ShutdownHook;
 import org.eclipse.jgit.lib.ConfigConstants;
 import org.eclipse.jgit.lib.Constants;
 import org.eclipse.jgit.lib.ObjectId;
@@ -48,6 +47,7 @@
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Rule;
+import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestName;
 
 /**
@@ -85,6 +85,16 @@ public abstract class LocalDiskRepositoryTestCase {
 	protected MockSystemReader mockSystemReader;
 
 	private final Set<Repository> toClose = new HashSet<>();
+
+	/**
+	 * Temporary test root directory for files created by tests.
+	 * @since 7.2
+	 */
+	@Rule
+	public TemporaryFolder testRoot = new TemporaryFolder();
+
+	Random rand = new Random();
+
 	private File tmp;
 
 	private File homeDir;
@@ -115,11 +125,8 @@ private String getTestName() {
 	 */
 	@Before
 	public void setUp() throws Exception {
-		tmp = File.createTempFile("jgit_" + getTestName() + '_', "_tmp");
-		Cleanup.deleteOnShutdown(tmp);
-		if (!tmp.delete() || !tmp.mkdir()) {
-			throw new IOException("Cannot create " + tmp);
-		}
+		tmp = testRoot.newFolder(getTestName() + rand.nextInt());
+
 		mockSystemReader = new MockSystemReader();
 		SystemReader.setInstance(mockSystemReader);
 
@@ -220,12 +227,6 @@ public void tearDown() throws Exception {
 			System.gc();
 		}
 		FS.DETECTED.setUserHome(homeDir);
-		if (tmp != null) {
-			recursiveDelete(tmp, false, true);
-		}
-		if (tmp != null && !tmp.exists()) {
-			Cleanup.removed(tmp);
-		}
 		SystemReader.setInstance(null);
 	}
 
@@ -624,41 +625,4 @@ protected String read(File f) throws IOException {
 	private static HashMap<String, String> cloneEnv() {
 		return new HashMap<>(System.getenv());
 	}
-
-	private static final class Cleanup {
-		private static final Cleanup INSTANCE = new Cleanup();
-
-		static {
-			ShutdownHook.INSTANCE.register(() -> INSTANCE.onShutdown());
-		}
-
-		private final Set<File> toDelete = ConcurrentHashMap.newKeySet();
-
-		private Cleanup() {
-			// empty
-		}
-
-		static void deleteOnShutdown(File tmp) {
-			INSTANCE.toDelete.add(tmp);
-		}
-
-		static void removed(File tmp) {
-			INSTANCE.toDelete.remove(tmp);
-		}
-
-		private void onShutdown() {
-			// On windows accidentally open files or memory
-			// mapped regions may prevent files from being deleted.
-			// Suggesting a GC increases the likelihood that our
-			// test repositories actually get removed after the
-			// tests, even in the case of failure.
-			System.gc();
-			synchronized (this) {
-				boolean silent = false;
-				boolean failOnError = false;
-				for (File tmp : toDelete)
-					recursiveDelete(tmp, silent, failOnError);
-			}
-		}
-	}
 }