Skip to content

Commit 4d4ba27

Browse files
committed
- update tests
- implement BCV features
1 parent 5fa768d commit 4d4ba27

28 files changed

+503
-51
lines changed

gradle.properties

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -Xmx4g -XX:+HeapDumpOnOutOfMemoryError
1+
org.gradle.jvmargs=-Dfile.encoding=UTF-8 -XX:+HeapDumpOnOutOfMemoryError
22

33
org.gradle.caching=true
44

@@ -7,6 +7,3 @@ org.gradle.unsafe.configuration-cache-problems=warn
77

88
org.gradle.parallel=true
99
org.gradle.welcome=never
10-
11-
# https://github.com/gradle/gradle/issues/9268#issuecomment-1397116301
12-
systemProp.org.gradle.unsafe.kotlin.assignment=true

modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/AndroidLibraryTest.kt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
package kotlinx.validation.test
22

3-
import dev.adamko.kotlin.binary_compatibility_validator.test.*
4-
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.*
53
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.*
4+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build
5+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveRunTask
66
import java.io.File
77
import org.gradle.testkit.runner.TaskOutcome.SUCCESS
88
import org.junit.jupiter.api.Disabled

modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/IgnoredClassesTests.kt

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,35 @@ internal class IgnoredClassesTests : BaseKotlinGradleTest() {
8484

8585
val expected = readResourceFile("/examples/classes/AnotherBuildConfig.dump")
8686
rootProjectApiDump.readText().shouldBeEqualComparingTo(expected)
87-
// Assertions.assertThat(rootProjectApiDump.readText()).isEqualToIgnoringNewLines(expected)
87+
}
88+
}
89+
90+
@Test
91+
fun `apiDump should dump class whose name is a subsset of another class that is excluded via ignoredClasses`() {
92+
val runner = test {
93+
buildGradleKts {
94+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
95+
resolve("/examples/gradle/configuration/ignoredClasses/oneValidFullyQualifiedClass.gradle.kts")
96+
}
97+
kotlin("BuildConfig.kt") {
98+
resolve("/examples/classes/BuildConfig.kt")
99+
}
100+
kotlin("BuildCon.kt") {
101+
resolve("/examples/classes/BuildCon.kt")
102+
}
103+
104+
runner {
105+
arguments.add(":apiDump")
106+
}
107+
}
108+
109+
runner.build().apply {
110+
shouldHaveRunTask(":apiDump", SUCCESS)
111+
112+
assertTrue(rootProjectApiDump.exists(), "api dump file should exist")
113+
114+
val expected = readResourceFile("/examples/classes/BuildCon.dump")
115+
rootProjectApiDump.readText().shouldBeEqualComparingTo(expected)
88116
}
89117
}
90118
}

modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/NonPublicMarkersTest.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@ package kotlinx.validation.test
33
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.*
44
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build
55
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome
6+
import io.kotest.matchers.file.shouldExist
7+
import io.kotest.matchers.shouldBe
68
import org.gradle.testkit.runner.TaskOutcome.SUCCESS
79
import org.junit.jupiter.api.Test
810

@@ -33,4 +35,40 @@ class NonPublicMarkersTest : BaseKotlinGradleTest() {
3335
shouldHaveTaskWithOutcome(":apiCheck", SUCCESS)
3436
}
3537
}
38+
39+
@Test
40+
fun testFiltrationByPackageLevelAnnotations() {
41+
val runner = test {
42+
buildGradleKts {
43+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
44+
resolve("/examples/gradle/configuration/nonPublicMarkers/packages.gradle.kts")
45+
}
46+
java("annotated/PackageAnnotation.java") {
47+
resolve("/examples/classes/PackageAnnotation.java")
48+
}
49+
java("annotated/package-info.java") {
50+
resolve("/examples/classes/package-info.java")
51+
}
52+
kotlin("ClassFromAnnotatedPackage.kt") {
53+
resolve("/examples/classes/ClassFromAnnotatedPackage.kt")
54+
}
55+
kotlin("AnotherBuildConfig.kt") {
56+
resolve("/examples/classes/AnotherBuildConfig.kt")
57+
}
58+
runner {
59+
arguments.add(":apiDump")
60+
}
61+
}
62+
63+
runner
64+
.forwardOutput()
65+
.build {
66+
shouldHaveTaskWithOutcome(":apiDump", SUCCESS)
67+
68+
rootProjectApiDump.shouldExist()
69+
70+
val dumpFile = readResourceFile("/examples/classes/AnotherBuildConfig.dump")
71+
rootProjectApiDump.readText() shouldBe dumpFile
72+
}
73+
}
3674
}
Lines changed: 167 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,167 @@
1+
package kotlinx.validation.test
2+
3+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.*
4+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build
5+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.buildAndFail
6+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome
7+
import io.kotest.assertions.withClue
8+
import io.kotest.matchers.file.shouldExist
9+
import io.kotest.matchers.shouldBe
10+
import io.kotest.matchers.string.shouldContain
11+
import org.gradle.testkit.runner.TaskOutcome.FAILED
12+
import org.gradle.testkit.runner.TaskOutcome.SUCCESS
13+
import org.junit.jupiter.api.Test
14+
15+
class OutputDirectoryTests : BaseKotlinGradleTest() {
16+
17+
@Test
18+
fun dumpIntoCustomDirectory() {
19+
val runner = test {
20+
buildGradleKts {
21+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
22+
resolve("/examples/gradle/configuration/outputDirectory/different.gradle.kts")
23+
}
24+
25+
kotlin("AnotherBuildConfig.kt") {
26+
resolve("/examples/classes/AnotherBuildConfig.kt")
27+
}
28+
dir("api") {
29+
file("letMeBe.txt")
30+
}
31+
32+
runner {
33+
arguments.add(":apiDump")
34+
}
35+
}
36+
37+
runner.build {
38+
shouldHaveTaskWithOutcome(":apiDump", SUCCESS)
39+
40+
val dumpFile = rootProjectDir.resolve("custom/${rootProjectDir.name}.api")
41+
dumpFile.shouldExist()
42+
43+
val expected = readResourceFile("/examples/classes/AnotherBuildConfig.dump")
44+
dumpFile.readText() shouldBe expected
45+
46+
val fileInsideDir = rootProjectDir.resolve("api").resolve("letMeBe.txt")
47+
withClue("existing api directory should not be overwritten") {
48+
fileInsideDir.shouldExist()
49+
}
50+
}
51+
}
52+
53+
@Test
54+
fun validateDumpFromACustomDirectory() {
55+
val runner = test {
56+
buildGradleKts {
57+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
58+
resolve("/examples/gradle/configuration/outputDirectory/different.gradle.kts")
59+
}
60+
61+
kotlin("AnotherBuildConfig.kt") {
62+
resolve("/examples/classes/AnotherBuildConfig.kt")
63+
}
64+
dir("custom") {
65+
file("${rootProjectDir.name}.api") {
66+
resolve("/examples/classes/AnotherBuildConfig.dump")
67+
}
68+
}
69+
70+
runner {
71+
arguments.add(":apiCheck")
72+
}
73+
}
74+
75+
runner.build {
76+
shouldHaveTaskWithOutcome(":apiCheck", SUCCESS)
77+
}
78+
}
79+
80+
@Test
81+
fun dumpIntoSubdirectory() {
82+
val runner = test {
83+
buildGradleKts {
84+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
85+
resolve("/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts")
86+
}
87+
88+
kotlin("AnotherBuildConfig.kt") {
89+
resolve("/examples/classes/AnotherBuildConfig.kt")
90+
}
91+
92+
runner {
93+
arguments.add(":apiDump")
94+
}
95+
}
96+
97+
runner.build {
98+
shouldHaveTaskWithOutcome(":apiDump", SUCCESS)
99+
100+
val dumpFile = rootProjectDir.resolve("validation/api/${rootProjectDir.name}.api")
101+
dumpFile.shouldExist()
102+
103+
val expected = readResourceFile("/examples/classes/AnotherBuildConfig.dump")
104+
dumpFile.readText() shouldBe expected
105+
}
106+
}
107+
108+
@Test
109+
fun validateDumpFromASubdirectory() {
110+
val runner = test {
111+
buildGradleKts {
112+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
113+
resolve("/examples/gradle/configuration/outputDirectory/subdirectory.gradle.kts")
114+
}
115+
116+
kotlin("AnotherBuildConfig.kt") {
117+
resolve("/examples/classes/AnotherBuildConfig.kt")
118+
}
119+
dir("validation") {
120+
dir("api") {
121+
file("${rootProjectDir.name}.api") {
122+
resolve("/examples/classes/AnotherBuildConfig.dump")
123+
}
124+
}
125+
}
126+
127+
runner {
128+
arguments.add(":apiCheck")
129+
}
130+
}
131+
132+
runner.build {
133+
shouldHaveTaskWithOutcome(":apiCheck", SUCCESS)
134+
}
135+
}
136+
137+
@Test
138+
fun dumpIntoParentDirectory() {
139+
val runner = test {
140+
buildGradleKts {
141+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
142+
resolve("/examples/gradle/configuration/outputDirectory/outer.gradle.kts")
143+
}
144+
145+
kotlin("AnotherBuildConfig.kt") {
146+
resolve("/examples/classes/AnotherBuildConfig.kt")
147+
}
148+
149+
runner {
150+
arguments.add(":apiDump")
151+
}
152+
}
153+
154+
runner.buildAndFail {
155+
shouldHaveTaskWithOutcome(":apiDump", FAILED)
156+
157+
output shouldContain /* language=text */ """
158+
|> Error: Invalid output apiDirectory
159+
|
160+
| apiDirectory is set to a custom directory, outside of the current project directory.
161+
| This is not permitted. apiDirectory must be a subdirectory of project ':' (the root project) directory.
162+
|
163+
| Remove the custom apiDirectory, or update apiDirectory to be a project subdirectory.
164+
""".trimMargin()
165+
}
166+
}
167+
}

modules/bcv-gradle-plugin-functional-tests/src/functionalTest/kotlin/kotlinx/validation/test/PublicMarkersTest.kt

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,11 @@ package kotlinx.validation.test
22

33
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.api.*
44
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.build
5+
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.invariantNewlines
56
import dev.adamko.kotlin.binary_compatibility_validator.test.utils.shouldHaveTaskWithOutcome
7+
import io.kotest.matchers.file.shouldBeAFile
8+
import io.kotest.matchers.file.shouldExist
9+
import io.kotest.matchers.shouldBe
610
import org.gradle.testkit.runner.TaskOutcome.SUCCESS
711
import org.junit.jupiter.api.Test
812

@@ -15,19 +19,15 @@ class PublicMarkersTest : BaseKotlinGradleTest() {
1519
resolve("/examples/gradle/base/withPlugin.gradle.kts")
1620
resolve("/examples/gradle/configuration/publicMarkers/markers.gradle.kts")
1721
}
18-
1922
kotlin("ClassWithPublicMarkers.kt") {
2023
resolve("/examples/classes/ClassWithPublicMarkers.kt")
2124
}
22-
2325
kotlin("ClassInPublicPackage.kt") {
2426
resolve("/examples/classes/ClassInPublicPackage.kt")
2527
}
26-
2728
apiFile(projectName = rootProjectDir.name) {
2829
resolve("/examples/classes/ClassWithPublicMarkers.dump")
2930
}
30-
3131
runner {
3232
arguments.add(":apiCheck")
3333
}
@@ -37,4 +37,38 @@ class PublicMarkersTest : BaseKotlinGradleTest() {
3737
shouldHaveTaskWithOutcome(":apiCheck", SUCCESS)
3838
}
3939
}
40+
41+
@Test
42+
fun testFiltrationByPackageLevelAnnotations() {
43+
val runner = test {
44+
buildGradleKts {
45+
resolve("/examples/gradle/base/withPlugin.gradle.kts")
46+
resolve("/examples/gradle/configuration/publicMarkers/packages.gradle.kts")
47+
}
48+
java("annotated/PackageAnnotation.java") {
49+
resolve("/examples/classes/PackageAnnotation.java")
50+
}
51+
java("annotated/package-info.java") {
52+
resolve("/examples/classes/package-info.java")
53+
}
54+
kotlin("ClassFromAnnotatedPackage.kt") {
55+
resolve("/examples/classes/ClassFromAnnotatedPackage.kt")
56+
}
57+
kotlin("AnotherBuildConfig.kt") {
58+
resolve("/examples/classes/AnotherBuildConfig.kt")
59+
}
60+
runner {
61+
arguments.add(":apiDump")
62+
}
63+
}
64+
65+
runner.build {
66+
shouldHaveTaskWithOutcome(":apiDump", SUCCESS)
67+
68+
rootProjectApiDump.shouldExist()
69+
rootProjectApiDump.shouldBeAFile()
70+
val expected = readResourceFile("/examples/classes/AnnotatedPackage.dump")
71+
rootProjectApiDump.readText().invariantNewlines() shouldBe expected
72+
}
73+
}
4074
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
public final class annotated/ClassFromAnnotatedPackage {
2+
public fun <init> ()V
3+
}
4+
5+
public abstract interface annotation class annotated/PackageAnnotation : java/lang/annotation/Annotation {
6+
}
7+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
public final class com/company/BuildCon {
2+
public fun <init> ()V
3+
public final fun f1 ()I
4+
public final fun getP1 ()I
5+
}
6+
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package com.company
2+
3+
public class BuildCon {
4+
public val p1 = 1
5+
6+
public fun f1() = p1
7+
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
package annotated
2+
3+
class ClassFromAnnotatedPackage {
4+
}

0 commit comments

Comments
 (0)