Skip to content

Commit cfa7aec

Browse files
committed
test for up-to-date
1 parent bcf86e8 commit cfa7aec

File tree

2 files changed

+53
-8
lines changed

2 files changed

+53
-8
lines changed

gradle-baseline-java/src/main/groovy/com/palantir/baseline/tasks/CheckUniqueClassNamesTask.java

Lines changed: 40 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,10 @@
1717
package com.palantir.baseline.tasks;
1818

1919
import java.io.File;
20+
import java.io.IOException;
21+
import java.nio.charset.StandardCharsets;
22+
import java.nio.file.Files;
23+
import java.nio.file.Paths;
2024
import java.util.Enumeration;
2125
import java.util.HashMap;
2226
import java.util.HashSet;
@@ -26,7 +30,11 @@
2630
import java.util.jar.JarFile;
2731
import org.gradle.api.DefaultTask;
2832
import org.gradle.api.artifacts.Configuration;
29-
import org.gradle.api.tasks.Input;
33+
import org.gradle.api.tasks.Classpath;
34+
import org.gradle.api.tasks.CompileClasspath;
35+
import org.gradle.api.tasks.InputFiles;
36+
import org.gradle.api.tasks.OutputFile;
37+
import org.gradle.api.tasks.SkipWhenEmpty;
3038
import org.gradle.api.tasks.TaskAction;
3139

3240
@SuppressWarnings("checkstyle:designforextension") // making this 'final' breaks gradle
@@ -39,9 +47,12 @@ public CheckUniqueClassNamesTask() {
3947
setDescription("Checks that the given configuration contains no identically named classes.");
4048
}
4149

42-
@Input
43-
public Configuration getConfiguration() {
44-
return configuration;
50+
@InputFiles
51+
@Classpath
52+
@CompileClasspath
53+
@SkipWhenEmpty
54+
public Iterable<File> getClasspath() {
55+
return configuration.getResolvedConfiguration().getFiles();
4556
}
4657

4758
public void setConfiguration(Configuration configuration) {
@@ -50,10 +61,9 @@ public void setConfiguration(Configuration configuration) {
5061

5162
@TaskAction
5263
public void checkForDuplicateClasses() {
53-
Set<File> files = getConfiguration().getResolvedConfiguration().getFiles();
5464
Map<String, Set<File>> classToJarMap = new HashMap<>();
5565

56-
for (File file : files) {
66+
for (File file : getClasspath()) {
5767
try (JarFile jarFile1 = new JarFile(file)) {
5868
Enumeration<JarEntry> entries = jarFile1.entries();
5969

@@ -87,9 +97,32 @@ public void checkForDuplicateClasses() {
8797
}
8898

8999
if (errors.length() > 0) {
100+
writeResult(false);
90101
throw new IllegalStateException(String.format(
91102
"%s contains duplicate classes: %s",
92-
getConfiguration().getName(), errors.toString()));
103+
configuration.getName(), errors.toString()));
104+
}
105+
106+
writeResult(true);
107+
}
108+
109+
/**
110+
* This only exists to convince gradle this task is incremental.
111+
*/
112+
@OutputFile
113+
public File getResultFile() {
114+
return getProject().getBuildDir().toPath()
115+
.resolve(Paths.get("uniqueClassNames", configuration.getName()))
116+
.toFile();
117+
}
118+
119+
private void writeResult(boolean success) {
120+
try {
121+
File result = getResultFile();
122+
Files.createDirectories(result.toPath().getParent());
123+
Files.write(result.toPath(), Boolean.toString(success).getBytes(StandardCharsets.UTF_8));
124+
} catch (IOException e) {
125+
throw new RuntimeException("Unable to write boolean result file", e);
93126
}
94127
}
95128
}

gradle-baseline-java/src/test/groovy/com/palantir/baseline/BaselineClasspathDuplicatesIntegrationTest.groovy

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ class BaselineClasspathDuplicatesIntegrationTest extends AbstractPluginTest {
4040
result.task(':checkUniqueClassNames').outcome == TaskOutcome.SUCCESS
4141
}
4242

43-
def 'Task should detect duplicates'() {
43+
def 'detect duplicates in two external jars'() {
4444
when:
4545
buildFile << standardBuildFile
4646
buildFile << """
@@ -56,4 +56,16 @@ class BaselineClasspathDuplicatesIntegrationTest extends AbstractPluginTest {
5656
result.getOutput().contains("testRuntime contains duplicate classes")
5757
println result.getOutput()
5858
}
59+
60+
def 'task should be up-to-date when classpath is unchanged'() {
61+
when:
62+
buildFile << standardBuildFile
63+
64+
then:
65+
BuildResult result1 = with('checkUniqueClassNames').build()
66+
result1.task(':checkUniqueClassNames').outcome == TaskOutcome.SUCCESS
67+
68+
BuildResult result = with('checkUniqueClassNames').build()
69+
result.task(':checkUniqueClassNames').outcome == TaskOutcome.UP_TO_DATE
70+
}
5971
}

0 commit comments

Comments
 (0)