View Javadoc

1   package org.apache.maven.continuum.project.builder.maven;
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 org.apache.maven.continuum.AbstractContinuumTest;
23  import org.apache.maven.continuum.builddefinition.BuildDefinitionService;
24  import org.apache.maven.continuum.execution.ContinuumBuildExecutorConstants;
25  import org.apache.maven.continuum.model.project.BuildDefinition;
26  import org.apache.maven.continuum.model.project.BuildDefinitionTemplate;
27  import org.apache.maven.continuum.model.project.Project;
28  import org.apache.maven.continuum.model.project.ProjectDependency;
29  import org.apache.maven.continuum.model.project.ProjectGroup;
30  import org.apache.maven.continuum.model.project.ProjectNotifier;
31  import org.apache.maven.continuum.project.builder.ContinuumProjectBuilder;
32  import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
33  import org.codehaus.plexus.util.StringUtils;
34  import org.slf4j.Logger;
35  import org.slf4j.LoggerFactory;
36  
37  import java.io.File;
38  import java.net.URL;
39  import java.util.HashMap;
40  import java.util.List;
41  import java.util.Map;
42  
43  /**
44   * @author <a href="mailto:trygvis@inamo.no">Trygve Laugst&oslash;l</a>
45   * @version $Id: MavenTwoContinuumProjectBuilderTest.java 1391353 2012-09-28 07:50:49Z brett $
46   */
47  public class MavenTwoContinuumProjectBuilderTest
48      extends AbstractContinuumTest
49  {
50      private static final Logger logger = LoggerFactory.getLogger( MavenTwoContinuumProjectBuilderTest.class );
51  
52      public void testGetEmailAddressWhenTypeIsSetToEmail()
53          throws Exception
54      {
55          ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
56                                                                                     MavenTwoContinuumProjectBuilder.ID );
57  
58          File pom = getTestFile( "src/test/repository/maven-builder-helper-1.xml" );
59  
60          ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null );
61  
62          assertNotNull( result.getErrors() );
63  
64          assertEquals( 0, result.getErrors().size() );
65  
66          assertNotNull( result.getProjects() );
67  
68          assertEquals( 1, result.getProjects().size() );
69  
70          Project project = result.getProjects().get( 0 );
71  
72          assertNotNull( project );
73  
74          assertNotNull( project.getNotifiers() );
75  
76          assertEquals( 1, project.getNotifiers().size() );
77  
78          ProjectNotifier notifier = (ProjectNotifier) project.getNotifiers().get( 0 );
79  
80          assertEquals( "mail", notifier.getType() );
81  
82          assertEquals( "foo@bar", notifier.getConfiguration().get( "address" ) );
83  
84          ProjectGroup pg = result.getProjectGroups().get( 0 );
85  
86          assertNotNull( pg );
87  
88          assertNotNull( pg.getNotifiers() );
89  
90          assertEquals( 0, pg.getNotifiers().size() );
91      }
92  
93      public void testGetEmailAddressWhenTypeIsntSet()
94          throws Exception
95      {
96          ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
97                                                                                     MavenTwoContinuumProjectBuilder.ID );
98  
99          File pom = getTestFile( "src/test/repository/maven-builder-helper-2.xml" );
100 
101         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null );
102 
103         assertNotNull( result.getErrors() );
104 
105         assertEquals( 0, result.getErrors().size() );
106 
107         assertNotNull( result.getProjects() );
108 
109         assertEquals( 1, result.getProjects().size() );
110 
111         Project project = result.getProjects().get( 0 );
112 
113         assertNotNull( project );
114 
115         assertNotNull( project.getNotifiers() );
116 
117         assertEquals( 1, project.getNotifiers().size() );
118 
119         ProjectNotifier notifier = (ProjectNotifier) project.getNotifiers().get( 0 );
120 
121         assertEquals( "mail", notifier.getType() );
122 
123         assertEquals( "foo@bar", notifier.getConfiguration().get( "address" ) );
124 
125         ProjectGroup pg = result.getProjectGroups().get( 0 );
126 
127         assertNotNull( pg );
128 
129         assertNotNull( pg.getNotifiers() );
130 
131         assertEquals( 0, pg.getNotifiers().size() );
132     }
133 
134     public void testGetScmUrlWithParams()
135         throws Exception
136     {
137         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
138                                                                                    MavenTwoContinuumProjectBuilder.ID );
139 
140         File pom = getTestFile( "src/test/repository/maven-builder-helper-3.xml" );
141 
142         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( pom.toURL(), null, null );
143 
144         assertNotNull( result.getErrors() );
145 
146         assertEquals( 0, result.getErrors().size() );
147 
148         assertNotNull( result.getProjects() );
149 
150         assertEquals( 1, result.getProjects().size() );
151 
152         ProjectGroup pg = result.getProjectGroups().get( 0 );
153 
154         assertNotNull( pg );
155 
156         String username = System.getProperty( "user.name" );
157 
158         String scmUrl = "scm:cvs:ext:${user.name}@company.org:/home/company/cvs:project/foo";
159 
160         Project project = result.getProjects().get( 0 );
161 
162         scmUrl = StringUtils.replace( scmUrl, "${user.name}", username );
163 
164         assertEquals( scmUrl, project.getScmUrl() );
165     }
166 
167     public void testCreateProjectsWithModules()
168         throws Exception
169     {
170         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
171                                                                                    MavenTwoContinuumProjectBuilder.ID );
172 
173         URL url = getClass().getClassLoader().getResource( "projects/continuum/pom.xml" );
174 
175         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( url, null, null );
176 
177         assertNotNull( result );
178 
179         // ----------------------------------------------------------------------
180         // Assert the warnings
181         // ----------------------------------------------------------------------
182 
183         assertNotNull( result.getErrors() );
184 
185         assertEquals( 1, result.getErrors().size() );
186 
187         assertEquals( ContinuumProjectBuildingResult.ERROR_POM_NOT_FOUND, result.getErrors().get( 0 ) );
188 
189         // ----------------------------------------------------------------------
190         // Assert the project group built
191         // ----------------------------------------------------------------------
192 
193         assertNotNull( result.getProjectGroups() );
194 
195         assertEquals( 1, result.getProjectGroups().size() );
196 
197         ProjectGroup projectGroup = result.getProjectGroups().iterator().next();
198 
199         assertEquals( "projectGroup.groupId", "org.apache.maven.continuum", projectGroup.getGroupId() );
200 
201         assertEquals( "projectGroup.name", "Continuum Parent Project", projectGroup.getName() );
202 
203         assertEquals( "projectGroup.description", "Continuum Project Description", projectGroup.getDescription() );
204 
205         // assertEquals( "projectGroup.url", "http://cvs.continuum.codehaus.org/", projectGroup.getUrl() );
206 
207         // ----------------------------------------------------------------------
208         // Assert the projects built
209         // ----------------------------------------------------------------------
210 
211         assertNotNull( result.getProjects() );
212 
213         assertEquals( 9, result.getProjects().size() );
214 
215         Map<String, Project> projects = new HashMap<String, Project>();
216 
217         for ( Project project : result.getProjects() )
218         {
219             assertNotNull( project.getName() );
220 
221             assertNotNull( project.getDescription() );
222 
223             projects.put( project.getName(), project );
224         }
225 
226         assertMavenTwoProject( "Continuum Core", projects );
227         assertMavenTwoProject( "Continuum Model", projects );
228         assertMavenTwoProject( "Continuum Plexus Application", projects );
229         assertScmUrl( "Continuum Web", projects,
230                       "scm:svn:http://svn.apache.org/repos/asf/maven/continuum/tags/continuum-1.0.3/continuum-web" );
231         //directoryName != artifactId for this project
232         assertScmUrl( "Continuum XMLRPC Interface", projects,
233                       "scm:svn:http://svn.apache.org/repos/asf/maven/continuum/tags/continuum-1.0.3/continuum-xmlrpc" );
234         assertMavenTwoProject( "Continuum Notifiers", projects );
235         assertMavenTwoProject( "Continuum IRC Notifier", projects );
236         assertMavenTwoProject( "Continuum Jabber Notifier", projects );
237 
238         assertEquals( "continuum-parent-notifiers", ( projects.get(
239             "Continuum IRC Notifier" ) ).getParent().getArtifactId() );
240 
241         assertEquals( "continuum-parent-notifiers", ( projects.get(
242             "Continuum Jabber Notifier" ) ).getParent().getArtifactId() );
243 
244         assertDependency( "Continuum Model", "Continuum Web", projects );
245     }
246 
247     public void testCreateProjectsWithModuleswithParentPomIsntPomXml()
248         throws Exception
249     {
250         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
251                                                                                    MavenTwoContinuumProjectBuilder.ID );
252 
253         URL url = getClass().getClassLoader().getResource( "projects/continuum/pom_ci.xml" );
254 
255         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( url, null, null );
256 
257         assertNotNull( result );
258 
259         // ----------------------------------------------------------------------
260         // Assert the warnings
261         // ----------------------------------------------------------------------
262 
263         assertNotNull( result.getErrors() );
264 
265         assertEquals( 1, result.getErrors().size() );
266 
267         assertEquals( ContinuumProjectBuildingResult.ERROR_POM_NOT_FOUND, result.getErrors().get( 0 ) );
268 
269         // ----------------------------------------------------------------------
270         // Assert the project group built
271         // ----------------------------------------------------------------------
272 
273         assertNotNull( result.getProjectGroups() );
274 
275         assertEquals( 1, result.getProjectGroups().size() );
276 
277         ProjectGroup projectGroup = result.getProjectGroups().iterator().next();
278 
279         assertEquals( "projectGroup.groupId", "org.apache.maven.continuum", projectGroup.getGroupId() );
280 
281         assertEquals( "projectGroup.name", "Continuum Parent Project", projectGroup.getName() );
282 
283         assertEquals( "projectGroup.description", "Continuum Project Description", projectGroup.getDescription() );
284 
285         // assertEquals( "projectGroup.url", "http://cvs.continuum.codehaus.org/", projectGroup.getUrl() );
286 
287         // ----------------------------------------------------------------------
288         // Assert the projects built
289         // ----------------------------------------------------------------------
290 
291         assertNotNull( result.getProjects() );
292 
293         assertEquals( 9, result.getProjects().size() );
294 
295         Map<String, Project> projects = new HashMap<String, Project>();
296 
297         for ( Project project : result.getProjects() )
298         {
299             assertNotNull( project.getName() );
300 
301             projects.put( project.getName(), project );
302         }
303 
304         assertMavenTwoProject( "Continuum Core", projects );
305         assertMavenTwoProject( "Continuum Model", projects );
306         assertMavenTwoProject( "Continuum Plexus Application", projects );
307         assertScmUrl( "Continuum Web", projects,
308                       "scm:svn:http://svn.apache.org/repos/asf/maven/continuum/tags/continuum-1.0.3/continuum-web" );
309         //directoryName != artifactId for this project
310         assertScmUrl( "Continuum XMLRPC Interface", projects,
311                       "scm:svn:http://svn.apache.org/repos/asf/maven/continuum/tags/continuum-1.0.3/continuum-xmlrpc" );
312         assertMavenTwoProject( "Continuum Notifiers", projects );
313         assertMavenTwoProject( "Continuum IRC Notifier", projects );
314         assertMavenTwoProject( "Continuum Jabber Notifier", projects );
315 
316         assertEquals( "continuum-parent-notifiers", ( projects.get(
317             "Continuum IRC Notifier" ) ).getParent().getArtifactId() );
318 
319         assertEquals( "continuum-parent-notifiers", ( projects.get(
320             "Continuum Jabber Notifier" ) ).getParent().getArtifactId() );
321 
322         assertDependency( "Continuum Model", "Continuum Web", projects );
323     }
324 
325     public void testCreateProjectWithoutModules()
326         throws Exception
327     {
328 
329         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
330                                                                                    MavenTwoContinuumProjectBuilder.ID );
331 
332         URL url = getClass().getClassLoader().getResource( "projects/continuum/continuum-core/pom.xml" );
333 
334         BuildDefinition bd = new BuildDefinition();
335 
336         bd.setDefaultForProject( true );
337 
338         bd.setGoals( "clean test-compile" );
339 
340         bd.setArguments( "-N" );
341 
342         bd.setBuildFile( "pom.xml" );
343 
344         bd.setType( ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
345 
346         BuildDefinitionService service = (BuildDefinitionService) lookup( BuildDefinitionService.class );
347 
348         bd = service.addBuildDefinition( bd );
349         BuildDefinitionTemplate bdt = new BuildDefinitionTemplate();
350         bdt.setName( "maven2" );
351         bdt = service.addBuildDefinitionTemplate( bdt );
352         bdt = service.addBuildDefinitionInTemplate( bdt, bd, false );
353         assertEquals( 5, service.getAllBuildDefinitionTemplate().size() );
354         logger.debug( "templates number " + service.getAllBuildDefinitionTemplate().size() );
355 
356         logger.debug( "projectGroups number " + getProjectGroupDao().getAllProjectGroups().size() );
357 
358         int all = service.getAllBuildDefinitions().size();
359 
360         ContinuumProjectBuildingResult result;
361 
362         result = projectBuilder.buildProjectsFromMetadata( url, null, null, false, bdt, false );
363         assertFalse( result.hasErrors() );
364 
365         assertEquals( 5, service.getAllBuildDefinitionTemplate().size() );
366 
367         assertEquals( all + 1, service.getAllBuildDefinitions().size() );
368 
369         assertNotNull( result );
370 
371         assertNotNull( result.getErrors() );
372 
373         assertEquals( 0, result.getErrors().size() );
374 
375         assertNotNull( result.getProjectGroups() );
376 
377         assertEquals( 1, result.getProjectGroups().size() );
378 
379         ProjectGroup projectGroup = result.getProjectGroups().get( 0 );
380 
381         assertEquals( "projectGroup.groupId", "org.apache.maven.continuum", projectGroup.getGroupId() );
382 
383         assertEquals( "projectGroup.name", "Continuum Core", projectGroup.getName() );
384 
385         assertNotNull( result.getProjects() );
386 
387         assertEquals( 1, result.getProjects().size() );
388 
389         assertNotNull( projectGroup.getProjects() );
390 
391         assertEquals( 0, projectGroup.getProjects().size() );
392     }
393 
394     public void testCreateProjectWithFlatStructure()
395         throws Exception
396     {
397         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
398                                                                                    MavenTwoContinuumProjectBuilder.ID );
399 
400         URL url = getTestFile( "/src/test-projects/flat-multi-module/parent-project/pom.xml" ).toURL();
401 
402         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( url, null, null, true, true );
403 
404         Project rootProject = result.getRootProject();
405         assertEquals( "Incorrect root project", "parent-project", rootProject.getArtifactId() );
406 
407         List<Project> projects = result.getProjects();
408         for ( Project project : projects )
409         {
410             if ( project.getName().equals( "parent-project" ) )
411             {
412                 assertEquals( "Incorrect scm url for parent-project",
413                               "scm:local:src/test-projects:flat-multi-module/parent-project", project.getScmUrl() );
414             }
415             else if ( project.getName().equals( "module-a" ) )
416             {
417                 assertEquals( "Incorrect scm url for parent-project",
418                               "scm:local:src/test-projects:flat-multi-module/module-a", project.getScmUrl() );
419             }
420             else if ( project.getName().equals( "module-b" ) )
421             {
422                 assertEquals( "Incorrect scm url for parent-project",
423                               "scm:local:src/test-projects:flat-multi-module/module-b", project.getScmUrl() );
424             }
425             else if ( project.getName().equals( "module-d" ) )
426             {
427                 assertEquals( "Incorrect scm url for module-d",
428                               "scm:local:src/test-projects:flat-multi-module/module-c/module-d", project.getScmUrl() );
429             }
430             else
431             {
432                 fail( "Unknown project: " + project.getName() );
433             }
434         }
435     }
436 
437     // CONTINUUM-2563
438     public void testCreateMultiModuleProjectLoadRecursiveProjectsIsFalse()
439         throws Exception
440     {
441         ContinuumProjectBuilder projectBuilder = (ContinuumProjectBuilder) lookup( ContinuumProjectBuilder.ROLE,
442                                                                                    MavenTwoContinuumProjectBuilder.ID );
443 
444         URL url = getClass().getClassLoader().getResource( "projects/continuum/pom.xml" );
445 
446         ContinuumProjectBuildingResult result = projectBuilder.buildProjectsFromMetadata( url, null, null, false,
447                                                                                           false );
448 
449         assertNotNull( result );
450 
451         // ----------------------------------------------------------------------
452         // Assert the project group built
453         // ----------------------------------------------------------------------
454 
455         assertNotNull( result.getProjectGroups() );
456 
457         assertEquals( 1, result.getProjectGroups().size() );
458 
459         ProjectGroup projectGroup = result.getProjectGroups().iterator().next();
460 
461         assertEquals( "projectGroup.groupId", "org.apache.maven.continuum", projectGroup.getGroupId() );
462 
463         assertEquals( "projectGroup.name", "Continuum Parent Project", projectGroup.getName() );
464 
465         assertEquals( "projectGroup.description", "Continuum Project Description", projectGroup.getDescription() );
466 
467         // ----------------------------------------------------------------------
468         // Assert the projects built
469         // ----------------------------------------------------------------------
470 
471         assertNotNull( result.getProjects() );
472 
473         assertEquals( 1, result.getProjects().size() );
474 
475         Map<String, Project> projects = new HashMap<String, Project>();
476 
477         Project project = result.getProjects().iterator().next();
478         assertNotNull( project.getName() );
479         assertNotNull( project.getDescription() );
480         projects.put( project.getName(), project );
481 
482         assertMavenTwoProject( "Continuum Parent Project", projects );
483 
484         // assert the default project build definition
485         List<BuildDefinition> buildDefs = project.getBuildDefinitions();
486         assertEquals( 0, buildDefs.size() );
487 
488         // assert the default project build definition
489         buildDefs = projectGroup.getBuildDefinitions();
490         assertEquals( 1, buildDefs.size() );
491         for ( BuildDefinition buildDef : buildDefs )
492         {
493             if ( buildDef.isDefaultForProject() )
494             {
495                 assertEquals( "--batch-mode", buildDef.getArguments() );
496                 assertEquals( "clean install", buildDef.getGoals() );
497                 assertEquals( "pom.xml", buildDef.getBuildFile() );
498             }
499         }
500     }
501 
502     private void assertDependency( String dep, String proj, Map<String, Project> projects )
503     {
504         Project p = projects.get( proj );
505 
506         Project dependency = projects.get( dep );
507 
508         assertNotNull( p );
509 
510         assertNotNull( dependency );
511 
512         assertNotNull( p.getDependencies() );
513 
514         for ( ProjectDependency pd : (List<ProjectDependency>) p.getDependencies() )
515         {
516             if ( pd.getArtifactId().equals( dependency.getArtifactId() ) &&
517                 pd.getGroupId().equals( dependency.getGroupId() ) && pd.getVersion().equals( dependency.getVersion() ) )
518             {
519                 return;
520             }
521         }
522 
523         assertFalse( true );
524     }
525 
526     // ----------------------------------------------------------------------
527     //
528     // ----------------------------------------------------------------------
529 
530     private Project getProject( String name, Map<String, Project> projects )
531     {
532         return projects.get( name );
533     }
534 
535     private void assertMavenTwoProject( String name, Map<String, Project> projects )
536     {
537         Project project = getProject( name, projects );
538 
539         assertNotNull( project );
540 
541         assertEquals( name, project.getName() );
542 
543         String scmUrl = "scm:svn:http://svn.apache.org/repos/asf/maven/continuum/";
544 
545         assertTrue( project.getScmUrl().startsWith( scmUrl ) );
546     }
547 
548     private void assertScmUrl( String name, Map<String, Project> projects, String scmUrl )
549     {
550         assertMavenTwoProject( name, projects );
551 
552         Project project = getProject( name, projects );
553 
554         assertEquals( scmUrl, project.getScmUrl() );
555     }
556 }