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/BuildExecuteTest.groovy
Marcus Holl 9d27e0e7b2
cnbBuild triggered by buildExecute (#4498)
* Add cnbBuild to buildExecute

* Error message change

* Make if check simpler

Co-authored-by: Alexander Link <33052602+alxsap@users.noreply.github.com>

* Switch order of check

---------

Co-authored-by: Linda Siebert <linda.siebert@sap.com>
Co-authored-by: Linda Siebert <39100394+LindaSieb@users.noreply.github.com>
Co-authored-by: Alexander Link <33052602+alxsap@users.noreply.github.com>
2023-09-07 11:14:04 +02:00

443 lines
14 KiB
Groovy

#!groovy
import org.junit.After
import org.junit.Before
import org.junit.Rule
import org.junit.Test
import org.junit.rules.ExpectedException
import org.junit.rules.RuleChain
import util.BasePiperTest
import util.JenkinsDockerExecuteRule
import util.JenkinsReadYamlRule
import util.JenkinsShellCallRule
import util.JenkinsStepRule
import util.Rules
import com.sap.piper.Utils
import static org.hamcrest.CoreMatchers.containsString
import static org.hamcrest.CoreMatchers.hasItem
import static org.hamcrest.CoreMatchers.is
import static org.hamcrest.CoreMatchers.nullValue
import static org.junit.Assert.assertEquals
import static org.junit.Assert.assertFalse
import static org.junit.Assert.assertNotNull
import static org.junit.Assert.assertThat
import static org.junit.Assert.assertTrue
import static org.junit.Assert.fail
class BuildExecuteTest extends BasePiperTest {
private ExpectedException exception = ExpectedException.none()
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
private JenkinsDockerExecuteRule dockerRule = new JenkinsDockerExecuteRule(this)
private JenkinsShellCallRule shellCallRule = new JenkinsShellCallRule(this)
@Rule
public RuleChain rules = Rules
.getCommonRules(this)
.around(new JenkinsReadYamlRule(this))
.around(exception)
.around(shellCallRule)
.around(dockerRule)
.around(stepRule)
def dockerMockArgs = [:]
class DockerMock {
DockerMock(name) {
dockerMockArgs.name = name
}
def build(image, options) {
return [image: image, options: options]
}
}
@Before
void init() {
Utils.metaClass.echo = { def m -> }
}
@After
public void tearDown() {
Utils.metaClass = null
}
@Test
void testDefaultError() {
exception.expectMessage(containsString('buildTool not set and no dockerImage & dockerCommand provided'))
stepRule.step.buildExecute(
script: nullScript,
)
}
@Test
void testDefaultWithDockerImage() {
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertThat(dockerRule.dockerParams.dockerImage, is('path/to/myImage:tag'))
assertThat(shellCallRule.shell, hasItem('myTestCommand'))
}
@Test
void inferBuildToolMaven() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "pom.xml"
})
helper.registerAllowedMethod('mavenBuild', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('maven', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void inferBuildToolNpm() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('npm', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void inferBuildToolMTA() {
boolean buildToolCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "mta.yaml"
})
helper.registerAllowedMethod('mtaBuild', [Map.class], { m ->
buildToolCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
)
assertNotNull(nullScript.commonPipelineEnvironment.getBuildTool())
assertEquals('mta', nullScript.commonPipelineEnvironment.getBuildTool())
assertTrue(buildToolCalled)
}
@Test
void 'Do not infer build tool, do not set build tool, with docker dockerImage and dockerCommand, should run docker'() {
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
fail("Called npmExecuteScripts which should not happen when no buildTool was defined but dockerImage and dockerCommand were.")
})
// Does nothing because feature toggle is not active
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: false])
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertThat(dockerRule.dockerParams.dockerImage, is('path/to/myImage:tag'))
assertThat(shellCallRule.shell, hasItem('myTestCommand'))
}
@Test
void 'Do infer build tool, do not set build tool, with docker dockerImage and dockerCommand, should run npm'() {
boolean npmCalled = false
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == "package.json"
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
npmCalled = true
return
})
setupCommonPipelineEnvironment.inferBuildTool(nullScript, [inferBuildTool: true])
stepRule.step.buildExecute(
script: nullScript,
dockerImage: 'path/to/myImage:tag',
dockerCommand: 'myTestCommand'
)
assertTrue(npmCalled)
assertEquals(0, shellCallRule.shell.size())
}
@Test
void testMaven() {
boolean buildToolCalled = false
boolean installOptionSet = false
helper.registerAllowedMethod('mavenBuild', [Map.class], { m ->
buildToolCalled = true
return
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
installOptionSet = m['install']
return
})
helper.registerAllowedMethod('fileExists', [String.class], { s ->
return s == 'package.json'
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'maven',
)
assertTrue(buildToolCalled)
assertTrue(installOptionSet)
}
@Test
void testMta() {
def buildToolCalled = false
helper.registerAllowedMethod('mtaBuild', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'mta',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testNpm() {
def buildToolCalled = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testNpmWithScripts() {
boolean actualValue = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = (m['runScripts'][0] == 'foo' && m['runScripts'][1] == 'bar')
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmRunScripts: ['foo', 'bar']
)
assertTrue(actualValue)
}
@Test
void testNpmWithInstallFalse() {
boolean actualValue = true
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = m['install']
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmInstall: false
)
assertFalse(actualValue)
}
@Test
void testNpmWithInstallTrue() {
boolean actualValue = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
actualValue = m['install']
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
npmInstall: true
)
assertTrue(actualValue)
}
@Test
void testDocker() {
boolean buildToolCalled = false
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testDockerWithoutCNB() {
boolean kanikoExecuteCalled = false
boolean cnbBuildCalled = false
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
kanikoExecuteCalled = true
return
})
helper.registerAllowedMethod('cnbBuild', [Map.class], { m ->
cnbBuildCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
)
assertThat(cnbBuildCalled, is(false))
assertThat(kanikoExecuteCalled, is(true))
}
@Test
void testDockerWithCNB() {
boolean kanikoExecuteCalled = false
boolean cnbBuildCalled = false
binding.setVariable('docker', new DockerMock('test'))
def pushParams = [:]
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
kanikoExecuteCalled = true
return
})
helper.registerAllowedMethod('cnbBuild', [Map.class], { m ->
cnbBuildCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'docker',
cnbBuild: true
)
assertThat(cnbBuildCalled, is(true))
assertThat(kanikoExecuteCalled, is(false))
}
@Test
void testKaniko() {
binding.setVariable('docker', new DockerMock('test'))
def buildToolCalled = false
helper.registerAllowedMethod('kanikoExecute', [Map.class], { m ->
buildToolCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'kaniko',
)
assertThat(buildToolCalled, is(true))
}
@Test
void testCnbBuildCalledWhenConfigured() {
def cnbBuildCalled = false
def npmExecuteScriptsCalled = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
npmExecuteScriptsCalled = true
})
helper.registerAllowedMethod('cnbBuild', [Map.class], { m ->
cnbBuildCalled = true
return
})
assertThat(nullScript.commonPipelineEnvironment.getContainerProperty('buildpacks'), nullValue())
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
cnbBuild: true
)
assertThat(npmExecuteScriptsCalled, is(true))
assertThat(cnbBuildCalled, is(true))
}
@Test
void testCnbBuildNotCalledWhenNotConfigured() {
def cnbBuildCalled = false
def npmExecuteScriptsCalled = false
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
npmExecuteScriptsCalled = true
})
helper.registerAllowedMethod('cnbBuild', [Map.class], { m ->
cnbBuildCalled = true
return
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
cnbBuild: false
)
assertThat(npmExecuteScriptsCalled, is(true))
assertThat(cnbBuildCalled, is(false))
}
@Test
void testHelmExecuteCalledWhenConfigured() {
def helmExecuteCalled = false
helper.registerAllowedMethod('helmExecute', [Map.class], { m ->
helmExecuteCalled = true
return
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
helmExecute: true
)
assertThat(helmExecuteCalled, is(true))
}
@Test
void testHelmExecuteNotCalledWhenNotConfigured() {
def helmExecuteCalled = false
helper.registerAllowedMethod('helmExecute', [Map.class], { m ->
helmExecuteCalled = true
return
})
helper.registerAllowedMethod('npmExecuteScripts', [Map.class], { m ->
})
stepRule.step.buildExecute(
script: nullScript,
buildTool: 'npm',
helmExecute: false
)
assertThat(helmExecuteCalled, is(false))
}
}