package hudson.plugins.cigame.rules.plugins.violation; import static org.junit.Assert.*; import static org.mockito.Mockito.*; import static org.hamcrest.Matchers.*; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.Map; import hudson.model.AbstractBuild; import hudson.model.Result; import hudson.plugins.cigame.model.RuleResult; import hudson.plugins.violations.TypeSummary; import hudson.plugins.violations.ViolationsBuildAction; import hudson.plugins.violations.ViolationsReport; import hudson.plugins.violations.ViolationsReport.TypeReport; import org.junit.Test; import org.jvnet.hudson.test.Bug; @SuppressWarnings("unchecked") public class DefaultViolationRuleTest { @Test public void assertFailedBuildsIsWorthZeroPoints() { AbstractBuild build = mock(AbstractBuild.class); when(build.getResult()).thenReturn(Result.FAILURE); DefaultViolationRule rule = new DefaultViolationRule("pmd", "PMD Violations", 100, -100); RuleResult ruleResult = rule.evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be zero", ruleResult.getPoints(), is((double) 0)); } /** * Asserts that the issue 1884 is fixed. * https://hudson.dev.java.net/issues/show_bug.cgi?id=1884 */ @Test public void assertIssue1884IsFixed() { final ViolationsReport previousReport = createViolationsReportStub("pmd", 200, null); final ViolationsReport currentReport = createViolationsReportStub("pmd", 100, previousReport); final ArrayList<ViolationsBuildAction> actionList = new ArrayList<ViolationsBuildAction>(); actionList.add(new ViolationsBuildAction(null, currentReport)); AbstractBuild build = mock(AbstractBuild.class); AbstractBuild previousBuild = mock(AbstractBuild.class); when(build.getResult()).thenReturn(Result.FAILURE); when(build.getPreviousBuild()).thenReturn(previousBuild); when(build.getActions(ViolationsBuildAction.class)).thenReturn(actionList); DefaultViolationRule rule = new DefaultViolationRule("pmd", "PMD Violations", 100, -100); RuleResult ruleResult = rule.evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be zero", ruleResult.getPoints(), is((double) 0)); } @Test public void assertNoPreviousBuildIsWorthZeroPoints() { AbstractBuild build = mock(AbstractBuild.class); when(build.getResult()).thenReturn(Result.SUCCESS); when(build.getPreviousBuild()).thenReturn(null); DefaultViolationRule rule = new DefaultViolationRule("pmd", "PMD Violations", 100, -100); RuleResult ruleResult = rule.evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be zero", ruleResult.getPoints(), is((double) 0)); } @Test public void assertThatPointsAreAwardedCorrectly() { AbstractBuild build = mock(AbstractBuild.class); AbstractBuild previousBuild = mock(AbstractBuild.class); when(build.getPreviousBuild()).thenReturn(previousBuild); when(build.getResult()).thenReturn(Result.SUCCESS); when(previousBuild.getResult()).thenReturn(Result.SUCCESS); ViolationsBuildAction previousAction = mock(ViolationsBuildAction.class); ViolationsReport previousReport = createViolationsReportStub("pmd", 50, null); when(previousBuild.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(previousAction)); when(previousAction.getReport()).thenReturn(previousReport); ViolationsBuildAction currentAction = mock(ViolationsBuildAction.class); ViolationsReport currentReport = createViolationsReportStub("pmd", 100, previousReport); when(build.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(currentAction)); when(currentAction.getReport()).thenReturn(currentReport); RuleResult ruleResult = new DefaultViolationRule("pmd", "PMD violations", 100, -100).evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be 5000", ruleResult.getPoints(), is(5000d)); } @Test public void assertIfPreviousBuildFailedResultIsWorthZeroPoints() { AbstractBuild build = mock(AbstractBuild.class); AbstractBuild previousBuild = mock(AbstractBuild.class); when(build.getPreviousBuild()).thenReturn(previousBuild); when(build.getResult()).thenReturn(Result.SUCCESS); when(previousBuild.getResult()).thenReturn(Result.FAILURE); ViolationsBuildAction action = mock(ViolationsBuildAction.class); when(build.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(action)); ViolationsReport previousReport = createViolationsReportStub("pmd", 10, null); ViolationsReport currentReport = createViolationsReportStub("pmd", 100, previousReport); when(action.getReport()).thenReturn(currentReport); RuleResult ruleResult = new DefaultViolationRule("pmd", "PMD violations", 100, -100).evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be 0", ruleResult.getPoints(), is(0d)); } @Bug(3726) @Test public void assertThatNonExistingPreviousReportsAreIgnored() { AbstractBuild build = mock(AbstractBuild.class); AbstractBuild previousBuild = mock(AbstractBuild.class); when(build.getPreviousBuild()).thenReturn(previousBuild); when(build.getResult()).thenReturn(Result.SUCCESS); when(previousBuild.getResult()).thenReturn(Result.SUCCESS); ViolationsBuildAction previousAction = mock(ViolationsBuildAction.class); ViolationsReport previousReport = createViolationsReportStub("cpd", 10, null); when(previousBuild.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(previousAction)); when(previousAction.getReport()).thenReturn(previousReport); ViolationsBuildAction currentAction = mock(ViolationsBuildAction.class); ViolationsReport currentReport = createViolationsReportStub("pmd", 100, previousReport); when(build.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(currentAction)); when(currentAction.getReport()).thenReturn(currentReport); RuleResult ruleResult = new DefaultViolationRule("pmd", "PMD violations", 100, -100).evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be 0", ruleResult.getPoints(), is(0d)); } @Bug(3726) @Test public void assertThatPreviousReportsWithErrorIsIgnored() { AbstractBuild build = mock(AbstractBuild.class); AbstractBuild previousBuild = mock(AbstractBuild.class); when(build.getPreviousBuild()).thenReturn(previousBuild); when(build.getResult()).thenReturn(Result.SUCCESS); when(previousBuild.getResult()).thenReturn(Result.SUCCESS); ViolationsBuildAction previousAction = mock(ViolationsBuildAction.class); ViolationsReport previousReport = createViolationsReportStub("pmd", 50, null); when(previousBuild.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(previousAction)); when(previousAction.getReport()).thenReturn(previousReport); previousReport.getTypeSummary("pmd").setErrorMessage("an error message"); ViolationsBuildAction currentAction = mock(ViolationsBuildAction.class); ViolationsReport currentReport = createViolationsReportStub("pmd", 100, previousReport); when(build.getActions(ViolationsBuildAction.class)).thenReturn(Arrays.asList(currentAction)); when(currentAction.getReport()).thenReturn(currentReport); RuleResult ruleResult = new DefaultViolationRule("pmd", "PMD violations", 100, -100).evaluate(build); assertNotNull("Rule result must not be null", ruleResult); assertThat("Points should be 0", ruleResult.getPoints(), is(0d)); } /** * Creates a violation report stub with one TypeReport containing the method params * @param type type in the report * @param number the number of violations * @param previous if there is a previous report to be returned by report.getPrevious(); * @return mocked ViolationsReport */ private ViolationsReport createViolationsReportStub(final String type, int number, final ViolationsReport previous) { ViolationsReport report = mock(ViolationsReport.class); TypeSummary typeSummary = new TypeSummary(); TypeReport typeReport = report.new TypeReport(type, null, number); Map<String, TypeReport> typeReports = new HashMap<String, TypeReport>(); typeReports.put(type, typeReport); when(report.getTypeSummary(type)).thenReturn(typeSummary); when(report.getTypeReports()).thenReturn(typeReports); when(report.typeCount(type)).thenReturn(number); if (previous != null) { when(report.previous()).thenReturn(previous); } return report; } }