From 1c8777cfd76aebdb38087e6646219c40adf49ea6 Mon Sep 17 00:00:00 2001 From: Martijn Vegter Date: Sun, 10 Oct 2021 13:07:06 +0200 Subject: [PATCH] Do not suggest that ABI dependencies are unused --- .../jvm/AbiUsedClassSpec.groovy | 25 ++++ .../jvm/projects/AbiUsedClassProject.groovy | 107 ++++++++++++++++++ .../autonomousapps/internal/advice/Advisor.kt | 9 ++ 3 files changed, 141 insertions(+) create mode 100644 src/functionalTest/groovy/com/autonomousapps/jvm/AbiUsedClassSpec.groovy create mode 100644 src/functionalTest/groovy/com/autonomousapps/jvm/projects/AbiUsedClassProject.groovy diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/AbiUsedClassSpec.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/AbiUsedClassSpec.groovy new file mode 100644 index 000000000..5506a7729 --- /dev/null +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/AbiUsedClassSpec.groovy @@ -0,0 +1,25 @@ +package com.autonomousapps.jvm + +import com.autonomousapps.jvm.projects.AbiUsedClassProject + +import static com.autonomousapps.utils.Runner.build +import static com.google.common.truth.Truth.assertThat + +final class AbiUsedClassSpec extends AbstractJvmSpec { + + def "do not suggest that ABI dependencies are unused (#gradleVersion)"() { + given: + def project = new AbiUsedClassProject() + gradleProject = project.gradleProject + + when: + build(gradleVersion, gradleProject.rootDir, 'buildHealth') + + then: + assertThat(actualAdvice('lib')).containsExactlyElementsIn([]) + + where: + gradleVersion << gradleVersions() + } + +} diff --git a/src/functionalTest/groovy/com/autonomousapps/jvm/projects/AbiUsedClassProject.groovy b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/AbiUsedClassProject.groovy new file mode 100644 index 000000000..e4e582b77 --- /dev/null +++ b/src/functionalTest/groovy/com/autonomousapps/jvm/projects/AbiUsedClassProject.groovy @@ -0,0 +1,107 @@ +package com.autonomousapps.jvm.projects + +import com.autonomousapps.AbstractProject +import com.autonomousapps.kit.GradleProject +import com.autonomousapps.kit.Plugin +import com.autonomousapps.kit.Source +import com.autonomousapps.kit.SourceType + +import static com.autonomousapps.kit.Dependency.project + +class AbiUsedClassProject extends AbstractProject { + + final GradleProject gradleProject + + AbiUsedClassProject() { + this.gradleProject = build() + } + + private GradleProject build() { + def builder = newGradleProjectBuilder() + // consumer + builder.withSubproject('proj') { s -> + s.sources = [SOURCE_CONSUMER] + s.withBuildScript { bs -> + bs.plugins = [Plugin.javaLibraryPlugin] + bs.dependencies = [ + project('api', ':lib') + ] + } + } + // producer + builder.withSubproject('core') { s -> + s.sources = [SOURCE_CORE_PRODUCER] + s.withBuildScript { bs -> + bs.plugins = [Plugin.javaLibraryPlugin] + bs.dependencies = [] + } + } + builder.withSubproject('lib') { s -> + s.sources = [SOURCE_LIB_PRODUCER] + s.withBuildScript { bs -> + bs.plugins = [Plugin.javaLibraryPlugin] + bs.dependencies = [ + project('api', ':core') + ] + } + } + + + def project = builder.build() + project.writer().write() + return project + } + + private static final Source SOURCE_CONSUMER = new Source( + SourceType.JAVA, "WebImpl", "", + """\ + public class WebImpl { + + private final WebPermission user; + + public WebImpl(WebPermission user) { + this.user = user; + } + + public boolean canChangePassword() { + return user.isAdmin(); + } + } + """.stripIndent() + ) + + private static final Source SOURCE_CORE_PRODUCER = new Source( + SourceType.JAVA, "IPermission", "", + """\ + public interface IPermission { + String name(); + boolean isAdmin(); + default Object getLoggingObject() { + return name(); + } + } + """.stripIndent() + ) + + private static final Source SOURCE_LIB_PRODUCER = new Source( + SourceType.JAVA, "WebPermission", "", + """\ + public enum WebPermission implements IPermission { + ViewData(false), + EditData(true), + ; + + private final boolean superRole; + + WebPermission(boolean superRole) { + this.superRole = superRole; + } + + @Override + public boolean isAdmin() { + return superRole; + } + } + """.stripIndent() + ) +} diff --git a/src/main/kotlin/com/autonomousapps/internal/advice/Advisor.kt b/src/main/kotlin/com/autonomousapps/internal/advice/Advisor.kt index 5ca8251f3..3268311fd 100644 --- a/src/main/kotlin/com/autonomousapps/internal/advice/Advisor.kt +++ b/src/main/kotlin/com/autonomousapps/internal/advice/Advisor.kt @@ -142,6 +142,7 @@ internal class Advisor( .stripServiceLoaders() .stripSecurityProviders() .stripLintOnlyJars() + .stripAbiDeps() } /** @@ -281,4 +282,12 @@ internal class Advisor( } } } + + private fun Iterable.stripAbiDeps(): Set { + return filterToOrderedSet { container -> + abiDeps.none { abiDep -> + container.dependency == abiDep.dependency + } + } + } }