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.CommandParameters;
25  import org.apache.maven.scm.ScmFileSet;
26  import org.apache.maven.scm.command.untag.UntagScmResult;
27  import org.apache.maven.scm.manager.ScmManager;
28  import org.apache.maven.scm.provider.ScmProvider;
29  import org.apache.maven.scm.repository.ScmRepository;
30  import org.apache.maven.shared.release.ReleaseResult;
31  import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
32  import org.apache.maven.shared.release.config.ReleaseUtils;
33  import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
34  import org.apache.maven.shared.release.scm.ReleaseScmCommandException;
35  import org.apache.maven.shared.release.stubs.ScmManagerStub;
36  import org.apache.maven.shared.release.util.ReleaseUtil;
37  import org.junit.Assert;
38  import org.junit.Ignore;
39  import org.junit.Test;
40  import org.mockito.Mockito;
41  
42  import static org.hamcrest.CoreMatchers.equalTo;
43  import static org.hamcrest.MatcherAssert.assertThat;
44  import static org.junit.Assert.assertThrows;
45  import static org.mockito.ArgumentMatchers.argThat;
46  import static org.mockito.ArgumentMatchers.isA;
47  
48  /**
49   * Test the remove SCM tag phase.
50   */
51  public class RemoveScmTagPhaseTest extends AbstractReleaseTestCase {
52  
53      @Override
54      public void setUp() throws Exception {
55  
56          super.setUp();
57  
58          phase = (ReleasePhase) lookup(ReleasePhase.class, "remove-scm-tag");
59      }
60  
61      @Test
62      public void testExecuteOutput() throws Exception {
63  
64          // prepare
65          ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
66          builder.setScmReleaseLabel("release-label");
67          builder.setScmSourceUrl("scm-url");
68          List<MavenProject> reactorProjects = createReactorProjects();
69          MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
70          builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
71          builder.setPomFileName(rootProject.getFile().getName());
72          ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile());
73  
74          // mock, only real matcher is the file set
75          ScmProvider scmProviderMock = Mockito.mock(ScmProvider.class);
76          Mockito.when(scmProviderMock.untag(
77                          isA(ScmRepository.class),
78                          argThat(new IsScmFileSetEquals(fileSet)),
79                          isA(CommandParameters.class)))
80                  .thenReturn(new UntagScmResult("...", "...", "...", true));
81          ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
82          stub.setScmProvider(scmProviderMock);
83  
84          // execute
85          ReleaseResult actual = phase.execute(
86                  ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
87  
88          // verify, actual contains trailing newline
89          Assert.assertEquals(
90                  "[INFO] Removing tag with the label release-label ...",
91                  actual.getOutput().trim());
92      }
93  
94      @Test
95      public void testExecuteResultCode() throws Exception {
96  
97          // prepare
98          ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
99          builder.setScmReleaseLabel("release-label");
100         builder.setScmSourceUrl("scm-url");
101         List<MavenProject> reactorProjects = createReactorProjects();
102         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
103         builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
104         builder.setPomFileName(rootProject.getFile().getName());
105         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile());
106 
107         // mock, only real matcher is the file set
108         ScmProvider scmProviderMock = Mockito.mock(ScmProvider.class);
109         Mockito.when(scmProviderMock.untag(
110                         isA(ScmRepository.class),
111                         argThat(new IsScmFileSetEquals(fileSet)),
112                         isA(CommandParameters.class)))
113                 .thenReturn(new UntagScmResult("...", "...", "...", true));
114         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
115         stub.setScmProvider(scmProviderMock);
116 
117         // execute
118         ReleaseResult actual = phase.execute(
119                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
120 
121         // verify
122         Assert.assertEquals(0, actual.getResultCode());
123     }
124 
125     @Test
126     @Ignore("We changed the behaviour to warning instead of error.")
127     public void testExecuteError() throws Exception {
128 
129         // prepare
130         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
131         builder.setScmReleaseLabel("release-label");
132         builder.setScmSourceUrl("scm-url");
133         List<MavenProject> reactorProjects = createReactorProjects();
134         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
135         builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
136         builder.setPomFileName(rootProject.getFile().getName());
137         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile());
138 
139         // mock, only real matcher is the file set
140         ScmProvider scmProviderMock = Mockito.mock(ScmProvider.class);
141         Mockito.when(scmProviderMock.untag(
142                         isA(ScmRepository.class),
143                         argThat(new IsScmFileSetEquals(fileSet)),
144                         isA(CommandParameters.class)))
145                 .thenReturn(new UntagScmResult("command-line", "provider-message", "command-output", false));
146         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
147         stub.setScmProvider(scmProviderMock);
148 
149         // execute
150         ReleaseScmCommandException e = assertThrows(
151                 ReleaseScmCommandException.class,
152                 () -> phase.execute(
153                         ReleaseUtils.buildReleaseDescriptor(builder),
154                         new DefaultReleaseEnvironment(),
155                         reactorProjects));
156 
157         assertThat(
158                 e.getMessage(),
159                 equalTo("Unable to remove tag \nProvider message:\nprovider-message\nCommand output:\ncommand-output"));
160     }
161 
162     @Test
163     public void testExecuteNoError() throws Exception {
164 
165         // prepare
166         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
167         builder.setScmReleaseLabel("release-label");
168         builder.setScmSourceUrl("scm-url");
169         List<MavenProject> reactorProjects = createReactorProjects();
170         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
171         builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
172         builder.setPomFileName(rootProject.getFile().getName());
173         ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile());
174 
175         // mock, only real matcher is the file set
176         ScmProvider scmProviderMock = Mockito.mock(ScmProvider.class);
177         Mockito.when(scmProviderMock.untag(
178                         isA(ScmRepository.class),
179                         argThat(new IsScmFileSetEquals(fileSet)),
180                         isA(CommandParameters.class)))
181                 .thenReturn(new UntagScmResult("command-line", "provider-message", "command-output", false));
182         ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
183         stub.setScmProvider(scmProviderMock);
184 
185         // execute
186         ReleaseResult actual = phase.execute(
187                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
188 
189         // verify
190         Assert.assertEquals(0, actual.getResultCode());
191     }
192 
193     @Test
194     public void testSimulateOutput() throws Exception {
195 
196         // prepare
197         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
198         builder.setScmReleaseLabel("release-label");
199         builder.setScmSourceUrl("scm-url");
200         List<MavenProject> reactorProjects = createReactorProjects();
201         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
202         builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
203         builder.setPomFileName(rootProject.getFile().getName());
204 
205         // execute
206         ReleaseResult actual = phase.simulate(
207                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
208 
209         // verify, actual contains newline
210         Assert.assertEquals(
211                 "[INFO] Full run would remove tag with label: 'release-label'",
212                 actual.getOutput().trim());
213     }
214 
215     @Test
216     public void testSimulateResultCode() throws Exception {
217 
218         // prepare
219         ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
220         builder.setScmReleaseLabel("release-label");
221         builder.setScmSourceUrl("scm-url");
222         List<MavenProject> reactorProjects = createReactorProjects();
223         MavenProject rootProject = ReleaseUtil.getRootProject(reactorProjects);
224         builder.setWorkingDirectory(getPath(rootProject.getFile().getParentFile()));
225         builder.setPomFileName(rootProject.getFile().getName());
226 
227         // execute
228         ReleaseResult actual = phase.simulate(
229                 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
230 
231         Assert.assertEquals(0, actual.getResultCode());
232     }
233 
234     private List<MavenProject> createReactorProjects() throws Exception {
235         return createReactorProjects("scm-commit/single-pom", "");
236     }
237 }