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.io.File;
22 import java.util.List;
23
24 import org.apache.maven.project.MavenProject;
25 import org.apache.maven.scm.CommandParameter;
26 import org.apache.maven.scm.ScmFileSet;
27 import org.apache.maven.scm.ScmTag;
28 import org.apache.maven.scm.command.checkout.CheckOutScmResult;
29 import org.apache.maven.scm.manager.NoSuchScmProviderException;
30 import org.apache.maven.scm.manager.ScmManager;
31 import org.apache.maven.scm.provider.ScmProvider;
32 import org.apache.maven.scm.provider.svn.repository.SvnScmProviderRepository;
33 import org.apache.maven.scm.repository.ScmRepository;
34 import org.apache.maven.scm.repository.ScmRepositoryException;
35 import org.apache.maven.shared.release.ReleaseExecutionException;
36 import org.apache.maven.shared.release.config.ReleaseDescriptorBuilder;
37 import org.apache.maven.shared.release.config.ReleaseUtils;
38 import org.apache.maven.shared.release.env.DefaultReleaseEnvironment;
39 import org.apache.maven.shared.release.scm.ReleaseScmRepositoryException;
40 import org.apache.maven.shared.release.stubs.ScmManagerStub;
41 import org.junit.Test;
42
43 import static org.junit.Assert.assertEquals;
44 import static org.junit.Assert.assertNull;
45 import static org.junit.Assert.fail;
46 import static org.mockito.ArgumentMatchers.argThat;
47 import static org.mockito.ArgumentMatchers.eq;
48 import static org.mockito.Mockito.mock;
49 import static org.mockito.Mockito.verify;
50 import static org.mockito.Mockito.verifyNoMoreInteractions;
51 import static org.mockito.Mockito.when;
52
53
54
55
56 public class CheckoutProjectFromScmTest extends AbstractReleaseTestCase {
57 @Override
58 public void setUp() throws Exception {
59 super.setUp();
60
61 phase = lookup(ReleasePhase.class, "checkout-project-from-scm");
62 }
63
64 @Test
65 public void testExecuteStandard() throws Exception {
66
67 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
68 File checkoutDirectory = getTestFile("target/checkout-test/standard");
69 builder.setCheckoutDirectory(checkoutDirectory.getAbsolutePath());
70 builder.setScmReleaseLabel("release-label");
71 String sourceUrl = "file://localhost/tmp/scm-repo/trunk";
72 String scmUrl = "scm:svn:" + sourceUrl;
73 builder.setScmSourceUrl(scmUrl);
74
75 ScmProvider scmProviderMock = mock(ScmProvider.class);
76 SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository(sourceUrl);
77 ScmRepository repository = new ScmRepository("svn", scmProviderRepository);
78 when(scmProviderMock.checkOut(
79 eq(repository),
80 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
81 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
82 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true))))
83 .thenReturn(new CheckOutScmResult("", null));
84
85 ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
86 stub.setScmProvider(scmProviderMock);
87 stub.addScmRepositoryForUrl(scmUrl, repository);
88
89 String dir = "scm-commit/single-pom";
90 List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
91 builder.setWorkingDirectory(getWorkingDirectory(dir).toString());
92
93
94 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
95
96
97 assertEquals("", ReleaseUtils.buildReleaseDescriptor(builder).getScmRelativePathProjectDirectory());
98
99 verify(scmProviderMock)
100 .checkOut(
101 eq(repository),
102 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
103 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
104 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true)));
105 verifyNoMoreInteractions(scmProviderMock);
106 }
107
108 @Test
109 public void testExecuteMultiModuleWithDeepSubprojects() throws Exception {
110
111 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
112 File checkoutDirectory = getTestFile("target/checkout-test/multimodule-with-deep-subprojects");
113 builder.setCheckoutDirectory(checkoutDirectory.getAbsolutePath());
114 builder.setScmReleaseLabel("release-label");
115 String sourceUrl = "file://localhost/tmp/scm-repo/trunk";
116 String scmUrl = "scm:svn:" + sourceUrl;
117 builder.setScmSourceUrl(scmUrl);
118
119 ScmProvider scmProviderMock = mock(ScmProvider.class);
120 SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository(sourceUrl);
121 ScmRepository repository = new ScmRepository("svn", scmProviderRepository);
122 when(scmProviderMock.checkOut(
123 eq(repository),
124 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
125 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
126 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true))))
127 .thenReturn(new CheckOutScmResult("", null));
128
129 ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
130 stub.setScmProvider(scmProviderMock);
131 stub.addScmRepositoryForUrl(scmUrl, repository);
132
133 String dir = "scm-commit/multimodule-with-deep-subprojects";
134 List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
135 builder.setWorkingDirectory(getWorkingDirectory(dir).toString());
136
137
138 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
139
140
141 assertEquals("", ReleaseUtils.buildReleaseDescriptor(builder).getScmRelativePathProjectDirectory());
142
143 verify(scmProviderMock)
144 .checkOut(
145 eq(repository),
146 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
147 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
148 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true)));
149 verifyNoMoreInteractions(scmProviderMock);
150 }
151
152 @Test
153 public void testExecuteFlatMultiModule() throws Exception {
154
155 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
156 File checkoutDirectory = getTestFile("target/checkout-test/flat-multi-module");
157 builder.setCheckoutDirectory(checkoutDirectory.getAbsolutePath());
158 builder.setScmReleaseLabel("release-label");
159 String sourceUrl = "file://localhost/tmp/scm-repo/trunk/root-project";
160 String scmUrl = "scm:svn:" + sourceUrl;
161 builder.setScmSourceUrl(scmUrl);
162
163 ScmProvider scmProviderMock = mock(ScmProvider.class);
164 SvnScmProviderRepository scmProviderRepository = new SvnScmProviderRepository(sourceUrl);
165 ScmRepository repository = new ScmRepository("svn", scmProviderRepository);
166 when(scmProviderMock.checkOut(
167 eq(repository),
168 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
169 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
170 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true))))
171 .thenReturn(new CheckOutScmResult("", null));
172
173 ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
174 stub.setScmProvider(scmProviderMock);
175 stub.addScmRepositoryForUrl(scmUrl, repository);
176
177 List<MavenProject> reactorProjects =
178 createReactorProjects("rewrite-for-release/pom-with-parent-flat", "root-project");
179 builder.setWorkingDirectory(
180 getWorkingDirectory("rewrite-for-release/pom-with-parent-flat").toString());
181
182
183 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
184
185
186 assertEquals(
187 "not found root-project but "
188 + ReleaseUtils.buildReleaseDescriptor(builder).getScmRelativePathProjectDirectory(),
189 "root-project",
190 ReleaseUtils.buildReleaseDescriptor(builder).getScmRelativePathProjectDirectory());
191
192 verify(scmProviderMock)
193 .checkOut(
194 eq(repository),
195 argThat(new IsScmFileSetEquals(new ScmFileSet(checkoutDirectory))),
196 argThat(new IsScmTagEquals(new ScmTag("release-label"))),
197 argThat(new HasCommandParameter(CommandParameter.SHALLOW, true)));
198 verifyNoMoreInteractions(scmProviderMock);
199 }
200
201 @Test
202 public void testNoSuchScmProviderExceptionThrown() throws Exception {
203
204 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
205 builder.setScmSourceUrl("scm-url");
206 builder.setWorkingDirectory(getTestFile("target/test/checkout").getAbsolutePath());
207
208 ScmManagerStub scmManagerStub = (ScmManagerStub) lookup(ScmManager.class);
209 scmManagerStub.setException(new NoSuchScmProviderException("..."));
210
211 String dir = "scm-commit/single-pom";
212 List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
213
214
215 try {
216 builder.setUseReleaseProfile(false);
217
218 phase.execute(
219 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
220
221 fail("commit should have failed");
222 } catch (ReleaseExecutionException e) {
223 assertEquals(
224 "check cause",
225 NoSuchScmProviderException.class,
226 e.getCause().getClass());
227 }
228 }
229
230 @Test
231 public void testScmRepositoryExceptionThrown() throws Exception {
232
233 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
234 builder.setScmSourceUrl("scm-url");
235 builder.setWorkingDirectory(getTestFile("target/test/checkout").getAbsolutePath());
236
237 ScmManagerStub scmManagerStub = (ScmManagerStub) lookup(ScmManager.class);
238 scmManagerStub.setException(new ScmRepositoryException("..."));
239
240 String dir = "scm-commit/single-pom";
241 List<MavenProject> reactorProjects = createReactorProjects(dir, dir, null);
242
243
244 try {
245 builder.setUseReleaseProfile(false);
246
247 phase.execute(
248 ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
249
250 fail("commit should have failed");
251 } catch (ReleaseScmRepositoryException e) {
252 assertNull("Check no additional cause", e.getCause());
253 }
254 }
255 }