package rocks.inspectit.server.ci.event;
import static org.hamcrest.MatcherAssert.assertThat;
import static org.hamcrest.Matchers.empty;
import static org.hamcrest.Matchers.hasItem;
import static org.hamcrest.Matchers.hasSize;
import static org.hamcrest.Matchers.is;
import static org.mockito.Mockito.doReturn;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.when;
import java.util.Collection;
import java.util.Collections;
import org.mockito.Mock;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import rocks.inspectit.shared.all.testbase.TestBase;
import rocks.inspectit.shared.cs.ci.Environment;
import rocks.inspectit.shared.cs.ci.Profile;
import rocks.inspectit.shared.cs.ci.assignment.AbstractClassSensorAssignment;
import rocks.inspectit.shared.cs.ci.assignment.impl.SpecialMethodSensorAssignment;
import rocks.inspectit.shared.cs.ci.factory.SpecialMethodSensorAssignmentFactory;
import rocks.inspectit.shared.cs.ci.profile.data.SensorAssignmentProfileData;
/**
* @author Ivan Senic
*
*/
@SuppressWarnings("PMD")
public class EnvironmentUpdateEventTest extends TestBase {
protected static final String ID = "";
@Mock
Environment old;
@Mock
Environment updated;
@Mock
SpecialMethodSensorAssignmentFactory functionalAssignmentFactory;
@Mock
Profile profile;
@Mock
SensorAssignmentProfileData profileData;
@BeforeMethod
public void setupProfileData() {
doReturn(profileData).when(profile).getProfileData();
when(profileData.isOfType(SensorAssignmentProfileData.class)).thenReturn(true);
}
public static class Constructor extends EnvironmentUpdateEventTest {
@Test(expectedExceptions = IllegalArgumentException.class)
public void idsNotMatching() {
when(updated.getId()).thenReturn(ID);
when(old.getId()).thenReturn("smth");
new EnvironmentUpdateEvent(this, old, updated, null, null);
}
}
public static class GetRemovedSensorAssignments extends EnvironmentUpdateEventTest {
@Test
public void profileRemoved() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
AbstractClassSensorAssignment<?> assignment = mock(AbstractClassSensorAssignment.class);
doReturn(Collections.singletonList(assignment)).when(profileData).getData(SensorAssignmentProfileData.class);
when(profile.isActive()).thenReturn(true);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, Collections.singletonList(profile));
Collection<AbstractClassSensorAssignment<?>> removed = event.getRemovedSensorAssignments(functionalAssignmentFactory);
assertThat(removed, hasSize(1));
assertThat(removed, hasItem(assignment));
}
@Test
public void profileRemovedNotActive() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
AbstractClassSensorAssignment<?> assignment = mock(AbstractClassSensorAssignment.class);
doReturn(Collections.singletonList(assignment)).when(profileData).getData(SensorAssignmentProfileData.class);
when(profile.isActive()).thenReturn(false);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, Collections.singletonList(profile));
Collection<AbstractClassSensorAssignment<?>> removed = event.getRemovedSensorAssignments(functionalAssignmentFactory);
assertThat(removed, is(empty()));
}
@Test
public void functionalRemoved() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
SpecialMethodSensorAssignment functionalAssignment = mock(SpecialMethodSensorAssignment.class);
when(functionalAssignmentFactory.getSpecialAssignments(old)).thenReturn(Collections.singletonList(functionalAssignment));
when(functionalAssignmentFactory.getSpecialAssignments(updated)).thenReturn(Collections.<SpecialMethodSensorAssignment> emptyList());
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, null);
Collection<AbstractClassSensorAssignment<?>> removed = event.getRemovedSensorAssignments(functionalAssignmentFactory);
assertThat(removed, hasSize(1));
assertThat(removed, hasItem(functionalAssignment));
}
@Test
public void functionalNoChange() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
SpecialMethodSensorAssignment functionalAssignment = mock(SpecialMethodSensorAssignment.class);
when(functionalAssignmentFactory.getSpecialAssignments(old)).thenReturn(Collections.singletonList(functionalAssignment));
when(functionalAssignmentFactory.getSpecialAssignments(updated)).thenReturn(Collections.singletonList(functionalAssignment));
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, null);
Collection<AbstractClassSensorAssignment<?>> removed = event.getRemovedSensorAssignments(functionalAssignmentFactory);
assertThat(removed, is(empty()));
}
@Test
public void wrongProfileData() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
when(profileData.isOfType(SensorAssignmentProfileData.class)).thenReturn(false);
when(profile.isActive()).thenReturn(true);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, Collections.singletonList(profile));
Collection<AbstractClassSensorAssignment<?>> removed = event.getRemovedSensorAssignments(functionalAssignmentFactory);
assertThat(removed, is(empty()));
}
}
public static class GetAddedSensorAssignments extends EnvironmentUpdateEventTest {
@Test
public void profileAdded() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
AbstractClassSensorAssignment<?> assignment = mock(AbstractClassSensorAssignment.class);
doReturn(Collections.singletonList(assignment)).when(profileData).getData(SensorAssignmentProfileData.class);
when(profile.isActive()).thenReturn(true);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, Collections.singletonList(profile), null);
Collection<AbstractClassSensorAssignment<?>> added = event.getAddedSensorAssignments(functionalAssignmentFactory);
assertThat(added, hasSize(1));
assertThat(added, hasItem(assignment));
}
@Test
public void profileRemovedNotActive() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
AbstractClassSensorAssignment<?> assignment = mock(AbstractClassSensorAssignment.class);
doReturn(Collections.singletonList(assignment)).when(profileData).getData(SensorAssignmentProfileData.class);
when(profile.isActive()).thenReturn(false);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, Collections.singletonList(profile), null);
Collection<AbstractClassSensorAssignment<?>> added = event.getAddedSensorAssignments(functionalAssignmentFactory);
assertThat(added, is(empty()));
}
@Test
public void functionalAdded() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
SpecialMethodSensorAssignment functionalAssignment = mock(SpecialMethodSensorAssignment.class);
when(functionalAssignmentFactory.getSpecialAssignments(old)).thenReturn(Collections.<SpecialMethodSensorAssignment> emptyList());
when(functionalAssignmentFactory.getSpecialAssignments(updated)).thenReturn(Collections.singletonList(functionalAssignment));
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, null);
Collection<AbstractClassSensorAssignment<?>> added = event.getAddedSensorAssignments(functionalAssignmentFactory);
assertThat(added, hasSize(1));
assertThat(added, hasItem(functionalAssignment));
}
@Test
public void functionalNoChange() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
SpecialMethodSensorAssignment functionalAssignment = mock(SpecialMethodSensorAssignment.class);
when(functionalAssignmentFactory.getSpecialAssignments(old)).thenReturn(Collections.singletonList(functionalAssignment));
when(functionalAssignmentFactory.getSpecialAssignments(updated)).thenReturn(Collections.singletonList(functionalAssignment));
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, null);
Collection<AbstractClassSensorAssignment<?>> added = event.getAddedSensorAssignments(functionalAssignmentFactory);
assertThat(added, is(empty()));
}
@Test
public void wrongProfileData() {
when(old.getId()).thenReturn(ID);
when(updated.getId()).thenReturn(ID);
when(profileData.isOfType(SensorAssignmentProfileData.class)).thenReturn(false);
when(profile.isActive()).thenReturn(true);
EnvironmentUpdateEvent event = new EnvironmentUpdateEvent(this, old, updated, null, Collections.singletonList(profile));
Collection<AbstractClassSensorAssignment<?>> added = event.getAddedSensorAssignments(functionalAssignmentFactory);
assertThat(added, is(empty()));
}
}
}