View Javadoc

1   package org.apache.continuum.xmlrpc.server;
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.continuum.builder.distributed.manager.DistributedBuildManager;
23  import org.apache.continuum.configuration.BuildAgentGroupConfiguration;
24  import org.apache.continuum.model.project.ProjectScmRoot;
25  import org.apache.continuum.release.distributed.manager.DistributedReleaseManager;
26  import org.apache.continuum.xmlrpc.utils.BuildTrigger;
27  import org.apache.maven.continuum.Continuum;
28  import org.apache.maven.continuum.ContinuumException;
29  import org.apache.maven.continuum.configuration.ConfigurationService;
30  import org.apache.maven.continuum.model.project.Project;
31  import org.apache.maven.continuum.model.project.ProjectGroup;
32  import org.apache.maven.continuum.release.ContinuumReleaseManager;
33  import org.apache.maven.continuum.xmlrpc.project.BuildAgentConfiguration;
34  import org.apache.maven.continuum.xmlrpc.project.BuildDefinition;
35  import org.apache.maven.continuum.xmlrpc.project.ContinuumProjectState;
36  import org.apache.maven.continuum.xmlrpc.project.ProjectGroupSummary;
37  import org.apache.maven.continuum.xmlrpc.project.ReleaseListenerSummary;
38  import org.apache.maven.continuum.xmlrpc.server.ContinuumServiceImpl;
39  import org.apache.maven.continuum.xmlrpc.system.Installation;
40  import org.codehaus.plexus.redback.role.RoleManager;
41  import org.codehaus.plexus.spring.PlexusInSpringTestCase;
42  import org.jmock.Expectations;
43  import org.jmock.Mockery;
44  import org.jmock.integration.junit3.JUnit3Mockery;
45  import org.jmock.lib.legacy.ClassImposteriser;
46  
47  import java.util.ArrayList;
48  import java.util.Arrays;
49  import java.util.HashMap;
50  import java.util.List;
51  import java.util.Map;
52  
53  public class ContinuumServiceImplTest
54      extends PlexusInSpringTestCase
55  {
56      private ContinuumServiceImpl continuumService;
57  
58      private Mockery context;
59  
60      private Continuum continuum;
61  
62      private DistributedReleaseManager distributedReleaseManager;
63  
64      private ContinuumReleaseManager releaseManager;
65  
66      private DistributedBuildManager distributedBuildManager;
67  
68      private ConfigurationService configurationService;
69  
70      private Project project;
71  
72      private Map<String, Object> params;
73  
74      private RoleManager roleManager;
75  
76      @Override
77      public void setUp()
78          throws Exception
79      {
80          super.setUp();
81  
82          context = new JUnit3Mockery();
83          context.setImposteriser( ClassImposteriser.INSTANCE );
84  
85          distributedReleaseManager = context.mock( DistributedReleaseManager.class );
86          releaseManager = context.mock( ContinuumReleaseManager.class );
87          configurationService = context.mock( ConfigurationService.class );
88          distributedBuildManager = context.mock( DistributedBuildManager.class );
89          roleManager = context.mock( RoleManager.class );
90  
91          continuumService = new ContinuumServiceImplStub();
92          continuum = context.mock( Continuum.class );
93          continuumService.setContinuum( continuum );
94          continuumService.setDistributedBuildManager( distributedBuildManager );
95          continuumService.setRoleManager( roleManager );
96  
97          ProjectGroup projectGroup = new ProjectGroup();
98          projectGroup.setName( "test-group" );
99  
100         project = new Project();
101         project.setId( 1 );
102         project.setProjectGroup( projectGroup );
103         project.setVersion( "1.0-SNAPSHOT" );
104         project.setArtifactId( "continuum-test" );
105         project.setScmUrl( "scm:svn:http://svn.test.org/repository/project" );
106     }
107 
108     public void testGetReleasePluginParameters()
109         throws Exception
110     {
111         params = new HashMap<String, Object>();
112         params.put( "scm-tag", "" );
113         params.put( "scm-tagbase", "" );
114 
115         context.checking( new Expectations()
116         {
117             {
118                 one( continuum ).getProject( 1 );
119                 will( returnValue( project ) );
120 
121                 one( continuum ).getConfiguration();
122                 will( returnValue( configurationService ) );
123 
124                 one( configurationService ).isDistributedBuildEnabled();
125                 will( returnValue( true ) );
126 
127                 one( continuum ).getDistributedReleaseManager();
128                 will( returnValue( distributedReleaseManager ) );
129 
130                 one( distributedReleaseManager ).getReleasePluginParameters( 1, "pom.xml" );
131                 will( returnValue( params ) );
132 
133                 one( continuum ).getReleaseManager();
134                 will( returnValue( releaseManager ) );
135 
136                 one( releaseManager ).sanitizeTagName( "scm:svn:http://svn.test.org/repository/project",
137                                                        "continuum-test-1.0" );
138             }
139         } );
140 
141         Map<String, Object> releaseParams = continuumService.getReleasePluginParameters( 1 );
142         assertEquals( "continuum-test-1.0", releaseParams.get( "scm-tag" ) );
143         assertEquals( "http://svn.test.org/repository/project/tags", releaseParams.get( "scm-tagbase" ) );
144 
145         context.assertIsSatisfied();
146     }
147 
148     public void testGetListenerWithDistributedBuilds()
149         throws Exception
150     {
151         final Map map = getListenerMap();
152 
153         context.checking( new Expectations()
154         {
155             {
156                 one( continuum ).getProject( 1 );
157                 will( returnValue( project ) );
158 
159                 one( continuum ).getConfiguration();
160                 will( returnValue( configurationService ) );
161 
162                 one( configurationService ).isDistributedBuildEnabled();
163                 will( returnValue( true ) );
164 
165                 one( continuum ).getDistributedReleaseManager();
166                 will( returnValue( distributedReleaseManager ) );
167 
168                 one( distributedReleaseManager ).getListener( "releaseId-1" );
169                 will( returnValue( map ) );
170             }
171         } );
172 
173         ReleaseListenerSummary summary = continuumService.getListener( 1, "releaseId-1" );
174         assertNotNull( summary );
175         assertEquals( "incomplete-phase", summary.getPhases().get( 0 ) );
176         assertEquals( "completed-phase", summary.getCompletedPhases().get( 0 ) );
177     }
178 
179     public void testPopulateBuildDefinition()
180         throws Exception
181     {
182         ContinuumServiceImplStub continuumServiceStub = new ContinuumServiceImplStub();
183 
184         BuildDefinition buildDef = createBuildDefinition();
185         org.apache.maven.continuum.model.project.BuildDefinition buildDefinition =
186             new org.apache.maven.continuum.model.project.BuildDefinition();
187 
188         buildDefinition = continuumServiceStub.getBuildDefinition( buildDef, buildDefinition );
189 
190         assertEquals( buildDef.getArguments(), buildDefinition.getArguments() );
191         assertEquals( buildDef.getBuildFile(), buildDefinition.getBuildFile() );
192         assertEquals( buildDef.getDescription(), buildDefinition.getDescription() );
193         assertEquals( buildDef.getGoals(), buildDefinition.getGoals() );
194         assertEquals( buildDef.getType(), buildDefinition.getType() );
195         assertEquals( buildDef.isAlwaysBuild(), buildDefinition.isAlwaysBuild() );
196         assertEquals( buildDef.isBuildFresh(), buildDefinition.isBuildFresh() );
197         assertEquals( buildDef.isDefaultForProject(), buildDefinition.isDefaultForProject() );
198     }
199 
200     public void testBuildProjectWithBuildTrigger()
201         throws Exception
202     {
203         final ProjectGroup projectGroup = new ProjectGroup();
204         projectGroup.setName( "test-group" );
205 
206         BuildTrigger buildTrigger = new BuildTrigger();
207         buildTrigger.setTrigger( ContinuumProjectState.TRIGGER_FORCED );
208         buildTrigger.setTriggeredBy( "username" );
209 
210         BuildDefinition buildDef = createBuildDefinition();
211         buildDef.setId( 1 );
212 
213         context.checking( new Expectations()
214         {
215             {
216                 atLeast( 1 ).of( continuum ).getProject( project.getId() );
217                 will( returnValue( project ) );
218 
219                 atLeast( 1 ).of( continuum ).getProjectGroupByProjectId( project.getId() );
220                 will( returnValue( projectGroup ) );
221             }
222         } );
223 
224         int result = continuumService.buildProject( project.getId(), buildDef.getId(), buildTrigger );
225         assertEquals( 0, result );
226 
227     }
228 
229     public void testGetProjectScmRootByProjectGroup()
230         throws Exception
231     {
232         final ProjectGroup projectGroup = new ProjectGroup();
233         projectGroup.setName( "test-group" );
234         projectGroup.setId( 1 );
235 
236         final List<ProjectScmRoot> scmRoots = new ArrayList<ProjectScmRoot>();
237 
238         ProjectScmRoot scmRoot = new ProjectScmRoot();
239         scmRoot.setState( 1 );
240         scmRoot.setOldState( 3 );
241         scmRoot.setScmRootAddress( "address1" );
242         scmRoot.setProjectGroup( projectGroup );
243         scmRoots.add( scmRoot );
244 
245         scmRoot = new ProjectScmRoot();
246         scmRoot.setState( 2 );
247         scmRoot.setOldState( 4 );
248         scmRoot.setScmRootAddress( "address2" );
249         scmRoot.setProjectGroup( projectGroup );
250         scmRoots.add( scmRoot );
251 
252         context.checking( new Expectations()
253         {
254             {
255                 atLeast( 1 ).of( continuum ).getProjectScmRootByProjectGroup( projectGroup.getId() );
256                 will( returnValue( scmRoots ) );
257 
258                 atLeast( 1 ).of( continuum ).getProjectGroup( projectGroup.getId() );
259                 will( returnValue( projectGroup ) );
260             }
261         } );
262 
263         List<org.apache.maven.continuum.xmlrpc.project.ProjectScmRoot> projectScmRoots =
264             continuumService.getProjectScmRootByProjectGroup( projectGroup.getId() );
265         assertEquals( 2, projectScmRoots.size() );
266         assertEquals( 1, projectScmRoots.get( 0 ).getState() );
267         assertEquals( 2, projectScmRoots.get( 1 ).getState() );
268     }
269 
270     public void testGetProjectScmRootByProject()
271         throws Exception
272     {
273         final ProjectGroup projectGroup = new ProjectGroupStub();
274         projectGroup.setName( "test-group" );
275         projectGroup.setId( 1 );
276 
277         final int projectId = 1;
278 
279         final ProjectScmRoot scmRoot = new ProjectScmRoot();
280         scmRoot.setState( 1 );
281         scmRoot.setOldState( 3 );
282         scmRoot.setScmRootAddress( "address1" );
283         scmRoot.setProjectGroup( projectGroup );
284 
285         context.checking( new Expectations()
286         {
287             {
288                 atLeast( 1 ).of( continuum ).getProjectScmRootByProject( projectId );
289                 will( returnValue( scmRoot ) );
290             }
291         } );
292 
293         org.apache.maven.continuum.xmlrpc.project.ProjectScmRoot projectScmRoot =
294             continuumService.getProjectScmRootByProject( projectId );
295         assertNotNull( projectScmRoot );
296         assertEquals( 1, projectScmRoot.getState() );
297         assertEquals( 3, projectScmRoot.getOldState() );
298         assertEquals( "address1", projectScmRoot.getScmRootAddress() );
299     }
300 
301     public void testGetBuildAgentUrl()
302         throws Exception
303     {
304         context.checking( new Expectations()
305         {
306             {
307                 one( continuum ).getConfiguration();
308                 will( returnValue( configurationService ) );
309 
310                 one( configurationService ).isDistributedBuildEnabled();
311                 will( returnValue( true ) );
312 
313                 one( distributedBuildManager ).getBuildAgentUrl( 1, 1 );
314                 will( returnValue( "http://localhost:8181/continuum-buildagent/xmlrpc" ) );
315             }
316         } );
317         String buildAgentUrl = continuumService.getBuildAgentUrl( 1, 1 );
318         assertEquals( "http://localhost:8181/continuum-buildagent/xmlrpc", buildAgentUrl );
319 
320         context.assertIsSatisfied();
321     }
322 
323     public void testGetBuildAgentUrlNotSupported()
324         throws Exception
325     {
326         context.checking( new Expectations()
327         {
328             {
329                 one( continuum ).getConfiguration();
330                 will( returnValue( configurationService ) );
331 
332                 one( configurationService ).isDistributedBuildEnabled();
333                 will( returnValue( false ) );
334             }
335         } );
336 
337         try
338         {
339             continuumService.getBuildAgentUrl( 1, 1 );
340             fail( "ContinuumException is expected to occur here." );
341         }
342         catch ( ContinuumException e )
343         {
344             //pass
345         }
346         context.assertIsSatisfied();
347     }
348 
349     public void testGetNonExistingBuildAgentGroup()
350         throws Exception
351     {
352         context.checking( new Expectations()
353         {
354             {
355                 one( continuum ).getConfiguration();
356                 will( returnValue( configurationService ) );
357 
358                 one( configurationService ).getBuildAgentGroup( "Agent Group Name" );
359                 will( returnValue( null ) );
360             }
361         } );
362         int result = continuumService.removeBuildAgentGroup( "Agent Group Name" );
363         assertEquals( 0, result );
364 
365         context.assertIsSatisfied();
366     }
367 
368     public void testRemoveNonExistingBuildAgentGroup()
369         throws Exception
370     {
371         context.checking( new Expectations()
372         {
373             {
374                 one( continuum ).getConfiguration();
375                 will( returnValue( configurationService ) );
376 
377                 one( configurationService ).getBuildAgentGroup( "Agent Group Name" );
378                 will( returnValue( null ) );
379 
380                 never( configurationService ).removeBuildAgentGroup( with( any(
381                     BuildAgentGroupConfiguration.class ) ) );
382             }
383         } );
384 
385         continuumService.removeBuildAgentGroup( "Agent Group Name" );
386         context.assertIsSatisfied();
387     }
388 
389     public void testGetBuildAgentsWithInstallations()
390         throws Exception
391     {
392         final List<org.apache.continuum.configuration.BuildAgentConfiguration> buildAgents =
393             new ArrayList<org.apache.continuum.configuration.BuildAgentConfiguration>();
394 
395         org.apache.continuum.configuration.BuildAgentConfiguration buildAgent =
396             new org.apache.continuum.configuration.BuildAgentConfiguration();
397         buildAgent.setUrl( "http://localhost:8080/xmlrpc" );
398         buildAgent.setEnabled( true );
399         buildAgents.add( buildAgent );
400 
401         org.apache.continuum.configuration.BuildAgentConfiguration buildAgent2 =
402             new org.apache.continuum.configuration.BuildAgentConfiguration();
403         buildAgent2.setUrl( "http://localhost:8181/xmlrpc" );
404         buildAgent2.setEnabled( false );
405         buildAgents.add( buildAgent2 );
406 
407         final List<org.apache.maven.continuum.model.system.Installation> buildAgentInstallations =
408             new ArrayList<org.apache.maven.continuum.model.system.Installation>();
409 
410         org.apache.maven.continuum.model.system.Installation buildAgentInstallation =
411             new org.apache.maven.continuum.model.system.Installation();
412         buildAgentInstallation.setInstallationId( 1 );
413         buildAgentInstallation.setName( "JDK 6" );
414         buildAgentInstallation.setType( "jdk" );
415         buildAgentInstallation.setVarName( "JAVA_HOME" );
416         buildAgentInstallation.setVarValue( "/opt/java" );
417         buildAgentInstallations.add( buildAgentInstallation );
418 
419         context.checking( new Expectations()
420         {
421             {
422                 one( continuum ).getConfiguration();
423                 will( returnValue( configurationService ) );
424 
425                 one( configurationService ).getBuildAgents();
426                 will( returnValue( buildAgents ) );
427 
428                 one( distributedBuildManager ).getBuildAgentPlatform( "http://localhost:8080/xmlrpc" );
429                 will( returnValue( "Linux" ) );
430 
431                 one( distributedBuildManager ).getAvailableInstallations( "http://localhost:8080/xmlrpc" );
432                 will( returnValue( buildAgentInstallations ) );
433             }
434         } );
435         List<BuildAgentConfiguration> agents = continuumService.getBuildAgentsWithInstallations();
436         assertEquals( 1, agents.size() );
437         BuildAgentConfiguration agent = agents.get( 0 );
438         assertEquals( "http://localhost:8080/xmlrpc", agent.getUrl() );
439         assertEquals( "Linux", agent.getPlatform() );
440         assertEquals( 1, agent.getInstallations().size() );
441 
442         context.assertIsSatisfied();
443     }
444 
445     public void testAddProjectGroupWithPunctuation()
446         throws Exception
447     {
448         final String name = "Test :: Group Name (with punctuation)";
449         final String groupId = "com.example.long-group-id";
450         final String description = "Description";
451 
452         context.checking( new Expectations()
453         {
454             {
455                 ProjectGroup group = createProjectGroup( name, groupId, description );
456                 one( continuum ).addProjectGroup( group );
457 
458                 group = createProjectGroup( name, groupId, description );
459                 one( continuum ).getProjectGroupByGroupId( groupId );
460                 will( returnValue( group ) );
461             }
462         } );
463 
464         ProjectGroupSummary group = continuumService.addProjectGroup( name, groupId, description );
465         assertEquals( name, group.getName() );
466         assertEquals( groupId, group.getGroupId() );
467         assertEquals( description, group.getDescription() );
468 
469         context.assertIsSatisfied();
470     }
471 
472     public void testEditProjectGroupWithPunctuation()
473         throws Exception
474     {
475         final String newName = "Test :: Group Name (with punctuation)";
476         final String newGroupId = "com.example.long-group-id";
477         final String newDescription = "Description";
478         final int projectGroupId = 1;
479 
480         context.checking( new Expectations()
481         {
482             {
483                 ProjectGroup group = createProjectGroup( "name", "groupId", "description" );
484 
485                 one( continuum ).addProjectGroup( group );
486 
487                 group = createProjectGroup( projectGroupId );
488                 one( continuum ).getProjectGroupByGroupId( "groupId" );
489                 will( returnValue( group ) );
490 
491                 one( continuum ).getProjectGroupWithProjects( projectGroupId );
492                 will( returnValue( group ) );
493 
494                 for ( String role : Arrays.asList( "project-administrator", "project-developer", "project-user" ) )
495                 {
496                     one( roleManager ).updateRole( role, "name", newName );
497                 }
498 
499                 ProjectGroup newProjectGroup = createProjectGroup( projectGroupId, newName, newGroupId,
500                                                                    newDescription );
501                 one( continuum ).updateProjectGroup( newProjectGroup );
502 
503                 exactly( 3 ).of( continuum ).getProjectGroup( projectGroupId );
504                 onConsecutiveCalls( returnValue( group ), returnValue( group ), returnValue( newProjectGroup ) );
505             }
506         } );
507 
508         ProjectGroupSummary group = continuumService.addProjectGroup( "name", "groupId", "description" );
509         group.setName( newName );
510         group.setGroupId( newGroupId );
511         group.setDescription( newDescription );
512 
513         continuumService.updateProjectGroup( group );
514 
515         context.assertIsSatisfied();
516     }
517 
518     public void testInstallationEnvironmentVariableWithOtherOptions()
519         throws ContinuumException
520     {
521         context.checking( new Expectations()
522         {
523             {
524                 one( continuum ).getInstallationService();
525             }
526         } );
527 
528         Installation installation = new Installation();
529         installation.setName( "name" );
530         installation.setType( "envvar" );
531         installation.setVarName( "JAVA_OPTS" );
532         installation.setVarValue( "-XX:+CompressedOops" );
533 
534         continuumService.addInstallation( installation );
535 
536         context.assertIsSatisfied();
537     }
538 
539     private static ProjectGroup createProjectGroup( String name, String groupId, String description )
540     {
541         ProjectGroup group = new ProjectGroup();
542         group.setName( name );
543         group.setGroupId( groupId );
544         group.setDescription( description );
545         return group;
546     }
547 
548     private static ProjectGroup createProjectGroup( int projectGroupId, String name, String groupId,
549                                                     String description )
550     {
551         ProjectGroup group = createProjectGroup( name, groupId, description );
552         group.setId( projectGroupId );
553         return group;
554     }
555 
556     private static ProjectGroup createProjectGroup( int projectGroupId )
557     {
558         return createProjectGroup( projectGroupId, "name", "groupId", "description" );
559     }
560 
561     private BuildDefinition createBuildDefinition()
562     {
563         BuildDefinition buildDef = new BuildDefinition();
564         buildDef.setArguments( "--batch-mode" );
565         buildDef.setBuildFile( "pom.xml" );
566         buildDef.setType( "maven2" );
567         buildDef.setBuildFresh( false );
568         buildDef.setAlwaysBuild( true );
569         buildDef.setDefaultForProject( true );
570         buildDef.setGoals( "clean install" );
571         buildDef.setDescription( "Test Build Definition" );
572 
573         return buildDef;
574     }
575 
576     private Map<String, Object> getListenerMap()
577     {
578         Map<String, Object> map = new HashMap<String, Object>();
579 
580         map.put( "release-phases", Arrays.asList( "incomplete-phase" ) );
581         map.put( "completed-release-phases", Arrays.asList( "completed-phase" ) );
582         return map;
583     }
584 
585     public class ProjectGroupStub
586         extends ProjectGroup
587     {
588         @Override
589         public List<Project> getProjects()
590         {
591             throw new RuntimeException( "Can't call getProjects as it will throw JDODetachedFieldAccessException" );
592         }
593     }
594 }