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