Skip to content

Commit

Permalink
build: add test for caching of rust build tasks (#39)
Browse files Browse the repository at this point in the history
Signed-off-by: Jendrik Johannes <[email protected]>
  • Loading branch information
jjohannes authored Dec 13, 2024
1 parent 1f96e2b commit 04a471a
Show file tree
Hide file tree
Showing 2 changed files with 70 additions and 16 deletions.
79 changes: 68 additions & 11 deletions src/test/kotlin/org/hiero/gradle/test/RustTasksTest.kt
Original file line number Diff line number Diff line change
Expand Up @@ -9,25 +9,57 @@ import org.junit.jupiter.api.Test

class RustTasksTest {

@Test
fun `installRustToolchains installs all toolchains defined in CargoToolchain`() {
val p = GradleProject().withMinimalStructure()
val rustToolchainsDir = p.file("product/module-a/build/rust-toolchains/rustup/toolchains")
p.moduleBuildFile("""plugins { id("org.hiero.gradle.feature.rust") }""")
p.toolchainVersionsFile(
"""
private val toolchainVersions =
"""
jdk=17.0.12
rust=1.81.0
cargo-zigbuild=0.19.5
zig=0.13.0
xwin=0.6.5
"""
.trimIndent()
.trimIndent()

private val cargoToml =
"""
[package]
name = "module-a"
version = "0.0.1"
edition = "2021"
[lib]
path = "src/main/rust/lib.rs"
crate-type = ["cdylib"]
"""
.trimIndent()

// Test asserts multiple things in one method as installing the toolchains is expensive.
@Test
fun `rust toolchain installation and caching works`() {
val push = GradleProject().withMinimalStructure()
val pull = GradleProject().withMinimalStructure()
push.settingsFile.appendText(
"""buildCache.local.directory = File("${push.file("build-cache").absolutePath}")"""
)
pull.settingsFile.appendText(
"""buildCache.local.directory = File("${push.file("build-cache").absolutePath}")"""
)
push.moduleBuildFile("""plugins { id("org.hiero.gradle.feature.rust") }""")
pull.moduleBuildFile("""plugins { id("org.hiero.gradle.feature.rust") }""")
push.toolchainVersionsFile(toolchainVersions)
pull.toolchainVersionsFile(toolchainVersions)
push.file("product/module-a/src/main/rust/lib.rs", "pub fn public_api() {}")
pull.file("product/module-a/src/main/rust/lib.rs", "pub fn public_api() {}")
push.file("product/module-a/Cargo.toml", cargoToml)
pull.file("product/module-a/Cargo.toml", cargoToml)

val rustToolchainsDir =
push.file("product/module-a/build/rust-toolchains/rustup/toolchains")

val result = p.run("installRustToolchains")
val pushResult = push.run("assemble --build-cache")
val pullResult = pull.run("assemble --build-cache -PskipInstallRustToolchains=true")

assertThat(result.output).doesNotContain("warning: Force-skipping unavailable component")
// installRustToolchains installs all toolchains defined in CargoToolchain
assertThat(pushResult.output)
.doesNotContain("warning: Force-skipping unavailable component")
CargoToolchain.values().forEach { toolchain ->
val toolchainDir =
rustToolchainsDir
Expand All @@ -36,7 +68,32 @@ class RustTasksTest {
.single()
assertThat(toolchainDir).isNotEmptyDirectory()
}
assertThat(result.task(":module-a:installRustToolchains")?.outcome)
assertThat(pushResult.task(":module-a:installRustToolchains")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)

// rust build results are taken FROM-CACHE and installRustToolchains can be skipped
assertThat(pushResult.task(":module-a:installRustToolchains")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:installRustToolchains")).isNull()
assertThat(pushResult.task(":module-a:cargoBuildAarch64Darwin")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:cargoBuildAarch64Darwin")?.outcome)
.isEqualTo(TaskOutcome.FROM_CACHE)
assertThat(pushResult.task(":module-a:cargoBuildAarch64Linux")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:cargoBuildAarch64Linux")?.outcome)
.isEqualTo(TaskOutcome.FROM_CACHE)
assertThat(pushResult.task(":module-a:cargoBuildX86Darwin")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:cargoBuildX86Darwin")?.outcome)
.isEqualTo(TaskOutcome.FROM_CACHE)
assertThat(pushResult.task(":module-a:cargoBuildX86Linux")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:cargoBuildX86Linux")?.outcome)
.isEqualTo(TaskOutcome.FROM_CACHE)
assertThat(pushResult.task(":module-a:cargoBuildX86Windows")?.outcome)
.isEqualTo(TaskOutcome.SUCCESS)
assertThat(pullResult.task(":module-a:cargoBuildX86Windows")?.outcome)
.isEqualTo(TaskOutcome.FROM_CACHE)
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -31,10 +31,7 @@ class GradleProject {

private val expectedHeader = "// SPDX-License-Identifier: Apache-2.0\n"

private val env =
mutableMapOf<String, String>().also {
it["PATH"] = System.getenv("PATH") // to find 'git' command
}
private val env = mutableMapOf<String, String>()

fun withMinimalStructure(): GradleProject {
gradlePropertiesFile.writeText(
Expand Down Expand Up @@ -142,6 +139,6 @@ class GradleProject {
.withProjectDir(projectDir)
.withArguments(args + listOf("-s", "--warning-mode=all"))
.withDebug(debugMode)
.let { if (debugMode) it else it.withEnvironment(env) }
.let { if (env.isEmpty() || debugMode) it else it.withEnvironment(env) }
}
}

0 comments on commit 04a471a

Please sign in to comment.