Skip to content

Commit ecb23fe

Browse files
committed
Merge branch 'master' into develop
2 parents 91dc2a9 + 18cd0df commit ecb23fe

20 files changed

+660
-96
lines changed

README.md

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ The tool allows dumping binary API of a JVM part of a Kotlin library that is pub
2626

2727
## Requirements
2828

29-
Binary compatibility validator plugin requires Gradle `6.0` or newer.
29+
Binary compatibility validator plugin requires Gradle `6.1.1` or newer.
30+
31+
Kotlin version `1.6.20` or newer.
3032

3133
## Setup
3234

@@ -35,15 +37,15 @@ Binary compatibility validator is a Gradle plugin that can be added to your buil
3537
- in `build.gradle.kts`
3638
```kotlin
3739
plugins {
38-
id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.15.1"
40+
id("org.jetbrains.kotlinx.binary-compatibility-validator") version "0.16.3"
3941
}
4042
```
4143

4244
- in `build.gradle`
4345

4446
```groovy
4547
plugins {
46-
id 'org.jetbrains.kotlinx.binary-compatibility-validator' version '0.15.1'
48+
id 'org.jetbrains.kotlinx.binary-compatibility-validator' version '0.16.3'
4749
}
4850
```
4951

api/binary-compatibility-validator.api

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ public final class kotlinx/validation/BinaryCompatibilityValidatorPlugin : org/g
3030
public fun apply (Lorg/gradle/api/Project;)V
3131
}
3232

33-
public abstract class kotlinx/validation/BuildTaskBase : org/gradle/api/DefaultTask {
33+
public abstract class kotlinx/validation/BuildTaskBase : kotlinx/validation/WorkerAwareTaskBase {
3434
public fun <init> ()V
3535
public final fun getIgnoredClasses ()Lorg/gradle/api/provider/SetProperty;
3636
public final fun getIgnoredPackages ()Lorg/gradle/api/provider/SetProperty;
@@ -86,28 +86,36 @@ public abstract class kotlinx/validation/KotlinKlibAbiBuildTask : kotlinx/valida
8686
public abstract fun getTarget ()Lorg/gradle/api/provider/Property;
8787
}
8888

89-
public abstract class kotlinx/validation/KotlinKlibExtractAbiTask : org/gradle/api/DefaultTask {
89+
public abstract class kotlinx/validation/KotlinKlibExtractAbiTask : kotlinx/validation/WorkerAwareTaskBase {
9090
public fun <init> ()V
91+
public abstract fun getExecutor ()Lorg/gradle/workers/WorkerExecutor;
9192
public abstract fun getInputAbiFile ()Lorg/gradle/api/file/RegularFileProperty;
9293
public abstract fun getOutputAbiFile ()Lorg/gradle/api/file/RegularFileProperty;
9394
public final fun getStrictValidation ()Lorg/gradle/api/provider/Property;
9495
public abstract fun getTargetsToRemove ()Lorg/gradle/api/provider/SetProperty;
9596
}
9697

97-
public abstract class kotlinx/validation/KotlinKlibInferAbiTask : org/gradle/api/DefaultTask {
98+
public abstract class kotlinx/validation/KotlinKlibInferAbiTask : kotlinx/validation/WorkerAwareTaskBase {
9899
public fun <init> ()V
100+
public abstract fun getExecutor ()Lorg/gradle/workers/WorkerExecutor;
99101
public abstract fun getInputDumps ()Lorg/gradle/api/provider/SetProperty;
100102
public abstract fun getOldMergedKlibDump ()Lorg/gradle/api/file/RegularFileProperty;
101103
public abstract fun getOutputAbiFile ()Lorg/gradle/api/file/RegularFileProperty;
102104
public abstract fun getTarget ()Lorg/gradle/api/provider/Property;
103105
}
104106

105-
public abstract class kotlinx/validation/KotlinKlibMergeAbiTask : org/gradle/api/DefaultTask {
107+
public abstract class kotlinx/validation/KotlinKlibMergeAbiTask : kotlinx/validation/WorkerAwareTaskBase {
106108
public fun <init> ()V
107109
public abstract fun getDumps ()Lorg/gradle/api/provider/SetProperty;
110+
public abstract fun getExecutor ()Lorg/gradle/workers/WorkerExecutor;
108111
public abstract fun getMergedApiFile ()Lorg/gradle/api/file/RegularFileProperty;
109112
}
110113

114+
public abstract class kotlinx/validation/WorkerAwareTaskBase : org/gradle/api/DefaultTask {
115+
public fun <init> ()V
116+
public abstract fun getRuntimeClasspath ()Lorg/gradle/api/file/ConfigurableFileCollection;
117+
}
118+
111119
public final class kotlinx/validation/_UtilsKt {
112120
public static final fun toKlibTarget (Lorg/jetbrains/kotlin/gradle/plugin/KotlinTarget;)Lkotlinx/validation/api/klib/KlibTarget;
113121
}

build.gradle.kts

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ val createClasspathManifest = tasks.register("createClasspathManifest") {
6464

6565
dependencies {
6666
implementation(gradleApi())
67-
implementation(libs.kotlinx.metadata)
67+
compileOnly(libs.kotlinx.metadata)
6868
compileOnly(libs.kotlin.compiler.embeddable)
69-
implementation(libs.ow2.asm)
70-
implementation(libs.ow2.asmTree)
69+
compileOnly(libs.ow2.asm)
70+
compileOnly(libs.ow2.asmTree)
7171
implementation(libs.javaDiffUtils)
7272
compileOnly(libs.gradlePlugin.kotlin)
7373

@@ -169,12 +169,17 @@ testing {
169169
implementation(project())
170170
implementation(libs.assertJ.core)
171171
implementation(libs.kotlin.test)
172-
implementation(libs.kotlin.compiler.embeddable)
173172
}
174173
}
175174

176175
val test by getting(JvmTestSuite::class) {
177176
description = "Regular unit tests"
177+
dependencies {
178+
implementation(libs.kotlinx.metadata)
179+
implementation(libs.kotlin.compiler.embeddable)
180+
implementation(libs.ow2.asm)
181+
implementation(libs.ow2.asmTree)
182+
}
178183
}
179184

180185
val functionalTest by creating(JvmTestSuite::class) {
@@ -184,6 +189,8 @@ testing {
184189
dependencies {
185190
implementation(files(createClasspathManifest))
186191

192+
implementation(libs.kotlinx.metadata)
193+
implementation(libs.kotlin.compiler.embeddable)
187194
implementation(gradleApi())
188195
implementation(gradleTestKit())
189196
}

gradle.properties

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
version=0.15.0-SNAPSHOT
1+
version=0.16.4-SNAPSHOT
22

33
kotlin.stdlib.default.dependency=false

src/functionalTest/kotlin/kotlinx/validation/api/TestDsl.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,7 @@ internal class AppendableScope(val filePath: String) {
190190

191191
internal class Runner(withConfigurationCache: Boolean = true) {
192192
val arguments: MutableList<String> = mutableListOf<String>().apply {
193+
add("--stacktrace")
193194
if (!koverEnabled && withConfigurationCache) {
194195
// Configuration cache is incompatible with javaagents being enabled for Gradle
195196
// See https://github.com/gradle/gradle/issues/25979

src/functionalTest/kotlin/kotlinx/validation/test/DefaultConfigTests.kt

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,29 @@ internal class DefaultConfigTests : BaseKotlinGradleTest() {
9797
}
9898
}
9999

100+
@Test
101+
fun `apiCheck should succeed when public classes match api file with K2`() {
102+
val runner = test {
103+
buildGradleKts {
104+
resolve("/examples/gradle/base/withPluginK2.gradle.kts")
105+
}
106+
kotlin("AnotherBuildConfig.kt") {
107+
resolve("/examples/classes/AnotherBuildConfig.kt")
108+
}
109+
apiFile(projectName = rootProjectDir.name) {
110+
resolve("/examples/classes/AnotherBuildConfig.dump")
111+
}
112+
113+
runner {
114+
arguments.add(":apiCheck")
115+
}
116+
}
117+
118+
runner.build().apply {
119+
assertTaskSuccess(":apiCheck")
120+
}
121+
}
122+
100123
@Test
101124
fun `apiCheck should fail when public classes match api file ignoring case`() {
102125
Assume.assumeTrue(underlyingFsIsCaseSensitive())
Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
/*
2+
* Copyright 2016-2024 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
package kotlinx.validation.test
7+
8+
import kotlinx.validation.api.*
9+
import org.assertj.core.api.Assertions
10+
import org.gradle.testkit.runner.GradleRunner
11+
import org.junit.Assume
12+
import org.junit.Test
13+
import kotlin.test.assertTrue
14+
15+
class GradleCompatibilityTest : BaseKotlinGradleTest() {
16+
17+
@Test
18+
fun test8Dot0() {
19+
checkDumpWithGradle("8.0")
20+
}
21+
22+
@Test
23+
fun test7Dot0() {
24+
checkDumpWithGradle("7.0")
25+
}
26+
27+
@Test
28+
fun testMin() {
29+
val runner = test(gradleVersion = "6.1.1", injectPluginClasspath = false) {
30+
buildGradleKts {
31+
resolve("/examples/gradle/base/withPluginMinKotlin.gradle.kts")
32+
}
33+
kotlin("AnotherBuildConfig.kt") {
34+
resolve("/examples/classes/AnotherBuildConfig.kt")
35+
}
36+
37+
runner(withConfigurationCache = false) {
38+
arguments.add(":apiDump")
39+
}
40+
}
41+
42+
skipInDebug(runner)
43+
44+
runner.build().apply {
45+
assertTaskSuccess(":apiDump")
46+
47+
assertTrue(rootProjectApiDump.exists(), "api dump file should exist")
48+
49+
val expected = readFileList("/examples/classes/AnotherBuildConfig.dump")
50+
Assertions.assertThat(rootProjectApiDump.readText()).isEqualToIgnoringNewLines(expected)
51+
}
52+
}
53+
54+
private fun skipInDebug(runner: GradleRunner) {
55+
Assume.assumeFalse(
56+
"The test requires a separate Gradle distributive " +
57+
"so it could not be executed with debug turned on.",
58+
runner.isDebug
59+
)
60+
}
61+
62+
private fun checkDumpWithGradle(gradleVersion: String) {
63+
val runner = test(gradleVersion = gradleVersion, injectPluginClasspath = false) {
64+
buildGradleKts {
65+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
66+
}
67+
kotlin("AnotherBuildConfig.kt") {
68+
resolve("/examples/classes/AnotherBuildConfig.kt")
69+
}
70+
71+
runner {
72+
arguments.add(":apiDump")
73+
}
74+
}
75+
76+
skipInDebug(runner)
77+
78+
runner.build().apply {
79+
assertTaskSuccess(":apiDump")
80+
81+
assertTrue(rootProjectApiDump.exists(), "api dump file should exist")
82+
83+
val expected = readFileList("/examples/classes/AnotherBuildConfig.dump")
84+
Assertions.assertThat(rootProjectApiDump.readText()).isEqualToIgnoringNewLines(expected)
85+
}
86+
}
87+
88+
}

src/functionalTest/kotlin/kotlinx/validation/test/KlibVerificationTests.kt

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,6 @@ import org.assertj.core.api.Assertions
1313
import org.gradle.testkit.runner.BuildResult
1414
import org.jetbrains.kotlin.konan.target.HostManager
1515
import org.jetbrains.kotlin.konan.target.KonanTarget
16-
import org.jetbrains.kotlin.utils.addToStdlib.butIf
17-
import org.junit.Assert
1816
import org.junit.Assume
1917
import org.junit.Test
2018
import java.io.File
@@ -91,6 +89,22 @@ internal class KlibVerificationTests : BaseKotlinGradleTest() {
9189
checkKlibDump(runner.build(), "/examples/classes/TopLevelDeclarations.klib.with.linux.dump")
9290
}
9391

92+
@Test
93+
fun `apiDump for native targets in K2`() {
94+
val runner = test {
95+
settingsGradleKts {
96+
resolve("/examples/gradle/settings/settings-name-testproject.gradle.kts")
97+
}
98+
buildGradleKts {
99+
resolve("/examples/gradle/base/withNativePluginK2.gradle.kts")
100+
}
101+
addToSrcSet("/examples/classes/TopLevelDeclarations.kt")
102+
runApiDump()
103+
}
104+
105+
checkKlibDump(runner.build(), "/examples/classes/TopLevelDeclarations.klib.with.linux.dump")
106+
}
107+
94108
@Test
95109
fun `apiCheck for native targets`() {
96110
val runner = test {
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
/*
2+
* Copyright 2016-2023 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
plugins {
7+
kotlin("multiplatform") version "2.0.0"
8+
id("org.jetbrains.kotlinx.binary-compatibility-validator")
9+
}
10+
11+
repositories {
12+
mavenCentral()
13+
}
14+
15+
kotlin {
16+
linuxX64()
17+
linuxArm64()
18+
mingwX64()
19+
androidNativeArm32()
20+
androidNativeArm64()
21+
androidNativeX64()
22+
androidNativeX86()
23+
24+
sourceSets {
25+
val commonMain by getting
26+
val commonTest by getting {
27+
dependencies {
28+
implementation(kotlin("stdlib"))
29+
implementation(kotlin("test-common"))
30+
implementation(kotlin("test-annotations-common"))
31+
}
32+
}
33+
}
34+
}
35+
36+
apiValidation {
37+
klib.enabled = true
38+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright 2016-2020 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
plugins {
7+
kotlin("jvm") version "2.0.0"
8+
id("org.jetbrains.kotlinx.binary-compatibility-validator")
9+
}
10+
11+
repositories {
12+
mavenCentral()
13+
}
14+
15+
dependencies {
16+
implementation(kotlin("stdlib-jdk8"))
17+
}
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
/*
2+
* Copyright 2016-2020 JetBrains s.r.o.
3+
* Use of this source code is governed by the Apache 2.0 License that can be found in the LICENSE.txt file.
4+
*/
5+
6+
plugins {
7+
kotlin("jvm") version "1.6.20"
8+
id("org.jetbrains.kotlinx.binary-compatibility-validator")
9+
}
10+
11+
repositories {
12+
mavenCentral()
13+
}
14+
15+
dependencies {
16+
implementation(kotlin("stdlib-jdk8"))
17+
}

src/main/kotlin/-Utils.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import org.jetbrains.kotlin.gradle.plugin.KotlinTarget
1414
import org.jetbrains.kotlin.gradle.plugin.mpp.KotlinNativeTarget
1515
import org.jetbrains.kotlin.gradle.targets.js.KotlinWasmTargetType
1616
import org.jetbrains.kotlin.gradle.targets.js.ir.KotlinJsIrTarget
17+
import java.io.File
1718
import java.io.Serializable
1819

1920
/**
@@ -60,3 +61,9 @@ public class KlibDumpMetadata(
6061
@get:PathSensitive(PathSensitivity.RELATIVE)
6162
public val dumpFile: RegularFileProperty
6263
) : Serializable
64+
65+
// Workaround for serialization exception occurring when KlibDumpMetadata is supplied to WorkerParameters.
66+
internal class KlibMetadataLocal(
67+
val target: KlibTarget,
68+
val dumpFile: File
69+
) : Serializable

0 commit comments

Comments
 (0)