forked from openrs2/openrs2
parent
958fbc03ba
commit
9a1c0e9caf
@ -0,0 +1,107 @@ |
||||
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) |
||||
} |
||||
} |
||||
} |
||||
} |
Loading…
Reference in new issue