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.shared.release.phase;
20  
21  import java.util.List;
22  
23  import org.apache.maven.project.MavenProject;
24  import org.apache.maven.scm.ScmException;
25  import org.apache.maven.scm.ScmFileSet;
26  import org.apache.maven.scm.command.edit.EditScmResult;
27  import org.apache.maven.scm.provider.ScmProvider;
28  import org.apache.maven.scm.provider.ScmProviderStub;
29  import org.apache.maven.scm.repository.ScmRepository;
30  import org.apache.maven.shared.release.ReleaseExecutionException;
31  import org.apache.maven.shared.release.ReleaseFailureException;
32  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
33  import org.apache.maven.shared.release.config.ReleaseUtils;
34  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
35  import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
36  import org.junit.jupiter.api.Test;
37  
38  import static org.junit.jupiter.api.Assertions.assertEquals;
39  import static org.junit.jupiter.api.Assertions.assertNull;
40  import static org.junit.jupiter.api.Assertions.assertTrue;
41  import static org.junit.jupiter.api.Assertions.fail;
42  import static org.mockito.ArgumentMatchers.isA;
43  import static org.mockito.Mockito.mock;
44  import static org.mockito.Mockito.verify;
45  import static org.mockito.Mockito.verifyNoMoreInteractions;
46  import static org.mockito.Mockito.when;
47  
48  /**
49   * Base class with tests for rewriting POMs with edit mode.
50   *
51   * @author <a href="mailto:brett@apache.org">Brett Porter</a>
52   */
53  abstract class AbstractEditModeRewritingReleasePhaseTestCase extends AbstractRewritingReleasePhaseTestCase {
54  
55      @Test
56      void testRewriteBasicPomWithEditMode() throws Exception {
57          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
58          ReleaseDescriptorBuilder builder = createDescriptorFromBasicPom(reactorProjects, "basic-pom");
59          builder.setScmUseEditMode(true);
60          mapNextVersion(builder, "groupId:artifactId");
61  
62          getTestedPhase()
63                  .execute(
64                          ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
65  
66          comparePomFiles(reactorProjects);
67      }
68  
69      @Test
70      void testRewriteBasicPomWithEditModeFailure() throws Exception {
71          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
72          ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom");
73          builder.setScmUseEditMode(true);
74          mapNextVersion(builder, "groupId:artifactId");
75  
76          ScmProviderStub providerStub = (ScmProviderStub) scmManager.getProviderByUrl(
77                  ReleaseUtils.buildReleaseDescriptor(builder).getScmSourceUrl());
78          providerStub.setEditScmResult(new EditScmResult("", "", "", false));
79  
80          try {
81              getTestedPhase()
82                      .execute(
83                              ReleaseUtils.buildReleaseDescriptor(builder),
84                              new DefaultReleaseEnvironment(),
85                              reactorProjects);
86  
87              fail("Should have thrown an exception");
88          } catch (ReleaseScmCommandException e) {
89              assertNull(e.getCause(), "Check no other cause");
90          }
91      }
92  
93      @Test
94      void testRewriteBasicPomWithEditModeException() throws Exception {
95          // prepare
96          List<MavenProject> reactorProjects = createReactorProjects("basic-pom");
97          ReleaseDescriptorBuilder builder = createDescriptorFromProjects(reactorProjects, "basic-pom");
98          builder.setScmUseEditMode(true);
99          mapNextVersion(builder, "groupId:artifactId");
100 
101         ScmProvider scmProviderMock = mock(ScmProvider.class);
102         when(scmProviderMock.edit(isA(ScmRepository.class), isA(ScmFileSet.class)))
103                 .thenThrow(new ScmException("..."));
104 
105         scmManager.setScmProvider(scmProviderMock);
106 
107         // execute
108         try {
109             getTestedPhase()
110                     .execute(
111                             ReleaseUtils.buildReleaseDescriptor(builder),
112                             new DefaultReleaseEnvironment(),
113                             reactorProjects);
114 
115             fail("Should have thrown an exception");
116         } catch (ReleaseExecutionException e) {
117             assertEquals(ScmException.class, e.getCause().getClass(), "Check cause");
118         }
119         // verify
120         verify(scmProviderMock).edit(isA(ScmRepository.class), isA(ScmFileSet.class));
121         verifyNoMoreInteractions(scmProviderMock);
122     }
123 
124     @Test
125     void testRewritePomPluginDependencies() throws Exception {
126         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-plugin-deps");
127         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "internal-snapshot-plugin-deps");
128 
129         getTestedPhase()
130                 .execute(
131                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
132 
133         comparePomFiles(reactorProjects);
134     }
135 
136     @Test
137     void testRewritePomUnmappedPluginDependencies() throws Exception {
138         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-plugin-deps");
139         ReleaseDescriptorBuilder builder =
140                 createUnmappedConfiguration(reactorProjects, "internal-snapshot-plugin-deps");
141 
142         try {
143             getTestedPhase()
144                     .execute(
145                             ReleaseUtils.buildReleaseDescriptor(builder),
146                             new DefaultReleaseEnvironment(),
147                             reactorProjects);
148 
149             fail("Should have thrown an exception");
150         } catch (ReleaseFailureException e) {
151             assertTrue(true);
152         }
153     }
154 
155     @Test
156     void testRewritePomProfile() throws Exception {
157         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-profile");
158         ReleaseDescriptorBuilder builder = createDefaultConfiguration(reactorProjects, "internal-snapshot-profile");
159 
160         getTestedPhase()
161                 .execute(
162                         ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
163 
164         comparePomFiles(reactorProjects);
165     }
166 
167     @Test
168     void testRewritePomUnmappedProfile() throws Exception {
169         List<MavenProject> reactorProjects = createReactorProjects("internal-snapshot-profile");
170         ReleaseDescriptorBuilder builder = createUnmappedConfiguration(reactorProjects, "internal-snapshot-profile");
171 
172         try {
173             getTestedPhase()
174                     .execute(
175                             ReleaseUtils.buildReleaseDescriptor(builder),
176                             new DefaultReleaseEnvironment(),
177                             reactorProjects);
178 
179             fail("Should have thrown an exception");
180         } catch (ReleaseFailureException e) {
181             assertTrue(true);
182         }
183     }
184 }