View Javadoc

1   package org.apache.maven.continuum.core.action;
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.execution.ContinuumBuildExecutorConstants;
23  import org.apache.maven.continuum.model.project.BuildDefinition;
24  import org.apache.maven.continuum.model.project.BuildDefinitionTemplate;
25  import org.apache.maven.continuum.model.project.Project;
26  import org.apache.maven.continuum.project.builder.ContinuumProjectBuilder;
27  import org.apache.maven.continuum.project.builder.ContinuumProjectBuildingResult;
28  import org.apache.maven.continuum.project.builder.manager.ContinuumProjectBuilderManager;
29  import org.apache.maven.continuum.utils.ContinuumUrlValidator;
30  import org.apache.maven.settings.MavenSettingsBuilder;
31  import org.apache.maven.settings.Settings;
32  import org.codehaus.plexus.logging.Logger;
33  import org.codehaus.plexus.logging.console.ConsoleLogger;
34  import org.codehaus.plexus.spring.PlexusInSpringTestCase;
35  import org.jmock.Mock;
36  import org.jmock.MockObjectTestCase;
37  
38  import java.util.HashMap;
39  import java.util.Map;
40  
41  public class CreateProjectsFromMetadataTest
42      extends MockObjectTestCase
43  {
44  
45      private CreateProjectsFromMetadataAction action;
46  
47      private ContinuumProjectBuildingResult result;
48  
49      protected void setUp()
50          throws Exception
51      {
52          result = new ContinuumProjectBuildingResult();
53          action = new CreateProjectsFromMetadataAction();
54          action.enableLogging( new ConsoleLogger( Logger.LEVEL_DEBUG, "" ) );
55  
56          recordBuildProjectFromHttp();
57      }
58  
59      private void recordBuildProjectFromHttp()
60          throws Exception
61      {
62          result = new ContinuumProjectBuildingResult();
63          Mock projectBuilderManagerMock = mock( ContinuumProjectBuilderManager.class );
64  
65          action.setProjectBuilderManager( (ContinuumProjectBuilderManager) projectBuilderManagerMock.proxy() );
66          action.setUrlValidator( new ContinuumUrlValidator() );
67  
68          Mock projectBuilder = mock( ContinuumProjectBuilder.class );
69  
70          projectBuilderManagerMock.expects( once() ).method( "getProjectBuilder" ).will( returnValue(
71              projectBuilder.proxy() ) );
72          projectBuilder.expects( once() ).method( "buildProjectsFromMetadata" ).will( returnValue( result ) );
73          projectBuilder.expects( once() ).method( "getDefaultBuildDefinitionTemplate" ).will( returnValue(
74              getDefaultBuildDefinitionTemplate() ) );
75      }
76  
77      private void invokeBuildSettings()
78      {
79          Mock mavenSettingsBuilderMock = mock( MavenSettingsBuilder.class );
80          action.setMavenSettingsBuilder( (MavenSettingsBuilder) mavenSettingsBuilderMock.proxy() );
81          mavenSettingsBuilderMock.expects( once() ).method( "buildSettings" ).will( returnValue( new Settings() ) );
82      }
83  
84      private BuildDefinitionTemplate getDefaultBuildDefinitionTemplate()
85          throws Exception
86      {
87          BuildDefinition bd = new BuildDefinition();
88  
89          bd.setDefaultForProject( true );
90  
91          bd.setGoals( "clean install" );
92  
93          bd.setArguments( "-B" );
94  
95          bd.setBuildFile( "pom.xml" );
96  
97          bd.setType( ContinuumBuildExecutorConstants.MAVEN_TWO_BUILD_EXECUTOR );
98  
99          BuildDefinitionTemplate bdt = new BuildDefinitionTemplate();
100         bdt.addBuildDefinition( bd );
101         return bdt;
102     }
103 
104     @SuppressWarnings( "unchecked" )
105     public void testExecuteWithNonRecursiveMode()
106         throws Exception
107     {
108         invokeBuildSettings();
109 
110         Map<String, Object> context = new HashMap<String, Object>();
111         CreateProjectsFromMetadataAction.setUrl( context,
112                                                  "http://svn.apache.org/repos/asf/maven/continuum/trunk/pom.xml" );
113         CreateProjectsFromMetadataAction.setProjectBuilderId( context, "id" );
114         CreateProjectsFromMetadataAction.setLoadRecursiveProject( context, true );
115         context.put( CreateProjectsFromMetadataAction.KEY_CHECKOUT_PROJECTS_IN_SINGLE_DIRECTORY, false );
116 
117         action.execute( context );
118 
119         ContinuumProjectBuildingResult result = CreateProjectsFromMetadataAction.getProjectBuildingResult( context );
120 
121         assertFalse(
122             "Should not have errors but had " + result.getErrorsAsString() + " (this test requires internet access)",
123             result.hasErrors() );
124     }
125 
126     public void testExecuteWithRecursiveMode()
127         throws Exception
128     {
129         invokeBuildSettings();
130 
131         Map<String, Object> context = new HashMap<String, Object>();
132         CreateProjectsFromMetadataAction.setUrl( context,
133                                                  "http://svn.apache.org/repos/asf/maven/archiva/trunk/pom.xml" );
134         CreateProjectsFromMetadataAction.setProjectBuilderId( context, "id" );
135         CreateProjectsFromMetadataAction.setLoadRecursiveProject( context, false );
136         context.put( CreateProjectsFromMetadataAction.KEY_CHECKOUT_PROJECTS_IN_SINGLE_DIRECTORY, false );
137 
138         action.execute( context );
139 
140         ContinuumProjectBuildingResult result = CreateProjectsFromMetadataAction.getProjectBuildingResult( context );
141 
142         assertFalse(
143             "Should not have errors but had " + result.getErrorsAsString() + " (this test requires internet access)",
144             result.hasErrors() );
145     }
146 
147 
148     public void testExecuteWithCheckoutProjectsInSingleDirectory()
149         throws Exception
150     {
151         Project project = new Project();
152         project.setGroupId( "org.apache.continuum" );
153         project.setArtifactId( "parent-project" );
154         project.setVersion( "1.0-SNAPSHOT" );
155         project.setId( 6 );
156         project.setName( "parent-project" );
157         project.setScmUrl( "scm:local:src/test-projects:flat-multi-module/parent-project" );
158 
159         this.result.addProject( project );
160 
161         project = new Project();
162         project.setGroupId( "org.apache.continuum" );
163         project.setArtifactId( "module-a" );
164         project.setVersion( "1.0-SNAPSHOT" );
165         project.setId( 7 );
166         project.setName( "module-a" );
167         project.setScmUrl( "scm:local:src/test-projects:flat-multi-module/module-a" );
168 
169         this.result.addProject( project );
170 
171         project = new Project();
172         project.setGroupId( "org.apache.continuum" );
173         project.setArtifactId( "module-b" );
174         project.setVersion( "1.0-SNAPSHOT" );
175         project.setId( 8 );
176         project.setName( "module-b" );
177         project.setScmUrl( "scm:local:src/test-projects:flat-multi-module/module-b" );
178 
179         this.result.addProject( project );
180 
181         // assert using scm url set in root!
182         Map<String, Object> context = new HashMap<String, Object>();
183         CreateProjectsFromMetadataAction.setUrl( context, "file://" + PlexusInSpringTestCase.getBasedir() +
184             "/src/test-projects/flat-multi-module/parent-project/pom.xml" );
185         CreateProjectsFromMetadataAction.setProjectBuilderId( context, "id" );
186         CreateProjectsFromMetadataAction.setLoadRecursiveProject( context, true );
187         context.put( CreateProjectsFromMetadataAction.KEY_CHECKOUT_PROJECTS_IN_SINGLE_DIRECTORY, true );
188 
189         action.execute( context );
190 
191         ContinuumProjectBuildingResult result = CreateProjectsFromMetadataAction.getProjectBuildingResult( context );
192 
193         assertFalse(
194             "Should not have errors but had " + result.getErrorsAsString() + " (this test requires internet access)",
195             result.hasErrors() );
196         assertEquals( "Incorrect SCM Root Url for flat multi-module project.",
197                       "scm:local:src/test-projects:flat-multi-module/", AbstractContinuumAction.getProjectScmRootUrl(
198             context, "" ) );
199     }
200 
201     public void testExecuteFlatMultiModuleProjectThatStartsWithTheSameLetter()
202         throws Exception
203     {
204         invokeBuildSettings();
205 
206         Project project = new Project();
207         project.setGroupId( "com.example.flat" );
208         project.setArtifactId( "flat-parent" );
209         project.setVersion( "1.0-SNAPSHOT" );
210         project.setId( 6 );
211         project.setName( "Flat Example" );
212         project.setScmUrl( "scm:svn:http://svn.apache.org/repos/asf/continuum/sandbox/flat-example/flat-parent" );
213 
214         this.result.addProject( project );
215 
216         project = new Project();
217         project.setGroupId( "com.example.flat" );
218         project.setArtifactId( "flat-core" );
219         project.setVersion( "1.0-SNAPSHOT" );
220         project.setId( 7 );
221         project.setName( "flat-core" );
222         project.setScmUrl( "scm:svn:http://svn.apache.org/repos/asf/continuum/sandbox/flat-example/flat-core" );
223 
224         this.result.addProject( project );
225 
226         project = new Project();
227         project.setGroupId( "com.example.flat" );
228         project.setArtifactId( "flat-webapp" );
229         project.setVersion( "1.0-SNAPSHOT" );
230         project.setId( 8 );
231         project.setName( "flat-webapp Maven Webapp" );
232         project.setScmUrl( "scm:svn:http://svn.apache.org/repos/asf/continuum/sandbox/flat-example/flat-webapp" );
233 
234         this.result.addProject( project );
235 
236         Map<String, Object> context = new HashMap<String, Object>();
237         CreateProjectsFromMetadataAction.setUrl( context,
238                                                  "http://svn.apache.org/repos/asf/continuum/sandbox/flat-example/flat-parent/pom.xml" );
239         CreateProjectsFromMetadataAction.setProjectBuilderId( context, "id" );
240         CreateProjectsFromMetadataAction.setLoadRecursiveProject( context, true );
241         context.put( CreateProjectsFromMetadataAction.KEY_CHECKOUT_PROJECTS_IN_SINGLE_DIRECTORY, false );
242 
243         action.execute( context );
244 
245         ContinuumProjectBuildingResult result = CreateProjectsFromMetadataAction.getProjectBuildingResult( context );
246 
247         assertFalse(
248             "Should not have errors but had " + result.getErrorsAsString() + " (this test requires internet access)",
249             result.hasErrors() );
250 
251         assertEquals( "Wrong scm root url created",
252                       "scm:svn:http://svn.apache.org/repos/asf/continuum/sandbox/flat-example/",
253                       AbstractContinuumAction.getProjectScmRootUrl( context, null ) );
254     }
255 }