package javasplitter;

import org.junit.Test;

import static org.junit.Assert.*;

public class ExecutionTimingAuditableLifecycleListenerTest {

    @Test
    public void testTimingExecutions() throws InterruptedException {
        final int threads = 500;
        final int iterations = 5000;
        final int total = threads * iterations;

        final StatsCollector statsCollector = new UnboundedStatsCollector();
        final AuditableLifecycleListener listener = 
          new ExecutionTimingAuditableLifecycleListener(statsCollector);

        final MultithreadedStressTester stressTester = 
          new MultithreadedStressTester(threads, iterations);

        stressTester.stress(
            new Runnable() {
                @Override
                public void run() {
                    final Auditable sleeping = new SleepingAuditable();
                    final Auditable iterating = new IteratingAuditable();

                    final AuditableInvoker invoker = new AuditableInvoker(sleeping, iterating);
                    invoker.addListener(listener);
                    invoker.invoke();
                }
            }
        );

        assertEquals(total, statsCollector.timesValidated(SleepingAuditable.class));

        assertEquals(total, statsCollector.timesValidated(IteratingAuditable.class));

        assertEquals(total, statsCollector.timesProcessed(SleepingAuditable.class));

        assertEquals(total, statsCollector.timesProcessed(IteratingAuditable.class));
    }

}