1 package org.codehaus.plexus.archiver.tar;
2
3 import java.io.File;
4 import java.io.Writer;
5 import java.nio.charset.StandardCharsets;
6 import java.nio.file.Files;
7 import java.nio.file.Path;
8
9 import org.codehaus.plexus.archiver.Archiver;
10 import org.codehaus.plexus.archiver.TestSupport;
11 import org.codehaus.plexus.archiver.UnArchiver;
12 import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
13 import org.codehaus.plexus.components.io.attributes.AttributeUtils;
14 import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributeUtils;
15 import org.codehaus.plexus.components.io.attributes.PlexusIoResourceAttributes;
16 import org.junit.jupiter.api.BeforeEach;
17 import org.junit.jupiter.api.Test;
18 import org.junit.jupiter.api.condition.DisabledOnOs;
19 import org.junit.jupiter.api.condition.OS;
20 import org.junit.jupiter.api.io.TempDir;
21
22 import static org.junit.jupiter.api.Assertions.assertEquals;
23
24 @SuppressWarnings("ResultOfMethodCallIgnored")
25 class TarFileAttributesTest extends TestSupport {
26
27 @TempDir
28 private Path tempDir;
29
30 @Override
31 @BeforeEach
32 public void setUp() throws Exception {
33 super.setUp();
34
35 System.out.println("Octal 0660 is decimal " + 0660);
36 System.out.println("Octal 0644 is decimal " + 0644);
37 System.out.println("Octal 0440 is decimal " + 0440);
38 }
39
40 private void printTestHeader() {
41 StackTraceElement e = new Throwable().getStackTrace()[1];
42 System.out.println("\n\nRunning: " + e.getMethodName() + "\n\n");
43 }
44
45 @Test
46 @DisabledOnOs(OS.WINDOWS)
47 void testUseAttributesFromTarArchiveInputInTarArchiverOutput() throws Exception {
48 printTestHeader();
49
50 File tempFile =
51 Files.createTempFile(tempDir, "tar-file-attributes.", ".tmp").toFile();
52
53 try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) {
54 writer.write("This is a test file.");
55 }
56
57 AttributeUtils.chmod(tempFile, 0440);
58
59 TarArchiver tarArchiver = getPosixCompliantTarArchiver();
60
61 File tempTarFile = Files.createTempFile(tempDir, "tar-file.", ".tar").toFile();
62
63 tarArchiver.setDestFile(tempTarFile);
64 tarArchiver.addFile(tempFile, tempFile.getName(), 0660);
65
66 tarArchiver.createArchive();
67
68 TarArchiver tarArchiver2 = getPosixCompliantTarArchiver();
69
70 File tempTarFile2 = Files.createTempFile(tempDir, "tar-file.", ".tar").toFile();
71
72 tarArchiver2.setDestFile(tempTarFile2);
73
74 DefaultArchivedFileSet afs = new DefaultArchivedFileSet(tempTarFile);
75
76 System.out.println("Adding tar archive to new archiver: " + tempTarFile);
77 tarArchiver2.addArchivedFileSet(afs);
78
79 tarArchiver2.createArchive();
80
81
82 TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup(UnArchiver.class, "tar");
83
84 File tempTarDir = Files.createTempDirectory(tempDir, "tar-test.").toFile();
85
86 tarUnArchiver.setDestDirectory(tempTarDir);
87 tarUnArchiver.setSourceFile(tempTarFile2);
88
89 tarUnArchiver.extract();
90
91 PlexusIoResourceAttributes fileAttributes =
92 PlexusIoResourceAttributeUtils.getFileAttributes(new File(tempTarDir, tempFile.getName()));
93
94 assertEquals(0660, fileAttributes.getOctalMode());
95 }
96
97 @Test
98 @DisabledOnOs(OS.WINDOWS)
99 void testUseDetectedFileAttributes() throws Exception {
100 printTestHeader();
101
102 File tempFile =
103 Files.createTempFile(tempDir, "tar-file-attributes.", ".tmp").toFile();
104
105 try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) {
106 writer.write("This is a test file.");
107 }
108
109 AttributeUtils.chmod(tempFile, 0440);
110
111 PlexusIoResourceAttributes fileAttributes = PlexusIoResourceAttributeUtils.getFileAttributes(tempFile);
112
113 assertEquals(0440, fileAttributes.getOctalMode());
114
115 TarArchiver tarArchiver = getPosixCompliantTarArchiver();
116
117 File tempTarFile = Files.createTempFile(tempDir, "tar-file.", ".tar").toFile();
118
119 tarArchiver.setDestFile(tempTarFile);
120 tarArchiver.addFile(tempFile, tempFile.getName());
121
122 tarArchiver.createArchive();
123
124 TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup(UnArchiver.class, "tar");
125
126 File tempTarDir = Files.createTempDirectory(tempDir, "tar-test.").toFile();
127
128 tarUnArchiver.setDestDirectory(tempTarDir);
129 tarUnArchiver.setSourceFile(tempTarFile);
130
131 tarUnArchiver.extract();
132
133 fileAttributes = PlexusIoResourceAttributeUtils.getFileAttributes(new File(tempTarDir, tempFile.getName()));
134
135 assertEquals(0440, fileAttributes.getOctalMode());
136 }
137
138 @Test
139 @DisabledOnOs(OS.WINDOWS)
140 void testOverrideDetectedFileAttributes() throws Exception {
141 printTestHeader();
142
143 File tempFile =
144 Files.createTempFile(tempDir, "tar-file-attributes.", ".tmp").toFile();
145
146 try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) {
147 writer.write("This is a test file.");
148 }
149
150 AttributeUtils.chmod(tempFile, 0440);
151
152 TarArchiver tarArchiver = getPosixCompliantTarArchiver();
153
154 File tempTarFile = Files.createTempFile(tempDir, "tar-file.", ".tar").toFile();
155
156 tarArchiver.setDestFile(tempTarFile);
157 tarArchiver.addFile(tempFile, tempFile.getName(), 0660);
158
159 tarArchiver.createArchive();
160
161 TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup(UnArchiver.class, "tar");
162
163 File tempTarDir = Files.createTempDirectory(tempDir, "tar-test.").toFile();
164
165 tarUnArchiver.setDestDirectory(tempTarDir);
166 tarUnArchiver.setSourceFile(tempTarFile);
167
168 tarUnArchiver.extract();
169
170 PlexusIoResourceAttributes fileAttributes =
171 PlexusIoResourceAttributeUtils.getFileAttributes(new File(tempTarDir, tempFile.getName()));
172
173 assertEquals(0660, fileAttributes.getOctalMode());
174 }
175
176 private TarArchiver getPosixCompliantTarArchiver() throws Exception {
177 TarArchiver tarArchiver = (TarArchiver) lookup(Archiver.class, "tar");
178 tarArchiver.setLongfile(TarLongFileMode.posix);
179 return tarArchiver;
180 }
181
182 @Test
183 @DisabledOnOs(OS.WINDOWS)
184 void testOverrideDetectedFileAttributesUsingFileMode() throws Exception {
185 printTestHeader();
186 File tempFile =
187 Files.createTempFile(tempDir, "tar-file-attributes.", ".tmp").toFile();
188
189 try (Writer writer = Files.newBufferedWriter(tempFile.toPath(), StandardCharsets.UTF_8)) {
190 writer.write("This is a test file.");
191 }
192
193 AttributeUtils.chmod(tempFile, 0440);
194
195 TarArchiver tarArchiver = getPosixCompliantTarArchiver();
196
197 File tempTarFile = Files.createTempFile(tempDir, "tar-file.", ".tar").toFile();
198
199 tarArchiver.setDestFile(tempTarFile);
200 tarArchiver.setFileMode(0660);
201 tarArchiver.addFile(tempFile, tempFile.getName());
202
203 tarArchiver.createArchive();
204
205 TarUnArchiver tarUnArchiver = (TarUnArchiver) lookup(UnArchiver.class, "tar");
206
207 File tempTarDir = Files.createTempDirectory(tempDir, "tar-test.").toFile();
208
209 tarUnArchiver.setDestDirectory(tempTarDir);
210 tarUnArchiver.setSourceFile(tempTarFile);
211
212 tarUnArchiver.extract();
213
214 PlexusIoResourceAttributes fileAttributes =
215 PlexusIoResourceAttributeUtils.getFileAttributes(new File(tempTarDir, tempFile.getName()));
216
217 assertEquals(0660, fileAttributes.getOctalMode());
218 }
219 }