package net.bytebuddy.dynamic; import net.bytebuddy.test.utility.MockitoRule; import net.bytebuddy.test.utility.ObjectPropertyAssertion; import org.junit.Rule; import org.junit.Test; import org.junit.rules.TestRule; import org.mockito.Mock; import java.io.ByteArrayInputStream; import java.io.Closeable; 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 ClassFileLocatorForClassLoaderWeaklyReferencedTest { private static final String FOOBAR = "foo/bar"; @Rule public TestRule mockitoRule = new MockitoRule(this); @Mock private ClosableClassLoader classLoader; @Test public void testCreation() throws Exception { assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(classLoader), is((ClassFileLocator) new ClassFileLocator.ForClassLoader.WeaklyReferenced(classLoader))); assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(null), is((ClassFileLocator) new ClassFileLocator.ForClassLoader(ClassLoader.getSystemClassLoader()))); assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(ClassLoader.getSystemClassLoader()), is((ClassFileLocator) new ClassFileLocator.ForClassLoader(ClassLoader.getSystemClassLoader()))); } @Test public void testLocatable() throws Exception { ByteArrayInputStream inputStream = new ByteArrayInputStream(new byte[]{1, 2, 3}); when(classLoader.getResourceAsStream(FOOBAR + ".class")).thenReturn(inputStream); ClassFileLocator.Resolution resolution = new ClassFileLocator.ForClassLoader.WeaklyReferenced(classLoader) .locate(FOOBAR); assertThat(resolution.isResolved(), is(true)); assertThat(resolution.resolve(), is(new byte[]{1, 2, 3})); verify(classLoader).getResourceAsStream(FOOBAR + ".class"); verifyNoMoreInteractions(classLoader); } @Test(expected = IllegalStateException.class) public void testNonLocatable() throws Exception { ClassFileLocator.Resolution resolution = new ClassFileLocator.ForClassLoader.WeaklyReferenced(classLoader) .locate(FOOBAR); assertThat(resolution.isResolved(), is(false)); verify(classLoader).getResourceAsStream(FOOBAR + ".class"); verifyNoMoreInteractions(classLoader); resolution.resolve(); fail(); } @Test public void testClose() throws Exception { ClassFileLocator.ForClassLoader.WeaklyReferenced.of(classLoader).close(); verifyZeroInteractions(classLoader); } @Test public void testSystemClassLoader() throws Exception { assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(ClassLoader.getSystemClassLoader()), is(ClassFileLocator.ForClassLoader.of(ClassLoader.getSystemClassLoader()))); } @Test public void testPlatformLoader() throws Exception { assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(ClassLoader.getSystemClassLoader().getParent()), is(ClassFileLocator.ForClassLoader.of(ClassLoader.getSystemClassLoader().getParent()))); } @Test public void testBootLoader() throws Exception { assertThat(ClassFileLocator.ForClassLoader.WeaklyReferenced.of(null), is(ClassFileLocator.ForClassLoader.of(ClassLoader.getSystemClassLoader()))); } @Test public void testObjectProperties() throws Exception { ObjectPropertyAssertion.of(ClassFileLocator.ForClassLoader.WeaklyReferenced.class).apply(); } private abstract static class ClosableClassLoader extends ClassLoader implements Closeable { /* empty */ } }