View Javadoc

1   package org.apache.maven.shared.runtime;
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 java.io.File;
23  import java.io.FilenameFilter;
24  import java.io.IOException;
25  import java.net.MalformedURLException;
26  import java.net.URL;
27  import java.net.URLClassLoader;
28  import java.util.Arrays;
29  import java.util.List;
30  import java.util.Properties;
31  
32  import org.apache.commons.io.filefilter.SuffixFileFilter;
33  import org.apache.maven.project.MavenProject;
34  import org.apache.maven.shared.invoker.InvocationRequest;
35  import org.apache.maven.shared.invoker.InvocationResult;
36  import org.apache.maven.shared.test.plugin.BuildTool;
37  import org.apache.maven.shared.test.plugin.TestToolsException;
38  import org.codehaus.plexus.PlexusTestCase;
39  import org.codehaus.plexus.util.StringUtils;
40  
41  /**
42   * Tests {@code DefaultMavenRuntime}.
43   * 
44   * @author <a href="mailto:markh@apache.org">Mark Hobson</a>
45   * @version $Id: DefaultMavenRuntimeTest.java 1341416 2012-05-22 11:38:54Z markh $
46   * @see DefaultMavenRuntime
47   */
48  public class DefaultMavenRuntimeTest extends PlexusTestCase
49  {
50      // fields -----------------------------------------------------------------
51  
52      private BuildTool buildTool;
53  
54      private MavenRuntime mavenRuntime;
55      
56      private static boolean initialized = false;
57  
58      // TestCase methods -------------------------------------------------------
59  
60      /**
61       * {@inheritDoc}
62       */
63      @Override
64      protected void setUp() throws Exception
65      {
66          super.setUp();
67  
68          buildTool = (BuildTool) lookup( BuildTool.ROLE );
69  
70          mavenRuntime = (MavenRuntime) lookup( MavenRuntime.ROLE );
71          
72          if ( !initialized )
73          {
74              packageProject( "testSingleJar/pom.xml" );
75              packageProject( "testSingleJar2/pom.xml" );
76              packageProject( "testMultipleJars/project1/pom.xml" );
77              packageProject( "testMultipleJars/project2/pom.xml" );
78              packageProject( "testMultipleJars/project3/pom.xml" );
79              packageProject( "testDependentJars/pom.xml" );
80              packageProject( "testDependentJars2/pom.xml" );
81  
82              initialized = true;
83          }
84      }
85  
86      // getProjectProperties tests ---------------------------------------------
87  
88      public void testGetProjectPropertiesWithFileUrl()
89          throws MavenRuntimeException, IOException
90      {
91          File jar = getPackage( "testSingleJar/pom.xml" );
92  
93          URL url = jar.toURI().toURL();
94  
95          MavenProjectProperties properties = mavenRuntime.getProjectProperties( url );
96  
97          assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
98      }
99  
100     public void testGetProjectPropertiesWithJarUrl()
101         throws MavenRuntimeException, IOException
102     {
103         File jar = getPackage( "testSingleJar/pom.xml" );
104         
105         URL url = new URL( "jar:" + jar.toURI().toURL() + "!/" );
106         
107         MavenProjectProperties properties = mavenRuntime.getProjectProperties( url );
108         
109         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
110     }
111     
112     public void testGetProjectPropertiesWithJarEntryUrl()
113         throws MavenRuntimeException, IOException
114     {
115         File jar = getPackage( "testSingleJar/pom.xml" );
116         
117         URL url = new URL( "jar:" + jar.toURI().toURL() + "!/a/PackagedClass.class" );
118         
119         MavenProjectProperties properties = mavenRuntime.getProjectProperties( url );
120         
121         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
122     }
123     
124     public void testGetProjectPropertiesWithDefaultPackageClass()
125         throws ClassNotFoundException, MavenRuntimeException, IOException
126     {
127         File jar = getPackage( "testSingleJar/pom.xml" );
128 
129         URLClassLoader classLoader = newClassLoader( jar );
130 
131         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
132 
133         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
134 
135         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
136     }
137 
138     public void testGetProjectPropertiesWithPackagedClass()
139         throws ClassNotFoundException, MavenRuntimeException, IOException
140     {
141         File jar = getPackage( "testSingleJar/pom.xml" );
142 
143         URLClassLoader classLoader = newClassLoader( jar );
144 
145         Class<?> klass = classLoader.loadClass( "a.PackagedClass" );
146 
147         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
148 
149         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
150     }
151 
152     public void testGetProjectPropertiesWithSubPackagedClass()
153         throws ClassNotFoundException, MavenRuntimeException, IOException
154     {
155         File jar = getPackage( "testSingleJar/pom.xml" );
156 
157         URLClassLoader classLoader = newClassLoader( jar );
158 
159         Class<?> klass = classLoader.loadClass( "a.b.SubPackagedClass" );
160 
161         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
162 
163         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
164     }
165 
166     public void testGetProjectPropertiesWithMultipleVersions()
167         throws ClassNotFoundException, MavenRuntimeException, IOException
168     {
169         File jar1 = getPackage( "testSingleJar/pom.xml" );
170         File jar2 = getPackage( "testSingleJar2/pom.xml" );
171 
172         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
173 
174         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
175 
176         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
177 
178         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
179     }
180 
181     public void testGetProjectPropertiesWithMultipleVersionsReversed()
182         throws ClassNotFoundException, MavenRuntimeException, IOException
183     {
184         File jar1 = getPackage( "testSingleJar/pom.xml" );
185         File jar2 = getPackage( "testSingleJar2/pom.xml" );
186 
187         URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
188 
189         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
190 
191         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
192 
193         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
194     }
195 
196     public void testGetProjectPropertiesWithParentDelegation()
197         throws ClassNotFoundException, MavenRuntimeException, IOException
198     {
199         File jar1 = getPackage( "testSingleJar/pom.xml" );
200         File jar2 = getPackage( "testSingleJar2/pom.xml" );
201 
202         URLClassLoader classLoader1 = newClassLoader( jar1 );
203         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
204 
205         Class<?> klass = classLoader2.loadClass( "DefaultPackageClass" );
206 
207         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
208 
209         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
210     }
211 
212     public void testGetProjectPropertiesWithChildDelegation()
213         throws ClassNotFoundException, MavenRuntimeException, IOException
214     {
215         File jar1 = getPackage( "testSingleJar/pom.xml" );
216         File jar2 = getPackage( "testSingleJar2/pom.xml" );
217 
218         URLClassLoader classLoader1 = newClassLoader( jar1 );
219         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
220 
221         Class<?> klass = classLoader2.loadClass( "DefaultPackageClass" );
222 
223         MavenProjectProperties properties = mavenRuntime.getProjectProperties( klass );
224 
225         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
226     }
227 
228     // getProjectsProperties tests --------------------------------------------
229 
230     public void testGetProjectsPropertiesWithSingleJar()
231         throws MavenRuntimeException, IOException
232     {
233         File jar = getPackage( "testSingleJar/pom.xml" );
234 
235         URLClassLoader classLoader = newClassLoader( jar );
236 
237         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader );
238 
239         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
240     }
241 
242     public void testGetProjectsPropertiesWithMultipleJars()
243         throws MavenRuntimeException, IOException
244     {
245         File jar1 = getPackage( "testMultipleJars/project1/pom.xml" );
246         File jar2 = getPackage( "testMultipleJars/project2/pom.xml" );
247         File jar3 = getPackage( "testMultipleJars/project3/pom.xml" );
248 
249         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2, jar3 } );
250 
251         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader );
252 
253         assertMavenProjectProperties( new String[] {
254             "org.apache.maven.shared.runtime.tests:testMultipleJars1:1.0",
255             "org.apache.maven.shared.runtime.tests:testMultipleJars2:1.0",
256             "org.apache.maven.shared.runtime.tests:testMultipleJars3:1.0"
257         }, properties );
258     }
259 
260     public void testGetProjectsPropertiesWithMultipleVersions()
261         throws MavenRuntimeException, IOException
262     {
263         File jar1 = getPackage( "testSingleJar/pom.xml" );
264         File jar2 = getPackage( "testSingleJar2/pom.xml" );
265 
266         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
267 
268         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader );
269 
270         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
271     }
272 
273     public void testGetProjectsPropertiesWithMultipleVersionsReversed()
274         throws MavenRuntimeException, IOException
275     {
276         File jar1 = getPackage( "testSingleJar/pom.xml" );
277         File jar2 = getPackage( "testSingleJar2/pom.xml" );
278 
279         URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
280 
281         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader );
282 
283         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
284     }
285 
286     public void testGetProjectsPropertiesWithParentDelegation()
287         throws MavenRuntimeException, IOException
288     {
289         File jar1 = getPackage( "testSingleJar/pom.xml" );
290         File jar2 = getPackage( "testSingleJar2/pom.xml" );
291 
292         URLClassLoader classLoader1 = newClassLoader( jar1 );
293         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
294 
295         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader2 );
296 
297         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", properties );
298     }
299 
300     public void testGetProjectsPropertiesWithChildDelegation()
301         throws MavenRuntimeException, IOException
302     {
303         File jar1 = getPackage( "testSingleJar/pom.xml" );
304         File jar2 = getPackage( "testSingleJar2/pom.xml" );
305 
306         URLClassLoader classLoader1 = newClassLoader( jar1 );
307         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
308 
309         List<MavenProjectProperties> properties = mavenRuntime.getProjectsProperties( classLoader2 );
310 
311         assertMavenProjectProperties( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", properties );
312     }
313 
314     // getProject tests -------------------------------------------------------
315 
316     public void testGetProjectWithFileUrl()
317         throws MavenRuntimeException, IOException
318     {
319         File jar = getPackage( "testSingleJar/pom.xml" );
320 
321         URL url = jar.toURI().toURL();
322 
323         MavenProject project = mavenRuntime.getProject( url );
324 
325         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
326     }
327 
328     public void testGetProjectWithJarUrl()
329         throws MavenRuntimeException, IOException
330     {
331         File jar = getPackage( "testSingleJar/pom.xml" );
332 
333         URL url = new URL( "jar:" + jar.toURI().toURL() + "!/" );
334 
335         MavenProject project = mavenRuntime.getProject( url );
336 
337         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
338     }
339     
340     public void testGetProjectWithJarEntryUrl()
341         throws MavenRuntimeException, IOException
342     {
343         File jar = getPackage( "testSingleJar/pom.xml" );
344 
345         URL url = new URL( "jar:" + jar.toURI().toURL() + "!/a/PackagedClass.class" );
346 
347         MavenProject project = mavenRuntime.getProject( url );
348 
349         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
350     }
351     
352     public void testGetProjectWithDefaultPackageClass()
353         throws ClassNotFoundException, MavenRuntimeException, IOException
354     {
355         File jar = getPackage( "testSingleJar/pom.xml" );
356 
357         URLClassLoader classLoader = newClassLoader( jar );
358 
359         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
360 
361         MavenProject project = mavenRuntime.getProject( klass );
362 
363         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
364     }
365 
366     public void testGetProjectWithPackagedClass()
367         throws ClassNotFoundException, MavenRuntimeException, IOException
368     {
369         File jar = getPackage( "testSingleJar/pom.xml" );
370 
371         URLClassLoader classLoader = newClassLoader( jar );
372 
373         Class<?> klass = classLoader.loadClass( "a.PackagedClass" );
374 
375         MavenProject project = mavenRuntime.getProject( klass );
376 
377         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
378     }
379 
380     public void testGetProjectWithSubPackagedClass()
381         throws ClassNotFoundException, MavenRuntimeException, IOException
382     {
383         File jar = getPackage( "testSingleJar/pom.xml" );
384 
385         URLClassLoader classLoader = newClassLoader( jar );
386 
387         Class<?> klass = classLoader.loadClass( "a.b.SubPackagedClass" );
388 
389         MavenProject project = mavenRuntime.getProject( klass );
390 
391         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
392     }
393 
394     public void testGetProjectWithMultipleVersions()
395         throws ClassNotFoundException, MavenRuntimeException, IOException
396     {
397         File jar1 = getPackage( "testSingleJar/pom.xml" );
398         File jar2 = getPackage( "testSingleJar2/pom.xml" );
399 
400         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
401 
402         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
403 
404         MavenProject project = mavenRuntime.getProject( klass );
405 
406         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
407     }
408 
409     public void testGetProjectWithMultipleVersionsReversed()
410         throws ClassNotFoundException, MavenRuntimeException, IOException
411     {
412         File jar1 = getPackage( "testSingleJar/pom.xml" );
413         File jar2 = getPackage( "testSingleJar2/pom.xml" );
414 
415         URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
416 
417         Class<?> klass = classLoader.loadClass( "DefaultPackageClass" );
418 
419         MavenProject project = mavenRuntime.getProject( klass );
420 
421         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", project );
422     }
423 
424     public void testGetProjectWithParentDelegation()
425         throws ClassNotFoundException, MavenRuntimeException, IOException
426     {
427         File jar1 = getPackage( "testSingleJar/pom.xml" );
428         File jar2 = getPackage( "testSingleJar2/pom.xml" );
429 
430         URLClassLoader classLoader1 = newClassLoader( jar1 );
431         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
432 
433         Class<?> klass = classLoader2.loadClass( "DefaultPackageClass" );
434 
435         MavenProject project = mavenRuntime.getProject( klass );
436 
437         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", project );
438     }
439 
440     public void testGetProjectWithChildDelegation()
441         throws ClassNotFoundException, MavenRuntimeException, IOException
442     {
443         File jar1 = getPackage( "testSingleJar/pom.xml" );
444         File jar2 = getPackage( "testSingleJar2/pom.xml" );
445 
446         URLClassLoader classLoader1 = newClassLoader( jar1 );
447         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
448 
449         Class<?> klass = classLoader2.loadClass( "DefaultPackageClass" );
450 
451         MavenProject project = mavenRuntime.getProject( klass );
452 
453         assertMavenProject( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", project );
454     }
455 
456     // getProjects tests ------------------------------------------------------
457 
458     public void testGetProjectsWithSingleJar()
459         throws MavenRuntimeException, IOException
460     {
461         File jar = getPackage( "testSingleJar/pom.xml" );
462 
463         URLClassLoader classLoader = newClassLoader( jar );
464 
465         List<MavenProject> projects = mavenRuntime.getProjects( classLoader );
466 
467         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
468     }
469 
470     public void testGetProjectsWithMultipleJars()
471         throws MavenRuntimeException, IOException
472     {
473         File jar1 = getPackage( "testMultipleJars/project1/pom.xml" );
474         File jar2 = getPackage( "testMultipleJars/project2/pom.xml" );
475         File jar3 = getPackage( "testMultipleJars/project3/pom.xml" );
476 
477         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2, jar3 } );
478 
479         List<MavenProject> projects = mavenRuntime.getProjects( classLoader );
480 
481         assertMavenProjects( new String[] {
482             "org.apache.maven.shared.runtime.tests:testMultipleJars1:1.0",
483             "org.apache.maven.shared.runtime.tests:testMultipleJars2:1.0",
484             "org.apache.maven.shared.runtime.tests:testMultipleJars3:1.0"
485         }, projects );
486     }
487 
488     public void testGetProjectsWithMultipleVersions()
489         throws MavenRuntimeException, IOException
490     {
491         File jar1 = getPackage( "testSingleJar/pom.xml" );
492         File jar2 = getPackage( "testSingleJar2/pom.xml" );
493 
494         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
495 
496         List<MavenProject> projects = mavenRuntime.getProjects( classLoader );
497 
498         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
499     }
500 
501     public void testGetProjectsWithMultipleVersionsReversed()
502         throws MavenRuntimeException, IOException
503     {
504         File jar1 = getPackage( "testSingleJar/pom.xml" );
505         File jar2 = getPackage( "testSingleJar2/pom.xml" );
506 
507         URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
508 
509         List<MavenProject> projects = mavenRuntime.getProjects( classLoader );
510 
511         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
512     }
513 
514     public void testGetProjectsWithParentDelegation()
515         throws MavenRuntimeException, IOException
516     {
517         File jar1 = getPackage( "testSingleJar/pom.xml" );
518         File jar2 = getPackage( "testSingleJar2/pom.xml" );
519 
520         URLClassLoader classLoader1 = newClassLoader( jar1 );
521         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
522 
523         List<MavenProject> projects = mavenRuntime.getProjects( classLoader2 );
524 
525         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
526     }
527 
528     public void testGetProjectsWithChildDelegation()
529         throws MavenRuntimeException, IOException
530     {
531         File jar1 = getPackage( "testSingleJar/pom.xml" );
532         File jar2 = getPackage( "testSingleJar2/pom.xml" );
533 
534         URLClassLoader classLoader1 = newClassLoader( jar1 );
535         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
536 
537         List<MavenProject> projects = mavenRuntime.getProjects( classLoader2 );
538 
539         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
540     }
541 
542     // getSortedProjects tests ------------------------------------------------
543 
544     public void testGetSortedProjectsWithSingleJar()
545         throws MavenRuntimeException, IOException
546     {
547         File jar = getPackage( "testSingleJar/pom.xml" );
548 
549         URLClassLoader classLoader = newClassLoader( jar );
550 
551         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
552 
553         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
554     }
555 
556     public void testGetSortedProjectsWithMultipleJars()
557         throws MavenRuntimeException, IOException
558     {
559         File jar1 = getPackage( "testMultipleJars/project1/pom.xml" );
560         File jar2 = getPackage( "testMultipleJars/project2/pom.xml" );
561         File jar3 = getPackage( "testMultipleJars/project3/pom.xml" );
562 
563         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2, jar3 } );
564 
565         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
566 
567         assertMavenProjects( new String[] {
568             "org.apache.maven.shared.runtime.tests:testMultipleJars1:1.0",
569             "org.apache.maven.shared.runtime.tests:testMultipleJars2:1.0",
570             "org.apache.maven.shared.runtime.tests:testMultipleJars3:1.0"
571         }, projects );
572     }
573 
574     public void testGetSortedProjectsWithDependentJars()
575         throws MavenRuntimeException, IOException
576     {
577         File jar1 = getPackage( "testDependentJars/project1/pom.xml" );
578         File jar2 = getPackage( "testDependentJars/project2/pom.xml" );
579         File jar3 = getPackage( "testDependentJars/project3/pom.xml" );
580 
581         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2, jar3 } );
582 
583         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
584 
585         assertMavenProjects( new String[] {
586             "org.apache.maven.shared.runtime.tests:testDependentJars3:1.0",
587             "org.apache.maven.shared.runtime.tests:testDependentJars1:1.0",
588             "org.apache.maven.shared.runtime.tests:testDependentJars2:1.0"
589         }, projects );
590     }
591 
592     // MSHARED-165
593     public void testGetSortedProjectsWithMediatedDependency()
594         throws MavenRuntimeException, IOException
595     {
596         File jar1 = getPackage( "testDependentJars2/project1/pom.xml" );
597         File jar2 = getPackage( "testDependentJars/project2/pom.xml" );
598         File jar3 = getPackage( "testDependentJars/project3/pom.xml" );
599 
600         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2, jar3 } );
601 
602         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
603 
604         assertMavenProjects( new String[] {
605             "org.apache.maven.shared.runtime.tests:testDependentJars3:1.0",
606             "org.apache.maven.shared.runtime.tests:testDependentJars1:2.0",
607             "org.apache.maven.shared.runtime.tests:testDependentJars2:1.0"
608         }, projects );
609     }
610 
611     public void testGetSortedProjectsWithMultipleVersions()
612         throws MavenRuntimeException, IOException
613     {
614         File jar1 = getPackage( "testSingleJar/pom.xml" );
615         File jar2 = getPackage( "testSingleJar2/pom.xml" );
616 
617         URLClassLoader classLoader = newClassLoader( new File[] { jar1, jar2 } );
618 
619         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
620 
621         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
622     }
623 
624     public void testGetSortedProjectsWithMultipleVersionsReversed()
625         throws MavenRuntimeException, IOException
626     {
627         File jar1 = getPackage( "testSingleJar/pom.xml" );
628         File jar2 = getPackage( "testSingleJar2/pom.xml" );
629 
630         URLClassLoader classLoader = newClassLoader( new File[] { jar2, jar1 } );
631 
632         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader );
633 
634         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
635     }
636 
637     public void testGetSortedProjectsWithParentDelegation()
638         throws MavenRuntimeException, IOException
639     {
640         File jar1 = getPackage( "testSingleJar/pom.xml" );
641         File jar2 = getPackage( "testSingleJar2/pom.xml" );
642 
643         URLClassLoader classLoader1 = newClassLoader( jar1 );
644         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1 );
645 
646         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader2 );
647 
648         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:1.0", projects );
649     }
650 
651     public void testGetSortedProjectsWithChildDelegation()
652         throws MavenRuntimeException, IOException
653     {
654         File jar1 = getPackage( "testSingleJar/pom.xml" );
655         File jar2 = getPackage( "testSingleJar2/pom.xml" );
656 
657         URLClassLoader classLoader1 = newClassLoader( jar1 );
658         URLClassLoader classLoader2 = newClassLoader( jar2, classLoader1, true );
659 
660         List<MavenProject> projects = mavenRuntime.getSortedProjects( classLoader2 );
661 
662         assertMavenProjects( "org.apache.maven.shared.runtime.tests:testSingleJar:2.0", projects );
663     }
664 
665     // private methods --------------------------------------------------------
666 
667     private void packageProject( String pomPath ) throws TestToolsException
668     {
669         System.out.println("Building test project " + pomPath);
670         
671         File pom = getTestFile( "target/test-classes/", pomPath );
672         Properties properties = new Properties();
673         List<String> goals = Arrays.asList( new String[] { "clean", "package" } );
674         File log = new File( pom.getParentFile(), "build.log" );
675 
676         InvocationRequest request = buildTool.createBasicInvocationRequest( pom, properties, goals, log );
677         request.setLocalRepositoryDirectory( findLocalRepo() );
678         InvocationResult result = buildTool.executeMaven( request );
679         assertNull( "Error building test project", result.getExecutionException() );
680         assertEquals( "Error building test project", 0, result.getExitCode() );
681     }
682 
683     private File findLocalRepo()
684     {
685         String basedir = System.getProperty( "maven.repo.local", "" );
686 
687         if ( StringUtils.isNotEmpty( basedir ) )
688         {
689             return new File( basedir );
690         }
691 
692         return null;
693     }
694 
695     private File getPackage( String pomPath )
696     {
697         File pom = getTestFile( "target/test-classes/", pomPath );
698 
699         File target = new File( pom.getParentFile(), "target" );
700         File[] jars = target.listFiles( (FilenameFilter) new SuffixFileFilter( "jar" ) );
701         assertEquals( "Cannot find jar", 1, jars.length );
702 
703         File jar = jars[0];
704         assertTrue( "Cannot find jar", jar.exists() && jar.isFile() );
705 
706         return jar;
707     }
708 
709     private URLClassLoader newClassLoader( File file ) throws MalformedURLException
710     {
711         return newClassLoader( file, null );
712     }
713 
714     private URLClassLoader newClassLoader( File file, ClassLoader parent ) throws MalformedURLException
715     {
716         return newClassLoader( file, parent, false );
717     }
718 
719     private URLClassLoader newClassLoader( File file, ClassLoader parent, boolean childDelegation )
720         throws MalformedURLException
721     {
722         return newClassLoader( new File[] { file }, parent, childDelegation );
723     }
724 
725     private URLClassLoader newClassLoader( File[] files ) throws MalformedURLException
726     {
727         return newClassLoader( files, null );
728     }
729 
730     private URLClassLoader newClassLoader( File[] files, ClassLoader parent ) throws MalformedURLException
731     {
732         return newClassLoader( files, parent, false );
733     }
734 
735     private URLClassLoader newClassLoader( File[] files, ClassLoader parent, boolean childDelegation )
736         throws MalformedURLException
737     {
738         URL[] urls = new URL[files.length];
739 
740         for ( int i = 0; i < files.length; i++ )
741         {
742             urls[i] = files[i].toURI().toURL();
743         }
744 
745         return new DelegatingClassLoader( urls, parent, childDelegation );
746     }
747 
748     private void assertMavenProjectProperties( String id, List<MavenProjectProperties> propertiesList )
749     {
750         assertMavenProjectProperties( new String[] { id }, propertiesList );
751     }
752 
753     private void assertMavenProjectProperties( String[] ids, List<MavenProjectProperties> propertiesList )
754     {
755         assertEquals( "Number of project properties", ids.length, propertiesList.size() );
756 
757         for ( int i = 0; i < ids.length; i++ )
758         {
759             assertMavenProjectProperties( ids[i], propertiesList.get( i ) );
760         }
761     }
762 
763     private void assertMavenProjectProperties( String id, MavenProjectProperties properties )
764     {
765         String[] tokens = id.split( ":" );
766 
767         assertMavenProjectProperties( tokens[0], tokens[1], tokens[2], properties );
768     }
769 
770     private void assertMavenProjectProperties( String groupId, String artifactId, String version,
771                                                MavenProjectProperties properties )
772     {
773         assertNotNull( "Project properties are null", properties );
774 
775         assertEquals( "Group id", groupId, properties.getGroupId() );
776         assertEquals( "Artifact id", artifactId, properties.getArtifactId() );
777         assertEquals( "Version", version, properties.getVersion() );
778     }
779 
780     private void assertMavenProjects( String id, List<MavenProject> projects )
781     {
782         assertMavenProjects( new String[] { id }, projects );
783     }
784 
785     private void assertMavenProjects( String[] ids, List<MavenProject> projects )
786     {
787         assertEquals( "Number of projects", ids.length, projects.size() );
788 
789         for ( int i = 0; i < ids.length; i++ )
790         {
791             assertMavenProject( ids[i], projects.get( i ) );
792         }
793     }
794 
795     private void assertMavenProject( String id, MavenProject project )
796     {
797         String[] tokens = id.split( ":" );
798 
799         assertMavenProject( tokens[0], tokens[1], tokens[2], project );
800     }
801 
802     private void assertMavenProject( String groupId, String artifactId, String version, MavenProject project )
803     {
804         assertNotNull( "Project is null", project );
805 
806         assertEquals( "Group id", groupId, project.getGroupId() );
807         assertEquals( "Artifact id", artifactId, project.getArtifactId() );
808         assertEquals( "Version", version, project.getVersion() );
809     }
810 }