Skip to content

Commit 0ab60d4

Browse files
author
matrixdev
committed
added rust tests support
1 parent c0d3ab0 commit 0ab60d4

File tree

5 files changed

+71
-4
lines changed

5 files changed

+71
-4
lines changed

example/app/build.gradle.kts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ android {
2323
}
2424
}
2525

26+
sourceSets {
27+
getByName("main") {
28+
java.srcDir("src/rust_library")
29+
}
30+
}
31+
2632
compileOptions {
2733
sourceCompatibility = JavaVersion.VERSION_1_8
2834
targetCompatibility = JavaVersion.VERSION_1_8
@@ -36,6 +42,10 @@ android {
3642
androidRust {
3743
module("library") {
3844
path = file("src/rust_library")
45+
46+
buildType("release") {
47+
runTests = true
48+
}
3949
}
4050
minimumSupportedRustVersion = "1.62.1"
4151
}

example/app/src/rust_library/src/lib.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,13 @@ use jni::sys::jstring;
44

55
#[no_mangle]
66
extern fn Java_dev_matrix_rust_MainActivity_callRustCode(env: JNIEnv, _: JObject) -> jstring {
7-
env.new_string("hello from rust").unwrap().into_inner()
7+
env.new_string("Hello from rust!").unwrap().into_inner()
8+
}
9+
10+
#[cfg(test)]
11+
mod test {
12+
#[test]
13+
fn test() {
14+
println!("Hello from rust test!")
15+
}
816
}

plugin/src/main/java/dev/matrix/agp/rust/AndroidRustExtension.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,4 +44,5 @@ class AndroidRustBuildType : AndroidRustConfiguration()
4444
open class AndroidRustConfiguration {
4545
var profile = ""
4646
var targets = ArrayList<String>()
47+
var runTests: Boolean? = null
4748
}

plugin/src/main/java/dev/matrix/agp/rust/AndroidRustPlugin.kt

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ class AndroidRustPlugin : Plugin<Project> {
3636
val variantBuildDirectory = File(extensionBuildDirectory, buildType.name)
3737
val variantJniLibsDirectory = File(variantBuildDirectory, "jniLibs")
3838

39-
val cleanTaskName = "cleanRust${buildTypeNameCap}"
39+
val cleanTaskName = "clean${buildTypeNameCap}RustJniLibs"
4040
val cleanTask = project.tasks.register(cleanTaskName, RustCleanTask::class.java) {
4141
this.variantJniLibsDirectory.set(variantJniLibsDirectory)
4242
}
@@ -48,11 +48,22 @@ class AndroidRustPlugin : Plugin<Project> {
4848
val rustBuildType = module.buildTypes[buildType.name]
4949
val rustConfiguration = mergeRustConfigurations(rustBuildType, module, extension)
5050

51+
val testTask = when (rustConfiguration.runTests) {
52+
true -> {
53+
val testTaskName = "test${moduleNameCap}Rust"
54+
project.tasks.register(testTaskName, RustTestTask::class.java) {
55+
this.rustProjectDirectory.set(module.path)
56+
this.cargoTargetDirectory.set(moduleBuildDirectory)
57+
}.dependsOn(cleanTask)
58+
}
59+
else -> null
60+
}
61+
5162
val rustAbiSet = resolveAbiList(project, rustConfiguration.targets)
5263
allRustAbiSet.addAll(rustAbiSet)
5364

5465
for (rustAbi in rustAbiSet) {
55-
val buildTaskName = "buildRust${buildTypeNameCap}${moduleNameCap}[${rustAbi.androidName}]"
66+
val buildTaskName = "build${buildTypeNameCap}${moduleNameCap}Rust[${rustAbi.androidName}]"
5667
val buildTask = project.tasks.register(buildTaskName, RustBuildTask::class.java) {
5768
this.abi.set(rustAbi)
5869
this.apiLevel.set(dsl.defaultConfig.minSdk ?: 21)
@@ -63,7 +74,7 @@ class AndroidRustPlugin : Plugin<Project> {
6374
this.cargoTargetDirectory.set(moduleBuildDirectory)
6475
this.variantJniLibsDirectory.set(variantJniLibsDirectory)
6576
}
66-
buildTask.dependsOn(cleanTask)
77+
buildTask.dependsOn(testTask ?: cleanTask)
6778
tasksByBuildType.getOrPut(buildType.name, ::ArrayList).add(buildTask)
6879
}
6980
}
@@ -111,6 +122,7 @@ class AndroidRustPlugin : Plugin<Project> {
111122
val defaultConfiguration = AndroidRustConfiguration().also {
112123
it.profile = "release"
113124
it.targets = Abi.values().mapTo(ArrayList(), Abi::rustName)
125+
it.runTests = null
114126
}
115127

116128
return configurations.asSequence()
@@ -123,6 +135,9 @@ class AndroidRustPlugin : Plugin<Project> {
123135
if (result.targets.isEmpty()) {
124136
result.targets = base.targets
125137
}
138+
if (result.runTests == null) {
139+
result.runTests = base.runTests
140+
}
126141
result
127142
}
128143
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package dev.matrix.agp.rust
2+
3+
import org.gradle.api.DefaultTask
4+
import org.gradle.api.provider.Property
5+
import org.gradle.api.tasks.Input
6+
import org.gradle.api.tasks.TaskAction
7+
import java.io.File
8+
9+
internal abstract class RustTestTask : DefaultTask() {
10+
@get:Input
11+
abstract val rustProjectDirectory: Property<File>
12+
13+
@get:Input
14+
abstract val cargoTargetDirectory: Property<File>
15+
16+
@TaskAction
17+
fun taskAction() {
18+
val rustProjectDirectory = rustProjectDirectory.get()
19+
val cargoTargetDirectory = cargoTargetDirectory.get()
20+
21+
project.exec {
22+
standardOutput = System.out
23+
errorOutput = System.out
24+
workingDir = rustProjectDirectory
25+
26+
environment("CARGO_TARGET_DIR", cargoTargetDirectory.absolutePath)
27+
28+
commandLine("cargo")
29+
30+
args("test")
31+
}.assertNormalExitValue()
32+
}
33+
}

0 commit comments

Comments
 (0)