KT-43944: Don't access Android test source sets' API configurations
When dependencies are added to our corresponding configurations, report errors, as there's no proper way to add those dependencies. Issue #KT-43944 Fixed
This commit is contained in:
+51
-6
@@ -75,7 +75,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAndroidWithNewMppApp() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) {
|
||||
fun testAndroidWithNewMppApp() = with(Project("new-mpp-android")) {
|
||||
build("assemble", "compileDebugUnitTestJavaWithJavac", "printCompilerPluginOptions") {
|
||||
assertSuccessful()
|
||||
|
||||
@@ -114,7 +114,10 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
compilerPluginArgsRegex.findAll(output).associate { it.groupValues[1] to it.groupValues[2] }
|
||||
|
||||
compilerPluginOptionsBySourceSet.entries.forEach { (sourceSetName, argsString) ->
|
||||
val shouldHaveAndroidExtensionArgs = sourceSetName.startsWith("androidApp")
|
||||
val shouldHaveAndroidExtensionArgs =
|
||||
sourceSetName.startsWith("androidApp") && (
|
||||
androidGradlePluginVersion < AGPVersion.v7_0_0 || !sourceSetName.contains("AndroidTestRelease")
|
||||
)
|
||||
if (shouldHaveAndroidExtensionArgs)
|
||||
assertTrue("$sourceSetName is an Android source set and should have Android Extensions in the args") {
|
||||
"plugin:org.jetbrains.kotlin.android" in argsString
|
||||
@@ -260,7 +263,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testAndroidMppProductionDependenciesInTests() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) {
|
||||
fun testAndroidMppProductionDependenciesInTests() = with(Project("new-mpp-android")) {
|
||||
// Test the fix for KT-29343
|
||||
setupWorkingDir()
|
||||
|
||||
@@ -314,7 +317,7 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testCustomAttributesInAndroidTargets() = with(Project("new-mpp-android", GradleVersionRequired.FOR_MPP_SUPPORT)) {
|
||||
fun testCustomAttributesInAndroidTargets() = with(Project("new-mpp-android")) {
|
||||
// Test the fix for KT-27714
|
||||
|
||||
setupWorkingDir()
|
||||
@@ -346,6 +349,16 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
run {
|
||||
val appBuildScriptBackup = gradleBuildScript("app").readText()
|
||||
|
||||
gradleBuildScript("lib").appendText(
|
||||
"\n" + """
|
||||
kotlin.targets.all {
|
||||
attributes.attribute(
|
||||
Attribute.of("com.example.target", String),
|
||||
targetName
|
||||
)
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
gradleBuildScript("app").appendText(
|
||||
"\n" + """
|
||||
kotlin.targets.androidApp.attributes.attribute(
|
||||
@@ -357,9 +370,24 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
|
||||
build(":app:compileDebugKotlinAndroidApp") {
|
||||
assertFailed() // dependency resolution should fail
|
||||
assertContains("Required com.example.target 'notAndroidLib'")
|
||||
assertTrue(
|
||||
"Required com.example.target 'notAndroidLib'" in output ||
|
||||
"attribute 'com.example.target' with value 'notAndroidLib'" in output
|
||||
)
|
||||
}
|
||||
|
||||
gradleBuildScript("lib").writeText(
|
||||
appBuildScriptBackup + "\n" + """
|
||||
kotlin.targets.all {
|
||||
compilations.all {
|
||||
attributes.attribute(
|
||||
Attribute.of("com.example.compilation", String),
|
||||
targetName + compilationName.capitalize()
|
||||
)
|
||||
}
|
||||
}
|
||||
""".trimIndent()
|
||||
)
|
||||
gradleBuildScript("app").writeText(
|
||||
appBuildScriptBackup + "\n" + """
|
||||
kotlin.targets.androidApp.compilations.all {
|
||||
@@ -373,7 +401,10 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
|
||||
build(":app:compileDebugKotlinAndroidApp") {
|
||||
assertFailed()
|
||||
assertContains("Required com.example.compilation 'notDebug'")
|
||||
assertTrue(
|
||||
"Required com.example.compilation 'notDebug'" in output ||
|
||||
"attribute 'com.example.compilation' with value 'notDebug'" in output
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -405,6 +436,20 @@ open class KotlinAndroid36GradleIT : KotlinAndroid33GradleIT() {
|
||||
}
|
||||
}
|
||||
|
||||
open class KotlinAndroid70GradleIT : KotlinAndroid36GradleIT() {
|
||||
override val androidGradlePluginVersion: AGPVersion
|
||||
get() = AGPVersion.v7_0_0
|
||||
|
||||
override val defaultGradleVersion: GradleVersionRequired
|
||||
get() = GradleVersionRequired.AtLeast("6.8")
|
||||
|
||||
override fun defaultBuildOptions(): BuildOptions {
|
||||
val javaHome = File(System.getProperty("jdk11Home")!!)
|
||||
Assume.assumeTrue("JDK 11 should be available", javaHome.isDirectory)
|
||||
return super.defaultBuildOptions().copy(javaHome = javaHome, warningMode = WarningMode.Summary)
|
||||
}
|
||||
}
|
||||
|
||||
open class KotlinAndroid32GradleIT : KotlinAndroid3GradleIT() {
|
||||
override val androidGradlePluginVersion: AGPVersion
|
||||
get() = AGPVersion.v3_2_0
|
||||
|
||||
+1
@@ -26,5 +26,6 @@ class AGPVersion private constructor(private val versionNumber: VersionNumber) {
|
||||
val v3_6_0 = fromString("3.6.0")
|
||||
val v4_1_0 = fromString("4.1.0-beta02")
|
||||
val v4_2_0 = fromString("4.2.0-alpha10")
|
||||
val v7_0_0 = fromString("7.0.0-alpha03")
|
||||
}
|
||||
}
|
||||
+1
-1
@@ -10,7 +10,7 @@ android {
|
||||
defaultConfig {
|
||||
applicationId "app.example.com.app_sample"
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 27
|
||||
targetSdkVersion 29
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
|
||||
|
||||
+1
-1
@@ -10,7 +10,7 @@ android {
|
||||
|
||||
defaultConfig {
|
||||
minSdkVersion 21
|
||||
targetSdkVersion 27
|
||||
targetSdkVersion 29
|
||||
versionCode 1
|
||||
versionName "1.0"
|
||||
|
||||
|
||||
+11
-1
@@ -855,7 +855,17 @@ abstract class AbstractAndroidProjectHandler(private val kotlinConfigurationTool
|
||||
compileOnlyConfigurationName: String,
|
||||
runtimeOnlyConfigurationName: String
|
||||
) {
|
||||
project.addExtendsFromRelation(androidSourceSet.apiConfigurationName, apiConfigurationName)
|
||||
if (project.configurations.findByName(androidSourceSet.apiConfigurationName) != null) {
|
||||
project.addExtendsFromRelation(androidSourceSet.apiConfigurationName, apiConfigurationName)
|
||||
} else {
|
||||
// If any dependency is added to this configuration, report an error:
|
||||
project.configurations.getByName(apiConfigurationName).dependencies.all { dependency ->
|
||||
throw InvalidUserCodeException(
|
||||
"API dependencies are not allowed for Android source set ${androidSourceSet.name}. " +
|
||||
"Please use an implementation dependency instead."
|
||||
)
|
||||
}
|
||||
}
|
||||
project.addExtendsFromRelation(androidSourceSet.implementationConfigurationName, implementationConfigurationName)
|
||||
project.addExtendsFromRelation(androidSourceSet.compileOnlyConfigurationName, compileOnlyConfigurationName)
|
||||
project.addExtendsFromRelation(androidSourceSet.runtimeOnlyConfigurationName, runtimeOnlyConfigurationName)
|
||||
|
||||
Reference in New Issue
Block a user