package net.bytebuddy.dynamic; import net.bytebuddy.test.utility.JavaVersionRule; import net.bytebuddy.test.utility.MockitoRule; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import net.bytebuddy.utility.JavaModule; import org.junit.Before; import org.junit.Rule; import org.junit.Test; import org.junit.rules.MethodRule; import org.junit.rules.TestRule; import org.mockito.Mock; import java.io.ByteArrayInputStream; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.MatcherAssert.assertThat; import static org.junit.Assert.fail; import static org.mockito.Mockito.*; public class ClassFileLocatorForModuleTest { private static final String FOOBAR = "foo/bar"; @Rule public TestRule mockitoRule = new MockitoRule(this); @Rule public MethodRule javaVersionRule = new JavaVersionRule(); @Mock private JavaModule module; @Mock private ClassLoader classLoader; @Before public void setUp() throws Exception { when(module.isNamed()).thenReturn(true); when(module.getClassLoader()).thenReturn(classLoader); } @Test public void testCreationNamed() throws Exception { when(module.isNamed()).thenReturn(true); assertThat(ClassFileLocator.ForModule.of(module), is((ClassFileLocator) new ClassFileLocator.ForModule(module))); } @Test public void testCreationUnnamed() throws Exception { when(module.isNamed()).thenReturn(false); assertThat(ClassFileLocator.ForModule.of(module), is((ClassFileLocator) new ClassFileLocator.ForClassLoader(classLoader))); } @Test public void testLocatable() throws Exception { ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[]{1, 2, 3}); when(module.getResourceAsStream(FOOBAR + ".class")).thenReturn(inputStream); ClassFileLocator.Resolution resolution = new ClassFileLocator.ForModule(module) .locate(FOOBAR); assertThat(resolution.isResolved(), is(true)); assertThat(resolution.resolve(), is(new byte[]{1, 2, 3})); verify(module).getResourceAsStream(FOOBAR + ".class"); verifyNoMoreInteractions(module); } @Test(expected = IllegalStateException.class) public void testNonLocatable() throws Exception { ClassFileLocator.Resolution resolution = new ClassFileLocator.ForModule(module) .locate(FOOBAR); assertThat(resolution.isResolved(), is(false)); verify(module).getResourceAsStream(FOOBAR + ".class"); verifyNoMoreInteractions(module); resolution.resolve(); fail(); } @Test @JavaVersionRule.Enforce(9) public void testBootPath() throws Exception { ClassFileLocator classFileLocator = ClassFileLocator.ForModule.ofBootLayer(); assertThat(classFileLocator.locate(Object.class.getName()).isResolved(), is(true)); assertThat(classFileLocator.locate(getClass().getName()).isResolved(), is(false)); } @Test public void testClose() throws Exception { new ClassFileLocator.ForModule(module).close(); verifyZeroInteractions(module); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(ClassFileLocator.ForModule.class).apply(); } }