1 package org.apache.maven.shared.release.phase;
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22 import static org.mockito.Matchers.argThat;
23 import static org.mockito.Matchers.isA;
24 import static org.mockito.Mockito.mock;
25 import static org.mockito.Mockito.verify;
26 import static org.mockito.Mockito.verifyNoMoreInteractions;
27 import static org.mockito.Mockito.when;
28
29 import java.io.File;
30 import java.io.IOException;
31 import java.util.ArrayList;
32 import java.util.Collections;
33 import java.util.Iterator;
34 import java.util.List;
35
36 import org.apache.maven.Maven;
37 import org.apache.maven.project.MavenProject;
38 import org.apache.maven.scm.ScmFile;
39 import org.apache.maven.scm.ScmFileSet;
40 import org.apache.maven.scm.ScmFileStatus;
41 import org.apache.maven.scm.ScmTagParameters;
42 import org.apache.maven.scm.command.add.AddScmResult;
43 import org.apache.maven.scm.manager.ScmManager;
44 import org.apache.maven.scm.manager.ScmManagerStub;
45 import org.apache.maven.scm.provider.ScmProvider;
46 import org.apache.maven.scm.repository.ScmRepository;
47 import org.apache.maven.shared.release.config.ReleaseDescriptor;
48 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
49 import org.apache.maven.shared.release.util.ReleaseUtil;
50
51
52
53
54
55
56 public class GenerateReleasePomsPhaseTest
57 extends AbstractRewritingReleasePhaseTestCase
58 {
59 private static final String NEXT_VERSION = "1.0";
60
61 private static final String ALTERNATIVE_NEXT_VERSION = "2.0";
62
63 private ScmProvider scmProviderMock;
64
65 protected void setUp()
66 throws Exception
67 {
68 super.setUp();
69
70 phase = (ReleasePhase) lookup( ReleasePhase.ROLE, "generate-release-poms" );
71 scmProviderMock = null;
72 }
73
74
75
76
77
78
79
80
81
82
83
84
85 public void testRewriteExternalRangeDependency() throws Exception
86 {
87 List<MavenProject> reactorProjects = createReactorProjects( "external-range-dependency" );
88 ReleaseDescriptor config = createMappedConfiguration( reactorProjects );
89
90 phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
91
92 comparePomFiles( reactorProjects );
93 }
94
95
96 public void testSuppressCommitBeforeTagOrBranch() throws Exception
97 {
98 List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
99 ReleaseDescriptor config = new ReleaseDescriptor();
100 config.setGenerateReleasePoms( true );
101 config.setSuppressCommitBeforeTagOrBranch( true );
102 config.setRemoteTagging( false );
103 mapNextVersion( config, "groupId:artifactId" );
104
105 phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
106
107 verify( scmProviderMock ).add( isA(ScmRepository.class), isA(ScmFileSet.class) );
108
109 verifyNoMoreInteractions( scmProviderMock );
110 }
111
112 public void testSuppressCommitBeforeTagOrBranchAndReomoteTagging() throws Exception
113 {
114 List<MavenProject> reactorProjects = createReactorProjects( "basic-pom" );
115 ReleaseDescriptor config = new ReleaseDescriptor();
116 config.setGenerateReleasePoms( true );
117 config.setSuppressCommitBeforeTagOrBranch( true );
118 config.setRemoteTagging( true );
119 mapNextVersion( config, "groupId:artifactId" );
120
121 phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
122
123 verify( scmProviderMock ).add( isA(ScmRepository.class), isA(ScmFileSet.class) );
124
125 verifyNoMoreInteractions( scmProviderMock );
126 }
127
128
129 public void testFinalName() throws Exception
130 {
131 List<MavenProject> reactorProjects = createReactorProjects( "pom-with-finalname" );
132 ReleaseDescriptor config = createConfigurationForWithParentNextVersion( reactorProjects );
133 config.setGenerateReleasePoms( true );
134
135 phase.execute( config, new DefaultReleaseEnvironment(), reactorProjects );
136
137 assertTrue( comparePomFiles( reactorProjects ) );
138 }
139
140
141
142
143 protected ReleaseDescriptor createDescriptorFromProjects( List<MavenProject> reactorProjects )
144 {
145 ReleaseDescriptor descriptor = super.createDescriptorFromProjects( reactorProjects );
146 descriptor.setScmReleaseLabel( "release-label" );
147 descriptor.setGenerateReleasePoms( true );
148 return descriptor;
149 }
150
151
152
153
154
155 protected List<MavenProject> prepareReactorProjects( String path, boolean copyFiles ) throws Exception
156 {
157 List<MavenProject> reactorProjects = createReactorProjects( "generate-release-poms/", path );
158
159 scmProviderMock = mock( ScmProvider.class );
160
161 List<File> releasePoms = new ArrayList<File>();
162
163 for ( Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); )
164 {
165 MavenProject project = iterator.next();
166
167 releasePoms.add( ReleaseUtil.getReleasePom( project ) );
168 }
169
170 MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
171 ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), releasePoms );
172
173 when( scmProviderMock.add( isA( ScmRepository.class ),
174 argThat( new IsScmFileSetEquals( fileSet ) ) ) ).
175 thenReturn( new AddScmResult( "...",
176 Collections.singletonList( new ScmFile( Maven.RELEASE_POMv4, ScmFileStatus.ADDED ) ) ) );
177
178
179 ScmManagerStub stub = (ScmManagerStub) lookup( ScmManager.ROLE );
180 stub.setScmProvider( scmProviderMock );
181
182 return reactorProjects;
183 }
184
185 @Override
186 protected void verifyReactorProjects( String path, boolean copyFiles ) throws Exception
187 {
188 List<MavenProject> reactorProjects = createReactorProjects( "generate-release-poms/", path );
189
190 List<File> releasePoms = new ArrayList<File>();
191
192 for ( Iterator<MavenProject> iterator = reactorProjects.iterator(); iterator.hasNext(); )
193 {
194 MavenProject project = iterator.next();
195
196 releasePoms.add( ReleaseUtil.getReleasePom( project ) );
197 }
198
199 MavenProject rootProject = ReleaseUtil.getRootProject( reactorProjects );
200 ScmFileSet fileSet = new ScmFileSet( rootProject.getFile().getParentFile(), releasePoms );
201
202 verify( scmProviderMock ).add( isA( ScmRepository.class ),
203 argThat( new IsScmFileSetEquals( fileSet ) ) );
204 verifyNoMoreInteractions( scmProviderMock );
205 }
206
207
208
209
210
211 protected void mapNextVersion( ReleaseDescriptor config, String projectId )
212 {
213 config.mapReleaseVersion( projectId, NEXT_VERSION );
214 }
215
216
217
218
219
220 protected void mapAlternateNextVersion( ReleaseDescriptor config, String projectId )
221 {
222 config.mapReleaseVersion( projectId, ALTERNATIVE_NEXT_VERSION );
223 }
224
225
226
227
228
229 protected void unmapNextVersion( ReleaseDescriptor config, String projectId )
230 {
231
232 }
233
234
235
236
237 protected ReleaseDescriptor createConfigurationForPomWithParentAlternateNextVersion( List<MavenProject> reactorProjects )
238 throws Exception
239 {
240 ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
241
242 config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
243 config.mapReleaseVersion( "groupId:subproject1", ALTERNATIVE_NEXT_VERSION );
244
245 return config;
246 }
247
248
249
250
251 protected ReleaseDescriptor createConfigurationForWithParentNextVersion( List<MavenProject> reactorProjects ) throws Exception
252 {
253 ReleaseDescriptor config = createDescriptorFromProjects( reactorProjects );
254
255 config.mapReleaseVersion( "groupId:artifactId", NEXT_VERSION );
256 config.mapReleaseVersion( "groupId:subproject1", NEXT_VERSION );
257
258 return config;
259 }
260
261
262
263
264 protected String readTestProjectFile( String fileName ) throws IOException
265 {
266 return ReleaseUtil.readXmlFile( getTestFile( "target/test-classes/projects/generate-release-poms/" + fileName ) );
267 }
268
269
270
271
272
273 protected void comparePomFiles( MavenProject project, String expectedFileSuffix, boolean normalizeLineEndings )
274 throws IOException
275 {
276 File actualFile = ReleaseUtil.getReleasePom( project );
277 File expectedFile = new File( actualFile.getParentFile(), "expected-release-pom" + expectedFileSuffix + ".xml" );
278
279 comparePomFiles( expectedFile, actualFile, normalizeLineEndings );
280 }
281 }