1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 package org.apache.maven.plugins.release;
20
21 import java.io.File;
22 import java.util.Collections;
23 import java.util.List;
24 import java.util.Properties;
25
26 import org.apache.maven.execution.MavenSession;
27 import org.apache.maven.plugin.MojoExecutionException;
28 import org.apache.maven.plugin.MojoFailureException;
29 import org.apache.maven.plugin.testing.AbstractMojoTestCase;
30 import org.apache.maven.project.MavenProject;
31 import org.apache.maven.shared.release.ReleaseExecutionException;
32 import org.apache.maven.shared.release.ReleaseFailureException;
33 import org.apache.maven.shared.release.ReleaseManager;
34 import org.apache.maven.shared.release.ReleasePrepareRequest;
35 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
36 import org.apache.maven.shared.release.env.ReleaseEnvironment;
37 import org.mockito.ArgumentCaptor;
38 import org.mockito.invocation.InvocationOnMock;
39 import org.mockito.stubbing.Answer;
40
41 import static org.hamcrest.CoreMatchers.instanceOf;
42 import static org.hamcrest.CoreMatchers.is;
43 import static org.hamcrest.CoreMatchers.notNullValue;
44 import static org.hamcrest.MatcherAssert.assertThat;
45 import static org.mockito.ArgumentMatchers.isA;
46 import static org.mockito.Mockito.doThrow;
47 import static org.mockito.Mockito.mock;
48 import static org.mockito.Mockito.spy;
49 import static org.mockito.Mockito.times;
50 import static org.mockito.Mockito.verify;
51 import static org.mockito.Mockito.verifyNoMoreInteractions;
52 import static org.mockito.Mockito.when;
53
54
55
56
57
58
59 public class PrepareReleaseMojoTest extends AbstractMojoTestCase {
60 private void setDefaults(PrepareReleaseMojo mojo) throws IllegalAccessException {
61 setVariableValueToObject(mojo, "updateWorkingCopyVersions", Boolean.TRUE);
62 }
63
64 public void testPrepare() throws Exception {
65 File testFile = getTestFile("target/test-classes/mojos/prepare/prepare.xml");
66 final PrepareReleaseMojo mojo = spy((PrepareReleaseMojo) lookupMojo("prepare", testFile));
67 mojo.getProject().setFile(testFile);
68 setDefaults(mojo);
69 mojo.setBasedir(testFile.getParentFile());
70 mojo.setPomFileName("pom.xml");
71 mojo.session = new MavenSession(null, null, null, null, null, null, null, null, null) {
72 public Properties getExecutionProperties() {
73 return new Properties();
74 }
75 ;
76
77 @Override
78 public List<MavenProject> getProjects() {
79 return Collections.singletonList(mojo.project);
80 }
81 };
82
83 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
84 builder.setWorkingDirectory(testFile.getParentFile().getAbsolutePath());
85 builder.setUpdateDependencies(false);
86
87 ReleaseManager mock = mock(ReleaseManager.class);
88 mojo.setReleaseManager(mock);
89
90 when(mojo.createReleaseDescriptor()).thenAnswer(new Answer<ReleaseDescriptorBuilder>() {
91 @Override
92 public ReleaseDescriptorBuilder answer(InvocationOnMock invocationOnMock) throws Throwable {
93 ReleaseDescriptorBuilder original = (ReleaseDescriptorBuilder) invocationOnMock.callRealMethod();
94 return spy(original);
95 }
96 });
97
98
99 mojo.execute();
100
101 ArgumentCaptor<ReleasePrepareRequest> prepareRequest = ArgumentCaptor.forClass(ReleasePrepareRequest.class);
102
103
104 verify(mock).prepare(prepareRequest.capture());
105
106 assertThat(
107 prepareRequest.getValue().getReleaseDescriptorBuilder(),
108 is(instanceOf(ReleaseDescriptorBuilder.class)));
109 assertThat(prepareRequest.getValue().getReleaseEnvironment(), is(instanceOf(ReleaseEnvironment.class)));
110 assertThat(prepareRequest.getValue().getReactorProjects(), is(notNullValue()));
111 assertThat(prepareRequest.getValue().getResume(), is(true));
112 assertThat(prepareRequest.getValue().getDryRun(), is(false));
113
114 verify(prepareRequest.getValue().getReleaseDescriptorBuilder()).setScmSignTags(false);
115 }
116
117 public void testPrepareWithExecutionException() throws Exception {
118 File testFile = getTestFile("target/test-classes/mojos/prepare/prepare.xml");
119 final PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo("prepare", testFile);
120 mojo.getProject().setFile(testFile);
121 setDefaults(mojo);
122 mojo.setBasedir(testFile.getParentFile());
123 mojo.setPomFileName("pom.xml");
124 mojo.session = new MavenSession(null, null, null, null, null, null, null, null, null) {
125 public Properties getExecutionProperties() {
126 return new Properties();
127 }
128 ;
129
130 @Override
131 public List<MavenProject> getProjects() {
132 return Collections.singletonList(mojo.project);
133 }
134 };
135
136 ReleaseManager mock = mock(ReleaseManager.class);
137 doThrow(new ReleaseExecutionException("...")).when(mock).prepare(isA(ReleasePrepareRequest.class));
138 mojo.setReleaseManager(mock);
139
140
141 try {
142 mojo.execute();
143
144 fail("Should have thrown an exception");
145 } catch (MojoExecutionException e) {
146 assertEquals(
147 "Check cause", ReleaseExecutionException.class, e.getCause().getClass());
148 }
149
150
151 verify(mock).prepare(isA(ReleasePrepareRequest.class));
152 verifyNoMoreInteractions(mock);
153 }
154
155 public void testPrepareWithExecutionFailure() throws Exception {
156 File testFile = getTestFile("target/test-classes/mojos/prepare/prepare.xml");
157 final PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo("prepare", testFile);
158 mojo.getProject().setFile(testFile);
159 setDefaults(mojo);
160 mojo.setBasedir(testFile.getParentFile());
161 mojo.setPomFileName("pom.xml");
162 mojo.session = new MavenSession(null, null, null, null, null, null, null, null, null) {
163 public Properties getExecutionProperties() {
164 return new Properties();
165 }
166 ;
167
168 @Override
169 public List<MavenProject> getProjects() {
170 return Collections.singletonList(mojo.project);
171 }
172 };
173
174 ReleaseManager mock = mock(ReleaseManager.class);
175 ReleaseFailureException cause = new ReleaseFailureException("...");
176 doThrow(cause).when(mock).prepare(isA(ReleasePrepareRequest.class));
177 mojo.setReleaseManager(mock);
178
179
180 try {
181 mojo.execute();
182
183 fail("Should have thrown an exception");
184 } catch (MojoFailureException e) {
185 assertEquals("Check cause exists", cause, e.getCause());
186 }
187
188 verify(mock).prepare(isA(ReleasePrepareRequest.class));
189 verifyNoMoreInteractions(mock);
190 }
191
192 public void testLineSeparatorInPrepareWithPom() throws Exception {
193 File testFile = getTestFile("target/test-classes/mojos/prepare/prepare.xml");
194 final PrepareWithPomReleaseMojo mojo = (PrepareWithPomReleaseMojo) lookupMojo("prepare-with-pom", testFile);
195 mojo.getProject().setFile(testFile);
196 setDefaults(mojo);
197 setVariableValueToObject(mojo, "generateReleasePoms", Boolean.TRUE);
198 mojo.setBasedir(testFile.getParentFile());
199 mojo.setPomFileName("pom.xml");
200 mojo.project.setFile(testFile);
201 mojo.session = new MavenSession(null, null, null, null, null, null, null, null, null) {
202 public Properties getExecutionProperties() {
203 return new Properties();
204 }
205 ;
206
207 @Override
208 public List<MavenProject> getProjects() {
209 return Collections.singletonList(mojo.project);
210 }
211 };
212
213 ReleaseManager mock = mock(ReleaseManager.class);
214 mojo.setReleaseManager(mock);
215
216 int times = 1;
217 testLineSeparator(null, "\n", mojo, mock, times++);
218 testLineSeparator("source", "\n", mojo, mock, times++);
219 testLineSeparator("cr", "\r", mojo, mock, times++);
220 testLineSeparator("lf", "\n", mojo, mock, times++);
221 testLineSeparator("crlf", "\r\n", mojo, mock, times++);
222 testLineSeparator("system", System.lineSeparator(), mojo, mock, times++);
223 }
224
225 public void testLineSeparatorInPrepare() throws Exception {
226 File testFile = getTestFile("target/test-classes/mojos/prepare/prepare.xml");
227 final PrepareReleaseMojo mojo = (PrepareReleaseMojo) lookupMojo("prepare", testFile);
228 mojo.getProject().setFile(testFile);
229 setDefaults(mojo);
230 mojo.setBasedir(testFile.getParentFile());
231 mojo.setPomFileName("pom.xml");
232 mojo.project.setFile(testFile);
233 mojo.session = new MavenSession(null, null, null, null, null, null, null, null, null) {
234 public Properties getExecutionProperties() {
235 return new Properties();
236 }
237 ;
238
239 @Override
240 public List<MavenProject> getProjects() {
241 return Collections.singletonList(mojo.project);
242 }
243 };
244
245 ReleaseManager mock = mock(ReleaseManager.class);
246 mojo.setReleaseManager(mock);
247
248 int times = 1;
249 testLineSeparator(null, "\n", mojo, mock, times++);
250 testLineSeparator("source", "\n", mojo, mock, times++);
251 testLineSeparator("cr", "\r", mojo, mock, times++);
252 testLineSeparator("lf", "\n", mojo, mock, times++);
253 testLineSeparator("crlf", "\r\n", mojo, mock, times++);
254 testLineSeparator("system", System.lineSeparator(), mojo, mock, times++);
255 }
256
257 private void testLineSeparator(
258 String lineSeparator, String expected, PrepareReleaseMojo mojo, ReleaseManager releaseManager, int times)
259 throws Exception {
260
261 setVariableValueToObject(mojo, "lineSeparator", lineSeparator);
262
263 mojo.execute();
264
265 ArgumentCaptor<ReleasePrepareRequest> prepareRequest = ArgumentCaptor.forClass(ReleasePrepareRequest.class);
266 verify(releaseManager, times(times)).prepare(prepareRequest.capture());
267
268 assertEquals(
269 expected,
270 prepareRequest.getValue().getReleaseDescriptorBuilder().build().getLineSeparator());
271 }
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354 }