| // Copyright (c) 2019, 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.resolution; | |
| import static com.android.tools.r8.references.Reference.methodFromMethod; | |
| import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; | |
| import static org.hamcrest.MatcherAssert.assertThat; | |
| import static org.junit.Assert.assertEquals; | |
| import com.android.tools.r8.BaseCompilerCommand; | |
| import com.android.tools.r8.TestBase; | |
| import com.android.tools.r8.TestCompileResult; | |
| import com.android.tools.r8.TestParameters; | |
| import com.android.tools.r8.TestParametersCollection; | |
| import com.android.tools.r8.TestRunResult; | |
| import com.android.tools.r8.TestShrinkerBuilder; | |
| import com.android.tools.r8.utils.StringUtils; | |
| import com.android.tools.r8.utils.codeinspector.ClassSubject; | |
| import com.android.tools.r8.utils.codeinspector.MethodSubject; | |
| import org.junit.Test; | |
| import org.junit.runner.RunWith; | |
| import org.junit.runners.Parameterized; | |
| @RunWith(Parameterized.class) | |
| public class SingleStaticTargetLookupTestRunner extends TestBase { | |
| static final String EXPECTED = StringUtils.lines("foo"); | |
| private final TestParameters parameters; | |
| @Parameterized.Parameters(name = "{0}") | |
| public static TestParametersCollection data() { | |
| return getTestParameters().withCfRuntimes().build(); | |
| } | |
| public SingleStaticTargetLookupTestRunner(TestParameters parameters) { | |
| this.parameters = parameters; | |
| } | |
| public < | |
| C extends BaseCompilerCommand, | |
| B extends BaseCompilerCommand.Builder<C, B>, | |
| CR extends TestCompileResult<CR, RR>, | |
| RR extends TestRunResult<RR>, | |
| T extends TestShrinkerBuilder<C, B, CR, RR, T>> | |
| void test(boolean keepFoo, TestShrinkerBuilder<C, B, CR, RR, T> builder) throws Exception { | |
| builder | |
| .addProgramClassesAndInnerClasses(SingleStaticTargetLookupTest.class) | |
| .addKeepMainRule(SingleStaticTargetLookupTest.class) | |
| .apply( | |
| b -> { | |
| if (keepFoo) { | |
| b.addKeepMethodRules( | |
| methodFromMethod(SingleStaticTargetLookupTest.class.getMethod("staticFoo"))); | |
| } | |
| }) | |
| .run(parameters.getRuntime(), SingleStaticTargetLookupTest.class) | |
| .assertSuccessWithOutput(EXPECTED) | |
| .inspect( | |
| inspector -> { | |
| ClassSubject clazz = inspector.clazz(SingleStaticTargetLookupTest.class); | |
| MethodSubject main = clazz.uniqueMethodWithName("main"); | |
| MethodSubject staticFoo = clazz.uniqueMethodWithName("staticFoo"); | |
| assertThat(clazz, isPresent()); | |
| assertThat(main, isPresent()); | |
| assertEquals(keepFoo, staticFoo.isPresent()); | |
| assertEquals(keepFoo, main.streamInstructions().anyMatch(i -> i.isInvokeStatic())); | |
| }); | |
| } | |
| @Test | |
| public void testInlinedPG() throws Exception { | |
| test(false, testForProguard()); | |
| } | |
| @Test | |
| public void testKeptPG() throws Exception { | |
| test(true, testForProguard()); | |
| } | |
| @Test | |
| public void testInlinedR8() throws Exception { | |
| test(false, testForR8(parameters.getBackend())); | |
| } | |
| @Test | |
| public void testKeptR8() throws Exception { | |
| test(true, testForR8(parameters.getBackend())); | |
| } | |
| } |