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.phase;
20
21 import java.io.File;
22 import java.nio.charset.StandardCharsets;
23 import java.nio.file.Files;
24 import java.util.Collections;
25
26 import org.apache.maven.model.Model;
27 import org.apache.maven.plugins.assembly.AssemblerConfigurationSource;
28 import org.apache.maven.plugins.assembly.model.Assembly;
29 import org.apache.maven.plugins.assembly.model.FileItem;
30 import org.apache.maven.plugins.assembly.utils.TypeConversionUtils;
31 import org.apache.maven.project.MavenProject;
32 import org.codehaus.plexus.archiver.Archiver;
33 import org.codehaus.plexus.components.io.resources.PlexusIoResource;
34 import org.codehaus.plexus.interpolation.fixed.FixedStringSearchInterpolator;
35 import org.junit.Rule;
36 import org.junit.Test;
37 import org.junit.rules.TemporaryFolder;
38 import org.junit.runner.RunWith;
39 import org.mockito.junit.MockitoJUnitRunner;
40 import org.slf4j.Logger;
41 import org.slf4j.LoggerFactory;
42
43 import static org.mockito.ArgumentMatchers.any;
44 import static org.mockito.ArgumentMatchers.eq;
45 import static org.mockito.Mockito.mock;
46 import static org.mockito.Mockito.verify;
47 import static org.mockito.Mockito.when;
48
49 @RunWith(MockitoJUnitRunner.class)
50 public class FileItemAssemblyPhaseTest {
51 private final Logger logger = LoggerFactory.getLogger(getClass());
52
53 @Rule
54 public TemporaryFolder temporaryFolder = new TemporaryFolder();
55
56 @Test
57 public void testExecute_ShouldAddNothingWhenNoFileItemsArePresent() throws Exception {
58 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
59
60 final File basedir = temporaryFolder.getRoot();
61
62 when(macCS.getBasedir()).thenReturn(basedir);
63
64 final Assembly assembly = new Assembly();
65 assembly.setId("test");
66
67 new FileItemAssemblyPhase().execute(assembly, null, macCS);
68
69 verify(macCS).getBasedir();
70 }
71
72 @Test
73 public void testExecute_ShouldAddAbsoluteFileNoFilterNoLineEndingConversion() throws Exception {
74 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
75
76 final File basedir = temporaryFolder.getRoot();
77
78 final File file = temporaryFolder.newFile("file.txt");
79 Files.write(file.toPath(), Collections.singletonList("This is a test file."), StandardCharsets.UTF_8);
80
81 when(macCS.getBasedir()).thenReturn(basedir);
82 when(macCS.getProject()).thenReturn(new MavenProject(new Model()));
83 when(macCS.getFinalName()).thenReturn("final-name");
84 prepareInterpolators(macCS);
85
86 final Archiver macArchiver = mock(Archiver.class);
87
88 final Assembly assembly = new Assembly();
89 assembly.setId("test");
90
91 final FileItem fi = new FileItem();
92 fi.setSource(file.getAbsolutePath());
93 fi.setFiltered(false);
94 fi.setLineEnding("keep");
95 fi.setFileMode("777");
96
97 assembly.addFile(fi);
98
99 new FileItemAssemblyPhase().execute(assembly, macArchiver, macCS);
100
101 verify(macArchiver)
102 .addResource(
103 any(PlexusIoResource.class), eq("file.txt"), eq(TypeConversionUtils.modeToInt("777", logger)));
104 }
105
106 @Test
107 public void testExecute_ShouldAddRelativeFileNoFilterNoLineEndingConversion() throws Exception {
108 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
109
110 final File basedir = temporaryFolder.getRoot();
111
112 final File file = temporaryFolder.newFile("file.txt");
113 Files.write(file.toPath(), Collections.singletonList("This is a test file."), StandardCharsets.UTF_8);
114
115 when(macCS.getBasedir()).thenReturn(basedir);
116 when(macCS.getProject()).thenReturn(new MavenProject(new Model()));
117 when(macCS.getFinalName()).thenReturn("final-name");
118 prepareInterpolators(macCS);
119
120 final Archiver macArchiver = mock(Archiver.class);
121
122 final Assembly assembly = new Assembly();
123 assembly.setId("test");
124
125 final FileItem fi = new FileItem();
126 fi.setSource("file.txt");
127 fi.setFiltered(false);
128 fi.setLineEnding("keep");
129 fi.setFileMode("777");
130
131 assembly.addFile(fi);
132
133 new FileItemAssemblyPhase().execute(assembly, macArchiver, macCS);
134
135 verify(macArchiver)
136 .addResource(
137 any(PlexusIoResource.class), eq("file.txt"), eq(TypeConversionUtils.modeToInt("777", logger)));
138 }
139
140 @Test
141 public void testExecute_WithOutputDirectory() throws Exception {
142 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
143
144 final File basedir = temporaryFolder.getRoot();
145
146 final File readmeFile = temporaryFolder.newFile("README.txt");
147 Files.write(
148 readmeFile.toPath(),
149 Collections.singletonList("This is a test file for README.txt."),
150 StandardCharsets.UTF_8);
151
152 final File licenseFile = temporaryFolder.newFile("LICENSE.txt");
153 Files.write(
154 licenseFile.toPath(),
155 Collections.singletonList("This is a test file for LICENSE.txt."),
156 StandardCharsets.UTF_8);
157
158 final File configFile = new File(temporaryFolder.newFolder("config"), "config.txt");
159 Files.write(
160 configFile.toPath(),
161 Collections.singletonList("This is a test file for config/config.txt"),
162 StandardCharsets.UTF_8);
163
164 when(macCS.getBasedir()).thenReturn(basedir);
165 when(macCS.getProject()).thenReturn(new MavenProject(new Model()));
166 when(macCS.getFinalName()).thenReturn("final-name");
167 prepareInterpolators(macCS);
168
169 final Archiver macArchiver = mock(Archiver.class);
170
171 final Assembly assembly = new Assembly();
172 assembly.setId("test");
173 assembly.setIncludeBaseDirectory(true);
174
175 final FileItem readmeFileItem = new FileItem();
176 readmeFileItem.setSource("README.txt");
177 readmeFileItem.setOutputDirectory("");
178 readmeFileItem.setFiltered(false);
179 readmeFileItem.setLineEnding("keep");
180 readmeFileItem.setFileMode("777");
181
182 final FileItem licenseFileItem = new FileItem();
183 licenseFileItem.setSource("LICENSE.txt");
184 licenseFileItem.setOutputDirectory("/");
185 licenseFileItem.setFiltered(false);
186 licenseFileItem.setLineEnding("keep");
187 licenseFileItem.setFileMode("777");
188
189 final FileItem configFileItem = new FileItem();
190 configFileItem.setSource("config/config.txt");
191 configFileItem.setOutputDirectory("config");
192 configFileItem.setFiltered(false);
193 configFileItem.setLineEnding("keep");
194 configFileItem.setFileMode("777");
195
196 assembly.addFile(readmeFileItem);
197 assembly.addFile(licenseFileItem);
198 assembly.addFile(configFileItem);
199
200 new FileItemAssemblyPhase().execute(assembly, macArchiver, macCS);
201
202 verify(macArchiver)
203 .addResource(
204 any(PlexusIoResource.class),
205 eq("README.txt"),
206 eq(TypeConversionUtils.modeToInt("777", logger)));
207 verify(macArchiver)
208 .addResource(
209 any(PlexusIoResource.class),
210 eq("LICENSE.txt"),
211 eq(TypeConversionUtils.modeToInt("777", logger)));
212 verify(macArchiver)
213 .addResource(
214 any(PlexusIoResource.class),
215 eq("config/config.txt"),
216 eq(TypeConversionUtils.modeToInt("777", logger)));
217 }
218
219 @Test
220 public void testExecute_WithOutputDirectoryAndDestName() throws Exception {
221 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
222
223 final File basedir = temporaryFolder.getRoot();
224
225 final File readmeFile = temporaryFolder.newFile("README.txt");
226 Files.write(
227 readmeFile.toPath(),
228 Collections.singletonList("This is a test file for README.txt."),
229 StandardCharsets.UTF_8);
230
231 final File licenseFile = temporaryFolder.newFile("LICENSE.txt");
232 Files.write(
233 licenseFile.toPath(),
234 Collections.singletonList("This is a test file for LICENSE.txt."),
235 StandardCharsets.UTF_8);
236
237 final File configFile = new File(temporaryFolder.newFolder("config"), "config.txt");
238 Files.write(
239 configFile.toPath(),
240 Collections.singletonList("This is a test file for config/config.txt"),
241 StandardCharsets.UTF_8);
242
243 when(macCS.getBasedir()).thenReturn(basedir);
244 when(macCS.getProject()).thenReturn(new MavenProject(new Model()));
245 when(macCS.getFinalName()).thenReturn("final-name");
246 prepareInterpolators(macCS);
247
248 final Archiver macArchiver = mock(Archiver.class);
249
250 final Assembly assembly = new Assembly();
251 assembly.setId("test");
252 assembly.setIncludeBaseDirectory(true);
253
254 final FileItem readmeFileItem = new FileItem();
255 readmeFileItem.setSource("README.txt");
256 readmeFileItem.setOutputDirectory("");
257 readmeFileItem.setDestName("README_renamed.txt");
258 readmeFileItem.setFiltered(false);
259 readmeFileItem.setLineEnding("keep");
260 readmeFileItem.setFileMode("777");
261
262 final FileItem licenseFileItem = new FileItem();
263 licenseFileItem.setSource("LICENSE.txt");
264 licenseFileItem.setOutputDirectory("/");
265 licenseFileItem.setDestName("LICENSE_renamed.txt");
266 licenseFileItem.setFiltered(false);
267 licenseFileItem.setLineEnding("keep");
268 licenseFileItem.setFileMode("777");
269
270 final FileItem configFileItem = new FileItem();
271 configFileItem.setSource("config/config.txt");
272 configFileItem.setDestName("config_renamed.txt");
273 configFileItem.setOutputDirectory("config");
274 configFileItem.setFiltered(false);
275 configFileItem.setLineEnding("keep");
276 configFileItem.setFileMode("777");
277
278 assembly.addFile(readmeFileItem);
279 assembly.addFile(licenseFileItem);
280 assembly.addFile(configFileItem);
281
282 new FileItemAssemblyPhase().execute(assembly, macArchiver, macCS);
283
284 verify(macArchiver)
285 .addResource(
286 any(PlexusIoResource.class),
287 eq("README_renamed.txt"),
288 eq(TypeConversionUtils.modeToInt("777", logger)));
289 verify(macArchiver)
290 .addResource(
291 any(PlexusIoResource.class),
292 eq("LICENSE_renamed.txt"),
293 eq(TypeConversionUtils.modeToInt("777", logger)));
294 verify(macArchiver)
295 .addResource(
296 any(PlexusIoResource.class),
297 eq("config/config_renamed.txt"),
298 eq(TypeConversionUtils.modeToInt("777", logger)));
299 }
300
301 @Test
302 public void testExecute_WithOutputDirectoryAndDestNameAndIncludeBaseDirectoryFalse() throws Exception {
303 final AssemblerConfigurationSource macCS = mock(AssemblerConfigurationSource.class);
304
305 final File basedir = temporaryFolder.getRoot();
306
307 final File readmeFile = temporaryFolder.newFile("README.txt");
308 Files.write(
309 readmeFile.toPath(),
310 Collections.singletonList("This is a test file for README.txt."),
311 StandardCharsets.UTF_8);
312
313 final File licenseFile = temporaryFolder.newFile("LICENSE.txt");
314 Files.write(
315 licenseFile.toPath(),
316 Collections.singletonList("This is a test file for LICENSE.txt."),
317 StandardCharsets.UTF_8);
318
319 final File configFile = new File(temporaryFolder.newFolder("config"), "config.txt");
320 Files.write(
321 configFile.toPath(),
322 Collections.singletonList("This is a test file for config/config.txt"),
323 StandardCharsets.UTF_8);
324
325 when(macCS.getBasedir()).thenReturn(basedir);
326 when(macCS.getProject()).thenReturn(new MavenProject(new Model()));
327 when(macCS.getFinalName()).thenReturn("final-name");
328 prepareInterpolators(macCS);
329
330 final Archiver macArchiver = mock(Archiver.class);
331
332 final Assembly assembly = new Assembly();
333 assembly.setId("test");
334 assembly.setIncludeBaseDirectory(false);
335
336 final FileItem readmeFileItem = new FileItem();
337 readmeFileItem.setSource("README.txt");
338 readmeFileItem.setDestName("README_renamed.txt");
339 readmeFileItem.setFiltered(false);
340 readmeFileItem.setLineEnding("keep");
341 readmeFileItem.setFileMode("777");
342
343 final FileItem licenseFileItem = new FileItem();
344 licenseFileItem.setSource("LICENSE.txt");
345 licenseFileItem.setDestName("LICENSE_renamed.txt");
346 licenseFileItem.setFiltered(false);
347 licenseFileItem.setLineEnding("keep");
348 licenseFileItem.setFileMode("777");
349
350 final FileItem configFileItem = new FileItem();
351 configFileItem.setSource("config/config.txt");
352 configFileItem.setDestName("config_renamed.txt");
353 configFileItem.setOutputDirectory("config");
354 configFileItem.setFiltered(false);
355 configFileItem.setLineEnding("keep");
356 configFileItem.setFileMode("777");
357
358 assembly.addFile(readmeFileItem);
359 assembly.addFile(licenseFileItem);
360 assembly.addFile(configFileItem);
361
362 new FileItemAssemblyPhase().execute(assembly, macArchiver, macCS);
363
364 verify(macArchiver)
365 .addResource(
366 any(PlexusIoResource.class),
367 eq("README_renamed.txt"),
368 eq(TypeConversionUtils.modeToInt("777", logger)));
369 verify(macArchiver)
370 .addResource(
371 any(PlexusIoResource.class),
372 eq("LICENSE_renamed.txt"),
373 eq(TypeConversionUtils.modeToInt("777", logger)));
374 verify(macArchiver)
375 .addResource(
376 any(PlexusIoResource.class),
377 eq("config/config_renamed.txt"),
378 eq(TypeConversionUtils.modeToInt("777", logger)));
379 }
380
381 private void prepareInterpolators(AssemblerConfigurationSource configSource) {
382 when(configSource.getCommandLinePropsInterpolator()).thenReturn(FixedStringSearchInterpolator.empty());
383 when(configSource.getEnvInterpolator()).thenReturn(FixedStringSearchInterpolator.empty());
384 when(configSource.getMainProjectInterpolator()).thenReturn(FixedStringSearchInterpolator.empty());
385 }
386 }