Skip to content

Commit 2efbc48

Browse files
fzhinkinSpace Team
authored andcommitted
[ABI Validation] Correctly handle disappeared native/web targets
* Improve exception message * Added a test reproducing the issue from Kotlin/binary-compatibility-validator#234 (p. 1 & 2) * Removed native targets should trigger validation failure Fixes Kotlin/binary-compatibility-validator#234 Pull request Kotlin/binary-compatibility-validator#236 Moved from Kotlin/binary-compatibility-validator@db8c335
1 parent 5f35545 commit 2efbc48

File tree

4 files changed

+38
-13
lines changed

4 files changed

+38
-13
lines changed

libraries/tools/abi-validation/api/binary-compatibility-validator.api

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,8 +88,8 @@ public abstract class kotlinx/validation/KotlinKlibExtractAbiTask : org/gradle/a
8888
public fun <init> ()V
8989
public abstract fun getInputAbiFile ()Lorg/gradle/api/file/RegularFileProperty;
9090
public abstract fun getOutputAbiFile ()Lorg/gradle/api/file/RegularFileProperty;
91-
public abstract fun getRequiredTargets ()Lorg/gradle/api/provider/SetProperty;
9291
public final fun getStrictValidation ()Lorg/gradle/api/provider/Property;
92+
public abstract fun getTargetsToRemove ()Lorg/gradle/api/provider/SetProperty;
9393
}
9494

9595
public abstract class kotlinx/validation/KotlinKlibInferAbiTask : org/gradle/api/DefaultTask {

libraries/tools/abi-validation/src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -791,4 +791,30 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() {
791791
assertTaskFailure(":klibApiCheck")
792792
}
793793
}
794+
795+
@Test
796+
fun `apiCheck should fail after target removal`() {
797+
val runner = test {
798+
settingsGradleKts {
799+
resolve("/examples/gradle/settings/settings-name-testproject.gradle.kts")
800+
}
801+
// only a single native target is defined there
802+
buildGradleKts {
803+
resolve("/examples/gradle/base/withNativePluginAndSingleTarget.gradle.kts")
804+
}
805+
addToSrcSet("/examples/classes/AnotherBuildConfig.kt")
806+
// dump was created for multiple native targets
807+
abiFile(projectName = "testproject") {
808+
resolve("/examples/classes/AnotherBuildConfig.klib.dump")
809+
}
810+
runApiCheck()
811+
}
812+
runner.buildAndFail().apply {
813+
assertTaskFailure(":klibApiCheck")
814+
Assertions.assertThat(output)
815+
.contains("-// Targets: [androidNativeArm32, androidNativeArm64, androidNativeX64, " +
816+
"androidNativeX86, linuxArm64, linuxX64, mingwX64]")
817+
.contains("+// Targets: [linuxArm64]")
818+
}
819+
}
794820
}

libraries/tools/abi-validation/src/main/kotlin/BinaryCompatibilityValidatorPlugin.kt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -423,7 +423,7 @@ private class KlibValidationPipelineBuilder(
423423
"the golden file stored in the project"
424424
group = "other"
425425
strictValidation.set(extension.klib.strictValidation)
426-
requiredTargets.addAll(supportedTargets())
426+
targetsToRemove.addAll(unsupportedTargets())
427427
inputAbiFile.fileProvider(klibApiDir.map { it.resolve(klibDumpFileName) })
428428
outputAbiFile.fileProvider(klibOutputDir.map { it.resolve(klibDumpFileName) })
429429
}
@@ -534,18 +534,18 @@ private class KlibValidationPipelineBuilder(
534534
}
535535
}
536536

537-
// Compilable targets supported by the host compiler
538-
private fun Project.supportedTargets(): Provider<Set<KlibTarget>> {
537+
// Compilable targets not supported by the host compiler
538+
private fun Project.unsupportedTargets(): Provider<Set<KlibTarget>> {
539539
val banned = bannedTargets() // for testing only
540540
return project.provider {
541541
val hm = HostManager()
542542
project.kotlinMultiplatform.targets.matching { it.emitsKlib }
543543
.asSequence()
544544
.filter {
545545
if (it is KotlinNativeTarget) {
546-
hm.isEnabled(it.konanTarget) && it.targetName !in banned
546+
!hm.isEnabled(it.konanTarget) || it.targetName in banned
547547
} else {
548-
true
548+
false
549549
}
550550
}
551551
.map { it.toKlibTarget() }

libraries/tools/abi-validation/src/main/kotlin/KotlinKlibExtractAbiTask.kt

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -30,10 +30,10 @@ public abstract class KotlinKlibExtractAbiTask : DefaultTask() {
3030
public abstract val inputAbiFile: RegularFileProperty
3131

3232
/**
33-
* List of the targets that the resulting dump should contain.
33+
* List of the targets that need to be filtered out from [inputAbiFile].
3434
*/
3535
@get:Input
36-
public abstract val requiredTargets: SetProperty<KlibTarget>
36+
public abstract val targetsToRemove: SetProperty<KlibTarget>
3737

3838
/**
3939
* Refer to [KlibValidationSettings.strictValidation] for details.
@@ -61,17 +61,16 @@ public abstract class KotlinKlibExtractAbiTask : DefaultTask() {
6161
error("Project ABI file ${inputFile.relativeTo(rootDir)} is empty.")
6262
}
6363
val dump = KlibDump.from(inputFile)
64-
val enabledTargets = requiredTargets.get().map(KlibTarget::targetName).toSet()
64+
val unsupportedTargets = targetsToRemove.get().map(KlibTarget::targetName).toSet()
6565
// Filter out only unsupported files.
6666
// That ensures that target renaming will be caught and reported as a change.
67-
val targetsToRemove = dump.targets.filter { it.targetName !in enabledTargets }
68-
if (targetsToRemove.isNotEmpty() && strictValidation.get()) {
67+
if (unsupportedTargets.isNotEmpty() && strictValidation.get()) {
6968
throw IllegalStateException(
70-
"Validation could not be performed as some targets are not available " +
69+
"Validation could not be performed as some targets (namely, $targetsToRemove) are not available " +
7170
"and the strictValidation mode was enabled."
7271
)
7372
}
74-
dump.remove(targetsToRemove)
73+
dump.remove(unsupportedTargets.map(KlibTarget::parse))
7574
dump.saveTo(outputAbiFile.asFile.get())
7675
}
7776
}

0 commit comments

Comments
 (0)