1 package org.codehaus.plexus.archiver.jar;
2
3 import javax.annotation.Nonnull;
4
5 import java.io.BufferedWriter;
6 import java.io.File;
7 import java.io.IOException;
8 import java.io.InputStream;
9 import java.nio.charset.StandardCharsets;
10 import java.nio.file.Files;
11 import java.nio.file.Path;
12 import java.nio.file.StandardOpenOption;
13 import java.nio.file.attribute.FileTime;
14
15 import org.apache.commons.io.FileUtils;
16 import org.codehaus.plexus.archiver.Archiver;
17 import org.codehaus.plexus.archiver.TestSupport;
18 import org.codehaus.plexus.archiver.util.ArchiveEntryUtils;
19 import org.codehaus.plexus.archiver.util.DefaultArchivedFileSet;
20 import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
21 import org.codehaus.plexus.components.io.resources.PlexusIoResource;
22 import org.junit.jupiter.api.Test;
23
24 import static org.assertj.core.api.Assertions.assertThat;
25
26 class DirectoryArchiverUnpackJarTest extends TestSupport {
27
28 public static final String[] DEFAULT_INCLUDES_ARRAY = {"**/*"};
29
30 static class IdentityTransformer implements InputStreamTransformer {
31
32 IdentityTransformer() {}
33
34 @Nonnull
35 @Override
36 public InputStream transform(@Nonnull PlexusIoResource resource, @Nonnull InputStream inputStream)
37 throws IOException {
38 return inputStream;
39 }
40 }
41
42 @Test
43 void test_dependency_sets_depSet_unpacked_rdonly() throws Exception {
44 File src = new File("src/test/resources/unpack_issue.jar");
45 File dest = new File("target/depset_unpack");
46 FileUtils.deleteDirectory(dest);
47 assertThat(src).isFile();
48
49 Archiver archiver = createArchiver(src, dest);
50 archiver.setDefaultDirectoryMode(0555);
51 archiver.setDirectoryMode(0555);
52 archiver.createArchive();
53 assertThat(new File(dest, "child-1/META-INF/MANIFEST.MF")).isFile();
54
55
56 ArchiveEntryUtils.chmod(new File(dest, "child-1/META-INF"), 0777);
57 ArchiveEntryUtils.chmod(new File(dest, "child-1/META-INF/maven"), 0777);
58 ArchiveEntryUtils.chmod(new File(dest, "child-1/META-INF/maven/test"), 0777);
59 ArchiveEntryUtils.chmod(new File(dest, "child-1/META-INF/maven/test/child1"), 0777);
60 ArchiveEntryUtils.chmod(new File(dest, "child-1/assembly-resources"), 0777);
61 }
62
63 @Test
64 void test_dependency_sets_depSet_unpacked_by_default_dont_override() throws Exception {
65
66 File src = new File("src/test/resources/unpack_issue.jar");
67 File dest = new File("target/depset_unpack_dont_override");
68 FileUtils.deleteDirectory(dest);
69
70 Archiver archiver = createArchiver(src, dest);
71 archiver.createArchive();
72
73 File manifestFile = new File(dest, "child-1/META-INF/MANIFEST.MF");
74 assertThat(manifestFile).content().hasLineCount(6);
75
76
77 overwriteFileContent(manifestFile.toPath());
78 assertThat(manifestFile).content().hasLineCount(1);
79
80 archiver = createArchiver(src, dest);
81 archiver.createArchive();
82
83
84 assertThat(manifestFile).content().hasLineCount(1);
85 }
86
87 @Test
88 void test_dependency_sets_depSet_force_unpacked() throws Exception {
89
90 File src = new File("src/test/resources/unpack_issue.jar");
91 File dest = new File("target/depset_unpack_force");
92 FileUtils.deleteDirectory(dest);
93
94 Archiver archiver = createArchiver(src, dest);
95 archiver.createArchive();
96
97 File manifestFile = new File(dest, "child-1/META-INF/MANIFEST.MF");
98 assertThat(manifestFile).content().hasLineCount(6);
99
100
101 overwriteFileContent(manifestFile.toPath());
102 assertThat(manifestFile).content().hasLineCount(1);
103
104 archiver = createArchiver(src, dest);
105 archiver.setForced(true);
106 archiver.createArchive();
107
108
109 assertThat(manifestFile).content().hasLineCount(6);
110 }
111
112 private Archiver createArchiver(File src, File dest) {
113 assertThat(src).isFile();
114 DefaultArchivedFileSet afs = DefaultArchivedFileSet.archivedFileSet(src);
115 afs.setIncludes(DEFAULT_INCLUDES_ARRAY);
116 afs.setExcludes(null);
117 afs.setPrefix("child-1/");
118 afs.setStreamTransformer(new IdentityTransformer());
119 Archiver archiver = lookup(Archiver.class, "dir");
120 archiver.setDestFile(dest);
121 archiver.addArchivedFileSet(afs, StandardCharsets.UTF_8);
122 return archiver;
123 }
124
125 private void overwriteFileContent(Path path) throws IOException {
126 FileTime lastModifiedTime = Files.getLastModifiedTime(path);
127
128 try (BufferedWriter writer =
129 Files.newBufferedWriter(path, StandardCharsets.UTF_8, StandardOpenOption.TRUNCATE_EXISTING)) {
130 writer.write("TEST123");
131 }
132
133 Files.setLastModifiedTime(path, lastModifiedTime);
134 }
135 }