This is an automated email from the ASF dual-hosted git repository. bschuchardt pushed a commit to branch feature/GEODE-7656 in repository https://gitbox.apache.org/repos/asf/geode.git
commit be3c3cdaa66727a6a1cccab687f908d2f842ccef Author: Bruce Schuchardt <bschucha...@pivotal.io> AuthorDate: Thu Jan 23 15:01:51 2020 -0800 GEODE-7656: OOME in CoreOnlyUsesMembershipAPIArchUnitTest > cacheClassesDoNotUseMembershipInternals The ArchUnit class file importer's javadocs don't mention it but you can't examine just a single package using a ClassFileImporter. It always walks the subpackages of any package you give it and includes all of the classes found there. I've split off the "org.apache.geode" check into its own method and have added a custom ImportOption that uses a Pattern to reject anything in a sub-package of org.apache.geode or in the membership package (which is needed for the API check). That reduced the number of classes being examined from over 7700 to less than 300. --- .../api/CoreOnlyUsesMembershipAPIArchUnitTest.java | 49 ++++++++++++++++++---- 1 file changed, 41 insertions(+), 8 deletions(-) diff --git a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/api/CoreOnlyUsesMembershipAPIArchUnitTest.java b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/api/CoreOnlyUsesMembershipAPIArchUnitTest.java index 6744752..d79714e 100644 --- a/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/api/CoreOnlyUsesMembershipAPIArchUnitTest.java +++ b/geode-core/src/integrationTest/java/org/apache/geode/distributed/internal/membership/api/CoreOnlyUsesMembershipAPIArchUnitTest.java @@ -17,8 +17,13 @@ package org.apache.geode.distributed.internal.membership.api; import static com.tngtech.archunit.core.domain.JavaClass.Predicates.resideInAPackage; import static com.tngtech.archunit.library.Architectures.layeredArchitecture; +import java.util.regex.Pattern; + import com.tngtech.archunit.core.domain.JavaClasses; import com.tngtech.archunit.core.importer.ClassFileImporter; +import com.tngtech.archunit.core.importer.ImportOption; +import com.tngtech.archunit.core.importer.ImportOptions; +import com.tngtech.archunit.core.importer.Location; import com.tngtech.archunit.lang.ArchRule; import org.junit.Test; @@ -33,7 +38,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void distributedAndInternalClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.distributed..", "org.apache.geode.internal.."); @@ -41,9 +46,30 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { } @Test - public void cacheClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + public void geodeClassesDoNotUseMembershipInternals() { + ClassFileImporter classFileImporter = getClassFileImporter(); + // create an ImportOption that only allows org.apache.geode classes and + // membership classes. Prepackaged ImportOptions always cause a package's + // subpackages to be walked with walkFileTree so you can't examine a single + // high-level pachage like org.apache.geode without examining its subpackages. + classFileImporter = classFileImporter.withImportOption(new ImportOption() { + final Pattern matcher = Pattern.compile(".*/org/apache/geode/[a-zA-z0-9]+/.*"); + + @Override + public boolean includes(Location location) { + return location.contains("org/apache/geode/distributed/internal/membership") + || !location.matches(matcher); + } + }); + JavaClasses importedClasses = classFileImporter.importPackages( "org.apache.geode", + "org.apache.geode.distributed.internal.membership.."); + checkMembershipAPIUse(importedClasses); + } + + @Test + public void cacheClassesDoNotUseMembershipInternals() { + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.cache..", "org.apache.geode.distributed.internal.membership.."); @@ -52,7 +78,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void managementClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.management..", "org.apache.geode.admin..", "org.apache.geode.distributed.internal.membership.."); @@ -62,7 +88,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void securityClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.security..", "org.apache.geode.distributed.internal.membership.."); @@ -71,7 +97,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void pdxClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.pdx..", "org.apache.geode.distributed.internal.membership.."); @@ -80,7 +106,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void exampleClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.examples..", "org.apache.geode.distributed.internal.membership.."); @@ -89,7 +115,7 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { @Test public void miscCoreClassesDoNotUseMembershipInternals() { - JavaClasses importedClasses = new ClassFileImporter().importPackages( + JavaClasses importedClasses = getClassFileImporter().importPackages( "org.apache.geode.alerting..", "org.apache.geode.compression..", "org.apache.geode.datasource..", @@ -112,4 +138,11 @@ public class CoreOnlyUsesMembershipAPIArchUnitTest { myRule.check(importedClasses); } + + private ClassFileImporter getClassFileImporter() { + return new ClassFileImporter( + new ImportOptions().with(ImportOption.Predefined.DO_NOT_INCLUDE_ARCHIVES)); + } + + }