From cb20227d354b1b74ca6784d55ea75cc8b5281abd Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 7 Jul 2020 11:08:34 +0200 Subject: Implement simple cli integration test --- integration-tests/cli/build.gradle.kts | 39 ++++++++++ .../main/java/it/basic/java/SampleJavaClass.java | 17 +++++ .../it-cli/src/main/kotlin/it/basic/PublicClass.kt | 48 +++++++++++++ .../jetbrains/dokka/it/cli/CliIntegrationTest.kt | 82 ++++++++++++++++++++++ .../dokka/it/cli/AbstractCliIntegrationTest.kt | 36 ++++++++++ .../org/jetbrains/dokka/it/cli/processUtils.kt | 51 ++++++++++++++ 6 files changed, 273 insertions(+) create mode 100644 integration-tests/cli/build.gradle.kts create mode 100644 integration-tests/cli/projects/it-cli/src/main/java/it/basic/java/SampleJavaClass.java create mode 100644 integration-tests/cli/projects/it-cli/src/main/kotlin/it/basic/PublicClass.kt create mode 100644 integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt create mode 100644 integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/AbstractCliIntegrationTest.kt create mode 100644 integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/build.gradle.kts b/integration-tests/cli/build.gradle.kts new file mode 100644 index 00000000..c3e98d0a --- /dev/null +++ b/integration-tests/cli/build.gradle.kts @@ -0,0 +1,39 @@ +import com.github.jengelman.gradle.plugins.shadow.tasks.ShadowJar + + +plugins { + id("com.github.johnrengelman.shadow") +} + +val dokka_version: String by project +evaluationDependsOn(":runners:cli") +evaluationDependsOn(":plugins:base") + +dependencies { + implementation(kotlin("stdlib")) + implementation(kotlin("test-junit")) + + val coroutines_version: String by project + implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version") + +} + +/* Create a fat base plugin jar for cli tests */ +val basePluginShadow: Configuration by configurations.creating +dependencies { + basePluginShadow(project(":plugins:base")) +} +val basePluginShadowJar = tasks.create("basePluginShadowJar", ShadowJar::class) { + configurations = listOf(basePluginShadow) + archiveFileName.set("fat-base-plugin-$dokka_version.jar") + archiveClassifier.set("") +} + +tasks.integrationTest { + val cliJar = tasks.getByPath(":runners:cli:shadowJar") as ShadowJar + environment("CLI_JAR_PATH", cliJar.archiveFile.get()) + environment("BASE_PLUGIN_JAR_PATH", basePluginShadowJar.archiveFile.get()) + dependsOn(cliJar) + dependsOn(basePluginShadowJar) +} + diff --git a/integration-tests/cli/projects/it-cli/src/main/java/it/basic/java/SampleJavaClass.java b/integration-tests/cli/projects/it-cli/src/main/java/it/basic/java/SampleJavaClass.java new file mode 100644 index 00000000..23b0202c --- /dev/null +++ b/integration-tests/cli/projects/it-cli/src/main/java/it/basic/java/SampleJavaClass.java @@ -0,0 +1,17 @@ +package it.basic.java; + +import it.basic.PublicClass; + +/** + * This class is, unlike {@link PublicClass}, written in Java + */ +@SuppressWarnings("unused") +public class SampleJavaClass { + + /** + * @return Empty instance of {@link PublicClass} + */ + public PublicClass publicDocumentedFunction() { + return new PublicClass(); + } +} diff --git a/integration-tests/cli/projects/it-cli/src/main/kotlin/it/basic/PublicClass.kt b/integration-tests/cli/projects/it-cli/src/main/kotlin/it/basic/PublicClass.kt new file mode 100644 index 00000000..71bc7e63 --- /dev/null +++ b/integration-tests/cli/projects/it-cli/src/main/kotlin/it/basic/PublicClass.kt @@ -0,0 +1,48 @@ +@file:Suppress("unused") + +package it.basic + +class PublicClass { + /** + * This function is public and documented + */ + fun publicDocumentedFunction(): String = "" + + fun publicUndocumentedFunction(): String = "" + + /** + * This function is internal and documented + */ + internal fun internalDocumentedFunction(): String = "" + + internal fun internalUndocumentedFunction(): String = "" + + /** + * This function is private and documented + */ + private fun privateDocumentedFunction(): String = "" + + private fun privateUndocumentedFunction(): String = "" + + + /** + * This property is public and documented + */ + val publicDocumentedProperty: Int = 0 + + val publicUndocumentedProperty: Int = 0 + + /** + * This property internal and documented + */ + val internalDocumentedProperty: Int = 0 + + val internalUndocumentedProperty: Int = 0 + + /** + * This property private and documented + */ + private val privateDocumentedProperty: Int = 0 + + private val privateUndocumentedProperty: Int = 0 +} diff --git a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt new file mode 100644 index 00000000..5e24c1cd --- /dev/null +++ b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt @@ -0,0 +1,82 @@ +package org.jetbrains.dokka.it.cli + +import java.io.File +import kotlin.test.BeforeTest +import kotlin.test.Test +import kotlin.test.assertEquals +import kotlin.test.assertTrue + +class CliIntegrationTest : AbstractCliIntegrationTest() { + + @BeforeTest + fun copyProject() { + val templateProjectDir = File("projects", "it-cli") + templateProjectDir.copyRecursively(projectDir) + } + + @Test + fun runHelp() { + val process = ProcessBuilder("java", "-jar", cliJarFile.path, "-h") + .redirectErrorStream(true) + .start() + + val result = process.awaitProcessResult() + assertEquals(0, result.exitCode, "Expected exitCode 0 (Success)") + assertTrue("Usage: " in result.output) + } + + @Test + fun runCli() { + val dokkaOutputDir = File(projectDir, "output") + assertTrue(dokkaOutputDir.mkdirs()) + val process = ProcessBuilder( + "java", "-jar", cliJarFile.path, + "-outputDir", dokkaOutputDir.path, + "-format", "html", + "-pluginsClasspath", basePluginJarFile.path, + "-sourceSet", + buildString { + append(" -moduleName it-cli") + append(" -moduleDisplayName CLI-Example") + append(" -sourceSetName cliMain") + append(" -src ${File(projectDir, "src").path}") + append(" -jdkVersion 8") + append(" -analysisPlatform jvm") + append(" -reportUndocumented") + append(" -skipDeprecated") + } + ) + .redirectErrorStream(true) + .start() + + val result = process.awaitProcessResult() + assertEquals(0, result.exitCode, "Expected exitCode 0 (Success)") + + val extensionLoadedRegex = Regex("""Extension: org\.jetbrains\.dokka\.base\.DokkaBase""") + val amountOfExtensionsLoaded = extensionLoadedRegex.findAll(result.output).count() + + assertTrue( + amountOfExtensionsLoaded > 10, + "Expected more than 10 extensions being present (found $amountOfExtensionsLoaded)" + ) + + assertTrue(dokkaOutputDir.isDirectory, "Missing dokka output directory") + + val imagesDir = File(dokkaOutputDir, "images") + assertTrue(imagesDir.isDirectory, "Missing images directory") + + val scriptsDir = File(dokkaOutputDir, "scripts") + assertTrue(scriptsDir.isDirectory, "Missing scripts directory") + + val stylesDir = File(dokkaOutputDir, "styles") + assertTrue(stylesDir.isDirectory, "Missing styles directory") + + val navigationHtml = File(dokkaOutputDir, "navigation.html") + assertTrue(navigationHtml.isFile, "Missing navigation.html") + + projectDir.allHtmlFiles().forEach { file -> + assertContainsNoErrorClass(file) + assertNoUnresolvedLInks(file) + } + } +} diff --git a/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/AbstractCliIntegrationTest.kt b/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/AbstractCliIntegrationTest.kt new file mode 100644 index 00000000..7f6f9433 --- /dev/null +++ b/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/AbstractCliIntegrationTest.kt @@ -0,0 +1,36 @@ +package org.jetbrains.dokka.it.cli + +import org.jetbrains.dokka.it.AbstractIntegrationTest +import java.io.File +import kotlin.test.BeforeTest +import kotlin.test.assertTrue + +abstract class AbstractCliIntegrationTest : AbstractIntegrationTest() { + + protected val cliJarFile: File by lazy { + File(temporaryTestFolder.root, "dokka.jar") + } + + protected val basePluginJarFile: File by lazy { + File(temporaryTestFolder.root, "base-plugin.jar") + } + + @BeforeTest + fun copyJarFiles() { + val cliJarPathEnvironmentKey = "CLI_JAR_PATH" + val cliJarFile = File(System.getenv(cliJarPathEnvironmentKey)) + assertTrue( + cliJarFile.exists() && cliJarFile.isFile, + "Missing path to CLI jar System.getenv($cliJarPathEnvironmentKey)" + ) + cliJarFile.copyTo(this.cliJarFile) + + val basePluginPathEnvironmentKey = "BASE_PLUGIN_JAR_PATH" + val basePluginJarFile = File(System.getenv(basePluginPathEnvironmentKey)) + assertTrue( + basePluginJarFile.exists() && basePluginJarFile.isFile, + "Missing path to base plugin jar System.getenv($basePluginPathEnvironmentKey)" + ) + basePluginJarFile.copyTo(this.basePluginJarFile) + } +} diff --git a/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt b/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt new file mode 100644 index 00000000..d2fa3b31 --- /dev/null +++ b/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt @@ -0,0 +1,51 @@ +package org.jetbrains.dokka.it.cli + +import kotlinx.coroutines.CompletableDeferred +import kotlinx.coroutines.async +import kotlinx.coroutines.runBlocking +import kotlin.concurrent.thread + +class ProcessResult( + val exitCode: Int, + val output: String +) + +fun Process.awaitProcessResult() = runBlocking { + val exitCode = async { awaitExitCode() } + val output = async { awaitOutput() } + ProcessResult( + exitCode.await(), + output.await() + ) +} + +private suspend fun Process.awaitExitCode(): Int { + val deferred = CompletableDeferred() + thread { + try { + deferred.complete(this.waitFor()) + } catch (e: Throwable) { + deferred.completeExceptionally(e) + } + } + + return deferred.await() +} + +private suspend fun Process.awaitOutput(): String { + val deferred = CompletableDeferred() + thread { + try { + var string = "" + this.inputStream.bufferedReader().forEachLine { line -> + println(line) + string += line + System.lineSeparator() + } + deferred.complete(string) + } catch (e: Throwable) { + deferred.completeExceptionally(e) + } + } + + return deferred.await() +} -- cgit From f542ceb8014437a089175eac463e1fbf7cf520fd Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 7 Jul 2020 11:46:19 +0200 Subject: CliIntegrationTest: Add assertion for undocumented reports --- .../kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt index 5e24c1cd..49030c73 100644 --- a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt +++ b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt @@ -60,6 +60,13 @@ class CliIntegrationTest : AbstractCliIntegrationTest() { "Expected more than 10 extensions being present (found $amountOfExtensionsLoaded)" ) + val undocumentedReportRegex = Regex("""Undocumented:""") + val amountOfUndocumentedReports = undocumentedReportRegex.findAll(result.output).count() + assertTrue( + amountOfUndocumentedReports > 0, + "Expected at least one report of undocumented code (found $amountOfUndocumentedReports)" + ) + assertTrue(dokkaOutputDir.isDirectory, "Missing dokka output directory") val imagesDir = File(dokkaOutputDir, "images") -- cgit From 14b9352b9b7a4084f72209ba686170e313f7863b Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Tue, 7 Jul 2020 13:12:05 +0200 Subject: Lazily configure integration test tasks --- integration-tests/cli/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/build.gradle.kts b/integration-tests/cli/build.gradle.kts index c3e98d0a..f825a148 100644 --- a/integration-tests/cli/build.gradle.kts +++ b/integration-tests/cli/build.gradle.kts @@ -23,7 +23,7 @@ val basePluginShadow: Configuration by configurations.creating dependencies { basePluginShadow(project(":plugins:base")) } -val basePluginShadowJar = tasks.create("basePluginShadowJar", ShadowJar::class) { +val basePluginShadowJar by tasks.register("basePluginShadowJar", ShadowJar::class) { configurations = listOf(basePluginShadow) archiveFileName.set("fat-base-plugin-$dokka_version.jar") archiveClassifier.set("") -- cgit From 90459de7b6fce28a8ba57aca5eb213575204bc3d Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Mon, 15 Jun 2020 18:13:35 +0200 Subject: Update to Kotlin 1.4 M3 --- integration-tests/cli/build.gradle.kts | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/build.gradle.kts b/integration-tests/cli/build.gradle.kts index f825a148..5fdf0ff5 100644 --- a/integration-tests/cli/build.gradle.kts +++ b/integration-tests/cli/build.gradle.kts @@ -19,7 +19,12 @@ dependencies { } /* Create a fat base plugin jar for cli tests */ -val basePluginShadow: Configuration by configurations.creating +val basePluginShadow: Configuration by configurations.creating { + attributes { + attribute(Usage.USAGE_ATTRIBUTE, project.objects.named(Usage::class.java, "java-runtime")) + } +} + dependencies { basePluginShadow(project(":plugins:base")) } -- cgit From caf48e76f3bff5e9907cd094cf0719f623e528d5 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 8 Jul 2020 10:47:05 +0200 Subject: Implement simple MavenIntegrationTest.kt --- integration-tests/cli/build.gradle.kts | 5 +-- .../jetbrains/dokka/it/cli/CliIntegrationTest.kt | 1 + .../org/jetbrains/dokka/it/cli/processUtils.kt | 51 ---------------------- 3 files changed, 2 insertions(+), 55 deletions(-) delete mode 100644 integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/build.gradle.kts b/integration-tests/cli/build.gradle.kts index 5fdf0ff5..60d3a298 100644 --- a/integration-tests/cli/build.gradle.kts +++ b/integration-tests/cli/build.gradle.kts @@ -12,10 +12,6 @@ evaluationDependsOn(":plugins:base") dependencies { implementation(kotlin("stdlib")) implementation(kotlin("test-junit")) - - val coroutines_version: String by project - implementation("org.jetbrains.kotlinx:kotlinx-coroutines-core:$coroutines_version") - } /* Create a fat base plugin jar for cli tests */ @@ -35,6 +31,7 @@ val basePluginShadowJar by tasks.register("basePluginShadowJar", ShadowJar::clas } tasks.integrationTest { + inputs.dir((file("projects"))) val cliJar = tasks.getByPath(":runners:cli:shadowJar") as ShadowJar environment("CLI_JAR_PATH", cliJar.archiveFile.get()) environment("BASE_PLUGIN_JAR_PATH", basePluginShadowJar.archiveFile.get()) diff --git a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt index 49030c73..9f83c869 100644 --- a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt +++ b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt @@ -1,5 +1,6 @@ package org.jetbrains.dokka.it.cli +import org.jetbrains.dokka.it.awaitProcessResult import java.io.File import kotlin.test.BeforeTest import kotlin.test.Test diff --git a/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt b/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt deleted file mode 100644 index d2fa3b31..00000000 --- a/integration-tests/cli/src/main/kotlin/org/jetbrains/dokka/it/cli/processUtils.kt +++ /dev/null @@ -1,51 +0,0 @@ -package org.jetbrains.dokka.it.cli - -import kotlinx.coroutines.CompletableDeferred -import kotlinx.coroutines.async -import kotlinx.coroutines.runBlocking -import kotlin.concurrent.thread - -class ProcessResult( - val exitCode: Int, - val output: String -) - -fun Process.awaitProcessResult() = runBlocking { - val exitCode = async { awaitExitCode() } - val output = async { awaitOutput() } - ProcessResult( - exitCode.await(), - output.await() - ) -} - -private suspend fun Process.awaitExitCode(): Int { - val deferred = CompletableDeferred() - thread { - try { - deferred.complete(this.waitFor()) - } catch (e: Throwable) { - deferred.completeExceptionally(e) - } - } - - return deferred.await() -} - -private suspend fun Process.awaitOutput(): String { - val deferred = CompletableDeferred() - thread { - try { - var string = "" - this.inputStream.bufferedReader().forEachLine { line -> - println(line) - string += line + System.lineSeparator() - } - deferred.complete(string) - } catch (e: Throwable) { - deferred.completeExceptionally(e) - } - } - - return deferred.await() -} -- cgit From 4ba7ec9facb26c5ae0b0dd434e07c4af728f277a Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Wed, 8 Jul 2020 18:17:46 +0200 Subject: maven-integration-test: Fix style issues --- integration-tests/cli/build.gradle.kts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/build.gradle.kts b/integration-tests/cli/build.gradle.kts index 60d3a298..d9961f8f 100644 --- a/integration-tests/cli/build.gradle.kts +++ b/integration-tests/cli/build.gradle.kts @@ -31,7 +31,7 @@ val basePluginShadowJar by tasks.register("basePluginShadowJar", ShadowJar::clas } tasks.integrationTest { - inputs.dir((file("projects"))) + inputs.dir(file("projects")) val cliJar = tasks.getByPath(":runners:cli:shadowJar") as ShadowJar environment("CLI_JAR_PATH", cliJar.archiveFile.get()) environment("BASE_PLUGIN_JAR_PATH", basePluginShadowJar.archiveFile.get()) -- cgit From 71497c5561afd62c1a4296bd0d0beb689dfd8e51 Mon Sep 17 00:00:00 2001 From: "sebastian.sellmair" Date: Fri, 10 Jul 2020 07:41:24 +0200 Subject: Introduce dokkaKdoc task --- .../kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt | 1 - 1 file changed, 1 deletion(-) (limited to 'integration-tests/cli') diff --git a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt index 9f83c869..cfa752d6 100644 --- a/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt +++ b/integration-tests/cli/src/integrationTest/kotlin/org/jetbrains/dokka/it/cli/CliIntegrationTest.kt @@ -33,7 +33,6 @@ class CliIntegrationTest : AbstractCliIntegrationTest() { val process = ProcessBuilder( "java", "-jar", cliJarFile.path, "-outputDir", dokkaOutputDir.path, - "-format", "html", "-pluginsClasspath", basePluginJarFile.path, "-sourceSet", buildString { -- cgit