in disco-java-agent-instrumentation-preprocess/src/integtest/java/software/amazon/disco/instrumentation/preprocess/ThreadSubclassInterceptorIntegTest.java [71:107]
public void testStaticInstrumentationOnThreadSubclassInterceptorWorks() throws Exception {
TransactionContext.create();
IntegTestListener listener = new IntegTestListener();
LinkedHashMap<Class, Integer> eventsRegistry = listener.getEventsRegistry();
listener.register();
IntegTestThread original = new IntegTestThread();
original.start();
original.join();
Assert.assertTrue(eventsRegistry.isEmpty());
Thread transformed = (Thread) Class.forName(IntegTestThread.class.getName() + RENAME_SUFFIX)
.getDeclaredConstructor()
.newInstance();
transformed.start();
transformed.join();
Assert.assertEquals(2, eventsRegistry.size());
Assert.assertTrue(eventsRegistry.containsKey(ThreadEnterEvent.class));
Assert.assertTrue(eventsRegistry.containsKey(ThreadExitEvent.class));
Assert.assertEquals(1, eventsRegistry.get(ThreadEnterEvent.class).intValue());
Assert.assertEquals(1, eventsRegistry.get(ThreadExitEvent.class).intValue());
// Iterate through the ordered LinkedHashMap to verify if ThreadExitEvent is published after ThreadEnterEvent
boolean enterEventFound = false;
for(Class clazz : eventsRegistry.keySet()){
if(clazz.equals(ThreadEnterEvent.class)){
enterEventFound = true;
}else if(clazz.equals(ThreadExitEvent.class)){
// test will fail if ThreadEnterEvent wasn't published before ThreadExitEvent
Assert.assertTrue(enterEventFound);
break;
}
}
}