Skip to content

Commit d09e21a

Browse files
authored
Add JarOverlapTest (#148)
1 parent 3a318bb commit d09e21a

File tree

3 files changed

+129
-6
lines changed

3 files changed

+129
-6
lines changed

samples/sample-all-deactivated/settings.gradle.kts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ pluginManagement {
99

1010
dependencyResolutionManagement {
1111
repositories {
12-
mavenCentral()
13-
maven("https://maven.scijava.org/content/repositories/releases")
14-
maven("https://maven.scijava.org/content/groups/public")
12+
maven("https://maven.scijava.org/content/groups/public") {
13+
mavenContent {
14+
includeGroup("org.jzy3d")
15+
includeGroup("org.smurn")
16+
}
17+
}
18+
mavenCentral() {
19+
metadataSources.artifact() // woodstox/wstx-lgpl/3.2.7
20+
}
1521
}
1622
}

samples/sample-all/settings.gradle.kts

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,14 @@ pluginManagement {
99

1010
dependencyResolutionManagement {
1111
repositories {
12-
mavenCentral()
13-
maven("https://maven.scijava.org/content/repositories/releases")
14-
maven("https://maven.scijava.org/content/groups/public")
12+
maven("https://maven.scijava.org/content/groups/public") {
13+
mavenContent {
14+
includeGroup("org.jzy3d")
15+
includeGroup("org.smurn")
16+
}
17+
}
18+
mavenCentral() {
19+
metadataSources.artifact() // woodstox/wstx-lgpl/3.2.7
20+
}
1521
}
1622
}
Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
package org.gradlex.jvm.dependency.conflict.test
2+
3+
import org.gradle.testfixtures.ProjectBuilder
4+
import org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition
5+
import spock.lang.Specification
6+
7+
import java.util.zip.ZipFile
8+
9+
import static org.gradlex.jvm.dependency.conflict.detection.rules.CapabilityDefinition.*
10+
11+
/**
12+
* Test that checks that the Jar files behind each CapabilityDefinition actually have overlapping classes.
13+
*/
14+
class JarOverlapTest extends Specification {
15+
16+
// Some Jars do not have overlapping classes, but contain conflicting implementations of the same service.
17+
static def expectedToOverlap = values() - [
18+
SLF4J_VS_JCL, // bridge vs. replacement
19+
SLF4J_VS_LOG4J2_FOR_JCL, // SLF4J replaces JCL, while LOG4J depends on JCL
20+
SLF4J_IMPL, // register conflicting service implementations
21+
SLF4J_VS_LOG4J2_FOR_JUL, // register conflicting handler implementations
22+
HAMCREST_CORE, // contains 'IsDeprecated.class' and forwards to HAMCREST
23+
HAMCREST_LIBRARY // contains 'IsDeprecated.class' and forwards to HAMCREST
24+
]
25+
26+
def latestVersions = []
27+
28+
void setup() {
29+
latestVersions = new File("samples/sample-all/build.gradle.kts")
30+
.readLines()
31+
.findAll { it.contains("implementation(") }
32+
.collect { it.trim() }
33+
.collect { it.replace("implementation(\"", "") }
34+
.collect { it.replace("\")", "") }
35+
}
36+
37+
def "capability definition is valid"(CapabilityDefinition definition) {
38+
given:
39+
def specificVersions = definitionSpecificVersions(definition)
40+
def project = ProjectBuilder.builder().build()
41+
def dependencies = project.dependencies
42+
project.plugins.apply("jvm-ecosystem")
43+
project.repositories.maven {
44+
url = "https://maven.scijava.org/content/groups/public"
45+
mavenContent { it.includeGroup("org.jzy3d") }
46+
}
47+
project.repositories.mavenCentral {
48+
it.metadataSources.artifact() // woodstox/wstx-lgpl/3.2.7
49+
it.metadataSources.ignoreGradleMetadataRedirection()
50+
}
51+
52+
def modules = definition.modules.collect { module ->
53+
def specific = specificVersions.find { it.startsWith(module + ":") }
54+
if (specific) {
55+
dependencies.create(specific)
56+
} else {
57+
dependencies.create(latestVersions.find { it.startsWith(module + ":") })
58+
}
59+
}
60+
61+
def conf = project.getConfigurations().detachedConfiguration(*modules)
62+
conf.transitive = false
63+
64+
when:
65+
List<Tuple2<String, Set<String>>> jarClassFiles = conf.files.collect { jar ->
66+
def jarName = jar.name
67+
new Tuple2(jarName, new ZipFile(jar).withCloseable {
68+
it.entries().collect { entry -> entry.name }.findAll { it.endsWith(".class") } as Set
69+
})
70+
}
71+
72+
then:
73+
[jarClassFiles, jarClassFiles].combinations().each { Tuple2<String, Set<String>> a, Tuple2<String, Set<String>> b ->
74+
println("Comparing: ${a.v1} <--> ${b.v1}")
75+
assert !a.v2.intersect(b.v2).isEmpty()
76+
}
77+
78+
where:
79+
definition << expectedToOverlap
80+
}
81+
82+
private static List<String> definitionSpecificVersions(CapabilityDefinition definition) {
83+
switch (definition) {
84+
case JAVAX_ACTIVATION_API:
85+
return ["jakarta.activation:jakarta.activation-api:1.2.2", "com.sun.activation:jakarta.activation:1.2.2"]
86+
case JAVAX_ANNOTATION_API:
87+
return ["jakarta.annotation:jakarta.annotation-api:1.3.5", "org.apache.tomcat:tomcat-annotations-api:9.0.104"]
88+
case JAVAX_EJB_API:
89+
return ["jakarta.ejb:jakarta.ejb-api:3.2.6"]
90+
case JAVAX_EL_API:
91+
return ["jakarta.el:jakarta.el-api:3.0.3"]
92+
case JAVAX_MAIL_API:
93+
return ["com.sun.mail:mailapi:1.6.7", "jakarta.mail:jakarta.mail-api:1.6.7", "com.sun.mail:jakarta.mail:1.6.7"]
94+
case JAVAX_PERSISTENCE_API:
95+
return ["jakarta.persistence:jakarta.persistence-api:2.2.3"]
96+
case JAVAX_SERVLET_API:
97+
return ["jakarta.servlet:jakarta.servlet-api:4.0.4", "org.apache.tomcat:servlet-api:6.0.53",
98+
"org.apache.tomcat:tomcat-servlet-api:9.0.104", "org.apache.tomcat.embed:tomcat-embed-core:9.0.104"]
99+
case JAVAX_TRANSACTION_API:
100+
return ["jakarta.transaction:jakarta.transaction-api:1.3.3"]
101+
case JAVAX_WEBSOCKET_API_RULE:
102+
return ["jakarta.websocket:jakarta.websocket-api:1.1.2", "jakarta.websocket:jakarta.websocket-client-api:1.1.2",
103+
"org.apache.tomcat:tomcat-websocket-api:9.0.104", "org.apache.tomcat:tomcat-websocket:9.0.104",
104+
"org.apache.tomcat.embed:tomcat-embed-websocket:9.0.104"]
105+
case JAVAX_WS_RS_API:
106+
return ["jakarta.ws.rs:jakarta.ws.rs-api:2.1.6"]
107+
default:
108+
return []
109+
}
110+
}
111+
}

0 commit comments

Comments
 (0)