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.enforcer.rules.utils;
20  
21  import java.util.ArrayList;
22  import java.util.Collection;
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.handler.DefaultArtifactHandler;
28  import org.apache.maven.artifact.versioning.ArtifactVersion;
29  import org.apache.maven.artifact.versioning.DefaultArtifactVersion;
30  import org.apache.maven.artifact.versioning.InvalidVersionSpecificationException;
31  import org.apache.maven.artifact.versioning.VersionRange;
32  import org.apache.maven.enforcer.rules.utils.ArtifactMatcher.Pattern;
33  import org.apache.maven.enforcer.rules.version.RequireJavaVersion;
34  import org.junit.jupiter.api.Test;
35  
36  import static org.junit.jupiter.api.Assertions.assertEquals;
37  import static org.junit.jupiter.api.Assertions.assertFalse;
38  import static org.junit.jupiter.api.Assertions.assertTrue;
39  import static org.junit.jupiter.api.Assertions.fail;
40  
41  class TestArtifactMatcher {
42  
43      Collection<String> patterns = new ArrayList<>();
44  
45      Collection<String> ignorePatterns = new ArrayList<>();
46  
47      @Test
48      void testPatternInvalidInput() {
49          try {
50              new Pattern(null);
51              fail("NullPointerException expected.");
52          } catch (NullPointerException ignored) {
53          }
54  
55          try {
56              new Pattern("a:b:c:d:e:f:g");
57              fail("IllegalArgumentException expected.");
58          } catch (IllegalArgumentException ignored) {
59          }
60  
61          try {
62              new Pattern("a::");
63              fail("IllegalArgumentException expected.");
64          } catch (IllegalArgumentException ignored) {
65          }
66  
67          try {
68              Pattern p = new Pattern("*");
69              p.match((Artifact) null);
70              fail("NullPointerException expected.");
71          } catch (NullPointerException ignored) {
72          }
73      }
74  
75      @Test
76      void testPattern() throws InvalidVersionSpecificationException {
77          assertPatternDoesMatch("groupId:artifactId:1.0:jar:compile", "groupId", "artifactId", "1.0", "compile", "jar");
78  
79          assertPatternDoesMatch("groupId:artifactId:1.0:jar:compile", "groupId", "artifactId", "1.0", "", "");
80  
81          assertPatternDoesMatch("groupId:artifactId:1.0", "groupId", "artifactId", "1.0", "", "");
82  
83          assertPatternDoesMatch("groupId:artifactId:1.0", "groupId", "artifactId", "1.1", "", "");
84  
85          assertPatternDoesNotMatch("groupId:artifactId:[1.0]", "groupId", "artifactId", "1.1", "", "");
86  
87          assertPatternDoesMatch("groupId:*:1.0", "groupId", "artifactId", "1.0", "test", "");
88  
89          assertPatternDoesMatch("*:*:1.0", "groupId", "artifactId", "1.0", "", "");
90  
91          assertPatternDoesMatch("*:artifactId:*", "groupId", "artifactId", "1.0", "", "");
92  
93          assertPatternDoesMatch("*", "groupId", "artifactId", "1.0", "", "");
94  
95          // MENFORCER-74/75
96          assertPatternDoesMatchWithClassifier(
97                  "*:*:*:jar:compile:tests", "groupId", "artifactId", "1.0", "", "", "tests");
98  
99          // MENFORCER-83
100         assertPatternDoesMatch("*upId", "groupId", "artifactId", "1.0", "", "");
101 
102         assertPatternDoesMatch("gr*pId:?rt?f?ct?d:1.0", "groupId", "artifactId", "1.0", "", "");
103 
104         assertPatternDoesMatch("org.apache.*:maven-*:*", "org.apache.maven", "maven-core", "3.0", "", "");
105     }
106 
107     @Test
108     void testMatch() {
109         patterns.add("groupId:artifactId:1.0");
110         patterns.add("*:anotherArtifact");
111 
112         ignorePatterns.add("badGroup:*:*:test");
113         ignorePatterns.add("*:anotherArtifact:1.1");
114 
115         ArtifactMatcher matcher = new ArtifactMatcher(patterns, ignorePatterns);
116 
117         executeMatch(matcher, "groupId", "artifactId", "1.0", "", "", true);
118 
119         executeMatch(matcher, "groupId", "anotherArtifact", "1.0", "", "", true);
120 
121         executeMatch(matcher, "badGroup", "artifactId", "1.0", "", "test", false);
122 
123         executeMatch(matcher, "badGroup", "anotherArtifact", "1.0", "", "", true);
124 
125         executeMatch(matcher, "groupId", "anotherArtifact", "1.1", "", "", false);
126     }
127 
128     private void assertPatternDoesMatch(
129             final String pattern,
130             final String groupId,
131             final String artifactId,
132             final String versionRange,
133             final String scope,
134             final String type) {
135         assertPatternDoesMatchWithClassifier(pattern, groupId, artifactId, versionRange, scope, type, "");
136     }
137 
138     private void assertPatternDoesNotMatch(
139             final String pattern,
140             final String groupId,
141             final String artifactId,
142             final String versionRange,
143             final String scope,
144             final String type) {
145         assertPatternDoesNotMatchWithClassifier(pattern, groupId, artifactId, versionRange, scope, type, "");
146     }
147 
148     private void assertPatternDoesMatchWithClassifier(
149             final String pattern,
150             final String groupId,
151             final String artifactId,
152             final String versionRange,
153             final String scope,
154             final String type,
155             final String classifier) {
156         assertTrue(new ArtifactMatcher.Pattern(pattern)
157                 .match(createMockArtifact(groupId, artifactId, versionRange, scope, type, classifier)));
158     }
159 
160     private void assertPatternDoesNotMatchWithClassifier(
161             final String pattern,
162             final String groupId,
163             final String artifactId,
164             final String versionRange,
165             final String scope,
166             final String type,
167             final String classifier) {
168         assertFalse(new ArtifactMatcher.Pattern(pattern)
169                 .match(createMockArtifact(groupId, artifactId, versionRange, scope, type, classifier)));
170     }
171 
172     private void executeMatch(
173             final ArtifactMatcher matcher,
174             final String groupId,
175             final String artifactId,
176             final String versionRange,
177             final String scope,
178             final String type,
179             final boolean expectedResult) {
180         assertEquals(
181                 expectedResult, matcher.match(createMockArtifact(groupId, artifactId, versionRange, scope, type, "")));
182     }
183 
184     private static Artifact createMockArtifact(
185             final String groupId,
186             final String artifactId,
187             final String versionRange,
188             final String scope,
189             final String type,
190             final String classifier) {
191         ArtifactHandler artifactHandler = new DefaultArtifactHandler();
192 
193         VersionRange version = VersionRange.createFromVersion(versionRange);
194         return new DefaultArtifact(groupId, artifactId, version, scope, type, classifier, artifactHandler);
195     }
196 
197     /**
198      * Test contains version.
199      *
200      * @throws InvalidVersionSpecificationException the invalid version specification exception
201      */
202     @Test
203     void testContainsVersion() throws InvalidVersionSpecificationException {
204         ArtifactVersion version = new DefaultArtifactVersion("2.0.5");
205         // test ranges
206         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.5,)"), version));
207         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.4,)"), version));
208         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.4,2.0.5]"), version));
209         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.4,2.0.6]"), version));
210         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.4,2.0.6)"), version));
211         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0,)"), version));
212         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.0,)"), version));
213         // not matching versions
214         assertFalse(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.4,2.0.5)"), version));
215         assertFalse(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.0.6,)"), version));
216         assertFalse(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("(2.0.5,)"), version));
217 
218         // test singular versions -> 2.0.5 == [2.0.5,) or x >= 2.0.5
219         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("2.0"), version));
220         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("2.0.4"), version));
221         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("2.0.5"), version));
222 
223         assertFalse(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("2.0.6"), version));
224 
225         version = new DefaultArtifactVersion("1.5.0-7");
226         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[1.5.0,)"), version));
227         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[1.5,1.6)"), version));
228 
229         version = new DefaultArtifactVersion(RequireJavaVersion.normalizeJDKVersion("1.5.0-07"));
230         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[1.5.0,)"), version));
231         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[1.5,1.6)"), version));
232 
233         // MENFORCER-50
234         version = new DefaultArtifactVersion("2.1.0-M1-RC12");
235         assertTrue(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.1.0-M1-RC12,)"), version));
236         assertFalse(ArtifactMatcher.containsVersion(VersionRange.createFromVersionSpec("[2.1.0-M1,)"), version));
237     }
238 }