View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
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 }