|
|
|
|
@ -98,48 +98,48 @@ class JarFileArchiveTests {
@@ -98,48 +98,48 @@ class JarFileArchiveTests {
|
|
|
|
|
@Test |
|
|
|
|
void getNestedArchive() throws Exception { |
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar"); |
|
|
|
|
Archive nested = this.archive.getNestedArchive(entry); |
|
|
|
|
assertThat(nested.getUrl().toString()).isEqualTo("jar:" + this.rootJarFileUrl + "!/nested.jar!/"); |
|
|
|
|
((JarFileArchive) nested).close(); |
|
|
|
|
try (Archive nested = this.archive.getNestedArchive(entry)) { |
|
|
|
|
assertThat(nested.getUrl().toString()).isEqualTo("jar:" + this.rootJarFileUrl + "!/nested.jar!/"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void getNestedUnpackedArchive() throws Exception { |
|
|
|
|
setup(true); |
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar"); |
|
|
|
|
Archive nested = this.archive.getNestedArchive(entry); |
|
|
|
|
assertThat(nested.getUrl().toString()).startsWith("file:"); |
|
|
|
|
assertThat(nested.getUrl().toString()).endsWith("/nested.jar"); |
|
|
|
|
((JarFileArchive) nested).close(); |
|
|
|
|
try (Archive nested = this.archive.getNestedArchive(entry)) { |
|
|
|
|
assertThat(nested.getUrl().toString()).startsWith("file:"); |
|
|
|
|
assertThat(nested.getUrl().toString()).endsWith("/nested.jar"); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void unpackedLocationsAreUniquePerArchive() throws Exception { |
|
|
|
|
setup(true); |
|
|
|
|
Entry entry = getEntriesMap(this.archive).get("nested.jar"); |
|
|
|
|
Archive firstNested = this.archive.getNestedArchive(entry); |
|
|
|
|
URL firstNestedUrl = firstNested.getUrl(); |
|
|
|
|
((JarFileArchive) firstNested).close(); |
|
|
|
|
URL firstNestedUrl; |
|
|
|
|
try (Archive firstNested = this.archive.getNestedArchive(entry)) { |
|
|
|
|
firstNestedUrl = firstNested.getUrl(); |
|
|
|
|
} |
|
|
|
|
this.archive.close(); |
|
|
|
|
setup(true); |
|
|
|
|
entry = getEntriesMap(this.archive).get("nested.jar"); |
|
|
|
|
Archive secondNested = this.archive.getNestedArchive(entry); |
|
|
|
|
URL secondNestedUrl = secondNested.getUrl(); |
|
|
|
|
assertThat(secondNestedUrl).isNotEqualTo(firstNestedUrl); |
|
|
|
|
((JarFileArchive) secondNested).close(); |
|
|
|
|
try (Archive secondNested = this.archive.getNestedArchive(entry)) { |
|
|
|
|
URL secondNestedUrl = secondNested.getUrl(); |
|
|
|
|
assertThat(secondNestedUrl).isNotEqualTo(firstNestedUrl); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void unpackedLocationsFromSameArchiveShareSameParent() throws Exception { |
|
|
|
|
setup(true); |
|
|
|
|
Archive nestedArchive = this.archive.getNestedArchive(getEntriesMap(this.archive).get("nested.jar")); |
|
|
|
|
File nested = new File(nestedArchive.getUrl().toURI()); |
|
|
|
|
Archive anotherNestedArchive = this.archive |
|
|
|
|
.getNestedArchive(getEntriesMap(this.archive).get("another-nested.jar")); |
|
|
|
|
File anotherNested = new File(anotherNestedArchive.getUrl().toURI()); |
|
|
|
|
assertThat(nested.getParent()).isEqualTo(anotherNested.getParent()); |
|
|
|
|
((JarFileArchive) nestedArchive).close(); |
|
|
|
|
((JarFileArchive) anotherNestedArchive).close(); |
|
|
|
|
try (Archive nestedArchive = this.archive.getNestedArchive(getEntriesMap(this.archive).get("nested.jar")); |
|
|
|
|
Archive anotherNestedArchive = this.archive |
|
|
|
|
.getNestedArchive(getEntriesMap(this.archive).get("another-nested.jar"))) { |
|
|
|
|
File nested = new File(nestedArchive.getUrl().toURI()); |
|
|
|
|
File anotherNested = new File(anotherNestedArchive.getUrl().toURI()); |
|
|
|
|
assertThat(nested.getParent()).isEqualTo(anotherNested.getParent()); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
@ -156,40 +156,40 @@ class JarFileArchiveTests {
@@ -156,40 +156,40 @@ class JarFileArchiveTests {
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
@Test |
|
|
|
|
void nestedZip64ArchivesAreHandledGracefully() throws IOException { |
|
|
|
|
void nestedZip64ArchivesAreHandledGracefully() throws Exception { |
|
|
|
|
File file = new File(this.tempDir, "test.jar"); |
|
|
|
|
JarOutputStream output = new JarOutputStream(new FileOutputStream(file)); |
|
|
|
|
JarEntry zip64JarEntry = new JarEntry("nested/zip64.jar"); |
|
|
|
|
output.putNextEntry(zip64JarEntry); |
|
|
|
|
byte[] zip64JarData = writeZip64Jar(); |
|
|
|
|
zip64JarEntry.setSize(zip64JarData.length); |
|
|
|
|
zip64JarEntry.setCompressedSize(zip64JarData.length); |
|
|
|
|
zip64JarEntry.setMethod(ZipEntry.STORED); |
|
|
|
|
CRC32 crc32 = new CRC32(); |
|
|
|
|
crc32.update(zip64JarData); |
|
|
|
|
zip64JarEntry.setCrc(crc32.getValue()); |
|
|
|
|
output.write(zip64JarData); |
|
|
|
|
output.closeEntry(); |
|
|
|
|
output.close(); |
|
|
|
|
JarFileArchive jarFileArchive = new JarFileArchive(file); |
|
|
|
|
Archive nestedArchive = jarFileArchive.getNestedArchive(getEntriesMap(jarFileArchive).get("nested/zip64.jar")); |
|
|
|
|
Iterator<Entry> it = nestedArchive.iterator(); |
|
|
|
|
for (int i = 0; i < 65537; i++) { |
|
|
|
|
assertThat(it.hasNext()).as(i + "nth file is present").isTrue(); |
|
|
|
|
it.next(); |
|
|
|
|
try (JarOutputStream output = new JarOutputStream(new FileOutputStream(file))) { |
|
|
|
|
JarEntry zip64JarEntry = new JarEntry("nested/zip64.jar"); |
|
|
|
|
output.putNextEntry(zip64JarEntry); |
|
|
|
|
byte[] zip64JarData = writeZip64Jar(); |
|
|
|
|
zip64JarEntry.setSize(zip64JarData.length); |
|
|
|
|
zip64JarEntry.setCompressedSize(zip64JarData.length); |
|
|
|
|
zip64JarEntry.setMethod(ZipEntry.STORED); |
|
|
|
|
CRC32 crc32 = new CRC32(); |
|
|
|
|
crc32.update(zip64JarData); |
|
|
|
|
zip64JarEntry.setCrc(crc32.getValue()); |
|
|
|
|
output.write(zip64JarData); |
|
|
|
|
output.closeEntry(); |
|
|
|
|
} |
|
|
|
|
try (JarFileArchive jarFileArchive = new JarFileArchive(file); |
|
|
|
|
Archive nestedArchive = jarFileArchive |
|
|
|
|
.getNestedArchive(getEntriesMap(jarFileArchive).get("nested/zip64.jar"))) { |
|
|
|
|
Iterator<Entry> it = nestedArchive.iterator(); |
|
|
|
|
for (int i = 0; i < 65537; i++) { |
|
|
|
|
assertThat(it.hasNext()).as(i + "nth file is present").isTrue(); |
|
|
|
|
it.next(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
((JarFileArchive) nestedArchive).close(); |
|
|
|
|
jarFileArchive.close(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
private byte[] writeZip64Jar() throws IOException { |
|
|
|
|
ByteArrayOutputStream bytes = new ByteArrayOutputStream(); |
|
|
|
|
JarOutputStream jarOutput = new JarOutputStream(bytes); |
|
|
|
|
for (int i = 0; i < 65537; i++) { |
|
|
|
|
jarOutput.putNextEntry(new JarEntry(i + ".dat")); |
|
|
|
|
jarOutput.closeEntry(); |
|
|
|
|
try (JarOutputStream jarOutput = new JarOutputStream(bytes)) { |
|
|
|
|
for (int i = 0; i < 65537; i++) { |
|
|
|
|
jarOutput.putNextEntry(new JarEntry(i + ".dat")); |
|
|
|
|
jarOutput.closeEntry(); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
jarOutput.close(); |
|
|
|
|
return bytes.toByteArray(); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|