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