xref: /aosp_15_r20/external/guava/integration-tests/gradle/build.gradle.kts (revision fb5080426417cab6bd44d0ed3f37e47d42859579)
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