package rocks.inspectit.agent.java.sensor.method.jdbc;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.is;
import static org.mockito.Matchers.anyObject;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.verifyZeroInteractions;
import static org.mockito.Mockito.when;
import org.mockito.Mock;
import org.mockito.MockitoAnnotations;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import rocks.inspectit.agent.java.sensor.method.jdbc.ConnectionMetaDataStorage.ConnectionMetaData;
import rocks.inspectit.agent.java.sensor.method.jdbc.ConnectionMetaDataStorage.ConnectionMetaDataExtractor;
import rocks.inspectit.shared.all.communication.data.SqlStatementData;
@SuppressWarnings("PMD")
public class ConnectionMetaDataStorageTest {
private ConnectionMetaDataStorage storage;
@Mock
private SqlStatementData sqlStatementData;
@Mock
private ConnectionMetaDataExtractor extractor;
@BeforeMethod
public void init() {
MockitoAnnotations.initMocks(this);
storage = new ConnectionMetaDataStorage();
storage.dataExtractor = extractor;
}
@Test
public void nullConnectionInstance() {
storage.populate(sqlStatementData, null);
assertThat((int) storage.storage.size(), is(0));
verifyZeroInteractions(sqlStatementData);
}
@Test
public void extractorReturnsNull() {
Object connectionObject = "";
when(extractor.parse(connectionObject)).thenReturn(null);
storage.populate(sqlStatementData, connectionObject);
// we have one now as adding empty
assertThat(storage.storage.size(), is(1L));
// re-trying should not touch the storage
storage.populate(sqlStatementData, connectionObject);
assertThat(storage.storage.size(), is(1L));
// in any case no sql touching
verifyZeroInteractions(sqlStatementData);
}
@Test
public void sqlPopulated() {
ConnectionMetaData data = new ConnectionMetaData();
data.product = "product";
data.version = "version";
data.url = "url";
when(extractor.parse(anyObject())).thenReturn(data);
// note that we can pass this as we mocked the data extraction.
Object connectionObject = "";
storage.populate(sqlStatementData, connectionObject);
assertThat(storage.storage.size(), is(1L));
assertThat(storage.storage.getIfPresent(connectionObject), is(data));
verify(sqlStatementData, times(1)).setDatabaseProductName(data.product);
verify(sqlStatementData, times(1)).setDatabaseProductVersion(data.version);
verify(sqlStatementData, times(1)).setDatabaseUrl(data.url);
// second try, storage stays same
storage.populate(sqlStatementData, connectionObject);
assertThat(storage.storage.size(), is(1L));
assertThat(storage.storage.getIfPresent(connectionObject), is(data));
verify(sqlStatementData, times(2)).setDatabaseProductName(data.product);
verify(sqlStatementData, times(2)).setDatabaseProductVersion(data.version);
verify(sqlStatementData, times(2)).setDatabaseUrl(data.url);
}
}