Hi

When a test fails, the file system directories that it created are not
deleted.

At least on Windows, when you run the test with the same seed again,
_TestUtil.getTempDir fails on  "Access Denied". The reason is that it calls
file.createNewFile() on a directory. I don't know if it's specific to
Windows, but I tried this test with both J9 and Oracle JVMs:

  @Test
  public void testAccessDenied() throws Exception {
    _TestUtil.getTempDir("testAccessDenied").mkdirs();
    fail("msg");
  }

Because of the fail() in the end, the directory is not deleted. If you run
it with the same seed twice (say, -Dtests.seed=6EDF27F12DB68F8D), then
you'll get:

java.lang.RuntimeException: java.io.IOException: Access is denied
    at
__randomizedtesting.SeedInfo.seed([6EDF27F12DB68F8D:668298B50F63FCD2]:0)
    at org.apache.lucene.util._TestUtil.getTempDir(_TestUtil.java:107)
    at
org.apache.lucene.TestAssertions.testAccessDenied(TestAssertions.java:62)

I patched _TestUtil like so, and the test passes:

Index: lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java
===================================================================
---
lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java
(revision 1423868)
+++
lucene/test-framework/src/java/org/apache/lucene/util/_TestUtil.java
(working copy)
@@ -750,7 +750,7 @@
     final Random random = new
Random(RandomizedContext.current().getRandom().nextLong());
     do {
       result = genTempFile(random, prefix, newSuffix, directory);
-    } while (!result.createNewFile());
+    } while (result.exists() || !result.createNewFile());
     return result;
   }

Basically, adding an exists() check before createNewFile(). Even though
createNewFile() documents that it returns false if the file exists, it does
not specify the behavior when the file exists and is a directory, and
obviously fails.

I made sure that calling genTempFile like so in a loop won't ruin
randomness - since it only uses random.nextInt() once, I think it's safe to
add this check?

Shai

Reply via email to