View Javadoc
1   package org.codehaus.plexus.archiver;
2   
3   import java.io.BufferedInputStream;
4   import java.io.BufferedReader;
5   import java.io.File;
6   import java.nio.charset.StandardCharsets;
7   import java.nio.file.Files;
8   import java.util.Enumeration;
9   
10  import org.apache.commons.compress.archivers.tar.TarArchiveInputStream;
11  import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
12  import org.codehaus.plexus.archiver.tar.TarArchiver;
13  import org.codehaus.plexus.archiver.tar.TarLongFileMode;
14  import org.codehaus.plexus.util.FileUtils;
15  import org.junit.jupiter.api.Test;
16  
17  import static org.junit.jupiter.api.Assertions.assertEquals;
18  import static org.junit.jupiter.api.Assertions.assertTrue;
19  
20  /**
21   * @author Erik Engstrom
22   */
23  class DuplicateFilesTest extends TestSupport {
24  
25      private static final File file1 = getTestFile("src/test/resources/group-writable/foo.txt");
26  
27      private static final File file2 = getTestFile("src/test/resources/world-writable/foo.txt");
28  
29      private static final File destination = getTestFile("target/output/duplicateFiles");
30  
31      @Test
32      void testZipArchiver() throws Exception {
33          Archiver archiver = lookup(Archiver.class, "zip");
34          archiver.setDuplicateBehavior(Archiver.DUPLICATES_SKIP);
35  
36          File archive = createArchive(archiver, "zip");
37  
38          org.apache.commons.compress.archivers.zip.ZipFile zf =
39                  new org.apache.commons.compress.archivers.zip.ZipFile(archive);
40  
41          Enumeration<ZipArchiveEntry> e = zf.getEntries();
42          int entryCount = 0;
43          while (e.hasMoreElements()) {
44              ZipArchiveEntry entry = e.nextElement();
45              System.out.println(entry.getName());
46              entryCount++;
47          }
48          zf.close();
49  
50          // Zip file should have 2 entries, 1 for the directory and one for foo.txt
51          assertEquals(2, entryCount);
52          testArchive(archive, "zip");
53      }
54  
55      @Test
56      void testDirArchiver() throws Exception {
57          Archiver archiver = lookup(Archiver.class, "dir");
58          createArchive(archiver, "dir");
59          testFinalFile("target/output/duplicateFiles.dir/duplicateFiles/foo.txt");
60      }
61  
62      @Test
63      void testTarArchiver() throws Exception {
64          TarArchiver archiver = (TarArchiver) lookup(Archiver.class, "tar");
65          archiver.setLongfile(TarLongFileMode.posix);
66          archiver.setDuplicateBehavior(Archiver.DUPLICATES_SKIP);
67  
68          File archive = createArchive(archiver, "tar");
69          TarArchiveInputStream tis;
70  
71          tis = new TarArchiveInputStream(new BufferedInputStream(Files.newInputStream(archive.toPath())));
72          int entryCount = 0;
73          while ((tis.getNextEntry()) != null) {
74              entryCount++;
75          }
76          assertEquals(1, entryCount);
77          testArchive(archive, "tar");
78          tis.close();
79      }
80  
81      private File createArchive(Archiver archiver, String outputFileExt) throws Exception {
82          archiver.addFile(file1, "duplicateFiles/foo.txt");
83          archiver.addFile(file2, "duplicateFiles/foo.txt");
84  
85          // delete it if it exists to ensure it is actually empty
86          if (destination.exists()) {
87              destination.delete();
88          }
89  
90          File archive = getTestFile("target/output/duplicateFiles." + outputFileExt);
91          if (archive.exists()) {
92              if (archive.isDirectory()) {
93                  FileUtils.deleteDirectory(archive);
94              } else {
95                  archive.delete();
96              }
97          }
98  
99          archiver.setDestFile(archive);
100         archiver.createArchive();
101         return archive;
102     }
103 
104     private void testArchive(File archive, String role) throws Exception {
105         // Check the content of the archive by extracting it
106 
107         UnArchiver unArchiver = lookup(UnArchiver.class, role);
108         unArchiver.setSourceFile(archive);
109 
110         unArchiver.setDestDirectory(getTestFile("target/output/"));
111         unArchiver.extract();
112 
113         assertTrue(destination.exists());
114         assertTrue(destination.isDirectory());
115         testFinalFile("target/output/duplicateFiles/foo.txt");
116     }
117 
118     private void testFinalFile(String path) throws Exception {
119         File outputFile = getTestFile(path);
120         assertTrue(outputFile.exists());
121         BufferedReader reader = Files.newBufferedReader(outputFile.toPath(), StandardCharsets.UTF_8);
122         String firstLine = reader.readLine();
123         reader.close();
124         reader = Files.newBufferedReader(file2.toPath(), StandardCharsets.UTF_8);
125         String expectedFirstLine = reader.readLine();
126         reader.close();
127         assertEquals(expectedFirstLine, firstLine);
128     }
129 }