View Javadoc
1   package org.apache.maven.shared.artifact.resolver;
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   *
14   * Unless required by applicable law or agreed to in writing,
15   * software distributed under the License is distributed on an
16   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
17   * KIND, either express or implied.  See the License for the
18   * specific language governing permissions and limitations
19   * under the License.
20   */
21  
22  import static org.junit.Assert.assertEquals;
23  import static org.junit.Assert.assertNotNull;
24  import static org.junit.Assert.assertTrue;
25  import static junit.framework.Assert.fail;
26  
27  import org.apache.maven.ProjectDependenciesResolver;
28  import org.apache.maven.artifact.Artifact;
29  import org.apache.maven.artifact.factory.ArtifactFactory;
30  import org.apache.maven.artifact.metadata.ArtifactMetadataSource;
31  import org.apache.maven.artifact.repository.ArtifactRepository;
32  import org.apache.maven.artifact.repository.DefaultArtifactRepository;
33  import org.apache.maven.artifact.repository.layout.ArtifactRepositoryLayout;
34  import org.apache.maven.artifact.resolver.ArtifactNotFoundException;
35  import org.apache.maven.artifact.resolver.ArtifactResolutionException;
36  import org.apache.maven.artifact.resolver.ArtifactResolver;
37  import org.apache.maven.execution.MavenSession;
38  import org.apache.maven.model.Model;
39  import org.apache.maven.model.io.xpp3.MavenXpp3Writer;
40  import org.apache.maven.project.DefaultProjectBuilderConfiguration;
41  import org.apache.maven.project.MavenProject;
42  import org.apache.maven.project.MavenProjectBuilder;
43  import org.apache.maven.project.ProjectBuilderConfiguration;
44  import org.apache.maven.project.ProjectBuildingException;
45  import org.apache.maven.settings.Settings;
46  import org.apache.maven.shared.artifact.resolver.testutil.ModelCreator;
47  import org.apache.maven.shared.utils.io.FileUtils;
48  import org.apache.maven.shared.utils.io.IOUtil;
49  import org.codehaus.plexus.DefaultPlexusContainer;
50  import org.codehaus.plexus.PlexusContainer;
51  import org.codehaus.plexus.PlexusContainerException;
52  import org.codehaus.plexus.component.repository.exception.ComponentLifecycleException;
53  import org.codehaus.plexus.component.repository.exception.ComponentLookupException;
54  import org.junit.AfterClass;
55  import org.junit.BeforeClass;
56  import org.junit.Test;
57  
58  import java.io.File;
59  import java.io.FileWriter;
60  import java.io.IOException;
61  import java.util.Collection;
62  import java.util.Collections;
63  import java.util.LinkedHashSet;
64  import java.util.Set;
65  
66  
67  public class DefaultProjectDependenciesResolverIT
68  {
69      
70      private static PlexusContainer container;
71      
72      private static ArtifactResolver artifactResolver;
73      
74      private static ArtifactMetadataSource metadataSource;
75      
76      private static ArtifactFactory artifactFactory;
77      
78      private static MavenProjectBuilder projectBuilder;
79      
80      private static DefaultProjectDependenciesResolver resolver;
81      
82      private static MavenSession session;
83  
84      private static File localRepoDir;
85      
86      private static File pomsDir;
87  
88      private static ProjectBuilderConfiguration pbConfig;
89      
90      @Test
91      public void resolveSingleDependency_SingleProject_CompileScope()
92          throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
93      {
94          String gid = "org.codehaus.plexus";
95          String aid = "plexus-utils";
96          String version = "1.5.15";
97          
98          Model model = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
99          
100         MavenProject project = writeAndBuild( model, "pom.1dep-1project-compile-scope.xml" );
101         
102         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
103         
104         Set<Artifact> result = resolver.resolve( project, scopes, session );
105         
106         assertSingleArtifact( result, gid, aid, version );
107     }
108     
109     @Test
110     public void resolveUsingDependencyManagementForTransitives_SingleProject_CompileScope()
111         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
112     {
113         String gid = "org.apache.maven";
114         String aid = "maven-project";
115         String version = "2.2.1";
116         
117         String maid = "maven-model";
118         String mversion = "2.1.0";
119         
120         Model model = new ModelCreator().withDefaultCoordinate()
121                                         .withDependency( gid, aid, version )
122                                         .withManagedDependency( gid, maid, mversion )
123                                         .getModel();
124         
125         MavenProject project = writeAndBuild( model, "pom.managed-transitive-dep-1project-compile-scope.xml" );
126         
127         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
128         
129         Set<Artifact> result = resolver.resolve( project, scopes, session );
130         
131         assertNotNull( result );
132         
133 //        System.out.println( "Got: " + result.size() + " results:" );
134 //        for ( Artifact artifact : result )
135 //        {
136 //            System.out.println( "\n- " + artifact.getId() );
137 //        }
138         
139         assertArtifactPresent( result, gid, aid, version );
140         assertArtifactPresent( result, gid, maid, mversion );
141     }
142     
143     @Test
144     public void resolveUsingDependencyManagementIntermittently_TwoProjects_CompileScope_FirstWins()
145         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
146     {
147         String gid = "org.apache.maven";
148         String aid = "maven-project";
149         String version = "2.2.1";
150         
151         String maid = "maven-model";
152         String mversion = "2.1.0";
153         
154         Model model1 = new ModelCreator().withDefaultCoordinate()
155                                         .withDependency( gid, aid, version )
156                                         .withManagedDependency( gid, maid, mversion )
157                                         .getModel();
158         
159         MavenProject project1 = writeAndBuild( model1, "pom.managed-transitive-dep-2proj-compile-scope-A.xml" );
160         
161         Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
162         MavenProject project2 = writeAndBuild( model2, "pom.managed-transitive-dep-2proj-compile-scope-B.xml" );
163         
164         Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
165         projects.add( project1 );
166         projects.add( project2 );
167 
168         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
169         
170         Set<Artifact> result = resolver.resolve( projects, scopes, session );
171         
172         assertNotNull( result );
173         
174 //        System.out.println( "Got: " + result.size() + " results:" );
175 //        for ( Artifact artifact : result )
176 //        {
177 //            System.out.println( "\n- " + artifact.getId() );
178 //        }
179         
180         assertArtifactPresent( result, gid, aid, version );
181         assertArtifactPresent( result, gid, maid, mversion );
182     }
183     
184     private void assertArtifactPresent( Set<Artifact> result, String gid, String aid, String version )
185     {
186         for ( Artifact artifact : result )
187         {
188             if ( gid.equals( artifact.getGroupId() ) && aid.equals( artifact.getArtifactId() )
189                 && version.equals( artifact.getVersion() ) )
190             {
191                 return;
192             }
193         }
194         
195         fail( "Did not find required artifact: " + gid + ":" + aid + ":" + version + " in resolution result." );
196     }
197 
198     @Test
199     public void resolveSingleDependency_TwoProjects_CompileScope()
200         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
201     {
202         String gid = "org.codehaus.plexus";
203         String aid = "plexus-utils";
204         String version = "1.5.15";
205         
206         Model model1 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
207         MavenProject project1 = writeAndBuild( model1, "pom.1dep-2proj-compile-scope-A.xml" );
208         
209         Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
210         MavenProject project2 = writeAndBuild( model2, "pom.1dep-2proj-compile-scope-B.xml" );
211         
212         Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
213         projects.add( project1 );
214         projects.add( project2 );
215         
216         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
217         
218         Set<Artifact> result = resolver.resolve( projects, scopes, session );
219         
220         assertSingleArtifact( result, gid, aid, version );
221     }
222     
223     @Test
224     public void resolveSingleDependency_TwoVersions_TwoProjects_CompileScope_FirstWins()
225         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
226     {
227         String gid = "org.codehaus.plexus";
228         String aid = "plexus-utils";
229         String version = "1.5.15";
230         
231         Model model1 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version ).getModel();
232         MavenProject project1 = writeAndBuild( model1, "pom.1dep-2proj-compile-scope-A.xml" );
233         
234         String version2 = "1.5.14";
235         
236         Model model2 = new ModelCreator().withDefaultCoordinate().withDependency( gid, aid, version2 ).getModel();
237         MavenProject project2 = writeAndBuild( model2, "pom.1dep-2proj-compile-scope-B.xml" );
238         
239         Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
240         projects.add( project1 );
241         projects.add( project2 );
242         
243         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
244         
245         Set<Artifact> result = resolver.resolve( projects, scopes, session );
246         
247         assertSingleArtifact( result, gid, aid, version );
248     }
249     
250     @Test
251     public void ignoreUnbuiltInterdependency()
252         throws ArtifactResolutionException, ArtifactNotFoundException, IOException, ProjectBuildingException
253     {
254         String gid = "org.codehaus.plexus";
255         String aid = "plexus-utils";
256         String version = "1.5.15";
257         
258         Model model1 = new ModelCreator().withDefaultCoordinate().withArtifactId( "child1" ).withDependency( gid, aid, version )
259                                          .getModel();
260         MavenProject project1 = writeAndBuild( model1, "pom.interdep-child-1.xml" );
261         
262         Model model2 = new ModelCreator().withDefaultCoordinate().withArtifactId( "child2" ).withDependency( model1.getGroupId(),
263                                                                                                              model1.getArtifactId(),
264                                                                                                              model1.getVersion() )
265                                          .getModel();
266         
267         MavenProject project2 = writeAndBuild( model2, "pom.interdep-child-2.xml" );
268         
269         Set<MavenProject> projects = new LinkedHashSet<MavenProject>();
270         projects.add( project1 );
271         projects.add( project2 );
272         
273         Collection<String> scopes = Collections.singleton( Artifact.SCOPE_COMPILE );
274         
275         Set<Artifact> result = resolver.resolve( projects, scopes, session );
276         
277         assertSingleArtifact( result, gid, aid, version );
278     }
279     
280     private void assertSingleArtifact( Set<Artifact> result, String gid, String aid, String version )
281     {
282         assertNotNull( result );
283         assertEquals( 1, result.size() );
284         
285         Artifact a = result.iterator().next();
286         assertEquals( gid, a.getGroupId() );
287         assertEquals( aid, a.getArtifactId() );
288         assertEquals( version, a.getVersion() );
289         
290         assertTrue( a.isResolved() );
291         assertTrue( a.getFile().exists() );
292     }
293 
294     private MavenProject writeAndBuild( Model model, String filename )
295         throws IOException, ProjectBuildingException
296     {
297         File pomFile = new File( pomsDir, filename );
298         
299         FileWriter writer = null;
300         try
301         {
302             writer = new FileWriter( pomFile );
303             new MavenXpp3Writer().write( writer, model );
304         }
305         finally
306         {
307             IOUtil.close( writer );
308         }
309         
310         return projectBuilder.build( pomFile, pbConfig );
311     }
312 
313     @BeforeClass
314     public static void bootstrap()
315         throws PlexusContainerException, ComponentLookupException, IOException
316     {
317         container = new DefaultPlexusContainer();
318         container.initialize();
319         container.start();
320         
321         artifactResolver = (ArtifactResolver) container.lookup( ArtifactResolver.class.getName() );
322         metadataSource = (ArtifactMetadataSource) container.lookup( ArtifactMetadataSource.class.getName(), "maven" );
323         artifactFactory = (ArtifactFactory) container.lookup( ArtifactFactory.class.getName() );
324         projectBuilder = (MavenProjectBuilder) container.lookup( MavenProjectBuilder.class.getName() );
325         
326         resolver = (DefaultProjectDependenciesResolver) container.lookup( ProjectDependenciesResolver.class.getName(), "default" );
327         
328         localRepoDir = newTempDir( "local-repo" );
329         pomsDir = newTempDir( "poms" );
330         
331         ArtifactRepositoryLayout layout = (ArtifactRepositoryLayout) container.lookup( ArtifactRepositoryLayout.class.getName(), "default" );
332 
333         String localRepoUrl = "file://" + localRepoDir.getAbsoluteFile().toURI().getPath();
334         ArtifactRepository localRepo = new DefaultArtifactRepository( "local", localRepoUrl, layout );
335         
336         session = new MavenSession( container, new Settings(), localRepo, null, null, null, null, null, null );
337         
338         pbConfig = new DefaultProjectBuilderConfiguration().setLocalRepository( localRepo );
339     }
340     
341     private static File newTempDir( String basename )
342         throws IOException
343     {
344         File dir = File.createTempFile( basename + ".", ".dir" );
345         dir.delete();
346         dir.mkdirs();
347         
348         return dir;
349     }
350 
351     @AfterClass
352     public static void shutdown()
353     {
354         try
355         {
356             container.release( resolver );
357             container.release( artifactResolver );
358             container.release( metadataSource );
359             container.release( artifactFactory );
360             container.release( projectBuilder );
361             
362             container.dispose();
363         }
364         catch ( ComponentLifecycleException e )
365         {
366         }
367         
368         try
369         {
370             FileUtils.forceDelete( localRepoDir );
371             FileUtils.forceDelete( pomsDir );
372         }
373         catch ( IOException e )
374         {
375         }
376     }
377 
378 }