View Javadoc
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          // Cut from here, and feed it into a new tar archiver...then unarchive THAT.
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 }