1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-12 10:55:20 +02:00
sap-jenkins-library/test/groovy/HandlePipelineStepErrorsTest.groovy
2020-02-03 12:37:20 +01:00

198 lines
6.6 KiB
Groovy

import com.sap.piper.DebugReport
import hudson.AbortException
import static org.hamcrest.Matchers.is
import static org.hamcrest.Matchers.not
import static org.hamcrest.Matchers.containsString
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import static org.junit.Assert.assertThat
import util.BasePiperTest
import util.JenkinsLoggingRule
import util.JenkinsReadYamlRule
import util.JenkinsStepRule
import util.Rules
class HandlePipelineStepErrorsTest extends BasePiperTest {
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
private ExpectedException thrown = ExpectedException.none()
@Rule
public RuleChain rules = Rules
.getCommonRules(this)
.around(new JenkinsReadYamlRule(this))
.around(loggingRule)
.around(stepRule)
.around(thrown)
@Test
void testBeginAndEndMessage() {
def isExecuted
stepRule.step.handlePipelineStepErrors([
stepName: 'testStep',
stepParameters: ['something': 'anything']
]) {
isExecuted = true
}
// asserts
assertThat(isExecuted, is(true))
assertThat(loggingRule.log, containsString('--- Begin library step of: testStep'))
assertThat(loggingRule.log, containsString('--- End library step of: testStep'))
}
@Test
void testNonVerbose() {
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'testStep',
stepParameters: ['something': 'anything'],
echoDetails: false
]) {
throw new Exception('TestError')
}
} catch (ignore) {
} finally {
// asserts
assertThat(loggingRule.log, not(containsString('--- Begin library step of: testStep')))
assertThat(loggingRule.log, not(containsString('--- End library step: testStep')))
assertThat(loggingRule.log, not(containsString('--- An error occurred in the library step: testStep')))
}
}
@Test
void testErrorsMessage() {
def isReported
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'testStep',
stepParameters: ['something': 'anything']
]) {
throw new Exception('TestError')
}
} catch (ignore) {
isReported = true
} finally {
// asserts
assertThat(isReported, is(true))
assertThat(loggingRule.log, containsString('--- An error occurred in the library step: testStep'))
assertThat(loggingRule.log, containsString('to show step parameters, set verbose:true'))
}
}
@Test
void testHandleErrorsIgnoreFailure() {
def errorOccured = false
helper.registerAllowedMethod('unstable', [String.class], {s ->
nullScript.currentBuild.result = 'UNSTABLE'
})
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'test',
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
failOnError: false
]) {
throw new AbortException('TestError')
}
} catch (err) {
errorOccured = true
}
assertThat(errorOccured, is(false))
assertThat(nullScript.currentBuild.result, is('UNSTABLE'))
}
@Test
void testHandleErrorsIgnoreFailureBlacklist() {
def errorOccured = false
//define blacklist in defaults
helper.registerAllowedMethod("readYaml", [Map], { Map m ->
return [steps: [handlePipelineStepErrors: [mandatorySteps: ['step1', 'test']]]]
})
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'test',
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
failOnError: false
]) {
throw new AbortException('TestError')
}
} catch (err) {
errorOccured = true
}
assertThat(errorOccured, is(true))
}
@Test
void testHandleErrorsIgnoreFailureNoScript() {
def errorOccured = false
helper.registerAllowedMethod('unstable', [String.class], {s ->
//test behavior in case plugina are not yet up to date
throw new java.lang.NoSuchMethodError('No such DSL method \'unstable\' found')
})
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'test',
stepParameters: [jenkinsUtilsStub: jenkinsUtils],
failOnError: false
]) {
throw new AbortException('TestError')
}
} catch (err) {
errorOccured = true
}
assertThat(errorOccured, is(false))
}
@Test
void testHandleErrorsTimeout() {
def timeout = 0
helper.registerAllowedMethod('timeout', [Map.class, Closure.class], {m, body ->
timeout = m.time
throw new org.jenkinsci.plugins.workflow.steps.FlowInterruptedException(hudson.model.Result.ABORTED, new jenkins.model.CauseOfInterruption.UserInterruption('Test'))
})
String errorMsg
helper.registerAllowedMethod('unstable', [String.class], {s ->
nullScript.currentBuild.result = 'UNSTABLE'
errorMsg = s
})
stepRule.step.handlePipelineStepErrors([
stepName: 'test',
stepParameters: [jenkinsUtilsStub: jenkinsUtils, script: nullScript],
failOnError: false,
stepTimeouts: [test: 10]
]) {
//do something
}
assertThat(timeout, is(10))
assertThat(nullScript.currentBuild.result, is('UNSTABLE'))
assertThat(errorMsg, is('[handlePipelineStepErrors] Error in step test - Build result set to \'UNSTABLE\''))
}
@Test
void testFeedDebugReport() {
Exception err = new Exception('TestError')
try {
stepRule.step.handlePipelineStepErrors([
stepName: 'testStep',
stepParameters: ['something': 'anything'],
]) {
throw err
}
} catch (ignore) {
} finally {
// asserts
assertThat(DebugReport.instance.failedBuild.step, is('testStep'))
assertThat(DebugReport.instance.failedBuild.fatal, is('true'))
assertThat(DebugReport.instance.failedBuild.reason, is(err))
}
}
}