1*fb508042SAndroid Build Coastguard Worker val runningGradle5 = gradle.gradleVersion.startsWith("5.")
2*fb508042SAndroid Build Coastguard Worker
3*fb508042SAndroid Build Coastguard Worker val guavaVersionJre =
4*fb508042SAndroid Build Coastguard Worker "<version>(.*)</version>".toRegex().find(file("../../pom.xml").readText())?.groups?.get(1)?.value
5*fb508042SAndroid Build Coastguard Worker ?: error("version not found in pom")
6*fb508042SAndroid Build Coastguard Worker
7*fb508042SAndroid Build Coastguard Worker val expectedReducedRuntimeClasspathAndroidVersion =
8*fb508042SAndroid Build Coastguard Worker setOf(
9*fb508042SAndroid Build Coastguard Worker "guava-${guavaVersionJre.replace("jre", "android")}.jar",
10*fb508042SAndroid Build Coastguard Worker "failureaccess-1.0.2.jar",
11*fb508042SAndroid Build Coastguard Worker "j2objc-annotations-3.0.0.jar",
12*fb508042SAndroid Build Coastguard Worker "jsr305-3.0.2.jar",
13*fb508042SAndroid Build Coastguard Worker "checker-qual-3.43.0.jar",
14*fb508042SAndroid Build Coastguard Worker "error_prone_annotations-2.28.0.jar",
15*fb508042SAndroid Build Coastguard Worker "listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
16*fb508042SAndroid Build Coastguard Worker )
17*fb508042SAndroid Build Coastguard Worker val expectedReducedRuntimeClasspathJreVersion =
18*fb508042SAndroid Build Coastguard Worker setOf(
19*fb508042SAndroid Build Coastguard Worker "guava-$guavaVersionJre.jar",
20*fb508042SAndroid Build Coastguard Worker "failureaccess-1.0.2.jar",
21*fb508042SAndroid Build Coastguard Worker "j2objc-annotations-3.0.0.jar",
22*fb508042SAndroid Build Coastguard Worker "jsr305-3.0.2.jar",
23*fb508042SAndroid Build Coastguard Worker "checker-qual-3.43.0.jar",
24*fb508042SAndroid Build Coastguard Worker "error_prone_annotations-2.28.0.jar",
25*fb508042SAndroid Build Coastguard Worker "listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar"
26*fb508042SAndroid Build Coastguard Worker )
27*fb508042SAndroid Build Coastguard Worker val expectedCompileClasspathAndroidVersion = expectedReducedRuntimeClasspathAndroidVersion
28*fb508042SAndroid Build Coastguard Worker val expectedCompileClasspathJreVersion = expectedReducedRuntimeClasspathJreVersion
29*fb508042SAndroid Build Coastguard Worker
30*fb508042SAndroid Build Coastguard Worker val extraLegacyDependencies = setOf("google-collections-1.0.jar")
31*fb508042SAndroid Build Coastguard Worker
<lambda>null32*fb508042SAndroid Build Coastguard Worker buildscript {
33*fb508042SAndroid Build Coastguard Worker val agpVersion = if (gradle.gradleVersion.startsWith("5.")) "3.6.4" else "7.0.4"
34*fb508042SAndroid Build Coastguard Worker repositories {
35*fb508042SAndroid Build Coastguard Worker google()
36*fb508042SAndroid Build Coastguard Worker mavenCentral()
37*fb508042SAndroid Build Coastguard Worker }
38*fb508042SAndroid Build Coastguard Worker dependencies {
39*fb508042SAndroid Build Coastguard Worker classpath("com.android.tools.build:gradle:$agpVersion") {
40*fb508042SAndroid Build Coastguard Worker exclude(
41*fb508042SAndroid Build Coastguard Worker group = "org.jetbrains.trove4j"
42*fb508042SAndroid Build Coastguard Worker ) // Might not be available on Maven Central and not needed for this test
43*fb508042SAndroid Build Coastguard Worker }
44*fb508042SAndroid Build Coastguard Worker }
45*fb508042SAndroid Build Coastguard Worker }
46*fb508042SAndroid Build Coastguard Worker
<lambda>null47*fb508042SAndroid Build Coastguard Worker subprojects {
48*fb508042SAndroid Build Coastguard Worker if (name.endsWith("Java")) {
49*fb508042SAndroid Build Coastguard Worker apply(plugin = "java-library")
50*fb508042SAndroid Build Coastguard Worker } else {
51*fb508042SAndroid Build Coastguard Worker apply(plugin = "com.android.application")
52*fb508042SAndroid Build Coastguard Worker the<com.android.build.gradle.AppExtension>().compileSdkVersion(30)
53*fb508042SAndroid Build Coastguard Worker }
54*fb508042SAndroid Build Coastguard Worker
55*fb508042SAndroid Build Coastguard Worker var expectedClasspath =
56*fb508042SAndroid Build Coastguard Worker if (runningGradle5) {
57*fb508042SAndroid Build Coastguard Worker // without Gradle Module Metadata (only the POM is used)
58*fb508042SAndroid Build Coastguard Worker // - variant decision is made based on version suffix (android/jre) and not on the actual
59*fb508042SAndroid Build Coastguard Worker // environment
60*fb508042SAndroid Build Coastguard Worker // - runtime classpath equals the compile classpath
61*fb508042SAndroid Build Coastguard Worker // - dependency conflict with Google Collections is not detected
62*fb508042SAndroid Build Coastguard Worker if (name.startsWith("android")) {
63*fb508042SAndroid Build Coastguard Worker expectedCompileClasspathAndroidVersion + extraLegacyDependencies
64*fb508042SAndroid Build Coastguard Worker } else {
65*fb508042SAndroid Build Coastguard Worker expectedCompileClasspathJreVersion + extraLegacyDependencies
66*fb508042SAndroid Build Coastguard Worker }
67*fb508042SAndroid Build Coastguard Worker } else {
68*fb508042SAndroid Build Coastguard Worker // with Gradle Module Metadata
69*fb508042SAndroid Build Coastguard Worker // - variant is chosen based on the actual environment, independent of version suffix
70*fb508042SAndroid Build Coastguard Worker // - reduced runtime classpath is used (w/o annotation libraries)
71*fb508042SAndroid Build Coastguard Worker // - capability conflicts are detected with Google Collections
72*fb508042SAndroid Build Coastguard Worker if (name.contains("Android") && !name.contains("JreConstraint")) {
73*fb508042SAndroid Build Coastguard Worker when {
74*fb508042SAndroid Build Coastguard Worker name.contains("RuntimeClasspath") -> {
75*fb508042SAndroid Build Coastguard Worker expectedReducedRuntimeClasspathAndroidVersion
76*fb508042SAndroid Build Coastguard Worker }
77*fb508042SAndroid Build Coastguard Worker name.contains("CompileClasspath") -> {
78*fb508042SAndroid Build Coastguard Worker expectedCompileClasspathAndroidVersion
79*fb508042SAndroid Build Coastguard Worker }
80*fb508042SAndroid Build Coastguard Worker else -> {
81*fb508042SAndroid Build Coastguard Worker error("unexpected classpath type: $name")
82*fb508042SAndroid Build Coastguard Worker }
83*fb508042SAndroid Build Coastguard Worker }
84*fb508042SAndroid Build Coastguard Worker } else {
85*fb508042SAndroid Build Coastguard Worker when {
86*fb508042SAndroid Build Coastguard Worker name.contains("RuntimeClasspath") -> {
87*fb508042SAndroid Build Coastguard Worker expectedReducedRuntimeClasspathJreVersion
88*fb508042SAndroid Build Coastguard Worker }
89*fb508042SAndroid Build Coastguard Worker name.contains("CompileClasspath") -> {
90*fb508042SAndroid Build Coastguard Worker expectedCompileClasspathJreVersion
91*fb508042SAndroid Build Coastguard Worker }
92*fb508042SAndroid Build Coastguard Worker else -> {
93*fb508042SAndroid Build Coastguard Worker error("unexpected classpath type: $name")
94*fb508042SAndroid Build Coastguard Worker }
95*fb508042SAndroid Build Coastguard Worker }
96*fb508042SAndroid Build Coastguard Worker }
97*fb508042SAndroid Build Coastguard Worker }
98*fb508042SAndroid Build Coastguard Worker val guavaVersion =
99*fb508042SAndroid Build Coastguard Worker if (name.startsWith("android")) {
100*fb508042SAndroid Build Coastguard Worker guavaVersionJre.replace("jre", "android")
101*fb508042SAndroid Build Coastguard Worker } else {
102*fb508042SAndroid Build Coastguard Worker guavaVersionJre
103*fb508042SAndroid Build Coastguard Worker }
104*fb508042SAndroid Build Coastguard Worker val javaVersion = JavaVersion.VERSION_1_8
105*fb508042SAndroid Build Coastguard Worker
106*fb508042SAndroid Build Coastguard Worker repositories {
107*fb508042SAndroid Build Coastguard Worker mavenCentral()
108*fb508042SAndroid Build Coastguard Worker mavenLocal()
109*fb508042SAndroid Build Coastguard Worker }
110*fb508042SAndroid Build Coastguard Worker val java = the<JavaPluginExtension>()
111*fb508042SAndroid Build Coastguard Worker java.targetCompatibility = javaVersion
112*fb508042SAndroid Build Coastguard Worker java.sourceCompatibility = javaVersion
113*fb508042SAndroid Build Coastguard Worker
114*fb508042SAndroid Build Coastguard Worker if (!runningGradle5) {
115*fb508042SAndroid Build Coastguard Worker configurations.all {
116*fb508042SAndroid Build Coastguard Worker resolutionStrategy.capabilitiesResolution {
117*fb508042SAndroid Build Coastguard Worker withCapability("com.google.collections:google-collections") {
118*fb508042SAndroid Build Coastguard Worker candidates
119*fb508042SAndroid Build Coastguard Worker .find {
120*fb508042SAndroid Build Coastguard Worker val idField =
121*fb508042SAndroid Build Coastguard Worker it.javaClass.getDeclaredMethod(
122*fb508042SAndroid Build Coastguard Worker "getId"
123*fb508042SAndroid Build Coastguard Worker ) // reflective access to make this compile with Gradle 5
124*fb508042SAndroid Build Coastguard Worker (idField.invoke(it) as ModuleComponentIdentifier).module == "guava"
125*fb508042SAndroid Build Coastguard Worker }
126*fb508042SAndroid Build Coastguard Worker ?.apply { select(this) }
127*fb508042SAndroid Build Coastguard Worker }
128*fb508042SAndroid Build Coastguard Worker }
129*fb508042SAndroid Build Coastguard Worker }
130*fb508042SAndroid Build Coastguard Worker
131*fb508042SAndroid Build Coastguard Worker if (name.contains("AndroidConstraint")) {
132*fb508042SAndroid Build Coastguard Worker dependencies {
133*fb508042SAndroid Build Coastguard Worker constraints {
134*fb508042SAndroid Build Coastguard Worker "api"("com.google.guava:guava") {
135*fb508042SAndroid Build Coastguard Worker attributes {
136*fb508042SAndroid Build Coastguard Worker // if the Gradle version is 7+, you can use
137*fb508042SAndroid Build Coastguard Worker // TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE
138*fb508042SAndroid Build Coastguard Worker attribute(Attribute.of("org.gradle.jvm.environment", String::class.java), "android")
139*fb508042SAndroid Build Coastguard Worker }
140*fb508042SAndroid Build Coastguard Worker }
141*fb508042SAndroid Build Coastguard Worker }
142*fb508042SAndroid Build Coastguard Worker }
143*fb508042SAndroid Build Coastguard Worker configurations.all {
144*fb508042SAndroid Build Coastguard Worker resolutionStrategy.capabilitiesResolution {
145*fb508042SAndroid Build Coastguard Worker withCapability("com.google.guava:guava") {
146*fb508042SAndroid Build Coastguard Worker candidates
147*fb508042SAndroid Build Coastguard Worker .find {
148*fb508042SAndroid Build Coastguard Worker val variantName = it.javaClass.getDeclaredMethod("getVariantName")
149*fb508042SAndroid Build Coastguard Worker (variantName.invoke(it) as String).contains("android")
150*fb508042SAndroid Build Coastguard Worker }
151*fb508042SAndroid Build Coastguard Worker ?.apply { select(this) }
152*fb508042SAndroid Build Coastguard Worker }
153*fb508042SAndroid Build Coastguard Worker }
154*fb508042SAndroid Build Coastguard Worker }
155*fb508042SAndroid Build Coastguard Worker }
156*fb508042SAndroid Build Coastguard Worker
157*fb508042SAndroid Build Coastguard Worker if (name.contains("JreConstraint")) {
158*fb508042SAndroid Build Coastguard Worker dependencies {
159*fb508042SAndroid Build Coastguard Worker constraints {
160*fb508042SAndroid Build Coastguard Worker "api"("com.google.guava:guava") {
161*fb508042SAndroid Build Coastguard Worker attributes {
162*fb508042SAndroid Build Coastguard Worker // if the Gradle version is 7+, you can use
163*fb508042SAndroid Build Coastguard Worker // TargetJvmEnvironment.TARGET_JVM_ENVIRONMENT_ATTRIBUTE
164*fb508042SAndroid Build Coastguard Worker attribute(
165*fb508042SAndroid Build Coastguard Worker Attribute.of("org.gradle.jvm.environment", String::class.java),
166*fb508042SAndroid Build Coastguard Worker "standard-jvm"
167*fb508042SAndroid Build Coastguard Worker )
168*fb508042SAndroid Build Coastguard Worker }
169*fb508042SAndroid Build Coastguard Worker }
170*fb508042SAndroid Build Coastguard Worker }
171*fb508042SAndroid Build Coastguard Worker }
172*fb508042SAndroid Build Coastguard Worker configurations.all {
173*fb508042SAndroid Build Coastguard Worker resolutionStrategy.capabilitiesResolution {
174*fb508042SAndroid Build Coastguard Worker withCapability("com.google.guava:guava") {
175*fb508042SAndroid Build Coastguard Worker candidates
176*fb508042SAndroid Build Coastguard Worker .find {
177*fb508042SAndroid Build Coastguard Worker val variantName = it.javaClass.getDeclaredMethod("getVariantName")
178*fb508042SAndroid Build Coastguard Worker (variantName.invoke(it) as String).contains("jre")
179*fb508042SAndroid Build Coastguard Worker }
180*fb508042SAndroid Build Coastguard Worker ?.apply { select(this) }
181*fb508042SAndroid Build Coastguard Worker }
182*fb508042SAndroid Build Coastguard Worker }
183*fb508042SAndroid Build Coastguard Worker }
184*fb508042SAndroid Build Coastguard Worker }
185*fb508042SAndroid Build Coastguard Worker }
186*fb508042SAndroid Build Coastguard Worker
187*fb508042SAndroid Build Coastguard Worker dependencies {
188*fb508042SAndroid Build Coastguard Worker "api"("com.google.collections:google-collections:1.0")
189*fb508042SAndroid Build Coastguard Worker "api"("com.google.guava:listenablefuture:1.0")
190*fb508042SAndroid Build Coastguard Worker "api"("com.google.guava:guava:$guavaVersion")
191*fb508042SAndroid Build Coastguard Worker }
192*fb508042SAndroid Build Coastguard Worker
193*fb508042SAndroid Build Coastguard Worker tasks.register("testClasspath") {
194*fb508042SAndroid Build Coastguard Worker doLast {
195*fb508042SAndroid Build Coastguard Worker val classpathConfiguration =
196*fb508042SAndroid Build Coastguard Worker if (project.name.contains("RuntimeClasspath")) {
197*fb508042SAndroid Build Coastguard Worker if (project.name.endsWith("Java")) configurations["runtimeClasspath"]
198*fb508042SAndroid Build Coastguard Worker else configurations["debugRuntimeClasspath"]
199*fb508042SAndroid Build Coastguard Worker } else if (project.name.contains("CompileClasspath")) {
200*fb508042SAndroid Build Coastguard Worker if (project.name.endsWith("Java")) configurations["compileClasspath"]
201*fb508042SAndroid Build Coastguard Worker else configurations["debugCompileClasspath"]
202*fb508042SAndroid Build Coastguard Worker } else {
203*fb508042SAndroid Build Coastguard Worker error("unexpected classpath type: " + project.name)
204*fb508042SAndroid Build Coastguard Worker }
205*fb508042SAndroid Build Coastguard Worker
206*fb508042SAndroid Build Coastguard Worker val actualClasspath = classpathConfiguration.files.map { it.name }.toSet()
207*fb508042SAndroid Build Coastguard Worker if (actualClasspath != expectedClasspath) {
208*fb508042SAndroid Build Coastguard Worker throw RuntimeException(
209*fb508042SAndroid Build Coastguard Worker """
210*fb508042SAndroid Build Coastguard Worker Expected: ${expectedClasspath.sorted()}
211*fb508042SAndroid Build Coastguard Worker Actual: ${actualClasspath.sorted()}
212*fb508042SAndroid Build Coastguard Worker """
213*fb508042SAndroid Build Coastguard Worker .trimIndent()
214*fb508042SAndroid Build Coastguard Worker )
215*fb508042SAndroid Build Coastguard Worker }
216*fb508042SAndroid Build Coastguard Worker }
217*fb508042SAndroid Build Coastguard Worker }
218*fb508042SAndroid Build Coastguard Worker }
219