public void testStaticInstrumentationOnThreadSubclassInterceptorWorks()

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;
            }
        }
    }