blob: 41a9fd4979b677c6a2073dc6e4ca578dc121f76c [file] [log] [blame]
// Copyright (c) 2018, 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.debug;
import static org.hamcrest.CoreMatchers.containsString;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertThat;
import com.android.tools.r8.ByteDataView;
import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
import com.android.tools.r8.CompilationMode;
import com.android.tools.r8.OutputMode;
import com.android.tools.r8.R8Command;
import com.android.tools.r8.ToolHelper;
import com.android.tools.r8.ToolHelper.ProcessResult;
import com.android.tools.r8.debug.DebugTestBase.JUnit3Wrapper.DebuggeeState;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.DescriptorUtils;
import com.android.tools.r8.utils.InternalOptions;
import java.io.IOException;
import java.nio.file.Path;
import java.util.function.Consumer;
import java.util.stream.Stream;
import org.junit.Ignore;
import org.junit.Test;
public class ArrayDimensionGreaterThanSevenTestRunner extends DebugTestBase {
private static final Class CLASS = ArrayDimensionGreaterThanSevenTest.class;
private static final String NAME = CLASS.getCanonicalName();
private DebugTestConfig getR8CfConfig(String s, Consumer<InternalOptions> optionsConsumer)
throws IOException, com.android.tools.r8.CompilationFailedException {
Path cfOut = temp.getRoot().toPath().resolve(s);
ToolHelper.runR8(
R8Command.builder()
.addClassProgramData(ToolHelper.getClassAsBytes(CLASS), Origin.unknown())
.setMode(CompilationMode.DEBUG)
.addLibraryFiles(ToolHelper.getJava8RuntimeJar())
.setOutput(cfOut, OutputMode.ClassFile)
.build(),
optionsConsumer);
return new CfDebugTestConfig(cfOut);
}
private Stream<DebuggeeState> createStream(DebugTestConfig config) throws Exception {
return streamDebugTest(config, NAME, ANDROID_FILTER);
}
@Test
@Ignore("b/111296969")
// Once R8 does not use expanded frames this can be enabled again.
public void test() throws Exception {
DebugTestConfig cfConfig = new CfDebugTestConfig().addPaths(ToolHelper.getClassPathForTests());
DebugTestConfig d8Config = new D8DebugTestConfig().compileAndAddClasses(temp, CLASS);
DebugTestConfig r8JarConfig =
getR8CfConfig("r8jar.jar", options -> options.enableCfFrontend = false);
DebugTestConfig r8CfConfig =
getR8CfConfig("r8cf.jar", options -> options.enableCfFrontend = true);
new DebugStreamComparator()
.add("CF", createStream(cfConfig))
.add("R8/CF", createStream(r8CfConfig))
.add("R8/Jar", createStream(r8JarConfig))
.add("D8", createStream(d8Config))
.compare();
}
@Test
// Verify that ASM fails when using expanded frames directly.
// See b/111296969
public void runTestOnAsmDump() throws Exception {
Path out = temp.getRoot().toPath().resolve("out.jar");
ArchiveConsumer consumer = new ArchiveConsumer(out);
consumer.accept(
ByteDataView.of(ArrayDimensionGreaterThanSevenTestDump.dump()),
DescriptorUtils.javaTypeToDescriptor(NAME),
null);
consumer.finished(null);
ProcessResult result = ToolHelper.runJava(out, NAME);
assertEquals("Expected ASM to fail when using visitFrame(F_NEW, ...)", 1, result.exitCode);
assertThat(result.stderr, containsString("java.lang.NoClassDefFoundError: F"));
}
}