blob: fbcc9d6c5318e139e44c0c2c4b7f88bed4c32115 [file] [log] [blame]
package com.android.tools.r8;
import static org.hamcrest.CoreMatchers.containsString;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.junit.Assert.assertTrue;
import static org.junit.Assert.fail;
import static org.junit.Assume.assumeTrue;
import com.android.tools.r8.TestRuntime.CfRuntime;
import com.android.tools.r8.TestRuntime.CfVm;
import com.google.common.io.ByteStreams;
import java.io.IOException;
import java.nio.file.NoSuchFileException;
import java.nio.file.Path;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Parameterized;
import org.junit.runners.Parameterized.Parameters;
import org.objectweb.asm.Opcodes;
@RunWith(Parameterized.class)
public class JdkClassFileProviderTest extends TestBase implements Opcodes {
@Parameters(name = "{0}")
public static TestParametersCollection data() {
return getTestParameters().withCfRuntimes().build();
}
final TestParameters parameters;
public JdkClassFileProviderTest(TestParameters parameters) {
this.parameters = parameters;
}
private CfRuntime getRuntime() {
return parameters.getRuntime().asCf();
}
@Test
public void testInvalidRuntimeClassPath() throws Exception {
Path path = temp.newFolder().toPath();
try {
JdkClassFileProvider.fromJdkHome(path);
fail("Not supposed to succeed");
} catch (IOException e) {
assertThat(e.toString(), containsString(path.toString()));
assertThat(e.toString(), containsString("does not look like a Java home"));
}
}
@Test
public void testJdkJavaHome() throws Exception {
ClassFileResourceProvider provider =
JdkClassFileProvider.fromJdkHome(getRuntime().getJavaHome());
assertJavaLangObject(provider);
assert provider instanceof AutoCloseable;
if (getRuntime().isNewerThanOrEqual(CfVm.JDK9)) {
assertJavaUtilConcurrentFlowSubscriber(provider);
}
((AutoCloseable) provider).close();
}
@Test
public void testJdk8RuntimeClassPath() throws Exception {
assumeTrue(getRuntime().getVm() == CfVm.JDK8);
ClassFileResourceProvider provider =
JdkClassFileProvider.fromJavaRuntimeJar(
getRuntime().getJavaHome().resolve("jre").resolve("lib").resolve("rt.jar"));
assertJavaLangObject(provider);
assert provider instanceof AutoCloseable;
((AutoCloseable) provider).close();
}
@Test
public void testJdk8SystemModules() throws Exception {
assumeTrue(getRuntime().getVm() == CfVm.JDK8);
try {
JdkClassFileProvider.fromSystemModulesJdk(getRuntime().getJavaHome());
fail("Not supposed to succeed");
} catch (NoSuchFileException e) {
assertThat(e.toString(), containsString("lib/jrt-fs.jar"));
}
}
@Test
public void testJdk9PlusSystemModules() throws Exception {
assumeTrue(getRuntime().isNewerThanOrEqual(CfVm.JDK9));
ClassFileResourceProvider provider =
JdkClassFileProvider.fromSystemModulesJdk(getRuntime().getJavaHome());
assertJavaLangObject(provider);
assertJavaUtilConcurrentFlowSubscriber(provider);
assert provider instanceof AutoCloseable;
((AutoCloseable) provider).close();
}
private void assertJavaLangObject(ClassFileResourceProvider provider) throws Exception {
assertTrue(provider.getClassDescriptors().contains("Ljava/lang/Object;"));
assertTrue(
ByteStreams.toByteArray(provider.getProgramResource("Ljava/lang/Object;").getByteStream())
.length
> 0);
}
private void assertJavaUtilConcurrentFlowSubscriber(ClassFileResourceProvider provider)
throws Exception {
assertTrue(provider.getClassDescriptors().contains("Ljava/util/concurrent/Flow$Subscriber;"));
assertTrue(
ByteStreams.toByteArray(
provider
.getProgramResource("Ljava/util/concurrent/Flow$Subscriber;")
.getByteStream())
.length
> 0);
}
}