A way to filter out non-relevant environments
[idea/community.git] / python / testSrc / com / jetbrains / env / PyEnvTaskRunner.java
index cc2f85d2000c9d0d6e107eda785b7828da12505a..e16abae85e166b9ed703b1b3cc477f6c37188dd1 100644 (file)
@@ -36,17 +36,31 @@ public class PyEnvTaskRunner {
 
     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) {
-      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;
       }
 
+      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;
@@ -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
    *
@@ -160,7 +184,6 @@ public class PyEnvTaskRunner {
     return necessaryTags.isEmpty();
   }
 
-
   public static boolean isJython(@NotNull String sdkHome) {
     return sdkHome.toLowerCase().contains("jython");
   }