1
0
mirror of https://github.com/SAP/jenkins-library.git synced 2024-12-14 11:03:09 +02:00
sap-jenkins-library/test/groovy/MTABuildTest.groovy
2017-11-10 16:30:52 +01:00

369 lines
11 KiB
Groovy

import hudson.AbortException
import org.jenkinsci.plugins.pipeline.utility.steps.shaded.org.yaml.snakeyaml.Yaml
import org.jenkinsci.plugins.pipeline.utility.steps.shaded.org.yaml.snakeyaml.parser.ParserException
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import com.lesfurets.jenkins.unit.BasePipelineTest
import org.junit.rules.ExpectedException
import org.junit.rules.TemporaryFolder
import static com.lesfurets.jenkins.unit.global.lib.LibraryConfiguration.library
import static ProjectSource.projectSource
public class MTABuildTest extends BasePipelineTest {
@Rule
public ExpectedException thrown = new ExpectedException()
@Rule
public TemporaryFolder tmp = new TemporaryFolder()
def shellCalls = []
def echoes = []
def currentDir
def otherDir
def pipeline
def mtaBuildShEnv
@Before
public void setup(){
super.setUp()
currentDir = tmp.newFolder().toURI().getPath()[0..-2] //omit final '/'
otherDir = tmp.newFolder().toURI().getPath()[0..-2] //omit final '/'
pipeline = "${tmp.newFolder("pipeline").toURI().getPath()}pipeline"
def piperLib = library()
.name('piper-library-os')
.retriever(projectSource())
.targetPath('clonePath/is/not/necessary')
.defaultVersion('<irrelevant>')
.allowOverride(true)
.implicit(false)
.build()
helper.registerSharedLibrary(piperLib)
helper.registerAllowedMethod('sh', [String], {s -> shellCalls.add(s)} )
helper.registerAllowedMethod('echo', [String], {s -> echoes.add(s)} )
helper.registerAllowedMethod('readYaml', [Map], {
m ->
return new Yaml().load((m.file as File).text)
})
helper.registerAllowedMethod("dir", [String, Closure], {
s, c ->
currentDir = "${currentDir}/${s}"
c()
})
helper.registerAllowedMethod('pwd', [], { currentDir } )
helper.registerAllowedMethod("withEnv", [List.class, Closure.class],
{ l, c ->
mtaBuildShEnv = l
c()
})
helper.registerAllowedMethod('error', [String], { s -> throw new hudson.AbortException(s) })
binding.setVariable('PATH', '/usr/bin')
binding.setVariable('JAVA_HOME', '/opt/java')
binding.setVariable('env', [:])
}
@Test
public void straightForwardTest(){
binding.getVariable('env')['MTA_JAR_LOCATION'] = '/opt/mta'
new File("${currentDir}/mta.yaml") << defaultMtaYaml()
defaultPipeline()
def script = loadScript(pipeline)
def mtarFilePath = script.execute()
assert shellCalls[0].startsWith('sed -ie \"s/\\\${timestamp}/`date +%Y%m%d%H%M%S`/g\" ')
assert shellCalls[0].endsWith('/mta.yaml')
assert shellCalls[1].contains("PATH=./node_modules/.bin:/usr/bin")
assert shellCalls[1].contains(' -jar /opt/mta/mta.jar --mtar ')
assert mtarFilePath == "${currentDir}/com.mycompany.northwind.mtar"
assert echoes[1] == "[mtaBuild] MTA JAR \"/opt/mta/mta.jar\" retrieved from environment."
}
@Test
public void mtarFilePathFromCommonPipelineEnviromentTest(){
binding.getVariable('env')['MTA_JAR_LOCATION'] = '/opt/mta'
new File("${currentDir}/mta.yaml") << defaultMtaYaml()
returnMtarFilePathFromCommonPipelineEnvironmentPipeline()
def script = loadScript(pipeline)
def mtarFilePath = script.execute()
assert shellCalls[0].startsWith('sed -ie \"s/\\\${timestamp}/`date +%Y%m%d%H%M%S`/g\" ')
assert shellCalls[0].endsWith('/mta.yaml')
assert shellCalls[1].contains("PATH=./node_modules/.bin:/usr/bin")
assert shellCalls[1].contains(' -jar /opt/mta/mta.jar --mtar ')
assert mtarFilePath == "${currentDir}/com.mycompany.northwind.mtar"
assert echoes[1] == "[mtaBuild] MTA JAR \"/opt/mta/mta.jar\" retrieved from environment."
}
@Test
public void mtaBuildWithSurroundingDirTest(){
binding.getVariable('env')['MTA_JAR_LOCATION'] = '/opt/mta'
def newDirName = 'newDir'
new File("${currentDir}/${newDirName}").mkdirs()
new File("${currentDir}/${newDirName}/mta.yaml") << defaultMtaYaml()
withSurroundingDirPipeline()
def script = loadScript(pipeline)
def mtarFilePath = script.execute(newDirName)
assert shellCalls[0].startsWith('sed -ie \"s/\\\${timestamp}/`date +%Y%m%d%H%M%S`/g\" ')
assert shellCalls[0].endsWith('/mta.yaml')
assert shellCalls[1].contains("PATH=./node_modules/.bin:/usr/bin")
assert shellCalls[1].contains(' -jar /opt/mta/mta.jar --mtar ')
assert mtarFilePath == "${currentDir}/com.mycompany.northwind.mtar"
assert echoes[1] == "[mtaBuild] MTA JAR \"/opt/mta/mta.jar\" retrieved from environment."
}
@Test
void mtaHomeNotSetTest() {
new File("${currentDir}/mta.yaml") << defaultMtaYaml()
defaultPipeline()
def script = loadScript(pipeline)
def mtarFilePath = script.execute()
assert shellCalls[0].startsWith('sed -ie \"s/\\\${timestamp}/`date +%Y%m%d%H%M%S`/g\" ')
assert shellCalls[0].endsWith('/mta.yaml')
assert shellCalls[1].contains("PATH=./node_modules/.bin:/usr/bin")
assert shellCalls[1].contains(' -jar mta.jar --mtar ')
assert mtarFilePath == "${currentDir}/com.mycompany.northwind.mtar"
assert echoes[1] == "[mtaBuild] Using MTA JAR from current working directory."
}
@Test
void mtaHomeAsParameterTest() {
new File("${currentDir}/mta.yaml") << defaultMtaYaml()
mtaJarLocationAsParameterPipeline()
def script = loadScript(pipeline)
def mtarFilePath = script.execute()
assert shellCalls[0].startsWith('sed -ie \"s/\\\${timestamp}/`date +%Y%m%d%H%M%S`/g\" ')
assert shellCalls[0].endsWith('/mta.yaml')
assert shellCalls[1].contains("PATH=./node_modules/.bin:/usr/bin")
assert shellCalls[1].contains(' -jar /etc/mta/mta.jar --mtar ')
assert mtarFilePath == "${currentDir}/com.mycompany.northwind.mtar"
assert echoes[1] == "[mtaBuild] MTA JAR \"/etc/mta/mta.jar\" retrieved from parameters."
}
@Test
public void noMtaPresentTest(){
thrown.expect(FileNotFoundException)
defaultPipeline()
def script = loadScript(pipeline)
script.execute()
}
@Test
public void badMtaTest(){
thrown.expect(ParserException)
thrown.expectMessage('while parsing a block mapping')
new File("${currentDir}/mta.yaml") << badMtaYaml()
defaultPipeline()
def script = loadScript(pipeline)
script.execute()
}
@Test
public void noIdInMtaTest(){
thrown.expect(AbortException)
thrown.expectMessage("Property 'ID' not found in mta.yaml file at: '")
new File("${currentDir}/mta.yaml") << noIdMtaYaml()
defaultPipeline()
def script = loadScript(pipeline)
script.execute()
}
@Test
public void noBuildTargetTest(){
thrown.expect(Exception)
thrown.expectMessage("ERROR - NO VALUE AVAILABLE FOR buildTarget")
new File("${currentDir}/mta.yaml") << defaultMtaYaml()
noBuildTargetPipeline()
def script = loadScript(pipeline)
script.execute()
}
private defaultPipeline(){
new File(pipeline) << '''
@Library('piper-library-os')
execute(){
mtaBuild buildTarget: 'NEO'
}
return this
'''
}
private returnMtarFilePathFromCommonPipelineEnvironmentPipeline(){
new File(pipeline) << '''
@Library('piper-library-os')
execute(){
mtaBuild buildTarget: 'NEO'
return commonPipelineEnvironment.getMtarFilePath()
}
return this
'''
}
private mtaJarLocationAsParameterPipeline(){
new File(pipeline) << '''
@Library('piper-library-os')
execute(){
mtaBuild mtaJarLocation: '/etc/mta', buildTarget: 'NEO'
}
return this
'''
}
private withSurroundingDirPipeline(){
new File(pipeline) << '''
@Library('piper-library-os')
execute(dirPath){
dir("${dirPath}"){
mtaBuild buildTarget: 'NEO'
}
}
return this
'''
}
private noBuildTargetPipeline(){
new File(pipeline) << '''
@Library('piper-library-os')
execute(){
mtaBuild()
}
return this
'''
}
private defaultMtaYaml(){
return '''
_schema-version: "2.0.0"
ID: "com.mycompany.northwind"
version: 1.0.0
parameters:
hcp-deployer-version: "1.0.0"
modules:
- name: "fiorinorthwind"
type: html5
path: .
parameters:
version: 1.0.0-${timestamp}
build-parameters:
builder: grunt
build-result: dist
'''
}
private badMtaYaml(){
return '''
_schema-version: "2.0.0
ID: "com.mycompany.northwind"
version: 1.0.0
parameters:
hcp-deployer-version: "1.0.0"
modules:
- name: "fiorinorthwind"
type: html5
path: .
parameters:
version: 1.0.0-${timestamp}
build-parameters:
builder: grunt
build-result: dist
'''
}
private noIdMtaYaml(){
return '''
_schema-version: "2.0.0"
version: 1.0.0
parameters:
hcp-deployer-version: "1.0.0"
modules:
- name: "fiorinorthwind"
type: html5
path: .
parameters:
version: 1.0.0-${timestamp}
build-parameters:
builder: grunt
build-result: dist
'''
}
}