LUCENE-3437: Detect the test thread by reference, not by name.

git-svn-id: https://svn.apache.org/repos/asf/lucene/dev/branches/branch_3x@1171081 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java b/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
index 21b737a..ac38ea8 100644
--- a/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
+++ b/lucene/src/test-framework/org/apache/lucene/util/LuceneTestCase.java
@@ -63,9 +63,11 @@
 import org.junit.BeforeClass;
 import org.junit.Ignore;
 import org.junit.Rule;
+import org.junit.rules.MethodRule;
 import org.junit.rules.TestWatchman;
 import org.junit.runner.RunWith;
 import org.junit.runners.model.FrameworkMethod;
+import org.junit.runners.model.Statement;
 
 /**
  * Base class for all Lucene unit tests, Junit3 or Junit4 variant.
@@ -415,6 +417,29 @@
       super.starting(method);
     }
   };
+  
+  /** 
+   * The thread executing the current test case.
+   * @see #isTestThread()
+   */
+  volatile Thread testCaseThread;
+
+  /** @see #testCaseThread */
+  @Rule
+  public final MethodRule setTestThread = new MethodRule() {
+    public Statement apply(final Statement s, FrameworkMethod fm, Object target) {
+      return new Statement() {
+        public void evaluate() throws Throwable {
+          try {
+            LuceneTestCase.this.testCaseThread = Thread.currentThread();
+            s.evaluate();
+          } finally {
+            LuceneTestCase.this.testCaseThread = null;
+          }
+        }
+      };
+    }
+  };
 
   @Before
   public void setUp() throws Exception {
@@ -480,6 +505,15 @@
     }
   }
 
+  /**
+   * Returns true if and only if the calling thread is the primary thread 
+   * executing the test case. 
+   */
+  protected boolean isTestThread() {
+    assertNotNull("Test case thread not set?", testCaseThread);
+    return Thread.currentThread() == testCaseThread;
+  }
+
   @After
   public void tearDown() throws Exception {
     State oldState = state; // capture test execution state
@@ -1237,7 +1271,7 @@
   
   static final Random seedRand = new Random();
   protected static final SmartRandom random = new SmartRandom(0);
-  
+
   private String name = "<unknown>";
   
   /**
diff --git a/lucene/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java b/lucene/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
index 90a318f..ae1bb2c 100644
--- a/lucene/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
+++ b/lucene/src/test/org/apache/lucene/index/TestConcurrentMergeScheduler.java
@@ -28,7 +28,7 @@
 
 public class TestConcurrentMergeScheduler extends LuceneTestCase {
   
-  private static class FailOnlyOnFlush extends MockDirectoryWrapper.Failure {
+  private class FailOnlyOnFlush extends MockDirectoryWrapper.Failure {
     boolean doFail;
     boolean hitExc;
 
@@ -44,8 +44,7 @@
 
     @Override
     public void eval(MockDirectoryWrapper dir)  throws IOException {
-      if (doFail && (Thread.currentThread().getName().equals("main") 
-          || Thread.currentThread().getName().equals("Main Thread"))) {
+      if (doFail && isTestThread()) {
         boolean isDoFlush = false;
         boolean isClose = false;
         StackTraceElement[] trace = new Exception().getStackTrace();