]> source.dussan.org Git - archiva.git/blob
26df1c85a2c37713a2868c8836f20aad22f08641
[archiva.git] /
1 package org.apache.archiva.repository.maven.content;
2
3 /*
4  * Licensed to the Apache Software Foundation (ASF) under one
5  * or more contributor license agreements.  See the NOTICE file
6  * distributed with this work for additional information
7  * regarding copyright ownership.  The ASF licenses this file
8  * to you under the Apache License, Version 2.0 (the
9  * "License"); you may not use this file except in compliance
10  * with the License.  You may obtain a copy of the License at
11  *
12  * http://www.apache.org/licenses/LICENSE-2.0
13  * Unless required by applicable law or agreed to in writing,
14  * software distributed under the License is distributed on an
15  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16  * KIND, either express or implied.  See the License for the
17  * specific language governing permissions and limitations
18  * under the License.
19  */
20
21 import org.apache.archiva.repository.LayoutException;
22 import org.apache.archiva.repository.content.ItemSelector;
23 import org.apache.archiva.repository.content.PathParser;
24 import org.apache.archiva.test.utils.ArchivaSpringJUnit4ClassRunner;
25 import org.apache.commons.lang3.StringUtils;
26 import org.junit.Test;
27 import org.junit.runner.RunWith;
28 import org.springframework.test.context.ContextConfiguration;
29
30 import static org.junit.Assert.*;
31
32 /**
33  * DefaultPathParserTest
34  *
35  * TODO: move to path translator tests
36  *
37  *
38  */
39 @RunWith ( ArchivaSpringJUnit4ClassRunner.class )
40 @ContextConfiguration ( { "classpath*:/META-INF/spring-context.xml", "classpath:/spring-context.xml" } )
41 public class DefaultPathParserTest
42 {
43     private PathParser parser = new DefaultPathParser();
44
45     @Test
46     public void testBadPathMissingType()
47     {
48         // TODO: should we allow this instead?
49         assertBadPath( "invalid/invalid/1/invalid-1", "missing type" );
50     }
51
52     @Test
53     public void testBadPathReleaseInSnapshotDir()
54     {
55         assertBadPath( "invalid/invalid/1.0-SNAPSHOT/invalid-1.0.jar",
56                        "non snapshot artifact inside of a snapshot dir" );
57     }
58
59     @Test
60     public void testBadPathTimestampedSnapshotNotInSnapshotDir()
61     {
62         assertBadPath( "invalid/invalid/1.0-20050611.123456-1/invalid-1.0-20050611.123456-1.jar",
63                        "Timestamped Snapshot artifact not inside of an Snapshot dir" );
64     }
65
66     @Test
67     public void testBadPathTooShort()
68     {
69         assertBadPath( "invalid/invalid-1.0.jar", "path is too short" );
70     }
71
72     @Test
73     public void testBadPathVersionMismatchA()
74     {
75         assertBadPath( "invalid/invalid/1.0/invalid-2.0.jar", "version mismatch between path and artifact" );
76     }
77
78     @Test
79     public void testBadPathVersionMismatchB()
80     {
81         assertBadPath( "invalid/invalid/1.0/invalid-1.0b.jar", "version mismatch between path and artifact" );
82     }
83
84     @Test
85     public void testBadPathWrongArtifactId()
86     {
87         assertBadPath( "org/apache/maven/test/1.0-SNAPSHOT/wrong-artifactId-1.0-20050611.112233-1.jar",
88                        "wrong artifact id" );
89     }
90
91     /**
92      * [MRM-481] Artifact requests with a .xml.zip extension fail with a 404 Error
93      */
94     @Test
95     public void testGoodButDualExtensions()
96         throws LayoutException
97     {
98         String groupId = "org.project";
99         String artifactId = "example-presentation";
100         String version = "3.2";
101         String artifactVersion = "3.2";
102         String classifier = null;
103         String type = "xml.zip";
104         String path = "org/project/example-presentation/3.2/example-presentation-3.2.xml.zip";
105
106         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
107     }
108
109     @Test
110     public void testGoodButDualExtensionsWithClassifier()
111         throws LayoutException
112     {
113         String groupId = "org.project";
114         String artifactId = "example-presentation";
115         String version = "3.2";
116         String artifactVersion = "3.2";
117         String classifier = "extras";
118         String type = "xml.zip";
119         String path = "org/project/example-presentation/3.2/example-presentation-3.2-extras.xml.zip";
120
121         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
122     }
123
124     @Test
125     public void testGoodButDualExtensionsTarGz()
126         throws LayoutException
127     {
128         String groupId = "org.project";
129         String artifactId = "example-distribution";
130         String version = "1.3";
131         String artifactVersion = "1.3";
132         String classifier = null;
133         String type = "tar.gz"; // no longer using distribution-tgz / distribution-zip in maven 2
134         String path = "org/project/example-distribution/1.3/example-distribution-1.3.tar.gz";
135
136         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
137     }
138
139     @Test
140     public void testGoodButDualExtensionsTarGzAndClassifier()
141         throws LayoutException
142     {
143         String groupId = "org.project";
144         String artifactId = "example-distribution";
145         String version = "1.3";
146         String artifactVersion = "1.3";
147         String classifier = "bin";
148         String type = "tar.gz"; // no longer using distribution-tgz / distribution-zip in maven 2
149         String path = "org/project/example-distribution/1.3/example-distribution-1.3-bin.tar.gz";
150
151         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
152     }
153
154     /**
155      * [MRM-432] Oddball version spec.
156      * Example of an oddball / unusual version spec.
157      *
158      * @throws LayoutException
159      */
160     @Test
161     public void testGoodButOddVersionSpecGanymedSsh2()
162         throws LayoutException
163     {
164         String groupId = "ch.ethz.ganymed";
165         String artifactId = "ganymed-ssh2";
166         String version = "build210";
167         String artifactVersion = "build210";
168         String classifier = null;
169         String type = "jar";
170         String path = "ch/ethz/ganymed/ganymed-ssh2/build210/ganymed-ssh2-build210.jar";
171
172         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
173     }
174
175     /**
176      * [MRM-432] Oddball version spec.
177      * Example of an oddball / unusual version spec.
178      *
179      * @throws LayoutException
180      */
181     @Test
182     public void testGoodButOddVersionSpecJavaxComm()
183         throws LayoutException
184     {
185         String groupId = "javax";
186         String artifactId = "comm";
187         String version = "3.0-u1";
188         String artifactVersion = "3.0-u1";
189         String classifier = null;
190         String type = "jar";
191         String path = "javax/comm/3.0-u1/comm-3.0-u1.jar";
192
193         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
194     }
195
196     /**
197      * Test the ejb-client type spec.
198      * Type specs are not a 1 to 1 map to the extension.
199      * This tests that effect.
200      * @throws LayoutException
201      */
202     /* TODO: Re-enabled in the future.
203     public void testGoodFooEjbClient()
204         throws LayoutException
205     {
206         String groupId = "com.foo";
207         String artifactId = "foo-client";
208         String version = "1.0";
209         String classifier = null;
210         String type = "ejb-client"; // oddball type-spec (should result in jar extension)
211         String path = "com/foo/foo-client/1.0/foo-client-1.0.jar";
212
213         assertLayout( path, groupId, artifactId, version, classifier, type );
214     }
215     */
216
217     /**
218      * [MRM-432] Oddball version spec.
219      * Example of an oddball / unusual version spec.
220      *
221      * @throws LayoutException
222      */
223     @Test
224     public void testGoodButOddVersionSpecJavaxPersistence()
225         throws LayoutException
226     {
227         String groupId = "javax.persistence";
228         String artifactId = "ejb";
229         String version = "3.0-public_review";
230         String artifactVersion = "3.0-public_review";
231         String classifier = null;
232         String type = "jar";
233         String path = "javax/persistence/ejb/3.0-public_review/ejb-3.0-public_review.jar";
234
235         /*
236          * The version id of "public_review" can cause problems. is it part of
237          * the version spec? or the classifier?
238          * Since the path spec below shows it in the path, then it is really
239          * part of the version spec.
240          */
241
242         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
243     }
244
245     @Test
246     public void testGoodComFooTool()
247         throws LayoutException
248     {
249         String groupId = "com.foo";
250         String artifactId = "foo-tool";
251         String version = "1.0";
252         String artifactVersion = "1.0";
253         String classifier = null;
254         String type = "jar";
255         String path = "com/foo/foo-tool/1.0/foo-tool-1.0.jar";
256
257         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
258     }
259
260     @Test
261     public void testGoodCommonsLang()
262         throws LayoutException
263     {
264         String groupId = "commons-lang";
265         String artifactId = "commons-lang";
266         String version = "2.1";
267         String artifactVersion = "2.1";
268         String classifier = null;
269         String type = "jar";
270         String path = "commons-lang/commons-lang/2.1/commons-lang-2.1.jar";
271
272         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
273     }
274
275     @Test
276     public void testWindowsPathSeparator()
277         throws LayoutException
278     {
279         String groupId = "commons-lang";
280         String artifactId = "commons-lang";
281         String version = "2.1";
282         String artifactVersion = "2.1";
283         String classifier = null;
284         String type = "jar";
285         String path = "commons-lang\\commons-lang/2.1\\commons-lang-2.1.jar";
286
287         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
288     }
289
290     /**
291      * [MRM-486] Can not deploy artifact test.maven-arch:test-arch due to "No ArtifactID Detected"
292      */
293     @Test
294     public void testGoodDashedArtifactId()
295         throws LayoutException
296     {
297         String groupId = "test.maven-arch";
298         String artifactId = "test-arch";
299         String version = "2.0.3-SNAPSHOT";
300         String artifactVersion = "2.0.3-SNAPSHOT";
301         String classifier = null;
302         String type = "pom";
303         String path = "test/maven-arch/test-arch/2.0.3-SNAPSHOT/test-arch-2.0.3-SNAPSHOT.pom";
304
305         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
306     }
307
308     /**
309      * It may seem odd, but this is a valid artifact.
310      */
311     @Test
312     public void testGoodDotNotationArtifactId()
313         throws LayoutException
314     {
315         String groupId = "com.company.department";
316         String artifactId = "com.company.department";
317         String version = "0.2";
318         String artifactVersion = "0.2";
319         String classifier = null;
320         String type = "pom";
321         String path = "com/company/department/com.company.department/0.2/com.company.department-0.2.pom";
322
323         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
324     }
325
326     /**
327      * It may seem odd, but this is a valid artifact.
328      */
329     @Test
330     public void testGoodDotNotationSameGroupIdAndArtifactId()
331         throws LayoutException
332     {
333         String groupId = "com.company.department";
334         String artifactId = "com.company.department.project";
335         String version = "0.3";
336         String artifactVersion = "0.3";
337         String classifier = null;
338         String type = "pom";
339         String path =
340             "com/company/department/com.company.department.project/0.3/com.company.department.project-0.3.pom";
341
342         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
343     }
344
345     /**
346      * Test the classifier, and java-source type spec.
347      *
348      * @throws LayoutException
349      */
350     @Test
351     public void testGoodFooLibSources()
352         throws LayoutException
353     {
354         String groupId = "com.foo.lib";
355         String artifactId = "foo-lib";
356         String version = "2.1-alpha-1";
357         String artifactVersion = "2.1-alpha-1";
358         String classifier = "sources";
359         String type = "java-source"; // oddball type-spec (should result in jar extension)
360         String path = "com/foo/lib/foo-lib/2.1-alpha-1/foo-lib-2.1-alpha-1-sources.jar";
361
362         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
363     }
364
365     /**
366      * A timestamped versioned artifact, should reside in a SNAPSHOT baseversion directory.
367      *
368      * @throws LayoutException
369      */
370     @Test
371     public void testGoodSnapshotMavenTest()
372         throws LayoutException
373     {
374         String groupId = "org.apache.archiva.test";
375         String artifactId = "redonkulous";
376         String version = "3.1-beta-1-SNAPSHOT";
377         String artifactVersion = "3.1-beta-1-20050831.101112-42";
378         String classifier = null;
379         String type = "jar";
380         String path =
381             "org/apache/archiva/test/redonkulous/3.1-beta-1-SNAPSHOT/redonkulous-3.1-beta-1-20050831.101112-42.jar";
382
383         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
384     }
385
386     /**
387      * A timestamped versioned artifact, should reside in a SNAPSHOT baseversion directory.
388      *
389      * @throws LayoutException
390      */
391     @Test
392     public void testGoodLongSnapshotMavenTest()
393         throws LayoutException
394     {
395         String groupId = "a.group.id";
396         String artifactId = "artifact-id";
397         String version = "1.0-abc-1.1-SNAPSHOT";
398         String artifactVersion = "1.0-abc-1.1-20080221.062205-9";
399         String classifier = null;
400         String type = "pom";
401         String path = "a/group/id/artifact-id/1.0-abc-1.1-SNAPSHOT/artifact-id-1.0-abc-1.1-20080221.062205-9.pom";
402
403         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
404     }
405
406     /**
407      * A timestamped versioned artifact but without release version part. Like on axiom trunk.
408      */
409     @Test
410     public void testBadSnapshotWithoutReleasePart()
411     {
412         assertBadPath( "org/apache/ws/commons/axiom/axiom/SNAPSHOT/axiom-20070912.093446-2.pom",
413                        "snapshot version without release part" );
414     }
415
416     /**
417      * A timestamped versioned artifact, should reside in a SNAPSHOT baseversion directory.
418      *
419      * @throws LayoutException
420      */
421     @Test
422     public void testClassifiedSnapshotMavenTest()
423         throws LayoutException
424     {
425         String groupId = "a.group.id";
426         String artifactId = "artifact-id";
427         String version = "1.0-SNAPSHOT";
428         String artifactVersion = "1.0-20070219.171202-34";
429         String classifier = "test-sources";
430         String type = "jar";
431         String path = "a/group/id/artifact-id/1.0-SNAPSHOT/artifact-id-1.0-20070219.171202-34-test-sources.jar";
432
433         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
434     }
435
436     /**
437      * [MRM-519] version identifiers within filename cause misidentification of version.
438      * Example uses "test" in artifact Id, which is also part of the versionKeyword list.
439      */
440     @Test
441     public void testGoodVersionKeywordInArtifactId()
442         throws LayoutException
443     {
444         String groupId = "maven";
445         String artifactId = "maven-test-plugin";
446         String version = "1.8.2";
447         String artifactVersion = "1.8.2";
448         String classifier = null;
449         String type = "pom";
450         String path = "maven/maven-test-plugin/1.8.2/maven-test-plugin-1.8.2.pom";
451
452         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
453     }
454
455     /**
456      * [MRM-562] Artifact type "maven-plugin" is not detected correctly in .toArtifactReference() methods.
457      * Example uses "test" in artifact Id, which is also part of the versionKeyword list.
458      */
459     @Test
460     public void testGoodDetectMavenTestPlugin()
461         throws LayoutException
462     {
463         String groupId = "maven";
464         String artifactId = "maven-test-plugin";
465         String version = "1.8.2";
466         String artifactVersion = "1.8.2";
467         String classifier = null;
468         String type = "maven-plugin";
469         String path = "maven/maven-test-plugin/1.8.2/maven-test-plugin-1.8.2.jar";
470
471         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
472     }
473
474     /**
475      * [MRM-562] Artifact type "maven-plugin" is not detected correctly in .toArtifactReference() methods.
476      */
477     @Test
478     public void testGoodDetectCoberturaMavenPlugin()
479         throws LayoutException
480     {
481         String groupId = "org.codehaus.mojo";
482         String artifactId = "cobertura-maven-plugin";
483         String version = "2.1";
484         String artifactVersion = "2.1";
485         String classifier = null;
486         String type = "maven-plugin";
487         String path = "org/codehaus/mojo/cobertura-maven-plugin/2.1/cobertura-maven-plugin-2.1.jar";
488
489         assertLayout( path, groupId, artifactId, version, artifactVersion, classifier, type );
490     }
491
492     @Test
493     public void testToArtifactOnEmptyPath()
494     {
495         try
496         {
497             parser.toItemSelector( "" );
498             fail( "Should have failed due to empty path." );
499         }
500         catch ( LayoutException e )
501         {
502             /* expected path */
503         }
504     }
505
506     @Test
507     public void testToArtifactOnNullPath()
508     {
509         try
510         {
511             parser.toItemSelector( null );
512             fail( "Should have failed due to null path." );
513         }
514         catch ( LayoutException e )
515         {
516             /* expected path */
517         }
518     }
519
520     @Test
521     public void testToArtifactReferenceOnEmptyPath()
522     {
523         try
524         {
525             parser.toItemSelector( "" );
526             fail( "Should have failed due to empty path." );
527         }
528         catch ( LayoutException e )
529         {
530             /* expected path */
531         }
532     }
533
534     @Test
535     public void testToArtifactReferenceOnNullPath()
536     {
537         try
538         {
539             parser.toItemSelector( null );
540             fail( "Should have failed due to null path." );
541         }
542         catch ( LayoutException e )
543         {
544             /* expected path */
545         }
546     }
547
548     /**
549      * Perform a path to artifact reference lookup, and verify the results.
550      */
551     private void assertLayout( String path, String groupId, String artifactId, String version, String artifactVersion, String classifier,
552                                String type )
553         throws LayoutException
554     {
555         // Path to Artifact Reference.
556         ItemSelector testReference = parser.toItemSelector( path );
557         assertArtifactReference( testReference, groupId, artifactId, version, artifactVersion, classifier, type );
558     }
559
560     private void assertArtifactReference( ItemSelector actualReference, String groupId, String artifactId,
561                                           String version, String artifactVersion, String classifier, String type )
562     {
563         String expectedId =
564             "ArtifactReference - " + groupId + ":" + artifactId + ":" + version + ":" + classifier + ":" + type;
565
566         assertNotNull( expectedId + " - Should not be null.", actualReference );
567
568         assertEquals( expectedId + " - Group ID", groupId, actualReference.getNamespace() );
569         assertEquals( expectedId + " - Artifact ID", artifactId, actualReference.getArtifactId() );
570         assertEquals( expectedId + " - Artifact Version", artifactVersion, actualReference.getArtifactVersion( ) );
571         if ( StringUtils.isNotBlank( classifier ) )
572         {
573             assertEquals( expectedId + " - Classifier", classifier, actualReference.getClassifier() );
574         }
575         assertEquals( expectedId + " - Version ID", version, actualReference.getVersion() );
576         assertEquals( expectedId + " - Type", type, actualReference.getType() );
577     }
578
579     private void assertBadPath( String path, String reason )
580     {
581         try
582         {
583             parser.toItemSelector( path );
584             fail(
585                 "Should have thrown a LayoutException on the invalid path [" + path + "] because of [" + reason + "]" );
586         }
587         catch ( LayoutException e )
588         {
589             /* expected path */
590         }
591     }
592 }