1 package org.apache.continuum.builder.distributed.work;
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.dao.BuildDefinitionDao;
24 import org.apache.continuum.dao.BuildResultDao;
25 import org.apache.continuum.dao.ProjectDao;
26 import org.apache.continuum.dao.ProjectScmRootDao;
27 import org.apache.continuum.model.project.ProjectRunSummary;
28 import org.apache.continuum.model.project.ProjectScmRoot;
29 import org.apache.maven.continuum.configuration.ConfigurationService;
30 import org.apache.maven.continuum.model.project.BuildDefinition;
31 import org.apache.maven.continuum.model.project.BuildResult;
32 import org.apache.maven.continuum.model.project.Project;
33 import org.apache.maven.continuum.project.ContinuumProjectState;
34 import org.codehaus.plexus.spring.PlexusInSpringTestCase;
35 import org.jmock.Expectations;
36 import org.jmock.Mockery;
37 import org.jmock.integration.junit3.JUnit3Mockery;
38 import org.jmock.lib.legacy.ClassImposteriser;
39
40 import java.util.ArrayList;
41 import java.util.List;
42
43 public class DefaultContinuumWorkerTest
44 extends PlexusInSpringTestCase
45 {
46 private Mockery context;
47
48 private ProjectDao projectDao;
49
50 private ProjectScmRootDao projectScmRootDao;
51
52 private BuildDefinitionDao buildDefinitionDao;
53
54 private BuildResultDao buildResultDao;
55
56 private DistributedBuildManager distributedBuildManager;
57
58 private ConfigurationService configurationService;
59
60 private DefaultContinuumWorker worker;
61
62 @Override
63 public void setUp()
64 throws Exception
65 {
66 super.setUp();
67 context = new JUnit3Mockery();
68 context.setImposteriser( ClassImposteriser.INSTANCE );
69
70 projectDao = context.mock( ProjectDao.class );
71 projectScmRootDao = context.mock( ProjectScmRootDao.class );
72 buildDefinitionDao = context.mock( BuildDefinitionDao.class );
73 buildResultDao = context.mock( BuildResultDao.class );
74 configurationService = context.mock( ConfigurationService.class );
75 distributedBuildManager = context.mock( DistributedBuildManager.class );
76
77 worker = (DefaultContinuumWorker) lookup( ContinuumWorker.class );
78 worker.setBuildDefinitionDao( buildDefinitionDao );
79 worker.setBuildResultDao( buildResultDao );
80 worker.setProjectDao( projectDao );
81 worker.setProjectScmRootDao( projectScmRootDao );
82 worker.setConfigurationService( configurationService );
83 worker.setDistributedBuildManager( distributedBuildManager );
84 }
85
86 public void testWorkerWithStuckBuild()
87 throws Exception
88 {
89 recordOfStuckBuild();
90
91 worker.work();
92
93 context.assertIsSatisfied();
94 }
95
96 public void testWorkerWithStuckScm()
97 throws Exception
98 {
99 recordOfStuckScm();
100
101 worker.work();
102
103 context.assertIsSatisfied();
104 }
105
106 private void recordOfStuckBuild()
107 throws Exception
108 {
109 context.checking( new Expectations()
110 {
111 {
112 one( configurationService ).isDistributedBuildEnabled();
113 will( returnValue( true ) );
114
115 exactly( 2 ).of( distributedBuildManager ).getCurrentRuns();
116 will( returnValue( getCurrentRuns() ) );
117
118 exactly( 2 ).of( projectScmRootDao ).getProjectScmRoot( 1 );
119 will( returnValue( getScmRoot( ContinuumProjectState.OK ) ) );
120
121 Project proj1 = getProject( 1, ContinuumProjectState.BUILDING );
122 one( projectDao ).getProject( 1 );
123 will( returnValue( proj1 ) );
124
125 one( distributedBuildManager ).isProjectCurrentlyBuilding( 1, 1 );
126 will( returnValue( false ) );
127
128 one( buildDefinitionDao ).getBuildDefinition( 1 );
129 will( returnValue( new BuildDefinition() ) );
130
131 one( buildResultDao ).addBuildResult( with( any( Project.class ) ), with( any( BuildResult.class ) ) );
132 one( projectDao ).updateProject( proj1 );
133
134 one( projectDao ).getProject( 2 );
135 will( returnValue( getProject( 2, ContinuumProjectState.OK ) ) );
136 }
137 } );
138 }
139
140 private void recordOfStuckScm()
141 throws Exception
142 {
143 context.checking( new Expectations()
144 {
145 {
146 one( configurationService ).isDistributedBuildEnabled();
147 will( returnValue( true ) );
148
149 exactly( 2 ).of( distributedBuildManager ).getCurrentRuns();
150 will( returnValue( getCurrentRuns() ) );
151
152 ProjectScmRoot scmRootUpdating = getScmRoot( ContinuumProjectState.UPDATING );
153 one( projectScmRootDao ).getProjectScmRoot( 1 );
154 will( returnValue( scmRootUpdating ) );
155
156 one( distributedBuildManager ).isProjectCurrentlyPreparingBuild( 1, 1 );
157 will( returnValue( false ) );
158
159 one( projectScmRootDao ).updateProjectScmRoot( scmRootUpdating );
160
161 one( projectScmRootDao ).getProjectScmRoot( 1 );
162 will( returnValue( getScmRoot( ContinuumProjectState.ERROR ) ) );
163 }
164 } );
165 }
166
167 private List<ProjectRunSummary> getCurrentRuns()
168 {
169 List<ProjectRunSummary> runs = new ArrayList<ProjectRunSummary>();
170
171 ProjectRunSummary run1 = new ProjectRunSummary();
172 run1.setProjectId( 1 );
173 run1.setBuildDefinitionId( 1 );
174 run1.setProjectGroupId( 1 );
175 run1.setProjectScmRootId( 1 );
176 run1.setTrigger( 1 );
177 run1.setTriggeredBy( "user" );
178 run1.setBuildAgentUrl( "http://localhost:8181/continuum-buildagent/xmlrpc" );
179 runs.add( run1 );
180
181 ProjectRunSummary run2 = new ProjectRunSummary();
182 run2.setProjectId( 2 );
183 run2.setBuildDefinitionId( 2 );
184 run2.setProjectGroupId( 1 );
185 run2.setProjectScmRootId( 1 );
186 run2.setTrigger( 1 );
187 run2.setTriggeredBy( "user" );
188 run2.setBuildAgentUrl( "http://localhost:8181/continuum-buildagent/xmlrpc" );
189 runs.add( run2 );
190
191 return runs;
192 }
193
194 private ProjectScmRoot getScmRoot( int state )
195 {
196 ProjectScmRoot scmRoot = new ProjectScmRoot();
197 scmRoot.setState( state );
198 return scmRoot;
199 }
200
201 private Project getProject( int projectId, int state )
202 {
203 Project project = new Project();
204 project.setId( projectId );
205 project.setState( state );
206 return project;
207 }
208 }