1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.assembly.archive.archiver;
20
21 import java.io.File;
22 import java.io.IOException;
23 import java.nio.charset.StandardCharsets;
24 import java.nio.file.Files;
25 import java.util.ArrayList;
26 import java.util.Collections;
27 import java.util.List;
28
29 import org.codehaus.plexus.archiver.Archiver;
30 import org.codehaus.plexus.archiver.ArchiverException;
31 import org.codehaus.plexus.archiver.FileSet;
32 import org.codehaus.plexus.archiver.diags.TrackingArchiver;
33 import org.codehaus.plexus.archiver.jar.JarArchiver;
34 import org.codehaus.plexus.archiver.util.DefaultFileSet;
35 import org.codehaus.plexus.components.io.fileselectors.FileInfo;
36 import org.codehaus.plexus.components.io.fileselectors.FileSelector;
37 import org.codehaus.plexus.components.io.functions.InputStreamTransformer;
38 import org.junit.Rule;
39 import org.junit.Test;
40 import org.junit.rules.TemporaryFolder;
41 import org.junit.runner.RunWith;
42 import org.mockito.ArgumentCaptor;
43 import org.mockito.junit.MockitoJUnitRunner;
44
45 import static org.hamcrest.MatcherAssert.assertThat;
46 import static org.hamcrest.Matchers.is;
47 import static org.junit.Assert.assertEquals;
48 import static org.junit.Assert.assertNotNull;
49 import static org.junit.Assert.assertTrue;
50 import static org.mockito.Mockito.mock;
51 import static org.mockito.Mockito.verify;
52 import static org.mockito.Mockito.when;
53
54 @RunWith(MockitoJUnitRunner.class)
55 public class AssemblyProxyArchiverTest {
56 @Rule
57 public TemporaryFolder temporaryFolder = new TemporaryFolder();
58
59 @Test(timeout = 5000)
60 public void addFileSet_SkipWhenSourceIsAssemblyWorkDir() throws IOException, ArchiverException {
61 final File sources = temporaryFolder.getRoot();
62
63 final File workdir = new File(sources, "workdir");
64
65 final TrackingArchiver tracker = new TrackingArchiver();
66 final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver("", tracker, null, null, null, workdir);
67
68 archiver.setForced(true);
69
70 final DefaultFileSet fs = new DefaultFileSet();
71 fs.setDirectory(workdir);
72
73 archiver.addFileSet(fs);
74
75 assertTrue(tracker.added.isEmpty());
76 }
77
78 @Test(timeout = 5000)
79 public void addFileSet_addExcludeWhenSourceContainsAssemblyWorkDir() throws IOException, ArchiverException {
80 final File sources = temporaryFolder.getRoot();
81
82 final File workdir = new File(sources, "workdir");
83 workdir.mkdir();
84
85 Files.write(
86 sources.toPath().resolve("test-included.txt"),
87 Collections.singletonList("This is included"),
88 StandardCharsets.UTF_8);
89 Files.write(
90 workdir.toPath().resolve("test-excluded.txt"),
91 Collections.singletonList("This is excluded"),
92 StandardCharsets.UTF_8);
93
94 final TrackingArchiver tracker = new TrackingArchiver();
95 final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver("", tracker, null, null, null, workdir);
96
97 archiver.setForced(true);
98
99 final DefaultFileSet fs = new DefaultFileSet();
100 fs.setDirectory(sources);
101
102 archiver.addFileSet(fs);
103
104 assertEquals(1, tracker.added.size());
105
106 final TrackingArchiver.Addition addition = tracker.added.get(0);
107 assertNotNull(addition.excludes);
108 assertEquals(1, addition.excludes.length);
109 assertEquals(workdir.getName(), addition.excludes[0]);
110 }
111
112 @Test
113 public void addFile_NoPerms_CallAcceptFilesOnlyOnce() throws IOException, ArchiverException {
114 final Archiver delegate = mock(Archiver.class);
115
116 final CounterSelector counter = new CounterSelector(true);
117 final List<FileSelector> selectors = new ArrayList<>();
118 selectors.add(counter);
119
120 final AssemblyProxyArchiver archiver =
121 new AssemblyProxyArchiver("", delegate, null, selectors, null, new File("."));
122 archiver.setForced(true);
123
124 final File inputFile = temporaryFolder.newFile();
125 archiver.addFile(inputFile, "file.txt");
126
127 assertEquals(1, counter.getCount());
128 verify(delegate).addFile(inputFile, "file.txt");
129 verify(delegate).setForced(true);
130 }
131
132 @Test
133 @SuppressWarnings("deprecation")
134 public void addDirectory_NoPerms_CallAcceptFilesOnlyOnce() throws IOException, ArchiverException {
135 final Archiver delegate = new JarArchiver();
136
137 final File output = temporaryFolder.newFile();
138
139 delegate.setDestFile(output);
140
141 final CounterSelector counter = new CounterSelector(true);
142 final List<FileSelector> selectors = new ArrayList<>();
143 selectors.add(counter);
144
145 final AssemblyProxyArchiver archiver =
146 new AssemblyProxyArchiver("", delegate, null, selectors, null, new File("."));
147
148 archiver.setForced(true);
149
150 final File dir = temporaryFolder.newFolder();
151 Files.write(
152 dir.toPath().resolve("file.txt"), Collections.singletonList("This is a test."), StandardCharsets.UTF_8);
153
154 archiver.addDirectory(dir);
155
156 archiver.createArchive();
157
158 assertEquals(1, counter.getCount());
159 }
160
161 @Test
162 public void assemblyWorkDir() {
163 final Archiver delegate = mock(Archiver.class);
164 final List<FileSelector> selectors = new ArrayList<>();
165
166 final AssemblyProxyArchiver archiver = new AssemblyProxyArchiver(
167 "prefix", delegate, null, selectors, null, new File(temporaryFolder.getRoot(), "module1"));
168
169 FileSet fileSet = mock(FileSet.class);
170 when(fileSet.getDirectory()).thenReturn(temporaryFolder.getRoot());
171 when(fileSet.getStreamTransformer()).thenReturn(mock(InputStreamTransformer.class));
172
173 archiver.addFileSet(fileSet);
174
175 ArgumentCaptor<FileSet> delFileSet = ArgumentCaptor.forClass(FileSet.class);
176 verify(delegate).addFileSet(delFileSet.capture());
177
178 assertThat(delFileSet.getValue().getDirectory(), is(fileSet.getDirectory()));
179 assertThat(delFileSet.getValue().getExcludes(), is(new String[] {"module1"}));
180 assertThat(delFileSet.getValue().getFileMappers(), is(fileSet.getFileMappers()));
181 assertThat(delFileSet.getValue().getFileSelectors(), is(fileSet.getFileSelectors()));
182 assertThat(delFileSet.getValue().getIncludes(), is(new String[0]));
183 assertThat(delFileSet.getValue().getPrefix(), is("prefix/"));
184 assertThat(delFileSet.getValue().getStreamTransformer(), is(fileSet.getStreamTransformer()));
185 }
186
187 private static final class CounterSelector implements FileSelector {
188
189 private int count = 0;
190
191 private boolean answer = false;
192
193 public CounterSelector(final boolean answer) {
194 this.answer = answer;
195 }
196
197 public int getCount() {
198 return count;
199 }
200
201 public boolean isSelected(final FileInfo fileInfo) throws IOException {
202 if (fileInfo.isFile()) {
203 count++;
204 System.out.println("Counting file: " + fileInfo.getName() + ". Current count: " + count);
205 }
206
207 return answer;
208 }
209 }
210 }