package hudson.plugins.im;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import hudson.Launcher;
import hudson.matrix.MatrixAggregator;
import hudson.matrix.MatrixConfiguration;
import hudson.matrix.MatrixBuild;
import hudson.model.BuildListener;
import hudson.model.AbstractBuild;
import hudson.model.AbstractProject;
import java.io.IOException;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
/**
* Tests the various notification options (only parent, only configurations, both) for Matrix jobs.
*
* @author kutzi
*/
@SuppressWarnings("rawtypes")
public class MatrixNotificationTest {
private IMPublisher publisher;
private BuildListener listener;
private AbstractBuild configurationBuild;
private MatrixBuild parentBuild;
@Before
public void before() throws InterruptedException, IOException {
this.publisher = mock(IMPublisher.class);
when(publisher.prebuild(any(AbstractBuild.class), any(BuildListener.class))).thenCallRealMethod();
when(publisher.perform(any(AbstractBuild.class), any(Launcher.class), any(BuildListener.class))).thenCallRealMethod();
when(publisher.createAggregator(any(MatrixBuild.class), any(Launcher.class), any(BuildListener.class))).thenCallRealMethod();
when(publisher.getNotifyOnStart()).thenReturn(Boolean.TRUE);
Mockito.doNothing().when(publisher).notifyChatsOnBuildStart(any(AbstractBuild.class), any(BuildListener.class));
Mockito.doNothing().when(publisher).notifyOnBuildEnd(any(AbstractBuild.class), any(BuildListener.class));
this.listener = mock(BuildListener.class);
this.configurationBuild = mock(AbstractBuild.class);
AbstractProject project = mock(MatrixConfiguration.class);
when(configurationBuild.getParent()).thenReturn(project);
this.parentBuild = mock(MatrixBuild.class);
}
@Test
public void testOnlyParent() throws InterruptedException, IOException {
when(publisher.getMatrixNotifier()).thenReturn(MatrixJobMultiplier.ONLY_PARENT);
publisher.prebuild(configurationBuild, listener);
publisher.perform(configurationBuild, null, listener);
verify(publisher, times(0)).notifyChatsOnBuildStart(any(AbstractBuild.class), any(BuildListener.class));
verify(publisher, times(0)).notifyOnBuildEnd(any(AbstractBuild.class), any(BuildListener.class));
MatrixAggregator aggregator = publisher.createAggregator(parentBuild, null, listener);
aggregator.startBuild();
aggregator.endBuild();
verify(publisher).notifyChatsOnBuildStart(parentBuild, listener);
verify(publisher).notifyOnBuildEnd(parentBuild, listener);
}
@Test
public void testOnlyConfigurations() throws InterruptedException, IOException {
when(publisher.getMatrixNotifier()).thenReturn(MatrixJobMultiplier.ONLY_CONFIGURATIONS);
MatrixAggregator aggregator = publisher.createAggregator(parentBuild, null, listener);
aggregator.startBuild();
aggregator.endBuild();
verify(publisher, times(0)).notifyChatsOnBuildStart(parentBuild, listener);
verify(publisher, times(0)).notifyOnBuildEnd(parentBuild, listener);
publisher.prebuild(configurationBuild, listener);
publisher.perform(configurationBuild, null, listener);
verify(publisher).notifyChatsOnBuildStart(configurationBuild, listener);
verify(publisher).notifyOnBuildEnd(configurationBuild, listener);
}
@Test
public void testOnlyBoth() throws InterruptedException, IOException {
when(publisher.getMatrixNotifier()).thenReturn(MatrixJobMultiplier.ALL);
MatrixAggregator aggregator = publisher.createAggregator(parentBuild, null, listener);
aggregator.startBuild();
aggregator.endBuild();
verify(publisher).notifyChatsOnBuildStart(parentBuild, listener);
verify(publisher).notifyOnBuildEnd(parentBuild, listener);
publisher.prebuild(configurationBuild, listener);
publisher.perform(configurationBuild, null, listener);
verify(publisher).notifyChatsOnBuildStart(configurationBuild, listener);
verify(publisher).notifyOnBuildEnd(configurationBuild, listener);
}
}