2020-02-03 10:37:04 +02:00
import com.sap.piper.DebugReport
2020-03-18 09:32:28 +02:00
import hudson.AbortException
2018-12-12 12:45:11 +02:00
import org.junit.Before
import org.junit.Rule
import org.junit.Test
2020-03-18 09:32:28 +02:00
import org.junit.rules.ExpectedException
2018-12-12 12:45:11 +02:00
import org.junit.rules.RuleChain
import util.BasePiperTest
import util.JenkinsLoggingRule
import util.JenkinsReadYamlRule
import util.JenkinsStepRule
import util.Rules
import static org . hamcrest . CoreMatchers . containsString
2020-02-04 11:35:34 +02:00
import static org . hamcrest . Matchers . is
2020-03-31 12:51:34 +02:00
import static org . hamcrest . Matchers . not
2018-12-12 12:45:11 +02:00
import static org . junit . Assert . assertThat
class PiperStageWrapperTest extends BasePiperTest {
2020-03-18 09:32:28 +02:00
private ExpectedException thrown = ExpectedException . none ( )
2019-01-22 10:22:15 +02:00
private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule ( this )
2019-01-22 10:25:42 +02:00
private JenkinsStepRule stepRule = new JenkinsStepRule ( this )
2018-12-12 12:45:11 +02:00
private Map lockMap = [ : ]
private int countNodeUsage = 0
private String nodeLabel = ''
@Rule
public RuleChain rules = Rules
. getCommonRules ( this )
2020-03-18 09:32:28 +02:00
. around ( thrown )
2018-12-12 12:45:11 +02:00
. around ( new JenkinsReadYamlRule ( this ) )
2019-01-22 10:22:15 +02:00
. around ( loggingRule )
2019-01-22 10:25:42 +02:00
. around ( stepRule )
2018-12-12 12:45:11 +02:00
@Before
void init ( ) throws Exception {
helper . registerAllowedMethod ( 'deleteDir' , [ ] , { return null } )
helper . registerAllowedMethod ( 'lock' , [ Map . class , Closure . class ] , { m , body - >
assertThat ( m . resource . toString ( ) , containsString ( '/10' ) )
lockMap = m
body ( )
} )
helper . registerAllowedMethod ( 'milestone' , [ Integer . class ] , { ordinal - >
assertThat ( ordinal , is ( 10 ) )
} )
helper . registerAllowedMethod ( 'node' , [ String . class , Closure . class ] , { s , body - >
nodeLabel = s
countNodeUsage + +
body ( )
} )
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - >
return false
} )
}
@Test
void testDefault ( ) {
2019-01-14 11:25:47 +02:00
def executed = false
2019-01-22 10:25:42 +02:00
stepRule . step . piperStageWrapper (
2018-12-12 12:45:11 +02:00
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test'
) {
2019-01-14 11:25:47 +02:00
executed = true
2018-12-12 12:45:11 +02:00
}
2019-01-14 11:25:47 +02:00
assertThat ( executed , is ( true ) )
2018-12-12 12:45:11 +02:00
assertThat ( lockMap . size ( ) , is ( 2 ) )
assertThat ( countNodeUsage , is ( 1 ) )
}
@Test
void testNoLocking ( ) {
2019-01-14 11:25:47 +02:00
def executed = false
2019-01-22 10:25:42 +02:00
stepRule . step . piperStageWrapper (
2018-12-12 12:45:11 +02:00
script: nullScript ,
juStabUtils: utils ,
nodeLabel: 'testLabel' ,
ordinal: 10 ,
stageLocking: false ,
stageName: 'test'
) {
2019-01-14 11:25:47 +02:00
executed = true
2018-12-12 12:45:11 +02:00
}
2019-01-14 11:25:47 +02:00
assertThat ( executed , is ( true ) )
2018-12-12 12:45:11 +02:00
assertThat ( lockMap . size ( ) , is ( 0 ) )
assertThat ( countNodeUsage , is ( 1 ) )
assertThat ( nodeLabel , is ( 'testLabel' ) )
}
@Test
void testStageExit ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - >
return ( s = = '.pipeline/extensions/test.groovy' )
} )
helper . registerAllowedMethod ( 'load' , [ String . class ] , {
return helper . loadScript ( 'test/resources/stages/test.groovy' )
} )
2019-01-14 11:25:47 +02:00
nullScript . commonPipelineEnvironment . gitBranch = 'testBranch'
2018-12-12 12:45:11 +02:00
2019-01-14 11:25:47 +02:00
def executed = false
2019-01-22 10:25:42 +02:00
stepRule . step . piperStageWrapper (
2018-12-12 12:45:11 +02:00
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test'
) {
2019-01-14 11:25:47 +02:00
executed = true
2018-12-12 12:45:11 +02:00
}
2019-01-14 11:25:47 +02:00
assertThat ( executed , is ( true ) )
2019-01-22 10:22:15 +02:00
assertThat ( loggingRule . log , containsString ( '[piperStageWrapper] Running project interceptor \'.pipeline/extensions/test.groovy\' for test.' ) )
assertThat ( loggingRule . log , containsString ( 'Stage Name: test' ) )
2019-02-05 16:37:59 +02:00
assertThat ( loggingRule . log , containsString ( 'Config: [' ) )
2019-01-22 10:22:15 +02:00
assertThat ( loggingRule . log , containsString ( 'testBranch' ) )
2018-12-12 12:45:11 +02:00
}
2020-02-03 12:34:31 +02:00
@Test
void testGlobalOverwritingExtension ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { s - >
return ( s = = 'test_global_overwriting.groovy' )
} )
helper . registerAllowedMethod ( 'load' , [ String . class ] , {
return helper . loadScript ( 'test/resources/stages/test_global_overwriting.groovy' )
} )
nullScript . commonPipelineEnvironment . gitBranch = 'testBranch'
def executed = false
stepRule . step . piperStageWrapper (
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test_global_overwriting'
) {
executed = true
}
assertThat ( executed , is ( false ) )
assertThat ( loggingRule . log , containsString ( 'Stage Name: test_global_overwriting' ) )
assertThat ( loggingRule . log , containsString ( 'Config: [' ) )
assertThat ( loggingRule . log , containsString ( 'testBranch' ) )
assertThat ( loggingRule . log , containsString ( 'Not calling test_global_overwriting' ) )
assertThat ( DebugReport . instance . globalExtensions . test_global_overwriting , is ( 'Overwrites' ) )
}
2020-01-20 16:50:22 +02:00
@Test
void testStageOldInterceptor ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { path - >
return ( path = = '.pipeline/extensions/test_old_extension.groovy' )
} )
helper . registerAllowedMethod ( 'load' , [ String . class ] , {
return helper . loadScript ( 'test/resources/stages/test_old_extension.groovy' )
} )
nullScript . commonPipelineEnvironment . gitBranch = 'testBranch'
def executed = false
stepRule . step . piperStageWrapper (
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test_old_extension'
) {
executed = true
}
assertThat ( executed , is ( true ) )
assertThat ( loggingRule . log , containsString ( '[piperStageWrapper] Running project interceptor \'.pipeline/extensions/test_old_extension.groovy\' for test_old_extension.' ) )
assertThat ( loggingRule . log , containsString ( '[Warning] The interface to implement extensions has changed.' ) )
assertThat ( loggingRule . log , containsString ( 'Stage Name: test_old_extension' ) )
assertThat ( loggingRule . log , containsString ( 'Config: [' ) )
assertThat ( loggingRule . log , containsString ( 'testBranch' ) )
2020-02-03 10:37:04 +02:00
assertThat ( DebugReport . instance . localExtensions . test_old_extension , is ( 'Extends' ) )
2020-01-20 16:50:22 +02:00
}
2020-02-04 11:35:34 +02:00
2020-03-31 12:51:34 +02:00
@Test
void testExtensionDeactivation ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { path - >
return ( path = = '.pipeline/extensions/test_old_extension.groovy' )
} )
helper . registerAllowedMethod ( 'load' , [ String . class ] , {
return helper . loadScript ( 'test/resources/stages/test_old_extension.groovy' )
} )
nullScript . commonPipelineEnvironment . gitBranch = 'testBranch'
binding . setVariable ( 'env' , [ PIPER_DISABLE_EXTENSIONS: 'true' ] )
stepRule . step . piperStageWrapper (
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test_old_extension'
) { }
//setting above parameter to 'true' bypasses the below message
assertThat ( loggingRule . log , not ( containsString ( "[piperStageWrapper] Running project interceptor '.pipeline/extensions/test_old_extension.groovy' for test_old_extension." ) ) )
}
2020-03-18 09:32:28 +02:00
@Test
void testPipelineResilienceMandatoryStep ( ) {
thrown . expectMessage ( 'expected error' )
nullScript . commonPipelineEnvironment . configuration = [ general: [ failOnError: false ] ]
stepRule . step . piperStageWrapper ( script: nullScript , stageLocking: false , stageName: 'testStage' , juStabUtils: utils ) {
throw new AbortException ( 'expected error' )
}
}
2020-02-04 11:35:34 +02:00
@Test
void testStageCrashesInExtension ( ) {
helper . registerAllowedMethod ( 'fileExists' , [ String . class ] , { path - >
return ( path = = 'test_crashing_extension.groovy' )
} )
helper . registerAllowedMethod ( 'load' , [ String . class ] , {
return helper . loadScript ( 'test/resources/stages/test_crashing_extension.groovy' )
} )
Throwable caught = null
def executed = false
try {
stepRule . step . piperStageWrapper (
script: nullScript ,
juStabUtils: utils ,
ordinal: 10 ,
stageName: 'test_crashing_extension'
) {
executed = true
}
} catch ( Throwable t ) {
caught = t
}
assertThat ( executed , is ( true ) )
assertThat ( loggingRule . log , containsString ( '[piperStageWrapper] Found global interceptor \'test_crashing_extension.groovy\' for test_crashing_extension.' ) )
assertThat ( DebugReport . instance . failedBuild . step , is ( 'test_crashing_extension' ) )
assertThat ( DebugReport . instance . failedBuild . fatal , is ( 'true' ) )
assertThat ( DebugReport . instance . failedBuild . reason , is ( caught ) )
}
2020-01-20 16:50:22 +02:00
}