package rocks.inspectit.server.processor.impl;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.equalTo;
import static org.mockito.Matchers.any;
import static org.mockito.Matchers.anyInt;
import static org.mockito.Mockito.doAnswer;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verifyNoMoreInteractions;
import static org.mockito.Mockito.when;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import javax.persistence.EntityManager;
import org.mockito.InjectMocks;
import org.mockito.Mock;
import org.mockito.invocation.InvocationOnMock;
import org.mockito.stubbing.Answer;
import org.testng.annotations.AfterMethod;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import rocks.inspectit.server.ci.event.BusinessContextDefinitionUpdateEvent;
import rocks.inspectit.server.dao.impl.BufferInvocationDataDaoImpl;
import rocks.inspectit.server.service.BusinessContextManagementService;
import rocks.inspectit.server.service.ConfigurationInterfaceService;
import rocks.inspectit.shared.all.communication.data.InvocationSequenceData;
import rocks.inspectit.shared.all.communication.data.TimerData;
import rocks.inspectit.shared.all.communication.data.cmr.ApplicationData;
import rocks.inspectit.shared.all.communication.data.cmr.BusinessTransactionData;
import rocks.inspectit.shared.all.exception.BusinessException;
import rocks.inspectit.shared.all.testbase.TestBase;
import rocks.inspectit.shared.cs.ci.business.expression.impl.StringMatchingExpression;
import rocks.inspectit.shared.cs.ci.business.impl.ApplicationDefinition;
import rocks.inspectit.shared.cs.ci.business.impl.BusinessTransactionDefinition;
import rocks.inspectit.shared.cs.ci.business.valuesource.PatternMatchingType;
import rocks.inspectit.shared.cs.ci.business.valuesource.StringValueSource;
import rocks.inspectit.shared.cs.cmr.service.cache.CachedDataService;
/**
* @author Alexander Wert
*
*/
@SuppressWarnings("PMD")
public class BusinessContextRecognitionProcessorTest extends TestBase {
@InjectMocks
BusinessContextRecognitionProcessor processor;
/**
* Tests
* {@link BusinessContextRecognitionProcessor#assignBusinessContext(InvocationSequenceData)}
* method.
*
*/
public static class Process extends BusinessContextRecognitionProcessorTest {
private static AtomicInteger idGenerator = new AtomicInteger(100);
@Mock
CachedDataService cachedDataService;
@Mock
BusinessContextManagementService businessContextManagementService;
@Mock
BufferInvocationDataDaoImpl invocationDataDao;
@Mock
ConfigurationInterfaceService ciService;
@Mock
EntityManager entityManager;
InvocationSequenceData root;
InvocationSequenceData level_1_1;
InvocationSequenceData level_1_2;
InvocationSequenceData level_2_1;
ApplicationDefinition applicationDefinition;
ApplicationDefinition applicationDefinition_empty;
BusinessTransactionDefinition businessTxDefinition_1;
BusinessTransactionDefinition businessTxDefinition_2;
StringValueSource stringValueSource;
ApplicationData application;
ApplicationData application_unknown;
ApplicationData application_empty;
BusinessTransactionData businessTx_1;
BusinessTransactionData businessTx_2;
BusinessTransactionData businessTx_unknown;
@BeforeMethod
public void init() throws BusinessException {
root = new InvocationSequenceData();
root.setId(1);
level_1_1 = new InvocationSequenceData();
level_1_1.setId(2);
level_1_2 = new InvocationSequenceData();
level_1_2.setId(3);
level_2_1 = new InvocationSequenceData();
level_2_1.setId(4);
root.getNestedSequences().add(level_1_1);
root.getNestedSequences().add(level_1_2);
level_1_2.getNestedSequences().add(level_2_1);
when(cachedDataService.getApplicationForId(anyInt())).thenReturn(null);
when(cachedDataService.getBusinessTransactionForId(anyInt(), anyInt())).thenReturn(null);
applicationDefinition = new ApplicationDefinition(idGenerator.getAndIncrement(), "SomeApplication", null);
application = new ApplicationData(idGenerator.getAndIncrement(), applicationDefinition.getId(), applicationDefinition.getApplicationName());
applicationDefinition_empty = new ApplicationDefinition(idGenerator.getAndIncrement(), "EmptyApplication", null);
application_empty = new ApplicationData(idGenerator.getAndIncrement(), applicationDefinition_empty.getId(), applicationDefinition_empty.getApplicationName());
application_unknown = new ApplicationData(idGenerator.getAndIncrement(), ApplicationDefinition.DEFAULT_ID, "Unknown Application");
businessTxDefinition_1 = new BusinessTransactionDefinition(idGenerator.getAndIncrement(), "businessTxDefinition_1", null);
businessTx_1 = new BusinessTransactionData(idGenerator.getAndIncrement(), businessTxDefinition_1.getId(), application, businessTxDefinition_1.getBusinessTransactionDefinitionName());
businessTxDefinition_2 = new BusinessTransactionDefinition(idGenerator.getAndIncrement(), "businessTxDefinition_2", null);
businessTx_2 = new BusinessTransactionData(idGenerator.getAndIncrement(), businessTxDefinition_2.getId(), application, businessTxDefinition_2.getBusinessTransactionDefinitionName());
businessTx_unknown = new BusinessTransactionData(idGenerator.getAndIncrement(), BusinessTransactionDefinition.DEFAULT_ID, application, "Unknown Transaction");
applicationDefinition.addBusinessTransactionDefinition(businessTxDefinition_1);
applicationDefinition.addBusinessTransactionDefinition(businessTxDefinition_2);
List<ApplicationDefinition> applicationDefinitions = new ArrayList<>();
applicationDefinitions.add(applicationDefinition);
applicationDefinitions.add(applicationDefinition_empty);
when(ciService.getApplicationDefinitions()).thenReturn(applicationDefinitions);
stringValueSource = mock(StringValueSource.class);
when(stringValueSource.getStringValues(root, cachedDataService)).thenReturn(new String[] { "node/root/" });
when(stringValueSource.getStringValues(level_1_1, cachedDataService)).thenReturn(new String[] { "node/level_1_1/" });
when(stringValueSource.getStringValues(level_1_2, cachedDataService)).thenReturn(new String[] { "node/level_1_2/" });
when(stringValueSource.getStringValues(level_2_1, cachedDataService)).thenReturn(new String[] { "node/level_2_1/", "node/level_2_1/multiple" });
when(businessContextManagementService.registerApplication(applicationDefinition)).thenReturn(application);
when(businessContextManagementService.registerApplication(ApplicationDefinition.DEFAULT_APPLICATION_DEFINITION)).thenReturn(application_unknown);
when(businessContextManagementService.registerBusinessTransaction(application, businessTxDefinition_1, businessTxDefinition_1.getBusinessTransactionDefinitionName()))
.thenReturn(businessTx_1);
when(businessContextManagementService.registerBusinessTransaction(application, businessTxDefinition_2, businessTxDefinition_2.getBusinessTransactionDefinitionName()))
.thenReturn(businessTx_2);
when(businessContextManagementService.registerBusinessTransaction(application, applicationDefinition.getBusinessTransactionDefinition(0),
applicationDefinition.getBusinessTransactionDefinition(0).getBusinessTransactionDefinitionName())).thenReturn(businessTx_unknown);
when(businessContextManagementService.registerBusinessTransaction(application_unknown, ApplicationDefinition.DEFAULT_APPLICATION_DEFINITION.getBusinessTransactionDefinition(0),
ApplicationDefinition.DEFAULT_APPLICATION_DEFINITION.getBusinessTransactionDefinition(0).getBusinessTransactionDefinitionName())).thenReturn(businessTx_unknown);
when(businessContextManagementService.registerApplication(applicationDefinition_empty)).thenReturn(application_empty);
when(businessContextManagementService.registerBusinessTransaction(application_empty, applicationDefinition_empty.getBusinessTransactionDefinition(0),
applicationDefinition_empty.getBusinessTransactionDefinition(0).getBusinessTransactionDefinitionName())).thenReturn(businessTx_unknown);
}
@Test
public void match() {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "root");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(false);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression);
applicationDefinition_empty.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_1.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_2.setMatchingRuleExpression(stringMatchingExpression);
processor.process(root, entityManager);
assertThat(root.getApplicationId(), equalTo(application.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_2.getId()));
}
@Test
public void matchWithSearchInTrace() {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "multiple");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(true);
stringMatchingExpression.setMaxSearchDepth(2);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression);
applicationDefinition_empty.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_1.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_2.setMatchingRuleExpression(stringMatchingExpression);
processor.process(root, entityManager);
assertThat(root.getApplicationId(), equalTo(application.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_2.getId()));
}
@Test
public void matchDefaultBT() {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "root");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(false);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression);
applicationDefinition_empty.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_1.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_2.setMatchingRuleExpression(stringMatchingExpression_2);
processor.process(root, entityManager);
assertThat(root.getApplicationId(), equalTo(application.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_unknown.getId()));
}
@Test
public void matchDefaultAppAndBT() {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(false);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression);
applicationDefinition_empty.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_1.setMatchingRuleExpression(stringMatchingExpression_2);
businessTxDefinition_2.setMatchingRuleExpression(stringMatchingExpression_2);
processor.process(root, entityManager);
assertThat(root.getApplicationId(), equalTo(application_unknown.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_unknown.getId()));
}
@Test
public void matchEmptyApplication() {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "root");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(false);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "nothing");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression_2);
applicationDefinition_empty.setMatchingRuleExpression(stringMatchingExpression);
processor.process(root, entityManager);
assertThat(root.getApplicationId(), equalTo(application_empty.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_unknown.getId()));
}
@Test
public void invalidInputData() {
TimerData invalidInput = new TimerData();
processor.process(invalidInput, entityManager);
verifyNoMoreInteractions(ciService);
}
/**
* Clean test folder after each test.
*/
@AfterMethod
public void cleanUp() throws IOException {
root.setApplicationId(-1);
root.setBusinessTransactionId(-1);
}
}
/**
* Tests
* {@link BusinessContextRecognitionProcessor#onApplicationEvent(rocks.inspectit.server.ci.event.BusinessContextDefinitionUpdateEvent)}
* method.
*
*/
public static class OnApplicationEvent extends BusinessContextRecognitionProcessorTest {
private static AtomicInteger idGenerator = new AtomicInteger(100);
@Mock
CachedDataService cachedDataService;
@Mock
BusinessContextManagementService businessContextManagementService;
@Mock
BufferInvocationDataDaoImpl invocationDataDao;
@Mock
ConfigurationInterfaceService ciService;
@Mock
EntityManager entityManager;
@Mock
BusinessContextDefinitionUpdateEvent event;
@Mock
ScheduledExecutorService executorService;
InvocationSequenceData root;
InvocationSequenceData level_1_1;
InvocationSequenceData level_1_2;
InvocationSequenceData level_2_1;
ApplicationDefinition applicationDefinition;
BusinessTransactionDefinition businessTxDefinition_1;
StringValueSource stringValueSource;
ApplicationData application;
BusinessTransactionData businessTx_1;
@BeforeMethod
public void init() throws BusinessException {
root = new InvocationSequenceData();
root.setId(1);
level_1_1 = new InvocationSequenceData();
level_1_1.setId(2);
level_1_2 = new InvocationSequenceData();
level_1_2.setId(3);
level_2_1 = new InvocationSequenceData();
level_2_1.setId(4);
root.getNestedSequences().add(level_1_1);
root.getNestedSequences().add(level_1_2);
level_1_2.getNestedSequences().add(level_2_1);
root.setApplicationId(-1);
root.setBusinessTransactionId(-1);
when(cachedDataService.getApplicationForId(anyInt())).thenReturn(null);
when(cachedDataService.getBusinessTransactionForId(anyInt(), anyInt())).thenReturn(null);
applicationDefinition = new ApplicationDefinition(idGenerator.getAndIncrement(), "SomeApplication", null);
application = new ApplicationData(idGenerator.getAndIncrement(), applicationDefinition.getId(), applicationDefinition.getApplicationName());
businessTxDefinition_1 = new BusinessTransactionDefinition(idGenerator.getAndIncrement(), "businessTxDefinition_1", null);
businessTx_1 = new BusinessTransactionData(idGenerator.getAndIncrement(), businessTxDefinition_1.getId(), application, businessTxDefinition_1.getBusinessTransactionDefinitionName());
applicationDefinition.addBusinessTransactionDefinition(businessTxDefinition_1);
when(ciService.getApplicationDefinitions()).thenReturn(Collections.singletonList(applicationDefinition));
stringValueSource = mock(StringValueSource.class);
when(stringValueSource.getStringValues(root, cachedDataService)).thenReturn(new String[] { "node/root/" });
when(stringValueSource.getStringValues(level_1_1, cachedDataService)).thenReturn(new String[] { "node/level_1_1/" });
when(stringValueSource.getStringValues(level_1_2, cachedDataService)).thenReturn(new String[] { "node/level_1_2/" });
when(stringValueSource.getStringValues(level_2_1, cachedDataService)).thenReturn(new String[] { "node/level_2_1/", "node/level_2_1/multiple" });
when(businessContextManagementService.registerApplication(applicationDefinition)).thenReturn(application);
when(businessContextManagementService.registerBusinessTransaction(application, businessTxDefinition_1, businessTxDefinition_1.getBusinessTransactionDefinitionName()))
.thenReturn(businessTx_1);
when(invocationDataDao.getInvocationSequenceDetail(0, 0, -1, null, null, null)).thenReturn(Collections.singletonList(root));
doAnswer(new Answer<Object>() {
@Override
public Object answer(InvocationOnMock invocation) throws Exception {
Object[] arguments = invocation.getArguments();
Runnable runnable = (Runnable) arguments[0];
runnable.run();
return null;
}
}).when(executorService).execute(any(Runnable.class));
}
@Test
public void businessContextChanged() throws InterruptedException {
StringMatchingExpression stringMatchingExpression = new StringMatchingExpression(PatternMatchingType.CONTAINS, "root");
stringMatchingExpression.setStringValueSource(stringValueSource);
stringMatchingExpression.setSearchNodeInTrace(false);
StringMatchingExpression stringMatchingExpression_2 = new StringMatchingExpression(PatternMatchingType.CONTAINS, "node");
stringMatchingExpression_2.setStringValueSource(stringValueSource);
stringMatchingExpression_2.setSearchNodeInTrace(false);
applicationDefinition.setMatchingRuleExpression(stringMatchingExpression);
businessTxDefinition_1.setMatchingRuleExpression(stringMatchingExpression_2);
processor.onApplicationEvent(event);
assertThat(root.getApplicationId(), equalTo(application.getId()));
assertThat(root.getBusinessTransactionId(), equalTo(businessTx_1.getId()));
}
/**
* Clean test folder after each test.
*/
@AfterMethod
public void cleanUp() throws IOException {
root.setApplicationId(-1);
root.setBusinessTransactionId(-1);
}
}
}