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.project;
20  
21  import java.io.File;
22  import java.util.Collections;
23  import java.util.List;
24  
25  import org.apache.maven.artifact.InvalidRepositoryException;
26  import org.apache.maven.bridge.MavenRepositorySystem;
27  import org.apache.maven.model.Dependency;
28  import org.apache.maven.model.Parent;
29  import org.apache.maven.model.resolution.ModelResolver;
30  import org.apache.maven.model.resolution.UnresolvableModelException;
31  import org.eclipse.aether.DefaultRepositorySystemSession;
32  import org.eclipse.aether.RepositorySystem;
33  import org.eclipse.aether.impl.RemoteRepositoryManager;
34  import org.eclipse.aether.repository.RemoteRepository;
35  import org.junit.jupiter.api.Test;
36  
37  import static org.codehaus.plexus.testing.PlexusExtension.getBasedir;
38  import static org.hamcrest.MatcherAssert.assertThat;
39  import static org.hamcrest.Matchers.containsString;
40  import static org.junit.jupiter.api.Assertions.assertEquals;
41  import static org.junit.jupiter.api.Assertions.assertNotNull;
42  import static org.junit.jupiter.api.Assertions.assertThrows;
43  
44  /**
45   * Test cases for the project {@code ModelResolver} implementation.
46   *
47   * @since 3.5.0
48   */
49  class ProjectModelResolverTest extends AbstractMavenProjectTestCase {
50  
51      /**
52       * Creates a new {@code ProjectModelResolverTest} instance.
53       */
54      public ProjectModelResolverTest() {
55          super();
56      }
57  
58      @Test
59      void testResolveParentThrowsUnresolvableModelExceptionWhenNotFound() throws Exception {
60          final Parent parent = new Parent();
61          parent.setGroupId("org.apache");
62          parent.setArtifactId("apache");
63          parent.setVersion("0");
64  
65          UnresolvableModelException e = assertThrows(
66                  UnresolvableModelException.class,
67                  () -> newModelResolver().resolveModel(parent),
68                  "Expected 'UnresolvableModelException' not thrown.");
69          assertNotNull(e.getMessage());
70          assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
71      }
72  
73      @Test
74      void testResolveParentThrowsUnresolvableModelExceptionWhenNoMatchingVersionFound() throws Exception {
75          final Parent parent = new Parent();
76          parent.setGroupId("org.apache");
77          parent.setArtifactId("apache");
78          parent.setVersion("[2.0,2.1)");
79  
80          UnresolvableModelException e = assertThrows(
81                  UnresolvableModelException.class,
82                  () -> newModelResolver().resolveModel(parent),
83                  "Expected 'UnresolvableModelException' not thrown.");
84          assertEquals("No versions matched the requested parent version range '[2.0,2.1)'", e.getMessage());
85      }
86  
87      @Test
88      void testResolveParentThrowsUnresolvableModelExceptionWhenUsingRangesWithoutUpperBound() throws Exception {
89          final Parent parent = new Parent();
90          parent.setGroupId("org.apache");
91          parent.setArtifactId("apache");
92          parent.setVersion("[1,)");
93  
94          UnresolvableModelException e = assertThrows(
95                  UnresolvableModelException.class,
96                  () -> newModelResolver().resolveModel(parent),
97                  "Expected 'UnresolvableModelException' not thrown.");
98          assertEquals("The requested parent version range '[1,)' does not specify an upper bound", e.getMessage());
99      }
100 
101     @Test
102     void testResolveParentSuccessfullyResolvesExistingParentWithoutRange() throws Exception {
103         final Parent parent = new Parent();
104         parent.setGroupId("org.apache");
105         parent.setArtifactId("apache");
106         parent.setVersion("1");
107 
108         assertNotNull(this.newModelResolver().resolveModel(parent));
109         assertEquals("1", parent.getVersion());
110     }
111 
112     @Test
113     void testResolveParentSuccessfullyResolvesExistingParentUsingHighestVersion() throws Exception {
114         final Parent parent = new Parent();
115         parent.setGroupId("org.apache");
116         parent.setArtifactId("apache");
117         parent.setVersion("(,2.0)");
118 
119         assertNotNull(this.newModelResolver().resolveModel(parent));
120         assertEquals("1", parent.getVersion());
121     }
122 
123     @Test
124     void testResolveDependencyThrowsUnresolvableModelExceptionWhenNotFound() throws Exception {
125         final Dependency dependency = new Dependency();
126         dependency.setGroupId("org.apache");
127         dependency.setArtifactId("apache");
128         dependency.setVersion("0");
129 
130         UnresolvableModelException e = assertThrows(
131                 UnresolvableModelException.class,
132                 () -> newModelResolver().resolveModel(dependency),
133                 "Expected 'UnresolvableModelException' not thrown.");
134         assertNotNull(e.getMessage());
135         assertThat(e.getMessage(), containsString("Could not find artifact org.apache:apache:pom:0 in central"));
136     }
137 
138     @Test
139     void testResolveDependencyThrowsUnresolvableModelExceptionWhenNoMatchingVersionFound() throws Exception {
140         final Dependency dependency = new Dependency();
141         dependency.setGroupId("org.apache");
142         dependency.setArtifactId("apache");
143         dependency.setVersion("[2.0,2.1)");
144 
145         UnresolvableModelException e = assertThrows(
146                 UnresolvableModelException.class,
147                 () -> newModelResolver().resolveModel(dependency),
148                 "Expected 'UnresolvableModelException' not thrown.");
149         assertEquals("No versions matched the requested dependency version range '[2.0,2.1)'", e.getMessage());
150     }
151 
152     @Test
153     void testResolveDependencyThrowsUnresolvableModelExceptionWhenUsingRangesWithoutUpperBound() throws Exception {
154         final Dependency dependency = new Dependency();
155         dependency.setGroupId("org.apache");
156         dependency.setArtifactId("apache");
157         dependency.setVersion("[1,)");
158 
159         UnresolvableModelException e = assertThrows(
160                 UnresolvableModelException.class,
161                 () -> newModelResolver().resolveModel(dependency),
162                 "Expected 'UnresolvableModelException' not thrown.");
163         assertEquals("The requested dependency version range '[1,)' does not specify an upper bound", e.getMessage());
164     }
165 
166     @Test
167     void testResolveDependencySuccessfullyResolvesExistingDependencyWithoutRange() throws Exception {
168         final Dependency dependency = new Dependency();
169         dependency.setGroupId("org.apache");
170         dependency.setArtifactId("apache");
171         dependency.setVersion("1");
172 
173         assertNotNull(this.newModelResolver().resolveModel(dependency));
174         assertEquals("1", dependency.getVersion());
175     }
176 
177     @Test
178     void testResolveDependencySuccessfullyResolvesExistingDependencyUsingHighestVersion() throws Exception {
179         final Dependency dependency = new Dependency();
180         dependency.setGroupId("org.apache");
181         dependency.setArtifactId("apache");
182         dependency.setVersion("(,2.0)");
183 
184         assertNotNull(this.newModelResolver().resolveModel(dependency));
185         assertEquals("1", dependency.getVersion());
186     }
187 
188     private ModelResolver newModelResolver() throws Exception {
189         final File localRepo = new File(this.getLocalRepository().getBasedir());
190         final DefaultRepositorySystemSession repoSession = new DefaultRepositorySystemSession(h -> false);
191         repoSession.setLocalRepositoryManager(new LegacyLocalRepositoryManager(localRepo));
192 
193         return new ProjectModelResolver(
194                 repoSession,
195                 null,
196                 getContainer().lookup(RepositorySystem.class),
197                 getContainer().lookup(RemoteRepositoryManager.class),
198                 this.getRemoteRepositories(),
199                 ProjectBuildingRequest.RepositoryMerging.REQUEST_DOMINANT,
200                 null);
201     }
202 
203     private List<RemoteRepository> getRemoteRepositories() throws InvalidRepositoryException {
204         final File repoDir = new File(getBasedir(), "src/test/remote-repo").getAbsoluteFile();
205         final RemoteRepository remoteRepository = new RemoteRepository.Builder(
206                         MavenRepositorySystem.DEFAULT_REMOTE_REPO_ID,
207                         "default",
208                         repoDir.toURI().toASCIIString())
209                 .build();
210 
211         return Collections.singletonList(remoteRepository);
212     }
213 }