|  | // 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; | 
|  |  | 
|  | import static org.junit.Assert.assertEquals; | 
|  |  | 
|  | import com.android.tools.r8.dex.Marker; | 
|  | import java.util.Collection; | 
|  | import java.util.Set; | 
|  | import org.junit.Test; | 
|  | import org.junit.runner.RunWith; | 
|  | import org.junit.runners.Parameterized; | 
|  |  | 
|  | @RunWith(Parameterized.class) | 
|  | public class R8ModeMarkerTest extends TestBase { | 
|  |  | 
|  | private final TestParameters parameters; | 
|  |  | 
|  | @Parameterized.Parameters(name = "{0}") | 
|  | public static TestParametersCollection data() { | 
|  | return getTestParameters().withAllRuntimesAndApiLevels().build(); | 
|  | } | 
|  |  | 
|  | public R8ModeMarkerTest(TestParameters parameters) { | 
|  | this.parameters = parameters; | 
|  | } | 
|  |  | 
|  | interface GetMarker { | 
|  | Marker getMarker(); | 
|  | } | 
|  |  | 
|  | static class ExtractDexMarkerConsumer extends DexIndexedConsumer.ForwardingConsumer | 
|  | implements GetMarker { | 
|  | private Marker marker; | 
|  |  | 
|  | ExtractDexMarkerConsumer() { | 
|  | super(null); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void accept( | 
|  | int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) { | 
|  | try { | 
|  | Collection<Marker> markers = | 
|  | ExtractMarker.extractMarkerFromDexProgramData(data.copyByteData()); | 
|  | assertEquals(1, markers.size()); | 
|  | marker = markers.iterator().next(); | 
|  | } catch (Exception e) { | 
|  | throw new RuntimeException(e); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Marker getMarker() { | 
|  | return marker; | 
|  | } | 
|  | } | 
|  |  | 
|  | static class ExtractClassFileMarkerConsumer extends ClassFileConsumer.ForwardingConsumer | 
|  | implements GetMarker { | 
|  | private Marker marker; | 
|  |  | 
|  | ExtractClassFileMarkerConsumer() { | 
|  | super(null); | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public void accept(ByteDataView data, String descriptors, DiagnosticsHandler handler) { | 
|  | try { | 
|  | Collection<Marker> markers = | 
|  | ExtractMarker.extractMarkerFromClassProgramData(data.copyByteData()); | 
|  | assertEquals(1, markers.size()); | 
|  | marker = markers.iterator().next(); | 
|  | } catch (Exception e) { | 
|  | throw new RuntimeException(e); | 
|  | } | 
|  | } | 
|  |  | 
|  | @Override | 
|  | public Marker getMarker() { | 
|  | return marker; | 
|  | } | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testFullMode() throws Exception { | 
|  | ProgramConsumer consumer = | 
|  | parameters.getBackend() == Backend.DEX | 
|  | ? new ExtractDexMarkerConsumer() | 
|  | : new ExtractClassFileMarkerConsumer(); | 
|  | testForR8(parameters.getBackend()) | 
|  | .addProgramClasses(TestClass.class) | 
|  | .addKeepMainRule(TestClass.class) | 
|  | .setMinApi(parameters.getApiLevel()) | 
|  | .setProgramConsumer(consumer) | 
|  | .compile() | 
|  | .run(parameters.getRuntime(), TestClass.class) | 
|  | .assertSuccessWithOutputLines("Hello, world"); | 
|  | assertEquals("full", ((GetMarker) consumer).getMarker().getR8Mode()); | 
|  | } | 
|  |  | 
|  | @Test | 
|  | public void testCompatMode() throws Exception { | 
|  | ProgramConsumer consumer = | 
|  | parameters.getBackend() == Backend.DEX | 
|  | ? new ExtractDexMarkerConsumer() | 
|  | : new ExtractClassFileMarkerConsumer(); | 
|  | testForR8Compat(parameters.getBackend()) | 
|  | .addProgramClasses(TestClass.class) | 
|  | .addKeepMainRule(TestClass.class) | 
|  | .setMinApi(parameters.getApiLevel()) | 
|  | .setProgramConsumer(consumer) | 
|  | .compile() | 
|  | .run(parameters.getRuntime(), TestClass.class) | 
|  | .assertSuccessWithOutputLines("Hello, world"); | 
|  | assertEquals("compatibility", ((GetMarker) consumer).getMarker().getR8Mode()); | 
|  | } | 
|  |  | 
|  | static class TestClass { | 
|  | public static void main(String[] args) { | 
|  | System.out.println("Hello, world"); | 
|  | } | 
|  | } | 
|  | } |