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.Collections;
22 import java.util.List;
23
24 import org.apache.maven.project.MavenProject;
25 import org.apache.maven.scm.ScmFile;
26 import org.apache.maven.scm.ScmFileSet;
27 import org.apache.maven.scm.ScmFileStatus;
28 import org.apache.maven.scm.ScmVersion;
29 import org.apache.maven.scm.command.checkin.CheckInScmResult;
30 import org.apache.maven.scm.manager.ScmManager;
31 import org.apache.maven.scm.manager.ScmManagerStub;
32 import org.apache.maven.scm.provider.ScmProvider;
33 import org.apache.maven.scm.repository.ScmRepository;
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.util.ReleaseUtil;
38 import org.junit.Test;
39
40 import static org.junit.Assert.assertEquals;
41 import static org.mockito.Matchers.argThat;
42 import static org.mockito.Matchers.eq;
43 import static org.mockito.Matchers.isA;
44 import static org.mockito.Matchers.isNull;
45 import static org.mockito.Mockito.mock;
46 import static org.mockito.Mockito.verify;
47 import static org.mockito.Mockito.verifyNoMoreInteractions;
48 import static org.mockito.Mockito.when;
49
50
51
52
53
54
55 public class ScmCommitDevelopmentPhaseTest extends AbstractReleaseTestCase {
56 private static final String COMMIT_MESSAGE = "[maven-release-manager] prepare for next development iteration";
57
58 private static final String ROLLBACK_PREFIX =
59 "[maven-release-manager] rollback changes from release preparation of ";
60
61 private List<MavenProject> reactorProjects;
62
63 private MavenProject rootProject;
64
65 private ReleaseDescriptorBuilder builder;
66
67 private ScmProvider scmProviderMock;
68
69 @Override
70 public void setUp() throws Exception {
71 super.setUp();
72
73 phase = (ReleasePhase) lookup(ReleasePhase.class, "scm-commit-development");
74
75 reactorProjects = createReactorProjects();
76 rootProject = ReleaseUtil.getRootProject(reactorProjects);
77 builder = createReleaseDescriptorBuilder(rootProject);
78 }
79
80 @Test
81 public void testIsCorrectImplementation() {
82 assertEquals(ScmCommitDevelopmentPhase.class, phase.getClass());
83 }
84
85 @Test
86 public void testNoCommitOrRollbackRequired() throws Exception {
87 ReleaseDescriptorBuilder builder = createReleaseDescriptorBuilder(rootProject);
88 List<MavenProject> reactorProjects = createReactorProjects();
89
90 builder.setRemoteTagging(false);
91 builder.setPinExternals(false);
92 builder.setSuppressCommitBeforeTagOrBranch(true);
93 builder.setUpdateWorkingCopyVersions(false);
94
95 prepareNoCheckin();
96
97 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
98
99 verifyNoCheckin();
100 }
101
102 @Test
103 public void testCommitsNextVersions() throws Exception {
104 builder.setUpdateWorkingCopyVersions(true);
105
106 prepareCheckin(COMMIT_MESSAGE);
107
108 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
109
110 verifyCheckin(COMMIT_MESSAGE);
111 }
112
113 @Test
114 public void testCommitsNextVersionsAlternateMessage() throws Exception {
115 builder.setUpdateWorkingCopyVersions(true);
116 builder.setScmCommentPrefix("[release]");
117 builder.setScmDevelopmentCommitComment("@{prefix} Development of @{groupId}:@{artifactId}");
118
119 prepareCheckin("[release] Development of groupId:artifactId");
120
121 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
122
123 verifyCheckin("[release] Development of groupId:artifactId");
124 }
125
126 @Test
127 public void testCommitsRollbackPrepare() throws Exception {
128 builder.setUpdateWorkingCopyVersions(false);
129
130 String message = ROLLBACK_PREFIX + "release-label";
131
132 prepareCheckin(message);
133
134 phase.execute(ReleaseUtils.buildReleaseDescriptor(builder), new DefaultReleaseEnvironment(), reactorProjects);
135
136 verifyCheckin(message);
137 }
138
139 private void prepareCheckin(String message) throws Exception {
140 ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), rootProject.getFile());
141 scmProviderMock = mock(ScmProvider.class);
142 when(scmProviderMock.checkIn(
143 isA(ScmRepository.class),
144 argThat(new IsScmFileSetEquals(fileSet)),
145 isNull(ScmVersion.class),
146 eq(message)))
147 .thenReturn(new CheckInScmResult(
148 "...",
149 Collections.singletonList(
150 new ScmFile(rootProject.getFile().getPath(), ScmFileStatus.CHECKED_IN))));
151 ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
152 stub.setScmProvider(scmProviderMock);
153 }
154
155 private void verifyCheckin(String message) throws Exception {
156 ScmFileSet fileSet = new ScmFileSet(rootProject.getFile().getParentFile(), rootProject.getFile());
157 verify(scmProviderMock)
158 .checkIn(
159 isA(ScmRepository.class), argThat(new IsScmFileSetEquals(fileSet)),
160 isNull(ScmVersion.class), eq(message));
161 verifyNoMoreInteractions(scmProviderMock);
162 }
163
164 private void prepareNoCheckin() throws Exception {
165 scmProviderMock = mock(ScmProvider.class);
166 ScmManagerStub stub = (ScmManagerStub) lookup(ScmManager.class);
167 stub.setScmProvider(scmProviderMock);
168 }
169
170 private void verifyNoCheckin() {
171 verifyNoMoreInteractions(scmProviderMock);
172 }
173
174 private List<MavenProject> createReactorProjects() throws Exception {
175 String dir = "scm-commit/single-pom";
176 return createReactorProjects(dir, dir, null);
177 }
178
179 private static ReleaseDescriptorBuilder createReleaseDescriptorBuilder(MavenProject rootProject) {
180 ReleaseDescriptorBuilder builder = new ReleaseDescriptorBuilder();
181 builder.setScmSourceUrl("scm-url");
182 builder.setScmReleaseLabel("release-label");
183 builder.setWorkingDirectory(rootProject.getFile().getParentFile().getAbsolutePath());
184 return builder;
185 }
186 }