diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index bc0694a891..51a396ed01 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -29,7 +29,7 @@ jobs: # Definition of the build matrix strategy: matrix: - java: [8, 11, 17] + java: [11, 17] mock-maker: ['mock-maker-default', 'mock-maker-inline'] # All build steps @@ -48,11 +48,11 @@ jobs: java-version: ${{ matrix.java }} - name: 3. Validate Gradle wrapper - if: matrix.java == 8 && matrix.mock-maker == 'mock-maker-default' # SINGLE-MATRIX-JOB + if: matrix.java == 11 && matrix.mock-maker == 'mock-maker-default' # SINGLE-MATRIX-JOB uses: gradle/wrapper-validation-action@v1.0.5 # https://github.com/gradle/wrapper-validation-action - name: 4. Build and check reproducibility of artifacts (single job only) - if: matrix.java == 8 && matrix.mock-maker == 'mock-maker-default' # SINGLE-MATRIX-JOB + if: matrix.java == 11 && matrix.mock-maker == 'mock-maker-default' # SINGLE-MATRIX-JOB run: ./check_reproducibility.sh - name: 5. Spotless check (single job only). Run './gradlew spotlessApply' locally if this job fails. diff --git a/build.gradle b/build.gradle index 8ec866b947..b49b1fb24f 100644 --- a/build.gradle +++ b/build.gradle @@ -24,7 +24,7 @@ plugins { id 'eclipse' id 'com.github.ben-manes.versions' version '0.44.0' id 'biz.aQute.bnd.builder' version '6.3.1' - id 'ru.vyarus.animalsniffer' version '1.5.2' + id 'ru.vyarus.animalsniffer' version '1.6.0' } description = 'Mockito mock objects library core API and implementation' @@ -52,10 +52,8 @@ allprojects { proj -> mavenCentral() google() } - if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { - plugins.withId('java') { - proj.apply from: "$rootDir/gradle/errorprone.gradle" - } + plugins.withId('java') { + proj.apply from: "$rootDir/gradle/errorprone.gradle" } tasks.withType(JavaCompile) { //I don't believe those warnings add value given modern IDEs @@ -66,7 +64,7 @@ allprojects { proj -> options.addStringOption('Xdoclint:none', '-quiet') options.addStringOption('encoding', 'UTF-8') options.addStringOption('charSet', 'UTF-8') - options.setSource('8') + options.setSource('11') } tasks.withType(AbstractArchiveTask) { @@ -107,6 +105,15 @@ dependencies { animalsniffer { sourceSets = [sourceSets.main] annotation = 'org.mockito.internal.SuppressSignatureCheck' + // See please https://github.com/mojohaus/animal-sniffer/issues/172 + ignore += [ + 'java.lang.instrument.Instrumentation', + 'java.lang.invoke.MethodHandle', + 'java.lang.invoke.MethodHandles$Lookup', + 'java.lang.StackWalker', + 'java.lang.StackWalker$StackFrame', + 'java.lang.StackWalker$Option' + ] } spotless { diff --git a/gradle.properties b/gradle.properties index 3ccf4c9a66..ad11ad8da0 100644 --- a/gradle.properties +++ b/gradle.properties @@ -4,6 +4,7 @@ org.gradle.caching=true org.gradle.jvmargs=-Xmx2048m -Dfile.encoding=UTF-8 \ -XX:+IgnoreUnrecognizedVMOptions \ --add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED \ + --add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED \ --add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED \ --add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED \ --add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED \ diff --git a/gradle/errorprone.gradle b/gradle/errorprone.gradle index 1d9cf7428e..d7d551432f 100644 --- a/gradle/errorprone.gradle +++ b/gradle/errorprone.gradle @@ -1,12 +1,6 @@ apply plugin: "net.ltgt.errorprone" -if (JavaVersion.current() == JavaVersion.VERSION_1_8) { - dependencies { - errorproneJavac("com.google.errorprone:javac:9+181-r4173-1") - } -} - dependencies { errorprone libraries.errorprone } diff --git a/gradle/java-library.gradle b/gradle/java-library.gradle index b5949b76fe..5e91b74443 100644 --- a/gradle/java-library.gradle +++ b/gradle/java-library.gradle @@ -14,8 +14,8 @@ generatePomFileForJavaLibraryPublication.doLast { assert pom.name == archivesBaseName } -sourceCompatibility = 1.8 -targetCompatibility = 1.8 +sourceCompatibility = 11 +targetCompatibility = 11 test { include "**/*Test.class" diff --git a/gradle/mockito-core/java-8-docs/package-list b/gradle/mockito-core/java-8-docs/package-list deleted file mode 100644 index 351c186855..0000000000 --- a/gradle/mockito-core/java-8-docs/package-list +++ /dev/null @@ -1,217 +0,0 @@ -java.applet -java.awt -java.awt.color -java.awt.datatransfer -java.awt.dnd -java.awt.event -java.awt.font -java.awt.geom -java.awt.im -java.awt.im.spi -java.awt.image -java.awt.image.renderable -java.awt.print -java.beans -java.beans.beancontext -java.io -java.lang -java.lang.annotation -java.lang.instrument -java.lang.invoke -java.lang.management -java.lang.ref -java.lang.reflect -java.math -java.net -java.nio -java.nio.channels -java.nio.channels.spi -java.nio.charset -java.nio.charset.spi -java.nio.file -java.nio.file.attribute -java.nio.file.spi -java.rmi -java.rmi.activation -java.rmi.dgc -java.rmi.registry -java.rmi.server -java.security -java.security.acl -java.security.cert -java.security.interfaces -java.security.spec -java.sql -java.text -java.text.spi -java.time -java.time.chrono -java.time.format -java.time.temporal -java.time.zone -java.util -java.util.concurrent -java.util.concurrent.atomic -java.util.concurrent.locks -java.util.function -java.util.jar -java.util.logging -java.util.prefs -java.util.regex -java.util.spi -java.util.stream -java.util.zip -javax.accessibility -javax.activation -javax.activity -javax.annotation -javax.annotation.processing -javax.crypto -javax.crypto.interfaces -javax.crypto.spec -javax.imageio -javax.imageio.event -javax.imageio.metadata -javax.imageio.plugins.bmp -javax.imageio.plugins.jpeg -javax.imageio.spi -javax.imageio.stream -javax.jws -javax.jws.soap -javax.lang.model -javax.lang.model.element -javax.lang.model.type -javax.lang.model.util -javax.management -javax.management.loading -javax.management.modelmbean -javax.management.monitor -javax.management.openmbean -javax.management.relation -javax.management.remote -javax.management.remote.rmi -javax.management.timer -javax.naming -javax.naming.directory -javax.naming.event -javax.naming.ldap -javax.naming.spi -javax.net -javax.net.ssl -javax.print -javax.print.attribute -javax.print.attribute.standard -javax.print.event -javax.rmi -javax.rmi.CORBA -javax.rmi.ssl -javax.script -javax.security.auth -javax.security.auth.callback -javax.security.auth.kerberos -javax.security.auth.login -javax.security.auth.spi -javax.security.auth.x500 -javax.security.cert -javax.security.sasl -javax.sound.midi -javax.sound.midi.spi -javax.sound.sampled -javax.sound.sampled.spi -javax.sql -javax.sql.rowset -javax.sql.rowset.serial -javax.sql.rowset.spi -javax.swing -javax.swing.border -javax.swing.colorchooser -javax.swing.event -javax.swing.filechooser -javax.swing.plaf -javax.swing.plaf.basic -javax.swing.plaf.metal -javax.swing.plaf.multi -javax.swing.plaf.nimbus -javax.swing.plaf.synth -javax.swing.table -javax.swing.text -javax.swing.text.html -javax.swing.text.html.parser -javax.swing.text.rtf -javax.swing.tree -javax.swing.undo -javax.tools -javax.transaction -javax.transaction.xa -javax.xml -javax.xml.bind -javax.xml.bind.annotation -javax.xml.bind.annotation.adapters -javax.xml.bind.attachment -javax.xml.bind.helpers -javax.xml.bind.util -javax.xml.crypto -javax.xml.crypto.dom -javax.xml.crypto.dsig -javax.xml.crypto.dsig.dom -javax.xml.crypto.dsig.keyinfo -javax.xml.crypto.dsig.spec -javax.xml.datatype -javax.xml.namespace -javax.xml.parsers -javax.xml.soap -javax.xml.stream -javax.xml.stream.events -javax.xml.stream.util -javax.xml.transform -javax.xml.transform.dom -javax.xml.transform.sax -javax.xml.transform.stax -javax.xml.transform.stream -javax.xml.validation -javax.xml.ws -javax.xml.ws.handler -javax.xml.ws.handler.soap -javax.xml.ws.http -javax.xml.ws.soap -javax.xml.ws.spi -javax.xml.ws.spi.http -javax.xml.ws.wsaddressing -javax.xml.xpath -org.ietf.jgss -org.omg.CORBA -org.omg.CORBA.DynAnyPackage -org.omg.CORBA.ORBPackage -org.omg.CORBA.TypeCodePackage -org.omg.CORBA.portable -org.omg.CORBA_2_3 -org.omg.CORBA_2_3.portable -org.omg.CosNaming -org.omg.CosNaming.NamingContextExtPackage -org.omg.CosNaming.NamingContextPackage -org.omg.Dynamic -org.omg.DynamicAny -org.omg.DynamicAny.DynAnyFactoryPackage -org.omg.DynamicAny.DynAnyPackage -org.omg.IOP -org.omg.IOP.CodecFactoryPackage -org.omg.IOP.CodecPackage -org.omg.Messaging -org.omg.PortableInterceptor -org.omg.PortableInterceptor.ORBInitInfoPackage -org.omg.PortableServer -org.omg.PortableServer.CurrentPackage -org.omg.PortableServer.POAManagerPackage -org.omg.PortableServer.POAPackage -org.omg.PortableServer.ServantLocatorPackage -org.omg.PortableServer.portable -org.omg.SendingContext -org.omg.stub.java.rmi -org.w3c.dom -org.w3c.dom.bootstrap -org.w3c.dom.events -org.w3c.dom.ls -org.w3c.dom.views -org.xml.sax -org.xml.sax.ext -org.xml.sax.helpers diff --git a/gradle/mockito-core/java-8-docs/element-list b/gradle/mockito-core/java-docs/element-list similarity index 57% rename from gradle/mockito-core/java-8-docs/element-list rename to gradle/mockito-core/java-docs/element-list index 351c186855..4cfabf8fdf 100644 --- a/gradle/mockito-core/java-8-docs/element-list +++ b/gradle/mockito-core/java-docs/element-list @@ -1,28 +1,14 @@ -java.applet -java.awt -java.awt.color -java.awt.datatransfer -java.awt.dnd -java.awt.event -java.awt.font -java.awt.geom -java.awt.im -java.awt.im.spi -java.awt.image -java.awt.image.renderable -java.awt.print -java.beans -java.beans.beancontext +module:java.base java.io java.lang java.lang.annotation -java.lang.instrument java.lang.invoke -java.lang.management +java.lang.module java.lang.ref java.lang.reflect java.math java.net +java.net.spi java.nio java.nio.channels java.nio.channels.spi @@ -31,17 +17,11 @@ java.nio.charset.spi java.nio.file java.nio.file.attribute java.nio.file.spi -java.rmi -java.rmi.activation -java.rmi.dgc -java.rmi.registry -java.rmi.server java.security java.security.acl java.security.cert java.security.interfaces java.security.spec -java.sql java.text java.text.spi java.time @@ -55,73 +35,63 @@ java.util.concurrent.atomic java.util.concurrent.locks java.util.function java.util.jar -java.util.logging -java.util.prefs java.util.regex java.util.spi java.util.stream java.util.zip -javax.accessibility -javax.activation -javax.activity -javax.annotation -javax.annotation.processing javax.crypto javax.crypto.interfaces javax.crypto.spec +javax.net +javax.net.ssl +javax.security.auth +javax.security.auth.callback +javax.security.auth.login +javax.security.auth.spi +javax.security.auth.x500 +javax.security.cert +module:java.compiler +javax.annotation.processing +javax.lang.model +javax.lang.model.element +javax.lang.model.type +javax.lang.model.util +javax.tools +module:java.datatransfer +java.awt.datatransfer +module:java.desktop +java.applet +java.awt +java.awt.color +java.awt.desktop +java.awt.dnd +java.awt.event +java.awt.font +java.awt.geom +java.awt.im +java.awt.im.spi +java.awt.image +java.awt.image.renderable +java.awt.print +java.beans +java.beans.beancontext +javax.accessibility javax.imageio javax.imageio.event javax.imageio.metadata javax.imageio.plugins.bmp javax.imageio.plugins.jpeg +javax.imageio.plugins.tiff javax.imageio.spi javax.imageio.stream -javax.jws -javax.jws.soap -javax.lang.model -javax.lang.model.element -javax.lang.model.type -javax.lang.model.util -javax.management -javax.management.loading -javax.management.modelmbean -javax.management.monitor -javax.management.openmbean -javax.management.relation -javax.management.remote -javax.management.remote.rmi -javax.management.timer -javax.naming -javax.naming.directory -javax.naming.event -javax.naming.ldap -javax.naming.spi -javax.net -javax.net.ssl javax.print javax.print.attribute javax.print.attribute.standard javax.print.event -javax.rmi -javax.rmi.CORBA -javax.rmi.ssl -javax.script -javax.security.auth -javax.security.auth.callback -javax.security.auth.kerberos -javax.security.auth.login -javax.security.auth.spi -javax.security.auth.x500 -javax.security.cert -javax.security.sasl javax.sound.midi javax.sound.midi.spi javax.sound.sampled javax.sound.sampled.spi -javax.sql -javax.sql.rowset -javax.sql.rowset.serial -javax.sql.rowset.spi javax.swing javax.swing.border javax.swing.colorchooser @@ -140,26 +110,64 @@ javax.swing.text.html.parser javax.swing.text.rtf javax.swing.tree javax.swing.undo -javax.tools -javax.transaction +module:java.instrument +java.lang.instrument +module:java.logging +java.util.logging +module:java.management +java.lang.management +javax.management +javax.management.loading +javax.management.modelmbean +javax.management.monitor +javax.management.openmbean +javax.management.relation +javax.management.remote +javax.management.timer +module:java.management.rmi +javax.management.remote.rmi +module:java.naming +javax.naming +javax.naming.directory +javax.naming.event +javax.naming.ldap +javax.naming.spi +module:java.net.http +java.net.http +module:java.prefs +java.util.prefs +module:java.rmi +java.rmi +java.rmi.activation +java.rmi.dgc +java.rmi.registry +java.rmi.server +javax.rmi.ssl +module:java.scripting +javax.script +module:java.se +module:java.security.jgss +javax.security.auth.kerberos +org.ietf.jgss +module:java.security.sasl +javax.security.sasl +module:java.smartcardio +javax.smartcardio +module:java.sql +java.sql +javax.sql +module:java.sql.rowset +javax.sql.rowset +javax.sql.rowset.serial +javax.sql.rowset.spi +module:java.transaction.xa javax.transaction.xa +module:java.xml javax.xml -javax.xml.bind -javax.xml.bind.annotation -javax.xml.bind.annotation.adapters -javax.xml.bind.attachment -javax.xml.bind.helpers -javax.xml.bind.util -javax.xml.crypto -javax.xml.crypto.dom -javax.xml.crypto.dsig -javax.xml.crypto.dsig.dom -javax.xml.crypto.dsig.keyinfo -javax.xml.crypto.dsig.spec +javax.xml.catalog javax.xml.datatype javax.xml.namespace javax.xml.parsers -javax.xml.soap javax.xml.stream javax.xml.stream.events javax.xml.stream.util @@ -169,49 +177,106 @@ javax.xml.transform.sax javax.xml.transform.stax javax.xml.transform.stream javax.xml.validation -javax.xml.ws -javax.xml.ws.handler -javax.xml.ws.handler.soap -javax.xml.ws.http -javax.xml.ws.soap -javax.xml.ws.spi -javax.xml.ws.spi.http -javax.xml.ws.wsaddressing javax.xml.xpath -org.ietf.jgss -org.omg.CORBA -org.omg.CORBA.DynAnyPackage -org.omg.CORBA.ORBPackage -org.omg.CORBA.TypeCodePackage -org.omg.CORBA.portable -org.omg.CORBA_2_3 -org.omg.CORBA_2_3.portable -org.omg.CosNaming -org.omg.CosNaming.NamingContextExtPackage -org.omg.CosNaming.NamingContextPackage -org.omg.Dynamic -org.omg.DynamicAny -org.omg.DynamicAny.DynAnyFactoryPackage -org.omg.DynamicAny.DynAnyPackage -org.omg.IOP -org.omg.IOP.CodecFactoryPackage -org.omg.IOP.CodecPackage -org.omg.Messaging -org.omg.PortableInterceptor -org.omg.PortableInterceptor.ORBInitInfoPackage -org.omg.PortableServer -org.omg.PortableServer.CurrentPackage -org.omg.PortableServer.POAManagerPackage -org.omg.PortableServer.POAPackage -org.omg.PortableServer.ServantLocatorPackage -org.omg.PortableServer.portable -org.omg.SendingContext -org.omg.stub.java.rmi org.w3c.dom org.w3c.dom.bootstrap org.w3c.dom.events org.w3c.dom.ls +org.w3c.dom.ranges +org.w3c.dom.traversal org.w3c.dom.views org.xml.sax org.xml.sax.ext org.xml.sax.helpers +module:java.xml.crypto +javax.xml.crypto +javax.xml.crypto.dom +javax.xml.crypto.dsig +javax.xml.crypto.dsig.dom +javax.xml.crypto.dsig.keyinfo +javax.xml.crypto.dsig.spec +module:jdk.accessibility +com.sun.java.accessibility.util +module:jdk.attach +com.sun.tools.attach +com.sun.tools.attach.spi +module:jdk.charsets +module:jdk.compiler +com.sun.source.doctree +com.sun.source.tree +com.sun.source.util +com.sun.tools.javac +module:jdk.crypto.cryptoki +module:jdk.crypto.ec +module:jdk.dynalink +jdk.dynalink +jdk.dynalink.beans +jdk.dynalink.linker +jdk.dynalink.linker.support +jdk.dynalink.support +module:jdk.editpad +module:jdk.hotspot.agent +module:jdk.httpserver +com.sun.net.httpserver +com.sun.net.httpserver.spi +module:jdk.jartool +com.sun.jarsigner +jdk.security.jarsigner +module:jdk.javadoc +com.sun.javadoc +com.sun.tools.javadoc +jdk.javadoc.doclet +module:jdk.jcmd +module:jdk.jconsole +com.sun.tools.jconsole +module:jdk.jdeps +module:jdk.jdi +com.sun.jdi +com.sun.jdi.connect +com.sun.jdi.connect.spi +com.sun.jdi.event +com.sun.jdi.request +module:jdk.jdwp.agent +module:jdk.jfr +jdk.jfr +jdk.jfr.consumer +module:jdk.jlink +module:jdk.jshell +jdk.jshell +jdk.jshell.execution +jdk.jshell.spi +jdk.jshell.tool +module:jdk.jsobject +netscape.javascript +module:jdk.jstatd +module:jdk.localedata +module:jdk.management +com.sun.management +module:jdk.management.agent +module:jdk.management.jfr +jdk.management.jfr +module:jdk.naming.dns +module:jdk.naming.rmi +module:jdk.net +jdk.net +jdk.nio +module:jdk.pack +module:jdk.rmic +module:jdk.scripting.nashorn +jdk.nashorn.api.scripting +jdk.nashorn.api.tree +module:jdk.sctp +com.sun.nio.sctp +module:jdk.security.auth +com.sun.security.auth +com.sun.security.auth.callback +com.sun.security.auth.login +com.sun.security.auth.module +module:jdk.security.jgss +com.sun.security.jgss +module:jdk.xml.dom +org.w3c.dom.css +org.w3c.dom.html +org.w3c.dom.stylesheets +org.w3c.dom.xpath +module:jdk.zipfs diff --git a/gradle/mockito-core/javadoc.gradle b/gradle/mockito-core/javadoc.gradle index b4334b1b2a..9a995ec45d 100644 --- a/gradle/mockito-core/javadoc.gradle +++ b/gradle/mockito-core/javadoc.gradle @@ -1,10 +1,6 @@ //It seems the gradle javadoc task works file by file and as such disable some features of javadoc tool //such as link to packages, https://groups.google.com/d/msg/gradle-dev/R83dy_6PHMc/bgw0cUTMFAAJ - -// In this directory we keep two copies of the `package-list` file for java 8 api docs: -// - as `package-list` for Java 9+ -// - as `element-list` for java 8 -def java8DocsDir = 'gradle/mockito-core/java-8-docs' +def javaDocsDir = 'gradle/mockito-core/java-docs' javadoc { description "Creates javadoc html for Mockito API." @@ -44,8 +40,8 @@ javadoc { options.noIndex = false options.noNavBar = false options.noTree = false - options.links('https://junit.org/junit4/javadoc/4.12/') - options.linksOffline('https://docs.oracle.com/javase/8/docs/api/', java8DocsDir) + options.links('https://junit.org/junit4/javadoc/4.13.2/') + options.linksOffline('https://docs.oracle.com/en/java/javase/11/docs/api/', javaDocsDir) options.bottom(""" diff --git a/gradle/root/coverage.gradle b/gradle/root/coverage.gradle index 87d0d7da01..cd48775763 100644 --- a/gradle/root/coverage.gradle +++ b/gradle/root/coverage.gradle @@ -5,21 +5,13 @@ task mockitoCoverage(type: JacocoReport) { if (currentProject.name in ['android']) { return } - // We only run these tests on Java 9+ - if (currentProject.name in ['module-test'] && !JavaVersion.current().isJava9Compatible()) { - return - } - // We only run these tests on Java 8 - if (currentProject.name in ['errorprone'] && JavaVersion.current().isJava9Compatible()) { - return - } plugins.withId("java") { mockitoCoverage.sourceSets currentProject.sourceSets.main apply plugin: "jacoco" jacoco { - toolVersion = '0.8.7' + toolVersion = '0.8.8' if (currentProject != rootProject) { //already automatically enhanced in mockito main project as "java" plugin was applied before applyTo test diff --git a/settings.gradle.kts b/settings.gradle.kts index 313149df98..54b604b4f7 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -17,13 +17,8 @@ include("inline", "memory-test", "junitJupiterParallelTest", "osgi-test", - "bom") - -if (JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_11)) { - include("errorprone") -} else { - logger.info("Not including errorprone, which requires minimum JDK 11+") -} + "bom", + "errorprone") if (!JavaVersion.current().isCompatibleWith(JavaVersion.VERSION_17) && (System.getenv("ANDROID_SDK_ROOT") != null || File(".local.properties").exists())) { include("androidTest") diff --git a/src/main/java/org/mockito/internal/debugging/Java8LocationImpl.java b/src/main/java/org/mockito/internal/debugging/Java8LocationImpl.java deleted file mode 100644 index e8ee387c0a..0000000000 --- a/src/main/java/org/mockito/internal/debugging/Java8LocationImpl.java +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (c) 2007 Mockito contributors - * This program is made available under the terms of the MIT License. - */ -package org.mockito.internal.debugging; - -import java.io.Serializable; - -import org.mockito.internal.exceptions.stacktrace.StackTraceFilter; -import org.mockito.invocation.Location; - -class Java8LocationImpl implements Location, Serializable { - - private static final long serialVersionUID = -9054861157390980624L; - // Limit the amount of objects being created, as this class is heavily instantiated: - private static final StackTraceFilter stackTraceFilter = new StackTraceFilter(); - - private String stackTraceLine; - private String sourceFile; - - public Java8LocationImpl(Throwable stackTraceHolder, boolean isInline) { - this(stackTraceFilter, stackTraceHolder, isInline); - } - - private Java8LocationImpl( - StackTraceFilter stackTraceFilter, Throwable stackTraceHolder, boolean isInline) { - computeStackTraceInformation(stackTraceFilter, stackTraceHolder, isInline); - } - - @Override - public String toString() { - return stackTraceLine; - } - - /** - * Eagerly compute the stacktrace line from the stackTraceHolder. Storing the Throwable is - * memory-intensive for tests that have large stacktraces and have a lot of invocations on - * mocks. - */ - private void computeStackTraceInformation( - StackTraceFilter stackTraceFilter, Throwable stackTraceHolder, boolean isInline) { - StackTraceElement filtered = stackTraceFilter.filterFirst(stackTraceHolder, isInline); - - // there are corner cases where exception can have a null or empty stack trace - // for example, a custom exception can override getStackTrace() method - if (filtered == null) { - this.stackTraceLine = "-> at <>"; - this.sourceFile = ""; - } else { - this.stackTraceLine = "-> at " + filtered; - this.sourceFile = filtered.getFileName(); - } - } - - @Override - public String getSourceFile() { - return sourceFile; - } -} diff --git a/src/main/java/org/mockito/internal/debugging/LocationFactory.java b/src/main/java/org/mockito/internal/debugging/LocationFactory.java index daafddedaf..6232689155 100644 --- a/src/main/java/org/mockito/internal/debugging/LocationFactory.java +++ b/src/main/java/org/mockito/internal/debugging/LocationFactory.java @@ -24,26 +24,13 @@ private interface Factory { } private static Factory createLocationFactory() { - try { - Class.forName("java.lang.StackWalker"); - return new Java9PlusLocationFactory(); - } catch (ClassNotFoundException e) { - return new Java8LocationFactory(); - } + return new LocationFactoryImpl(); } - private static final class Java8LocationFactory implements Factory { - @Override - public Location create(boolean inline) { - return new Java8LocationImpl(new Throwable(), inline); - } - } - - private static final class Java9PlusLocationFactory implements Factory { - + private static final class LocationFactoryImpl implements Factory { @Override public Location create(boolean inline) { - return new Java9PlusLocationImpl(inline); + return new LocationImpl(inline); } } } diff --git a/src/main/java/org/mockito/internal/debugging/Java9PlusLocationImpl.java b/src/main/java/org/mockito/internal/debugging/LocationImpl.java similarity index 55% rename from src/main/java/org/mockito/internal/debugging/Java9PlusLocationImpl.java rename to src/main/java/org/mockito/internal/debugging/LocationImpl.java index 219835513e..f9852dfae8 100644 --- a/src/main/java/org/mockito/internal/debugging/Java9PlusLocationImpl.java +++ b/src/main/java/org/mockito/internal/debugging/LocationImpl.java @@ -12,28 +12,22 @@ import org.mockito.invocation.Location; import java.io.Serializable; -import java.lang.reflect.InvocationTargetException; -import java.lang.reflect.Method; +import java.lang.StackWalker.Option; +import java.lang.StackWalker.StackFrame; import java.util.Collections; import java.util.List; -import java.util.Set; import java.util.function.Function; import java.util.function.Predicate; import java.util.stream.Collectors; import java.util.stream.Stream; -class Java9PlusLocationImpl implements Location, Serializable { +class LocationImpl implements Location, Serializable { private static final long serialVersionUID = 2954388321980069195L; private static final String UNEXPECTED_ERROR_SUFFIX = "\nThis is unexpected and is likely due to a change in either Java's StackWalker or Reflection APIs." + "\nIt's worth trying to upgrade to a newer version of Mockito, or otherwise to file a bug report."; - private static final String STACK_WALKER = "java.lang.StackWalker"; - private static final String STACK_FRAME = STACK_WALKER + "$StackFrame"; - private static final String OPTION = STACK_WALKER + "$Option"; - private static final String SHOW_REFLECT_FRAMES = "SHOW_REFLECT_FRAMES"; - /** * This is an unfortunate buffer. Inside StackWalker, a buffer is created, which is resized by * doubling. The resizing also allocates a tonne of StackFrame elements. If we traverse more than @@ -43,12 +37,7 @@ class Java9PlusLocationImpl implements Location, Serializable { */ private static final int BUFFER_SIZE = 16; - private static final Class stackWalkerClazz = clazz(STACK_WALKER); - private static final Class stackFrameClazz = clazz(STACK_FRAME); - private static final Class optionClazz = clazz(OPTION); - - private static final Object stackWalker = stackWalker(); - private static final Method walk = walk(); + private static final StackWalker STACK_WALKER = stackWalker(); private static final String PREFIX = "-> at "; @@ -62,7 +51,7 @@ class Java9PlusLocationImpl implements Location, Serializable { * per element). By assigning these Functions and Predicates to variables, we can * avoid the memory allocation. */ - private static final Function toStackFrameMetadata = + private static final Function toStackFrameMetadata = MetadataShim::new; private static final Predicate cleanerIsIn = CLEANER::isIn; @@ -72,7 +61,7 @@ class Java9PlusLocationImpl implements Location, Serializable { private final StackFrameMetadata sfm; private volatile String stackTraceLine; - Java9PlusLocationImpl(boolean isInline) { + LocationImpl(boolean isInline) { this.sfm = getStackFrame(isInline); } @@ -137,139 +126,56 @@ private static int framesToSkip() { stream.map(toStackFrameMetadata) .map(StackFrameMetadata::getClassName) .collect(Collectors.toList()); - return metadata.indexOf(Java9PlusLocationImpl.class.getName()); + return metadata.indexOf(LocationImpl.class.getName()); }); } - @SuppressWarnings("unchecked") - private static T stackWalk(Function, T> function) { - try { - return (T) walk.invoke(stackWalker, function); - } catch (IllegalAccessException e) { - throw new MockitoException( - "Unexpected access exception while stack walking." + UNEXPECTED_ERROR_SUFFIX, - e); - } catch (InvocationTargetException e) { - throw new MockitoException(stackWalkFailureMessage()); - } - } - - private static String stackWalkFailureMessage() { - if (usingDefaultStackTraceCleaner()) { - return "Caught an unexpected exception while stack walking." + UNEXPECTED_ERROR_SUFFIX; - } else { - String className = CLEANER.getClass().getName(); - String fmt = - "Caught an unexpected exception while stack walking." - + "\nThis is likely caused by the custom stack trace cleaner in use (class %s)."; - return String.format(fmt, className); - } - } - - private static Method walk() { - try { - return stackWalkerClazz.getMethod("walk", Function.class); - } catch (NoSuchMethodException e) { - throw new RuntimeException(e); - } - } - - private static Class clazz(String name) { - try { - return Class.forName(name); - } catch (ClassNotFoundException e) { - throw new RuntimeException(e); - } + private static T stackWalk(Function, T> function) { + return (T) STACK_WALKER.walk(function); } - @SuppressWarnings({"unchecked", "rawtypes"}) - private static Object stackWalker() { - try { - Set options = - Collections.singleton(Enum.valueOf((Class) optionClazz, SHOW_REFLECT_FRAMES)); - Method getInstance = - stackWalkerClazz.getDeclaredMethod("getInstance", Set.class, int.class); - return getInstance.invoke(null, options, BUFFER_SIZE); - } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) { - throw new MockitoException( - "Mockito received an exception while trying to acquire a StackWalker." - + UNEXPECTED_ERROR_SUFFIX); - } + private static StackWalker stackWalker() { + return StackWalker.getInstance(Collections.singleton(Option.SHOW_REFLECT_FRAMES), BUFFER_SIZE); } private static final class MetadataShim implements StackFrameMetadata, Serializable { private static final long serialVersionUID = 8491903719411428648L; - private static final Method getClassName = getter("getClassName"); - private static final Method getMethodName = getter("getMethodName"); - private static final Method getFileName = getter("getFileName"); - private static final Method getLineNumber = getter("getLineNumber"); - private static final Method toString = getter(Object.class, "toString"); + private final StackFrame stackFrame; - private final Object stackFrame; - - private MetadataShim(Object stackFrame) { + private MetadataShim(StackFrame stackFrame) { this.stackFrame = stackFrame; } @Override public String getClassName() { - return (String) get(getClassName); + return stackFrame.getClassName(); } @Override public String getMethodName() { - return (String) get(getMethodName); + return stackFrame.getMethodName(); } @Override public String getFileName() { - return (String) get(getFileName); + return stackFrame.getFileName(); } @Override public int getLineNumber() { - return (int) get(getLineNumber); + return stackFrame.getLineNumber(); } @Override public String toString() { - return (String) get(toString); + return stackFrame.toString(); } /** * Ensure that this type remains serializable. */ private Object writeReplace() { - return new SerializableShim(toStackTraceElement()); - } - - private StackTraceElement toStackTraceElement() { - try { - Method method = stackFrameClazz.getMethod("toStackTraceElement"); - return (StackTraceElement) method.invoke(stackFrame); - } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - private Object get(Method handle) { - try { - return handle.invoke(stackFrame); - } catch (InvocationTargetException | IllegalAccessException e) { - throw new RuntimeException(e); - } - } - - private static Method getter(String name) { - return getter(stackFrameClazz, name); - } - - private static Method getter(Class clazz, String name) { - try { - return clazz.getDeclaredMethod(name); - } catch (Throwable t) { - throw new RuntimeException(t); - } + return new SerializableShim(stackFrame.toStackTraceElement()); } } diff --git a/subprojects/androidTest/androidTest.gradle b/subprojects/androidTest/androidTest.gradle index b6c32495be..037b99cf72 100644 --- a/subprojects/androidTest/androidTest.gradle +++ b/subprojects/androidTest/androidTest.gradle @@ -26,8 +26,8 @@ android { } } compileOptions { - sourceCompatibility JavaVersion.VERSION_1_8 - targetCompatibility JavaVersion.VERSION_1_8 + sourceCompatibility JavaVersion.VERSION_11 + targetCompatibility JavaVersion.VERSION_11 } kotlinOptions { jvmTarget = '1.8' diff --git a/subprojects/errorprone/errorprone.gradle b/subprojects/errorprone/errorprone.gradle index e3ef7a7b77..effbb91d2c 100644 --- a/subprojects/errorprone/errorprone.gradle +++ b/subprojects/errorprone/errorprone.gradle @@ -10,14 +10,30 @@ dependencies { implementation project.rootProject implementation libraries.errorprone - testImplementation 'junit:junit:4.13-beta-1' + testImplementation 'junit:junit:4.13.2' testImplementation libraries.errorproneTestApi } test { inputs.files(configurations.errorproneJavac).withNormalizer(ClasspathNormalizer) - jvmArgs += "-Xbootclasspath/p:${configurations.errorproneJavac.asPath}" + jvmArgs += "-Xbootclasspath/a:${configurations.errorproneJavac.asPath}" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.api=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.type=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.file=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.main=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.comp=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED" + jvmArgs += "--add-exports=jdk.compiler/com.sun.tools.javac.parser=ALL-UNNAMED" +} + +tasks.withType(JavaCompile) { + options.compilerArgs << "--add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED" + options.compilerArgs << "--add-exports=jdk.compiler/com.sun.tools.javac.tree=ALL-UNNAMED" + options.compilerArgs << "--add-exports=jdk.compiler/com.sun.tools.javac.util=ALL-UNNAMED" +} - // ErrorProne can only run on JDK 8 - it.enabled = !JavaVersion.current().isJava9Compatible() +tasks.withType(Javadoc) { + options.addBooleanOption("-add-exports=jdk.compiler/com.sun.tools.javac.code=ALL-UNNAMED", true) } diff --git a/subprojects/inline/inline.gradle b/subprojects/inline/inline.gradle index f96cffce9f..ef421f0c02 100644 --- a/subprojects/inline/inline.gradle +++ b/subprojects/inline/inline.gradle @@ -14,8 +14,6 @@ tasks.javadoc.enabled = false test.maxHeapSize = "256m" retryTest.maxHeapSize = "256m" -if (JavaVersion.current().java9Compatible) { - test { - jvmArgs '--illegal-access=deny' - } +test { + jvmArgs '--illegal-access=deny' } diff --git a/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/CircularityTest.kt b/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/CircularityTest.kt index 82fccea672..cd499897be 100644 --- a/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/CircularityTest.kt +++ b/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/CircularityTest.kt @@ -1,3 +1,7 @@ +/** + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ package org.mockito.kotlin import org.junit.Before diff --git a/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/InlineClassTest.kt b/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/InlineClassTest.kt index daa60a9a9a..8100b1282d 100644 --- a/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/InlineClassTest.kt +++ b/subprojects/kotlinTest/src/test/kotlin/org/mockito/kotlin/InlineClassTest.kt @@ -1,3 +1,7 @@ +/** + * Copyright (c) 2017 Mockito contributors + * This program is made available under the terms of the MIT License. + */ package org.mockito.kotlin import org.junit.Assert.assertEquals diff --git a/subprojects/module-test/module-test.gradle b/subprojects/module-test/module-test.gradle index 3be8730cc6..d38a32c7d1 100644 --- a/subprojects/module-test/module-test.gradle +++ b/subprojects/module-test/module-test.gradle @@ -2,10 +2,6 @@ plugins { id 'java' } -if (JavaVersion.current() == JavaVersion.VERSION_1_8) { - project.tasks.all { task -> task.enabled = false } -} - description = "Test suite for Java 9 modules with Mockito" apply from: "$rootDir/gradle/dependencies.gradle" @@ -18,5 +14,5 @@ dependencies { tasks.javadoc.enabled = false -sourceCompatibility = 1.9 -targetCompatibility = 1.9 +sourceCompatibility = 11 +targetCompatibility = 11