1 package org.codehaus.plexus.archiver.zip;
2
3 import java.io.BufferedReader;
4 import java.io.File;
5 import java.io.InputStream;
6 import java.io.InputStreamReader;
7 import java.net.URL;
8 import java.util.Arrays;
9 import java.util.HashMap;
10 import java.util.HashSet;
11 import java.util.Iterator;
12 import java.util.Map;
13 import java.util.Set;
14
15 import org.apache.commons.io.IOUtils;
16 import org.codehaus.plexus.archiver.TestSupport;
17 import org.codehaus.plexus.components.io.functions.SymlinkDestinationSupplier;
18 import org.codehaus.plexus.components.io.resources.PlexusIoResource;
19 import org.codehaus.plexus.components.io.resources.PlexusIoURLResource;
20 import org.junit.jupiter.api.Test;
21
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23 import static org.junit.jupiter.api.Assertions.assertFalse;
24 import static org.junit.jupiter.api.Assertions.assertTrue;
25
26 class PlexusIoZipFileResourceCollectionTest extends TestSupport {
27
28 @Test
29 void testNamelessRootFolder() throws Exception {
30 PlexusIoZipFileResourceCollection resourceCollection = new PlexusIoZipFileResourceCollection();
31 resourceCollection.setFile(getTestFile("src/test/jars/namelessrootfolder.jar"));
32 Iterator iterator = resourceCollection.getResources();
33 PlexusIoURLResource entry = (PlexusIoURLResource) iterator.next();
34 assertEquals("/dummy.txt", entry.getName());
35 final URL url = entry.getURL();
36 BufferedReader d = new BufferedReader(new InputStreamReader(entry.getContents()));
37 assertEquals("dummy content", d.readLine());
38 }
39
40 @Test
41 void testDescriptionForError() throws Exception {
42 PlexusIoZipFileResourceCollection resourceCollection = new PlexusIoZipFileResourceCollection();
43 resourceCollection.setFile(getTestFile("src/test/jars/namelessrootfolder.jar"));
44 Iterator<PlexusIoResource> iterator = resourceCollection.getResources();
45 PlexusIoURLResource entry = (PlexusIoURLResource) iterator.next();
46 final URL url = entry.getURL();
47 String descriptionForError = entry.getDescriptionForError(url);
48 assertTrue(descriptionForError.endsWith("namelessrootfolder.jar!//dummy.txt"));
49 }
50
51 @Test
52 void testFilesWithIllegalHtmlChars() throws Exception {
53 File testZip = new File(getBasedir(), "src/test/resources/bogusManifest.zip");
54 PlexusIoZipFileResourceCollection prc = new PlexusIoZipFileResourceCollection();
55 prc.setFile(testZip);
56 final Iterator<PlexusIoResource> entries = prc.getEntries();
57 while (entries.hasNext()) {
58 final PlexusIoResource next = entries.next();
59 if (next.getName().endsWith("MANIFEST.MF")) {
60 final InputStream contents1 = next.getContents();
61 final String manifest = IOUtils.toString(contents1, "UTF-8");
62 assertTrue(manifest.contains("bogs=fus"));
63 contents1.close();
64 }
65 }
66 }
67
68 @Test
69 void testFilesThatAreNotThere() throws Exception {
70 File testZip = new File(getBasedir(), "src/test/resources/archiveWithIllegalHtmlFileName.zip");
71 Set<String> seen = new HashSet<>();
72 seen.add("AFileThatNeedsHtmlEsc%3F>");
73 seen.add("Afile<Yo>.txt");
74 seen.add("File With Space.txt");
75 seen.add("FileWith%.txt");
76 PlexusIoZipFileResourceCollection prc = new PlexusIoZipFileResourceCollection();
77 prc.setFile(testZip);
78 final Iterator<PlexusIoResource> entries = prc.getEntries();
79 while (entries.hasNext()) {
80 final PlexusIoResource next = entries.next();
81 assertTrue(seen.remove(next.getName()), next.getName() + "was not present");
82 final URL url = next.getURL();
83 final InputStream contents = next.getContents();
84 contents.close();
85 }
86 }
87
88 @Test
89 void testSymlinkEntries() throws Exception {
90 File testZip = new File(getBasedir(), "src/test/resources/symlinks/symlinks.zip");
91 Map<String, String> symLinks = new HashMap<>();
92 symLinks.put("symDir", "targetDir/");
93 symLinks.put("symLinkToDirOnTheOutside", "../dirOnTheOutside/");
94 symLinks.put("symLinkToTheOutside", "../onTheOutside.txt");
95 symLinks.put("symR", "fileR.txt");
96 symLinks.put("symW", "fileW.txt");
97 symLinks.put("symX", "fileX.txt");
98 PlexusIoZipFileResourceCollection prc = new PlexusIoZipFileResourceCollection();
99 prc.setFile(testZip);
100 final Iterator<PlexusIoResource> entries = prc.getEntries();
101 while (entries.hasNext()) {
102 final PlexusIoResource next = entries.next();
103 String symLinkTarget = symLinks.remove(next.getName());
104 if (symLinkTarget != null) {
105 assertTrue(next.isSymbolicLink(), next.getName() + " must be symlink");
106 assertTrue(next instanceof SymlinkDestinationSupplier);
107 assertEquals(symLinkTarget, ((SymlinkDestinationSupplier) next).getSymlinkDestination());
108 } else {
109 assertFalse(next.isSymbolicLink(), next.getName() + " must not be symlink");
110 }
111 }
112
113 assertTrue(symLinks.isEmpty());
114 }
115
116 @Test
117 void testUnarchiveUnicodePathExtra() throws Exception {
118 PlexusIoZipFileResourceCollection prc = new PlexusIoZipFileResourceCollection();
119 prc.setFile(getTestFile("src/test/resources/unicodePathExtra/efsclear.zip"));
120 Set<String> names = new HashSet<>();
121 final Iterator<PlexusIoResource> entries = prc.getEntries();
122 while (entries.hasNext()) {
123 final PlexusIoResource next = entries.next();
124 names.add(next.getName());
125 }
126
127 assertEquals(
128 new HashSet<>(Arrays.asList("nameonly-name", "goodextra-extra", "badextra-name")),
129 names,
130 "should use good extra fields but not bad ones");
131 }
132 }