Skip to content

Commit

Permalink
test: replace JUnit's Arguments with type safe data classes so parame…
Browse files Browse the repository at this point in the history
…terized tests are easier to filter

Signed-off-by: Vladimir Sitnikov <[email protected]>
  • Loading branch information
vlsi committed Jan 12, 2024
1 parent bfd0cd6 commit 522ab2a
Show file tree
Hide file tree
Showing 5 changed files with 80 additions and 53 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package dev.sigstore.gradle

import dev.sigstore.testkit.BaseGradleTest
import dev.sigstore.testkit.TestedGradle
import dev.sigstore.testkit.TestedGradleAndSigstoreJava
import dev.sigstore.testkit.TestedSigstoreJava
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -28,15 +29,15 @@ import org.junit.jupiter.params.provider.MethodSource
class SigstoreSignTest: BaseGradleTest() {
@ParameterizedTest
@MethodSource("gradleAndSigstoreJavaVersions")
fun `sign file`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
fun `sign file`(case: TestedGradleAndSigstoreJava) {
writeBuildGradle(
"""
import dev.sigstore.sign.tasks.SigstoreSignFilesTask
plugins {
id("java")
id("dev.sigstore.sign-base")
}
${declareRepositoryAndDependency(sigstoreJava)}
${declareRepositoryAndDependency(case.sigstoreJava)}
group = "dev.sigstore.test"
def helloProps = tasks.register("helloProps", WriteProperties) {
outputFile = file("build/helloProps.txt")
Expand All @@ -53,15 +54,15 @@ class SigstoreSignTest: BaseGradleTest() {
rootProject.name = 'sigstore-test'
""".trimIndent()
)
enableConfigurationCache(gradle)
prepare(gradle.version, "signFile", "-s")
enableConfigurationCache(case.gradle)
prepare(case.gradle.version, "signFile", "-s")
.build()
assertThat(projectDir.resolve("build/helloProps.txt.sigstore"))
.content()
.basicSigstoreStructure()

if (gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(gradle.version, "signFile", "-s")
if (case.gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(case.gradle.version, "signFile", "-s")
.build()

assertThat(result.output)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package dev.sigstore.gradle

import dev.sigstore.testkit.BaseGradleTest
import dev.sigstore.testkit.TestedGradle
import dev.sigstore.testkit.TestedGradleAndSigstoreJava
import dev.sigstore.testkit.TestedSigstoreJava
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -32,34 +33,34 @@ import org.junit.jupiter.params.provider.MethodSource
class RemoveSigstoreAscTest : BaseGradleTest() {
companion object {
@JvmStatic
fun signingSupportedGradleAndSigstoreJavaVersions(): Iterable<Arguments> =
if (isCI) {
gradleAndSigstoreJavaVersions()
} else {
// Find the first version that supports configuration cache for Gradle's signing plugin (8.1+)
listOf(
arguments(
TestedGradle(
fun signingSupportedGradleAndSigstoreJavaVersions(): Iterable<TestedGradleAndSigstoreJava> =
gradleAndSigstoreJavaVersions()
.filter {
it.gradle.configurationCache == ConfigurationCache.OFF ||
// Signing plugin supports configuration cache since 8.1
gradleVersions().first { it >= GradleVersion.version("8.1") },
ConfigurationCache.ON
),
SIGSTORE_JAVA_CURRENT_VERSION
it.gradle.version >= GradleVersion.version("8.1")
}.ifEmpty {
// When executing tests locally, the above gradleAndSigstoreJavaVersions might produce
// Gradle < 8.1 + configuration cache=on which is incompatible with signing plugin.
listOf(
TestedGradleAndSigstoreJava(
TestedGradle(GradleVersion.version("8.1"), ConfigurationCache.OFF),
SIGSTORE_JAVA_CURRENT_VERSION
)
)
)
}
}

@JvmStatic
fun oneSigningSupportedGradleAndSigstoreJavaVersions(): Iterable<Arguments> =
fun oneSigningSupportedGradleAndSigstoreJavaVersions(): Iterable<TestedGradleAndSigstoreJava> =
signingSupportedGradleAndSigstoreJavaVersions().take(1)
}

@ParameterizedTest
@MethodSource("signingSupportedGradleAndSigstoreJavaVersions")
fun `basic configuration avoids signing sigstore with pgp`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
prepareBuildScripts(gradle, sigstoreJava)
fun `basic configuration avoids signing sigstore with pgp`(case: TestedGradleAndSigstoreJava) {
prepareBuildScripts(case)

prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
.build()

assertSoftly {
Expand All @@ -69,8 +70,8 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
assertSignatures("sigstore-test-1.0.pom")
}

if (gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
if (case.gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
.build()

assertThat(result.output)
Expand All @@ -83,8 +84,8 @@ class RemoveSigstoreAscTest : BaseGradleTest() {

@ParameterizedTest
@MethodSource("oneSigningSupportedGradleAndSigstoreJavaVersions")
fun `crossign sigstore with pgp`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
prepareBuildScripts(gradle, sigstoreJava)
fun `crossign sigstore with pgp`(case: TestedGradleAndSigstoreJava) {
prepareBuildScripts(case)
projectDir.resolve("gradle.properties").toFile().appendText(
"""
Expand All @@ -93,7 +94,7 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
dev.sigstore.sign.remove.sigstore.asc=false
""".trimIndent()
)
prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
.build()
assertSoftly {
assertSignatures("sigstore-test-1.0.pom", expectSigstoreAsc = true)
Expand All @@ -103,7 +104,7 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
}
}

private fun prepareBuildScripts(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
private fun prepareBuildScripts(case: TestedGradleAndSigstoreJava) {
writeBuildGradle(
"""
plugins {
Expand All @@ -112,7 +113,7 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
id("maven-publish")
id("dev.sigstore.sign")
}
${declareRepositoryAndDependency(sigstoreJava)}
${declareRepositoryAndDependency(case.sigstoreJava)}
group = "dev.sigstore.test"
java {
Expand Down Expand Up @@ -148,9 +149,7 @@ class RemoveSigstoreAscTest : BaseGradleTest() {
rootProject.name = 'sigstore-test'
""".trimIndent()
)
if (gradle.version >= GradleVersion.version("8.1")) {
enableConfigurationCache(gradle)
}
enableConfigurationCache(case.gradle)
}

private fun SoftAssertions.assertSignatures(name: String, expectSigstoreAsc: Boolean = false) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ package dev.sigstore.gradle

import dev.sigstore.testkit.BaseGradleTest
import dev.sigstore.testkit.TestedGradle
import dev.sigstore.testkit.TestedGradleAndSigstoreJava
import dev.sigstore.testkit.TestedSigstoreJava
import dev.sigstore.testkit.annotations.EnabledIfOidcExists
import org.assertj.core.api.Assertions.assertThat
Expand All @@ -28,15 +29,15 @@ import org.junit.jupiter.params.provider.MethodSource
class SigstorePublishSignTest : BaseGradleTest() {
@ParameterizedTest
@MethodSource("gradleAndSigstoreJavaVersions")
fun `sign file`(gradle: TestedGradle, sigstoreJava: TestedSigstoreJava) {
fun `sign file`(case: TestedGradleAndSigstoreJava) {
writeBuildGradle(
"""
plugins {
id("java")
id("maven-publish")
id("dev.sigstore.sign")
}
${declareRepositoryAndDependency(sigstoreJava)}
${declareRepositoryAndDependency(case.sigstoreJava)}
group = "dev.sigstore.test"
java {
Expand Down Expand Up @@ -65,8 +66,8 @@ class SigstorePublishSignTest : BaseGradleTest() {
rootProject.name = 'sigstore-test'
""".trimIndent()
)
enableConfigurationCache(gradle)
prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
enableConfigurationCache(case.gradle)
prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
.build()

assertThat(projectDir.resolve("build/tmp-repo/dev/sigstore/test/sigstore-test/1.0/sigstore-test-1.0.pom.sigstore"))
Expand All @@ -82,8 +83,8 @@ class SigstorePublishSignTest : BaseGradleTest() {
.content()
.basicSigstoreStructure()

if (gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(gradle.version, "publishAllPublicationsToTmpRepository", "-s")
if (case.gradle.configurationCache == ConfigurationCache.ON) {
val result = prepare(case.gradle.version, "publishAllPublicationsToTmpRepository", "-s")
.build()

assertThat(result.output)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,38 +58,42 @@ open class BaseGradleTest {
).map { GradleVersion.version(it) }

@JvmStatic
fun gradleVersionAndSettings(): Iterable<Arguments> {
fun gradleVersionAndSettings(): Iterable<TestedGradle> {
if (!isCI) {
// Execute a single combination only when running locally
return listOf(arguments(TestedGradle(gradleVersions().first(), ConfigurationCache.ON)))
return listOf(
TestedGradle(gradleVersions().first(), ConfigurationCache.ON)
)
}
return buildList {
addAll(
gradleVersions().map { arguments(TestedGradle(it, ConfigurationCache.ON)) }
gradleVersions().map { TestedGradle(it, ConfigurationCache.ON) }
)
add(arguments(TestedGradle(gradleVersions().first(), ConfigurationCache.OFF)))
// Test the first and the last version without configuration cache
add(TestedGradle(gradleVersions().first(), ConfigurationCache.OFF))
add(TestedGradle(gradleVersions().last(), ConfigurationCache.OFF))
}
}

@JvmStatic
fun sigstoreJavaVersions(): Iterable<Arguments> {
fun sigstoreJavaVersions(): Iterable<TestedSigstoreJava> {
return buildList {
add(arguments(SIGSTORE_JAVA_CURRENT_VERSION))
add(SIGSTORE_JAVA_CURRENT_VERSION)
// For now, we test the plugins only with locally-built sigstore-java version
if (isCI && false) {
add(arguments(TestedSigstoreJava.Default))
add(TestedSigstoreJava.Default)
// 0.3.0 is the minimal version that supports generating Sigstore Bundle
add(arguments(TestedSigstoreJava.Version("0.3.0")))
add(TestedSigstoreJava.Version("0.3.0"))
}
}
}

@JvmStatic
fun gradleAndSigstoreJavaVersions(): Iterable<Arguments> {
fun gradleAndSigstoreJavaVersions(): Iterable<TestedGradleAndSigstoreJava> {
val gradle = gradleVersionAndSettings()
val sigstore = sigstoreJavaVersions()
return gradle.flatMap { gradleVersion ->
sigstore.map { arguments(*gradleVersion.get(), *it.get()) }
sigstore.map { TestedGradleAndSigstoreJava(gradleVersion, it) }
}
}
}
Expand Down Expand Up @@ -187,9 +191,6 @@ open class BaseGradleTest {
if (gradle.configurationCache != ConfigurationCache.ON) {
return
}
if (gradle.version < GradleVersion.version("7.0")) {
Assertions.fail<Unit>("Gradle version $gradle does not support configuration cache")
}
// Gradle 6.5 expects values ON, OFF, WARN, so we add the option for 7.0 only
projectDir.resolve("gradle.properties").toFile().appendText(
"""
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
/*
* Copyright 2022 The Sigstore Authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package dev.sigstore.testkit

/**
* Lists Gradle versions and Sigstore Gradle plugin versions.
*/
data class TestedGradleAndSigstoreJava(
val gradle: TestedGradle,
val sigstoreJava: TestedSigstoreJava,
)

0 comments on commit 522ab2a

Please sign in to comment.