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/TransportRequestUploadFileTest.groovy
Roland Stengel 893edfe4d6
transportRequestUploadFile - consider changemanagement.[solman|cts|rfc].docker (#3112)
Pass docker parameters to the new transport request steps.
Fixes Issue 3110 and 3111.
2021-09-21 10:29:43 +02:00

614 lines
24 KiB
Groovy

import static org.hamcrest.Matchers.*
import static org.junit.Assert.assertThat
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 com.sap.piper.Utils
import com.sap.piper.cm.ChangeManagement
import com.sap.piper.cm.ChangeManagementException
import hudson.AbortException
import util.BasePiperTest
import util.JenkinsCredentialsRule
import util.JenkinsLoggingRule
import util.JenkinsReadYamlRule
import util.JenkinsStepRule
import util.Rules
public class TransportRequestUploadFileTest extends BasePiperTest {
private ExpectedException thrown = new ExpectedException()
private JenkinsStepRule stepRule = new JenkinsStepRule(this)
private JenkinsLoggingRule loggingRule = new JenkinsLoggingRule(this)
@Rule
public RuleChain ruleChain = Rules.getCommonRules(this)
.around(thrown)
.around(new JenkinsReadYamlRule(this))
.around(stepRule)
.around(loggingRule)
.around(new JenkinsCredentialsRule(this)
.withCredentials('CM', 'anonymous', '********'))
private Map cmUtilReceivedParams = [:]
@Before
public void setup() {
cmUtilReceivedParams.clear()
nullScript.commonPipelineEnvironment.configuration = [general:
[changeManagement:
[
credentialsId: 'CM',
type: 'SOLMAN',
endpoint: 'https://example.org/cm'
]
]
]
Utils.metaClass.echo = { def m -> }
}
@After
public void tearDown() {
Utils.metaClass = null
}
@Test
public void changeDocumentIdNotProvidedSOLMANTest() {
// we expect the failure only for SOLMAN (which is the default).
// Use case for CTS without change document id is checked by the
// straight forward test case for CTS
thrown.expect(IllegalArgumentException)
thrown.expectMessage("Change document id not provided (parameter: 'changeDocumentId' provided to the step call or via commit history).")
ChangeManagement cm = new ChangeManagement(nullScript) {
String getChangeDocumentId(
String from,
String to,
String pattern,
String format
) {
throw new ChangeManagementException('Cannot retrieve changeId from git commits.')
}
}
stepRule.step.transportRequestUploadFile(script: nullScript, transportRequestId: '001', applicationId: 'app', filePath: '/path', cmUtils: cm)
}
@Test
public void transportRequestIdNotProvidedTest() {
ChangeManagement cm = new ChangeManagement(nullScript) {
String getTransportRequestId(
String from,
String to,
String pattern,
String format
) {
throw new ChangeManagementException('Cannot retrieve transport request id from git commits.')
}
}
thrown.expect(IllegalArgumentException)
thrown.expectMessage("Transport request id not provided (parameter: 'transportRequestId' provided to the step call or via commit history).")
stepRule.step.transportRequestUploadFile(script: nullScript, changeDocumentId: '001', applicationId: 'app', filePath: '/path', cmUtils: cm)
}
@Test
public void applicationIdNotProvidedSOLMANTest() {
// we expect the failure only for SOLMAN (which is the default).
// Use case for CTS without applicationId is checked by the
// straight forward test case for CTS
thrown.expect(IllegalArgumentException)
thrown.expectMessage("ERROR - NO VALUE AVAILABLE FOR applicationId")
stepRule.step.transportRequestUploadFile(script: nullScript, changeDocumentId: '001', transportRequestId: '001', filePath: '/path')
}
@Test
public void filePathNotProvidedTest() {
thrown.expect(IllegalArgumentException)
thrown.expectMessage("ERROR - NO VALUE AVAILABLE FOR filePath")
stepRule.step.transportRequestUploadFile(script: nullScript, changeDocumentId: '001', transportRequestId: '001', applicationId: 'app')
}
@Test
public void uploadFileToTransportRequestSOLMANFailureTest() {
thrown.expect(AbortException)
thrown.expectMessage("Exception message")
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
throw new AbortException('Exception message')
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
changeDocumentId: '001',
transportRequestId: '001',
applicationId: 'app',
filePath: '/path',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts'
],
credentialsId: 'CM'
)
}
@Test
public void uploadFileToTransportRequestCTSSuccessTest() {
loggingRule.expect("[INFO] Uploading application 'myApp' to transport request '002'.")
loggingRule.expect("[INFO] Application 'myApp' has been successfully uploaded to transport request '002'.")
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
})
stepRule.step.transportRequestUploadFile(script: nullScript,
changeManagement: [
type: 'CTS',
client: '001',
cts: [
osDeployUser: 'node2',
deployToolDependencies: ['@ui5/cli', '@sap/ux-ui5-tooling', '@ui5/logger', '@ui5/fs', '@dummy/foo'],
npmInstallOpts: ['--verbose'],
]
],
applicationName: 'myApp',
applicationDescription: 'the description',
abapPackage: 'myPackage',
transportRequestId: '002',
credentialsId: 'CM')
assertThat(calledWithStepName, is('transportRequestUploadCTS'))
assertThat(calledWithParameters.transportRequestId, is('002'))
assertThat(calledWithParameters.endpoint, is('https://example.org/cm'))
assertThat(calledWithParameters.client, is('001'))
assertThat(calledWithParameters.applicationName, is('myApp'))
assertThat(calledWithParameters.description, is('the description'))
assertThat(calledWithParameters.abapPackage, is('myPackage'))
assertThat(calledWithParameters.osDeployUser, is('node2'))
assertThat(calledWithParameters.deployToolDependencies, is(['@ui5/cli', '@sap/ux-ui5-tooling', '@ui5/logger', '@ui5/fs', '@dummy/foo']))
assertThat(calledWithParameters.npmInstallOpts, is(['--verbose']))
assertThat(calledWithParameters.deployConfigFile, is('ui5-deploy.yaml'))
assertThat(calledWithParameters.uploadCredentialsId, is('CM'))
}
@Test
public void uploadFileToTransportRequestCTSDockerParams() {
loggingRule.expect("[INFO] Uploading application 'myApp' to transport request '002'.")
loggingRule.expect("[INFO] Application 'myApp' has been successfully uploaded to transport request '002'.")
def calledWithParameters
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
})
stepRule.step.transportRequestUploadFile(script: nullScript,
changeManagement: [
type: 'CTS',
client: '001',
cts: [
osDeployUser: 'node2',
deployToolDependencies: ['@ui5/cli', '@sap/ux-ui5-tooling', '@ui5/logger', '@ui5/fs', '@dummy/foo'],
npmInstallOpts: ['--verbose'],
nodeDocker: [
image: 'ctsImage',
options: ['-o1', 'opt1', '-o2', 'opt2'],
envVars: [env1: 'env1', env2: 'env2'],
pullImage: false,
],
]
],
applicationName: 'myApp',
applicationDescription: 'the description',
abapPackage: 'myPackage',
transportRequestId: '002',
credentialsId: 'CM')
assertThat(calledWithParameters.dockerImage, is('ctsImage'))
assertThat(calledWithParameters.dockerOptions, is(['-o1', 'opt1', '-o2', 'opt2']))
assertThat(calledWithParameters.dockerEnvVars, is([env1: 'env1', env2: 'env2']))
assertThat(calledWithParameters.dockerPullImage, is(false))
}
@Test
public void uploadFileToTransportRequestRFCSanityChecksTest() {
thrown.expect(IllegalArgumentException)
thrown.expectMessage(allOf(
containsString('NO VALUE AVAILABLE FOR'),
containsString('applicationUrl'),
containsString('developmentInstance'),
containsString('developmentClient'),
containsString('applicationDescription'),
containsString('abapPackage'),
containsString('applicationName')))
stepRule.step.transportRequestUploadFile(script: nullScript,
transportRequestId: '123456', //no sanity check, can be read from git history
changeManagement: [type: 'RFC'],
)
}
@Test
public void uploadFileToTransportRequestRFCSuccessTest() {
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
}
)
nullScript.commonPipelineEnvironment.configuration =
[general:
[changeManagement:
[
endpoint: 'https://example.org/rfc'
]
]
]
stepRule.step.transportRequestUploadFile(script: nullScript,
applicationUrl: 'http://example.org/blobstore/xyz.zip',
codePage: 'UTF-9',
acceptUnixStyleLineEndings: true,
transportRequestId: '123456',
changeManagement: [
type: 'RFC',
rfc: [
developmentClient: '002',
developmentInstance: '001'
]
],
applicationName: '42',
applicationDescription: 'Lorem ipsum',
abapPackage: 'XYZ',
credentialsId: 'CM'
)
assertThat(calledWithStepName, is('transportRequestUploadRFC'))
assertThat(calledWithParameters.applicationName, is('42'))
assertThat(calledWithParameters.applicationUrl, is('http://example.org/blobstore/xyz.zip'))
assertThat(calledWithParameters.endpoint, is('https://example.org/rfc'))
assertThat(calledWithParameters.uploadCredentialsId, is('CM'))
assertThat(calledWithParameters.instance, is('001'))
assertThat(calledWithParameters.client, is('002'))
assertThat(calledWithParameters.applicationDescription, is('Lorem ipsum'))
assertThat(calledWithParameters.abapPackage, is('XYZ'))
assertThat(calledWithParameters.codePage, is('UTF-9'))
assertThat(calledWithParameters.acceptUnixStyleLineEndings, is(true))
assertThat(calledWithParameters.failUploadOnWarning, is(true))
assertThat(calledWithParameters.transportRequestId, is('123456'))
}
@Test
public void uploadFileToTransportRequestRFCUploadFailsTest() {
thrown.expect(AbortException)
thrown.expectMessage('upload failed')
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
throw new AbortException('upload failed')
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
applicationUrl: 'http://example.org/blobstore/xyz.zip',
codePage: 'UTF-9',
acceptUnixStyleLineEndings: true,
transportRequestId: '123456',
changeManagement: [
type: 'RFC',
rfc: [
docker: [
image: 'rfc',
options: [],
envVars: [:],
pullImage: false,
],
developmentClient: '002',
developmentInstance: '001',
]
],
applicationName: '42',
applicationDescription: 'Lorem ipsum',
abapPackage: 'XYZ',
credentialsId: 'CM'
)
}
@Test
public void uploadFileToTransportRequestRFCDockerParams() {
def calledWithParameters
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
applicationUrl: 'http://example.org/blobstore/xyz.zip',
codePage: 'UTF-9',
acceptUnixStyleLineEndings: true,
transportRequestId: '123456',
changeManagement: [
type: 'RFC',
endpoint: 'https://example.org/cm',
rfc: [
developmentClient: '002',
developmentInstance: '001',
docker: [
image: 'rfcImage',
options: ['-o1', 'opt1', '-o2', 'opt2'],
envVars: [env1: 'env1', env2: 'env2'],
pullImage: false,
],
]
],
applicationName: '42',
applicationDescription: 'Lorem ipsum',
abapPackage: 'XYZ',
credentialsId: 'CM'
)
assertThat(calledWithParameters.dockerImage, is('rfcImage'))
assertThat(calledWithParameters.dockerOptions, is(['-o1', 'opt1', '-o2', 'opt2']))
assertThat(calledWithParameters.dockerEnvVars, is([env1: 'env1', env2: 'env2']))
assertThat(calledWithParameters.dockerPullImage, is(false))
}
@Test
public void uploadFileToTransportRequestSOLMANSuccessTest() {
loggingRule.expect("[INFO] Uploading file '/path' to transport request '002' of change document '001'.")
loggingRule.expect("[INFO] File '/path' has been successfully uploaded to transport request '002' of change document '001'.")
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
changeDocumentId: '001',
transportRequestId: '002',
applicationId: 'app',
filePath: '/path',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts'
],
credentialsId: 'CM'
)
assertThat(calledWithStepName, is('transportRequestUploadSOLMAN'))
assertThat(calledWithParameters.changeDocumentId, is('001'))
assertThat(calledWithParameters.transportRequestId, is('002'))
assertThat(calledWithParameters.applicationId, is('app'))
assertThat(calledWithParameters.filePath, is('/path'))
assertThat(calledWithParameters.endpoint, is('https://example.org/cm'))
assertThat(calledWithParameters.cmClientOpts, is('--client opts'))
assertThat(calledWithParameters.uploadCredentialsId, is('CM'))
}
@Test
public void uploadFileToTransportRequestSOLMANSuccessApplicationIdFromConfigurationTest() {
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
}
)
nullScript.commonPipelineEnvironment.configuration.put(['steps',
[transportRequestUploadFile:
[applicationId: 'AppIdfromConfig']]])
stepRule.step.transportRequestUploadFile(
script: nullScript,
changeDocumentId: '001',
transportRequestId: '002',
filePath: '/path',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts'
],
credentialsId: 'CM'
)
assertThat(calledWithParameters.applicationId, is('AppIdfromConfig'))
}
@Test
public void uploadFileToTransportRequestSOLMANFilePathFromParameters() {
// this one is not used when file path is provided via signature
nullScript.commonPipelineEnvironment.setMtarFilePath('/path2')
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
changeDocumentId: '001',
transportRequestId: '002',
applicationId: 'app',
filePath: '/pathByParam',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts'
],
credentialsId: 'CM'
)
assertThat(calledWithParameters.filePath, is('/pathByParam'))
}
@Test
public void uploadFileToTransportRequestSOLMANFilePathFromCommonPipelineEnvironment() {
// this one is used since there is nothing in the signature
nullScript.commonPipelineEnvironment.setMtarFilePath('/path2')
def calledWithParameters,
calledWithStepName,
calledWithMetadata,
calledWithCredentials
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
calledWithStepName = stepName
calledWithMetadata = metaData
calledWithCredentials = creds
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
changeDocumentId: '001',
transportRequestId: '002',
applicationId: 'app',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts'
],
credentialsId: 'CM'
)
assertThat(calledWithParameters.filePath, is('/path2'))
}
@Test
public void uploadFileToTransportRequestSOLMANDockerParams() {
// this one is used since there is nothing in the signature
nullScript.commonPipelineEnvironment.setMtarFilePath('/path2')
def calledWithParameters
helper.registerAllowedMethod('piperExecuteBin', [Map, String, String, List], {
params, stepName, metaData, creds ->
calledWithParameters = params
}
)
stepRule.step.transportRequestUploadFile(script: nullScript,
changeDocumentId: '001',
transportRequestId: '002',
applicationId: 'app',
filePath: '/pathByParam',
changeManagement: [
type: 'SOLMAN',
endpoint: 'https://example.org/cm',
clientOpts: '--client opts',
solman: [
docker: [
image: 'solmanImage',
options: ['-o1', 'opt1', '-o2', 'opt2'],
envVars: [env1: 'env1', env2: 'env2'],
pullImage: false,
],
],
],
credentialsId: 'CM'
)
assertThat(calledWithParameters.dockerImage, is('solmanImage'))
assertThat(calledWithParameters.dockerOptions, is(['-o1', 'opt1', '-o2', 'opt2']))
assertThat(calledWithParameters.dockerEnvVars, is([env1: 'env1', env2: 'env2']))
assertThat(calledWithParameters.dockerPullImage, is(false))
}
@Test
public void invalidBackendTypeTest() {
thrown.expect(AbortException)
thrown.expectMessage('Invalid backend type: \'DUMMY\'. Valid values: [SOLMAN, CTS, RFC, NONE]. ' +
'Configuration: \'changeManagement/type\'.')
stepRule.step.transportRequestUploadFile(script: nullScript,
applicationId: 'app',
filePath: '/path',
changeManagement: [type: 'DUMMY'])
}
@Test
public void cmIntegrationSwichtedOffTest() {
loggingRule.expect('[INFO] Change management integration intentionally switched off.')
stepRule.step.transportRequestUploadFile(script: nullScript,
changeManagement: [type: 'NONE'])
}
}