View Javadoc
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&gt");
73          seen.add("Afile&lt;Yo&gt;.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         // a Unicode Path extra field should only be used when its CRC matches the header file name
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 }