package net.bytebuddy.dynamic;
import net.bytebuddy.test.utility.JavaVersionRule;
import net.bytebuddy.test.utility.ObjectPropertyAssertion;
import org.junit.After;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.MethodRule;
import java.io.Closeable;
import java.io.File;
import java.io.FileOutputStream;
import java.util.jar.JarFile;
import java.util.zip.ZipEntry;
import java.util.zip.ZipFile;
import java.util.zip.ZipOutputStream;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
public class ClassFileLocatorForModuleFileTest {
private static final String FOO = "foo", BAR = "bar";
private static final int VALUE = 42;
@Rule
public MethodRule javaVersionRule = new JavaVersionRule();
private File file;
@Before
public void setUp() throws Exception {
file = File.createTempFile(FOO, BAR);
}
@After
public void tearDown() throws Exception {
assertThat(file.delete(), is(true));
}
@Test
public void testSuccessfulLocation() throws Exception {
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(file));
try {
ZipEntry zipEntry = new ZipEntry("classes/" + FOO + "/" + BAR + ".class");
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(VALUE);
zipOutputStream.write(VALUE * 2);
zipOutputStream.closeEntry();
} finally {
zipOutputStream.close();
}
ZipFile zipFile = new ZipFile(file);
try {
ClassFileLocator classFileLocator = new ClassFileLocator.ForModuleFile(zipFile);
ClassFileLocator.Resolution resolution = classFileLocator.locate(FOO + "." + BAR);
assertThat(resolution.isResolved(), is(true));
assertThat(resolution.resolve(), is(new byte[]{VALUE, VALUE * 2}));
} finally {
zipFile.close();
}
}
@Test
public void testZipFileClosable() throws Exception {
ZipFile zipFile = mock(ZipFile.class);
Closeable classFileLocator = new ClassFileLocator.ForModuleFile(zipFile);
classFileLocator.close();
verify(zipFile).close();
}
@Test
@JavaVersionRule.Enforce(9)
public void testBootJar() throws Exception {
ClassFileLocator classFileLocator = ClassFileLocator.ForModuleFile.ofBootPath();
try {
assertThat(classFileLocator.locate(Object.class.getName()).isResolved(), is(true));
} finally {
classFileLocator.close();
}
}
@Test
public void testNonSuccessfulLocation() throws Exception {
ZipOutputStream zipOutputStream = new ZipOutputStream(new FileOutputStream(file));
try {
ZipEntry zipEntry = new ZipEntry("noop.class");
zipOutputStream.putNextEntry(zipEntry);
zipOutputStream.write(VALUE);
zipOutputStream.closeEntry();
} finally {
zipOutputStream.close();
}
ZipFile zipFile = new ZipFile(file);
try {
ClassFileLocator classFileLocator = new ClassFileLocator.ForModuleFile(zipFile);
ClassFileLocator.Resolution resolution = classFileLocator.locate(FOO + "." + BAR);
assertThat(resolution.isResolved(), is(false));
} finally {
zipFile.close();
}
}
@Test
public void testClose() throws Exception {
ZipFile zipFile = mock(ZipFile.class);
new ClassFileLocator.ForModuleFile(zipFile).close();
verify(zipFile).close();
verifyNoMoreInteractions(zipFile);
}
@Test
public void testObjectProperties() throws Exception {
ObjectPropertyAssertion.of(ClassFileLocator.ForModuleFile.class).apply();
}
}