| // 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.dexsplitter; | 
 |  | 
 | import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent; | 
 | import static junit.framework.TestCase.assertEquals; | 
 | import static org.hamcrest.CoreMatchers.not; | 
 | import static org.hamcrest.MatcherAssert.assertThat; | 
 | import static org.junit.Assert.assertNotEquals; | 
 | import static org.junit.Assert.assertTrue; | 
 | import static org.junit.Assume.assumeTrue; | 
 |  | 
 | import com.android.tools.r8.CompilationFailedException; | 
 | import com.android.tools.r8.NeverMerge; | 
 | import com.android.tools.r8.R8FullTestBuilder; | 
 | import com.android.tools.r8.R8TestCompileResult; | 
 | import com.android.tools.r8.TestParameters; | 
 | import com.android.tools.r8.TestParametersCollection; | 
 | import com.android.tools.r8.ToolHelper.ProcessResult; | 
 | import com.android.tools.r8.utils.ConsumerUtils; | 
 | import com.android.tools.r8.utils.StringUtils; | 
 | import com.android.tools.r8.utils.ThrowingConsumer; | 
 | import com.android.tools.r8.utils.codeinspector.ClassSubject; | 
 | import com.google.common.collect.ImmutableSet; | 
 | import java.io.IOException; | 
 | import java.util.function.Consumer; | 
 | import org.junit.Test; | 
 | import org.junit.runner.RunWith; | 
 | import org.junit.runners.Parameterized; | 
 | import org.junit.runners.Parameterized.Parameters; | 
 |  | 
 | @RunWith(Parameterized.class) | 
 | public class DexSplitterInlineRegression extends SplitterTestBase { | 
 |  | 
 |   public static final String EXPECTED = StringUtils.lines("42"); | 
 |  | 
 |   @Parameters(name = "{0}") | 
 |   public static TestParametersCollection params() { | 
 |     return getTestParameters().withAllRuntimes().build(); | 
 |   } | 
 |  | 
 |   private final TestParameters parameters; | 
 |  | 
 |   public DexSplitterInlineRegression(TestParameters parameters) { | 
 |     this.parameters = parameters; | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testInliningFromFeature() throws Exception { | 
 |     ThrowingConsumer<R8TestCompileResult, Exception> ensureGetFromFeatureGone = | 
 |         r8TestCompileResult -> { | 
 |           // Ensure that getFromFeature from FeatureClass is inlined into the run method. | 
 |           ClassSubject clazz = r8TestCompileResult.inspector().clazz(FeatureClass.class); | 
 |           assertThat(clazz.uniqueMethodWithName("getFromFeature"), not(isPresent())); | 
 |         }; | 
 |     Consumer<R8FullTestBuilder> configurator = | 
 |         r8FullTestBuilder -> r8FullTestBuilder.enableMergeAnnotations().noMinification(); | 
 |     ProcessResult processResult = | 
 |         testDexSplitter( | 
 |             parameters, | 
 |             ImmutableSet.of(BaseSuperClass.class), | 
 |             ImmutableSet.of(FeatureClass.class), | 
 |             FeatureClass.class, | 
 |             EXPECTED, | 
 |             ensureGetFromFeatureGone, | 
 |             configurator); | 
 |     // We expect art to fail on this with the dex splitter, see b/122902374 | 
 |     assertNotEquals(processResult.exitCode, 0); | 
 |     assertTrue(processResult.stderr.contains("NoClassDefFoundError")); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testOnR8Splitter() throws IOException, CompilationFailedException { | 
 |     assumeTrue(parameters.isDexRuntime()); | 
 |     Consumer<R8FullTestBuilder> configurator = | 
 |         r8FullTestBuilder -> r8FullTestBuilder.enableMergeAnnotations().noMinification(); | 
 |     ProcessResult processResult = | 
 |         testR8Splitter( | 
 |             parameters, | 
 |             ImmutableSet.of(BaseSuperClass.class), | 
 |             ImmutableSet.of(FeatureClass.class), | 
 |             FeatureClass.class, | 
 |             ConsumerUtils.emptyThrowingConsumer(), | 
 |             configurator); | 
 |  | 
 |     assertEquals(processResult.exitCode, 0); | 
 |     assertEquals(processResult.stdout, StringUtils.lines("42")); | 
 |   } | 
 |  | 
 |   @NeverMerge | 
 |   public abstract static class BaseSuperClass implements RunInterface { | 
 |     public void run() { | 
 |       System.out.println(getFromFeature()); | 
 |     } | 
 |  | 
 |     public abstract String getFromFeature(); | 
 |   } | 
 |  | 
 |   public static class FeatureClass extends BaseSuperClass { | 
 |     String s; | 
 |  | 
 |     public FeatureClass() { | 
 |       if (System.currentTimeMillis() < 2) { | 
 |         s = "43"; | 
 |       } else { | 
 |         s = "42"; | 
 |       } | 
 |     } | 
 |  | 
 |     @Override | 
 |     public String getFromFeature() { | 
 |       return s; | 
 |     } | 
 |   } | 
 | } |