Skip to content

Commit

Permalink
build: add test for caching of rust build tasks
Browse files Browse the repository at this point in the history
Signed-off-by: Jendrik Johannes <[email protected]>
  • Loading branch information
jjohannes committed Dec 12, 2024
1 parent 1f96e2b commit c7c4869
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 11 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`() {

Check warning on line 36 in src/test/kotlin/org/hiero/gradle/test/RustTasksTest.kt

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/test/kotlin/org/hiero/gradle/test/RustTasksTest.kt#L36

The function rust toolchain installation and caching works is missing documentation.
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)

Check warning on line 71 in src/test/kotlin/org/hiero/gradle/test/RustTasksTest.kt

View check run for this annotation

Codacy Production / Codacy Static Code Analysis

src/test/kotlin/org/hiero/gradle/test/RustTasksTest.kt#L71

Multiple occurrences of the same string literal within a single file detected. Prefer extracting the string literal into a property or constant.
.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 @@ -34,6 +34,7 @@ class GradleProject {
private val env =
mutableMapOf<String, String>().also {
it["PATH"] = System.getenv("PATH") // to find 'git' command
it["HOME"] = System.getenv("HOME") // needed for Rust compilation
}

fun withMinimalStructure(): GradleProject {
Expand Down

0 comments on commit c7c4869

Please sign in to comment.