@Test public void register() throws Exception { helper.afterPropertiesSet(); String fqn = "fqn"; InstrumentationDefinition definition = mock(InstrumentationDefinition.class); helper.registerInstrumentationDefinition(fqn, definition); InstrumentationDefinition fromCache = helper.getInstrumentationDefinition(fqn); assertThat(fromCache, is(definition)); }
@Test public void saveAndLoad() throws Exception { String fqn = "fqn"; InstrumentationDefinition definition = mock(InstrumentationDefinition.class); helper.registerInstrumentationDefinition(fqn, definition); helper.destroy(); helper.afterPropertiesSet(); InstrumentationDefinition fromCache = helper.getInstrumentationDefinition(fqn); assertThat(fromCache, is(nullValue())); } }
classHashHelper.registerInstrumentationDefinition(definition.getClassName(), definition);
InstrumentationDefinition instrumentationResult = entry.getValue(); String fqn = instrumentationResult.getClassName(); registerInstrumentationDefinition(fqn, instrumentationResult); for (String hash : entry.getKey()) { registerSent(fqn, hash);
@Test public void unmodifiableClass() throws UnmodifiableClassException { InstrumentationDefinition iDefinition = mock(InstrumentationDefinition.class); when(iDefinition.getClassName()).thenReturn("java.lang.Object"); IAgentMessage<?> message = new UpdatedInstrumentationMessage(); ((UpdatedInstrumentationMessage) message).getMessageContent().add(iDefinition); AgentMessagesReceivedEvent event = new AgentMessagesReceivedEvent(eventSource, Arrays.<IAgentMessage<?>> asList(message)); when(instrumentation.getAllLoadedClasses()).thenReturn(new Class[] { Object.class, String.class }); when(instrumentation.isModifiableClass(eq(Object.class))).thenReturn(false); when(agent.isUsingRetransformation()).thenReturn(true); retransformManager.onApplicationEvent(event); verify(classHashHelper).registerInstrumentationDefinition(eq("java.lang.Object"), eq(iDefinition)); verify(instrumentation).getAllLoadedClasses(); verify(instrumentation, times(2)).isModifiableClass(any(Class.class)); verifyNoMoreInteractions(instrumentation, classHashHelper); verifyZeroInteractions(threadTransformHelper); }
@Test public void noInstrumentationResult() throws Exception { String className = TestClass.class.getName(); ClassLoader classLoader = TestClass.class.getClassLoader(); byte[] byteCode = getByteCode(className); ArgumentCaptor<String> fqnCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<String> hashCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor<ClassType> classCaptor = ArgumentCaptor.forClass(ClassType.class); when(classHashHelper.isSent(fqnCaptor.capture(), hashCaptor.capture())).thenReturn(false); when(classHashHelper.isAnalyzed(anyString())).thenReturn(true); when(connection.isConnected()).thenReturn(true); when(connection.analyze(eq(platformId.longValue()), anyString(), classCaptor.capture())).thenReturn(null); byte[] instrumentedByteCode = byteCodeAnalyzer.analyzeAndInstrument(byteCode, className, classLoader); // as no instrumentation happened, we get a null object assertThat(instrumentedByteCode, is(nullValue())); verify(connection, times(2)).isConnected(); verify(connection, times(1)).analyze(platformId.longValue(), hashCaptor.getValue(), classCaptor.getValue()); verify(classHashHelper, atLeastOnce()).isAnalyzed(anyString()); verify(classHashHelper, times(1)).isSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), null); verifyZeroInteractions(hookDispatcherMapper); verifyNoMoreInteractions(connection, classHashHelper); }
@Test public void unknownInstrumentationClass() throws UnmodifiableClassException { InstrumentationDefinition iDefinition = mock(InstrumentationDefinition.class); when(iDefinition.getClassName()).thenReturn("unknown.Class"); IAgentMessage<?> message = new UpdatedInstrumentationMessage(); ((UpdatedInstrumentationMessage) message).getMessageContent().add(iDefinition); AgentMessagesReceivedEvent event = new AgentMessagesReceivedEvent(eventSource, Arrays.<IAgentMessage<?>> asList(message)); when(instrumentation.getAllLoadedClasses()).thenReturn(new Class[] { Object.class, String.class }); when(agent.isUsingRetransformation()).thenReturn(true); retransformManager.onApplicationEvent(event); verify(classHashHelper).registerInstrumentationDefinition(eq("unknown.Class"), eq(iDefinition)); verify(instrumentation).getAllLoadedClasses(); verify(instrumentation, times(2)).isModifiableClass(any(Class.class)); verifyNoMoreInteractions(instrumentation, classHashHelper); verifyZeroInteractions(threadTransformHelper); }
@Test public void retransformationThrowsException() throws UnmodifiableClassException { InstrumentationDefinition iDefinition = mock(InstrumentationDefinition.class); when(iDefinition.getClassName()).thenReturn("java.lang.Object"); IAgentMessage<?> message = new UpdatedInstrumentationMessage(); ((UpdatedInstrumentationMessage) message).getMessageContent().add(iDefinition); AgentMessagesReceivedEvent event = new AgentMessagesReceivedEvent(eventSource, Arrays.<IAgentMessage<?>> asList(message)); when(instrumentation.getAllLoadedClasses()).thenReturn(new Class[] { Object.class, String.class }); doThrow(Exception.class).when(instrumentation).retransformClasses(any(Class.class)); when(instrumentation.isModifiableClass(Matchers.<Class<?>> any())).thenReturn(true); when(agent.isUsingRetransformation()).thenReturn(true); retransformManager.onApplicationEvent(event); verify(classHashHelper).registerInstrumentationDefinition(eq("java.lang.Object"), eq(iDefinition)); verify(instrumentation).getAllLoadedClasses(); verify(instrumentation).retransformClasses(any(Class.class)); verify(instrumentation, times(2)).isModifiableClass(any(Class.class)); InOrder inOrder = inOrder(threadTransformHelper); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(false); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(true); verifyNoMoreInteractions(instrumentation, classHashHelper); verifyZeroInteractions(threadTransformHelper); }
@Test @SuppressWarnings("unchecked") public void instrumentationThrowsOneException() throws UnmodifiableClassException { InstrumentationDefinition iDefinition = mock(InstrumentationDefinition.class); when(iDefinition.getClassName()).thenReturn("java.lang.Object"); IAgentMessage<?> message = new UpdatedInstrumentationMessage(); ((UpdatedInstrumentationMessage) message).getMessageContent().add(iDefinition); AgentMessagesReceivedEvent event = new AgentMessagesReceivedEvent(eventSource, Arrays.<IAgentMessage<?>> asList(message)); when(instrumentation.getAllLoadedClasses()).thenReturn(new Class[] { Object.class, String.class }); when(instrumentation.isModifiableClass(any(Class.class))).thenReturn(true).thenThrow(RuntimeException.class); when(agent.isUsingRetransformation()).thenReturn(true); retransformManager.onApplicationEvent(event); verify(classHashHelper).registerInstrumentationDefinition(eq("java.lang.Object"), eq(iDefinition)); verify(instrumentation).getAllLoadedClasses(); verify(instrumentation).retransformClasses(eq(Object.class)); verify(instrumentation, times(2)).isModifiableClass(any(Class.class)); InOrder inOrder = inOrder(threadTransformHelper); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(false); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(true); verifyNoMoreInteractions(instrumentation, classHashHelper, threadTransformHelper); }
verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), instrumentationResult); verifyNoMoreInteractions(connection, classHashHelper); verifyZeroInteractions(hookDispatcherMapper);
@Test public void successful() throws UnmodifiableClassException { InstrumentationDefinition objectDefinition = mock(InstrumentationDefinition.class); when(objectDefinition.getClassName()).thenReturn("java.lang.Object"); InstrumentationDefinition stringDefinition = mock(InstrumentationDefinition.class); when(stringDefinition.getClassName()).thenReturn("java.lang.String"); IAgentMessage<?> message = new UpdatedInstrumentationMessage(); ((UpdatedInstrumentationMessage) message).getMessageContent().add(objectDefinition); ((UpdatedInstrumentationMessage) message).getMessageContent().add(stringDefinition); AgentMessagesReceivedEvent event = new AgentMessagesReceivedEvent(eventSource, Arrays.<IAgentMessage<?>> asList(message)); when(instrumentation.getAllLoadedClasses()).thenReturn(new Class[] { Object.class, String.class }); when(instrumentation.isModifiableClass(any(Class.class))).thenReturn(true); when(agent.isUsingRetransformation()).thenReturn(true); retransformManager.onApplicationEvent(event); verify(classHashHelper).registerInstrumentationDefinition(eq("java.lang.Object"), eq(objectDefinition)); verify(classHashHelper).registerInstrumentationDefinition(eq("java.lang.String"), eq(stringDefinition)); verify(instrumentation).getAllLoadedClasses(); verify(instrumentation).retransformClasses(eq(Object.class), eq(String.class)); verify(instrumentation, times(2)).isModifiableClass(any(Class.class)); verify(agent).isUsingRetransformation(); InOrder inOrder = inOrder(threadTransformHelper); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(false); inOrder.verify(threadTransformHelper).setThreadTransformDisabled(true); verifyNoMoreInteractions(instrumentation, classHashHelper, threadTransformHelper, agent); }
classHashHelper.registerInstrumentationDefinition(className, instrumentationResult);
verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), instrumentationResult); ArgumentCaptor<SpecialSensorConfig> sscCaptor = ArgumentCaptor.forClass(SpecialSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(sscId), sscCaptor.capture());
verify(classHashHelper, times(1)).registerSent(eq(TestClass.class.getName()), anyString()); verify(classHashHelper, times(1)).registerSent(eq(AbstractSubTest.class.getName()), anyString()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(TestClass.class.getName(), instrumentationResult); verify(classHashHelper, times(1)).registerInstrumentationDefinition(AbstractSubTest.class.getName(), instrumentationResult);
verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), instrumentationResult); ArgumentCaptor<RegisteredSensorConfig> rscCaptor = ArgumentCaptor.forClass(RegisteredSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(rscId), rscCaptor.capture());
verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), instrumentationResult); ArgumentCaptor<RegisteredSensorConfig> rscCaptor = ArgumentCaptor.forClass(RegisteredSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(rscId), rscCaptor.capture());
verify(classHashHelper, times(1)).registerAnalyzed(fqnCaptor.getValue()); verify(classHashHelper, times(1)).registerSent(fqnCaptor.getValue(), hashCaptor.getValue()); verify(classHashHelper, times(1)).registerInstrumentationDefinition(fqnCaptor.getValue(), instrumentationResult); ArgumentCaptor<RegisteredSensorConfig> rscCaptor = ArgumentCaptor.forClass(RegisteredSensorConfig.class); verify(hookDispatcherMapper, times(1)).addMapping(eq(rscId), rscCaptor.capture());