package com.sonyericsson.jenkins.plugins.bfa;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCause;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseBuildAction;
import com.sonyericsson.jenkins.plugins.bfa.model.FailureCauseDisplayData;
import com.sonyericsson.jenkins.plugins.bfa.model.FoundFailureCause;
import hudson.model.Job;
import hudson.model.Run;
import jenkins.model.Jenkins;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.powermock.api.mockito.PowerMockito;
import org.powermock.core.classloader.annotations.PrepareForTest;
import org.powermock.modules.junit4.PowerMockRunner;
import java.util.ArrayList;
import java.util.List;
/**
* Tests for the GerritMessageProviderExtensionTest.
* @author Alexander Akbashev mr.akbashev@gmail.com
* @throws Exception if so.
*/
@RunWith(PowerMockRunner.class)
@PrepareForTest({PluginImpl.class, Jenkins.class })
public class GerritMessageProviderExtensionTest {
private static final String JENKINS_URL = "http://some.jenkins.com";
private static final String BUILD_URL = "jobs/build/123";
private static final String NO_CAUSES_MSG = "FEEL_FREE_TO_PUT_WHAT_EVER_YOU_WANT";
/**
* Initialize basic stuff: Jenkins, PluginImpl, etc.
*/
@Before
public void setUp() {
PowerMockito.mockStatic(Jenkins.class);
Jenkins jenkins = PowerMockito.mock(Jenkins.class);
PowerMockito.when(Jenkins.getInstance()).thenReturn(jenkins);
PowerMockito.when(jenkins.getRootUrl()).thenReturn(JENKINS_URL);
PowerMockito.mockStatic(PluginImpl.class);
PluginImpl plugin = PowerMockito.mock(PluginImpl.class);
PowerMockito.when(plugin.isGerritTriggerEnabled()).thenReturn(true);
PowerMockito.when(PluginImpl.getInstance()).thenReturn(plugin);
PowerMockito.when(plugin.getNoCausesMessage()).thenReturn(NO_CAUSES_MSG);
}
/**
*
* Creates run with desired failure cause
*
* @param cause failure cause that would be displayed.
* @return Run with desired failure cause.
*/
private Run getRunWithTopCause(String cause) {
Run run = PowerMockito.mock(Run.class);
Job parent = PowerMockito.mock(Job.class);
FailureCauseBuildAction action = PowerMockito.mock(FailureCauseBuildAction.class);
List<FoundFailureCause> failureCauses = new ArrayList<FoundFailureCause>();
final FailureCauseDisplayData displayData = new FailureCauseDisplayData("parentURL", "parentName",
"/jobs/build/123", "buildName");
displayData.setFoundFailureCauses(failureCauses);
if (cause != null) {
failureCauses.add(new FoundFailureCause(new FailureCause("testName", cause)));
}
PowerMockito.when(run.getAction(FailureCauseBuildAction.class)).thenReturn(action);
PowerMockito.when(run.getUrl()).thenReturn(BUILD_URL);
PowerMockito.when(run.getParent()).thenReturn(parent);
PowerMockito.when(action.getBuild()).thenReturn(run);
PowerMockito.when(action.getFailureCauseDisplayData()).thenReturn(displayData);
return run;
}
/**
*
* Creates run with desired failure cause on third level
*
* @param cause failure cause that would be displayed.
* @return Run with desired failure cause in third level.
*/
private Run getRunWithDeepCause(String cause) {
Run run = PowerMockito.mock(Run.class);
Job parent = PowerMockito.mock(Job.class);
FailureCauseBuildAction action = PowerMockito.mock(FailureCauseBuildAction.class);
List<FoundFailureCause> emptyFailureCauses = new ArrayList<FoundFailureCause>();
List<FoundFailureCause> failureCauses = new ArrayList<FoundFailureCause>();
failureCauses.add(new FoundFailureCause(new FailureCause("testName", cause)));
FailureCauseDisplayData bottomDisplayData = new FailureCauseDisplayData("parentURL", "bottomBuildName",
"/jobs/build/789", "bottomBuildName");
bottomDisplayData.setFoundFailureCauses(failureCauses);
FailureCauseDisplayData middleDisplayData = new FailureCauseDisplayData("parentURL", "middleBuildName",
"/jobs/build/456", "middleBuildName");
middleDisplayData.setFoundFailureCauses(emptyFailureCauses);
middleDisplayData.addDownstreamFailureCause(bottomDisplayData);
FailureCauseDisplayData topLevelDisplayData = new FailureCauseDisplayData("topParentURL", "topParentName",
"/jobs/build/123", "topBuildName");
topLevelDisplayData.setFoundFailureCauses(emptyFailureCauses);
topLevelDisplayData.addDownstreamFailureCause(middleDisplayData);
PowerMockito.when(run.getAction(FailureCauseBuildAction.class)).thenReturn(action);
PowerMockito.when(run.getUrl()).thenReturn(BUILD_URL);
PowerMockito.when(run.getParent()).thenReturn(parent);
PowerMockito.when(action.getBuild()).thenReturn(run);
PowerMockito.when(action.getFailureCauseDisplayData()).thenReturn(topLevelDisplayData);
return run;
}
/**
* Test that single quote would be escaped.
*/
@Test
public void testSingleQuote() {
Run run = getRunWithTopCause("it's a single quote");
GerritMessageProviderExtension extension = new GerritMessageProviderExtension();
Assert.assertEquals("it\"s a single quote ( http://some.jenkins.com/jobs/build/123 )",
extension.getBuildCompletedMessage(run));
}
/**
* Test that multiple quotes would be escaped.
*/
@Test
public void testMultipleQuotes() {
Run run = getRunWithTopCause("q'u'o't'e's");
GerritMessageProviderExtension extension = new GerritMessageProviderExtension();
Assert.assertEquals("q\"u\"o\"t\"e\"s ( http://some.jenkins.com/jobs/build/123 )",
extension.getBuildCompletedMessage(run));
}
/**
* Test that message from top build would be displayed.
*/
@Test
public void testTopCause() {
Run run = getRunWithTopCause("some cause");
GerritMessageProviderExtension extension = new GerritMessageProviderExtension();
Assert.assertEquals("some cause ( http://some.jenkins.com/jobs/build/123 )",
extension.getBuildCompletedMessage(run));
}
/**
* Test that message from nested build would be displayed.
*/
@Test
public void testDeepCause() {
Run run = getRunWithDeepCause("deep cause");
GerritMessageProviderExtension extension = new GerritMessageProviderExtension();
Assert.assertEquals("deep cause ( http://some.jenkins.com/jobs/build/789 )",
extension.getBuildCompletedMessage(run));
}
/**
* Test that even if there no causes messages will be created.
*/
@Test
public void testNoCause() {
Run run = getRunWithTopCause(null);
GerritMessageProviderExtension extension = new GerritMessageProviderExtension();
Assert.assertEquals(NO_CAUSES_MSG + " ( http://some.jenkins.com/jobs/build/123 )",
extension.getBuildCompletedMessage(run));
}
}