From dd158917f8e76f27f1a28de0e71e729d970b6bd1 Mon Sep 17 00:00:00 2001 From: Alpar Torok Date: Wed, 5 Dec 2018 15:41:10 +0200 Subject: [PATCH] Forbid empty testing tasks Closes #34820 With this change we allow for no tests being ran in randomized testing task, and forbid empty testing tasks from the testing conventions task. We will no longer have to disable the task if all tests are muted. --- .../elasticsearch/gradle/BuildPlugin.groovy | 1 - .../precommit/TestingConventionsTasks.java | 36 +++++++++++++++++-- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy b/buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy index d56591bcab3f7..2cd1da307f7a9 100644 --- a/buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy +++ b/buildSrc/src/main/groovy/org/elasticsearch/gradle/BuildPlugin.groovy @@ -773,7 +773,6 @@ class BuildPlugin implements Plugin { project.tasks.withType(RandomizedTestingTask) {task -> jvm "${project.runtimeJavaHome}/bin/java" parallelism System.getProperty('tests.jvms', project.rootProject.ext.defaultParallel) - ifNoTests System.getProperty('tests.ifNoTests', 'fail') onNonEmptyWorkDirectory 'wipe' leaveTemporary true diff --git a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/TestingConventionsTasks.java b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/TestingConventionsTasks.java index df7e71302152d..eddbe40c1a1a5 100644 --- a/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/TestingConventionsTasks.java +++ b/buildSrc/src/main/java/org/elasticsearch/gradle/precommit/TestingConventionsTasks.java @@ -25,7 +25,6 @@ import org.gradle.api.file.FileTree; import org.gradle.api.tasks.Input; import org.gradle.api.tasks.OutputFile; -import org.gradle.api.tasks.SkipWhenEmpty; import org.gradle.api.tasks.TaskAction; import org.gradle.api.tasks.testing.Test; import org.gradle.api.tasks.util.PatternFilterable; @@ -103,6 +102,22 @@ public void doCheck() throws IOException { final Map> classFilesPerRandomizedTestingTask = classFilesPerRandomizedTestingTask(allTestClassFiles); final Map> classFilesPerGradleTestTask = classFilesPerGradleTestTask(); + Map>> testClassesPerTask = + Stream.concat( + classFilesPerGradleTestTask.entrySet().stream(), + classFilesPerRandomizedTestingTask.entrySet().stream() + ) + .collect( + Collectors.toMap( + Map.Entry::getKey, + entry -> entry.getValue().stream() + .map(classes::get) + .filter(implementsNamingConvention) + .collect(Collectors.toSet()) + ) + ); + + problems = collectProblems( checkNoneExists( "Test classes implemented by inner classes will not run", @@ -118,6 +133,16 @@ public void doCheck() throws IOException { .filter(this::seemsLikeATest) .filter(implementsNamingConvention.negate()) ), + collectProblems( + testClassesPerTask.entrySet().stream() + .map( entry -> + checkAtLeastOneExists( + "test class in " + entry.getKey(), + entry.getValue().stream() + ) + ) + .collect(Collectors.joining()) + ), checkNoneExists( "Test classes are not included in any enabled task (" + Stream.concat( @@ -215,7 +240,6 @@ private Class getRandomizedTestingTask() { } @Input - @SkipWhenEmpty public Map getTestClassNames() { if (testClassNames == null) { testClassNames = Boilerplate.getJavaSourceSets(getProject()).getByName("test").getOutput().getClassesDirs() @@ -243,6 +267,14 @@ private String checkNoneExists(String message, Stream> stream } } + private String checkAtLeastOneExists(String message, Stream> stream) { + if (stream.findAny().isPresent()) { + return ""; + } else { + return "Expected at least one " + message + ", but found none.\n"; + } + } + private boolean seemsLikeATest(Class clazz) { try { ClassLoader classLoader = clazz.getClassLoader();