mirror of
https://github.com/SAP/jenkins-library.git
synced 2024-12-12 10:55:20 +02:00
stashing tests (#4379)
Co-authored-by: Alexander Link <33052602+alxsap@users.noreply.github.com> Co-authored-by: Alexander Link <33052602+alxsap@users.noreply.github.com>
This commit is contained in:
parent
83519eb771
commit
de7027df40
@ -10,6 +10,9 @@ import org.junit.rules.ExpectedException
|
|||||||
import org.junit.rules.RuleChain
|
import org.junit.rules.RuleChain
|
||||||
|
|
||||||
import static org.hamcrest.Matchers.is
|
import static org.hamcrest.Matchers.is
|
||||||
|
import static org.hamcrest.Matchers.hasItem
|
||||||
|
import static org.hamcrest.Matchers.hasItems
|
||||||
|
import static org.hamcrest.Matchers.hasSize
|
||||||
|
|
||||||
import util.JenkinsLoggingRule
|
import util.JenkinsLoggingRule
|
||||||
import util.JenkinsShellCallRule
|
import util.JenkinsShellCallRule
|
||||||
@ -43,12 +46,197 @@ class UtilsTest extends BasePiperTest {
|
|||||||
assertThat(result, is('0dad6c33b6246702132454f604dee80740f399ad'))
|
assertThat(result, is('0dad6c33b6246702132454f604dee80740f399ad'))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStashWithDefaults() {
|
||||||
|
Map stashProperties
|
||||||
|
|
||||||
|
def examinee = newExaminee(
|
||||||
|
stashClosure: { Map stashProps ->
|
||||||
|
stashProperties = stashProps
|
||||||
|
}
|
||||||
|
)
|
||||||
|
examinee.stash('foo')
|
||||||
|
|
||||||
|
assertThat(stashProperties, is([name: 'foo', includes: '**/*.*', excludes: '']))
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStashWithIncludesAndExcludes() {
|
||||||
|
Map stashProperties
|
||||||
|
|
||||||
|
def examinee = newExaminee(
|
||||||
|
stashClosure: { Map stashProps ->
|
||||||
|
stashProperties = stashProps
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
examinee.stash('foo', '**/*.mtar', '**/target')
|
||||||
|
|
||||||
|
assert(stashProperties == [name: 'foo', includes: '**/*.mtar', excludes: '**/target'])
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStashListStashesAllStashes() {
|
||||||
|
def stashes = [] as Set
|
||||||
|
def examinee = newExaminee(
|
||||||
|
stashClosure: { Map stash ->
|
||||||
|
stashes << stash
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
examinee.stashList(nullScript, [
|
||||||
|
[
|
||||||
|
name: 'foo',
|
||||||
|
includes: '*.foo',
|
||||||
|
excludes: 'target/foo/*'
|
||||||
|
],
|
||||||
|
[
|
||||||
|
name: 'bar',
|
||||||
|
includes: '*.bar',
|
||||||
|
excludes: 'target/bar/*'
|
||||||
|
]
|
||||||
|
])
|
||||||
|
|
||||||
|
assert stashes == [
|
||||||
|
[name: 'foo', includes: '*.foo', excludes: 'target/foo/*', allowEmpty: true],
|
||||||
|
[name: 'bar', includes: '*.bar', excludes: 'target/bar/*', allowEmpty: true]
|
||||||
|
] as Set
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testStashListDoesNotSwallowException() {
|
||||||
|
|
||||||
|
thrown.expect(RuntimeException.class)
|
||||||
|
thrown.expectMessage('something went wrong')
|
||||||
|
|
||||||
|
def examinee = newExaminee(
|
||||||
|
stashClosure: { Map stash ->
|
||||||
|
throw new RuntimeException('something went wrong')
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
examinee.stashList(nullScript, [
|
||||||
|
[
|
||||||
|
name: 'fail',
|
||||||
|
includes: '*.fail',
|
||||||
|
excludes: 'target/fail/*'
|
||||||
|
],
|
||||||
|
])
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnstashStageFilesUnstashesAllUnstashableStashes() {
|
||||||
|
|
||||||
|
// We do not fail in case a stash cannot be unstashed
|
||||||
|
// That might be barely OK for non-existing stashes, but there might also be
|
||||||
|
// real issues, e.g. related to permission issues when overwriting existing files
|
||||||
|
// maybe also from other stashes unstashed earlier.
|
||||||
|
// The behaviour wrt unstashable stashes should be improved. In case of issues
|
||||||
|
// with unstashing, we should throw an exception
|
||||||
|
|
||||||
|
boolean deleteDirCalled = false
|
||||||
|
def unstashed = []
|
||||||
|
def examinee = newExaminee(
|
||||||
|
unstashClosure: { def stashName ->
|
||||||
|
if(stashName == 'fail') {
|
||||||
|
throw new RuntimeException('something went wrong')
|
||||||
|
}
|
||||||
|
unstashed << stashName
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
nullScript.commonPipelineEnvironment.configuration.stageStashes = [
|
||||||
|
foo : [
|
||||||
|
unstash: ['stash-1', 'stash-2', 'fail', 'duplicate']
|
||||||
|
]
|
||||||
|
]
|
||||||
|
|
||||||
|
nullScript.metaClass.deleteDir = { deleteDirCalled = true }
|
||||||
|
|
||||||
|
def stashResult = examinee.unstashStageFiles(nullScript, 'foo', ['additional-stash', 'duplicate'])
|
||||||
|
|
||||||
|
assertThat(deleteDirCalled, is(true))
|
||||||
|
|
||||||
|
assertThat(unstashed, hasSize(5)) // should be 4 since we should not unstash 'duplicate' twice
|
||||||
|
assertThat(unstashed, hasItems('stash-1', 'stash-2', 'additional-stash', 'duplicate'))
|
||||||
|
|
||||||
|
// This is inconsistent. Above we can see only four different stashes has been unstashed ('duplicate' twice),
|
||||||
|
// but here we see that the stashResult contains six entries, also the 'fail' entry
|
||||||
|
// for which we throw an exception (... and duplicate twice).
|
||||||
|
// We should fix that and adjust the test accordingly with the fix.
|
||||||
|
assertThat(stashResult, hasSize(6))
|
||||||
|
assertThat(stashResult, hasItems('stash-1', 'stash-2', 'additional-stash', 'fail', 'duplicate'))
|
||||||
|
|
||||||
|
// cleanup the deleteDir method
|
||||||
|
nullScript.metaClass = null
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testUnstashAllSkipNull() {
|
void testUnstashAllSkipNull() {
|
||||||
def stashResult = utils.unstashAll(['a', null, 'b'])
|
def stashResult = utils.unstashAll(['a', null, 'b'])
|
||||||
assert stashResult == ['a', 'b']
|
assert stashResult == ['a', 'b']
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnstashSkipsFailedUnstashes() {
|
||||||
|
|
||||||
|
def examinee = newExaminee(
|
||||||
|
unstashClosure: { def stashName ->
|
||||||
|
if(stashName == 'fail') {
|
||||||
|
throw new RuntimeException('something went wrong')
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
def stashResult = examinee.unstashAll(['a', 'fail', 'b'])
|
||||||
|
|
||||||
|
assert stashResult == ['a', 'b']
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnstashAllSucceeds() {
|
||||||
|
def unstashed = [] as Set
|
||||||
|
def examinee = newExaminee(unstashClosure: { def stashName -> unstashed << stashName})
|
||||||
|
|
||||||
|
examinee.unstashAll(['a', 'b'])
|
||||||
|
|
||||||
|
assert(unstashed == ['a', 'b'] as Set)
|
||||||
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
void testUnstashFails() {
|
||||||
|
def logMessages = []
|
||||||
|
def examinee = newExaminee(
|
||||||
|
unstashClosure: {
|
||||||
|
def stashName -> throw new RuntimeException('something went wrong')
|
||||||
|
},
|
||||||
|
echoClosure: {
|
||||||
|
// coerce to java.lang.String, we might have GStrings.
|
||||||
|
// comparism with java.lang.String might fail.
|
||||||
|
message -> logMessages << message.toString()
|
||||||
|
}
|
||||||
|
)
|
||||||
|
def stashResult = examinee.unstash('a')
|
||||||
|
|
||||||
|
// in case unstash fails (maybe the stash does not exist, or we cannot unstash due to
|
||||||
|
// some colliding files in conjunction with file permissions) we emit a log message
|
||||||
|
// and continue silently instead of failing. In that case we get an empty array back
|
||||||
|
// instead an array containing the name of the unstashed stash.
|
||||||
|
assertThat(logMessages, hasItem('Unstash failed: a (something went wrong)'))
|
||||||
|
assert(stashResult == [])
|
||||||
|
}
|
||||||
|
|
||||||
|
private Utils newExaminee(Map parameters) {
|
||||||
|
def examinee = new Utils()
|
||||||
|
examinee.steps = [
|
||||||
|
stash: parameters.stashClosure ?: {},
|
||||||
|
unstash: parameters.unstashClosure ?: {},
|
||||||
|
]
|
||||||
|
examinee.echo = parameters.echoClosure ?: {}
|
||||||
|
return examinee
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
void testAppendNonExistingParameterToStringList() {
|
void testAppendNonExistingParameterToStringList() {
|
||||||
Map parameters = [:]
|
Map parameters = [:]
|
||||||
|
Loading…
Reference in New Issue
Block a user