From 9ae47004d0d451ee9e98d98c903e7992470f4b1e Mon Sep 17 00:00:00 2001 From: Yahor Berdnikau Date: Sat, 27 Mar 2021 21:34:26 +0100 Subject: [PATCH] Append by default heap dump options. ^KT-45744 In Progress --- .../kotlin/gradle/testbase/testDsl.kt | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) diff --git a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/testDsl.kt b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/testDsl.kt index f34078528dd..e8068cdb185 100644 --- a/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/testDsl.kt +++ b/libraries/tools/kotlin-gradle-plugin-integration-tests/src/test/kotlin/org/jetbrains/kotlin/gradle/testbase/testDsl.kt @@ -9,11 +9,17 @@ import org.gradle.testkit.runner.BuildResult import org.gradle.testkit.runner.GradleRunner import org.gradle.util.GradleVersion import kotlin.test.assertTrue +import java.io.File import java.nio.file.* import java.nio.file.Files.copy import java.nio.file.Files.createDirectories import java.nio.file.attribute.BasicFileAttributes +import kotlin.io.path.ExperimentalPathApi +import kotlin.io.path.createFile +import kotlin.io.path.exists +import kotlin.io.path.readText +import kotlin.io.path.writeText /** * Create new test project. @@ -26,6 +32,7 @@ fun KGPBaseTest.project( gradleVersion: GradleVersion, buildOptions: KGPBaseTest.BuildOptions = defaultBuildOptions, forceOutput: Boolean = false, + addHeapDumpOptions: Boolean = true, test: TestProject.() -> Unit ): TestProject { val projectPath = setupProjectFromTestResources( @@ -34,6 +41,7 @@ fun KGPBaseTest.project( workingDir ) projectPath.addDefaultBuildFiles() + if (addHeapDumpOptions) projectPath.addHeapDumpOptions() val gradleRunner = GradleRunner .create() @@ -151,6 +159,52 @@ private fun Path.addDefaultBuildFiles() { } } +@OptIn(ExperimentalPathApi::class) +private fun Path.addHeapDumpOptions() { + val propertiesFile = resolve("gradle.properties") + if (!propertiesFile.exists()) propertiesFile.createFile() + + val propertiesContent = propertiesFile.readText() + val (existingJvmArgsLine, otherLines) = propertiesContent + .lines() + .partition { + it.trim().startsWith("org.gradle.jvmargs") + } + + val heapDumpOutOfErrorStr = "-XX:+HeapDumpOnOutOfMemoryError" + val heapDumpPathStr = "-XX:HeapDumpPath=\"${System.getProperty("user.dir")}${File.separatorChar}build\"" + + if (existingJvmArgsLine.isEmpty()) { + propertiesFile.writeText( + """ + # modified in addHeapDumpOptions + org.gradle.jvmargs=$heapDumpOutOfErrorStr $heapDumpPathStr + + $propertiesContent + """.trimIndent() + ) + } else { + val argsLine = existingJvmArgsLine.first() + val appendedOptions = buildString { + if (!argsLine.contains("HeapDumpOnOutOfMemoryError")) append(" $heapDumpOutOfErrorStr") + if (!argsLine.contains("HeapDumpPath")) append(" $heapDumpPathStr") + } + + if (appendedOptions.isNotEmpty()) { + propertiesFile.writeText( + """ + # modified in addHeapDumpOptions + $argsLine$appendedOptions + + ${otherLines.joinToString(separator = "\n")} + """.trimIndent() + ) + } else { + println("<=== Heap dump options are already exists! ===>") + } + } +} + private fun Path.copyRecursively(dest: Path) { Files.walkFileTree(this, object : SimpleFileVisitor() { override fun preVisitDirectory(