A way to filter out non-relevant environments
authorDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Fri, 31 Mar 2017 18:49:23 +0000 (20:49 +0200)
committerDmitry Trofimov <dmitry.trofimov@jetbrains.com>
Fri, 31 Mar 2017 18:52:56 +0000 (20:52 +0200)
If a test task should be run on Python2.7 and Python3.5, we should run it
only once for each of two interpreter versions.
PyTestTask.getTagsToCover method now serves this need: when all tags that the environment
provides are already covered, we skip the particular environment

python/testSrc/com/jetbrains/env/PyEnvTaskRunner.java
python/testSrc/com/jetbrains/env/PyTestTask.java
python/testSrc/com/jetbrains/env/python/debug/PyDebuggerTask.java

index cc2f85d2000c9d0d6e107eda785b7828da12505a..e16abae85e166b9ed703b1b3cc477f6c37188dd1 100644 (file)
@@ -36,17 +36,31 @@ public class PyEnvTaskRunner {
 
     List<String> passedRoots = Lists.newArrayList();
 
 
     List<String> passedRoots = Lists.newArrayList();
 
+    final Set<String> requiredTags = Sets.union(testTask.getTags(), Sets.newHashSet(tagsRequiedByTest));
+
+    final Set<String> tagsToCover = testTask.getTagsToCover();
+
     for (String root : myRoots) {
     for (String root : myRoots) {
-      LOG.warn(String.format("Running on root %s", root));
 
 
-      final Set<String> requredTags = Sets.union(testTask.getTags(), Sets.newHashSet(tagsRequiedByTest));
-      final boolean suitableForTask = isSuitableForTask(PyEnvTestCase.loadEnvTags(root), requredTags);
+      List<String> envTags = PyEnvTestCase.loadEnvTags(root);
+      final boolean suitableForTask = isSuitableForTask(envTags, requiredTags);
       final boolean shouldRun = shouldRun(root, testTask);
       if (!suitableForTask || !shouldRun) {
         LOG.warn(String.format("Skipping %s (compatible with tags: %s, should run:%s)", root, suitableForTask, shouldRun));
         continue;
       }
 
       final boolean shouldRun = shouldRun(root, testTask);
       if (!suitableForTask || !shouldRun) {
         LOG.warn(String.format("Skipping %s (compatible with tags: %s, should run:%s)", root, suitableForTask, shouldRun));
         continue;
       }
 
+      if (tagsToCover != null && envTags.size() > 0 && !isNeededToRun(tagsToCover, envTags)) {
+        LOG.warn(String.format("Skipping %s (test already was executed on a similar environment)", root));
+        continue;
+      }
+
+      if (tagsToCover != null) {
+        tagsToCover.removeAll(envTags);
+      }
+
+      LOG.warn(String.format("Running on root %s", root));
+
       try {
         testTask.setUp(testName);
         wasExecuted = true;
       try {
         testTask.setUp(testName);
         wasExecuted = true;
@@ -108,6 +122,16 @@ public class PyEnvTaskRunner {
     }
   }
 
     }
   }
 
+  private static boolean isNeededToRun(@NotNull Set<String> tagsToCover, @NotNull List<String> envTags) {
+    for (String tag : envTags) {
+      if (tagsToCover.contains(tag)) {
+        return true;
+      }
+    }
+
+    return false;
+  }
+
   /**
    * Create SDK by path to python exectuable
    *
   /**
    * Create SDK by path to python exectuable
    *
@@ -160,7 +184,6 @@ public class PyEnvTaskRunner {
     return necessaryTags.isEmpty();
   }
 
     return necessaryTags.isEmpty();
   }
 
-
   public static boolean isJython(@NotNull String sdkHome) {
     return sdkHome.toLowerCase().contains("jython");
   }
   public static boolean isJython(@NotNull String sdkHome) {
     return sdkHome.toLowerCase().contains("jython");
   }
index d5cf948d422356768a56e1f712326885b5feb8dd..257604c3accafc1ea4cd2386a5499345ea426b8d 100644 (file)
@@ -1,9 +1,9 @@
 package com.jetbrains.env;
 
 import com.google.common.collect.Sets;
 package com.jetbrains.env;
 
 import com.google.common.collect.Sets;
-import com.intellij.openapi.util.io.FileUtil;
 import com.jetbrains.python.psi.LanguageLevel;
 import org.jetbrains.annotations.NotNull;
 import com.jetbrains.python.psi.LanguageLevel;
 import org.jetbrains.annotations.NotNull;
+import org.jetbrains.annotations.Nullable;
 
 import java.util.Set;
 
 
 import java.util.Set;
 
@@ -83,4 +83,16 @@ public abstract class PyTestTask {
   public boolean isLanguageLevelSupported(@NotNull final LanguageLevel level) {
     return true;
   }
   public boolean isLanguageLevelSupported(@NotNull final LanguageLevel level) {
     return true;
   }
+
+  /**
+   * Provides a way to filter out non-relevant environments
+   *
+   * @return the set of a tags that interpreter should run on, if an environment doesn't contain one of them, it won't be
+   * used to run this test task.
+   * null in case filtering shouldn't be used
+   */
+  @Nullable
+  public Set<String> getTagsToCover() {
+    return null;
+  }
 }
 }
index 42ab4d6f929860558f610fc4e01dad54899a8e9f..cc27c81e942dc70fe144fd66058f626567a18764 100644 (file)
@@ -15,6 +15,7 @@
  */
 package com.jetbrains.env.python.debug;
 
  */
 package com.jetbrains.env.python.debug;
 
+import com.google.common.collect.Sets;
 import com.intellij.execution.*;
 import com.intellij.execution.configurations.ConfigurationFactory;
 import com.intellij.execution.configurations.RunProfile;
 import com.intellij.execution.*;
 import com.intellij.execution.configurations.ConfigurationFactory;
 import com.intellij.execution.configurations.RunProfile;
@@ -42,6 +43,7 @@ import org.junit.Assert;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.ServerSocket;
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.ServerSocket;
+import java.util.Set;
 import java.util.concurrent.Semaphore;
 
 /**
 import java.util.concurrent.Semaphore;
 
 /**
@@ -68,6 +70,12 @@ public class PyDebuggerTask extends PyBaseDebuggerTask {
 
   }
 
 
   }
 
+  @Nullable
+  @Override
+  public Set<String> getTagsToCover() {
+    return Sets.newHashSet("python2.6", "python2.7", "python3.5", "python3.6", "jython", "IronPython", "pypy");
+  }
+
   public void runTestOn(String sdkHome) throws Exception {
     final Project project = getProject();
 
   public void runTestOn(String sdkHome) throws Exception {
     final Project project = getProject();