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
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
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
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
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 }