xref: /aosp_15_r20/external/nullaway/jmh/build.gradle (revision f50c306653bc89b8210ce6c9e0b0b44fc134bc03)
1*f50c3066SAndroid Build Coastguard Worker/*
2*f50c3066SAndroid Build Coastguard Worker * Copyright (C) 2021. Uber Technologies
3*f50c3066SAndroid Build Coastguard Worker *
4*f50c3066SAndroid Build Coastguard Worker * Licensed under the Apache License, Version 2.0 (the "License");
5*f50c3066SAndroid Build Coastguard Worker * you may not use this file except in compliance with the License.
6*f50c3066SAndroid Build Coastguard Worker * You may obtain a copy of the License at
7*f50c3066SAndroid Build Coastguard Worker *
8*f50c3066SAndroid Build Coastguard Worker *    http://www.apache.org/licenses/LICENSE-2.0
9*f50c3066SAndroid Build Coastguard Worker *
10*f50c3066SAndroid Build Coastguard Worker * Unless required by applicable law or agreed to in writing, software
11*f50c3066SAndroid Build Coastguard Worker * distributed under the License is distributed on an "AS IS" BASIS,
12*f50c3066SAndroid Build Coastguard Worker * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*f50c3066SAndroid Build Coastguard Worker * See the License for the specific language governing permissions and
14*f50c3066SAndroid Build Coastguard Worker * limitations under the License.
15*f50c3066SAndroid Build Coastguard Worker */
16*f50c3066SAndroid Build Coastguard Workerplugins {
17*f50c3066SAndroid Build Coastguard Worker    id 'java-library'
18*f50c3066SAndroid Build Coastguard Worker    id 'nullaway.java-test-conventions'
19*f50c3066SAndroid Build Coastguard Worker    id 'me.champeau.jmh'
20*f50c3066SAndroid Build Coastguard Worker}
21*f50c3066SAndroid Build Coastguard Worker
22*f50c3066SAndroid Build Coastguard Workerconfigurations {
23*f50c3066SAndroid Build Coastguard Worker    // create a configuration for the sources and dependencies of each benchmark
24*f50c3066SAndroid Build Coastguard Worker    caffeineSources
25*f50c3066SAndroid Build Coastguard Worker    caffeineDeps
26*f50c3066SAndroid Build Coastguard Worker
27*f50c3066SAndroid Build Coastguard Worker    autodisposeSources
28*f50c3066SAndroid Build Coastguard Worker    autodisposeDeps
29*f50c3066SAndroid Build Coastguard Worker
30*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseSources
31*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseDeps
32*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseProcessors
33*f50c3066SAndroid Build Coastguard Worker}
34*f50c3066SAndroid Build Coastguard Workerdependencies {
35*f50c3066SAndroid Build Coastguard Worker
36*f50c3066SAndroid Build Coastguard Worker    // Add NullAway and Error Prone Core as dependencies.  This ensures that the classes get included
37*f50c3066SAndroid Build Coastguard Worker    // in the jmh-generated jar, and hence get JIT-compiled during benchmarking.  Without this dependence, NullAway
38*f50c3066SAndroid Build Coastguard Worker    // can still be loaded via the processor path, but it gets reloaded on each run of compilation, skewing
39*f50c3066SAndroid Build Coastguard Worker    // performance measurements
40*f50c3066SAndroid Build Coastguard Worker    implementation project(':nullaway')
41*f50c3066SAndroid Build Coastguard Worker    // use the same version of Error Prone Core that we are compiling NullAway against, so we can
42*f50c3066SAndroid Build Coastguard Worker    // benchmark against different versions of Error Prone
43*f50c3066SAndroid Build Coastguard Worker    implementation deps.build.errorProneCoreForApi
44*f50c3066SAndroid Build Coastguard Worker
45*f50c3066SAndroid Build Coastguard Worker
46*f50c3066SAndroid Build Coastguard Worker    // Source jars for our desired benchmarks
47*f50c3066SAndroid Build Coastguard Worker    caffeineSources('com.github.ben-manes.caffeine:caffeine:3.0.2:sources') {
48*f50c3066SAndroid Build Coastguard Worker        transitive = false
49*f50c3066SAndroid Build Coastguard Worker    }
50*f50c3066SAndroid Build Coastguard Worker    autodisposeSources('com.uber.autodispose2:autodispose:2.1.0:sources') {
51*f50c3066SAndroid Build Coastguard Worker        transitive = false
52*f50c3066SAndroid Build Coastguard Worker    }
53*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseSources('com.uber.nullaway:nullaway:0.9.7:sources') {
54*f50c3066SAndroid Build Coastguard Worker        transitive = false
55*f50c3066SAndroid Build Coastguard Worker    }
56*f50c3066SAndroid Build Coastguard Worker
57*f50c3066SAndroid Build Coastguard Worker    caffeineDeps 'com.github.ben-manes.caffeine:caffeine:3.0.2'
58*f50c3066SAndroid Build Coastguard Worker    autodisposeDeps 'com.uber.autodispose2:autodispose:2.1.0'
59*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseDeps 'com.uber.nullaway:nullaway:0.9.7'
60*f50c3066SAndroid Build Coastguard Worker    // Add in the compile-only dependencies of NullAway
61*f50c3066SAndroid Build Coastguard Worker    // Use fixed versions here since we are compiling a particular version of NullAway
62*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseDeps "com.google.errorprone:error_prone_core:2.13.1"
63*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseDeps "com.facebook.infer.annotation:infer-annotation:0.11.0"
64*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseDeps "org.jetbrains:annotations:13.0"
65*f50c3066SAndroid Build Coastguard Worker
66*f50c3066SAndroid Build Coastguard Worker    // To run AutoValue during NullAway compilation
67*f50c3066SAndroid Build Coastguard Worker    nullawayReleaseProcessors "com.google.auto.value:auto-value:1.9"
68*f50c3066SAndroid Build Coastguard Worker
69*f50c3066SAndroid Build Coastguard Worker    testImplementation deps.test.junit4
70*f50c3066SAndroid Build Coastguard Worker}
71*f50c3066SAndroid Build Coastguard Worker
72*f50c3066SAndroid Build Coastguard Workerdef caffeineSourceDir = project.layout.buildDirectory.dir('caffeineSources')
73*f50c3066SAndroid Build Coastguard Workerdef autodisposeSourceDir = project.layout.buildDirectory.dir('autodisposeSources')
74*f50c3066SAndroid Build Coastguard Workerdef nullawayReleaseSourceDir = project.layout.buildDirectory.dir('nullawayReleaseSources')
75*f50c3066SAndroid Build Coastguard Worker
76*f50c3066SAndroid Build Coastguard Workertask extractCaffeineSources(type: Copy) {
77*f50c3066SAndroid Build Coastguard Worker    from zipTree(configurations.caffeineSources.singleFile)
78*f50c3066SAndroid Build Coastguard Worker    into caffeineSourceDir
79*f50c3066SAndroid Build Coastguard Worker}
80*f50c3066SAndroid Build Coastguard Worker
81*f50c3066SAndroid Build Coastguard Workertask extractAutodisposeSources(type: Copy) {
82*f50c3066SAndroid Build Coastguard Worker    from zipTree(configurations.autodisposeSources.singleFile)
83*f50c3066SAndroid Build Coastguard Worker    into autodisposeSourceDir
84*f50c3066SAndroid Build Coastguard Worker}
85*f50c3066SAndroid Build Coastguard Worker
86*f50c3066SAndroid Build Coastguard Workertask extractNullawayReleaseSources(type: Copy) {
87*f50c3066SAndroid Build Coastguard Worker    from zipTree(configurations.nullawayReleaseSources.singleFile)
88*f50c3066SAndroid Build Coastguard Worker    into nullawayReleaseSourceDir
89*f50c3066SAndroid Build Coastguard Worker}
90*f50c3066SAndroid Build Coastguard Worker
91*f50c3066SAndroid Build Coastguard WorkercompileJava.dependsOn(extractCaffeineSources)
92*f50c3066SAndroid Build Coastguard WorkercompileJava.dependsOn(extractAutodisposeSources)
93*f50c3066SAndroid Build Coastguard WorkercompileJava.dependsOn(extractNullawayReleaseSources)
94*f50c3066SAndroid Build Coastguard Worker
95*f50c3066SAndroid Build Coastguard Worker// always run jmh
96*f50c3066SAndroid Build Coastguard Workertasks.getByName('jmh').outputs.upToDateWhen { false }
97*f50c3066SAndroid Build Coastguard Worker
98*f50c3066SAndroid Build Coastguard Worker// a trick: to get the classpath for a benchmark, create a configuration that depends on the benchmark, and
99*f50c3066SAndroid Build Coastguard Worker// then filter out the benchmark itself
100*f50c3066SAndroid Build Coastguard Workerdef caffeineClasspath = configurations.caffeineDeps.filter({f -> !f.toString().contains("caffeine-3.0.2")}).asPath
101*f50c3066SAndroid Build Coastguard Workerdef autodisposeClasspath = configurations.autodisposeDeps.filter({f -> !f.toString().contains("autodispose-2.1.0")}).asPath
102*f50c3066SAndroid Build Coastguard Workerdef nullawayReleaseClasspath = configurations.nullawayReleaseDeps.filter({f -> !f.toString().contains("nullaway-0.9.7")}).asPath
103*f50c3066SAndroid Build Coastguard Worker
104*f50c3066SAndroid Build Coastguard Workerdef nullawayReleaseProcessorpath = configurations.nullawayReleaseProcessors.asPath
105*f50c3066SAndroid Build Coastguard Worker
106*f50c3066SAndroid Build Coastguard Worker// Extra JVM arguments to expose relevant paths for compiling benchmarks
107*f50c3066SAndroid Build Coastguard Workerdef extraJVMArgs = [
108*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.caffeine.sources=${caffeineSourceDir.get()}",
109*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.caffeine.classpath=$caffeineClasspath",
110*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.autodispose.sources=${autodisposeSourceDir.get()}",
111*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.autodispose.classpath=$autodisposeClasspath",
112*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.nullawayRelease.sources=${nullawayReleaseSourceDir.get()}",
113*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.nullawayRelease.classpath=$nullawayReleaseClasspath",
114*f50c3066SAndroid Build Coastguard Worker    "-Dnullaway.nullawayRelease.processorpath=$nullawayReleaseProcessorpath",
115*f50c3066SAndroid Build Coastguard Worker]
116*f50c3066SAndroid Build Coastguard Worker
117*f50c3066SAndroid Build Coastguard Workerjmh {
118*f50c3066SAndroid Build Coastguard Worker    // seems we need more iterations to fully warm up the JIT
119*f50c3066SAndroid Build Coastguard Worker    warmupIterations = 10
120*f50c3066SAndroid Build Coastguard Worker
121*f50c3066SAndroid Build Coastguard Worker
122*f50c3066SAndroid Build Coastguard Worker    jvmArgsAppend = extraJVMArgs
123*f50c3066SAndroid Build Coastguard Worker
124*f50c3066SAndroid Build Coastguard Worker    // commented-out examples of how to tweak other jmh parameters; they show the default values
125*f50c3066SAndroid Build Coastguard Worker    // for more examples see https://github.com/melix/jmh-gradle-plugin/blob/master/README.adoc#configuration-options
126*f50c3066SAndroid Build Coastguard Worker    // iterations = 5
127*f50c3066SAndroid Build Coastguard Worker    // fork = 5
128*f50c3066SAndroid Build Coastguard Worker    // includes = ['DFlowMicro']
129*f50c3066SAndroid Build Coastguard Worker}
130*f50c3066SAndroid Build Coastguard Worker
131*f50c3066SAndroid Build Coastguard Workertasks.named('test') {
132*f50c3066SAndroid Build Coastguard Worker    // pass the extra JVM args so we can compile benchmarks in unit tests
133*f50c3066SAndroid Build Coastguard Worker    jvmArgs += extraJVMArgs
134*f50c3066SAndroid Build Coastguard Worker}
135*f50c3066SAndroid Build Coastguard Worker
136*f50c3066SAndroid Build Coastguard Workertasks.getByName('testJdk21').configure {
137*f50c3066SAndroid Build Coastguard Worker    jvmArgs += extraJVMArgs
138*f50c3066SAndroid Build Coastguard Worker}
139