1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
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
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
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
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
85 ReleaseResult actual = phase.execute(
86 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
87
88
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
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
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
118 ReleaseResult actual = phase.execute(
119 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
120
121
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
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
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
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
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
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
186 ReleaseResult actual = phase.execute(
187 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
188
189
190 Assert.assertEquals(0, actual.getResultCode());
191 }
192
193 @Test
194 public void testSimulateOutput() throws Exception {
195
196
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
206 ReleaseResult actual = phase.simulate(
207 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
208
209
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
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
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 }