use of net.bytebuddy.dynamic.ClassFileLocator in project byte-buddy by raphw.
the class AgentBuilderRedefinitionStrategyResubmissionStrategyTest method testRedefinition.
@Test
@SuppressWarnings("unchecked")
public void testRedefinition() throws Exception {
when(instrumentation.isModifiableClass(Foo.class)).thenReturn(true);
when(redefinitionBatchAllocator.batch(Mockito.any(List.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return Collections.singleton(invocationOnMock.getArgumentAt(0, List.class));
}
});
when(rawMatcher.matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain())).thenReturn(true);
when(matcher.matches(error)).thenReturn(true);
when(resubmissionScheduler.isAlive()).thenReturn(true);
ClassFileLocator classFileLocator = mock(ClassFileLocator.class);
when(locationStrategy.classFileLocator(Foo.class.getClassLoader(), JavaModule.ofType(Foo.class))).thenReturn(classFileLocator);
when(classFileLocator.locate(Foo.class.getName())).thenReturn(new ClassFileLocator.Resolution.Explicit(new byte[] { 1, 2, 3 }));
AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Installation installation = new AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Enabled(resubmissionScheduler, matcher).install(instrumentation, locationStrategy, listener, installationListener, circularityLock, rawMatcher, AgentBuilder.RedefinitionStrategy.REDEFINITION, redefinitionBatchAllocator, redefinitionListener);
installation.getInstallationListener().onInstall(instrumentation, classFileTransformer);
installation.getListener().onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(resubmissionScheduler).isAlive();
verify(resubmissionScheduler).schedule(argumentCaptor.capture());
argumentCaptor.getValue().run();
verifyNoMoreInteractions(resubmissionScheduler);
verify(instrumentation).isModifiableClass(Foo.class);
verify(instrumentation).redefineClasses(Mockito.argThat(new BaseMatcher<ClassDefinition[]>() {
@Override
public boolean matches(Object o) {
return ((ClassDefinition) o).getDefinitionClass() == Foo.class && Arrays.equals(((ClassDefinition) o).getDefinitionClassFile(), new byte[] { 1, 2, 3 });
}
@Override
public void describeTo(Description description) {
}
}));
verifyNoMoreInteractions(instrumentation);
verify(rawMatcher).matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain());
verifyNoMoreInteractions(rawMatcher);
verify(redefinitionBatchAllocator).batch(Collections.<Class<?>>singletonList(Foo.class));
verifyNoMoreInteractions(redefinitionBatchAllocator);
verify(listener).onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
verifyNoMoreInteractions(listener);
verify(matcher).matches(error);
verifyNoMoreInteractions(matcher);
}
use of net.bytebuddy.dynamic.ClassFileLocator in project byte-buddy by raphw.
the class AgentBuilderRedefinitionStrategyResubmissionStrategyTest method testRedefinitionNonMatchedError.
@Test
@SuppressWarnings("unchecked")
public void testRedefinitionNonMatchedError() throws Exception {
when(instrumentation.isModifiableClass(Foo.class)).thenReturn(true);
when(redefinitionBatchAllocator.batch(Mockito.any(List.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return Collections.singleton(invocationOnMock.getArgumentAt(0, List.class));
}
});
when(rawMatcher.matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain())).thenReturn(true);
when(matcher.matches(error)).thenReturn(false);
when(resubmissionScheduler.isAlive()).thenReturn(true);
ClassFileLocator classFileLocator = mock(ClassFileLocator.class);
when(locationStrategy.classFileLocator(Foo.class.getClassLoader(), JavaModule.ofType(Foo.class))).thenReturn(classFileLocator);
when(classFileLocator.locate(Foo.class.getName())).thenReturn(new ClassFileLocator.Resolution.Explicit(new byte[] { 1, 2, 3 }));
AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Installation installation = new AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Enabled(resubmissionScheduler, matcher).install(instrumentation, locationStrategy, listener, installationListener, circularityLock, rawMatcher, AgentBuilder.RedefinitionStrategy.REDEFINITION, redefinitionBatchAllocator, redefinitionListener);
installation.getInstallationListener().onInstall(instrumentation, classFileTransformer);
installation.getListener().onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(resubmissionScheduler).isAlive();
verify(resubmissionScheduler).schedule(argumentCaptor.capture());
argumentCaptor.getValue().run();
verifyNoMoreInteractions(resubmissionScheduler);
verifyZeroInteractions(instrumentation);
verifyZeroInteractions(rawMatcher);
verifyZeroInteractions(redefinitionBatchAllocator);
verify(listener).onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
verifyNoMoreInteractions(listener);
verify(matcher).matches(error);
verifyNoMoreInteractions(matcher);
}
use of net.bytebuddy.dynamic.ClassFileLocator in project byte-buddy by raphw.
the class AgentBuilderRedefinitionStrategyResubmissionStrategyTest method testRedefinitionAlreadyLoaded.
@Test
@SuppressWarnings("unchecked")
public void testRedefinitionAlreadyLoaded() throws Exception {
when(instrumentation.isModifiableClass(Foo.class)).thenReturn(true);
when(redefinitionBatchAllocator.batch(Mockito.any(List.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return Collections.singleton(invocationOnMock.getArgumentAt(0, List.class));
}
});
when(rawMatcher.matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain())).thenReturn(true);
when(matcher.matches(error)).thenReturn(false);
when(resubmissionScheduler.isAlive()).thenReturn(true);
ClassFileLocator classFileLocator = mock(ClassFileLocator.class);
when(locationStrategy.classFileLocator(Foo.class.getClassLoader(), JavaModule.ofType(Foo.class))).thenReturn(classFileLocator);
when(classFileLocator.locate(Foo.class.getName())).thenReturn(new ClassFileLocator.Resolution.Explicit(new byte[] { 1, 2, 3 }));
AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Installation installation = new AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Enabled(resubmissionScheduler, matcher).install(instrumentation, locationStrategy, listener, installationListener, circularityLock, rawMatcher, AgentBuilder.RedefinitionStrategy.REDEFINITION, redefinitionBatchAllocator, redefinitionListener);
installation.getInstallationListener().onInstall(instrumentation, classFileTransformer);
installation.getListener().onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), true, error);
ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(resubmissionScheduler).isAlive();
verify(resubmissionScheduler).schedule(argumentCaptor.capture());
argumentCaptor.getValue().run();
verifyNoMoreInteractions(resubmissionScheduler);
verifyZeroInteractions(instrumentation);
verifyZeroInteractions(rawMatcher);
verifyZeroInteractions(redefinitionBatchAllocator);
verify(listener).onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), true, error);
verifyNoMoreInteractions(listener);
verifyZeroInteractions(matcher);
}
use of net.bytebuddy.dynamic.ClassFileLocator in project byte-buddy by raphw.
the class AgentBuilderRedefinitionStrategyResubmissionStrategyTest method testRedefinitionNonAlive.
@Test
@SuppressWarnings("unchecked")
public void testRedefinitionNonAlive() throws Exception {
when(instrumentation.isModifiableClass(Foo.class)).thenReturn(true);
when(redefinitionBatchAllocator.batch(Mockito.any(List.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return Collections.singleton(invocationOnMock.getArgumentAt(0, List.class));
}
});
when(rawMatcher.matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain())).thenReturn(false);
when(matcher.matches(error)).thenReturn(true);
when(resubmissionScheduler.isAlive()).thenReturn(false);
ClassFileLocator classFileLocator = mock(ClassFileLocator.class);
when(locationStrategy.classFileLocator(Foo.class.getClassLoader(), JavaModule.ofType(Foo.class))).thenReturn(classFileLocator);
when(classFileLocator.locate(Foo.class.getName())).thenReturn(new ClassFileLocator.Resolution.Explicit(new byte[] { 1, 2, 3 }));
AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Installation installation = new AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Enabled(resubmissionScheduler, matcher).install(instrumentation, locationStrategy, listener, installationListener, circularityLock, rawMatcher, AgentBuilder.RedefinitionStrategy.REDEFINITION, redefinitionBatchAllocator, redefinitionListener);
installation.getInstallationListener().onInstall(instrumentation, classFileTransformer);
installation.getListener().onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
verify(resubmissionScheduler).isAlive();
verifyNoMoreInteractions(resubmissionScheduler);
verifyZeroInteractions(instrumentation);
verifyZeroInteractions(rawMatcher);
verifyZeroInteractions(redefinitionBatchAllocator);
verify(listener).onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
verifyNoMoreInteractions(listener);
verifyZeroInteractions(matcher);
}
use of net.bytebuddy.dynamic.ClassFileLocator in project byte-buddy by raphw.
the class AgentBuilderRedefinitionStrategyResubmissionStrategyTest method testRedefinitionNonMatched.
@Test
@SuppressWarnings("unchecked")
public void testRedefinitionNonMatched() throws Exception {
when(instrumentation.isModifiableClass(Foo.class)).thenReturn(true);
when(redefinitionBatchAllocator.batch(Mockito.any(List.class))).thenAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocationOnMock) throws Throwable {
return Collections.singleton(invocationOnMock.getArgumentAt(0, List.class));
}
});
when(rawMatcher.matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain())).thenReturn(false);
when(matcher.matches(error)).thenReturn(true);
when(resubmissionScheduler.isAlive()).thenReturn(true);
ClassFileLocator classFileLocator = mock(ClassFileLocator.class);
when(locationStrategy.classFileLocator(Foo.class.getClassLoader(), JavaModule.ofType(Foo.class))).thenReturn(classFileLocator);
when(classFileLocator.locate(Foo.class.getName())).thenReturn(new ClassFileLocator.Resolution.Explicit(new byte[] { 1, 2, 3 }));
AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Installation installation = new AgentBuilder.RedefinitionStrategy.ResubmissionStrategy.Enabled(resubmissionScheduler, matcher).install(instrumentation, locationStrategy, listener, installationListener, circularityLock, rawMatcher, AgentBuilder.RedefinitionStrategy.REDEFINITION, redefinitionBatchAllocator, redefinitionListener);
installation.getInstallationListener().onInstall(instrumentation, classFileTransformer);
installation.getListener().onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
ArgumentCaptor<Runnable> argumentCaptor = ArgumentCaptor.forClass(Runnable.class);
verify(resubmissionScheduler).isAlive();
verify(resubmissionScheduler).schedule(argumentCaptor.capture());
argumentCaptor.getValue().run();
verifyNoMoreInteractions(resubmissionScheduler);
verify(instrumentation).isModifiableClass(Foo.class);
verifyNoMoreInteractions(instrumentation);
verify(rawMatcher).matches(new TypeDescription.ForLoadedType(Foo.class), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), Foo.class, Foo.class.getProtectionDomain());
verifyNoMoreInteractions(rawMatcher);
verifyZeroInteractions(redefinitionBatchAllocator);
verify(listener).onError(Foo.class.getName(), Foo.class.getClassLoader(), JavaModule.ofType(Foo.class), false, error);
verifyNoMoreInteractions(listener);
verify(matcher).matches(error);
verifyNoMoreInteractions(matcher);
}
Aggregations