mirror of https://github.com/apache/lucene.git
Modified the rule to attempt to remove temporary files, but report only (not throw an exception). Added tests.
git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/solr5914@1584843 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
bfecbc9274
commit
8cf904fd8e
|
@ -233,6 +233,9 @@ Bug fixes
|
||||||
|
|
||||||
Test Framework
|
Test Framework
|
||||||
|
|
||||||
|
* LUCENE-5577: Temporary folder and file management (and cleanup facilities)
|
||||||
|
(Mark Miller, Uwe Schindler, Dawid Weiss)
|
||||||
|
|
||||||
* LUCENE-5567: When a suite fails with zombie threads failure marker and count
|
* LUCENE-5567: When a suite fails with zombie threads failure marker and count
|
||||||
is not propagated properly. (Dawid Weiss)
|
is not propagated properly. (Dawid Weiss)
|
||||||
|
|
||||||
|
|
|
@ -18,13 +18,19 @@ package org.apache.lucene.util.junitcompat;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.io.RandomAccessFile;
|
||||||
|
|
||||||
|
import org.apache.lucene.util.Constants;
|
||||||
|
import org.apache.lucene.util.LuceneTestCase;
|
||||||
import org.apache.lucene.util.TestUtil;
|
import org.apache.lucene.util.TestUtil;
|
||||||
import org.junit.Assert;
|
import org.junit.Assert;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.junit.runner.JUnitCore;
|
import org.junit.runner.JUnitCore;
|
||||||
import org.junit.runner.Result;
|
import org.junit.runner.Result;
|
||||||
|
|
||||||
|
import com.carrotsearch.randomizedtesting.RandomizedTest;
|
||||||
|
|
||||||
public class TestLeaveFilesIfTestFails extends WithNestedTests {
|
public class TestLeaveFilesIfTestFails extends WithNestedTests {
|
||||||
public TestLeaveFilesIfTestFails() {
|
public TestLeaveFilesIfTestFails() {
|
||||||
super(true);
|
super(true);
|
||||||
|
@ -34,7 +40,6 @@ public class TestLeaveFilesIfTestFails extends WithNestedTests {
|
||||||
static File file;
|
static File file;
|
||||||
public void testDummy() {
|
public void testDummy() {
|
||||||
file = createTempDir("leftover");
|
file = createTempDir("leftover");
|
||||||
file.mkdirs();
|
|
||||||
fail();
|
fail();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -43,7 +48,33 @@ public class TestLeaveFilesIfTestFails extends WithNestedTests {
|
||||||
public void testLeaveFilesIfTestFails() {
|
public void testLeaveFilesIfTestFails() {
|
||||||
Result r = JUnitCore.runClasses(Nested1.class);
|
Result r = JUnitCore.runClasses(Nested1.class);
|
||||||
Assert.assertEquals(1, r.getFailureCount());
|
Assert.assertEquals(1, r.getFailureCount());
|
||||||
Assert.assertTrue(Nested1.file.exists());
|
Assert.assertTrue(Nested1.file != null && Nested1.file.exists());
|
||||||
Nested1.file.delete();
|
Nested1.file.delete();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static class Nested2 extends WithNestedTests.AbstractNestedTest {
|
||||||
|
static File file;
|
||||||
|
static File parent;
|
||||||
|
static RandomAccessFile openFile;
|
||||||
|
|
||||||
|
@SuppressWarnings("deprecation")
|
||||||
|
public void testDummy() throws Exception {
|
||||||
|
file = new File(createTempDir("leftover"), "child.locked");
|
||||||
|
openFile = new RandomAccessFile(file, "rw");
|
||||||
|
|
||||||
|
parent = LuceneTestCase.getTempDirBase();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testWindowsUnremovableFile() throws IOException {
|
||||||
|
RandomizedTest.assumeTrue("Requires Windows.", Constants.WINDOWS);
|
||||||
|
|
||||||
|
Result r = JUnitCore.runClasses(Nested2.class);
|
||||||
|
super.prevSysErr.println(r.getFailures().get(0).getMessage());
|
||||||
|
Assert.assertEquals(1, r.getFailureCount());
|
||||||
|
|
||||||
|
Nested2.openFile.close();
|
||||||
|
TestUtil.rm(Nested2.parent);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -2196,8 +2196,11 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
private static final int TEMP_NAME_RETRY_THRESHOLD = 9999;
|
private static final int TEMP_NAME_RETRY_THRESHOLD = 9999;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* This method is deprecated for a reason. Do not use it. Call {@link #createTempDir()}
|
||||||
|
* or {@link #createTempDir(String)} or {@link #createTempFile(String, String)}.
|
||||||
*/
|
*/
|
||||||
private static File getTempDirBase() {
|
@Deprecated
|
||||||
|
public static File getTempDirBase() {
|
||||||
synchronized (LuceneTestCase.class) {
|
synchronized (LuceneTestCase.class) {
|
||||||
if (tempDirBase == null) {
|
if (tempDirBase == null) {
|
||||||
File directory = new File(System.getProperty("tempDir", System.getProperty("java.io.tmpdir")));
|
File directory = new File(System.getProperty("tempDir", System.getProperty("java.io.tmpdir")));
|
||||||
|
@ -2208,8 +2211,8 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
RandomizedContext ctx = RandomizedContext.current();
|
RandomizedContext ctx = RandomizedContext.current();
|
||||||
Class<?> clazz = ctx.getTargetClass();
|
Class<?> clazz = ctx.getTargetClass();
|
||||||
String prefix = clazz.getName();
|
String prefix = clazz.getName();
|
||||||
prefix = prefix.replaceFirst("^org.apache.lucene.", "oa.lucene.");
|
prefix = prefix.replaceFirst("^org.apache.lucene.", "lucene.");
|
||||||
prefix = prefix.replaceFirst("^org.apache.solr.", "oa.solr.");
|
prefix = prefix.replaceFirst("^org.apache.solr.", "solr.");
|
||||||
|
|
||||||
int attempt = 0;
|
int attempt = 0;
|
||||||
File f;
|
File f;
|
||||||
|
@ -2220,7 +2223,7 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
+ directory.getAbsolutePath());
|
+ directory.getAbsolutePath());
|
||||||
}
|
}
|
||||||
f = new File(directory, prefix + "-" + ctx.getRunnerSeedAsString()
|
f = new File(directory, prefix + "-" + ctx.getRunnerSeedAsString()
|
||||||
+ "-" + String.format(Locale.ENGLISH, "%3d", attempt));
|
+ "-" + String.format(Locale.ENGLISH, "%03d", attempt));
|
||||||
} while (!f.mkdirs());
|
} while (!f.mkdirs());
|
||||||
|
|
||||||
tempDirBase = f;
|
tempDirBase = f;
|
||||||
|
@ -2243,7 +2246,7 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
"Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: "
|
"Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: "
|
||||||
+ base.getAbsolutePath());
|
+ base.getAbsolutePath());
|
||||||
}
|
}
|
||||||
f = new File(base, prefix + "-" + String.format(Locale.ENGLISH, "%3d", attempt));
|
f = new File(base, prefix + "-" + String.format(Locale.ENGLISH, "%03d", attempt));
|
||||||
} while (!f.mkdirs());
|
} while (!f.mkdirs());
|
||||||
|
|
||||||
registerToRemoveAfterSuite(f);
|
registerToRemoveAfterSuite(f);
|
||||||
|
@ -2263,7 +2266,7 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
"Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: "
|
"Failed to get a temporary name too many times, check your temp directory and consider manually cleaning it: "
|
||||||
+ base.getAbsolutePath());
|
+ base.getAbsolutePath());
|
||||||
}
|
}
|
||||||
f = new File(base, prefix + "-" + String.format(Locale.ENGLISH, "%3d", attempt) + suffix);
|
f = new File(base, prefix + "-" + String.format(Locale.ENGLISH, "%03d", attempt) + suffix);
|
||||||
} while (!f.createNewFile());
|
} while (!f.createNewFile());
|
||||||
|
|
||||||
registerToRemoveAfterSuite(f);
|
registerToRemoveAfterSuite(f);
|
||||||
|
@ -2300,14 +2303,6 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Class<?> suiteClass = RandomizedContext.current().getTargetClass();
|
|
||||||
if (suiteClass.isAnnotationPresent(SuppressTempFileChecks.class)) {
|
|
||||||
System.err.println("WARNING: Will leave temporary files (bugUrl: "
|
|
||||||
+ suiteClass.getAnnotation(SuppressTempFileChecks.class).bugUrl() + "): "
|
|
||||||
+ f.getAbsolutePath());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
synchronized (cleanupQueue) {
|
synchronized (cleanupQueue) {
|
||||||
cleanupQueue.addLast(f);
|
cleanupQueue.addLast(f);
|
||||||
}
|
}
|
||||||
|
@ -2315,15 +2310,28 @@ public abstract class LuceneTestCase extends Assert {
|
||||||
|
|
||||||
private static class TemporaryFilesCleanupRule extends TestRuleAdapter {
|
private static class TemporaryFilesCleanupRule extends TestRuleAdapter {
|
||||||
@Override
|
@Override
|
||||||
protected void afterIfSuccessful() throws Throwable {
|
protected void afterAlways(List<Throwable> errors) throws Throwable {
|
||||||
|
if (LuceneTestCase.suiteFailureMarker.wasSuccessful()) {
|
||||||
synchronized (cleanupQueue) {
|
synchronized (cleanupQueue) {
|
||||||
File [] everything = new File [cleanupQueue.size()];
|
File [] everything = new File [cleanupQueue.size()];
|
||||||
for (int i = 0; !cleanupQueue.isEmpty(); i++) {
|
for (int i = 0; !cleanupQueue.isEmpty(); i++) {
|
||||||
everything[i] = cleanupQueue.removeFirst();
|
everything[i] = cleanupQueue.removeLast();
|
||||||
}
|
}
|
||||||
|
|
||||||
// Will throw an IOException on un-removable files.
|
// Will throw an IOException on un-removable files.
|
||||||
|
try {
|
||||||
TestUtil.rm(everything);
|
TestUtil.rm(everything);
|
||||||
|
} catch (IOException e) {
|
||||||
|
Class<?> suiteClass = RandomizedContext.current().getTargetClass();
|
||||||
|
if (suiteClass.isAnnotationPresent(SuppressTempFileChecks.class)) {
|
||||||
|
System.err.println("WARNING: Leftover undeleted temporary files (bugUrl: "
|
||||||
|
+ suiteClass.getAnnotation(SuppressTempFileChecks.class).bugUrl() + "): "
|
||||||
|
+ e.getMessage());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
throw e;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -32,6 +32,7 @@ import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Enumeration;
|
import java.util.Enumeration;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.LinkedHashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Random;
|
import java.util.Random;
|
||||||
|
@ -106,7 +107,7 @@ public final class TestUtil {
|
||||||
* of directories) cannot be removed.
|
* of directories) cannot be removed.
|
||||||
*/
|
*/
|
||||||
public static void rm(File... locations) throws IOException {
|
public static void rm(File... locations) throws IOException {
|
||||||
ArrayList<File> unremoved = rm(new ArrayList<File>(), locations);
|
LinkedHashSet<File> unremoved = rm(new LinkedHashSet<File>(), locations);
|
||||||
if (!unremoved.isEmpty()) {
|
if (!unremoved.isEmpty()) {
|
||||||
StringBuilder b = new StringBuilder("Could not remove the following files (in the order of attempts):\n");
|
StringBuilder b = new StringBuilder("Could not remove the following files (in the order of attempts):\n");
|
||||||
for (File f : unremoved) {
|
for (File f : unremoved) {
|
||||||
|
@ -118,7 +119,7 @@ public final class TestUtil {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static ArrayList<File> rm(ArrayList<File> unremoved, File... locations) {
|
private static LinkedHashSet<File> rm(LinkedHashSet<File> unremoved, File... locations) {
|
||||||
for (File location : locations) {
|
for (File location : locations) {
|
||||||
if (location.exists()) {
|
if (location.exists()) {
|
||||||
if (location.isDirectory()) {
|
if (location.isDirectory()) {
|
||||||
|
|
Loading…
Reference in New Issue