package com.aol.micro.server.events; import static org.hamcrest.Matchers.containsString; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.is; import static org.hamcrest.Matchers.notNullValue; import static org.junit.Assert.assertThat; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import static org.springframework.util.ReflectionUtils.findField; import static org.springframework.util.ReflectionUtils.getField; import static org.springframework.util.ReflectionUtils.makeAccessible; import java.lang.reflect.Field; import java.util.concurrent.ConcurrentMap; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import com.google.common.collect.ConcurrentHashMultiset; import com.google.common.collect.Maps; import com.google.common.eventbus.EventBus; import com.google.common.eventbus.Subscribe; public class JobsBeingExecutedTest { JobsBeingExecuted jobs; ProceedingJoinPoint pjp; EventBus bus; SystemData data; SystemData incoming; JobStartEvent start; JobCompleteEvent complete; @Before public void setUp() throws Exception { data = SystemData.builder() .dataMap(Maps.newHashMap()) .errors(1) .processed(100) .build(); bus = new EventBus(); bus.register(this); jobs = new JobsBeingExecuted( bus, 10, JobName.Types.SIMPLE); pjp = Mockito.mock(ProceedingJoinPoint.class); } @Subscribe public void event(SystemData info) { this.incoming = info; } @Subscribe public void event(JobStartEvent start) { this.start = start; } @Subscribe public void event(JobCompleteEvent complete) { this.complete = complete; } @Test public void testExecute() throws Throwable { Signature sig = Mockito.mock(Signature.class); Mockito.when(pjp.getSignature()) .thenReturn(sig); when(pjp.getTarget()).thenReturn(this); Mockito.when(sig.getDeclaringType()) .thenReturn(String.class); jobs.aroundScheduledJob(pjp); verify(pjp, times(1)).proceed(); } @Test public void testExecuteWithEvent() throws Throwable { scheduleAround(); verify(pjp, times(1)).proceed(); assertThat(incoming, is(notNullValue())); } @Test public void testExecuteId() throws Throwable { scheduleAround(); verify(pjp, times(1)).proceed(); assertThat(incoming.getCorrelationId(), containsString("id_String")); assertThat(start.getCorrelationId(), equalTo(complete.getCorrelationId())); assertThat(start.getType(), equalTo(complete.getType())); } @Test public void testStartAndCompleteEventId() throws Throwable { scheduleAround(); assertThat(start.getCorrelationId(), equalTo(complete.getCorrelationId())); assertThat(start.getType(), equalTo(complete.getType())); } @Test public void testOverflow() throws Throwable { when(pjp.getTarget()).thenReturn(this); Field field = findField(ConcurrentHashMultiset.class, "countMap"); makeAccessible(field); ConcurrentMap map = (ConcurrentMap) getField(field, jobs.getStatCounter()); map.put("java.lang.String", Integer.MAX_VALUE); testExecute(); } private void scheduleAround() throws Throwable { Signature sig = Mockito.mock(Signature.class); when(pjp.getSignature()).thenReturn(sig); when(sig.getDeclaringType()).thenReturn(String.class); when(pjp.proceed()).thenReturn(data); when(pjp.getTarget()).thenReturn(this); jobs.aroundScheduledJob(pjp); } }