Load automatic module names correctly
Load the Automatic-Module-Name manifest entry value if it's present (see http://mail.openjdk.java.net/pipermail/jpms-spec-observers/2017-May/000877.html), otherwise sanitize the name of the .jar file, throwing out all chars except alphanumeric, duplicate dots and a version qualifier
This commit is contained in:
+9
-3
@@ -26,8 +26,9 @@ import org.jetbrains.kotlin.cli.jvm.K2JVMCompiler
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import org.jetbrains.kotlin.test.TestCaseWithTmpdir
|
||||
import java.io.File
|
||||
import java.util.jar.JarOutputStream
|
||||
import java.util.jar.Manifest
|
||||
import java.util.regex.Pattern
|
||||
import java.util.zip.ZipOutputStream
|
||||
|
||||
abstract class AbstractKotlinCompilerIntegrationTest : TestCaseWithTmpdir() {
|
||||
protected abstract val testDataPath: String
|
||||
@@ -56,6 +57,7 @@ abstract class AbstractKotlinCompilerIntegrationTest : TestCaseWithTmpdir() {
|
||||
KotlinTestUtils.compileJavaFiles(javaFiles, listOf("-d", outputDir.path))
|
||||
},
|
||||
checkKotlinOutput: (String) -> Unit = { actual -> assertEquals(normalizeOutput("" to ExitCode.OK), actual) },
|
||||
manifest: Manifest? = null,
|
||||
vararg extraClassPath: File
|
||||
): File {
|
||||
val sourceDir = File(testDataDirectory, libraryName)
|
||||
@@ -80,10 +82,14 @@ abstract class AbstractKotlinCompilerIntegrationTest : TestCaseWithTmpdir() {
|
||||
|
||||
if (isJar) {
|
||||
destination.delete()
|
||||
ZipOutputStream(destination.outputStream()).use { zip ->
|
||||
ZipUtil.addDirToZipRecursively(zip, destination, outputDir, "", null, null)
|
||||
val stream =
|
||||
if (manifest != null) JarOutputStream(destination.outputStream(), manifest)
|
||||
else JarOutputStream(destination.outputStream())
|
||||
stream.use { jar ->
|
||||
ZipUtil.addDirToZipRecursively(jar, destination, outputDir, "", null, null)
|
||||
}
|
||||
}
|
||||
else assertNull("Manifest is ignored if destination is not a .jar file", manifest)
|
||||
|
||||
return destination
|
||||
}
|
||||
|
||||
@@ -19,6 +19,7 @@ package org.jetbrains.kotlin.jvm.compiler
|
||||
import com.intellij.openapi.util.io.FileUtil
|
||||
import org.jetbrains.kotlin.test.KotlinTestUtils
|
||||
import java.io.File
|
||||
import java.util.jar.Manifest
|
||||
|
||||
class Java9ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() {
|
||||
override val testDataPath: String
|
||||
@@ -27,7 +28,8 @@ class Java9ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() {
|
||||
private fun module(
|
||||
name: String,
|
||||
modulePath: List<File> = emptyList(),
|
||||
addModules: List<String> = emptyList()
|
||||
addModules: List<String> = emptyList(),
|
||||
manifest: Manifest? = null
|
||||
): File {
|
||||
val jdk9Home = KotlinTestUtils.getJdk9HomeIfPossible() ?: return File("<test-skipped>")
|
||||
|
||||
@@ -55,7 +57,8 @@ class Java9ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() {
|
||||
}
|
||||
KotlinTestUtils.compileJavaFilesExternallyWithJava9(javaFiles, javaOptions)
|
||||
},
|
||||
checkKotlinOutput = checkKotlinOutput(name)
|
||||
checkKotlinOutput = checkKotlinOutput(name),
|
||||
manifest = manifest
|
||||
)
|
||||
}
|
||||
|
||||
@@ -182,4 +185,17 @@ class Java9ModulesIntegrationTest : AbstractKotlinCompilerIntegrationTest() {
|
||||
|
||||
module("main", listOf(libraryJar))
|
||||
}
|
||||
|
||||
fun testAutomaticModuleNames() {
|
||||
// This name should be sanitized to just "auto.mat1c.m0d.ule"
|
||||
val m1 = File(tmpdir, ".auto--mat1c-_-!@#\$%^&*()m0d_ule--1.0..0-release..jar")
|
||||
module("automatic-module1").renameTo(m1)
|
||||
|
||||
val m2 = module("automatic-module2", manifest = Manifest().apply {
|
||||
mainAttributes.putValue("Manifest-Version", "1.0")
|
||||
mainAttributes.putValue("Automatic-Module-Name", "automodule2")
|
||||
})
|
||||
|
||||
module("main", listOf(m1, m2))
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user