Fix classpath detection from classloader resources

This commit is contained in:
Ilya Chernikov
2019-06-01 13:51:33 +02:00
parent 27aa3a573e
commit 0a6ade88cc
3 changed files with 79 additions and 10 deletions
@@ -13,19 +13,50 @@ import java.io.FileOutputStream
import java.net.URLClassLoader
import java.util.jar.JarEntry
import java.util.jar.JarOutputStream
import java.util.jar.Manifest
import kotlin.script.experimental.jvm.util.classPathFromTypicalResourceUrls
import kotlin.script.experimental.jvm.util.classpathFromClassloader
class ClassPathTest : TestCase() {
lateinit var tempDir: File
override fun setUp() {
tempDir = createTempDir(ClassPathTest::class.simpleName!!)
super.setUp()
}
override fun tearDown() {
super.tearDown()
tempDir.deleteRecursively()
}
@Test
fun testExtractFromFat() {
val collection = createTempFile("col", ".jar").apply { createCollectionJar(emulatedCollectionFiles, "BOOT-INF") }
val collection = createTempFile("col", ".jar", directory = tempDir).apply { createCollectionJar(emulatedCollectionFiles, "BOOT-INF") }
val cl = URLClassLoader(arrayOf(collection.toURI().toURL()), null)
val cp = classpathFromClassloader(cl, true)
Assert.assertTrue(cp != null && cp.isNotEmpty())
testUnpackedCollection(cp!!, emulatedCollectionFiles)
}
@Test
fun testDetectClasspathFromResources() {
val root1 = createTempDir("root1", directory = tempDir)
val jar = createTempFile("jar1", ".jar", directory = tempDir).apply { createJarWithManifest() }
val cl = URLClassLoader(
(emulatedClasspath.map { File(root1, it).apply { mkdirs() }.toURI().toURL() }
+ jar.toURI().toURL()).toTypedArray(),
null
)
val cp = cl.classPathFromTypicalResourceUrls().toList()
Assert.assertTrue(cp.contains(jar.canonicalFile))
for (el in emulatedClasspath) {
Assert.assertTrue(cp.contains(File(root1, el).canonicalFile))
}
}
}
private val emulatedCollectionFiles = arrayOf(
@@ -33,6 +64,11 @@ private val emulatedCollectionFiles = arrayOf(
"lib/c-d.jar"
)
private val emulatedClasspath = arrayOf(
"module1/classes/kotlin/main/",
"module2/classes/java/test/"
)
fun File.createCollectionJar(fileNames: Array<String>, infDirName: String) {
FileOutputStream(this).use { fileStream ->
val jarStream = JarOutputStream(fileStream)
@@ -59,4 +95,11 @@ fun testUnpackedCollection(classpath: List<File>, fileNames: Array<String>) {
Assert.assertTrue(cpClasses.size == 1)
classes.checkFiles(cpClasses.first().parentFile)
jars.checkFiles(cpJars.first().parentFile.parentFile)
}
}
fun File.createJarWithManifest() {
FileOutputStream(this).use { fileStream ->
val jarStream = JarOutputStream(fileStream, Manifest())
jarStream.finish()
}
}