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