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));
+  }
+
+
 }

Reply via email to