when bomb explodes skip the test and report failure instead of running it silently...
authornik <Nikolay.Chashnikov@jetbrains.com>
Tue, 16 Jun 2015 14:43:07 +0000 (17:43 +0300)
committernik <Nikolay.Chashnikov@jetbrains.com>
Tue, 16 Jun 2015 14:43:27 +0000 (17:43 +0300)
platform/testFramework/src/com/intellij/TestAll.java
platform/testFramework/src/com/intellij/TestCaseLoader.java
platform/testFramework/src/com/intellij/testFramework/PlatformTestUtil.java

index 964bf76ddcf1d8ca838a82d44a32d9d648dd3218..61bd8838b7977622b37344197b11b82f90415bf6 100644 (file)
@@ -24,6 +24,7 @@
  */
 package com.intellij;
 
+import com.intellij.idea.Bombed;
 import com.intellij.idea.RecordExecution;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.util.Comparing;
@@ -389,11 +390,15 @@ public class TestAll implements Test {
   }
 
   @Nullable
-  private static Test getTest(@NotNull final Class testCaseClass) {
+  private static Test getTest(@NotNull final Class<?> testCaseClass) {
     try {
       if ((testCaseClass.getModifiers() & Modifier.PUBLIC) == 0) {
         return null;
       }
+      Bombed classBomb = testCaseClass.getAnnotation(Bombed.class);
+      if (classBomb != null && PlatformTestUtil.bombExplodes(classBomb)) {
+        return new ExplodedBomb(testCaseClass.getName(), classBomb);
+      }
 
       Method suiteMethod = safeFindMethod(testCaseClass, "suite");
       if (suiteMethod != null && !isPerformanceTestsRun()) {
@@ -416,8 +421,7 @@ public class TestAll implements Test {
         @Override
         public void addTest(Test test) {
           if (!(test instanceof TestCase)) {
-            testsCount[0]++;
-            super.addTest(test);
+            doAddTest(test);
           }
           else {
             String name = ((TestCase)test).getName();
@@ -426,13 +430,26 @@ public class TestAll implements Test {
               return;
 
             Method method = findTestMethod((TestCase)test);
-            if (method == null || !TestCaseLoader.isBombed(method)) {
-              testsCount[0]++;
-              super.addTest(test);
+            if (method == null) {
+              doAddTest(test);
+            }
+            else {
+              Bombed methodBomb = method.getAnnotation(Bombed.class);
+              if (methodBomb == null) {
+                doAddTest(test);
+              }
+              else if (PlatformTestUtil.bombExplodes(methodBomb)) {
+                doAddTest(new ExplodedBomb(method.getDeclaringClass().getName() + "." + method.getName(), methodBomb));
+              }
             }
           }
         }
 
+        private void doAddTest(Test test) {
+          testsCount[0]++;
+          super.addTest(test);
+        }
+
         @Nullable
         private Method findTestMethod(final TestCase testCase) {
           return safeFindMethod(testCase.getClass(), testCase.getName());
@@ -488,4 +505,20 @@ public class TestAll implements Test {
   private static void log(String message) {
     TeamCityLogger.info(message);
   }
+
+  @SuppressWarnings({"JUnitTestCaseWithNoTests", "JUnitTestClassNamingConvention", "JUnitTestCaseWithNonTrivialConstructors"})
+  private static class ExplodedBomb extends TestCase {
+    private final Bombed myBombed;
+
+    public ExplodedBomb(String testName, Bombed bombed) {
+      super(testName);
+      myBombed = bombed;
+    }
+
+    @Override
+    protected void runTest() throws Throwable {
+      String description = myBombed.description().isEmpty() ? "" : " (" + myBombed.description() + ")";
+      fail("Bomb created by " + myBombed.user() + description + " now explodes!");
+    }
+  }
 }
index 08ebbb42b2fbe52fa43fb19bdadf3bf1ccf1818c..87b32a575a07666c2e37b77711d3decd9b1f11c3 100644 (file)
@@ -36,6 +36,7 @@ import junit.framework.TestSuite;
 
 import java.io.IOException;
 import java.io.InputStreamReader;
+import java.lang.reflect.AnnotatedElement;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
 import java.net.URL;
@@ -148,23 +149,9 @@ public class TestCaseLoader {
     return !myTestClassesFilter.matches(className, moduleName) || isBombed(testCaseClass);
   }
 
-  public static boolean isBombed(final Method method) {
-    final Bombed bombedAnnotation = method.getAnnotation(Bombed.class);
+  public static boolean isBombed(final AnnotatedElement element) {
+    final Bombed bombedAnnotation = element.getAnnotation(Bombed.class);
     if (bombedAnnotation == null) return false;
-    if (PlatformTestUtil.isRotten(bombedAnnotation)) {
-      String message = "Disarm the stale bomb for '" + method + "' in class '" + method.getDeclaringClass() + "'";
-      System.err.println(message);
-    }
-    return !PlatformTestUtil.bombExplodes(bombedAnnotation);
-  }
-
-  public static boolean isBombed(final Class<?> testCaseClass) {
-    final Bombed bombedAnnotation = testCaseClass.getAnnotation(Bombed.class);
-    if (bombedAnnotation == null) return false;
-    if (PlatformTestUtil.isRotten(bombedAnnotation)) {
-      String message = "Disarm the stale bomb for '" + testCaseClass + "'";
-      System.err.println(message);
-    }
     return !PlatformTestUtil.bombExplodes(bombedAnnotation);
   }
 
index 9af82977e1c942c6ddd52d110488f0b3a3a0c57a..e67cbcbd6b67ba08b4109ad5f43b12fc0b936d55 100644 (file)
@@ -289,11 +289,6 @@ public class PlatformTestUtil {
     return now.after(raidDate(bombedAnnotation));
   }
 
-  public static boolean isRotten(Bombed bomb) {
-    long bombRotPeriod = 30L * 24 * 60 * 60 * 1000; // month
-    return new Date().after(new Date(raidDate(bomb).getTime() + bombRotPeriod));
-  }
-
   public static StringBuilder print(AbstractTreeStructure structure,
                                     Object node,
                                     int currentLevel,