Repository: hbase
Updated Branches:
  refs/heads/branch-1 95bc9a337 -> 8c16d2ce0


HBASE-11984 TestClassFinder failing on occasion


Project: http://git-wip-us.apache.org/repos/asf/hbase/repo
Commit: http://git-wip-us.apache.org/repos/asf/hbase/commit/8c16d2ce
Tree: http://git-wip-us.apache.org/repos/asf/hbase/tree/8c16d2ce
Diff: http://git-wip-us.apache.org/repos/asf/hbase/diff/8c16d2ce

Branch: refs/heads/branch-1
Commit: 8c16d2ce0d13287e40535445f1dbec91a8139d62
Parents: 95bc9a3
Author: stack <st...@apache.org>
Authored: Tue Sep 16 11:31:29 2014 -0700
Committer: stack <st...@apache.org>
Committed: Tue Sep 16 11:31:29 2014 -0700

----------------------------------------------------------------------
 .../apache/hadoop/hbase/TestClassFinder.java    | 114 ++++++++++++-------
 1 file changed, 73 insertions(+), 41 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/hbase/blob/8c16d2ce/hbase-common/src/test/java/org/apache/hadoop/hbase/TestClassFinder.java
----------------------------------------------------------------------
diff --git 
a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestClassFinder.java 
b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestClassFinder.java
index 261fc1e..890f108 100644
--- a/hbase-common/src/test/java/org/apache/hadoop/hbase/TestClassFinder.java
+++ b/hbase-common/src/test/java/org/apache/hadoop/hbase/TestClassFinder.java
@@ -42,18 +42,21 @@ import java.util.jar.Manifest;
 import javax.tools.JavaCompiler;
 import javax.tools.ToolProvider;
 
-import org.apache.commons.logging.Log;
-import org.apache.commons.logging.LogFactory;
+import org.apache.hadoop.hbase.SmallTests;
 import org.junit.AfterClass;
 import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
+import org.junit.rules.TestName;
+import org.mortbay.log.Log;
 
 @Category(SmallTests.class)
 public class TestClassFinder {
-  private static final Log LOG = LogFactory.getLog(TestClassFinder.class);
+  @Rule public TestName name = new TestName();
   private static final HBaseCommonTestingUtility testUtil = new 
HBaseCommonTestingUtility();
   private static final String BASEPKG = "tfcpkg";
+  private static final String PREFIX = "Prefix";
 
   // Use unique jar/class/package names in each test case with the help
   // of these global counters; we are mucking with ClassLoader in this test
@@ -75,6 +78,7 @@ public class TestClassFinder {
       deleteTestDir();
     }
     assertTrue(testDir.mkdirs());
+    Log.info("Using new, clean directory=" + testDir);
   }
 
   @AfterClass
@@ -114,8 +118,8 @@ public class TestClassFinder {
   @Test
   public void testClassFinderHandlesNestedPackages() throws Exception {
     final String NESTED = ".nested";
-    final String CLASSNAME1 = "c2";
-    final String CLASSNAME2 = "c3";
+    final String CLASSNAME1 = name.getMethodName() + "1";
+    final String CLASSNAME2 = name.getMethodName() + "2";
     long counter = testCounter.incrementAndGet();
     FileAndPath c1 = compileTestClass(counter, "", "c1");
     FileAndPath c2 = compileTestClass(counter, NESTED, CLASSNAME1);
@@ -135,55 +139,56 @@ public class TestClassFinder {
 
   @Test
   public void testClassFinderFiltersByNameInJar() throws Exception {
-    final String CLASSNAME = "c1";
-    final String CLASSNAMEEXCPREFIX = "c2";
-    long counter = testCounter.incrementAndGet();
-    FileAndPath c1 = compileTestClass(counter, "", CLASSNAME);
-    FileAndPath c2 = compileTestClass(counter, "", CLASSNAMEEXCPREFIX + "1");
-    FileAndPath c3 = compileTestClass(counter, "", CLASSNAMEEXCPREFIX + "2");
-    packageAndLoadJar(c1, c2, c3);
+    final long counter = testCounter.incrementAndGet();
+    final String classNamePrefix = name.getMethodName();
+    Log.info("Created jar " + createAndLoadJar("", classNamePrefix, counter));
 
     ClassFinder.FileNameFilter notExcNameFilter = new 
ClassFinder.FileNameFilter() {
       @Override
       public boolean isCandidateFile(String fileName, String absFilePath) {
-        return !fileName.startsWith(CLASSNAMEEXCPREFIX);
+        return !fileName.startsWith(PREFIX);
       }
     };
     ClassFinder incClassesFinder = new ClassFinder(null, notExcNameFilter, 
null);
     Set<Class<?>> incClasses = incClassesFinder.findClasses(
         makePackageName("", counter), false);
     assertEquals(1, incClasses.size());
-    Class<?> incClass = makeClass("", CLASSNAME, counter);
+    Class<?> incClass = makeClass("", classNamePrefix, counter);
     assertTrue(incClasses.contains(incClass));
   }
 
   @Test
   public void testClassFinderFiltersByClassInJar() throws Exception {
-    final String CLASSNAME = "c1";
-    final String CLASSNAMEEXCPREFIX = "c2";
-    long counter = testCounter.incrementAndGet();
-    FileAndPath c1 = compileTestClass(counter, "", CLASSNAME);
-    FileAndPath c2 = compileTestClass(counter, "", CLASSNAMEEXCPREFIX + "1");
-    FileAndPath c3 = compileTestClass(counter, "", CLASSNAMEEXCPREFIX + "2");
-    packageAndLoadJar(c1, c2, c3);
+    final long counter = testCounter.incrementAndGet();
+    final String classNamePrefix = name.getMethodName();
+    Log.info("Created jar " + createAndLoadJar("", classNamePrefix, counter));
 
     final ClassFinder.ClassFilter notExcClassFilter = new 
ClassFinder.ClassFilter() {
       @Override
       public boolean isCandidateClass(Class<?> c) {
-        return !c.getSimpleName().startsWith(CLASSNAMEEXCPREFIX);
+        return !c.getSimpleName().startsWith(PREFIX);
       }
     };
     ClassFinder incClassesFinder = new ClassFinder(null, null, 
notExcClassFilter);
     Set<Class<?>> incClasses = incClassesFinder.findClasses(
         makePackageName("", counter), false);
     assertEquals(1, incClasses.size());
-    Class<?> incClass = makeClass("", CLASSNAME, counter);
+    Class<?> incClass = makeClass("", classNamePrefix, counter);
     assertTrue(incClasses.contains(incClass));
   }
 
+  private static String createAndLoadJar(final String packageNameSuffix,
+      final String classNamePrefix, final long counter)
+  throws Exception {
+    FileAndPath c1 = compileTestClass(counter, packageNameSuffix, 
classNamePrefix);
+    FileAndPath c2 = compileTestClass(counter, packageNameSuffix, PREFIX + 
"1");
+    FileAndPath c3 = compileTestClass(counter, packageNameSuffix, PREFIX + 
classNamePrefix + "2");
+    return packageAndLoadJar(c1, c2, c3);
+  }
+
   @Test
   public void testClassFinderFiltersByPathInJar() throws Exception {
-    final String CLASSNAME = "c1";
+    final String CLASSNAME = name.getMethodName();
     long counter = testCounter.incrementAndGet();
     FileAndPath c1 = compileTestClass(counter, "", CLASSNAME);
     FileAndPath c2 = compileTestClass(counter, "", "c2");
@@ -213,47 +218,74 @@ public class TestClassFinder {
 
   @Test
   public void testClassFinderCanFindClassesInDirs() throws Exception {
-    // Well, technically, we are not guaranteed that the classes will
-    // be in dirs, but during normal build they would be.
+    // Make some classes for us to find.  Class naming and packaging is kinda 
cryptic.
+    // TODO: Fix.
+    final long counter = testCounter.incrementAndGet();
+    final String classNamePrefix = name.getMethodName();
+    String pkgNameSuffix = name.getMethodName();
+    Log.info("Created jar " + createAndLoadJar(pkgNameSuffix, classNamePrefix, 
counter));
     ClassFinder allClassesFinder = new ClassFinder();
-    Set<Class<?>> allClasses = allClassesFinder.findClasses(
-        this.getClass().getPackage().getName(), false);
-    assertTrue(allClasses.contains(this.getClass()));
-    assertTrue(allClasses.contains(ClassFinder.class));
+    String pkgName = makePackageName(pkgNameSuffix, counter);
+    Set<Class<?>> allClasses = allClassesFinder.findClasses(pkgName, false);
+    assertTrue("Classes in " + pkgName, allClasses.size() > 0);
+    String classNameToFind = classNamePrefix + counter;
+    assertTrue(contains(allClasses, classNameToFind));
+  }
+
+  private static boolean contains(final Set<Class<?>> classes, final String 
simpleName) {
+    for (Class<?> c: classes) {
+      if (c.getSimpleName().equals(simpleName)) return true;
+    }
+    return false;
   }
 
   @Test
   public void testClassFinderFiltersByNameInDirs() throws Exception {
-    final String thisName = this.getClass().getSimpleName();
+    // Make some classes for us to find.  Class naming and packaging is kinda 
cryptic.
+    // TODO: Fix.
+    final long counter = testCounter.incrementAndGet();
+    final String classNamePrefix = name.getMethodName();
+    String pkgNameSuffix = name.getMethodName();
+    Log.info("Created jar " + createAndLoadJar(pkgNameSuffix, classNamePrefix, 
counter));
+    final String classNameToFilterOut = classNamePrefix + counter;
     final ClassFinder.FileNameFilter notThisFilter = new 
ClassFinder.FileNameFilter() {
       @Override
       public boolean isCandidateFile(String fileName, String absFilePath) {
-        return !fileName.equals(thisName + ".class");
+        return !fileName.equals(classNameToFilterOut + ".class");
       }
     };
-    String thisPackage = this.getClass().getPackage().getName();
+    String pkgName = makePackageName(pkgNameSuffix, counter);
     ClassFinder allClassesFinder = new ClassFinder();
-    Set<Class<?>> allClasses = allClassesFinder.findClasses(thisPackage, 
false);
+    Set<Class<?>> allClasses = allClassesFinder.findClasses(pkgName, false);
+    assertTrue("Classes in " + pkgName, allClasses.size() > 0);
     ClassFinder notThisClassFinder = new ClassFinder(null, notThisFilter, 
null);
-    Set<Class<?>> notAllClasses = notThisClassFinder.findClasses(thisPackage, 
false);
-    assertFalse(notAllClasses.contains(this.getClass()));
+    Set<Class<?>> notAllClasses = notThisClassFinder.findClasses(pkgName, 
false);
+    assertFalse(contains(notAllClasses, classNameToFilterOut));
     assertEquals(allClasses.size() - 1, notAllClasses.size());
   }
 
   @Test
   public void testClassFinderFiltersByClassInDirs() throws Exception {
+    // Make some classes for us to find.  Class naming and packaging is kinda 
cryptic.
+    // TODO: Fix.
+    final long counter = testCounter.incrementAndGet();
+    final String classNamePrefix = name.getMethodName();
+    String pkgNameSuffix = name.getMethodName();
+    Log.info("Created jar " + createAndLoadJar(pkgNameSuffix, classNamePrefix, 
counter));
+    final Class<?> clazz = makeClass(pkgNameSuffix, classNamePrefix, counter);
     final ClassFinder.ClassFilter notThisFilter = new 
ClassFinder.ClassFilter() {
       @Override
       public boolean isCandidateClass(Class<?> c) {
-        return c != TestClassFinder.class;
+        return c != clazz;
       }
     };
-    String thisPackage = this.getClass().getPackage().getName();
+    String pkgName = makePackageName(pkgNameSuffix, counter);
     ClassFinder allClassesFinder = new ClassFinder();
-    Set<Class<?>> allClasses = allClassesFinder.findClasses(thisPackage, 
false);
+    Set<Class<?>> allClasses = allClassesFinder.findClasses(pkgName, false);
+    assertTrue("Classes in " + pkgName, allClasses.size() > 0);
     ClassFinder notThisClassFinder = new ClassFinder(null, null, 
notThisFilter);
-    Set<Class<?>> notAllClasses = notThisClassFinder.findClasses(thisPackage, 
false);
-    assertFalse(notAllClasses.contains(this.getClass()));
+    Set<Class<?>> notAllClasses = notThisClassFinder.findClasses(pkgName, 
false);
+    assertFalse(contains(notAllClasses, clazz.getSimpleName()));
     assertEquals(allClasses.size() - 1, notAllClasses.size());
   }
 

Reply via email to