1+ import groovy.json.JsonBuilder
2+ import org.gradle.util.VersionNumber
3+
14plugins {
25 id ' com.gradle.plugin-publish' version ' 0.14.0'
6+ id " org.gradle.test-retry" version " 1.2.0"
37}
48
59apply plugin : " java-gradle-plugin"
610apply plugin : " maven-publish"
11+ apply plugin : " groovy"
712apply plugin : " kotlin"
813
914gradlePlugin {
1015 plugins {
11- simplePlugin {
16+ rustAndroidGradlePlugin {
1217 id = ' org.mozilla.rust-android-gradle'
1318 implementationClass = ' com.nishtahir.RustAndroidPlugin'
1419 displayName = ' Plugin for building Rust with Cargo in Android projects'
@@ -20,26 +25,40 @@ gradlePlugin {
2025group ' org.mozilla.rust-android-gradle'
2126version " $plugin_version "
2227
28+ def isCI = (System . getenv(' CI' ) ?: ' false' ). toBoolean()
29+
30+ // Maps supported Android plugin versions to the versions of Gradle that support it
31+ def supportedVersions = [
32+ " 7.0.0" : [" 7.1.1" ],
33+ " 4.2.2" : [" 6.8.3" , " 7.1.1" ],
34+ " 4.1.3" : [" 6.5.1" , " 6.8.3" ],
35+ " 4.0.2" : [" 6.1.1" , " 6.8.3" ],
36+ " 3.6.4" : [" 5.6.4" , " 6.8.3" ],
37+ " 3.5.4" : [" 5.4.1" , " 5.6.4" , " 6.8.3" ],
38+ " 3.1.2" : [" 4.10.2" ]
39+ ]
40+
41+ // A local repo we publish our library to for testing in order to workaround limitations
42+ // in the TestKit plugin classpath.
43+ def localRepo = file(" $buildDir /local-repo" )
2344publishing {
2445 repositories {
2546 maven {
26- url " ../samples/maven-repo"
27- }
28- }
29- publications {
30- maven(MavenPublication ) {
31- groupId ' org.mozilla.rust-android-gradle'
32- artifactId ' rust-android'
33-
34- from components. java
47+ url = localRepo. toURI()
3548 }
3649 }
3750}
3851
3952dependencies {
40- compileOnly gradleApi()
41- implementation " com.android.tools.build:gradle:$agp_version "
42- // implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
53+ implementation gradleApi()
54+ compileOnly " com.android.tools.build:gradle:${ agp_version} "
55+
56+ testImplementation gradleTestKit()
57+ testImplementation " com.android.tools.build:gradle:${ agp_version} "
58+ testImplementation platform(" org.spockframework:spock-bom:2.0-M5-groovy-3.0" )
59+ testImplementation(" org.spockframework:spock-core" ) { exclude group : ' org.codehaus.groovy' }
60+ testImplementation(" org.spockframework:spock-junit4" ) { exclude group : ' org.codehaus.groovy' }
61+ testImplementation " org.junit.jupiter:junit-jupiter-api"
4362}
4463
4564compileKotlin {
@@ -54,12 +73,90 @@ pluginBundle {
5473 vcsUrl = ' https://github.com/mozilla/rust-android-gradle.git'
5574 tags = [' rust' , ' cargo' , ' android' ]
5675
57- plugins {
58- rustAndroidPlugin {
59- id = ' org.mozilla.rust-android-gradle.rust-android'
60- displayName = ' Plugin for building Rust with Cargo in Android projects'
61- description = ' A plugin that helps build Rust JNI libraries with Cargo for use in Android projects.'
62- tags = [' rust' , ' cargo' , ' android' ]
76+ mavenCoordinates {
77+ groupId = " gradle.plugin.org.mozilla.rust-android-gradle"
78+ }
79+ }
80+
81+
82+ // Generate a json file that contains the matrix of Gradle and AGP versions to test against.
83+ def generatedResources = " $buildDir /generated-resources/main"
84+ tasks. register(' generateVersions' ) {
85+ def outputFile = file(" $generatedResources /versions.json" )
86+ inputs. property " version" , version
87+ inputs. property " supportedVersions" , supportedVersions
88+ outputs. dir generatedResources
89+ doLast {
90+ outputFile. text = new JsonBuilder ([
91+ version : version,
92+ supportedVersions : supportedVersions
93+ ]). toPrettyString()
94+ }
95+ }
96+
97+ sourceSets {
98+ main {
99+ output. dir(generatedResources, builtBy : tasks. named(' generateVersions' ))
100+ }
101+ }
102+
103+ // This is used by github actions to split out jobs by Android version test task
104+ def generatedBuildResources = " $buildDir /build-resources"
105+ tasks. register(' generateTestTasksJson' ) {
106+ def outputFile = file(" ${ generatedBuildResources} /androidTestTasks.json" )
107+ inputs. property " supportedVersions" , supportedVersions
108+ outputs. dir generatedBuildResources
109+ doLast {
110+ outputFile. text = new JsonBuilder (
111+ // Fails in CI with issues invoking Java 11. The single test that
112+ // requires Java 11 succeeds. To be investigated in the future.
113+ // ['test'] +
114+ (supportedVersions. keySet(). collect {androidVersion -> androidTestTaskName(androidVersion) })
115+ ). toString()
116+ }
117+ }
118+
119+ // Configuration common to all test tasks
120+ tasks. withType(Test ). configureEach {
121+ dependsOn publish
122+ systemProperty " local.repo" , localRepo. toURI()
123+ useJUnitPlatform()
124+ retry {
125+ maxRetries = isCI ? 1 : 0
126+ maxFailures = 20
127+ }
128+ }
129+
130+ // Generate a test task for each Android version and run the tests annotated with the MultiVersionTest category
131+ supportedVersions. keySet(). each { androidVersion ->
132+ def testTaskName = androidTestTaskName(androidVersion)
133+ def jdkVersion = jdkVersionFor(androidVersion)
134+ def versionSpecificTest = tasks. register(testTaskName, Test ) {
135+ description = " Runs the multi-version tests for AGP ${ androidVersion} "
136+ group = " verification"
137+
138+ javaLauncher = javaToolchains. launcherFor {
139+ languageVersion = jdkVersion
63140 }
141+
142+ systemProperty ' org.gradle.android.testVersion' , androidVersion
143+ }
144+
145+ tasks. named(' check' ). configure {
146+ dependsOn versionSpecificTest
64147 }
65148}
149+
150+ static def androidTestTaskName (String androidVersion ) {
151+ return " testAndroid${ normalizeVersion(androidVersion)} "
152+ }
153+
154+ static def normalizeVersion (String version ) {
155+ return version. replaceAll(' [.\\ -]' , ' _' )
156+ }
157+
158+ static def jdkVersionFor (String version ) {
159+ def jdkVersion = VersionNumber . parse(version) > VersionNumber . parse(" 7.0.0-alpha01" ) ? 11 : 8
160+
161+ return JavaLanguageVersion . of(jdkVersion)
162+ }
0 commit comments