diff --git a/plugin/src/main/java/io/jenkins/plugins/coverage/CoverageProcessor.java b/plugin/src/main/java/io/jenkins/plugins/coverage/CoverageProcessor.java index abf79b13c..6af073fc0 100644 --- a/plugin/src/main/java/io/jenkins/plugins/coverage/CoverageProcessor.java +++ b/plugin/src/main/java/io/jenkins/plugins/coverage/CoverageProcessor.java @@ -7,6 +7,8 @@ import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.io.PrintStream; +import java.math.BigDecimal; +import java.math.RoundingMode; import java.nio.file.Files; import java.nio.file.Paths; import java.util.ArrayList; @@ -249,13 +251,12 @@ private Optional getPreviousResult(final Run startSearch) return Optional.empty(); } - private void failBuildIfChangeRequestDecreasedCoverage(final CoverageResult coverageResult, final CoverageAction action) + void failBuildIfChangeRequestDecreasedCoverage(final CoverageResult coverageResult, final CoverageAction action) throws CoverageException { float coverageDiff = coverageResult.getCoverageDelta(CoverageElement.LINE); - if (coverageDiff < 0) { + if (roundFloat(coverageDiff,2) < 0) { String message = "Fail build because this change request decreases line coverage by " + coverageDiff; action.setFailMessage(message); - throw new CoverageException(message); } } @@ -731,4 +732,7 @@ public static CoverageResult recoverCoverageResult(final Run run) throws I return (CoverageResult) ois.readObject(); } } + static float roundFloat(final float number, final int scale) { + return BigDecimal.valueOf(number).setScale(scale,RoundingMode.DOWN).floatValue(); + } } diff --git a/plugin/src/test/java/io/jenkins/plugins/coverage/CoverageProcessorTest.java b/plugin/src/test/java/io/jenkins/plugins/coverage/CoverageProcessorTest.java new file mode 100644 index 000000000..7c07a849a --- /dev/null +++ b/plugin/src/test/java/io/jenkins/plugins/coverage/CoverageProcessorTest.java @@ -0,0 +1,63 @@ +package io.jenkins.plugins.coverage; + +import hudson.FilePath; +import hudson.model.Run; +import io.jenkins.plugins.coverage.exception.CoverageException; +import io.jenkins.plugins.coverage.targets.CoverageResult; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; + +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.Mockito.*; + +/** + * Acceptance tests for CoverageProcessor. Verifies if set options in CoverageProcessor are used and lead to accepted + * results. + */ +public class CoverageProcessorTest { + + CoverageProcessor coverageProcessor; + CoverageResult coverageResult; + CoverageAction coverageAction; + + @Before() + public void testInit(){ + coverageProcessor = new CoverageProcessor(mock(Run.class),mock(FilePath.class),null); + coverageResult =mock(CoverageResult.class); + coverageAction =mock(CoverageAction.class); + } + + /** + * Test roundFloat method in CoverageProcessor + */ + @Test + public void testFloatRounding() { + float number=-0.001f; + float scaledNumber= CoverageProcessor.roundFloat(number,2); + Assert.assertEquals(scaledNumber,0.00,0); + } + + @Test() + public void testChangeRequestDecreasedCoverageNotFailed_NoChange() throws CoverageException { + Mockito.when(coverageResult.getCoverageDelta(any())).thenReturn(-0.001f); + //No Exception should be thrown + coverageProcessor.failBuildIfChangeRequestDecreasedCoverage(coverageResult,coverageAction); + verify(coverageAction, times(0)).setFailMessage(any()); + } + + @Test(expected = CoverageException.class) + public void testChangeRequestDecreasedCoverageFailed_DecCoverage() throws CoverageException { + Mockito.when(coverageResult.getCoverageDelta(any())).thenReturn(-1.11f); + coverageProcessor.failBuildIfChangeRequestDecreasedCoverage(coverageResult,coverageAction); + verify(coverageAction, times(1)).setFailMessage(any()); + } + + @Test() + public void testChangeRequestDecreasedCoverageNotFailed_IncCoverage() throws CoverageException { + Mockito.when(coverageResult.getCoverageDelta(any())).thenReturn(0.1f); + coverageProcessor.failBuildIfChangeRequestDecreasedCoverage(coverageResult,coverageAction); + verify(coverageAction, times(0)).setFailMessage(any()); + } +}