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.dependency.utils;
20  
21  import java.io.File;
22  import java.io.IOException;
23  
24  import org.apache.maven.artifact.Artifact;
25  import org.apache.maven.artifact.DefaultArtifact;
26  import org.apache.maven.artifact.handler.ArtifactHandler;
27  import org.apache.maven.artifact.versioning.VersionRange;
28  import org.apache.maven.plugin.testing.stubs.DefaultArtifactHandlerStub;
29  import org.junit.jupiter.api.BeforeEach;
30  import org.junit.jupiter.api.Test;
31  import org.junit.jupiter.api.io.TempDir;
32  
33  import static org.assertj.core.api.Assertions.assertThat;
34  import static org.junit.jupiter.api.Assertions.assertEquals;
35  import static org.junit.jupiter.api.Assertions.assertTrue;
36  
37  /**
38   * @author brianf
39   */
40  class TestDependencyUtil {
41  
42      private static final String TEST_CONTENT =
43              "Test line 1" + System.lineSeparator() + "Test line 2" + System.lineSeparator();
44  
45      @TempDir
46      File temDir;
47  
48      Artifact snap;
49  
50      Artifact snapResolvedVersion;
51  
52      Artifact release;
53  
54      Artifact sources;
55  
56      @BeforeEach
57      protected void setUp() {
58  
59          ArtifactHandler ah = new DefaultArtifactHandlerStub("jar", null);
60          VersionRange vr = VersionRange.createFromVersion("1.1");
61          release = new DefaultArtifact("test", "one", vr, Artifact.SCOPE_COMPILE, "jar", "sources", ah, false);
62  
63          ah = new DefaultArtifactHandlerStub("war", null);
64          vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
65          snap = new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "war", null, ah, false);
66  
67          ah = new DefaultArtifactHandlerStub("war", null);
68          vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
69          snapResolvedVersion = new DefaultArtifact("test", "three", vr, Artifact.SCOPE_PROVIDED, "war", null, ah, false);
70          snapResolvedVersion.setResolvedVersion("1.1-20121003.035531-117");
71  
72          ah = new DefaultArtifactHandlerStub("war", null);
73          vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
74          sources = new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "sources", "sources", ah, false);
75      }
76  
77      @Test
78      void testDirectoryName() {
79          File folder = new File("target/a");
80          final Artifact artifact = release;
81          File name =
82                  DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, false, folder, artifact);
83          // object is the same.
84          assertEquals(folder, name);
85  
86          name = DependencyUtil.getFormattedOutputDirectory(false, false, false, true, false, false, folder, artifact);
87          String expectedResult = folder.getAbsolutePath() + File.separatorChar + "test" + File.separatorChar + "one"
88                  + File.separatorChar + "1.1";
89          assertTrue(expectedResult.equalsIgnoreCase(name.getAbsolutePath()));
90  
91          name = DependencyUtil.getFormattedOutputDirectory(false, true, false, false, false, false, folder, artifact);
92          expectedResult = folder.getAbsolutePath() + File.separatorChar + "jars";
93          assertTrue(expectedResult.equalsIgnoreCase(name.getAbsolutePath()));
94  
95          name = DependencyUtil.getFormattedOutputDirectory(true, false, false, false, false, false, folder, artifact);
96          expectedResult = folder.getAbsolutePath() + File.separatorChar + "compile";
97          assertEquals(expectedResult, name.getAbsolutePath());
98          assertTrue(expectedResult.equalsIgnoreCase(name.getAbsolutePath()));
99  
100         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, false, folder, artifact);
101         expectedResult = folder.getAbsolutePath() + File.separatorChar + "one-1.1-sources-jar";
102         assertEquals(expectedResult, name.getAbsolutePath());
103 
104         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, false, folder, artifact);
105         expectedResult = folder.getAbsolutePath() + File.separatorChar + "one-sources-jar";
106         assertEquals(expectedResult, name.getAbsolutePath());
107 
108         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, true, folder, artifact);
109         expectedResult = folder.getAbsolutePath() + File.separatorChar + "one-1.1-sources";
110         assertEquals(expectedResult, name.getAbsolutePath());
111 
112         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, true, folder, artifact);
113         expectedResult = folder.getAbsolutePath() + File.separatorChar + "one-sources";
114         assertEquals(expectedResult, name.getAbsolutePath());
115 
116         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, false, false, folder, artifact);
117         expectedResult =
118                 folder.getAbsolutePath() + File.separatorChar + "jars" + File.separatorChar + "one-1.1-sources-jar";
119         assertEquals(expectedResult, name.getAbsolutePath());
120 
121         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, true, false, folder, artifact);
122         expectedResult =
123                 folder.getAbsolutePath() + File.separatorChar + "jars" + File.separatorChar + "one-sources-jar";
124         assertEquals(expectedResult, name.getAbsolutePath());
125 
126         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, false, true, folder, artifact);
127         expectedResult =
128                 folder.getAbsolutePath() + File.separatorChar + "jars" + File.separatorChar + "one-1.1-sources";
129         assertEquals(expectedResult, name.getAbsolutePath());
130 
131         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, true, true, folder, artifact);
132         expectedResult = folder.getAbsolutePath() + File.separatorChar + "jars" + File.separatorChar + "one-sources";
133         assertEquals(expectedResult, name.getAbsolutePath());
134 
135         name = DependencyUtil.getFormattedOutputDirectory(true, false, true, false, true, false, folder, artifact);
136         expectedResult =
137                 folder.getAbsolutePath() + File.separatorChar + "compile" + File.separatorChar + "one-sources-jar";
138         assertEquals(expectedResult, name.getAbsolutePath());
139 
140         name = DependencyUtil.getFormattedOutputDirectory(true, false, true, false, false, true, folder, artifact);
141         expectedResult =
142                 folder.getAbsolutePath() + File.separatorChar + "compile" + File.separatorChar + "one-1.1-sources";
143         assertEquals(expectedResult, name.getAbsolutePath());
144 
145         name = DependencyUtil.getFormattedOutputDirectory(true, false, true, false, true, true, folder, artifact);
146         expectedResult = folder.getAbsolutePath() + File.separatorChar + "compile" + File.separatorChar + "one-sources";
147         assertEquals(expectedResult, name.getAbsolutePath());
148     }
149 
150     @Test
151     void testDirectoryName2() {
152         File folder = new File("target/a");
153         final Artifact artifact = snap;
154         File name =
155                 DependencyUtil.getFormattedOutputDirectory(false, false, false, false, false, false, folder, artifact);
156         // object is the same.
157         assertEquals(folder, name);
158 
159         name = DependencyUtil.getFormattedOutputDirectory(false, true, false, false, false, false, folder, artifact);
160         String expectedResult = folder.getAbsolutePath() + File.separatorChar + "wars";
161         assertEquals(expectedResult, name.getAbsolutePath());
162 
163         name = DependencyUtil.getFormattedOutputDirectory(false, false, false, true, false, false, folder, artifact);
164         expectedResult = folder.getAbsolutePath() + File.separatorChar + "test" + File.separatorChar + "two"
165                 + File.separatorChar + "1.1-SNAPSHOT";
166         assertEquals(expectedResult, name.getAbsolutePath());
167 
168         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, false, folder, artifact);
169         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-1.1-SNAPSHOT-war";
170         assertEquals(expectedResult, name.getAbsolutePath());
171 
172         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, false, false, folder, artifact);
173         expectedResult =
174                 folder.getAbsolutePath() + File.separatorChar + "wars" + File.separatorChar + "two-1.1-SNAPSHOT-war";
175         assertEquals(expectedResult, name.getAbsolutePath());
176 
177         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, false, folder, artifact);
178         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-war";
179         assertEquals(expectedResult, name.getAbsolutePath());
180 
181         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, true, folder, artifact);
182         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-1.1-SNAPSHOT";
183         assertEquals(expectedResult, name.getAbsolutePath());
184 
185         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, true, folder, artifact);
186         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two";
187         assertEquals(expectedResult, name.getAbsolutePath());
188 
189         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, true, false, folder, artifact);
190         expectedResult = folder.getAbsolutePath() + File.separatorChar + "wars" + File.separatorChar + "two-war";
191         assertEquals(expectedResult, name.getAbsolutePath());
192 
193         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, false, true, folder, artifact);
194         expectedResult =
195                 folder.getAbsolutePath() + File.separatorChar + "wars" + File.separatorChar + "two-1.1-SNAPSHOT";
196         assertEquals(expectedResult, name.getAbsolutePath());
197 
198         name = DependencyUtil.getFormattedOutputDirectory(false, true, true, false, true, true, folder, artifact);
199         expectedResult = folder.getAbsolutePath() + File.separatorChar + "wars" + File.separatorChar + "two";
200         assertEquals(expectedResult, name.getAbsolutePath());
201     }
202 
203     @Test
204     void testDirectoryNameSources() {
205         File folder = new File("target/a");
206         File name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, false, folder, sources);
207         String expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-sources";
208         assertEquals(expectedResult, name.getAbsolutePath());
209 
210         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, true, true, folder, sources);
211         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-sources";
212         assertEquals(expectedResult, name.getAbsolutePath());
213 
214         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, false, folder, sources);
215         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-1.1-SNAPSHOT-sources";
216         assertEquals(expectedResult, name.getAbsolutePath());
217 
218         name = DependencyUtil.getFormattedOutputDirectory(false, false, true, false, false, true, folder, sources);
219         expectedResult = folder.getAbsolutePath() + File.separatorChar + "two-1.1-SNAPSHOT-sources";
220         assertEquals(expectedResult, name.getAbsolutePath());
221     }
222 
223     @Test
224     void testFileName() {
225         Artifact artifact = release;
226 
227         String name = DependencyUtil.getFormattedFileName(artifact, false);
228         String expectedResult = "one-1.1-sources.jar";
229         assertEquals(expectedResult, name);
230         name = DependencyUtil.getFormattedFileName(artifact, true);
231         expectedResult = "one-sources.jar";
232         assertEquals(expectedResult, name);
233     }
234 
235     @Test
236     void testFileNameUseBaseVersion() {
237         Artifact artifact = snapResolvedVersion;
238 
239         String name = DependencyUtil.getFormattedFileName(artifact, false, false, true);
240         String expectedResult = "three-1.1-SNAPSHOT.war";
241         assertEquals(expectedResult, name);
242         name = DependencyUtil.getFormattedFileName(artifact, false, false, false);
243         expectedResult = "three-1.1-20121003.035531-117.war";
244         assertEquals(expectedResult, name);
245     }
246 
247     @Test
248     void testTestJar() {
249         ArtifactHandler ah = new DefaultArtifactHandlerStub("test-jar", null);
250         VersionRange vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
251         Artifact artifact =
252                 new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "test-jar", null, ah, false);
253 
254         String name = DependencyUtil.getFormattedFileName(artifact, false);
255         String expectedResult = "two-1.1-SNAPSHOT.jar";
256         assertEquals(expectedResult, name);
257     }
258 
259     @Test
260     void testFileNameClassifier() {
261         ArtifactHandler ah = new DefaultArtifactHandlerStub("jar", "sources");
262         VersionRange vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
263         Artifact artifact =
264                 new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "jar", "sources", ah, false);
265 
266         String name = DependencyUtil.getFormattedFileName(artifact, false);
267         String expectedResult = "two-1.1-SNAPSHOT-sources.jar";
268         assertEquals(expectedResult, name);
269 
270         name = DependencyUtil.getFormattedFileName(artifact, true);
271         expectedResult = "two-sources.jar";
272         assertEquals(expectedResult, name);
273 
274         name = DependencyUtil.getFormattedFileName(artifact, false, false, false, true);
275         expectedResult = "two-1.1-SNAPSHOT.jar";
276         assertEquals(expectedResult, name);
277 
278         ah = new DefaultArtifactHandlerStub("war", null);
279         artifact = new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "war", "", ah, false);
280         name = DependencyUtil.getFormattedFileName(artifact, true);
281         expectedResult = "two.war";
282         assertEquals(expectedResult, name);
283     }
284 
285     @Test
286     void testFileNameClassifierWithFile() {
287         // specifically testing the default operation that getFormattedFileName
288         // returns
289         // the actual name of the file if available unless remove version is
290         // set.
291         ArtifactHandler ah = new DefaultArtifactHandlerStub("war", "sources");
292         VersionRange vr = VersionRange.createFromVersion("1.1-SNAPSHOT");
293         Artifact artifact =
294                 new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "war", "sources", ah, false);
295         File file = new File("/target", "test-file-name.jar");
296         artifact.setFile(file);
297 
298         String name = DependencyUtil.getFormattedFileName(artifact, false);
299         String expectedResult = "two-1.1-SNAPSHOT-sources.war";
300         assertEquals(expectedResult, name);
301 
302         name = DependencyUtil.getFormattedFileName(artifact, false, false, false, true);
303         expectedResult = "two-1.1-SNAPSHOT.war";
304         assertEquals(expectedResult, name);
305 
306         name = DependencyUtil.getFormattedFileName(artifact, true);
307         expectedResult = "two-sources.war";
308         assertEquals(expectedResult, name);
309 
310         artifact = new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "war", "", ah, false);
311         name = DependencyUtil.getFormattedFileName(artifact, true);
312         expectedResult = "two.war";
313         assertEquals(expectedResult, name);
314 
315         // test that we pickup the correct extension in the file name if set.
316         ah = new DefaultArtifactHandlerStub("jar", null);
317         artifact = new DefaultArtifact("test", "two", vr, Artifact.SCOPE_PROVIDED, "war", "", ah, false);
318         name = DependencyUtil.getFormattedFileName(artifact, true);
319         expectedResult = "two.jar";
320         assertEquals(expectedResult, name);
321     }
322 
323     @Test
324     void testTokenizer() {
325         String[] tokens = DependencyUtil.tokenizer(" alpha,bravo, charlie , delta kappa, theta");
326         String[] expected = new String[] {"alpha", "bravo", "charlie", "delta kappa", "theta"};
327         // easier to see in the JUnit reports
328         assertEquals(String.join(", ", expected), String.join(", ", tokens));
329         assertEquals(expected.length, tokens.length);
330 
331         tokens = DependencyUtil.tokenizer(" \r\n a, \t \n \r b \t \n \r");
332         assertEquals(2, tokens.length);
333         assertEquals("a", tokens[0]);
334         assertEquals("b", tokens[1]);
335 
336         tokens = DependencyUtil.tokenizer(null);
337         assertEquals(0, tokens.length);
338 
339         tokens = DependencyUtil.tokenizer("  ");
340         assertEquals(0, tokens.length);
341     }
342 
343     @Test
344     void outputFileShouldBeOverridden() throws IOException {
345         File file = new File(temDir, "file1.out");
346         assertThat(file).doesNotExist();
347 
348         DependencyUtil.write(TEST_CONTENT, file, false, "UTF-8");
349         assertThat(file).hasContent(TEST_CONTENT);
350 
351         DependencyUtil.write(TEST_CONTENT, file, false, "UTF-8");
352         assertThat(file).hasContent(TEST_CONTENT);
353     }
354 
355     @Test
356     void outputFileShouldBeAppended() throws IOException {
357         File file = new File(temDir, "file2.out");
358         assertThat(file).doesNotExist();
359 
360         DependencyUtil.write(TEST_CONTENT, file, true, "UTF-8");
361         assertThat(file).hasContent(TEST_CONTENT);
362 
363         DependencyUtil.write(TEST_CONTENT, file, true, "UTF-8");
364         assertThat(file).hasContent(TEST_CONTENT + TEST_CONTENT);
365     }
366 }