package rocks.inspectit.agent.java.sensor.method.jdbc;
import static org.mockito.Matchers.eq;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
import java.util.Map;
import org.mockito.Matchers;
import org.mockito.Mock;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import rocks.inspectit.agent.java.AbstractLogSupport;
import rocks.inspectit.agent.java.config.impl.RegisteredSensorConfig;
import rocks.inspectit.agent.java.core.ICoreService;
import rocks.inspectit.agent.java.core.impl.PlatformManager;
import rocks.inspectit.agent.java.util.Timer;
import rocks.inspectit.shared.all.communication.MethodSensorData;
import rocks.inspectit.shared.all.communication.data.SqlStatementData;
@SuppressWarnings("PMD")
public class StatementHookTest extends AbstractLogSupport {
@Mock
private Timer timer;
@Mock
private PlatformManager platformManager;
@Mock
private ICoreService coreService;
@Mock
private RegisteredSensorConfig registeredSensorConfig;
@Mock
private Map<String, Object> parameter;
@Mock
private ConnectionMetaDataStorage connectionMetaDataStorage;
@Mock
private StatementReflectionCache statementReflectionCache;
private StatementHook statementHook;
private StatementHook statementHook2;
@BeforeMethod
public void initTestClass() {
statementHook = new StatementHook(timer, platformManager, connectionMetaDataStorage, statementReflectionCache, parameter);
statementHook2 = new StatementHook(timer, platformManager, connectionMetaDataStorage, statementReflectionCache, parameter);
List<String> list = new ArrayList<String>();
list.add("java.lang.String");
when(registeredSensorConfig.getParameterTypes()).thenReturn(list);
}
@Test
public void oneStatement() {
// set up data
long platformId = 1L;
long methodId = 3L;
long sensorTypeId = 11L;
Object object = mock(Object.class);
Object[] parameters = new Object[1];
parameters[0] = "SELECT * FROM TEST";
Object result = mock(Object.class);
Double firstTimerValue = 1000.453d;
Double secondTimerValue = 1323.675d;
when(timer.getCurrentTime()).thenReturn(firstTimerValue).thenReturn(secondTimerValue);
when(platformManager.getPlatformId()).thenReturn(platformId);
statementHook.beforeBody(methodId, sensorTypeId, object, parameters, registeredSensorConfig);
verify(timer, times(1)).getCurrentTime();
statementHook.firstAfterBody(methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
verify(timer, times(2)).getCurrentTime();
statementHook.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
verify(platformManager).getPlatformId();
Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
SqlStatementData bsqld = new SqlStatementData(timestamp, platformId, sensorTypeId, methodId);
bsqld.setSql((String) parameters[0]);
verify(coreService).addMethodSensorData(eq(sensorTypeId), eq(methodId), (String) Matchers.anyObject(), (MethodSensorData) Matchers.anyObject());
verify(coreService).getMethodSensorData(eq(sensorTypeId), eq(methodId), (String) Matchers.anyObject());
verifyNoMoreInteractions(timer, platformManager, coreService, registeredSensorConfig);
}
@Test
public void oneStatementDelegatesStatement() {
// set up data
long platformId = 1L;
long methodId = 3L;
long sensorTypeId = 11L;
Object object = mock(Object.class);
Object[] parameters = new Object[1];
parameters[0] = "SELECT * FROM TEST";
Object result = mock(Object.class);
Double firstTimerValue = 1000.453d;
Double secondTimerValue = 1323.675d;
when(timer.getCurrentTime()).thenReturn(firstTimerValue).thenReturn(secondTimerValue);
when(platformManager.getPlatformId()).thenReturn(platformId);
statementHook.beforeBody(methodId, sensorTypeId, object, parameters, registeredSensorConfig);
verify(timer, times(1)).getCurrentTime();
statementHook2.beforeBody(methodId, sensorTypeId, object, parameters, registeredSensorConfig);
verify(timer, times(2)).getCurrentTime();
statementHook2.firstAfterBody(methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
verify(timer, times(3)).getCurrentTime();
statementHook2.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
statementHook.firstAfterBody(methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
verify(timer, times(4)).getCurrentTime();
statementHook.secondAfterBody(coreService, methodId, sensorTypeId, object, parameters, result, registeredSensorConfig);
verify(platformManager, times(2)).getPlatformId();
Timestamp timestamp = new Timestamp(Calendar.getInstance().getTimeInMillis());
SqlStatementData bsqld = new SqlStatementData(timestamp, platformId, sensorTypeId, methodId);
bsqld.setSql((String) parameters[0]);
verify(coreService, times(2)).addMethodSensorData(eq(sensorTypeId), eq(methodId), (String) Matchers.anyObject(), (MethodSensorData) Matchers.anyObject());
verify(coreService, times(2)).getMethodSensorData(eq(sensorTypeId), eq(methodId), (String) Matchers.anyObject());
verifyNoMoreInteractions(timer, platformManager, coreService, registeredSensorConfig);
}
}