You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@lucene.apache.org by rm...@apache.org on 2015/04/17 13:07:45 UTC

svn commit: r1674274 - /lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java

Author: rmuir
Date: Fri Apr 17 11:07:45 2015
New Revision: 1674274

URL: http://svn.apache.org/r1674274
Log:
LUCENE-6431: make ExtrasFS reproducible

Modified:
    lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java

Modified: lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java
URL: http://svn.apache.org/viewvc/lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java?rev=1674274&r1=1674273&r2=1674274&view=diff
==============================================================================
--- lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java (original)
+++ lucene/dev/trunk/lucene/test-framework/src/java/org/apache/lucene/mockfile/ExtrasFS.java Fri Apr 17 11:07:45 2015
@@ -25,6 +25,8 @@ import java.nio.file.attribute.FileAttri
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicLong;
 
+import com.carrotsearch.randomizedtesting.RandomizedContext;
+
 /** 
  * Adds extra files/subdirectories when directories are created.
  * <p>
@@ -33,30 +35,36 @@ import java.util.concurrent.atomic.Atomi
  * so we add them and see what breaks. 
  * <p>
  * When a directory is created, sometimes a file or directory named 
- * "extraNNNN" will be included with it.
+ * "extra0" will be included with it.
  * All other filesystem operations are passed thru as normal.
  */
 public class ExtrasFS extends FilterFileSystemProvider {
-  final AtomicLong counter = new AtomicLong();
-  final Random random;
+  final int seed;
   
   /** 
    * Create a new instance, wrapping {@code delegate}.
    */
   public ExtrasFS(FileSystem delegate, Random random) {
     super("extras://", delegate);
-    this.random = random;
+    this.seed = random.nextInt();
   }
 
   @Override
   public void createDirectory(Path dir, FileAttribute<?>... attrs) throws IOException {
-    super.createDirectory(dir, attrs);
+    super.createDirectory(dir, attrs);   
     // ok, we created the directory successfully.
-    if (random.nextInt(4) == 0) {
+    
+    // a little funky: we only look at hashcode (well-defined) of the target class name.
+    // using a generator won't reproduce, because we are a per-class resource.
+    // using hashing on filenames won't reproduce, because many of the names rely on other things
+    // the test class did.
+    // so a test gets terrorized with extras or gets none at all depending on the initial seed.
+    int hash = RandomizedContext.current().getTargetClass().toString().hashCode() ^ seed;
+    if ((hash & 3) == 0) {
       // lets add a bogus file... if this fails, we don't care, its best effort.
       try {
-        Path target = dir.resolve("extra" + counter.incrementAndGet());
-        if (random.nextBoolean()) {
+        Path target = dir.resolve("extra0");
+        if (hash < 0) {
           super.createDirectory(target);
         } else {
           Files.createFile(target);