aboutsummaryrefslogtreecommitdiff
path: root/integration-tests/gradle
diff options
context:
space:
mode:
authorMarcin Aman <marcin.aman@gmail.com>2021-06-21 11:44:36 +0200
committerGitHub <noreply@github.com>2021-06-21 11:44:36 +0200
commita0b77276242ec227f98bf69ed878b9d71c1c5888 (patch)
tree796cc4638808ae26a060d3f1b17f20aa117d5af0 /integration-tests/gradle
parent1b918994dbfe8f4d345c11c054c8b5ffc9b65cd4 (diff)
downloaddokka-a0b77276242ec227f98bf69ed878b9d71c1c5888.tar.gz
dokka-a0b77276242ec227f98bf69ed878b9d71c1c5888.tar.bz2
dokka-a0b77276242ec227f98bf69ed878b9d71c1c5888.zip
Cachable task (#1905)
* Add tests for Gradle caching scenarios and adjust tasks to honor caching such that tests pass * Make dokka tasks cachable * Make dokka tasks cachable * Make dokka tasks cachable * Fix gradle assertion Co-authored-by: Volker Leck <volker.leck@gmail.com>
Diffstat (limited to 'integration-tests/gradle')
-rw-r--r--integration-tests/gradle/projects/it-basic/build.gradle.kts2
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleCachingIntegrationTest.kt136
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicCachingIntegrationTest.kt47
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicGradleIntegrationTest.kt36
-rw-r--r--integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/GradleRelocatedCachingIntegrationTest.kt45
5 files changed, 257 insertions, 9 deletions
diff --git a/integration-tests/gradle/projects/it-basic/build.gradle.kts b/integration-tests/gradle/projects/it-basic/build.gradle.kts
index 414037fe..e5abd7e1 100644
--- a/integration-tests/gradle/projects/it-basic/build.gradle.kts
+++ b/integration-tests/gradle/projects/it-basic/build.gradle.kts
@@ -50,5 +50,5 @@ tasks.withType<DokkaTask> {
}
suppressObviousFunctions.set(false)
- pluginsMapConfiguration.set(mapOf(DokkaBase::class.qualifiedName to """{ "customStyleSheets": ["${file("customResources/logo-styles.css")}", "${file("customResources/custom-style-to-add.css")}"], "customAssets" : ["${file("customResources/custom-resource.svg")}"] }"""))
+ pluginsMapConfiguration.set(mapOf(DokkaBase::class.qualifiedName to """{ "customStyleSheets": ["${file("../customResources/logo-styles.css")}", "${file("../customResources/custom-style-to-add.css")}"], "customAssets" : ["${file("../customResources/custom-resource.svg")}"] }"""))
}
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleCachingIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleCachingIntegrationTest.kt
new file mode 100644
index 00000000..2bce02aa
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/AbstractGradleCachingIntegrationTest.kt
@@ -0,0 +1,136 @@
+package org.jetbrains.dokka.it.gradle
+
+import org.gradle.util.GradleVersion
+import java.io.File
+import kotlin.test.*
+
+abstract class AbstractGradleCachingIntegrationTest(override val versions: BuildVersions): AbstractGradleIntegrationTest() {
+ fun setupProject(project: File) {
+ val templateProjectDir = File("projects", "it-basic")
+ project.mkdirs()
+ templateProjectDir.listFiles().orEmpty()
+ .filter { it.isFile }
+ .forEach { topLevelFile -> topLevelFile.copyTo(File(project, topLevelFile.name)) }
+
+ File(templateProjectDir, "src").copyRecursively(File(project, "src"))
+ val customResourcesDir = File(templateProjectDir, "customResources")
+ if(customResourcesDir.exists() && customResourcesDir.isDirectory) {
+ val destination = File(project.parentFile, "customResources")
+ destination.mkdirs()
+ destination.deleteRecursively()
+ customResourcesDir.copyRecursively(destination)
+ }
+
+ // clean local cache for each test
+ if (versions.gradleVersion >= GradleVersion.version("7.0")) {
+ //Gradle 7.0 removed the old syntax
+ project.toPath().resolve("settings.gradle.kts").toFile().appendText(
+ """
+ buildCache {
+ local {
+ // Set local build cache directory.
+ directory = File("${projectDir.absolutePath}", "build-cache")
+ }
+ }
+ """.trimIndent()
+ )
+ } else {
+ project.toPath().resolve("settings.gradle.kts").toFile().appendText(
+ """
+ buildCache {
+ local<DirectoryBuildCache> {
+ // Set local build cache directory.
+ directory = File("${projectDir.absolutePath}", "build-cache")
+ }
+ }
+ """.trimIndent()
+ )
+ }
+ }
+
+ fun File.assertHtmlOutputDir() {
+ assertTrue(isDirectory, "Missing dokka html output directory")
+
+ val imagesDir = File(this, "images")
+ assertTrue(imagesDir.isDirectory, "Missing images directory")
+
+ val scriptsDir = File(this, "scripts")
+ assertTrue(scriptsDir.isDirectory, "Missing scripts directory")
+ val reactFile = File(this, "scripts/main.js")
+ assertTrue(reactFile.isFile, "Missing main.js")
+
+ val stylesDir = File(this, "styles")
+ assertTrue(stylesDir.isDirectory, "Missing styles directory")
+ val reactStyles = File(this, "styles/main.css")
+ assertTrue(reactStyles.isFile, "Missing main.css")
+
+ val navigationHtml = File(this, "navigation.html")
+ assertTrue(navigationHtml.isFile, "Missing navigation.html")
+
+ val moduleOutputDir = File(this, "-basic -project")
+ assertTrue(moduleOutputDir.isDirectory, "Missing module directory")
+
+ val moduleIndexHtml = File(this, "index.html")
+ assertTrue(moduleIndexHtml.isFile, "Missing module index.html")
+
+ val modulePackageDir = File(moduleOutputDir, "it.basic")
+ assertTrue(modulePackageDir.isDirectory, "Missing it.basic package directory")
+
+ val modulePackageIndexHtml = File(modulePackageDir, "index.html")
+ assertTrue(modulePackageIndexHtml.isFile, "Missing module package index.html")
+
+ val moduleJavaPackageDir = File(moduleOutputDir, "it.basic.java")
+ assertTrue(moduleJavaPackageDir.isDirectory, "Missing it.basic.java package directory")
+
+ allHtmlFiles().forEach { file ->
+ assertContainsNoErrorClass(file)
+ assertNoUnresolvedLinks(file)
+ assertNoHrefToMissingLocalFileOrDirectory(file)
+ assertNoSuppressedMarker(file)
+ assertNoEmptyLinks(file)
+ assertNoEmptySpans(file)
+ }
+
+ assertTrue(
+ allHtmlFiles().any { file -> "Basic Project" in file.readText() },
+ "Expected configured moduleName to be present in html"
+ )
+
+ assertTrue(
+ allHtmlFiles().any { file ->
+ "https://github.com/Kotlin/dokka/tree/master/" +
+ "integration-tests/gradle/projects/it-basic/" +
+ "src/main/kotlin/it/basic/PublicClass.kt" in file.readText()
+ },
+ "Expected `PublicClass` source link to GitHub"
+ )
+
+ assertTrue(
+ allHtmlFiles().any { file ->
+ "https://github.com/Kotlin/dokka/tree/master/" +
+ "integration-tests/gradle/projects/it-basic/" +
+ "src/main/java/it/basic/java/SampleJavaClass.java" in file.readText()
+ },
+ "Expected `SampleJavaClass` source link to GitHub"
+ )
+
+ val anchorsShouldNotHaveHashes = "<a data-name=\".*#.*\"\\sanchor-label=\"*.*\">".toRegex()
+ assertTrue(
+ allHtmlFiles().all { file ->
+ !anchorsShouldNotHaveHashes.containsMatchIn(file.readText())
+ },
+ "Anchors should not have hashes inside"
+ )
+
+ assertEquals(
+ """#logo{background-image:url('https://upload.wikimedia.org/wikipedia/commons/9/9d/Ubuntu_logo.svg');}""",
+ stylesDir.resolve("logo-styles.css").readText().replace("\\s".toRegex(), ""),
+ )
+ assertTrue(stylesDir.resolve("custom-style-to-add.css").isFile)
+ assertEquals("""/* custom stylesheet */""", stylesDir.resolve("custom-style-to-add.css").readText())
+ allHtmlFiles().forEach { file ->
+ if(file.name != "navigation.html") assertTrue("custom-style-to-add.css" in file.readText(), "custom styles not added to html file ${file.name}")
+ }
+ assertTrue(imagesDir.resolve("custom-resource.svg").isFile)
+ }
+} \ No newline at end of file
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicCachingIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicCachingIntegrationTest.kt
new file mode 100644
index 00000000..2207a13f
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicCachingIntegrationTest.kt
@@ -0,0 +1,47 @@
+package org.jetbrains.dokka.it.gradle
+
+import org.gradle.testkit.runner.TaskOutcome
+import org.junit.runners.Parameterized.Parameters
+import java.io.File
+import kotlin.test.*
+
+class BasicCachingIntegrationTest(override val versions: BuildVersions) : AbstractGradleCachingIntegrationTest(versions) {
+
+ companion object {
+ @get:JvmStatic
+ @get:Parameters(name = "{0}")
+ val versions = BuildVersions.permutations(
+ gradleVersions = listOf("7.0", *ifExhaustive("6.6", "6.1.1")),
+ kotlinVersions = listOf("1.3.30", *ifExhaustive("1.3.72", "1.4.32"), "1.5.0")
+ ) + BuildVersions.permutations(
+ gradleVersions = listOf("5.6.4", "6.0"),
+ kotlinVersions = listOf("1.3.30", *ifExhaustive("1.4.32"))
+ )
+ }
+
+ @BeforeTest
+ fun setupProjectFiles(){
+ setupProject(projectDir)
+ }
+
+ @Test
+ fun execute() {
+ runAndAssertOutcome(TaskOutcome.SUCCESS)
+ runAndAssertOutcome(TaskOutcome.FROM_CACHE)
+ }
+
+ private fun runAndAssertOutcome(expectedOutcome: TaskOutcome) {
+ val result = createGradleRunner(
+ "clean",
+ "dokkaHtml",
+ "-i",
+ "-s",
+ "-Dorg.gradle.caching.debug=true",
+ "--build-cache"
+ ).buildRelaxed()
+
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaHtml")).outcome)
+
+ File(projectDir, "build/dokka/html").assertHtmlOutputDir()
+ }
+}
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicGradleIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicGradleIntegrationTest.kt
index 11f20ae8..1322356f 100644
--- a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicGradleIntegrationTest.kt
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/BasicGradleIntegrationTest.kt
@@ -29,18 +29,35 @@ class BasicGradleIntegrationTest(override val versions: BuildVersions) : Abstrac
File(templateProjectDir, "src").copyRecursively(File(projectDir, "src"))
val customResourcesDir = File(templateProjectDir, "customResources")
- if(customResourcesDir.exists() && customResourcesDir.isDirectory) customResourcesDir.copyRecursively(File(projectDir, "customResources"))
+
+ if (customResourcesDir.exists() && customResourcesDir.isDirectory) {
+ val destination = File(projectDir.parentFile, "customResources")
+ destination.mkdirs()
+ destination.deleteRecursively()
+ customResourcesDir.copyRecursively(destination)
+ }
}
@Test
fun execute() {
- val result = createGradleRunner("dokkaHtml", "dokkaJavadoc", "dokkaGfm", "dokkaJekyll", "-i", "-s")
- .buildRelaxed()
+ runAndAssertOutcome(TaskOutcome.SUCCESS)
+ runAndAssertOutcome(TaskOutcome.UP_TO_DATE)
+ }
- assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaHtml")).outcome)
- assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaJavadoc")).outcome)
- assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaGfm")).outcome)
- assertEquals(TaskOutcome.SUCCESS, assertNotNull(result.task(":dokkaJekyll")).outcome)
+ private fun runAndAssertOutcome(expectedOutcome: TaskOutcome) {
+ val result = createGradleRunner(
+ "dokkaHtml",
+ "dokkaJavadoc",
+ "dokkaGfm",
+ "dokkaJekyll",
+ "-i",
+ "-s"
+ ).buildRelaxed()
+
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaHtml")).outcome)
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaJavadoc")).outcome)
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaGfm")).outcome)
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaJekyll")).outcome)
File(projectDir, "build/dokka/html").assertHtmlOutputDir()
File(projectDir, "build/dokka/javadoc").assertJavadocOutputDir()
@@ -129,7 +146,10 @@ class BasicGradleIntegrationTest(override val versions: BuildVersions) : Abstrac
assertTrue(stylesDir.resolve("custom-style-to-add.css").isFile)
assertEquals("""/* custom stylesheet */""", stylesDir.resolve("custom-style-to-add.css").readText())
allHtmlFiles().forEach { file ->
- if(file.name != "navigation.html") assertTrue("custom-style-to-add.css" in file.readText(), "custom styles not added to html file ${file.name}")
+ if (file.name != "navigation.html") assertTrue(
+ "custom-style-to-add.css" in file.readText(),
+ "custom styles not added to html file ${file.name}"
+ )
}
assertTrue(imagesDir.resolve("custom-resource.svg").isFile)
}
diff --git a/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/GradleRelocatedCachingIntegrationTest.kt b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/GradleRelocatedCachingIntegrationTest.kt
new file mode 100644
index 00000000..d82c3827
--- /dev/null
+++ b/integration-tests/gradle/src/integrationTest/kotlin/org/jetbrains/dokka/it/gradle/GradleRelocatedCachingIntegrationTest.kt
@@ -0,0 +1,45 @@
+package org.jetbrains.dokka.it.gradle
+
+import org.gradle.testkit.runner.TaskOutcome
+import org.junit.runners.Parameterized.Parameters
+import java.io.File
+import kotlin.test.*
+
+class GradleRelocatedCachingIntegrationTest(override val versions: BuildVersions) : AbstractGradleCachingIntegrationTest(versions) {
+
+ companion object {
+ @get:JvmStatic
+ @get:Parameters(name = "{0}")
+ val versions = BuildVersions.permutations(
+ gradleVersions = listOf("7.0", *ifExhaustive("6.6", "6.1.1")),
+ kotlinVersions = listOf("1.3.30", *ifExhaustive("1.3.72", "1.4.32"), "1.5.0")
+ ) + BuildVersions.permutations(
+ gradleVersions = listOf("5.6.4", "6.0"),
+ kotlinVersions = listOf("1.3.30", *ifExhaustive("1.4.32"))
+ )
+ }
+
+ @BeforeTest
+ fun prepareProjectFiles() {
+ setupProject(projectFolder(1))
+ setupProject(projectFolder(2))
+ }
+
+ @Test
+ fun execute() {
+ runAndAssertOutcome(projectFolder(1), TaskOutcome.SUCCESS)
+ runAndAssertOutcome(projectFolder(2), TaskOutcome.FROM_CACHE)
+ }
+
+ private fun runAndAssertOutcome(project: File, expectedOutcome: TaskOutcome) {
+ val result = createGradleRunner("clean", "dokkaHtml", "-i", "-s", "-Dorg.gradle.caching.debug=true", "--build-cache")
+ .withProjectDir(project)
+ .buildRelaxed()
+
+ assertEquals(expectedOutcome, assertNotNull(result.task(":dokkaHtml")).outcome)
+
+ File(project, "build/dokka/html").assertHtmlOutputDir()
+ }
+
+ private fun projectFolder(index: Int) = File(projectDir.absolutePath + index)
+}