1 package org.apache.continuum.xmlrpc.server;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
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
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 }