Open-source multiplayer game server compatible with the RuneScape client
https://www.openrs2.org/
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
107 lines
3.7 KiB
107 lines
3.7 KiB
package dev.openrs2.util.io
|
|
|
|
import com.google.common.jimfs.Configuration
|
|
import com.google.common.jimfs.Jimfs
|
|
import java.io.ByteArrayInputStream
|
|
import java.io.ByteArrayOutputStream
|
|
import java.nio.file.Files
|
|
import java.nio.file.attribute.FileTime
|
|
import java.util.jar.Attributes
|
|
import java.util.jar.JarEntry
|
|
import java.util.jar.JarInputStream
|
|
import java.util.jar.JarOutputStream
|
|
import java.util.jar.Manifest
|
|
import kotlin.test.Test
|
|
import kotlin.test.assertEquals
|
|
import kotlin.test.assertNotNull
|
|
import kotlin.test.assertNull
|
|
|
|
object DeterministicJarOutputStreamTest {
|
|
private val UNIX_EPOCH = FileTime.fromMillis(0)
|
|
private val Y2K = FileTime.fromMillis(946684800)
|
|
private val manifest = Manifest().apply {
|
|
mainAttributes[Attributes.Name.MANIFEST_VERSION] = "1.0"
|
|
mainAttributes[Attributes.Name.MAIN_CLASS] = "Hello"
|
|
}
|
|
|
|
@Test
|
|
fun testPutNextEntry() {
|
|
ByteArrayOutputStream().use { out ->
|
|
DeterministicJarOutputStream.create(out).use { jar ->
|
|
val entry = JarEntry("Hello.class")
|
|
entry.creationTime = Y2K
|
|
entry.lastAccessTime = Y2K
|
|
entry.lastModifiedTime = Y2K
|
|
jar.putNextEntry(entry)
|
|
}
|
|
|
|
JarInputStream(ByteArrayInputStream(out.toByteArray())).use { jar ->
|
|
assertNull(jar.manifest)
|
|
|
|
val entry = jar.nextJarEntry
|
|
assertNotNull(entry)
|
|
|
|
assertEquals("Hello.class", entry.name)
|
|
assertEquals(0, entry.time)
|
|
assertEquals(UNIX_EPOCH, entry.creationTime)
|
|
assertEquals(UNIX_EPOCH, entry.lastAccessTime)
|
|
assertEquals(UNIX_EPOCH, entry.lastModifiedTime)
|
|
|
|
assertNull(jar.nextJarEntry)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun testManifest() {
|
|
ByteArrayOutputStream().use { out ->
|
|
DeterministicJarOutputStream.create(out, manifest).use { jar ->
|
|
jar.putNextEntry(JarEntry("Hello.class"))
|
|
}
|
|
|
|
JarInputStream(ByteArrayInputStream(out.toByteArray())).use { jar ->
|
|
assertEquals(manifest, jar.manifest)
|
|
}
|
|
}
|
|
}
|
|
|
|
@Test
|
|
fun testRepack() {
|
|
Jimfs.newFileSystem(Configuration.unix()).use { fs ->
|
|
val originalFile = Files.createTempFile(fs.getPath("/"), "original", ".jar")
|
|
try {
|
|
JarOutputStream(Files.newOutputStream(originalFile)).use { jar ->
|
|
val entry = JarEntry("Hello.class")
|
|
entry.creationTime = Y2K
|
|
entry.lastAccessTime = Y2K
|
|
entry.lastModifiedTime = Y2K
|
|
jar.putNextEntry(entry)
|
|
}
|
|
|
|
val repackedFile = Files.createTempFile(fs.getPath("/"), "repacked", ".jar")
|
|
try {
|
|
DeterministicJarOutputStream.repack(originalFile, repackedFile)
|
|
|
|
JarInputStream(Files.newInputStream(repackedFile)).use { jar ->
|
|
assertNull(jar.manifest)
|
|
|
|
val entry = jar.nextJarEntry
|
|
assertNotNull(entry)
|
|
|
|
assertEquals("Hello.class", entry.name)
|
|
assertEquals(0, entry.time)
|
|
assertEquals(UNIX_EPOCH, entry.creationTime)
|
|
assertEquals(UNIX_EPOCH, entry.lastAccessTime)
|
|
assertEquals(UNIX_EPOCH, entry.lastModifiedTime)
|
|
|
|
assertNull(jar.nextJarEntry)
|
|
}
|
|
} finally {
|
|
Files.deleteIfExists(repackedFile)
|
|
}
|
|
} finally {
|
|
Files.deleteIfExists(originalFile)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|