View Javadoc
1   /*
2    * Licensed to the Apache Software Foundation (ASF) under one
3    * or more contributor license agreements.  See the NOTICE file
4    * distributed with this work for additional information
5    * regarding copyright ownership.  The ASF licenses this file
6    * to you under the Apache License, Version 2.0 (the
7    * "License"); you may not use this file except in compliance
8    * with the License.  You may obtain a copy of the License at
9    *
10   *   http://www.apache.org/licenses/LICENSE-2.0
11   *
12   * Unless required by applicable law or agreed to in writing,
13   * software distributed under the License is distributed on an
14   * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
15   * KIND, either express or implied.  See the License for the
16   * specific language governing permissions and limitations
17   * under the License.
18   */
19  package org.apache.maven.plugins.release;
20  
21  import javax.inject.Inject;
22  
23  import java.io.File;
24  import java.util.Arrays;
25  import java.util.Collections;
26  
27  import org.apache.maven.api.di.Provides;
28  import org.apache.maven.api.plugin.testing.Basedir;
29  import org.apache.maven.api.plugin.testing.InjectMojo;
30  import org.apache.maven.api.plugin.testing.MojoTest;
31  import org.apache.maven.execution.DefaultMavenExecutionRequest;
32  import org.apache.maven.execution.MavenExecutionRequest;
33  import org.apache.maven.execution.MavenSession;
34  import org.apache.maven.plugin.MojoExecutionException;
35  import org.apache.maven.plugin.MojoFailureException;
36  import org.apache.maven.project.MavenProject;
37  import org.apache.maven.shared.release.ReleaseExecutionException;
38  import org.apache.maven.shared.release.ReleaseFailureException;
39  import org.apache.maven.shared.release.ReleaseManager;
40  import org.apache.maven.shared.release.ReleasePerformRequest;
41  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
42  import org.junit.jupiter.api.BeforeEach;
43  import org.junit.jupiter.api.Test;
44  import org.junit.jupiter.api.extension.ExtendWith;
45  import org.mockito.ArgumentCaptor;
46  import org.mockito.Mock;
47  import org.mockito.junit.jupiter.MockitoExtension;
48  
49  import static org.junit.jupiter.api.Assertions.assertEquals;
50  import static org.junit.jupiter.api.Assertions.assertNotNull;
51  import static org.junit.jupiter.api.Assertions.assertTrue;
52  import static org.junit.jupiter.api.Assertions.fail;
53  import static org.mockito.ArgumentMatchers.isA;
54  import static org.mockito.Mockito.doThrow;
55  import static org.mockito.Mockito.mock;
56  import static org.mockito.Mockito.verify;
57  import static org.mockito.Mockito.verifyNoMoreInteractions;
58  import static org.mockito.Mockito.when;
59  
60  /**
61   * Test release:perform.
62   *
63   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
64   */
65  @ExtendWith(MockitoExtension.class)
66  @MojoTest
67  class PerformReleaseMojoTest {
68  
69      @Mock
70      private ReleaseManager releaseManagerMock;
71  
72      @Inject
73      private MavenProject mavenProject;
74  
75      @Inject
76      private MavenSession mavenSession;
77  
78      @Provides
79      private ReleaseManager releaseManager() {
80          return releaseManagerMock;
81      }
82  
83      @BeforeEach
84      void setup() {
85          when(mavenProject.getFile()).thenReturn(new File("pom.xml"));
86  
87          when(mavenProject.getGroupId()).thenReturn("groupId");
88          when(mavenProject.getArtifactId()).thenReturn("artifactId");
89          when(mavenProject.getVersion()).thenReturn("1.0.0-SNAPSHOT");
90  
91          when(mavenSession.getProjects()).thenReturn(Collections.singletonList(mavenProject));
92          when(mavenSession.getRequest()).thenReturn(new DefaultMavenExecutionRequest());
93      }
94  
95      @Test
96      @Basedir("/mojos/perform")
97      @InjectMojo(goal = "perform", pom = "perform.xml")
98      void testPerform(PerformReleaseMojo mojo) throws Exception {
99          // execute
100         mojo.execute();
101 
102         // verify
103         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
104         verify(releaseManagerMock).perform(argument.capture());
105         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
106         assertNotNull(argument.getValue().getReleaseEnvironment());
107         assertNotNull(argument.getValue().getReactorProjects());
108         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
109 
110         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
111                 argument.getValue().getReleaseDescriptorBuilder().build();
112         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
113 
114         verifyNoMoreInteractions(releaseManagerMock);
115     }
116 
117     @Test
118     @Basedir("/mojos/perform")
119     @InjectMojo(goal = "perform", pom = "perform-with-flat-structure.xml")
120     void testPerformWithFlatStructure(PerformReleaseMojo mojo) throws Exception {
121         // execute
122         mojo.execute();
123 
124         // verify
125         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
126         verify(releaseManagerMock).perform(argument.capture());
127         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
128         assertNotNull(argument.getValue().getReleaseEnvironment());
129         assertNotNull(argument.getValue().getReactorProjects());
130         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
131 
132         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
133                 argument.getValue().getReleaseDescriptorBuilder().build();
134         assertEquals("deploy", releaseDescriptor.getPerformGoals());
135         assertEquals(
136                 "scm:svn:file://localhost/target/svnroot/flat-multi-module/trunk/root-project",
137                 releaseDescriptor.getScmSourceUrl());
138 
139         verifyNoMoreInteractions(releaseManagerMock);
140     }
141 
142     @Test
143     @Basedir("/mojos/perform")
144     @InjectMojo(goal = "perform", pom = "perform-without-site.xml")
145     void testPerformWithoutSite(PerformReleaseMojo mojo) throws Exception {
146         // execute
147         mojo.execute();
148 
149         // verify
150         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
151         verify(releaseManagerMock).perform(argument.capture());
152         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
153         assertNotNull(argument.getValue().getReleaseEnvironment());
154         assertNotNull(argument.getValue().getReactorProjects());
155         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
156         verifyNoMoreInteractions(releaseManagerMock);
157 
158         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
159                 argument.getValue().getReleaseDescriptorBuilder().build();
160         assertEquals("deploy", releaseDescriptor.getPerformGoals());
161     }
162 
163     @Test
164     @Basedir("/mojos/perform")
165     @InjectMojo(goal = "perform", pom = "perform.xml")
166     void testPerformWithExecutionException(PerformReleaseMojo mojo) throws Exception {
167         doThrow(new ReleaseExecutionException("..."))
168                 .when(releaseManagerMock)
169                 .perform(isA(ReleasePerformRequest.class));
170 
171         // execute
172         try {
173             mojo.execute();
174 
175             fail("Should have thrown an exception");
176         } catch (MojoExecutionException e) {
177             assertEquals(ReleaseExecutionException.class, e.getCause().getClass(), "Check cause");
178         }
179 
180         // verify
181         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
182         verify(releaseManagerMock).perform(argument.capture());
183         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
184         assertNotNull(argument.getValue().getReleaseEnvironment());
185         assertNotNull(argument.getValue().getReactorProjects());
186         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
187 
188         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
189                 argument.getValue().getReleaseDescriptorBuilder().build();
190         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
191 
192         verifyNoMoreInteractions(releaseManagerMock);
193     }
194 
195     @Test
196     @Basedir("/mojos/perform")
197     @InjectMojo(goal = "perform", pom = "perform.xml")
198     void testPerformWithExecutionFailure(PerformReleaseMojo mojo) throws Exception {
199         ReleaseFailureException cause = new ReleaseFailureException("...");
200         doThrow(cause).when(releaseManagerMock).perform(isA(ReleasePerformRequest.class));
201 
202         mojo.setReleaseManager(releaseManagerMock);
203 
204         // execute
205         try {
206             mojo.execute();
207 
208             fail("Should have thrown an exception");
209         } catch (MojoFailureException e) {
210             assertEquals(cause, e.getCause(), "Check cause exists");
211         }
212 
213         // verify
214         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
215         verify(releaseManagerMock).perform(argument.capture());
216         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
217         assertNotNull(argument.getValue().getReleaseEnvironment());
218         assertNotNull(argument.getValue().getReactorProjects());
219         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
220 
221         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
222                 argument.getValue().getReleaseDescriptorBuilder().build();
223         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
224 
225         verifyNoMoreInteractions(releaseManagerMock);
226     }
227 
228     @Test
229     @Basedir("/mojos/perform")
230     @InjectMojo(goal = "perform", pom = "perform-with-scm.xml")
231     void testPerformWithScm(PerformReleaseMojo mojo) throws Exception {
232         // execute
233         mojo.execute();
234 
235         // verify
236         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
237         verify(releaseManagerMock).perform(argument.capture());
238         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
239         assertNotNull(argument.getValue().getReleaseEnvironment());
240         assertNotNull(argument.getValue().getReactorProjects());
241         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
242 
243         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
244                 argument.getValue().getReleaseDescriptorBuilder().build();
245         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
246         assertEquals("scm-url", releaseDescriptor.getScmSourceUrl());
247 
248         verifyNoMoreInteractions(releaseManagerMock);
249     }
250 
251     @Test
252     @Basedir("/mojos/perform")
253     @InjectMojo(goal = "perform", pom = "perform.xml")
254     void testPerformWithProfiles(PerformReleaseMojo mojo) throws Exception {
255         MavenExecutionRequest request = mock(MavenExecutionRequest.class);
256         when(request.getActiveProfiles()).thenReturn(Arrays.asList("prof1", "2prof"));
257         when(mavenSession.getRequest()).thenReturn(request);
258 
259         // execute
260         mojo.execute();
261 
262         // verify
263         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
264         verify(releaseManagerMock).perform(argument.capture());
265         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
266         assertNotNull(argument.getValue().getReleaseEnvironment());
267         assertNotNull(argument.getValue().getReactorProjects());
268         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
269 
270         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
271                 argument.getValue().getReleaseDescriptorBuilder().build();
272         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
273         assertTrue(releaseDescriptor.getActivateProfiles().contains("prof1"));
274         assertTrue(releaseDescriptor.getActivateProfiles().contains("2prof"));
275 
276         verifyNoMoreInteractions(releaseManagerMock);
277     }
278 
279     @Test
280     @Basedir("/mojos/perform")
281     @InjectMojo(goal = "perform", pom = "perform-with-args.xml")
282     void testPerformWithProfilesAndArguments(PerformReleaseMojo mojo) throws Exception {
283         MavenExecutionRequest request = mock(MavenExecutionRequest.class);
284         when(request.getActiveProfiles()).thenReturn(Arrays.asList("prof1", "2prof"));
285         when(mavenSession.getRequest()).thenReturn(request);
286 
287         // execute
288         mojo.execute();
289 
290         // verify
291         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
292         verify(releaseManagerMock).perform(argument.capture());
293         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
294         assertNotNull(argument.getValue().getReleaseEnvironment());
295         assertNotNull(argument.getValue().getReactorProjects());
296         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
297 
298         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
299                 argument.getValue().getReleaseDescriptorBuilder().build();
300         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
301         assertTrue(releaseDescriptor.getActivateProfiles().contains("prof1"));
302         assertTrue(releaseDescriptor.getActivateProfiles().contains("2prof"));
303         assertEquals("-Dmaven.test.skip=true", releaseDescriptor.getAdditionalArguments());
304 
305         verifyNoMoreInteractions(releaseManagerMock);
306     }
307 
308     @Test
309     @Basedir("/mojos/perform")
310     @InjectMojo(goal = "perform", pom = "perform-with-multiline-goals.xml")
311     void testPerformWithMultilineGoals(PerformReleaseMojo mojo) throws Exception {
312         // execute
313         mojo.execute();
314 
315         // verify
316         ArgumentCaptor<ReleasePerformRequest> argument = ArgumentCaptor.forClass(ReleasePerformRequest.class);
317         verify(releaseManagerMock).perform(argument.capture());
318         assertNotNull(argument.getValue().getReleaseDescriptorBuilder());
319         assertNotNull(argument.getValue().getReleaseEnvironment());
320         assertNotNull(argument.getValue().getReactorProjects());
321         assertEquals(Boolean.FALSE, argument.getValue().getDryRun());
322 
323         ReleaseDescriptorBuilder.BuilderReleaseDescriptor releaseDescriptor =
324                 argument.getValue().getReleaseDescriptorBuilder().build();
325         assertEquals("deploy site-deploy", releaseDescriptor.getPerformGoals());
326 
327         verifyNoMoreInteractions(releaseManagerMock);
328     }
329 }