blob: 9076d2e59c0ce2af31103cca588c8d402432e420 [file] [log] [blame]
package com.google.devtools.ksp.test
import org.gradle.testkit.runner.BuildResult
import org.gradle.testkit.runner.GradleRunner
import org.gradle.testkit.runner.TaskOutcome
import org.junit.Assert
import org.junit.Rule
import org.junit.Test
import java.io.File
import java.util.jar.*
class PlaygroundIT {
@Rule
@JvmField
val project: TemporaryTestProject = TemporaryTestProject("playground")
private fun GradleRunner.buildAndCheck(vararg args: String, extraCheck: (BuildResult) -> Unit = {}) {
val result = this.withArguments(*args).build()
Assert.assertEquals(TaskOutcome.SUCCESS, result.task(":workload:build")?.outcome)
val artifact = File(project.root, "workload/build/libs/workload-1.0-SNAPSHOT.jar")
Assert.assertTrue(artifact.exists())
JarFile(artifact).use { jarFile ->
Assert.assertTrue(jarFile.getEntry("TestProcessor.log").size > 0)
Assert.assertTrue(jarFile.getEntry("hello/HELLO.class").size > 0)
Assert.assertTrue(jarFile.getEntry("g/G.class").size > 0)
Assert.assertTrue(jarFile.getEntry("g/GBuilder.class").size > 0)
Assert.assertTrue(jarFile.getEntry("com/example/AClassBuilder.class").size > 0)
}
extraCheck(result)
}
@Test
fun testPlayground() {
val gradleRunner = GradleRunner.create().withProjectDir(project.root)
gradleRunner.buildAndCheck("clean", "build")
gradleRunner.buildAndCheck("clean", "build")
}
// TODO: add another plugin and see if it is blocked.
// Or use a project that depends on a builtin plugin like all-open and see if the build fails
@Test
fun testBlockOtherCompilerPlugins() {
val gradleRunner = GradleRunner.create().withProjectDir(project.root)
File(project.root, "workload/build.gradle.kts").appendText("\nksp {\n blockOtherCompilerPlugins = true\n}\n")
gradleRunner.buildAndCheck("clean", "build")
gradleRunner.buildAndCheck("clean", "build")
project.restore("workload/build.gradle.kts")
}
/** Regression test for https://github.com/google/ksp/issues/518. */
@Test
fun testBuildWithConfigureOnDemand() {
val gradleRunner = GradleRunner.create().withProjectDir(project.root)
gradleRunner.buildAndCheck("--configure-on-demand", ":workload:build")
}
@Test
fun testBuildCache() {
val gradleRunner = GradleRunner.create().withProjectDir(project.root)
gradleRunner.buildAndCheck("--build-cache", ":workload:clean", "build") {
Assert.assertEquals(TaskOutcome.SUCCESS, it.task(":workload:kspKotlin")?.outcome)
}
gradleRunner.buildAndCheck("--build-cache", ":workload:clean", "build") {
Assert.assertEquals(TaskOutcome.FROM_CACHE, it.task(":workload:kspKotlin")?.outcome)
}
}
// Compiler's test infra report this kind of error before KSP, so it is not testable there.
@Test
fun testNoFunctionName() {
val gradleRunner = GradleRunner.create().withProjectDir(project.root)
fun buildAndFileAndCheck() {
gradleRunner.withArguments("build").buildAndFail().let { result ->
Assert.assertTrue(result.output.contains("Function declaration must have a name"))
}
}
File(project.root, "workload/src/main/java/com/example/A.kt").appendText("\n{}\n")
buildAndFileAndCheck()
project.restore("workload/src/main/java/com/example/A.kt")
File(project.root, "workload/src/main/java/com/example/A.kt").appendText("\nfun() = {0}\n")
buildAndFileAndCheck()
project.restore("workload/src/main/java/com/example/A.kt")
}
}