Add compiler api test for protectApiSurface

Change-Id: If3f2000e28216e18c7814186e3e93d08bcc5ca3a
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
index 33ff65c..ce61c1a 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
@@ -7,6 +7,7 @@
 
 import com.android.tools.r8.compilerapi.mockdata.MockClass;
 import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
+import com.android.tools.r8.compilerapi.mockdata.MockClassWithPrivateMethod;
 import com.android.tools.r8.compilerapi.mockdata.PostStartupMockClass;
 import java.io.IOException;
 import java.nio.file.Files;
@@ -76,6 +77,10 @@
     return MockClassWithAssertion.class;
   }
 
+  public Class<?> getMockClassWithPrivateMethod() {
+    return MockClassWithPrivateMethod.class;
+  }
+
   public Class<?> getPostStartupMockClass() {
     return PostStartupMockClass.class;
   }
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
index bd1aace..9d7b12d 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -28,6 +28,7 @@
 import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
 import com.android.tools.r8.compilerapi.mockdata.PostStartupMockClass;
 import com.android.tools.r8.compilerapi.partitionmap.PartitionMapCommandTest;
+import com.android.tools.r8.compilerapi.protectapisurface.ProtectApiSurfaceTest;
 import com.android.tools.r8.compilerapi.sampleapi.D8ApiUsageSampleTest;
 import com.android.tools.r8.compilerapi.sampleapi.R8ApiUsageSampleTest;
 import com.android.tools.r8.compilerapi.sourcefile.CustomSourceFileTest;
@@ -77,7 +78,8 @@
           InputMapTest.ApiTest.class,
           MainDexListTest.ApiTest.class,
           MainDexClassesTest.ApiTest.class,
-          MainDexRulesTest.ApiTest.class);
+          MainDexRulesTest.ApiTest.class,
+          ProtectApiSurfaceTest.ApiTest.class);
 
   private static final List<Class<? extends CompilerApiTest>> CLASSES_PENDING_BINARY_COMPATIBILITY =
       ImmutableList.of(PartialShrinkingPreviewApiTest.ApiTest.class);
diff --git a/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithPrivateMethod.java b/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithPrivateMethod.java
new file mode 100644
index 0000000..37e7dd0
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/mockdata/MockClassWithPrivateMethod.java
@@ -0,0 +1,16 @@
+// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.compilerapi.mockdata;
+
+// Class to use as data for the compilation.
+public class MockClassWithPrivateMethod {
+
+  public static void main(String[] args) {
+    greet();
+  }
+
+  private static void greet() {
+    System.out.println("Hello world!");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/compilerapi/protectapisurface/ProtectApiSurfaceTest.java b/src/test/java/com/android/tools/r8/compilerapi/protectapisurface/ProtectApiSurfaceTest.java
new file mode 100644
index 0000000..b261a41
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/protectapisurface/ProtectApiSurfaceTest.java
@@ -0,0 +1,96 @@
+// Copyright (c) 2025, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.compilerapi.protectapisurface;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPrivate;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPublic;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.R8;
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.compilerapi.CompilerApiTest;
+import com.android.tools.r8.compilerapi.CompilerApiTestRunner;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.OptionalBool;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import java.nio.file.Path;
+import java.util.Collections;
+import org.junit.Test;
+
+public class ProtectApiSurfaceTest extends CompilerApiTestRunner {
+
+  private static final int SOME_API_LEVEL = 24;
+
+  public ProtectApiSurfaceTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  public Class<? extends CompilerApiTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  @Test
+  public void testDefault() throws Exception {
+    runTest(OptionalBool.UNKNOWN);
+  }
+
+  @Test
+  public void testEnabled() throws Exception {
+    runTest(OptionalBool.TRUE);
+  }
+
+  @Test
+  public void testDisabled() throws Exception {
+    runTest(OptionalBool.FALSE);
+  }
+
+  private void runTest(OptionalBool protectApiSurface) throws Exception {
+    Path out = temp.newFolder().toPath().resolve("out.jar");
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    test.runR8(new DexIndexedConsumer.ArchiveConsumer(out), protectApiSurface);
+    inspect(new CodeInspector(out), protectApiSurface);
+  }
+
+  private void inspect(CodeInspector inspector, OptionalBool protectApiSurface) {
+    MethodSubject method =
+        inspector.allClasses().iterator().next().uniqueMethodWithFinalName("greet");
+    assertThat(method, isPresent());
+    assertThat(method, protectApiSurface.isTrue() ? isPrivate() : isPublic());
+  }
+
+  public static class ApiTest extends CompilerApiTest {
+
+    public ApiTest(Object parameters) {
+      super(parameters);
+    }
+
+    public void runR8(DexIndexedConsumer programConsumer, OptionalBool protectApiSurface)
+        throws Exception {
+      R8Command.Builder commandBuilder =
+          R8Command.builder()
+              .addClassProgramData(
+                  getBytesForClass(getMockClassWithPrivateMethod()), Origin.unknown())
+              .addProguardConfiguration(
+                  Collections.singletonList("-keep,allowaccessmodification class * { *; }"),
+                  Origin.unknown())
+              .addLibraryFiles(getAndroidJar())
+              .setMinApiLevel(SOME_API_LEVEL)
+              .setProgramConsumer(programConsumer);
+      if (!protectApiSurface.isUnknown()) {
+        commandBuilder.setProtectApiSurface(protectApiSurface.isTrue());
+      }
+      R8.run(commandBuilder.build());
+    }
+
+    @Test
+    public void testEnabled() throws Exception {
+      runR8(DexIndexedConsumer.emptyConsumer(), OptionalBool.TRUE);
+    }
+  }
+}
diff --git a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1 b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
index 089244c..68e1371 100644
--- a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
+++ b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
@@ -1 +1 @@
-aa0b23115292ec22a24d4166101c1116d264e1cb
\ No newline at end of file
+78a7774ece1679df4ccc301a976155d45660a73d
\ No newline at end of file