Repository: incubator-beam
Updated Branches:
  refs/heads/master fdec569f3 -> 009e805f0


Update ApiSurface and test to improve accuracy


Project: http://git-wip-us.apache.org/repos/asf/incubator-beam/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-beam/commit/6963d7d6
Tree: http://git-wip-us.apache.org/repos/asf/incubator-beam/tree/6963d7d6
Diff: http://git-wip-us.apache.org/repos/asf/incubator-beam/diff/6963d7d6

Branch: refs/heads/master
Commit: 6963d7d63e00fe4a97e8dade4d5c20be0a9ed61a
Parents: 70e6a13
Author: Kenneth Knowles <[email protected]>
Authored: Fri Mar 11 16:06:36 2016 -0800
Committer: Kenneth Knowles <[email protected]>
Committed: Wed Apr 20 12:03:31 2016 -0700

----------------------------------------------------------------------
 .../org/apache/beam/sdk/util/ApiSurface.java    | 24 +++----
 .../apache/beam/sdk/util/ApiSurfaceTest.java    | 70 +++++++++++++++++---
 2 files changed, 70 insertions(+), 24 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/6963d7d6/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ApiSurface.java
----------------------------------------------------------------------
diff --git 
a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ApiSurface.java 
b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ApiSurface.java
index e154b58..0d68740 100644
--- a/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ApiSurface.java
+++ b/sdks/java/core/src/main/java/org/apache/beam/sdk/util/ApiSurface.java
@@ -610,22 +610,18 @@ public class ApiSurface {
 
   ////////////////////////////////////////////////////////////////////////////
 
+  /**
+   * All classes transitively reachable via only public method signatures of 
the SDK.
+   *
+   * <p>Note that our idea of "public" does not include various internal-only 
APIs.
+   */
   public static ApiSurface getSdkApiSurface() throws IOException {
     return ApiSurface.ofPackage("org.apache.beam")
-        .pruningPattern("org[.]apache[.]beam.*Test")
-        .pruningPattern("org[.]apache[.]beam.*Benchmark")
-        .pruningPrefix("org.apache.beam.integration")
-        .pruningPrefix("java")
-        .pruningPrefix("com.google.api")
-        .pruningPrefix("com.google.auth")
-        .pruningPrefix("com.google.bigtable.v1")
-        .pruningPrefix("com.google.cloud.bigtable.config")
-        .pruningPrefix("com.google.cloud.bigtable.grpc.Bigtable*Name")
-        .pruningPrefix("com.google.protobuf")
-        .pruningPrefix("org.joda.time")
-        .pruningPrefix("org.apache.avro")
-        .pruningPrefix("org.junit")
-        .pruningPrefix("com.fasterxml.jackson.annotation");
+        .pruningPattern("org[.]apache[.]beam[.].*Test")
+
+        // Exposes Guava, but not intended for users
+        .pruningClassName("org.apache.beam.sdk.util.common.ReflectHelpers")
+        .pruningPrefix("java");
   }
 
   public static void main(String[] args) throws Exception {

http://git-wip-us.apache.org/repos/asf/incubator-beam/blob/6963d7d6/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java
----------------------------------------------------------------------
diff --git 
a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java 
b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java
index b07167c..6e87e91 100644
--- a/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java
+++ b/sdks/java/core/src/test/java/org/apache/beam/sdk/util/ApiSurfaceTest.java
@@ -17,16 +17,21 @@
  */
 package org.apache.beam.sdk.util;
 
+import static org.hamcrest.Matchers.anyOf;
 import static org.hamcrest.Matchers.containsInAnyOrder;
 import static org.hamcrest.Matchers.emptyIterable;
 import static org.junit.Assert.assertThat;
 import static org.junit.Assert.fail;
 
 import com.google.common.base.Joiner;
+import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeDiagnosingMatcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.JUnit4;
@@ -45,15 +50,7 @@ public class ApiSurfaceTest {
 
   @Test
   public void testOurApiSurface() throws Exception {
-    ApiSurface checkedApiSurface = ApiSurface.getSdkApiSurface()
-      .pruningClassName("org.apache.beam.sdk.runners.worker.StateFetcher")
-      .pruningClassName("org.apache.beam.sdk.util.common.ReflectHelpers")
-      .pruningClassName("org.apache.beam.sdk.DataflowMatchers")
-      .pruningClassName("org.apache.beam.sdk.TestUtils")
-      .pruningClassName("org.apache.beam.sdk.WindowMatchers")
-      
.pruningClassName("org.apache.beam.sdk.transforms.display.DisplayDataMatchers");
-
-    checkedApiSurface.getExposedClasses();
+    ApiSurface checkedApiSurface = ApiSurface.getSdkApiSurface();
 
     Map<Class<?>, List<Class<?>>> disallowedClasses = Maps.newHashMap();
     for (Class<?> clazz : checkedApiSurface.getExposedClasses()) {
@@ -75,8 +72,61 @@ public class ApiSurfaceTest {
     }
   }
 
+  @SuppressWarnings("unchecked")
+  private static final Set<Matcher<Class<?>>> ALLOWED_PACKAGES =
+      ImmutableSet.of(
+          inPackage("org.apache.beam"),
+          inPackage("com.google.api.client"),
+          inPackage("com.google.api.services.bigquery"),
+          inPackage("com.google.api.services.dataflow"),
+          inPackage("com.google.api.services.datastore"),
+          inPackage("com.google.api.services.pubsub"),
+          inPackage("com.google.api.services.storage"),
+          inPackage("com.google.auth"),
+          inPackage("com.google.bigtable.v1"),
+          inPackage("com.google.cloud.bigtable.config"),
+          inPackage("com.google.cloud.bigtable.grpc"),
+          inPackage("com.google.protobuf"),
+          inPackage("com.fasterxml.jackson.annotation"),
+          inPackage("io.grpc"),
+          inPackage("org.apache.avro"),
+          inPackage("org.apache.commons.logging"), // via BigTable
+          inPackage("org.hamcrest"), // via DataflowMatchers
+          inPackage("org.codehaus.jackson"), // via Avro
+          inPackage("org.joda.time"),
+          inPackage("org.junit"),
+          inPackage("java"));
+
+  @SuppressWarnings({"rawtypes", "unchecked"})
   private boolean classIsAllowed(Class<?> clazz) {
-    return  clazz.getName().startsWith("org.apache.beam");
+    // Safe cast inexpressible in Java without rawtypes
+    return anyOf((Iterable) ALLOWED_PACKAGES).matches(clazz);
+  }
+
+  private static final Matcher<Class<?>> inPackage(String packageName) {
+    return new ClassInPackage(packageName);
+  }
+
+  private static class ClassInPackage extends 
TypeSafeDiagnosingMatcher<Class<?>> {
+
+    private final String packageName;
+
+    public ClassInPackage(String packageName) {
+      this.packageName = packageName;
+    }
+
+    @Override
+    public void describeTo(Description description) {
+      description.appendText("Class in package \"");
+      description.appendText(packageName);
+      description.appendText("\"");
+    }
+
+    @Override
+    protected boolean matchesSafely(Class<?> clazz, Description 
mismatchDescription) {
+      return clazz.getName().startsWith(packageName + ".");
+    }
+
   }
 
   
//////////////////////////////////////////////////////////////////////////////////

Reply via email to