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