View Javadoc

1   package org.apache.continuum.builder.distributed.work;
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.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 }