package io.pcp.parfait.timing;
import static com.google.common.collect.Lists.newArrayList;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.anyLong;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.never;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Map;
import com.google.common.collect.Maps;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
public class EventMetricCollectorTest {
private static final String TOP_LEVEL_GROUP = "eventGroup1";
private static final String NESTED_GROUP = "eventGroup2";
private EventMetricCollector collector;
@Mock
private StepMeasurementSink stepMeasurementSink;
@Mock
private EventCounters topLevelCounter;
@Mock
private EventCounters nestedCounter;
@Mock
private EventMetricCounters topLevelMetricCounters;
@Before
public void givenAnEventMetricCollector() {
MockitoAnnotations.initMocks(this);
Map<Object, EventCounters> perEventCounters = Maps.newHashMap();
perEventCounters.put(TOP_LEVEL_GROUP, topLevelCounter);
perEventCounters.put(NESTED_GROUP, nestedCounter);
collector = new EventMetricCollector(perEventCounters, newArrayList(stepMeasurementSink));
when(topLevelCounter.getEventGroupName()).thenReturn(TOP_LEVEL_GROUP);
when(nestedCounter.getEventGroupName()).thenReturn(NESTED_GROUP);
EventMetricCounters invocationCounter = mock(EventMetricCounters.class);
when(topLevelCounter.getInvocationCounter()).thenReturn(invocationCounter);
ThreadMetric threadMetric = mock(ThreadMetric.class);
when(topLevelCounter.getMetricSources()).thenReturn(newArrayList(threadMetric));
when(topLevelCounter.getCounterForMetric(threadMetric)).thenReturn(topLevelMetricCounters);
}
@Test
public void itShouldIncrementCountersForSingleCollectors() {
collector.startTiming(TOP_LEVEL_GROUP, "topLevelEvent");
collector.stopTiming();
verify(topLevelCounter).getCounterForMetric(any(ThreadMetric.class));
verify(topLevelMetricCounters).incrementCounters(anyLong());
}
@Test
public void itShouldIncrementTopLevelCountersForNestedCollectors() {
collector.startTiming(TOP_LEVEL_GROUP, "topLevelEvent");
collector.startTiming(NESTED_GROUP, "nestedEvent");
collector.stopTiming();
collector.stopTiming();
verify(topLevelCounter).getCounterForMetric(any(ThreadMetric.class));
verify(topLevelMetricCounters).incrementCounters(anyLong());
}
@Test
public void itShouldNotIncrementNestedCountersForNestedCollectors() {
collector.startTiming(TOP_LEVEL_GROUP, "topLevelEvent");
collector.startTiming(NESTED_GROUP, "nestedEvent");
collector.stopTiming();
collector.stopTiming();
verify(nestedCounter, never()).getCounterForMetric(any(ThreadMetric.class));
}
}