| // Copyright (c) 2020, 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.kotlin.metadata; | 
 |  | 
 | import static com.android.tools.r8.ToolHelper.getKotlinAnnotationJar; | 
 | import static com.android.tools.r8.ToolHelper.getKotlinStdlibJar; | 
 | import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed; | 
 | import static org.hamcrest.MatcherAssert.assertThat; | 
 |  | 
 | import com.android.tools.r8.KotlinTestParameters; | 
 | import com.android.tools.r8.TestParameters; | 
 | import com.android.tools.r8.kotlin.KotlinMetadataWriter; | 
 | import com.android.tools.r8.shaking.ProguardKeepAttributes; | 
 | import com.android.tools.r8.utils.codeinspector.ClassSubject; | 
 | import com.android.tools.r8.utils.codeinspector.CodeInspector; | 
 | import java.nio.file.Path; | 
 | import java.util.Collection; | 
 | import org.junit.Test; | 
 | import org.junit.runner.RunWith; | 
 | import org.junit.runners.Parameterized; | 
 |  | 
 | @RunWith(Parameterized.class) | 
 | public class MetadataRewriteAnonymousTest extends KotlinMetadataTestBase { | 
 |  | 
 |   private final String EXPECTED = "foo"; | 
 |  | 
 |   @Parameterized.Parameters(name = "{0}, {1}") | 
 |   public static Collection<Object[]> data() { | 
 |     return buildParameters( | 
 |         getTestParameters().withCfRuntimes().build(), | 
 |         getKotlinTestParameters().withAllCompilersAndTargetVersions().build()); | 
 |   } | 
 |  | 
 |   public MetadataRewriteAnonymousTest( | 
 |       TestParameters parameters, KotlinTestParameters kotlinParameters) { | 
 |     super(kotlinParameters); | 
 |     this.parameters = parameters; | 
 |   } | 
 |  | 
 |   private static final KotlinCompileMemoizer libJars = | 
 |       getCompileMemoizer(getKotlinFileInTest(PKG_PREFIX + "/anonymous_lib", "lib")); | 
 |   private final TestParameters parameters; | 
 |  | 
 |   @Test | 
 |   public void smokeTest() throws Exception { | 
 |     Path libJar = libJars.getForConfiguration(kotlinc, targetVersion); | 
 |  | 
 |     Path output = | 
 |         kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) | 
 |             .addClasspathFiles(libJar) | 
 |             .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/anonymous_app", "main")) | 
 |             .setOutputPath(temp.newFolder().toPath()) | 
 |             .compile(); | 
 |     testForJvm() | 
 |         .addRunClasspathFiles(getKotlinStdlibJar(kotlinc), libJar) | 
 |         .addClasspath(output) | 
 |         .run(parameters.getRuntime(), PKG + ".anonymous_app.MainKt") | 
 |         .assertSuccessWithOutputLines(EXPECTED); | 
 |   } | 
 |  | 
 |   @Test | 
 |   public void testMetadataForLib() throws Exception { | 
 |     Path libJar = | 
 |         testForR8(parameters.getBackend()) | 
 |             .addClasspathFiles(getKotlinStdlibJar(kotlinc), getKotlinAnnotationJar(kotlinc)) | 
 |             .addProgramFiles(libJars.getForConfiguration(kotlinc, targetVersion)) | 
 |             .addKeepAllClassesRuleWithAllowObfuscation() | 
 |             .addKeepRules("-keep class " + PKG + ".anonymous_lib.Test$A { *; }") | 
 |             .addKeepRules("-keep class " + PKG + ".anonymous_lib.Test { *; }") | 
 |             .addKeepAttributes( | 
 |                 ProguardKeepAttributes.RUNTIME_VISIBLE_ANNOTATIONS, | 
 |                 ProguardKeepAttributes.SIGNATURE, | 
 |                 ProguardKeepAttributes.INNER_CLASSES, | 
 |                 ProguardKeepAttributes.ENCLOSING_METHOD) | 
 |             .compile() | 
 |             .inspect(this::inspect) | 
 |             .writeToZip(); | 
 |     Path main = | 
 |         kotlinc(parameters.getRuntime().asCf(), kotlinc, targetVersion) | 
 |             .addClasspathFiles(libJar) | 
 |             .addSourceFiles(getKotlinFileInTest(PKG_PREFIX + "/anonymous_app", "main")) | 
 |             .setOutputPath(temp.newFolder().toPath()) | 
 |             .compile(); | 
 |     testForJvm() | 
 |         .addRunClasspathFiles(getKotlinStdlibJar(kotlinc), libJar) | 
 |         .addClasspath(main) | 
 |         .run(parameters.getRuntime(), PKG + ".anonymous_app.MainKt") | 
 |         .assertSuccessWithOutputLines(EXPECTED); | 
 |   } | 
 |  | 
 |   private void inspect(CodeInspector inspector) { | 
 |     ClassSubject clazz = inspector.clazz(PKG + ".anonymous_lib.Test"); | 
 |     System.out.println( | 
 |         KotlinMetadataWriter.kotlinMetadataToString("", clazz.getKotlinClassMetadata())); | 
 |     ClassSubject anonymousClass = inspector.clazz(PKG + ".anonymous_lib.Test$internalProp$1"); | 
 |     assertThat(anonymousClass, isPresentAndRenamed()); | 
 |   } | 
 | } |