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