|  | 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); | 
|  | } | 
|  | } |