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